]> git.sesse.net Git - vlc/blobdiff - src/audio_output/intf.c
Revert "playlist: refactor and fix #3932"
[vlc] / src / audio_output / intf.c
index 9a9548bf8c32f74f2d3c25b1b6fa033095dce845..017ece22599c726817ffb802045b7c32f5bc9286 100644 (file)
 #include <vlc_aout.h>
 #include "aout_internal.h"
 
+#include <vlc_playlist.h>
+
+static aout_instance_t *findAout (vlc_object_t *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;
+
+    aout_instance_t *p_aout = input_GetAout (p_input);
+    vlc_object_release (p_input);
+    return p_aout;
+}
+#define findAout(o) findAout(VLC_OBJECT(o))
+
 /*
  * Volume management
  *
@@ -67,30 +87,33 @@ 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 )
 {
     int i_result = VLC_SUCCESS;
-    int i_volume_step = 1;
+    int i_volume_step = 1, i_new_volume = 0;
     bool b_var_mute = false;
-    aout_instance_t *p_aout = vlc_object_find( p_object, VLC_OBJECT_AOUT,
-                                               FIND_ANYWHERE );
+    aout_instance_t *p_aout = findAout( p_object );
 
     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 */
@@ -99,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 )
     {
@@ -116,27 +148,28 @@ 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" );
 
-        i_volume = config_GetInt( p_object, "volume" )
-                   + i_volume_step * i_nb_steps;
+        if ( !b_unmute_condition )
+            i_volume = config_GetInt( p_object, "volume" );
 
-        if ( i_volume > AOUT_VOLUME_MAX )
+        i_new_volume = (int) i_volume + i_volume_step * i_nb_steps;
+
+        if ( i_new_volume > AOUT_VOLUME_MAX )
             i_volume = AOUT_VOLUME_MAX;
-        else if ( i_volume < AOUT_VOLUME_MIN )
+        else if ( i_new_volume < AOUT_VOLUME_MIN )
             i_volume = AOUT_VOLUME_MIN;
-        if ( i_return_volume != NULL )
-            *i_return_volume = i_volume;
+        else
+            i_volume = i_new_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 */
@@ -153,26 +186,27 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps,
     }
 
     /* trigger callbacks */
-    var_SetBool( p_object->p_libvlc, "volume-change", true );
-    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;
 }
 
+#undef aout_VolumeGet
 /*****************************************************************************
  * aout_VolumeGet : get the volume of the output device
  *****************************************************************************/
-int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
+int aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
 {
     int i_result = 0;
-    aout_instance_t * p_aout = vlc_object_find( p_object, VLC_OBJECT_AOUT,
-                                                FIND_ANYWHERE );
+    aout_instance_t * p_aout = findAout( p_object );
 
     if ( pi_volume == NULL ) return -1;
 
@@ -199,45 +233,49 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
     return i_result;
 }
 
+#undef aout_VolumeSet
 /*****************************************************************************
  * aout_VolumeSet : set the volume of the output device
  *****************************************************************************/
-int __aout_VolumeSet( vlc_object_t * p_object, audio_volume_t i_volume )
+int aout_VolumeSet( vlc_object_t * p_object, audio_volume_t i_volume )
 {
     return doVolumeChanges( SET_VOLUME, p_object, 1, i_volume, NULL, true );
 }
 
+#undef aout_VolumeUp
 /*****************************************************************************
  * aout_VolumeUp : raise the output volume
  *****************************************************************************
  * If pi_volume != NULL, *pi_volume will contain the volume at the end of the
  * function.
  *****************************************************************************/
-int __aout_VolumeUp( vlc_object_t * p_object, int i_nb_steps,
+int aout_VolumeUp( vlc_object_t * p_object, int i_nb_steps,
                    audio_volume_t * pi_volume )
 {
     return doVolumeChanges( INCREMENT_VOLUME, p_object, i_nb_steps, 0, pi_volume, true );
 }
 
+#undef aout_VolumeDown
 /*****************************************************************************
  * aout_VolumeDown : lower the output volume
  *****************************************************************************
  * If pi_volume != NULL, *pi_volume will contain the volume at the end of the
  * function.
  *****************************************************************************/
-int __aout_VolumeDown( vlc_object_t * p_object, int i_nb_steps,
+int aout_VolumeDown( vlc_object_t * p_object, int i_nb_steps,
                      audio_volume_t * pi_volume )
 {
-    return __aout_VolumeUp( p_object, -i_nb_steps, pi_volume );
+    return aout_VolumeUp( p_object, -i_nb_steps, pi_volume );
 }
 
+#undef aout_ToggleMute
 /*****************************************************************************
  * aout_ToggleMute : Mute/un-mute the output volume
  *****************************************************************************
  * If pi_volume != NULL, *pi_volume will contain the volume at the end of the
  * function (muted => 0).
  *****************************************************************************/
-int __aout_ToggleMute( vlc_object_t * p_object, audio_volume_t * pi_volume )
+int aout_ToggleMute( vlc_object_t * p_object, audio_volume_t * pi_volume )
 {
     return doVolumeChanges( TOGGLE_MUTE, p_object, 1, 0, pi_volume, true );
 }
@@ -248,11 +286,14 @@ int __aout_ToggleMute( vlc_object_t * p_object, audio_volume_t * pi_volume )
 bool aout_IsMuted( vlc_object_t * p_object )
 {
     bool b_return_val;
-    aout_instance_t * p_aout = vlc_object_find( p_object, VLC_OBJECT_AOUT,
-                                                FIND_ANYWHERE );
+    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");
-    if ( p_aout ) aout_unlock_volume( p_aout );
+    b_return_val = var_GetBool( p_object, "volume-muted");
+    if ( p_aout )
+    {
+        aout_unlock_volume( p_aout );
+        vlc_object_release( p_aout );
+    }
     return b_return_val;
 }
 
@@ -426,8 +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 = vlc_object_find( p_this, VLC_OBJECT_AOUT,
-                                                FIND_ANYWHERE );
+    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;
@@ -470,10 +510,9 @@ int aout_ChannelsRestart( vlc_object_t * p_this, const char * psz_variable,
 void aout_EnableFilter( vlc_object_t *p_this, const char *psz_name,
                         bool b_add )
 {
-    aout_instance_t *p_aout = vlc_object_find( p_this, VLC_OBJECT_AOUT,
-                                               FIND_ANYWHERE );
+    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 );