Avoid "negative" average buffering

The assumption that underflow and overbuffering are caused by jitter
(and that the delay between the producer and consumer will becaught up)
does not always hold.

For example, if the consumer does not consume at the expected rate (the
SDL calback is not called often enough, which is an audio output issue),
many samples will be dropped due to overbuffering, decreasing the
average buffering indefinitely.

Prevent the average buffering to become negative to limit the
consequences of an unexpected behavior.
audio_player_atomic.15
Romain Vimont 3 months ago
parent d335683a8b
commit 4e35761037

@ -266,6 +266,16 @@ sc_audio_player_frame_sink_push(struct sc_frame_sink *sink,
// The compensation must apply instantly, it must not be smoothed
ap->avg_buffering.avg += instant_compensation + inserted_silence - dropped;
if (ap->avg_buffering.avg < 0) {
// Since dropping samples instantly reduces buffering, the difference
// is applied immediately to the average value, assuming that the delay
// between the producer and the consumer will be caught up.
//
// However, when this assumption is not valid, the average buffering
// may decrease indefinitely. Prevent it to become negative to limit
// the consequences.
ap->avg_buffering.avg = 0;
}
// However, the buffering level must be smoothed
sc_average_push(&ap->avg_buffering, can_read);

Loading…
Cancel
Save