]> git.sesse.net Git - vlc/commitdiff
aout: premultiply gain before mixing
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 26 Jul 2011 19:15:43 +0000 (22:15 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 26 Jul 2011 19:15:43 +0000 (22:15 +0300)
include/vlc_aout_mixer.h
modules/audio_mixer/fixed32.c
modules/audio_mixer/float32.c
src/audio_output/aout_internal.h
src/audio_output/dec.c
src/audio_output/input.c

index a38de406fe667fb29c2bcfd2899cee14adc41d89..7b3e0221c3e21798c5e3af6f493422aec5f495cd 100644 (file)
@@ -41,11 +41,7 @@ typedef struct aout_mixer_sys_t aout_mixer_sys_t;
 typedef struct aout_mixer_t aout_mixer_t;
 
 typedef struct {
-    /* */
     aout_fifo_t fifo;
-
-    /* Software multiplier */
-    float       multiplier;
 } aout_mixer_input_t;
 
 /** 
index 65fd6edf1219f499e2eaae5cf90693965d7b6392..7f3c96b32bec00bcf75be70c72597a73e4d312a7 100644 (file)
@@ -60,7 +60,7 @@ static int Activate (vlc_object_t *obj)
 
 static void FilterFI32 (aout_mixer_t *mixer, block_t *block, float volume)
 {
-    const int64_t mult = volume * mixer->input->multiplier * FIXED32_ONE;
+    const int64_t mult = volume * FIXED32_ONE;
 
     if (mult == FIXED32_ONE)
         return;
@@ -72,11 +72,13 @@ static void FilterFI32 (aout_mixer_t *mixer, block_t *block, float volume)
         *p = (*p * mult) >> FIXED32_FRACBITS;
         p++;
     }
+
+    (void) mixer;
 }
 
 static void FilterS16N (aout_mixer_t *mixer, block_t *block, float volume)
 {
-    const int32_t mult = volume * mixer->input->multiplier * 0x10000;
+    const int32_t mult = volume * 0x10000;
 
     if (mult == 0x10000)
         return;
@@ -88,4 +90,6 @@ static void FilterS16N (aout_mixer_t *mixer, block_t *block, float volume)
         *p = (*p * mult) >> 16;
         p++;
     }
+
+    (void) mixer;
 }
index 27cc1de0daab28ee01d42f6b2ae7640b5077c8e2..aa23ee8db12f2e2dd72263d26a53ff51b4a1fe94 100644 (file)
@@ -72,12 +72,12 @@ static int Create( vlc_object_t *p_this )
 static void DoWork( aout_mixer_t * p_mixer, aout_buffer_t *p_buffer,
                     float f_multiplier )
 {
-    f_multiplier *= p_mixer->input->multiplier;
-
     if( f_multiplier == 1.0 )
         return; /* nothing to do */
 
     float *p = (float *)p_buffer->p_buffer;
     for( size_t i = p_buffer->i_buffer / sizeof(float); i > 0; i-- )
         *(p++) *= f_multiplier;
+
+    (void) p_mixer;
 }
index 2324fc54be311cb7f4e21b50a9530426c01d5c31..54a470a18ae8378bae541d9c021e83d9b90d19e0 100644 (file)
@@ -54,6 +54,7 @@ block_t *aout_FilterBufferNew( filter_t *, int );
 struct aout_input_t
 {
     audio_sample_format_t   input;
+    float                   multiplier; /**< Replay gain multiplier */
 
     /* pre-filters */
     filter_t *              pp_filters[AOUT_MAX_FILTERS];
index f86f76d19ff65de33b03d8cbc3f13dceadd03354..1509a5ac5618179bcc21808608ba6e84c4ffb5db 100644 (file)
@@ -198,7 +198,7 @@ int aout_DecPlay( audio_output_t * p_aout, aout_input_t * p_input,
     aout_InputCheckAndRestart( p_aout, p_input );
     aout_InputPlay( p_aout, p_input, p_buffer, i_input_rate );
     /* Run the mixer if it is able to run. */
-    aout_MixerRun( p_aout, p_aout->mixer_multiplier );
+    aout_MixerRun( p_aout, p_aout->mixer_multiplier * p_input->multiplier );
     aout_unlock( p_aout );
     return 0;
 }
index b51006433f8cdfe7ec664a93972a95d90e58adb4..5e9f772de8fc5ed0587c019f9ece8e8015fddc2c 100644 (file)
@@ -874,7 +874,7 @@ static void ReplayGainSelect( audio_output_t *p_aout, aout_input_t *p_input )
     int i_use;
     float f_gain;
 
-    p_input->mixer.multiplier = 1.0;
+    p_input->multiplier = 1.0;
 
     if( !psz_replay_gain )
         return;
@@ -905,14 +905,14 @@ static void ReplayGainSelect( audio_output_t *p_aout, aout_input_t *p_input )
         f_gain = var_GetFloat( p_aout, "audio-replay-gain-default" );
     else
         f_gain = 0.0;
-    p_input->mixer.multiplier = pow( 10.0, f_gain / 20.0 );
+    p_input->multiplier = pow( 10.0, f_gain / 20.0 );
 
     /* */
     if( p_input->replay_gain.pb_peak[i_use] &&
         var_GetBool( p_aout, "audio-replay-gain-peak-protection" ) &&
-        p_input->replay_gain.pf_peak[i_use] * p_input->mixer.multiplier > 1.0 )
+        p_input->replay_gain.pf_peak[i_use] * p_input->multiplier > 1.0 )
     {
-        p_input->mixer.multiplier = 1.0f / p_input->replay_gain.pf_peak[i_use];
+        p_input->multiplier = 1.0f / p_input->replay_gain.pf_peak[i_use];
     }
 
     free( psz_replay_gain );