output/alsa: workaround for noise after manual song change

Workaround for driver bug observed on the Raspberry Pi, see code
comment for details.
This commit is contained in:
Max Kellermann 2013-02-04 15:41:33 +01:00
parent 57e825dfe7
commit af99176581
2 changed files with 21 additions and 0 deletions

1
NEWS
View File

@ -11,6 +11,7 @@ ver 0.18 (2012/??/??)
- vorbis: accept floating point input samples - vorbis: accept floating point input samples
* output: * output:
- new option "tags" may be used to disable sending tags to 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 * improved decoder/output error reporting

View File

@ -726,6 +726,26 @@ alsa_recover(AlsaOutput *ad, int err)
case SND_PCM_STATE_XRUN: case SND_PCM_STATE_XRUN:
ad->period_position = 0; ad->period_position = 0;
err = snd_pcm_prepare(ad->pcm); 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; break;
case SND_PCM_STATE_DISCONNECTED: case SND_PCM_STATE_DISCONNECTED:
break; break;