- p_out_buf->i_nb_samples = p_in_buf->i_nb_samples;
- p_out_buf->i_buffer = p_in_buf->i_buffer * i_output_nb / i_input_nb;
+ block_t *p_out_buf;
+ if( i_input_nb >= i_output_nb )
+ {
+ p_out_buf = p_in_buf; /* mix in place */
+ p_out_buf->i_buffer = p_in_buf->i_buffer / i_input_nb * i_output_nb;
+ }
+ else
+ {
+ p_out_buf = filter_NewAudioBuffer( p_filter,
+ p_in_buf->i_buffer / i_input_nb * i_output_nb );
+ if( !p_out_buf )
+ goto out;
+ p_out_buf->i_nb_samples = p_in_buf->i_nb_samples;
+ }
+
+ int32_t * p_dest = (int32_t *)p_out_buf->p_buffer;
+ const int32_t * p_src = (int32_t *)p_in_buf->p_buffer;