diff --git a/audio/out/push.c b/audio/out/push.c index 225b8b22d2..8ec8ba28ca 100644 --- a/audio/out/push.c +++ b/audio/out/push.c @@ -49,6 +49,7 @@ struct ao_push_state { struct mp_audio_buffer *buffer; + bool newdata; bool terminate; bool playing; @@ -185,6 +186,8 @@ static int play(struct ao *ao, void **data, int samples, int flags) audio.planes[n] = data[n]; audio.samples = write_samples; mp_audio_buffer_append(p->buffer, &audio); + if (write_samples > 0) + p->newdata = true; p->final_chunk = !!(flags & AOPLAY_FINAL_CHUNK); p->playing = true; @@ -216,8 +219,10 @@ static int ao_play_data(struct ao *ao) MP_WARN(ao, "Audio device returned non-sense value.\n"); r = data.samples; } - if (r > 0) + if (r > 0) { mp_audio_buffer_skip(p->buffer, r); + p->newdata = false; + } if (p->final_chunk && mp_audio_buffer_samples(p->buffer) == 0) { p->playing = false; p->expected_end_time = mp_time_sec() + AO_EOF_DELAY + 0.25; // + margin @@ -256,7 +261,7 @@ static void *playthread(void *arg) } // Half of the buffer played -> wakeup playback thread to get more. double min_wait = ao->device_buffer / (double)ao->samplerate; - if (timeout <= min_wait / 2 + 0.001) + if (timeout <= min_wait / 2 + 0.001 && !p->newdata) mp_input_wakeup(ao->input_ctx); // Avoid wasting CPU - this assumes ao_play_data() usually fills the // audio buffer as far as possible, so even if the device buffer