2010/7/10 David Henningsson <launchpad.web@xxxxxxxxxxxxxx> > 2010-07-09 18:23, Takashi Iwai skrev: > > At Fri, 9 Jul 2010 21:13:52 +0800, > > Raymond Yau wrote: > >>>>>>> The second one (Do not report underruns to the ALSA layer) is more > a > >>>>>>> change of behavior, which could be questioned. The arguments for > >>>>>>> removing that code are these: > >>>>>>> > >>>>>>> * If pulseaudio gets an underrun, the normal way to end that > >>> underrun > >>>>>>> is to feed it with more buffers. This is different from the ALSA > way > >>> of > >>>>>>> dealing with underruns, which requires hardware buffer pointers to > >>> be reset. > >>>>>>> * In addition, underrun signals are delivered asynchronously from > >>>>>>> pulseaudio. This means that there might be more buffers on the way > >>> to > >>>>>>> pulseaudio when the underrun is reported, making the underrun > >>> obsolete. > >>>>>>> Unfortunately, there is currently no known way to determine whether > >>> this > >>>>>>> is the case or not. > >>>>>> > >>>>>> I think this helps for normal use-cases, so it'd be good to apply. > >>>>>> But, I prefer having a runtime option for such a behavior change > >>>>>> (although the default value can be the new behavior). > >>>>>> > >>>>>> Care to add it? > >>>>> > >>>>> Sure, I can do that - it sounds like a good idea to have it > >>> configurable. > >>>>> Just so I understand you right, exactly how do you expect the user / > >>>>> application to configure it? > >>>> > >>>> I suppose it can be simply added as an alsa-lib plugin config, i.e. > >>>> in SND_PCM_PLUGIN_DEFINE_FUNC(pulse) of > alsa-plugins/pulse/pcm_pulse.c, > >>>> add the code like below: > >>>> > >>>> int handle_underrun = 0; > >>>> ... > >>>> > >>>> snd_config_for_each(i, next, conf) { > >>>> ... > >>>> if (strcmp(id, "handle_underrun") == 0) { > >>>> handle_underrun = snd_config_get_bool(n); > >>>> if (handle_underrun < 0) { > >>>> SNDERR("Invalid value for %s", id); > >>>> return handle_underrun; > >>>> } > >>>> continue; > >>>> } > >>>> } > >>> > >>> FYI, I modified the patch and applied to git tree right now. > > Thanks! I've been on holiday this week but thought I would do it in the > following week. Only nice to see it being done :-) > > >> This behaviour is a little bit strange , using the same buffer size 128 > >> > >> aplay -Dhw:0,0 --buffer-size=128 test.wav > >> > >> report underrun > >> > >> > >> aplay -D pulse --buffer-size=128 test.wav > >> > >> did not report underrun but the sound is distorted > > > > Other subsystem, other behavior. > > The detection of underrun is even unreliable on ALSA native, so user > > can't expect it'll get underrun. > Before this patch , using pulse device also report underrun When using hw device ,the sound is quite good , at least I cannot hear any distortion and the reported underrun only appear a few times on the terminal underrun!!! (at least 0.210 ms long) Did alsa-lib calculate 0.210 ms from hw_ptr , app_ptr and sample rate ? aplay -v -Dhw:0,0 --buffer-size=128 t3.wav Playing WAVE 't3.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo Hardware PCM card 0 'Aureal Vortex au8830' device 0 subdevice 0 Its setup is: stream : PLAYBACK access : RW_INTERLEAVED format : S16_LE subformat : STD channels : 2 rate : 44100 exact rate : 44100 (44100/1) msbits : 16 buffer_size : 128 period_size : 32 period_time : 725 tstamp_mode : NONE period_step : 1 avail_min : 32 period_event : 0 start_threshold : 128 stop_threshold : 128 silence_threshold: 0 silence_size : 0 boundary : 1073741824 appl_ptr : 0 hw_ptr : 0 underrun!!! (at least 0.210 ms long) Status: state : XRUN trigger_time: 2794.391051578 tstamp : 2794.393149452 delay : 0 avail : 153 avail_max : 153 underrun!!! (at least 0.001 ms long) Status: state : XRUN trigger_time: 2801.590388423 tstamp : 2801.590394868 delay : 0 avail : 135 avail_max : 135 underrun!!! (at least 0.032 ms long) Status: state : XRUN trigger_time: 2801.718347873 tstamp : 2801.718661699 delay : 0 avail : 153 avail_max : 153 underrun!!! (at least 0.067 ms long) Status: state : XRUN trigger_time: 2805.978507564 tstamp : 2805.979173807 delay : 0 avail : 162 avail_max : 162 underrun!!! (at least 0.065 ms long) Status: state : XRUN trigger_time: 2807.118761300 tstamp : 2807.119411502 delay : 0 avail : 162 avail_max : 162 underrun!!! (at least 0.058 ms long) Status: state : XRUN trigger_time: 2808.685565670 tstamp : 2808.686139666 delay : 0 avail : 153 avail_max : 153 underrun!!! (at least 0.001 ms long) Status: state : XRUN trigger_time: 2808.699838404 tstamp : 2808.699844705 delay : 0 avail : 133 avail_max : 133 > > > The biggest drawback by this change is that whether the sound goes > > well or not isn't reported any more to the application layer. > > It's an unfortunate design, but it's life with PA. > > The question is - is there an application that detects the underrun > condition and actually acts on that condition? If so, this could be a > regression for that app. For other apps it's an improvement, for the > reasons originally stated. > > // David > You have to ask jackd user , they usually fine-tune(increase/decrease) the period-size of jackd manually based on the occurrence of underrun in order to achieve the lowest latency This give a false impression to the user that PA can provide low latency without under-run and pulse device is even perform better than hw device. >> Reporting underruns to ALSA seems to do more bad than good, for these reasons: * If pulseaudio gets an underrun, the normal way to end that underrun is to feed it with more buffers. This is different from the ALSA way of dealing with underruns, which requires hardware buffer pointers to be reset. * In addition, underrun signals are delivered asynchronously from pulseaudio. This means that there might be more buffers on the way to pulseaudio when the underrun is reported, making the underrun obsolete. Unfortunately, there is currently no known way to determine whether this is the case or not. Do you mean PA server get underrun from the sound driver when you mention that if pulseaudio get underrun, the normal way to end that underrun is to feed it with more buffers." ? The normal way for ALSA application is to prevent underrun occur rather to let underrun occur be selecting a larger period size or wake up more frequently to feed data to the sound card PA developer often complain the driver did not provide accurate playback position by the pcm_pointer callback Did the pulse_pointer callback also provide accurate position of the pulse device ? _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel