[alsa-devel] [PATCH 2/6] ASoC/mpc5200: get rid of the appl_ptr tracking nonsense

Grant Likely grant.likely at secretlab.ca
Wed Nov 11 22:57:19 CET 2009

On Wed, Nov 11, 2009 at 2:34 PM, Jon Smirl <jonsmirl at gmail.com> wrote:
> On Wed, Nov 11, 2009 at 2:24 PM, Grant Likely <grant.likely at secretlab.ca> wrote:
>> On Wed, Nov 11, 2009 at 11:37 AM, Mark Brown
>> <broonie at opensource.wolfsonmicro.com> wrote:
>>> On Wed, Nov 11, 2009 at 11:38:06AM -0500, Jon Smirl wrote:
>>>> > Providing a final valid data point to the driver would possibly even
>>>> > make things worse since if it were used then you'd have the equivalent
>>>> > race where the application has initialized some data but not yet managed
>>>> > to update the driver to tell it it's being handed over; if the driver
>>>> That's an under run condition.
>>> Yes, of course - the issue is that this approach encourages them, making
>>> the system less robust if things are on the edge.  The mpc5200 seems to
>>> be not just on the edge but comfortably beyond it for some reason.
>> I can't reproduce the issue at all as long at the dev_dbg() statement
>> in the trigger stop path is disabled.  With it enabled, I hear the
>> problem every time.  The 5200 may not be a speedy beast, but it is
>> plenty fast enough to shut down the audio stream before stale data
>> starts getting played out.
> "fast enough" - you just said it is a race.
> I've been saying it is a race too.

Yes, it is a race; but not the kind that is dangerous.  Audio playout
is always a real-time problem; whether in the middle of a stream or at
the end.  If the CPU gets nailed with an unbounded latency, then there
will be audible artifacts - Regardless of whether the driver knows
where the end of data is or not.  If it does know, then audio will
stutter.  If it doesn't know, then there will be repeated samples.
Both are nasty to the human ear.  So, making the driver do extra work
to keep the extra data in sync will probably force larger minimum
latencies for playout (trouble for VoIP apps) so the CPU can keep up,
and won't help one iota for making audio better.

The real solution is to fix the worst case latencies.

> There are two options:
> 1) Eliminate the race by developing a system to deterministically flag
> the end of valid data.
> 2) Fudge everything around making it almost impossible to lose the
> race, but the race is still there.

3) eliminate the unbounded latencies (fix the PSC driver and/or use a
real time kernel)
4) make sure userspace fills all the periods with silence before
triggering stop.  Gstreamer seems to already do this.  I suspect
pulseaudio does the same.

> The dev_dbg() aggravates the race until it is obviously visible every
> time. A deterministic solution would not be impacted by the dev_dbg().

But it still wouldn't help a bit when the same latency occurs in the
middle of playback.


Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

More information about the Alsa-devel mailing list