X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Fintf.c;h=017ece22599c726817ffb802045b7c32f5bc9286;hb=470ce70b69e1530173950a8dfd6d274a70caa7bc;hp=44cc169e21f3aca8fb06c037d9815075bf37e855;hpb=1d6f8407da07f0d0dc1c437ba31ff225711ae388;p=vlc diff --git a/src/audio_output/intf.c b/src/audio_output/intf.c index 44cc169e21..017ece2259 100644 --- a/src/audio_output/intf.c +++ b/src/audio_output/intf.c @@ -42,7 +42,13 @@ 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,7 +186,7 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps, } /* trigger callbacks */ - var_TriggerCallback( p_object->p_libvlc, "volume-change"); + var_TriggerCallback( p_object, "volume-change" ); if ( p_aout ) { var_SetBool( p_aout, "intf-change", true ); @@ -178,6 +194,8 @@ int doVolumeChanges( unsigned action, vlc_object_t * p_object, int i_nb_steps, vlc_object_release( p_aout ); } + if ( i_return_volume != NULL ) + *i_return_volume = i_volume; return i_result; } @@ -270,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 ); @@ -449,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; @@ -494,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 );