+ aout_unlock_input_fifos( p_aout );
+ aout_unlock_mixer( p_aout );
+ }
+
+ if( i_input_rate != INPUT_RATE_DEFAULT && p_input->p_playback_rate_filter == NULL )
+ {
+ inputDrop( p_aout, p_input, p_buffer );
+ return 0;
+ }
+
+#ifdef AOUT_PROCESS_BEFORE_CHEKS
+ /* Run pre-filters. */
+ aout_FiltersPlay( p_aout, p_input->pp_filters, p_input->i_nb_filters,
+ &p_buffer );
+
+ /* Actually run the resampler now. */
+ if ( p_input->i_nb_resamplers > 0 )
+ {
+ const mtime_t i_date = p_buffer->start_date;
+ aout_FiltersPlay( p_aout, p_input->pp_resamplers,
+ p_input->i_nb_resamplers,
+ &p_buffer );
+ }
+
+ if( p_buffer->i_nb_samples <= 0 )
+ {
+ aout_BufferFree( p_buffer );
+ return 0;
+ }
+#endif
+
+ /* 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->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);
+#undef F
+ p_input->i_last_input_rate = i_input_rate;