vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Fri May 4 12:06:15 2018 +0300| [60a64a53c87d90105ee61ddfa77985fe358388c9] | committer: Rémi Denis-Courmont
aout: pass rate change separately from play > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=60a64a53c87d90105ee61ddfa77985fe358388c9 --- src/audio_output/aout_internal.h | 4 +++- src/audio_output/dec.c | 22 ++++++++++++++++++---- src/input/decoder.c | 4 +++- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index 850500428e..563c775168 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -79,6 +79,7 @@ typedef struct struct { mtime_t end; /**< Last seen PTS */ + float rate; /**< Play-out speed rate */ unsigned resamp_start_drift; /**< Resampler drift absolute value */ int resamp_type; /**< Resampler mode (FIXME: redundant / resampling) */ bool discontinuity; @@ -154,9 +155,10 @@ bool aout_ChangeFilterString( vlc_object_t *manager, vlc_object_t *aout, int aout_DecNew(audio_output_t *, const audio_sample_format_t *, const audio_replay_gain_t *, const aout_request_vout_t *); void aout_DecDelete(audio_output_t *); -int aout_DecPlay(audio_output_t *, block_t *, int i_input_rate); +int aout_DecPlay(audio_output_t *aout, block_t *block); void aout_DecGetResetStats(audio_output_t *, unsigned *, unsigned *); void aout_DecChangePause(audio_output_t *, bool b_paused, mtime_t i_date); +void aout_DecChangeRate(audio_output_t *aout, float rate); void aout_DecFlush(audio_output_t *, bool wait); void aout_RequestRestart (audio_output_t *, unsigned); diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index 99740027a0..8bd3ded8fa 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -30,6 +30,8 @@ #include <assert.h> +#include <math.h> + #include <vlc_common.h> #include <vlc_aout.h> #include <vlc_input.h> @@ -351,13 +353,12 @@ static void aout_DecSynchronize (audio_output_t *aout, mtime_t dec_pts, /***************************************************************************** * aout_DecPlay : filter & mix the decoded buffer *****************************************************************************/ -int aout_DecPlay (audio_output_t *aout, block_t *block, int input_rate) +int aout_DecPlay(audio_output_t *aout, block_t *block) { aout_owner_t *owner = aout_owner (aout); + int input_rate; - assert (input_rate >= INPUT_RATE_DEFAULT / AOUT_MAX_INPUT_RATE); - assert (input_rate <= INPUT_RATE_DEFAULT * AOUT_MAX_INPUT_RATE); - assert (block->i_pts >= VLC_TS_0); + assert (block->i_pts != VLC_TS_INVALID); block->i_length = CLOCK_FREQ * block->i_nb_samples / owner->input_format.i_rate; @@ -391,6 +392,10 @@ int aout_DecPlay (audio_output_t *aout, block_t *block, int input_rate) vlc_mutex_unlock (&owner->vp.lock); } + input_rate = lroundf(owner->sync.rate * 1000.f); + assert(input_rate >= INPUT_RATE_DEFAULT / AOUT_MAX_INPUT_RATE); + assert(input_rate <= INPUT_RATE_DEFAULT * AOUT_MAX_INPUT_RATE); + block = aout_FiltersPlay (owner->filters, block, input_rate); if (block == NULL) goto lost; @@ -443,6 +448,15 @@ void aout_DecChangePause (audio_output_t *aout, bool paused, mtime_t date) aout_OutputUnlock (aout); } +void aout_DecChangeRate(audio_output_t *aout, float rate) +{ + aout_owner_t *owner = aout_owner(aout); + + aout_OutputLock(aout); + owner->sync.rate = rate; + aout_OutputUnlock(aout); +} + void aout_DecFlush (audio_output_t *aout, bool wait) { aout_owner_t *owner = aout_owner (aout); diff --git a/src/input/decoder.c b/src/input/decoder.c index 3024648f37..50d3d779cd 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1186,7 +1186,9 @@ static int DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio, && i_rate <= INPUT_RATE_DEFAULT*AOUT_MAX_INPUT_RATE && !DecoderTimedWait( p_dec, p_audio->i_pts - AOUT_MAX_PREPARE_TIME ) ) { - int status = aout_DecPlay( p_aout, p_audio, i_rate ); + aout_DecChangeRate( p_aout, ((float)i_rate) / 1000.f ); + + int status = aout_DecPlay( p_aout, p_audio ); if( status == AOUT_DEC_CHANGED ) { /* Only reload the decoder */ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
