On Thu, 4 Mar 2004, Ove Kaaven wrote:

> tor, 04.03.2004 kl. 19.43 skrev Jaroslav Kysela:
> > Not really. I don't know, what you're trying to do. The silence extension
> > can be used to silence played area automatically from the interrupt 
> > contents. If you set "silence_threshold" and "silence_size" to 
> > buffer_size, then the whole _unused_ portion of the ring buffer will be 
> > filled with silence. Perhaps, that's the behaviour what you expect.
> 
> Well, I was afraid that mode would not work well when I rewinded to add
> more sfx, I would risk getting any existing sfx in the buffer cleared.
> Or wouldn't I?

Yes, of course. If you rewind, you must fill all next samples again in 
this case. The auto-silence was designed to silence the buffer ahead
to not write a broken samples to output when a xrun condition occurs.

> > > Well, concerns of having to resort to messy application-side code to
> > > reimplement ALSA API features aside, there's also the issue of whether
> > > to rewind to before the playing position, or rather to forward to one
> > > buffer size after the playing position, to insert the silence, since for
> > > the ALSA API, there's a difference. But perhaps forward makes most
> > > sense. I guess I can do that.
> > 
> > I don't understand.
> 
> Well, for example, if the buffer size is 16384 frames, the app frame
> position is 24576, and the currently playing position is 20480 (so that
> snd_pcm_delay returns 4096). Now I want to clear the last 4096 frames
> that completed playing. Do I
> 
> 1) call snd_pcm_rewind(8192), so that app frame position is 16384, which
> is logically behind play position (and in a xrun condition)

You cannot do that. You cannot rewind behing the actual hardware pointer.

> or
> 
> 2) call snd_pcm_forward(8192), so that app frame position is 32768,
> which is logically after play position (and seeking past potentially
> invalid data to get there)
> 
> In both cases, begin_mmap should return a pointer at the beginning of
> the buffer and let me clear the desired area of it. But it might make a
> difference to xrun recovery, auto-silence, and who knows what else...
> 
> But I'll just go for 2), it seems to be most straightforward to achieve
> with the current abstraction in our code.

Yes, it's only correct way.

I also extended the "auto-silence" function in driver in our CVS.
Now, the code detects the written samples so snd_pcm_start() doesn't
silence the whole ring buffer in this case.

Here is the patch for driver:

Index: pcm_lib.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/pcm_lib.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- pcm_lib.c   2 Mar 2004 15:32:35 -0000       1.48
+++ pcm_lib.c   6 Mar 2004 10:02:48 -0000       1.49
@@ -67,8 +67,11 @@
                        frames = runtime->silence_size;
        } else {
                if (new_hw_ptr == ULONG_MAX) {  /* initialization */
-                       runtime->silence_filled = 0;
-                       runtime->silence_start = runtime->control->appl_ptr;
+                       snd_pcm_sframes_t avail = snd_pcm_playback_hw_avail(runtime);
+                       runtime->silence_filled = avail > 0 ? avail : 0;
+                       runtime->silence_start = (runtime->status->hw_ptr +
+                                                 runtime->silence_filled) %
+                                                runtime->boundary;
                } else {
                        ofs = runtime->status->hw_ptr;
                        frames = new_hw_ptr - ofs;

                                                Jaroslav

-----
Jaroslav Kysela <[EMAIL PROTECTED]>
Linux Kernel Sound Maintainer
ALSA Project, SuSE Labs


-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to