vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Aug 2 19:26:31 2011 +0300| [74d6bb34359111ef858f7f7d93b5f9cc25fc906c] | committer: Rémi Denis-Courmont
aout: mix and convert before slicing the audio packets > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=74d6bb34359111ef858f7f7d93b5f9cc25fc906c --- src/audio_output/aout_internal.h | 6 ++---- src/audio_output/dec.c | 11 ++++++++--- src/audio_output/input.c | 24 ++++++++++++------------ src/audio_output/output.c | 25 +++++++++++++++++-------- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h index 9fdf512..cfd6c6b 100644 --- a/src/audio_output/aout_internal.h +++ b/src/audio_output/aout_internal.h @@ -102,8 +102,8 @@ struct aout_input_t /* From input.c : */ int aout_InputNew( audio_output_t * p_aout, aout_input_t * p_input, const aout_request_vout_t * ); int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input ); -void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, - aout_buffer_t * p_buffer, int i_input_rate ); +block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input, + block_t *p_buffer, int i_input_rate ); void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input ); /* From filters.c : */ @@ -118,8 +118,6 @@ audio_mixer_t *aout_MixerNew(vlc_object_t *, const audio_sample_format_t * ); void aout_MixerDelete(audio_mixer_t *); void aout_MixerRun(audio_mixer_t *, block_t *, float); -block_t *aout_OutputSlice( audio_output_t *, aout_fifo_t * ); - /* From output.c : */ int aout_OutputNew( audio_output_t * p_aout, const audio_sample_format_t * p_format ); diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c index bbbf7f0..68b4fa3 100644 --- a/src/audio_output/dec.c +++ b/src/audio_output/dec.c @@ -195,15 +195,20 @@ int aout_DecPlay( audio_output_t * p_aout, aout_input_t * p_input, return -1; } + /* Input */ aout_InputCheckAndRestart( p_aout, p_input ); - aout_InputPlay( p_aout, p_input, p_buffer, i_input_rate ); + p_buffer = aout_InputPlay( p_aout, p_input, p_buffer, i_input_rate ); - const float amp = p_aout->mixer_multiplier * p_input->multiplier; - while( (p_buffer = aout_OutputSlice( p_aout, &p_input->fifo ) ) != NULL ) + if( p_buffer != NULL ) { + /* Mixer */ + float amp = p_aout->mixer_multiplier * p_input->multiplier; aout_MixerRun( p_aout->mixer, p_buffer, amp ); + + /* Output */ aout_OutputPlay( p_aout, p_buffer ); } + aout_unlock( p_aout ); return 0; } diff --git a/src/audio_output/input.c b/src/audio_output/input.c index 1ef4c70..5e50be4 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -485,8 +485,8 @@ void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input *****************************************************************************/ /* XXX Do not activate it !! */ //#define AOUT_PROCESS_BEFORE_CHEKS -void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, - aout_buffer_t * p_buffer, int i_input_rate ) +block_t *aout_InputPlay( audio_output_t *p_aout, aout_input_t *p_input, + block_t *p_buffer, int i_input_rate ) { mtime_t start_date; AOUT_ASSERT_LOCKED; @@ -494,7 +494,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, if( i_input_rate != INPUT_RATE_DEFAULT && p_input->p_playback_rate_filter == NULL ) { inputDrop( p_input, p_buffer ); - return; + return NULL; } #ifdef AOUT_PROCESS_BEFORE_CHEKS @@ -502,7 +502,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, aout_FiltersPlay( p_aout, p_input->pp_filters, p_input->i_nb_filters, &p_buffer ); if( !p_buffer ) - return; + return NULL; /* Actually run the resampler now. */ if ( p_input->i_nb_resamplers > 0 ) @@ -514,11 +514,11 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, } if( !p_buffer ) - return; + return NULL; if( p_buffer->i_nb_samples <= 0 ) { block_Release( p_buffer ); - return; + return NULL; } #endif @@ -564,7 +564,7 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, now - p_buffer->i_pts ); inputDrop( p_input, p_buffer ); inputResamplingStop( p_input ); - return; + return NULL; } /* If the audio drift is too big then it's not worth trying to resample @@ -593,14 +593,14 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, msg_Warn( p_aout, "buffer way too late (%"PRId64"), dropping buffer", drift ); inputDrop( p_input, p_buffer ); - return; + return NULL; } #ifndef AOUT_PROCESS_BEFORE_CHEKS /* Run pre-filters. */ aout_FiltersPlay( p_input->pp_filters, p_input->i_nb_filters, &p_buffer ); if( !p_buffer ) - return; + return NULL; #endif /* Run the resampler if needed. @@ -682,17 +682,17 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, } if( !p_buffer ) - return; + return NULL; if( p_buffer->i_nb_samples <= 0 ) { block_Release( p_buffer ); - return; + return NULL; } #endif /* Adding the start date will be managed by aout_FifoPush(). */ p_buffer->i_pts = start_date; - aout_FifoPush( &p_input->fifo, p_buffer ); + return p_buffer; } /***************************************************************************** diff --git a/src/audio_output/output.c b/src/audio_output/output.c index 55fd7b3..8cac4af 100644 --- a/src/audio_output/output.c +++ b/src/audio_output/output.c @@ -218,6 +218,8 @@ void aout_OutputDelete( audio_output_t * p_aout ) aout_FifoDestroy( &p_aout->fifo ); } +static block_t *aout_OutputSlice( audio_output_t *, aout_fifo_t * ); + /***************************************************************************** * aout_OutputPlay : play a buffer ***************************************************************************** @@ -236,8 +238,15 @@ void aout_OutputPlay( audio_output_t * p_aout, aout_buffer_t * p_buffer ) return; } - aout_FifoPush( &p_aout->fifo, p_buffer ); - p_aout->pf_play( p_aout ); + aout_fifo_t *fifo = &p_aout->p_input->fifo; + /* XXX: cleanup */ + aout_FifoPush( fifo, p_buffer ); + + while( (p_buffer = aout_OutputSlice( p_aout, fifo ) ) != NULL ) + { + aout_FifoPush( &p_aout->fifo, p_buffer ); + p_aout->pf_play( p_aout ); + } } /** @@ -375,7 +384,7 @@ void aout_VolumeHardSet (audio_output_t *aout, float volume, bool mute) * @note (FIXME) This is left here for historical reasons. It belongs in the * output code. Besides, this operation should be avoided if possible. */ -block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) +static block_t *aout_OutputSlice (audio_output_t *p_aout, aout_fifo_t *p_fifo) { const unsigned samples = p_aout->i_nb_samples; /* FIXME: Remove this silly constraint. Just pass buffers as they come to @@ -443,14 +452,14 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) prev_date = p_buffer->i_pts + p_buffer->i_length; } - if( !AOUT_FMT_NON_LINEAR( &p_aout->mixer_format ) ) + if( !AOUT_FMT_NON_LINEAR( &p_aout->format ) ) { p_buffer = p_fifo->p_first; /* Additionally check that p_first_byte_to_mix is well located. */ - const unsigned framesize = p_aout->mixer_format.i_bytes_per_frame; + const unsigned framesize = p_aout->format.i_bytes_per_frame; ssize_t delta = (start_date - p_buffer->i_pts) - * p_aout->mixer_format.i_rate / CLOCK_FREQ; + * p_aout->format.i_rate / CLOCK_FREQ; if( delta != 0 ) msg_Warn( p_aout, "input start is not output end (%zd)", delta ); if( delta < 0 ) @@ -461,7 +470,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) } if( delta > 0 ) { - mtime_t t = delta * CLOCK_FREQ / p_aout->mixer_format.i_rate; + mtime_t t = delta * CLOCK_FREQ / p_aout->format.i_rate; p_buffer->i_nb_samples -= delta; p_buffer->i_pts += t; p_buffer->i_length -= t; @@ -498,7 +507,7 @@ block_t *aout_OutputSlice( audio_output_t * p_aout, aout_fifo_t *p_fifo ) needed /= framesize; p_fifo->p_first->i_nb_samples -= needed; - mtime_t t = needed * CLOCK_FREQ / p_aout->mixer_format.i_rate; + mtime_t t = needed * CLOCK_FREQ / p_aout->format.i_rate; p_fifo->p_first->i_pts += t; p_fifo->p_first->i_length -= t; break; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
