[vlc-commits] Pass mute flag to aout_output_t.pf_volume_set

Rémi Denis-Courmont git at videolan.org
Thu Apr 7 22:41:32 CEST 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Apr  7 23:36:00 2011 +0300| [28ef0fe16c33c2e314654aed350dfaf60a980ebf] | committer: Rémi Denis-Courmont

Pass mute flag to aout_output_t.pf_volume_set

This improves mute flag handling in the PulseAudio output:
We do not blindly reset the mute flag.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=28ef0fe16c33c2e314654aed350dfaf60a980ebf
---

 include/vlc_aout.h               |    2 +-
 modules/audio_output/pulse.c     |    5 +--
 modules/audio_output/waveout.c   |    8 +++--
 src/audio_output/aout_internal.h |    4 ---
 src/audio_output/intf.c          |   53 +++++++++++++++-----------------------
 5 files changed, 29 insertions(+), 43 deletions(-)

diff --git a/include/vlc_aout.h b/include/vlc_aout.h
index 20bc455..3bb3265 100644
--- a/include/vlc_aout.h
+++ b/include/vlc_aout.h
@@ -198,7 +198,7 @@ typedef struct aout_output_t
     struct module_t *       p_module;
     struct aout_sys_t *     p_sys;
     void                 (* pf_play)( aout_instance_t * );
-    int                  (* pf_volume_set )( aout_instance_t *, audio_volume_t );
+    int                  (* pf_volume_set )( aout_instance_t *, audio_volume_t, bool );
     int                     i_nb_samples;
 
     /* Current volume for the output - it's just a placeholder, the plug-in
diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c
index 809f0f6..b212d95 100644
--- a/modules/audio_output/pulse.c
+++ b/modules/audio_output/pulse.c
@@ -258,7 +258,7 @@ static void Play(aout_instance_t *aout)
     pa_threaded_mainloop_unlock(sys->mainloop);
 }
 
-static int VolumeSet(aout_instance_t *aout, audio_volume_t vol)
+static int VolumeSet(aout_instance_t *aout, audio_volume_t vol, bool mute)
 {
     aout_sys_t *sys = aout->output.p_sys;
     pa_threaded_mainloop *mainloop = sys->mainloop;
@@ -278,8 +278,7 @@ static int VolumeSet(aout_instance_t *aout, audio_volume_t vol)
     op = pa_context_set_sink_input_volume(sys->context, idx, &cvolume, NULL, NULL);
     if (likely(op != NULL))
         pa_operation_unref(op);
-    op = pa_context_set_sink_input_mute(sys->context, idx, volume == PA_VOLUME_MUTED,
-                                        NULL, NULL);
+    op = pa_context_set_sink_input_mute(sys->context, idx, mute, NULL, NULL);
     if (likely(op != NULL))
         pa_operation_unref(op);
     pa_threaded_mainloop_unlock(mainloop);
diff --git a/modules/audio_output/waveout.c b/modules/audio_output/waveout.c
index 36b8ae4..a5f6e04 100644
--- a/modules/audio_output/waveout.c
+++ b/modules/audio_output/waveout.c
@@ -1019,8 +1019,12 @@ static void* WaveOutThread( vlc_object_t *p_this )
     return NULL;
 }
 
-static int VolumeSet( aout_instance_t * p_aout, audio_volume_t i_volume )
+static int VolumeSet( aout_instance_t * p_aout, audio_volume_t i_volume,
+                      bool mute )
 {
+    if( mute )
+        i_volume = AOUT_VOLUME_MIN;
+
     unsigned long i_waveout_vol = i_volume * 0xFFFF * 2 / AOUT_VOLUME_MAX;
     i_waveout_vol |= (i_waveout_vol << 16);
 
@@ -1029,8 +1033,6 @@ static int VolumeSet( aout_instance_t * p_aout, audio_volume_t i_volume )
 #else
     waveOutSetVolume( p_aout->output.p_sys->h_waveout, i_waveout_vol );
 #endif
-
-    p_aout->output.i_volume = i_volume;
     return 0;
 }
 
diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h
index 8a648eb..004eed3 100644
--- a/src/audio_output/aout_internal.h
+++ b/src/audio_output/aout_internal.h
@@ -140,10 +140,6 @@ void aout_FifoDestroy( aout_instance_t * p_aout, aout_fifo_t * p_fifo );
 void aout_FormatsPrint( aout_instance_t * p_aout, const char * psz_text, const audio_sample_format_t * p_format1, const audio_sample_format_t * p_format2 );
 bool aout_ChangeFilterString( vlc_object_t *, aout_instance_t *, const char *psz_variable, const char *psz_name, bool b_add );
 
-/* From intf.c :*/
-int aout_VolumeSoftSet( aout_instance_t *, audio_volume_t );
-int aout_VolumeNoneSet( aout_instance_t *, audio_volume_t );
-
 /* From dec.c */
 aout_input_t *aout_DecNew( aout_instance_t *, audio_sample_format_t *,
                    const audio_replay_gain_t *, const aout_request_vout_t * );
