X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Fintf.c;h=a780db6b251674f3bad957e405cf6c4b9ce5aad6;hb=b0271aa7ebeace5b35f680e9aecba73b267c6af3;hp=9591de2c263a7e449ac79793a384c4320d14ac3f;hpb=50ca2acdde0d5dc0af99e8b13256563a1ba86416;p=vlc diff --git a/src/audio_output/intf.c b/src/audio_output/intf.c index 9591de2c26..a780db6b25 100644 --- a/src/audio_output/intf.c +++ b/src/audio_output/intf.c @@ -25,7 +25,11 @@ * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #include #include /* calloc(), malloc(), free() */ @@ -74,7 +78,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume ) return 0; } - vlc_mutex_lock( &p_aout->mixer_lock ); + aout_lock_mixer( p_aout ); if ( !p_aout->mixer.b_error ) { i_result = p_aout->output.pf_volume_get( p_aout, pi_volume ); @@ -83,7 +87,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume ) { *pi_volume = (audio_volume_t)config_GetInt( p_object, "volume" ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_mixer( p_aout ); vlc_object_release( p_aout ); return i_result; @@ -94,25 +98,22 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume ) *****************************************************************************/ int __aout_VolumeSet( vlc_object_t * p_object, audio_volume_t i_volume ) { - vlc_value_t val; aout_instance_t *p_aout = vlc_object_find( p_object, VLC_OBJECT_AOUT, FIND_ANYWHERE ); int i_result = 0; config_PutInt( p_object, "volume", i_volume ); - - val.b_bool = VLC_TRUE; - var_Set( p_object->p_libvlc, "volume-change", val ); + var_SetBool( p_object->p_libvlc, "volume-change", true ); if ( p_aout == NULL ) return 0; - vlc_mutex_lock( &p_aout->mixer_lock ); + aout_lock_mixer( p_aout ); if ( !p_aout->mixer.b_error ) { i_result = p_aout->output.pf_volume_set( p_aout, i_volume ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_mixer( p_aout ); - var_Set( p_aout, "intf-change", val ); + var_SetBool( p_aout, "intf-change", true ); vlc_object_release( p_aout ); return i_result; } @@ -128,7 +129,7 @@ int __aout_VolumeInfos( vlc_object_t * p_object, audio_volume_t * pi_soft ) if ( p_aout == NULL ) return 0; - vlc_mutex_lock( &p_aout->mixer_lock ); + aout_lock_mixer( p_aout ); if ( p_aout->mixer.b_error ) { /* The output module is destroyed. */ @@ -138,7 +139,7 @@ int __aout_VolumeInfos( vlc_object_t * p_object, audio_volume_t * pi_soft ) { i_result = p_aout->output.pf_volume_infos( p_aout, pi_soft ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_mixer( p_aout ); vlc_object_release( p_aout ); return i_result; @@ -170,15 +171,17 @@ int __aout_VolumeUp( vlc_object_t * p_object, int i_nb_steps, (audio_volume_t) i_volume ); if ( pi_volume != NULL ) *pi_volume = (audio_volume_t) i_volume; + var_SetBool( p_object->p_libvlc, "volume-change", true ); + if ( p_aout == NULL ) return 0; - vlc_mutex_lock( &p_aout->mixer_lock ); + aout_lock_mixer( p_aout ); if ( !p_aout->mixer.b_error ) { i_result = p_aout->output.pf_volume_set( p_aout, (audio_volume_t) i_volume ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_mixer( p_aout ); vlc_object_release( p_aout ); return i_result; @@ -209,14 +212,16 @@ int __aout_VolumeDown( vlc_object_t * p_object, int i_nb_steps, var_SetInteger( p_object->p_libvlc, "saved-volume", (audio_volume_t) i_volume ); if ( pi_volume != NULL ) *pi_volume = (audio_volume_t) i_volume; + var_SetBool( p_object->p_libvlc, "volume-change", true ); + if ( p_aout == NULL ) return 0; - vlc_mutex_lock( &p_aout->mixer_lock ); + aout_lock_mixer( p_aout ); if ( !p_aout->mixer.b_error ) { i_result = p_aout->output.pf_volume_set( p_aout, (audio_volume_t) i_volume ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_mixer( p_aout ); vlc_object_release( p_aout ); return i_result; @@ -352,24 +357,26 @@ int aout_VolumeNoneSet( aout_instance_t * p_aout, audio_volume_t i_volume ) * This function is used whenever the parameters of the output plug-in are * changed (eg. selecting S/PDIF or PCM). *****************************************************************************/ -int aout_Restart( aout_instance_t * p_aout ) +static int aout_Restart( aout_instance_t * p_aout ) { int i; - vlc_bool_t b_error = 0; + bool b_error = 0; - vlc_mutex_lock( &p_aout->mixer_lock ); + aout_lock_mixer( p_aout ); if ( p_aout->i_nb_inputs == 0 ) { - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_mixer( p_aout ); msg_Err( p_aout, "no decoder thread" ); return -1; } /* Lock all inputs. */ + aout_lock_input_fifos( p_aout ); + for ( i = 0; i < p_aout->i_nb_inputs; i++ ) { - vlc_mutex_lock( &p_aout->pp_inputs[i]->lock ); + aout_lock_input( p_aout, p_aout->pp_inputs[i] ); aout_InputDelete( p_aout, p_aout->pp_inputs[i] ); } @@ -385,7 +392,8 @@ int aout_Restart( aout_instance_t * p_aout ) { vlc_mutex_unlock( &p_aout->pp_inputs[i]->lock ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_input_fifos( p_aout ); + aout_unlock_mixer( p_aout ); return -1; } @@ -396,7 +404,8 @@ int aout_Restart( aout_instance_t * p_aout ) { vlc_mutex_unlock( &p_aout->pp_inputs[i]->lock ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_input_fifos( p_aout ); + aout_unlock_mixer( p_aout ); return -1; } @@ -404,13 +413,13 @@ int aout_Restart( aout_instance_t * p_aout ) for ( i = 0; i < p_aout->i_nb_inputs; i++ ) { aout_input_t * p_input = p_aout->pp_inputs[i]; - - b_error |= aout_InputNew( p_aout, p_input ); + b_error |= aout_InputNew( p_aout, p_input, &p_input->request_vout ); p_input->b_changed = 1; - vlc_mutex_unlock( &p_input->lock ); + aout_unlock_input( p_aout, p_input ); } - vlc_mutex_unlock( &p_aout->mixer_lock ); + aout_unlock_input_fifos( p_aout ); + aout_unlock_mixer( p_aout ); return b_error; } @@ -475,66 +484,19 @@ int aout_ChannelsRestart( vlc_object_t * p_this, const char * psz_variable, * \param b_add are we adding or removing the filter ? */ void aout_EnableFilter( vlc_object_t *p_this, const char *psz_name, - vlc_bool_t b_add ) + bool b_add ) { - char *psz_parser, *psz_string; - aout_instance_t * p_aout = vlc_object_find( p_this, VLC_OBJECT_AOUT, - FIND_ANYWHERE ); - - if( p_aout ) - psz_string = var_GetString( p_aout, "audio-filter" ); - else - psz_string = config_GetPsz( p_this, "audio-filter" ); - - if( !psz_string ) psz_string = strdup(""); - - psz_parser = strstr( psz_string, psz_name ); + aout_instance_t *p_aout = vlc_object_find( p_this, VLC_OBJECT_AOUT, + FIND_ANYWHERE ); - if( b_add ) + if( AoutChangeFilterString( p_this, p_aout, "audio-filter", psz_name, b_add ) ) { - if( !psz_parser ) - { - psz_parser = psz_string; - asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s", - psz_string, psz_name ); - free( psz_parser ); - } - else - { - vlc_object_release( p_aout ); - return; - } - } - else - { - if( psz_parser ) - { - memmove( psz_parser, psz_parser + strlen(psz_name) + - (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ), - strlen(psz_parser + strlen(psz_name)) + 1 ); - - if( *(psz_string+strlen(psz_string ) -1 ) == ':' ) - { - *(psz_string+strlen(psz_string ) -1 ) = '\0'; - } - } - else - { - free( psz_string ); - return; - } + if( p_aout ) + AoutInputsMarkToRestart( p_aout ); } - if( p_aout == NULL ) - config_PutPsz( p_this, "audio-filter", psz_string ); - else - { - var_SetString( p_aout, "audio-filter", psz_string ); - for( int i = 0; i < p_aout->i_nb_inputs; i++ ) - p_aout->pp_inputs[i]->b_restart = VLC_TRUE; + if( p_aout ) vlc_object_release( p_aout ); - } - free( psz_string ); } /** @@ -544,5 +506,7 @@ void aout_EnableFilter( vlc_object_t *p_this, const char *psz_name, char *aout_VisualChange( vlc_object_t *p_this, int i_skip ) { (void)p_this; (void)i_skip; + msg_Err( p_this, "FIXME: %s (%s %d) isn't implemented.", __func__, + __FILE__, __LINE__ ); return strdup("foobar"); }