]> git.sesse.net Git - vlc/blobdiff - src/audio_output/intf.c
Use var_Inherit* instead of var_CreateGet*.
[vlc] / src / audio_output / intf.c
index 331f37b41662621c27d12c365f1bce7557c48a26..017ece22599c726817ffb802045b7c32f5bc9286 100644 (file)
 
 static aout_instance_t *findAout (vlc_object_t *obj)
 {
-    input_thread_t *p_input = playlist_CurrentInput (pl_Get (obj));
+    input_thread_t *(*pf_find_input) (vlc_object_t *);
+
+    pf_find_input = var_GetAddress (obj, "find-input-callback");
+    if (unlikely(pf_find_input == NULL))
+        return NULL;
+
+    input_thread_t *p_input = pf_find_input (obj);
     if (p_input == NULL)
        return NULL;
 
@@ -50,6 +56,7 @@ static aout_instance_t *findAout (vlc_object_t *obj)
     vlc_object_release (p_input);
     return p_aout;
 }
+#define findAout(o) findAout(VLC_OBJECT(o))
 
 /*
  * Volume management
@@ -80,10 +87,12 @@ enum {
     INCREMENT_VOLUME=4,
     TOGGLE_MUTE=8
 };
+
 /*****************************************************************************
  * doVolumeChanges : handle all volume changes. Internal use only to ease
  *                   variables locking.
  *****************************************************************************/
+static
 int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps,
                 audio_volume_t i_volume, audio_volume_t * i_return_volume,
                 bool b_mute )
@@ -95,14 +104,16 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps,
 
     if ( p_aout ) aout_lock_volume( p_aout );
 
-    b_var_mute = (bool)var_GetBool( p_object->p_libvlc, "volume-muted");
+    b_var_mute = var_GetBool( p_object, "volume-muted");
 
-    const bool b_unmute_condition = ( /* Also unmute on increments */
+    const bool b_unmute_condition = ( b_var_mute
+                && ( /* Unmute: on increments */
                     ( action == INCREMENT_VOLUME )
                     || /* On explicit unmute */
-                    ( ( action == SET_MUTE ) && ( b_var_mute && !b_mute ) )
+                    ( ( action == SET_MUTE ) && !b_mute )
                     || /* On toggle from muted */
-                    ( ( action == TOGGLE_MUTE ) && b_var_mute ) );
+                    ( action == TOGGLE_MUTE )
+                ));
 
     const bool b_mute_condition = ( !b_var_mute
                     && ( /* explicit */
@@ -111,14 +122,23 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps,
                         ( action == TOGGLE_MUTE )
                     ));
 
+    /* If muting or unmuting when play hasn't started */
+    if ( action == SET_MUTE && !b_unmute_condition && !b_mute_condition )
+    {
+        if ( p_aout )
+        {
+            aout_unlock_volume( p_aout );
+            vlc_object_release( p_aout );
+        }
+        return i_result;
+    }
+
     /* On UnMute */
     if ( b_unmute_condition )
     {
         /* Restore saved volume */
-        var_Create( p_object->p_libvlc, "saved-volume", VLC_VAR_INTEGER );
-        i_volume = (audio_volume_t)var_GetInteger( p_object->p_libvlc,
-                                                   "saved-volume" );
-        var_SetBool( p_object->p_libvlc, "volume-muted", false );
+        i_volume = var_GetInteger( p_object, "saved-volume" );
+        var_SetBool( p_object, "volume-muted", false );
     }
     else if ( b_mute_condition )
     {
@@ -128,7 +148,7 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps,
 
     if ( action == INCREMENT_VOLUME )
     {
-        i_volume_step = config_GetInt( p_object->p_libvlc, "volume-step" );
+        i_volume_step = var_InheritInteger( p_object, "volume-step" );
 
         if ( !b_unmute_condition )
             i_volume = config_GetInt( p_object, "volume" );
@@ -141,19 +161,15 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps,
             i_volume = AOUT_VOLUME_MIN;
         else
             i_volume = i_new_volume;
-
-        if ( i_return_volume != NULL )
-            *i_return_volume = i_volume;
     }
 
-    var_Create( p_object->p_libvlc, "saved-volume", VLC_VAR_INTEGER );
-    var_SetInteger( p_object->p_libvlc, "saved-volume" , i_volume );
+    var_SetInteger( p_object, "saved-volume" , i_volume );
 
     /* On Mute */
     if ( b_mute_condition )
     {
         i_volume = AOUT_VOLUME_MIN;
-        var_SetBool( p_object->p_libvlc, "volume-muted", true );
+        var_SetBool( p_object, "volume-muted", true );
     }
 
     /* Commit volume changes */
@@ -170,15 +186,16 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps,
     }
 
     /* trigger callbacks */
-    var_TriggerCallback( p_object->p_libvlc, "volume-change");
-    if ( p_aout ) var_SetBool( p_aout, "intf-change", true );
-
+    var_TriggerCallback( p_object, "volume-change" );
     if ( p_aout )
     {
+        var_SetBool( p_aout, "intf-change", true );
         aout_unlock_volume( p_aout );
         vlc_object_release( p_aout );
     }
 
+    if ( i_return_volume != NULL )
+         *i_return_volume = i_volume;
     return i_result;
 }
 
@@ -271,7 +288,7 @@ bool aout_IsMuted( vlc_object_t * p_object )
     bool b_return_val;
     aout_instance_t * p_aout = findAout( p_object );
     if ( p_aout ) aout_lock_volume( p_aout );
-    b_return_val = var_GetBool( p_object->p_libvlc, "volume-muted");
+    b_return_val = var_GetBool( p_object, "volume-muted");
     if ( p_aout )
     {
         aout_unlock_volume( p_aout );
@@ -450,7 +467,7 @@ static int aout_Restart( aout_instance_t * p_aout )
 int aout_FindAndRestart( vlc_object_t * p_this, const char *psz_name,
                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
-    aout_instance_t * p_aout = findAout( p_this );
+    aout_instance_t * p_aout = findAout( pl_Get(p_this) );
 
     (void)psz_name; (void)oldval; (void)newval; (void)p_data;
     if ( p_aout == NULL ) return VLC_SUCCESS;
@@ -495,7 +512,7 @@ void aout_EnableFilter( vlc_object_t *p_this, const char *psz_name,
 {
     aout_instance_t *p_aout = findAout( p_this );
 
-    if( AoutChangeFilterString( p_this, p_aout, "audio-filter", psz_name, b_add ) )
+    if( aout_ChangeFilterString( p_this, p_aout, "audio-filter", psz_name, b_add ) )
     {
         if( p_aout )
             AoutInputsMarkToRestart( p_aout );