Hi,
Andrew Eikum wrote:
playing silence instead of garbage during underruns makes sense anyway.
- if((err = snd_pcm_sw_params_set_silence_size(This->pcm_handle,
sw_params, boundary)) < 0){
That's exactly how I feel about it, remember http://www.winehq.org/pipermail/wine-devel/2011-August/091333.html
I wonder why nobody changed that during the last 10 years of winealsa.drv.
So I played with ALSA over the last days and now I'm beginning to understand why people are so upset about it.
Under Ubuntu Intrepid with built-in Intel AC'97 audio, "plughw:0" which I used this time differs a lot from dmix which I talked about last week.
When plughw:0 loops around its buffer (stop_threshold=boundary), writing after an underrun may cause some of the last part of your audio data to be heard first, then some silence, then only the beginning of the audio data :-( Doesn't that sound like bug #XY? Also, sound typically does not start immediately following snd_pcm_writei().
It sounds as if the write occurs to a fictive play position (modulo underrun), while the HW pointer loops across the buffer. That may be normal for somebody used to ALSA -- after all, the documentation says "device will do the endless loop in the ring buffer" -- but it's not what I naively expected. snd_pcm_reset does not help (presumably there's still an underrun between reset and the following write).
Remember that dmix behaves differently: it will play silence instead of your data until you've fed so much data that you managed to fill the underrun gap (avail_update again <= buffer_size).
As a conclusion, the looping mode is not what Wine needs...
I'm still wondering what snd_pcm_sw_params best fit Wine's (mmdevapi's) needs. Any hints?
BTW, perhaps I wrote into illegal memory during my experiments, but I had a few cases where plughw:0 suddenly stopped updating the counters (avail_update & delay), playing nothing while still pretending to be in RUNNING state... IIRC, snd_pcm_drop and prepare helped.
Thank you for suggestions about good use of snd_pcm_sw_params, Jörg Höhle