At Tue, 3 Dec 2013 08:47:07 +0800, Raymond Yau wrote:
PCM Devices which have the BATCH flag set update the PCM pointer
only with
period size granularity. Using timer based scheduling does not have
any
advantage in this mode. For one devices which have that flag set
usually
update the position pointer in software after getting the period interrupt.
So
disabling the period interrupt is not possible for this kind of
devices.
Furthermore writing to or reading from the buffer slice for the
current
period is not possible since the position inside the buffer is not known. On the other hand the tsched algorithm seems to get easily confused for this kind
of
hardware, which results in garbled audio output. This typically means that timer based scheduling needs to be manually disabled on systems with such
devices.
Auto disabling tsched in this case allows these systems to run with
the
default configuration.
If the playback position is reported in steps instead of monotonic
increasing ?
does this mean that you also need to increase rewind_safeguard to one
period
or modifiy snd_pcm_rewindable ?
Yes that makes sense. The safeguard should probably be 1.5 periods or 1 period + fixed value, since it will always take some time from when the hardware reaches the next period to when userspace is notified about this.
I'm unfortunately not that familiar with pulseaudio. Maybe there is a better way to fix this problem then to disable tsched. If anybody wants to recreate the issue it can easily be emulated by applying the following patch to your kernel:
does all alsa drivers with SNDRV_PCM_INFO_PATCH update the playback/capture position in period interrupt ?
In general, yes.
usb-audio seem update when each URB send/receive (in 1ms intervals)
The usb-audio driver behaved in a BATCH way in the very early version, but it was improved. So we can get rid of the flag from this driver now.
ymfpci driver also update hwptr in 5ms interval but no SNDRV_PCM_INFO_PATCH and no constraint in period time must be interval of 5 ms
It's a subtle driver bug. Feel free to fix it if you have a test hardware :) Otherwise, better not to touch such an old code.
Takashi