ports/82777: sox does not play files correctly

George V. Kouryachy frbrgeorge at gmail.com
Wed Jun 29 12:30:24 UTC 2005


>Number:         82777
>Category:       ports
>Synopsis:       sox does not play files correctly
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jun 29 12:30:23 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     George V. Kouryachy
>Release:        FreeBSD 5.4-RELEASE-p2 i386
>Organization:
Moscow State University, CMC dept, Russia
>Environment:
System: FreeBSD phobos.cs.msu.su 5.4-RELEASE-p2 FreeBSD 5.4-RELEASE-p2 #4: Tue Jun 14 18:13:40 MSD 2005 root at phobos.cs.msu.su:/usr/obj/usr/src/sys/PHOBOS i386

options         HZ=4096

>Description:
	When running though 'play', sox plays only the start of file,
	then fcloses it. Strange thing in truss output below is that sox
	performs ioctl(5,AUDIO_COMPAT_DRAIN,0x0) just after opening the file
	instead of doing it just before closing the file.
>How-To-Repeat:
	just use /usr/local/bin/plaay with any long .wav on fast computer
	and you'll hear only start of sound
>Fix:
	The patch followed is akina hack so it uses AUDIO_COMPAT_DRAIN
	ioctl directly. To make it cleaner one may check out why original sox
	performs AUDIO_COMPAT_DRAIN so early.

--- patch-src_st_ossstopwrite begins here ---
diff -ur src/handlers.c /dst/tmp/src/handlers.c
--- src/handlers.c	Mon Dec 20 22:43:50 2004
+++ /dst/tmp/src/handlers.c	Wed Jun 29 15:46:32 2005
@@ -322,7 +322,7 @@
 #ifdef HAVE_OSS
     {ossdspnames, ST_FILE_STEREO,
         st_ossdspstartread, st_rawread, st_rawstopread,
-        st_ossdspstartwrite, st_rawwrite, st_rawstopwrite, st_format_nothing_seek},
+        st_ossdspstartwrite, st_rawwrite, st_ossstopwrite, st_format_nothing_seek},
 #endif
     {prcnames, ST_FILE_SEEK,
         st_prcstartread, st_prcread, st_rawstopread,
diff -ur src/oss.c /dst/tmp/src/oss.c
--- src/oss.c	Tue Sep 28 06:33:09 2004
+++ /dst/tmp/src/oss.c	Wed Jun 29 15:46:32 2005
@@ -25,6 +25,7 @@
  *
  */
 
+#include <machine/pcaudioio.h>
 #include "st_i.h"
 
 #if     defined(HAVE_OSS)
@@ -210,6 +211,18 @@
     rc = ossdspinit(ft);
     sigintreg(ft);      /* Prepare to catch SIGINT */
     return rc;
+}
+
+int st_ossstopwrite(ft_t ft)
+{
+        if (st_write(ft, ft->file.buf, 1, ft->file.pos) != ft->file.pos)
+        {
+            ft->file.eof = ST_EOF;
+        }
+        ioctl(fileno(ft->fp),AUDIO_COMPAT_DRAIN,ft->file.pos);
+        ft->file.pos = 0;
+        free(ft->file.buf);
+        return ST_SUCCESS;
 }
 
 int st_ossdspstartwrite(ft_t ft)
diff -ur src/st_i.h /dst/tmp/src/st_i.h
--- src/st_i.h	Mon Dec 20 22:43:50 2004
+++ /dst/tmp/src/st_i.h	Wed Jun 29 15:46:32 2005
@@ -259,6 +259,7 @@
 #ifdef HAVE_OSS
 int st_ossdspstartread(ft_t ft);
 int st_ossdspstartwrite(ft_t ft);
+int st_ossstopwrite(ft_t ft);
 #endif
 
 int st_prcstartread(ft_t ft);
--- patch-src_st_ossstopwrite ends here ---

