*****************************************************************************/
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;
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 )
/* 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 );
}
/* 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;
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;
}
*****************************************************************************/
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 )
/* 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;
*****************************************************************************/
/* 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;
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
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 )
}
if( !p_buffer )
- return;
+ return NULL;
if( p_buffer->i_nb_samples <= 0 )
{
block_Release( p_buffer );
- return;
+ return NULL;
}
#endif
/* 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 )
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;
{
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 );
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.
}
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;
}
/*****************************************************************************
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" );
{
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;
}