Commit af991765 authored by Max Kellermann's avatar Max Kellermann

output/alsa: workaround for noise after manual song change

Workaround for driver bug observed on the Raspberry Pi, see code comment for details.
parent 57e825df
......@@ -11,6 +11,7 @@ ver 0.18 (2012/??/??)
- vorbis: accept floating point input samples
* output:
- new option "tags" may be used to disable sending tags to output
- alsa: workaround for noise after manual song change
* improved decoder/output error reporting
......
......@@ -726,6 +726,26 @@ alsa_recover(AlsaOutput *ad, int err)
case SND_PCM_STATE_XRUN:
ad->period_position = 0;
err = snd_pcm_prepare(ad->pcm);
if (err == 0) {
/* this works around a driver bug observed on
the Raspberry Pi: after snd_pcm_drop(), the
whole ring buffer must be invalidated, but
the snd_pcm_prepare() call above makes the
driver play random data that just happens
to be still in the buffer; by adding and
cancelling some silence, this bug does not
occur */
alsa_write_silence(ad, ad->period_frames);
/* cancel the silence data right away to avoid
increasing latency; even though this
function call invalidates the portion of
silence, the driver seems to avoid the
bug */
snd_pcm_reset(ad->pcm);
}
break;
case SND_PCM_STATE_DISCONNECTED:
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment