Avoid "negative" average buffering
Average buffering may not be negative. Since dropping samples instantly reduces buffering, it is applied immediately to the average value. However, if an audio output issue causes the SDL callback to be called too infrequently, samples will (silently) not be consumed as expected. As this will cause samples to be dropped due to overbuffering, the average value may drop below 0, which makes no sense.
This commit is contained in:
parent
48f8c128ef
commit
0c5b7af269
@ -266,6 +266,14 @@ sc_audio_player_frame_sink_push(struct sc_frame_sink *sink,
|
|||||||
|
|
||||||
// The compensation must apply instantly, it must not be smoothed
|
// The compensation must apply instantly, it must not be smoothed
|
||||||
ap->avg_buffering.avg += instant_compensation + inserted_silence - dropped;
|
ap->avg_buffering.avg += instant_compensation + inserted_silence - dropped;
|
||||||
|
if (ap->avg_buffering.avg < 0) {
|
||||||
|
// Negative buffering makes no sense
|
||||||
|
// This may happen when the consumer does not consume at the expected
|
||||||
|
// rate (the SDL calback is not called often enough, which is an audio
|
||||||
|
// output issue), causing many samples to be dropped due to
|
||||||
|
// overbuffering.
|
||||||
|
ap->avg_buffering.avg = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// However, the buffering level must be smoothed
|
// However, the buffering level must be smoothed
|
||||||
sc_average_push(&ap->avg_buffering, can_read);
|
sc_average_push(&ap->avg_buffering, can_read);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user