From c79689206c489b2ba449b8d21e0b5819298c949a Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 30 May 2014 02:14:38 +0200 Subject: audio: change handling of an EOF corner case This code handles buggy AOs (even if all AOs are bug-free, it's good for robustness). Move handling of it to the AO feed thread. Now this check doesn't require magic numbers and does exactly what's it supposed to do. --- audio/out/push.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'audio/out/push.c') diff --git a/audio/out/push.c b/audio/out/push.c index dd1015d441..b779dac69a 100644 --- a/audio/out/push.c +++ b/audio/out/push.c @@ -240,7 +240,14 @@ static void ao_play_data(struct ao *ao) MP_WARN(ao, "Audio device returned non-sense value.\n"); r = data.samples; } - mp_audio_buffer_skip(p->buffer, MPMAX(r, 0)); + r = MPMAX(r, 0); + // Probably can't copy the rest of the buffer due to period alignment. + bool stuck = r <= 0 && space >= max && data.samples > 0; + if ((flags & AOPLAY_FINAL_CHUNK) && stuck) { + MP_ERR(ao, "Audio output driver seems to ignore AOPLAY_FINAL_CHUNK.\n"); + r = max; + } + mp_audio_buffer_skip(p->buffer, r); if (p->final_chunk && mp_audio_buffer_samples(p->buffer) == 0) { p->expected_end_time = mp_time_sec() + AO_EOF_DELAY + 0.25; // + margin if (ao->driver->get_delay) @@ -249,10 +256,7 @@ static void ao_play_data(struct ao *ao) // In both cases, we have to account for space!=0, but the AO not accepting // any new data (due to rounding to period boundaries). p->buffers_full = max >= space && r <= 0; - p->avoid_ao_wait = (max == 0 && space > 0) || p->paused; - // Probably can't copy the rest of the buffer due to period alignment. - if (!p->final_chunk && r <= 0 && space >= max && data.samples > 0) - p->avoid_ao_wait = true; + p->avoid_ao_wait = (max == 0 && space > 0) || p->paused || stuck; } // Estimate when the AO needs data again. -- cgit v1.2.3