X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faudio_filter%2Fchannel_mixer%2Fmono.c;h=7e4af3d792bfe3ea1ac0efbba3383d93aac8c9a5;hb=ad77d955a5dc051976d94d6e08ee0f717ec3a938;hp=a185ad77e4752de261d36ca8d4b665d6da62c226;hpb=e40d134c69b144327fd1d2001e8b85640f5c7cb9;p=vlc diff --git a/modules/audio_filter/channel_mixer/mono.c b/modules/audio_filter/channel_mixer/mono.c index a185ad77e4..7e4af3d792 100644 --- a/modules/audio_filter/channel_mixer/mono.c +++ b/modules/audio_filter/channel_mixer/mono.c @@ -24,19 +24,19 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* sqrt */ - -#ifdef HAVE_STDINT_H -# include /* int16_t .. */ -#elif defined(HAVE_INTTYPES_H) -# include /* int16_t .. */ +#ifdef HAVE_CONFIG_H +# include "config.h" #endif +#include /* sqrt */ +#include /* int16_t .. */ + #ifdef HAVE_UNISTD_H # include #endif -#include +#include +#include #include #include #include @@ -50,12 +50,11 @@ static void CloseFilter ( vlc_object_t * ); static block_t *Convert( filter_t *p_filter, block_t *p_block ); -static unsigned int stereo_to_mono( aout_instance_t *, aout_filter_t *, - aout_buffer_t *, aout_buffer_t * ); -static unsigned int mono( aout_instance_t *, aout_filter_t *, - aout_buffer_t *, aout_buffer_t * ); -static void stereo2mono_downmix( aout_instance_t *, aout_filter_t *, - aout_buffer_t *, aout_buffer_t * ); +static unsigned int stereo_to_mono( aout_filter_t *, aout_buffer_t *, + aout_buffer_t * ); +static unsigned int mono( aout_filter_t *, aout_buffer_t *, aout_buffer_t * ); +static void stereo2mono_downmix( aout_filter_t *, aout_buffer_t *, + aout_buffer_t * ); /***************************************************************************** * Local structures @@ -70,30 +69,30 @@ struct atomic_operation_t struct filter_sys_t { - vlc_bool_t b_downmix; + bool b_downmix; unsigned int i_nb_channels; /* number of int16_t per sample */ int i_channel_selected; int i_bitspersample; size_t i_overflow_buffer_size;/* in bytes */ - byte_t * p_overflow_buffer; + uint8_t * p_overflow_buffer; unsigned int i_nb_atomic_operations; struct atomic_operation_t * p_atomic_operations; }; -#define MONO_DOWNMIX_TEXT N_("Use downmix algorithme.") +#define MONO_DOWNMIX_TEXT N_("Use downmix algorithm") #define MONO_DOWNMIX_LONGTEXT N_("This option selects a stereo to mono " \ - "downmix algorithm that is used in the headphone channel mixer. It" \ + "downmix algorithm that is used in the headphone channel mixer. It " \ "gives the effect of standing in a room full of speakers." ) #define MONO_CHANNEL_TEXT N_("Select channel to keep") #define MONO_CHANNEL_LONGTEXT N_("This option silences all other channels " \ - "except the selected channel. Choose one from (0=left, 1=right " \ + "except the selected channel. Choose one from (0=left, 1=right, " \ "2=rear left, 3=rear right, 4=center, 5=left front)") static const int pi_pos_values[] = { 0, 1, 2, 4, 8, 5 }; -static const char *ppsz_pos_descriptions[] = +static const char *const ppsz_pos_descriptions[] = { N_("Left"), N_("Right"), N_("Left rear"), N_("Right rear"), N_("Center"), N_("Left front") }; @@ -106,21 +105,21 @@ static const uint32_t pi_channels_out[] = /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_description( _("Audio filter for stereo to mono conversion") ); - set_capability( "audio filter2", 0 ); +vlc_module_begin () + set_description( N_("Audio filter for stereo to mono conversion") ) + set_capability( "audio filter2", 2 ) - add_bool( MONO_CFG "downmix", VLC_FALSE, NULL, MONO_DOWNMIX_TEXT, - MONO_DOWNMIX_LONGTEXT, VLC_FALSE ); + add_bool( MONO_CFG "downmix", true, NULL, MONO_DOWNMIX_TEXT, + MONO_DOWNMIX_LONGTEXT, false ) add_integer( MONO_CFG "channel", -1, NULL, MONO_CHANNEL_TEXT, - MONO_CHANNEL_LONGTEXT, VLC_FALSE ); - change_integer_list( pi_pos_values, ppsz_pos_descriptions, 0 ); + 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(); + set_category( CAT_AUDIO ) + set_subcategory( SUBCAT_AUDIO_MISC ) + set_callbacks( OpenFilter, CloseFilter ) + set_shortname( "Mono" ) +vlc_module_end () /* Init() and ComputeChannelOperations() - * Code taken from modules/audio_filter/channel_mixer/headphone.c @@ -215,12 +214,6 @@ static int Init( vlc_object_t *p_this, struct filter_sys_t * p_data, int i_source_channel_offset; unsigned int i; - if( p_data == NULL ) - { - msg_Dbg( p_this, "passing a null pointer as argument" ); - return 0; - } - if( config_GetInt( p_this, "headphone-compensate" ) ) { /* minimal distance to any speaker */ @@ -243,10 +236,7 @@ static int Init( vlc_object_t *p_this, struct filter_sys_t * p_data, p_data->p_atomic_operations = malloc( sizeof(struct atomic_operation_t) * p_data->i_nb_atomic_operations ); if( p_data->p_atomic_operations == NULL ) - { - msg_Err( p_this, "out of memory" ); return -1; - } /* For each virtual speaker, computes elementary wave propagation time * to each ear */ @@ -343,9 +333,9 @@ static int Init( vlc_object_t *p_this, struct filter_sys_t * p_data, } } p_data->p_overflow_buffer = malloc( p_data->i_overflow_buffer_size ); - if( p_data->p_atomic_operations == NULL ) + if( p_data->p_overflow_buffer == NULL ) { - msg_Err( p_this, "out of memory" ); + free( p_data->p_atomic_operations ); return -1; } memset( p_data->p_overflow_buffer, 0, p_data->i_overflow_buffer_size ); @@ -364,35 +354,32 @@ static int OpenFilter( vlc_object_t *p_this ) if( aout_FormatNbChannels( &(p_filter->fmt_in.audio) ) == 1 ) { - msg_Dbg( p_filter, "filter discarded (incompatible format)" ); + /*msg_Dbg( p_filter, "filter discarded (incompatible format)" );*/ return VLC_EGENERIC; } - if( (p_filter->fmt_in.i_codec != AOUT_FMT_S16_NE) || - (p_filter->fmt_out.i_codec != AOUT_FMT_S16_NE) ) + if( (p_filter->fmt_in.i_codec != VLC_CODEC_S16N) || + (p_filter->fmt_out.i_codec != VLC_CODEC_S16N) ) { - msg_Err( p_this, "filter discarded (invalid format)" ); - return -1; + /*msg_Err( p_this, "filter discarded (invalid format)" );*/ + return VLC_EGENERIC; } if( (p_filter->fmt_in.audio.i_format != p_filter->fmt_out.audio.i_format) && (p_filter->fmt_in.audio.i_rate != p_filter->fmt_out.audio.i_rate) && - (p_filter->fmt_in.audio.i_format != AOUT_FMT_S16_NE) && - (p_filter->fmt_out.audio.i_format != AOUT_FMT_S16_NE) && + (p_filter->fmt_in.audio.i_format != VLC_CODEC_S16N) && + (p_filter->fmt_out.audio.i_format != VLC_CODEC_S16N) && (p_filter->fmt_in.audio.i_bitspersample != p_filter->fmt_out.audio.i_bitspersample)) { - msg_Err( p_this, "couldn't load mono filter" ); + /*msg_Err( p_this, "couldn't load mono filter" );*/ return VLC_EGENERIC; } /* Allocate the memory needed to store the module's structure */ p_sys = p_filter->p_sys = malloc( sizeof(filter_sys_t) ); if( p_sys == NULL ) - { - msg_Err( p_filter, "out of memory" ); return VLC_EGENERIC; - } var_Create( p_this, MONO_CFG "downmix", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); @@ -433,6 +420,9 @@ static int OpenFilter( vlc_object_t *p_this ) p_filter->fmt_in.audio.i_physical_channels, p_filter->fmt_in.audio.i_rate ) < 0 ) { + var_Destroy( p_this, MONO_CFG "channel" ); + var_Destroy( p_this, MONO_CFG "downmix" ); + free( p_sys ); return VLC_EGENERIC; } @@ -459,6 +449,8 @@ static void CloseFilter( vlc_object_t *p_this) var_Destroy( p_this, MONO_CFG "channel" ); var_Destroy( p_this, MONO_CFG "downmix" ); + free( p_sys->p_atomic_operations ); + free( p_sys->p_overflow_buffer ); free( p_sys ); } @@ -476,7 +468,7 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) if( !p_block || !p_block->i_samples ) { if( p_block ) - p_block->pf_release( p_block ); + block_Release( p_block ); return NULL; } @@ -487,7 +479,7 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) if( !p_out ) { msg_Warn( p_filter, "can't get output buffer" ); - p_block->pf_release( p_block ); + block_Release( p_block ); return NULL; } p_out->i_samples = (p_block->i_samples / p_filter->p_sys->i_nb_channels) * @@ -523,21 +515,18 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) memset( p_out->p_buffer, 0, i_out_size ); if( p_filter->p_sys->b_downmix ) { - stereo2mono_downmix( (aout_instance_t *)p_filter, &aout_filter, - &in_buf, &out_buf ); - i_samples = mono( (aout_instance_t *)p_filter, &aout_filter, - &out_buf, &in_buf ); + stereo2mono_downmix( &aout_filter, &in_buf, &out_buf ); + i_samples = mono( &aout_filter, &out_buf, &in_buf ); } else { - i_samples = stereo_to_mono( (aout_instance_t *)p_filter, &aout_filter, - &out_buf, &in_buf ); + i_samples = stereo_to_mono( &aout_filter, &out_buf, &in_buf ); } p_out->i_buffer = out_buf.i_nb_bytes; p_out->i_samples = out_buf.i_nb_samples; - p_block->pf_release( p_block ); + block_Release( p_block ); return p_out; } @@ -546,7 +535,7 @@ static block_t *Convert( filter_t *p_filter, block_t *p_block ) * converted from float into int16_t based downmix * Written by Boris Dorès */ -static void stereo2mono_downmix( aout_instance_t * p_aout, aout_filter_t * p_filter, +static void stereo2mono_downmix( aout_filter_t * p_filter, aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) { filter_sys_t *p_sys = (filter_sys_t *)p_filter->p_sys; @@ -555,9 +544,9 @@ static void stereo2mono_downmix( aout_instance_t * p_aout, aout_filter_t * p_fil int i_output_nb = aout_FormatNbChannels( &p_filter->output ); int16_t * p_in = (int16_t*) p_in_buf->p_buffer; - byte_t * p_out; - byte_t * p_overflow; - byte_t * p_slide; + uint8_t * p_out; + uint8_t * p_overflow; + uint8_t * p_slide; size_t i_overflow_size; /* in bytes */ size_t i_out_size; /* in bytes */ @@ -656,7 +645,7 @@ static void stereo2mono_downmix( aout_instance_t * p_aout, aout_filter_t * p_fil } /* Simple stereo to mono mixing. */ -static unsigned int mono( aout_instance_t * p_aout, aout_filter_t *p_filter, +static unsigned int mono( aout_filter_t *p_filter, aout_buffer_t *p_output, aout_buffer_t *p_input ) { filter_sys_t *p_sys = (filter_sys_t *)p_filter->p_sys; @@ -676,7 +665,7 @@ static unsigned int mono( aout_instance_t * p_aout, aout_filter_t *p_filter, } /* Simple stereo to mono mixing. */ -static unsigned int stereo_to_mono( aout_instance_t * p_aout, aout_filter_t *p_filter, +static unsigned int stereo_to_mono( aout_filter_t *p_filter, aout_buffer_t *p_output, aout_buffer_t *p_input ) { filter_sys_t *p_sys = (filter_sys_t *)p_filter->p_sys;