diff --git a/src/audio_output/intf.c b/src/audio_output/intf.c
index 8265d18..776e11f 100644
--- a/src/audio_output/intf.c
+++ b/src/audio_output/intf.c
@@ -81,8 +81,6 @@ static int commitVolume (vlc_object_t *obj, aout_instance_t *aout,
     int ret = 0;
 
     var_SetInteger (obj, "volume", volume);
-    if (mute)
-        volume = AOUT_VOLUME_MIN;
     var_SetBool (obj, "mute", mute);
 
     if (aout != NULL)
@@ -90,7 +88,7 @@ static int commitVolume (vlc_object_t *obj, aout_instance_t *aout,
         aout_lock_mixer (aout);
         aout_lock_input_fifos (aout);
         if (aout->p_mixer != NULL)
-            ret = aout->output.pf_volume_set (aout, volume);
+            ret = aout->output.pf_volume_set (aout, volume, mute);
         aout_unlock_input_fifos (aout);
         aout_unlock_mixer (aout);
 
@@ -229,43 +227,41 @@ int aout_SetMute (vlc_object_t *obj, audio_volume_t *volp, bool mute)
     return ret;
 }
 
+
 /*
  * The next functions are not supposed to be called by the interface, but
  * are placeholders for software-only scaling.
  */
+static int aout_VolumeSoftSet (aout_instance_t *aout, audio_volume_t volume,
+                               bool mute)
+{
+    float f = mute ? 0. : (volume / (float)AOUT_VOLUME_DEFAULT);
+    aout_MixerMultiplierSet (aout, f);
+    aout->output.i_volume = volume;
+    return 0;
+}
 
 /* Meant to be called by the output plug-in's Open(). */
-void aout_VolumeSoftInit( aout_instance_t * p_aout )
+void aout_VolumeSoftInit (aout_instance_t *aout)
 {
-    int i_volume;
-
-    p_aout->output.pf_volume_set = aout_VolumeSoftSet;
-
-    i_volume = var_InheritInteger( p_aout, "volume" );
-    if ( i_volume < AOUT_VOLUME_MIN )
-    {
-        i_volume = AOUT_VOLUME_DEFAULT;
-    }
-    else if ( i_volume > AOUT_VOLUME_MAX )
-    {
-        i_volume = AOUT_VOLUME_MAX;
-    }
+    audio_volume_t volume = var_InheritInteger (aout, "volume");
+    bool mute = var_InheritBool (aout, "mute");
 
-    aout_VolumeSoftSet( p_aout, (audio_volume_t)i_volume );
+    aout->output.pf_volume_set = aout_VolumeSoftSet;
+    aout_VolumeSoftSet (aout, volume, mute);
 }
 
-/* Placeholder for pf_volume_set(). */
-int aout_VolumeSoftSet( aout_instance_t * p_aout, audio_volume_t i_volume )
-{
-    aout_MixerMultiplierSet( p_aout, (float)i_volume / AOUT_VOLUME_DEFAULT );
-    p_aout->output.i_volume = i_volume;
-    return 0;
-}
 
 /*
  * The next functions are not supposed to be called by the interface, but
  * are placeholders for unsupported scaling.
  */
+static int aout_VolumeNoneSet (aout_instance_t *aout, audio_volume_t volume,
+                               bool mute)
+{
+    (void)aout; (void)volume; (void)mute;
+    return -1;
+}
 
 /* Meant to be called by the output plug-in's Open(). */
 void aout_VolumeNoneInit( aout_instance_t * p_aout )
@@ -273,13 +269,6 @@ void aout_VolumeNoneInit( aout_instance_t * p_aout )
     p_aout->output.pf_volume_set = aout_VolumeNoneSet;
 }
 
-/* Placeholder for pf_volume_set(). */
-int aout_VolumeNoneSet( aout_instance_t * p_aout, audio_volume_t i_volume )
-{
-    (void)p_aout; (void)i_volume;
-    return -1;
-}
-
 
 /*
  * Pipelines management



More information about the vlc-commits mailing list