--- sox.truss begins here ---
mmap(0x0,3920,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 671756288 (0x280a3000)
munmap(0x280a3000,0xf50)			 = 0 (0x0)
__sysctl(0xbfbfe1c0,0x2,0x2809fc58,0xbfbfe1bc,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,(0x3)PROT_READ|PROT_WRITE,(0x1002)MAP_ANON|MAP_PRIVATE,-1,0x0) = 671756288 (0x280a3000)
issetugid()					 = 0 (0x0)
open("/etc/libmap.conf",0x0,0666)		 ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",0x0,00)		 = 4 (0x4)
read(0x4,0xbfbfe268,0x80)			 = 128 (0x80)
lseek(4,0x80,SEEK_SET)				 = 128 (0x80)
read(0x4,0x280a8000,0x77)			 = 119 (0x77)
close(4)					 = 0 (0x0)
access("/lib/libvorbisfile.so.4",0)		 ERR#2 'No such file or directory'
access("/usr/lib/libvorbisfile.so.4",0)		 ERR#2 'No such file or directory'
access("/usr/lib/compat/libvorbisfile.so.4",0)	 ERR#2 'No such file or directory'
access("/usr/X11R6/lib/libvorbisfile.so.4",0)	 ERR#2 'No such file or directory'
access("/usr/local/lib/libvorbisfile.so.4",0)	 = 0 (0x0)
open("/usr/local/lib/libvorbisfile.so.4",0x0,00) = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,28672,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 671789056 (0x280ab000)
mprotect(0x280b0000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x280b0000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x280b1000,4096,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0x5000) = 671813632 (0x280b1000)
close(4)					 = 0 (0x0)
access("/lib/libvorbisenc.so.2",0)		 ERR#2 'No such file or directory'
access("/usr/lib/libvorbisenc.so.2",0)		 ERR#2 'No such file or directory'
access("/usr/lib/compat/libvorbisenc.so.2",0)	 ERR#2 'No such file or directory'
access("/usr/X11R6/lib/libvorbisenc.so.2",0)	 ERR#2 'No such file or directory'
access("/usr/local/lib/libvorbisenc.so.2",0)	 = 0 (0x0)
open("/usr/local/lib/libvorbisenc.so.2",0x0,027757761270) = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,1040384,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 671817728 (0x280b2000)
mprotect(0x280bc000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x280bc000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x280bd000,987136,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0xa000) = 671862784 (0x280bd000)
mmap(0x281ae000,8192,(0x3)PROT_READ|PROT_WRITE,(0x1012)MAP_ANON|MAP_FIXED|MAP_PRIVATE,-1,0x0) = 672849920 (0x281ae000)
close(4)					 = 0 (0x0)
access("/lib/libvorbis.so.3",0)			 ERR#2 'No such file or directory'
access("/usr/lib/libvorbis.so.3",0)		 ERR#2 'No such file or directory'
access("/usr/lib/compat/libvorbis.so.3",0)	 ERR#2 'No such file or directory'
access("/usr/X11R6/lib/libvorbis.so.3",0)	 ERR#2 'No such file or directory'
access("/usr/local/lib/libvorbis.so.3",0)	 = 0 (0x0)
open("/usr/local/lib/libvorbis.so.3",0x0,027757761270) = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,155648,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 672858112 (0x281b0000)
mprotect(0x281c6000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x281c6000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x281c7000,61440,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0x17000) = 672952320 (0x281c7000)
close(4)					 = 0 (0x0)
access("/lib/libogg.so.5",0)			 ERR#2 'No such file or directory'
access("/usr/lib/libogg.so.5",0)		 ERR#2 'No such file or directory'
access("/usr/lib/compat/libogg.so.5",0)		 ERR#2 'No such file or directory'
access("/usr/X11R6/lib/libogg.so.5",0)		 ERR#2 'No such file or directory'
access("/usr/local/lib/libogg.so.5",0)		 = 0 (0x0)
open("/usr/local/lib/libogg.so.5",0x0,027757761270) = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,20480,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 673013760 (0x281d6000)
mprotect(0x281d9000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x281d9000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x281da000,4096,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0x3000) = 673030144 (0x281da000)
close(4)					 = 0 (0x0)
access("/lib/libm.so.3",0)			 = 0 (0x0)
open("/lib/libm.so.3",0x0,027757761270)		 = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,110592,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 673034240 (0x281db000)
mprotect(0x281f1000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x281f1000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x281f2000,16384,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0x17000) = 673128448 (0x281f2000)
close(4)					 = 0 (0x0)
access("/lib/libmad.so.2",0)			 ERR#2 'No such file or directory'
access("/usr/lib/libmad.so.2",0)		 ERR#2 'No such file or directory'
access("/usr/lib/compat/libmad.so.2",0)		 ERR#2 'No such file or directory'
access("/usr/X11R6/lib/libmad.so.2",0)		 ERR#2 'No such file or directory'
access("/usr/local/lib/libmad.so.2",0)		 = 0 (0x0)
open("/usr/local/lib/libmad.so.2",0x0,027757761270) = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,90112,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 673144832 (0x281f6000)
mprotect(0x2820a000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x2820a000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x2820b000,4096,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0x14000) = 673230848 (0x2820b000)
close(4)					 = 0 (0x0)
access("/lib/libmp3lame.so.0",0)		 ERR#2 'No such file or directory'
access("/usr/lib/libmp3lame.so.0",0)		 ERR#2 'No such file or directory'
access("/usr/lib/compat/libmp3lame.so.0",0)	 ERR#2 'No such file or directory'
access("/usr/X11R6/lib/libmp3lame.so.0",0)	 ERR#2 'No such file or directory'
access("/usr/local/lib/libmp3lame.so.0",0)	 = 0 (0x0)
open("/usr/local/lib/libmp3lame.so.0",0x0,027757761270) = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,622592,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 673234944 (0x2820c000)
mprotect(0x2824c000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x2824c000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x2824d000,12288,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0x40000) = 673501184 (0x2824d000)
mmap(0x28250000,344064,(0x3)PROT_READ|PROT_WRITE,(0x1012)MAP_ANON|MAP_FIXED|MAP_PRIVATE,-1,0x0) = 673513472 (0x28250000)
close(4)					 = 0 (0x0)
access("/lib/libc.so.5",0)			 = 0 (0x0)
open("/lib/libc.so.5",0x0,027757761270)		 = 4 (0x4)
fstat(4,0xbfbfe2b8)				 = 0 (0x0)
read(0x4,0x2809eba0,0x1000)			 = 4096 (0x1000)
mmap(0x0,892928,(0x5)PROT_READ|PROT_EXEC,(0x20002)MAP_NOCORE|MAP_PRIVATE,4,0x0) = 673857536 (0x282a4000)
mprotect(0x28364000,4096,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x28364000,4096,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mmap(0x28365000,20480,(0x3)PROT_READ|PROT_WRITE,(0x12)MAP_FIXED|MAP_PRIVATE,4,0xc0000) = 674648064 (0x28365000)
mmap(0x2836a000,81920,(0x3)PROT_READ|PROT_WRITE,(0x1012)MAP_ANON|MAP_FIXED|MAP_PRIVATE,-1,0x0) = 674668544 (0x2836a000)
close(4)					 = 0 (0x0)
access("/usr/local/lib/libvorbis.so.3",0)	 = 0 (0x0)
access("/usr/local/lib/libvorbis.so.3",0)	 = 0 (0x0)
access("/usr/local/lib/libogg.so.5",0)		 = 0 (0x0)
access("/usr/local/lib/libm.so.3",0)		 ERR#2 'No such file or directory'
access("/lib/libm.so.3",0)			 = 0 (0x0)
mmap(0x0,1184,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x4a0)			 = 0 (0x0)
mmap(0x0,936,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x3a8)			 = 0 (0x0)
mmap(0x0,456,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x1c8)			 = 0 (0x0)
mmap(0x0,1632,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x660)			 = 0 (0x0)
mmap(0x0,816,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x330)			 = 0 (0x0)
mmap(0x0,2104,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x838)			 = 0 (0x0)
mmap(0x0,736,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x2e0)			 = 0 (0x0)
mprotect(0x2820c000,266240,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mmap(0x0,3984,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0xf90)			 = 0 (0x0)
mprotect(0x2820c000,266240,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
mprotect(0x282a4000,790528,(0x7)PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mmap(0x0,22024,(0x3)PROT_READ|PROT_WRITE,(0x1000)MAP_ANON,-1,0x0) = 674750464 (0x2837e000)
munmap(0x2837e000,0x5608)			 = 0 (0x0)
mprotect(0x282a4000,790528,(0x5)PROT_READ|PROT_EXEC) = 0 (0x0)
sigaction(SIGILL,{ 0x28086b0c 0x0|ONSTACK|RESTART|RESETHAND|NOCLDSTOP|NODEFER|NOCLDWAIT|SIGINFO ss_t },{ SIG_DFL 0x0|ONSTACK|RESETHAND|NOCLDSTOP|NODEFER|NOCLDWAIT|SIGINFO ss_t }) = 0 (0x0)
sigprocmask(0x1,0x0,0x2809eafc)			 = 0 (0x0)
sigaction(SIGILL,{ SIG_DFL 0x0|ONSTACK|RESETHAND|NOCLDSTOP|NODEFER|NOCLDWAIT|SIGINFO ss_t },0x0) = 0 (0x0)
sysarch(0x1,0xbfbfe318)				 = 17 (0x11)
sigprocmask(0x1,0x2809eaa0,0xbfbfe318)		 = 0 (0x0)
sigprocmask(0x3,0x2809eab0,0x0)			 = 0 (0x0)
readlink("/etc/malloc.conf",0xbfbfe2a0,63)	 ERR#2 'No such file or directory'
issetugid()					 = 0 (0x0)
mmap(0x0,4096,(0x3)PROT_READ|PROT_WRITE,(0x1002)MAP_ANON|MAP_PRIVATE,-1,0x0) = 674750464 (0x2837e000)
break(0x80a6000)				 = 0 (0x0)
break(0x80a7000)				 = 0 (0x0)
break(0x80a8000)				 = 0 (0x0)
break(0x80a9000)				 = 0 (0x0)
open("open.wav",0x0,0666)			 = 4 (0x4)
fstat(4,0xbfbfe2f0)				 = 0 (0x0)
fstat(4,0xbfbfe1f0)				 = 0 (0x0)
break(0x80ad000)				 = 0 (0x0)
read(0x4,0x80a9000,0x4000)			 = 5607 (0x15e7)
lseek(4,0x0,SEEK_CUR)				 = 5607 (0x15e7)
break(0x80af000)				 = 0 (0x0)
lseek(4,0x0,SEEK_SET)				 = 0 (0x0)
read(0x4,0x80a9000,0x4000)			 = 5607 (0x15e7)
lseek(4,0x15e8,SEEK_SET)			 = 5608 (0x15e8)
read(0x4,0x80a9000,0x4000)			 = 0 (0x0)
lseek(4,0x0,SEEK_SET)				 = 0 (0x0)
read(0x4,0x80a9000,0x4000)			 = 5607 (0x15e7)
open("/dev/dsp",0x601,0666)			 = 5 (0x5)
fstat(5,0xbfbfe290)				 = 0 (0x0)
break(0x80b1000)				 = 0 (0x0)
fstat(5,0xbfbfe2d0)				 = 0 (0x0)
ioctl(5,SNDCTL_DSP_RESET,0x0)			 = 0 (0x0)
ioctl(5,SNDCTL_DSP_GETFMTS,0xbfbfe338)		 = 0 (0x0)
ioctl(5,SNDCTL_DSP_SETFMT,0xbfbfe338)		 = 0 (0x0)
ioctl(5,SNDCTL_DSP_STEREO,0xbfbfe338)		 = 0 (0x0)
ioctl(5,SNDCTL_DSP_SPEED,0xbfbfe338)		 = 0 (0x0)
ioctl(5,SNDCTL_DSP_GETBLKSIZE,0x80a88ac)	 = 0 (0x0)
break(0x80b2000)				 = 0 (0x0)
ioctl(5,AUDIO_COMPAT_DRAIN,0x0)			 = 0 (0x0)
break(0x80ba000)				 = 0 (0x0)
read(0x4,0x80a9000,0x4000)			 = 0 (0x0)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
write(5,0x80b1000,256)				 = 256 (0x100)
close(4)					 = 0 (0x0)
write(5,0x80b1000,187)				 = 187 (0xbb)
break(0x80b9000)				 = 0 (0x0)
close(5)					 = 0 (0x0)
break(0x80b7000)				 = 0 (0x0)
exit(0x0)					
process exit, rval = 0
--- sox.truss ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list