X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Faudio_output%2Fintf.c;h=e8fff115b27c63579ad0651c3200a08c4bfd34e1;hb=36ab287e77e9df059f261ed1cfb13fc4674182ec;hp=375093a39a247d9b972eb070120ecadb990a02f9;hpb=c7885fe12a838dd0d0269a23d3a9dbccc47f0f9d;p=vlc diff --git a/src/audio_output/intf.c b/src/audio_output/intf.c index 375093a39a..e8fff115b2 100644 --- a/src/audio_output/intf.c +++ b/src/audio_output/intf.c @@ -1,24 +1,24 @@ /***************************************************************************** * intf.c : audio output API towards the interface modules ***************************************************************************** - * Copyright (C) 2002-2007 the VideoLAN team + * Copyright (C) 2002-2007 VLC authors and VideoLAN * $Id$ * * Authors: Christophe Massiot * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -68,11 +68,14 @@ static void prepareVolume (vlc_object_t *obj, audio_output_t **aoutp, /* 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. */ @@ -81,28 +84,33 @@ static int commitVolume (vlc_object_t *obj, audio_output_t *aout, { 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) + 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, audio_output_t *aout) { @@ -113,7 +121,6 @@ static void cancelVolume (vlc_object_t *obj, audio_output_t *aout) vlc_object_release (aout); } } -#endif #undef aout_VolumeGet /** @@ -121,16 +128,12 @@ static void cancelVolume (vlc_object_t *obj, audio_output_t *aout) */ audio_volume_t aout_VolumeGet (vlc_object_t *obj) { -#if 0 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 @@ -201,16 +204,12 @@ int aout_ToggleMute (vlc_object_t *obj, audio_volume_t *volp) */ bool aout_IsMuted (vlc_object_t *obj) { -#if 0 audio_output_t *aout; bool mute; prepareVolume (obj, &aout, NULL, &mute); cancelVolume (obj, aout); return mute; -#else - return var_GetBool (obj, "mute"); -#endif } /** @@ -234,57 +233,6 @@ int aout_SetMute (vlc_object_t *obj, audio_volume_t *volp, bool mute) * 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( audio_output_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 *****************************************************************************/ @@ -301,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; } @@ -316,10 +264,10 @@ void aout_EnableFilter( vlc_object_t *p_this, const char *psz_name, { 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 )