#include <vlc_common.h>
#include <vlc_plugin.h>
-#include <vlc_es.h>
#include <vlc_block.h>
#include <vlc_filter.h>
#include <vlc_aout.h>
vlc_module_begin ()
set_description( N_("Audio filter for stereo to mono conversion") )
set_capability( "audio filter2", 2 )
+ set_category( CAT_AUDIO )
+ set_subcategory( SUBCAT_AUDIO_MISC )
+ set_callbacks( OpenFilter, CloseFilter )
+ set_shortname( "Mono" )
add_bool( MONO_CFG "downmix", true, NULL, MONO_DOWNMIX_TEXT,
MONO_DOWNMIX_LONGTEXT, false )
MONO_CHANNEL_LONGTEXT, false )
change_integer_list( pi_pos_values, ppsz_pos_descriptions, NULL )
- set_category( CAT_AUDIO )
- set_subcategory( SUBCAT_AUDIO_MISC )
- set_callbacks( OpenFilter, CloseFilter )
- set_shortname( "Mono" )
vlc_module_end ()
/* Init() and ComputeChannelOperations() -
if( p_sys == NULL )
return VLC_EGENERIC;
- var_Create( p_this, MONO_CFG "downmix",
- VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
- p_sys->b_downmix = var_GetBool( p_this, MONO_CFG "downmix" );
-
- var_Create( p_this, MONO_CFG "channel",
- VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
+ p_sys->b_downmix = var_CreateGetBool( p_this, MONO_CFG "downmix" );
p_sys->i_channel_selected =
- (unsigned int) var_GetInteger( p_this, MONO_CFG "channel" );
+ (unsigned int) var_CreateGetInteger( p_this, MONO_CFG "channel" );
if( p_sys->b_downmix )
{
unsigned int i_samples;
int i_out_size;
- if( !p_block || !p_block->i_samples )
+ if( !p_block || !p_block->i_nb_samples )
{
if( p_block )
block_Release( p_block );
return NULL;
}
- i_out_size = p_block->i_samples * p_filter->p_sys->i_bitspersample/8 *
+ i_out_size = p_block->i_nb_samples * p_filter->p_sys->i_bitspersample/8 *
aout_FormatNbChannels( &(p_filter->fmt_out.audio) );
p_out = p_filter->pf_audio_buffer_new( p_filter, i_out_size );
block_Release( p_block );
return NULL;
}
- p_out->i_samples = (p_block->i_samples / p_filter->p_sys->i_nb_channels) *
+ p_out->i_nb_samples =
+ (p_block->i_nb_samples / p_filter->p_sys->i_nb_channels) *
aout_FormatNbChannels( &(p_filter->fmt_out.audio) );
p_out->i_dts = p_block->i_dts;
p_out->i_pts = p_block->i_pts;
in_buf.p_buffer = p_block->p_buffer;
in_buf.i_nb_bytes = p_block->i_buffer;
- in_buf.i_nb_samples = p_block->i_samples;
+ in_buf.i_nb_samples = p_block->i_nb_samples;
#if 0
unsigned int i_in_size = in_buf.i_nb_samples * (p_filter->p_sys->i_bitspersample/8) *
out_buf.p_buffer = p_out->p_buffer;
out_buf.i_nb_bytes = p_out->i_buffer;
- out_buf.i_nb_samples = p_out->i_samples;
+ out_buf.i_nb_samples = p_out->i_nb_samples;
memset( p_out->p_buffer, 0, i_out_size );
if( p_filter->p_sys->b_downmix )
}
p_out->i_buffer = out_buf.i_nb_bytes;
- p_out->i_samples = out_buf.i_nb_samples;
+ p_out->i_nb_samples = out_buf.i_nb_samples;
block_Release( p_block );
return p_out;
p_out = p_out_buf->p_buffer;
i_out_size = p_out_buf->i_nb_bytes;
- if( p_sys != NULL )
- {
- /* Slide the overflow buffer */
- p_overflow = p_sys->p_overflow_buffer;
- i_overflow_size = p_sys->i_overflow_buffer_size;
+ /* Slide the overflow buffer */
+ p_overflow = p_sys->p_overflow_buffer;
+ i_overflow_size = p_sys->i_overflow_buffer_size;
+
+ if ( i_out_size > i_overflow_size )
+ memcpy( p_out, p_overflow, i_overflow_size );
+ else
+ memcpy( p_out, p_overflow, i_out_size );
- if ( i_out_size > i_overflow_size )
- memcpy( p_out, p_overflow, i_overflow_size );
+ p_slide = p_sys->p_overflow_buffer;
+ while( p_slide < p_overflow + i_overflow_size )
+ {
+ if( p_slide + i_out_size < p_overflow + i_overflow_size )
+ {
+ memset( p_slide, 0, i_out_size );
+ if( p_slide + 2 * i_out_size < p_overflow + i_overflow_size )
+ memcpy( p_slide, p_slide + i_out_size, i_out_size );
+ else
+ memcpy( p_slide, p_slide + i_out_size,
+ p_overflow + i_overflow_size - ( p_slide + i_out_size ) );
+ }
else
- memcpy( p_out, p_overflow, i_out_size );
+ {
+ memset( p_slide, 0, p_overflow + i_overflow_size - p_slide );
+ }
+ p_slide += i_out_size;
+ }
+
+ /* apply the atomic operations */
+ for( i = 0; i < p_sys->i_nb_atomic_operations; i++ )
+ {
+ /* shorter variable names */
+ i_source_channel_offset
+ = p_sys->p_atomic_operations[i].i_source_channel_offset;
+ i_dest_channel_offset
+ = p_sys->p_atomic_operations[i].i_dest_channel_offset;
+ i_delay = p_sys->p_atomic_operations[i].i_delay;
+ d_amplitude_factor
+ = p_sys->p_atomic_operations[i].d_amplitude_factor;
- p_slide = p_sys->p_overflow_buffer;
- while( p_slide < p_overflow + i_overflow_size )
+ if( p_out_buf->i_nb_samples > i_delay )
{
- if( p_slide + i_out_size < p_overflow + i_overflow_size )
+ /* current buffer coefficients */
+ for( j = 0; j < p_out_buf->i_nb_samples - i_delay; j++ )
{
- memset( p_slide, 0, i_out_size );
- if( p_slide + 2 * i_out_size < p_overflow + i_overflow_size )
- memcpy( p_slide, p_slide + i_out_size, i_out_size );
- else
- memcpy( p_slide, p_slide + i_out_size,
- p_overflow + i_overflow_size - ( p_slide + i_out_size ) );
+ ((int16_t*)p_out)[ (i_delay+j)*i_output_nb + i_dest_channel_offset ]
+ += p_in[ j * i_input_nb + i_source_channel_offset ]
+ * d_amplitude_factor;
}
- else
+
+ /* overflow buffer coefficients */
+ for( j = 0; j < i_delay; j++ )
{
- memset( p_slide, 0, p_overflow + i_overflow_size - p_slide );
+ ((int16_t*)p_overflow)[ j*i_output_nb + i_dest_channel_offset ]
+ += p_in[ (p_out_buf->i_nb_samples - i_delay + j)
+ * i_input_nb + i_source_channel_offset ]
+ * d_amplitude_factor;
}
- p_slide += i_out_size;
}
-
- /* apply the atomic operations */
- for( i = 0; i < p_sys->i_nb_atomic_operations; i++ )
+ else
{
- /* shorter variable names */
- i_source_channel_offset
- = p_sys->p_atomic_operations[i].i_source_channel_offset;
- i_dest_channel_offset
- = p_sys->p_atomic_operations[i].i_dest_channel_offset;
- i_delay = p_sys->p_atomic_operations[i].i_delay;
- d_amplitude_factor
- = p_sys->p_atomic_operations[i].d_amplitude_factor;
-
- if( p_out_buf->i_nb_samples > i_delay )
- {
- /* current buffer coefficients */
- for( j = 0; j < p_out_buf->i_nb_samples - i_delay; j++ )
- {
- ((int16_t*)p_out)[ (i_delay+j)*i_output_nb + i_dest_channel_offset ]
- += p_in[ j * i_input_nb + i_source_channel_offset ]
- * d_amplitude_factor;
- }
-
- /* overflow buffer coefficients */
- for( j = 0; j < i_delay; j++ )
- {
- ((int16_t*)p_overflow)[ j*i_output_nb + i_dest_channel_offset ]
- += p_in[ (p_out_buf->i_nb_samples - i_delay + j)
- * i_input_nb + i_source_channel_offset ]
- * d_amplitude_factor;
- }
- }
- else
+ /* overflow buffer coefficients only */
+ for( j = 0; j < p_out_buf->i_nb_samples; j++ )
{
- /* overflow buffer coefficients only */
- for( j = 0; j < p_out_buf->i_nb_samples; j++ )
- {
- ((int16_t*)p_overflow)[ (i_delay - p_out_buf->i_nb_samples + j)
- * i_output_nb + i_dest_channel_offset ]
- += p_in[ j * i_input_nb + i_source_channel_offset ]
- * d_amplitude_factor;
- }
+ ((int16_t*)p_overflow)[ (i_delay - p_out_buf->i_nb_samples + j)
+ * i_output_nb + i_dest_channel_offset ]
+ += p_in[ j * i_input_nb + i_source_channel_offset ]
+ * d_amplitude_factor;
}
}
}
- else
- {
- memset( p_out, 0, i_out_size );
- }
}
/* Simple stereo to mono mixing. */