From 9bfddfd1eba1d2010ff5c54a2fbbc8f31b8ff680 Mon Sep 17 00:00:00 2001 From: Thomas Guillem <thomas@gllm.fr> Date: Tue, 12 Mar 2019 14:14:32 +0100 Subject: [PATCH] aout: split aout_DecFlush into flush and drain --- src/audio_output/aout_internal.h | 3 ++- src/audio_output/dec.c | 36 +++++++++++++++++++++----------- src/input/decoder.c | 6 +++--- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index 9073988ae62e..12fa4dfad961 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -142,7 +142,8 @@ void aout_DecGetResetStats(audio_output_t *, unsigned *, unsigned *); void aout_DecChangePause(audio_output_t *, bool b_paused, vlc_tick_t i_date); void aout_DecChangeRate(audio_output_t *aout, float rate); void aout_DecChangeDelay(audio_output_t *aout, vlc_tick_t delay); -void aout_DecFlush(audio_output_t *, bool wait); +void aout_DecFlush(audio_output_t *); +void aout_DecDrain(audio_output_t *); void aout_RequestRestart (audio_output_t *, unsigned); void aout_RequestRetiming(audio_output_t *aout, vlc_tick_t system_ts, vlc_tick_t audio_ts); diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index 52de2e2e7c55..39f87f1c9ac4 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -122,7 +122,7 @@ void aout_DecDelete (audio_output_t *aout) if (owner->mixer_format.i_format) { - aout_DecFlush(aout, false); + aout_DecFlush(aout); aout_FiltersDelete (aout, owner->filters); aout_OutputDelete (aout); } @@ -310,7 +310,7 @@ void aout_RequestRetiming(audio_output_t *aout, vlc_tick_t system_ts, else msg_Dbg (aout, "playback too late (%"PRId64"): " "flushing buffers", drift); - aout_DecFlush(aout, false); + aout_DecFlush(aout); aout_StopResampling (aout); return; /* nothing can be done if timing is unknown */ @@ -499,22 +499,15 @@ void aout_DecChangeDelay(audio_output_t *aout, vlc_tick_t delay) owner->sync.request_delay = delay; } -void aout_DecFlush (audio_output_t *aout, bool wait) +void aout_DecFlush(audio_output_t *aout) { aout_owner_t *owner = aout_owner (aout); if (owner->mixer_format.i_format) { - if (wait) - { - block_t *block = aout_FiltersDrain (owner->filters); - if (block) - aout->play(aout, block, vlc_tick_now()); - } - else - aout_FiltersFlush (owner->filters); + aout_FiltersFlush (owner->filters); - aout->flush(aout, wait); + aout->flush(aout, false); vlc_clock_Reset(owner->sync.clock); aout_FiltersResetClock(owner->filters); @@ -535,3 +528,22 @@ void aout_DecFlush (audio_output_t *aout, bool wait) owner->sync.discontinuity = true; owner->original_pts = VLC_TICK_INVALID; } + +void aout_DecDrain(audio_output_t *aout) +{ + aout_owner_t *owner = aout_owner (aout); + + if (!owner->mixer_format.i_format) + return; + + block_t *block = aout_FiltersDrain (owner->filters); + if (block) + aout->play(aout, block, vlc_tick_now()); + aout->flush(aout, true); + + vlc_clock_Reset(owner->sync.clock); + aout_FiltersResetClock(owner->filters); + + owner->sync.discontinuity = true; + owner->original_pts = VLC_TICK_INVALID; +} diff --git a/src/input/decoder.c b/src/input/decoder.c index bc9d9b5234de..4b2d5cbd9f2e 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1137,7 +1137,7 @@ static void DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, msg_Dbg( p_dec, "end of audio preroll" ); if( p_owner->p_aout ) - aout_DecFlush( p_owner->p_aout, false ); + aout_DecFlush( p_owner->p_aout ); } /* */ @@ -1464,7 +1464,7 @@ static void DecoderProcessFlush( decoder_t *p_dec ) if( p_dec->fmt_out.i_cat == AUDIO_ES ) { if( p_owner->p_aout ) - aout_DecFlush( p_owner->p_aout, false ); + aout_DecFlush( p_owner->p_aout ); } else if( p_dec->fmt_out.i_cat == VIDEO_ES ) { @@ -1687,7 +1687,7 @@ static void *DecoderThread( void *p_data ) { /* Draining: the decoder is drained and all decoded buffers are * queued to the output at this point. Now drain the output. */ if( p_owner->p_aout != NULL ) - aout_DecFlush( p_owner->p_aout, true ); + aout_DecDrain( p_owner->p_aout ); } vlc_restorecancel( canc ); -- GitLab