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:
parent
57e825dfe7
commit
af99176581
1
NEWS
1
NEWS
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue