}
p_input->i_resampling_type = AOUT_RESAMPLING_NONE;
+ p_input->p_playback_rate_filter = NULL;
+ for( int i = 0; i < p_input->i_nb_filters; i++ )
+ {
+ aout_filter_t *p_filter = p_input->pp_filters[i];
+ if( strcmp( "scaletempo", p_filter->psz_object_name ) == 0 )
+ {
+ p_input->p_playback_rate_filter = p_filter;
+ break;
+ }
+ }
+ if( ! p_input->p_playback_rate_filter && p_input->i_nb_resamplers > 0 )
+ {
+ p_input->p_playback_rate_filter = p_input->pp_resamplers[0];
+ }
+
aout_FiltersHintBuffers( p_aout, p_input->pp_filters,
p_input->i_nb_filters,
&p_input->input_alloc );
vlc_mutex_unlock( &p_aout->mixer_lock );
}
- if( i_input_rate != INPUT_RATE_DEFAULT && p_input->i_nb_resamplers <= 0 )
+ if( i_input_rate != INPUT_RATE_DEFAULT && p_input->p_playback_rate_filter == NULL )
{
inputDrop( p_aout, p_input, p_buffer );
return 0;
}
#endif
- /* Handle input rate change by modifying resampler input rate */
+ /* Handle input rate change, but keep drift correction */
if( i_input_rate != p_input->i_last_input_rate )
{
- unsigned int * const pi_rate = &p_input->pp_resamplers[0]->input.i_rate;
+ unsigned int * const pi_rate = &p_input->p_playback_rate_filter->input.i_rate;
#define F(r,ir) ( INPUT_RATE_DEFAULT * (r) / (ir) )
const int i_delta = *pi_rate - F(p_input->input.i_rate,p_input->i_last_input_rate);
*pi_rate = F(p_input->input.i_rate + i_delta, i_input_rate);
/* If the audio drift is too big then it's not worth trying to resample
* the audio. */
+ mtime_t i_pts_tolerance = 3 * AOUT_PTS_TOLERANCE * i_input_rate / INPUT_RATE_DEFAULT;
if ( start_date != 0 &&
- ( start_date < p_buffer->start_date - 3 * AOUT_PTS_TOLERANCE ) )
+ ( start_date < p_buffer->start_date - i_pts_tolerance ) )
{
msg_Warn( p_aout, "audio drift is too big (%"PRId64"), clearing out",
start_date - p_buffer->start_date );
start_date = 0;
}
else if ( start_date != 0 &&
- ( start_date > p_buffer->start_date + 3 * AOUT_PTS_TOLERANCE ) )
+ ( start_date > p_buffer->start_date + i_pts_tolerance) )
{
msg_Warn( p_aout, "audio drift is too big (%"PRId64"), dropping buffer",
start_date - p_buffer->start_date );
/* Check if everything is back to normal, in which case we can stop the
* resampling */
- if( p_input->pp_resamplers[0]->input.i_rate == 1000 * p_input->input.i_rate / i_input_rate )
+ unsigned int i_nominal_rate =
+ (p_input->pp_resamplers[0] == p_input->p_playback_rate_filter)
+ ? INPUT_RATE_DEFAULT * p_input->input.i_rate / i_input_rate
+ : p_input->input.i_rate;
+ if( p_input->pp_resamplers[0]->input.i_rate == i_nominal_rate )
{
p_input->i_resampling_type = AOUT_RESAMPLING_NONE;
msg_Warn( p_aout, "resampling stopped after %"PRIi64" usec "
p_input->i_resampling_type = AOUT_RESAMPLING_NONE;
if( p_input->i_nb_resamplers != 0 )
{
- p_input->pp_resamplers[0]->input.i_rate = INPUT_RATE_DEFAULT *
- p_input->input.i_rate / p_input->i_last_input_rate;
+ p_input->pp_resamplers[0]->input.i_rate =
+ ( p_input->pp_resamplers[0] == p_input->p_playback_rate_filter )
+ ? INPUT_RATE_DEFAULT * p_input->input.i_rate / p_input->i_last_input_rate
+ : p_input->input.i_rate;
p_input->pp_resamplers[0]->b_continuity = false;
}
}