X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Finput.c;h=fcacdbf45ba11f34a0c4f61228b2254716cf32c4;hb=1d038ed73635c3610592d4a1f39e139e6e19c264;hp=5e9f772de8fc5ed0587c019f9ece8e8015fddc2c;hpb=d1136fc4fedb9bdb9b39e7050a35e95f563297a6;p=vlc diff --git a/src/audio_output/input.c b/src/audio_output/input.c index 5e9f772de8..fcacdbf45b 100644 --- a/src/audio_output/input.c +++ b/src/audio_output/input.c @@ -70,6 +70,7 @@ static vout_thread_t *RequestVout( void *, *****************************************************************************/ int aout_InputNew( audio_output_t * p_aout, aout_input_t * p_input, const aout_request_vout_t *p_request_vout ) { + aout_owner_t *owner = aout_owner (p_aout); audio_sample_format_t chain_input_format; audio_sample_format_t chain_output_format; vlc_value_t val, text; @@ -81,7 +82,7 @@ int aout_InputNew( audio_output_t * p_aout, aout_input_t * p_input, const aout_r p_input->i_nb_resamplers = p_input->i_nb_filters = 0; /* Prepare FIFO. */ - aout_FifoInit( p_aout, &p_input->mixer.fifo, p_aout->mixer_format.i_rate ); + aout_FifoInit (p_aout, &p_input->fifo, owner->mixer_format.i_rate); /* */ if( p_request_vout ) @@ -96,7 +97,7 @@ int aout_InputNew( audio_output_t * p_aout, aout_input_t * p_input, const aout_r /* Prepare format structure */ chain_input_format = p_input->input; - chain_output_format = p_aout->mixer_format; + chain_output_format = owner->mixer_format; chain_output_format.i_rate = p_input->input.i_rate; aout_FormatPrepare( &chain_output_format ); @@ -384,20 +385,20 @@ int aout_InputNew( audio_output_t * p_aout, aout_input_t * p_input, const aout_r } /* Create resamplers. */ - if ( !AOUT_FMT_NON_LINEAR( &p_aout->mixer_format ) ) + if (!AOUT_FMT_NON_LINEAR(&owner->mixer_format)) { chain_output_format.i_rate = (__MAX(p_input->input.i_rate, - p_aout->mixer_format.i_rate) + owner->mixer_format.i_rate) * (100 + AOUT_MAX_RESAMPLING)) / 100; - if ( chain_output_format.i_rate == p_aout->mixer_format.i_rate ) + if ( chain_output_format.i_rate == owner->mixer_format.i_rate ) { /* Just in case... */ chain_output_format.i_rate++; } - if ( aout_FiltersCreatePipeline( p_aout, p_input->pp_resamplers, - &p_input->i_nb_resamplers, - &chain_output_format, - &p_aout->mixer_format ) < 0 ) + if (aout_FiltersCreatePipeline (p_aout, p_input->pp_resamplers, + &p_input->i_nb_resamplers, + &chain_output_format, + &owner->mixer_format) < 0) { inputFailure( p_aout, p_input, "couldn't set a resampler pipeline"); return -1; @@ -446,7 +447,7 @@ int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input ) aout_FiltersDestroyPipeline( p_input->pp_resamplers, p_input->i_nb_resamplers ); p_input->i_nb_resamplers = 0; - aout_FifoDestroy( &p_input->mixer.fifo ); + aout_FifoDestroy( &p_input->fifo ); return 0; } @@ -458,6 +459,7 @@ int aout_InputDelete( audio_output_t * p_aout, aout_input_t * p_input ) *****************************************************************************/ void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input ) { + aout_owner_t *owner = aout_owner (p_aout); AOUT_ASSERT_LOCKED; if( !p_input->b_restart ) @@ -465,17 +467,15 @@ void aout_InputCheckAndRestart( audio_output_t * p_aout, aout_input_t * p_input /* A little trick to avoid loosing our input fifo and properties */ - aout_fifo_t fifo = p_input->mixer.fifo; - bool b_paused = p_input->b_paused; + aout_fifo_t fifo = p_input->fifo; mtime_t i_pause_date = p_input->i_pause_date; - aout_FifoInit( p_aout, &p_input->mixer.fifo, p_aout->mixer_format.i_rate ); + aout_FifoInit (p_aout, &p_input->fifo, owner->mixer_format.i_rate); aout_InputDelete( p_aout, p_input ); aout_InputNew( p_aout, p_input, &p_input->request_vout ); - p_input->mixer.fifo = fifo; - p_input->b_paused = b_paused; + p_input->fifo = fifo; p_input->i_pause_date = i_pause_date; p_input->b_restart = false; @@ -487,8 +487,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; @@ -496,7 +496,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 @@ -504,7 +504,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 ) @@ -516,11 +516,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 @@ -540,21 +540,22 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, /* We don't care if someone changes the start date behind our back after * this. We'll deal with that when pushing the buffer, and compensate * with the next incoming buffer. */ - start_date = aout_FifoNextStart( &p_input->mixer.fifo ); + start_date = aout_FifoNextStart( &p_input->fifo ); - if ( start_date != 0 && start_date < now ) + if ( start_date != VLC_TS_INVALID && start_date < now ) { /* The decoder is _very_ late. This can only happen if the user * pauses the stream (or if the decoder is buggy, which cannot * happen :). */ msg_Warn( p_aout, "computed PTS is out of range (%"PRId64"), " "clearing out", now - start_date ); - aout_FifoSet( &p_input->mixer.fifo, 0 ); + aout_FifoReset( &p_input->fifo ); + aout_OutputFlush( p_aout, false ); if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE ) msg_Warn( p_aout, "timing screwed, stopping resampling" ); inputResamplingStop( p_input ); p_buffer->i_flags |= BLOCK_FLAG_DISCONTINUITY; - start_date = 0; + start_date = VLC_TS_INVALID; } if ( p_buffer->i_pts < now + AOUT_MIN_PREPARE_TIME ) @@ -565,12 +566,12 @@ 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 * the audio. */ - if( !start_date ) + if( start_date == VLC_TS_INVALID ) start_date = p_buffer->i_pts; mtime_t drift = start_date - p_buffer->i_pts; @@ -579,7 +580,8 @@ void aout_InputPlay( audio_output_t * p_aout, aout_input_t * p_input, { msg_Warn( p_aout, "buffer way too early (%"PRId64"), clearing queue", drift ); - aout_FifoSet( &p_input->mixer.fifo, 0 ); + aout_FifoReset( &p_input->fifo ); + aout_OutputFlush( p_aout, false ); if ( p_input->i_resampling_type != AOUT_RESAMPLING_NONE ) msg_Warn( p_aout, "timing screwed, stopping resampling" ); inputResamplingStop( p_input ); @@ -593,14 +595,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 +684,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->mixer.fifo, p_buffer ); + return p_buffer; } /***************************************************************************** @@ -709,7 +711,7 @@ static void inputFailure( audio_output_t * p_aout, aout_input_t * p_input, aout_FiltersDestroyPipeline( p_input->pp_filters, p_input->i_nb_filters ); aout_FiltersDestroyPipeline( p_input->pp_resamplers, p_input->i_nb_resamplers ); - aout_FifoDestroy( &p_input->mixer.fifo ); + aout_FifoDestroy( &p_input->fifo ); var_Destroy( p_aout, "visual" ); var_Destroy( p_aout, "equalizer" ); var_Destroy( p_aout, "audio-filter" ); @@ -856,12 +858,13 @@ static int ReplayGainCallback( vlc_object_t *p_this, char const *psz_cmd, { VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(newval); VLC_UNUSED(p_data); - audio_output_t *p_aout = (audio_output_t *)p_this; + audio_output_t *aout = (audio_output_t *)p_this; + aout_owner_t *owner = aout_owner (aout); - aout_lock( p_aout ); - if( p_aout->p_input != NULL ) - ReplayGainSelect( p_aout, p_aout->p_input ); - aout_unlock( p_aout ); + aout_lock (aout); + if (owner->input != NULL) + ReplayGainSelect (aout, owner->input); + aout_unlock (aout); return VLC_SUCCESS; }