Date: Mon, 21 Jul 1997 00:47:22 -0700 From: Amancio Hasty <hasty@rah.star-gate.com> To: oliver.fromme@heim3.tu-clausthal.de (Oliver Fromme) Cc: multimedia@FreeBSD.ORG Subject: Re: dma handling in the sound driver Message-ID: <199707210747.AAA00376@rah.star-gate.com> In-Reply-To: Your message of "Mon, 21 Jul 1997 06:53:52 %2B0200." <199707210453.GAA13291@elch.heim4.tu-clausthal.de>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, You can issue SNDCTL_DSP_SYNC to flush the buffer as for the buffer size you can probably use 1/5 second you can compute the block size based upon the frequency. With respect to not getting back on time thats a function of how much cpu time its spend doing other things. You will have more than 1/5 second to get back to the driver because the driver queues up N buffer requests. You can figured out how many buffers are outstanding by issuing : 1. SNDCTL_DSP_GETOSPACE --- count_info info; ioctl(fd, SNDCTL_DSP_GETOPTR, &info); --- info.blocks == to the number of outstanding buffers. You can stop instantly by issuing a : SNDCTL_DSP_RESET Since that does an abrupt halt I suggest that you mute the volume and after the SNDCTL_DSP_RESET you can restore the volume ---- Hope this helps, Amancio >From The Desk Of Oliver Fromme : > > Hello, > > Just a small comment/question... > > Amancio Hasty wrote: > > [...] > > SNDCTL_DSP_SETFRAGMENT > > sets the block of io which the sub modules use to send or receive > > data. > > > > SNDCTL_DSP_SETBLKSIZE > > for all practical purposes is the same as the above. > > > > If the user does not set the block size then the dma routines choses > > a size equal to about 1/2 second worth of data. For typical sun > > style au files this is 4096 bytes . > > I am currently facing the following problem: I am writing a > frontend for mpg123 (MPEG audio player). When the user > presses the Pause/Stop button (or Fast Forward or whatever), > there's always a small delay -- I guess it is because of that > 1/2 second DMA buffer. However, I'd like the audio to stop > _immediately_ when a button is pressed, not 1/2 second later > or something like that. > > There are probably two solutions: > > - Using one of the above ioctls to reduce the buffer block > size (about 1/10 or maybe 1/5 second would be acceptable). > However, that probably increases the risk that the audio > playback is interrupted because the buffer can't be filled > in time by the application. This might especially be a > problem on slower CPUs, and/or if several other processes > are running in parallel. > > - Tell the audio device somehow to stop playback, and (in case > of Fast Forward) forget the rest of the buffered data. (In > the latter case, it would be an additional bonus if the > audio device could tell the application how much data was > discarded.) -- However, as far as I know, this isn't > possible, is it? > > Any suggestions and helpful hints are greatly appreciated. > > Regards > Oliver > > PS: On Solaris, I solved the problem like this: By doing a > write() with 0 bytes, a special "mark" is inserted in the > buffer. When the playback has reached that mark, a signal > (SIGPOLL) is delivered to the process, so we know how much data > has been actually played. Furthermore, the device supports > "pausing" by setting a flag (AUDIO_SETINFO ioctl), and it can > flush the remaining audio data from its buffer (I_FLUSH STREAMS > ioctl). > > -- > Oliver Fromme, Leibnizstr. 18-61, 38678 Clausthal, Germany > (Info: finger userinfo:olli@dorifer.heim3.tu-clausthal.de)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199707210747.AAA00376>