X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Fintf.c;h=82b038230ea623fec7e47d5dbffbbb4eacdb8bb1;hb=9f5b54964c36cda46acc6b3a0f5596355f252cda;hp=590c2e8240469ddd6bb67f5fd9e023447878da60;hpb=0e3ef9caf4a54a7fec16d07269ad8da5c2186681;p=vlc diff --git a/src/audio_output/intf.c b/src/audio_output/intf.c index 590c2e8240..82b038230e 100644 --- a/src/audio_output/intf.c +++ b/src/audio_output/intf.c @@ -41,7 +41,7 @@ #include -static aout_instance_t *findAout (vlc_object_t *obj) +static audio_output_t *findAout (vlc_object_t *obj) { input_thread_t *(*pf_find_input) (vlc_object_t *); @@ -53,58 +53,66 @@ static aout_instance_t *findAout (vlc_object_t *obj) if (p_input == NULL) return NULL; - aout_instance_t *p_aout = input_GetAout (p_input); + audio_output_t *p_aout = input_GetAout (p_input); vlc_object_release (p_input); return p_aout; } #define findAout(o) findAout(VLC_OBJECT(o)) /** Start a volume change transaction. */ -static void prepareVolume (vlc_object_t *obj, aout_instance_t **aoutp, +static void prepareVolume (vlc_object_t *obj, audio_output_t **aoutp, audio_volume_t *volp, bool *mutep) { - aout_instance_t *aout = findAout (obj); + audio_output_t *aout = findAout (obj); /* FIXME: we need interlocking even if aout does not exist! */ *aoutp = aout; if (aout != NULL) + { + obj = VLC_OBJECT(aout); /* use aout volume if aout exists */ aout_lock_volume (aout); + } if (volp != NULL) - *volp = var_GetInteger (obj, "volume"); + *volp = var_InheritInteger (obj, "volume"); if (mutep != NULL) - *mutep = var_GetBool (obj, "mute"); + *mutep = var_InheritBool (obj, "mute"); } /** Commit a volume change transaction. */ -static int commitVolume (vlc_object_t *obj, aout_instance_t *aout, +static int commitVolume (vlc_object_t *obj, audio_output_t *aout, audio_volume_t volume, bool mute) { int ret = 0; + /* update caller (input manager) volume */ var_SetInteger (obj, "volume", volume); var_SetBool (obj, "mute", mute); if (aout != NULL) { + aout_owner_t *owner = aout_owner (aout); float vol = volume / (float)AOUT_VOLUME_DEFAULT; + /* apply volume to the pipeline */ aout_lock (aout); -#warning FIXME: wrong test. Need to check that aout_output is ready. - if (aout->p_mixer != NULL) - ret = aout->output.pf_volume_set (aout, vol, mute); + if (owner->module != NULL) + ret = aout->pf_volume_set (aout, vol, mute); aout_unlock (aout); + /* update aout volume if it maintains its own */ + var_SetInteger (aout, "volume", volume); + var_SetBool (aout, "mute", mute); + aout_unlock_volume (aout); + if (ret == 0) var_TriggerCallback (aout, "intf-change"); - aout_unlock_volume (aout); vlc_object_release (aout); } return ret; } -#if 0 /** Cancel a volume change transaction. */ -static void cancelVolume (vlc_object_t *obj, aout_instance_t *aout) +static void cancelVolume (vlc_object_t *obj, audio_output_t *aout) { (void) obj; if (aout != NULL) @@ -113,7 +121,6 @@ static void cancelVolume (vlc_object_t *obj, aout_instance_t *aout) vlc_object_release (aout); } } -#endif #undef aout_VolumeGet /** @@ -121,16 +128,12 @@ static void cancelVolume (vlc_object_t *obj, aout_instance_t *aout) */ audio_volume_t aout_VolumeGet (vlc_object_t *obj) { -#if 0 - aout_instance_t *aout; + audio_output_t *aout; audio_volume_t volume; prepareVolume (obj, &aout, &volume, NULL); cancelVolume (obj, aout); - return 0; -#else - return var_GetInteger (obj, "volume"); -#endif + return volume; } #undef aout_VolumeSet @@ -140,7 +143,7 @@ audio_volume_t aout_VolumeGet (vlc_object_t *obj) */ int aout_VolumeSet (vlc_object_t *obj, audio_volume_t volume) { - aout_instance_t *aout; + audio_output_t *aout; bool mute; prepareVolume (obj, &aout, NULL, &mute); @@ -155,7 +158,7 @@ int aout_VolumeSet (vlc_object_t *obj, audio_volume_t volume) */ int aout_VolumeUp (vlc_object_t *obj, int value, audio_volume_t *volp) { - aout_instance_t *aout; + audio_output_t *aout; int ret; audio_volume_t volume; bool mute; @@ -164,8 +167,8 @@ int aout_VolumeUp (vlc_object_t *obj, int value, audio_volume_t *volp) prepareVolume (obj, &aout, &volume, &mute); value += volume; - if (value < AOUT_VOLUME_MIN) - volume = AOUT_VOLUME_MIN; + if (value < 0) + volume = 0; else if (value > AOUT_VOLUME_MAX) volume = AOUT_VOLUME_MAX; @@ -177,22 +180,13 @@ int aout_VolumeUp (vlc_object_t *obj, int value, audio_volume_t *volp) return ret; } -#undef aout_VolumeDown -/** - * Lowers the volume. See aout_VolumeUp(). - */ -int aout_VolumeDown (vlc_object_t *obj, int steps, audio_volume_t *volp) -{ - return aout_VolumeUp (obj, -steps, volp); -} - #undef aout_ToggleMute /** * Toggles the mute state. */ int aout_ToggleMute (vlc_object_t *obj, audio_volume_t *volp) { - aout_instance_t *aout; + audio_output_t *aout; int ret; audio_volume_t volume; bool mute; @@ -201,7 +195,7 @@ int aout_ToggleMute (vlc_object_t *obj, audio_volume_t *volp) mute = !mute; ret = commitVolume (obj, aout, volume, mute); if (volp != NULL) - *volp = mute ? AOUT_VOLUME_MIN : volume; + *volp = mute ? 0 : volume; return ret; } @@ -210,16 +204,12 @@ int aout_ToggleMute (vlc_object_t *obj, audio_volume_t *volp) */ bool aout_IsMuted (vlc_object_t *obj) { -#if 0 - aout_instance_t *aout; + audio_output_t *aout; bool mute; prepareVolume (obj, &aout, NULL, &mute); cancelVolume (obj, aout); return mute; -#else - return var_GetBool (obj, "mute"); -#endif } /** @@ -227,111 +217,22 @@ bool aout_IsMuted (vlc_object_t *obj) */ int aout_SetMute (vlc_object_t *obj, audio_volume_t *volp, bool mute) { - aout_instance_t *aout; + audio_output_t *aout; int ret; audio_volume_t volume; prepareVolume (obj, &aout, &volume, NULL); ret = commitVolume (obj, aout, volume, mute); if (volp != NULL) - *volp = mute ? AOUT_VOLUME_MIN : volume; + *volp = mute ? 0 : volume; 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, float volume, bool mute) -{ - aout->mixer_multiplier = mute ? 0. : volume; - return 0; -} - -/* Meant to be called by the output plug-in's Open(). */ -void aout_VolumeSoftInit (aout_instance_t *aout) -{ - audio_volume_t volume = var_InheritInteger (aout, "volume"); - bool mute = var_InheritBool (aout, "mute"); - - aout->output.pf_volume_set = aout_VolumeSoftSet; - aout_VolumeSoftSet (aout, volume, mute); -} - - -/* - * 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, float 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 ) -{ - p_aout->output.pf_volume_set = aout_VolumeNoneSet; -} - - /* * Pipelines management */ -/***************************************************************************** - * aout_Restart : re-open the output device and rebuild the input and output - * pipelines - ***************************************************************************** - * This function is used whenever the parameters of the output plug-in are - * changed (eg. selecting S/PDIF or PCM). - *****************************************************************************/ -static int aout_Restart( aout_instance_t * p_aout ) -{ - aout_input_t *p_input; - - aout_lock( p_aout ); - p_input = p_aout->p_input; - if( p_input == NULL ) - { - aout_unlock( p_aout ); - msg_Err( p_aout, "no decoder thread" ); - return -1; - } - - /* Reinitializes the output */ - aout_InputDelete( p_aout, p_input ); - aout_MixerDelete( p_aout ); - aout_OutputDelete( p_aout ); - - /* FIXME: This function is notoriously dangerous/unsafe. - * By the way, if OutputNew or MixerNew fails, we are totally screwed. */ - if ( aout_OutputNew( p_aout, &p_input->input ) == -1 ) - { - /* Release all locks and report the error. */ - aout_unlock( p_aout ); - return -1; - } - - if ( aout_MixerNew( p_aout ) == -1 ) - { - aout_OutputDelete( p_aout ); - aout_unlock( p_aout ); - return -1; - } - - if( aout_InputNew( p_aout, p_input, &p_input->request_vout ) ) - { -#warning FIXME: deal with errors - aout_unlock( p_aout ); - return -1; - } - aout_unlock( p_aout ); - return 0; -} - /***************************************************************************** * aout_ChannelsRestart : change the audio device or channels and restart *****************************************************************************/ @@ -339,7 +240,7 @@ int aout_ChannelsRestart( vlc_object_t * p_this, const char * psz_variable, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { - aout_instance_t * p_aout = (aout_instance_t *)p_this; + audio_output_t * p_aout = (audio_output_t *)p_this; (void)oldval; (void)newval; (void)p_data; if ( !strcmp( psz_variable, "audio-device" ) ) @@ -348,7 +249,7 @@ int aout_ChannelsRestart( vlc_object_t * p_this, const char * psz_variable, * rebuilding the channel choices. */ var_Destroy( p_aout, "audio-channels" ); } - aout_Restart( p_aout ); + aout_RequestRestart (p_aout); return 0; } @@ -361,12 +262,12 @@ 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 = findAout( p_this ); + audio_output_t *p_aout = findAout( p_this ); - if( aout_ChangeFilterString( p_this, p_aout, "audio-filter", psz_name, b_add ) ) + if( aout_ChangeFilterString( p_this, VLC_OBJECT(p_aout), "audio-filter", psz_name, b_add ) ) { if( p_aout ) - AoutInputsMarkToRestart( p_aout ); + aout_InputRequestRestart( p_aout ); } if( p_aout )