diff options
Diffstat (limited to 'indra/newview/llvieweraudio.cpp')
-rw-r--r-- | indra/newview/llvieweraudio.cpp | 897 |
1 files changed, 453 insertions, 444 deletions
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 6a0edbecb1..e9163abb4f 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llvieweraudio.cpp * @brief Audio functions that used to be in viewer.cpp * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library 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; * version 2.1 of the License only. - * + * * This library 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 * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -48,452 +48,461 @@ #include "llstreamingaudio.h" ///////////////////////////////////////////////////////// +const U32 FMODEX_DECODE_BUFFER_SIZE = 1000; // in milliseconds +const U32 FMODEX_STREAM_BUFFER_SIZE = 7000; // in milliseconds LLViewerAudio::LLViewerAudio() : - mDone(true), - mFadeState(FADE_IDLE), - mFadeTime(), + mDone(true), + mFadeState(FADE_IDLE), + mFadeTime(), mIdleListnerActive(false), - mForcedTeleportFade(false), - mWasPlaying(false) + mForcedTeleportFade(false), + mWasPlaying(false) { - mTeleportFailedConnection = LLViewerParcelMgr::getInstance()-> - setTeleportFailedCallback(boost::bind(&LLViewerAudio::onTeleportFailed, this)); - mTeleportFinishedConnection = LLViewerParcelMgr::getInstance()-> - setTeleportFinishedCallback(boost::bind(&LLViewerAudio::onTeleportFinished, this, _1, _2)); - mTeleportStartedConnection = LLViewerMessage::getInstance()-> - setTeleportStartedCallback(boost::bind(&LLViewerAudio::onTeleportStarted, this)); + mTeleportFailedConnection = LLViewerParcelMgr::getInstance()-> + setTeleportFailedCallback(boost::bind(&LLViewerAudio::onTeleportFailed, this)); + mTeleportFinishedConnection = LLViewerParcelMgr::getInstance()-> + setTeleportFinishedCallback(boost::bind(&LLViewerAudio::onTeleportFinished, this, _1, _2)); + mTeleportStartedConnection = LLViewerMessage::getInstance()-> + setTeleportStartedCallback(boost::bind(&LLViewerAudio::onTeleportStarted, this)); } LLViewerAudio::~LLViewerAudio() { - mTeleportFailedConnection.disconnect(); - mTeleportFinishedConnection.disconnect(); - mTeleportStartedConnection.disconnect(); + mTeleportFailedConnection.disconnect(); + mTeleportFinishedConnection.disconnect(); + mTeleportStartedConnection.disconnect(); } void LLViewerAudio::registerIdleListener() { - if(mIdleListnerActive==false) - { - mIdleListnerActive = true; - doOnIdleRepeating(boost::bind(boost::bind(&LLViewerAudio::onIdleUpdate, this))); - } + if(mIdleListnerActive==false) + { + mIdleListnerActive = true; + doOnIdleRepeating(boost::bind(boost::bind(&LLViewerAudio::onIdleUpdate, this))); + } } void LLViewerAudio::startInternetStreamWithAutoFade(const std::string &streamURI) { LL_DEBUGS("AudioEngine") << "Start with outo fade: " << streamURI << LL_ENDL; - // Old and new stream are identical - if (mNextStreamURI == streamURI) - { - return; - } - - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return; - } - - // Record the URI we are going to be switching to - mNextStreamURI = streamURI; - - switch (mFadeState) - { - case FADE_IDLE: - // If a stream is playing fade it out first - if (!gAudiop->getInternetStreamURL().empty()) - { - // The order of these tests is important, state FADE_OUT will be processed below - mFadeState = FADE_OUT; - } - // Otherwise the new stream can be faded in - else - { - mFadeState = FADE_IN; - - LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); - if (stream && stream->supportsAdjustableBufferSizes()) - stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"), gSavedSettings.getU32("FMODExDecodeBufferSize")); - - gAudiop->startInternetStream(mNextStreamURI); - } - - startFading(); - break; - - case FADE_OUT: - startFading(); - break; - - case FADE_IN: - break; - - default: - LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL; - return; - } - - registerIdleListener(); + // Old and new stream are identical + if (mNextStreamURI == streamURI) + { + return; + } + + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return; + } + + // Record the URI we are going to be switching to + mNextStreamURI = streamURI; + + switch (mFadeState) + { + case FADE_IDLE: + // If a stream is playing fade it out first + if (!gAudiop->getInternetStreamURL().empty()) + { + // The order of these tests is important, state FADE_OUT will be processed below + mFadeState = FADE_OUT; + } + // Otherwise the new stream can be faded in + else + { + mFadeState = FADE_IN; + + LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); + if (stream && stream->supportsAdjustableBufferSizes()) + stream->setBufferSizes(FMODEX_STREAM_BUFFER_SIZE, FMODEX_DECODE_BUFFER_SIZE); + + gAudiop->startInternetStream(mNextStreamURI); + } + + startFading(); + break; + + case FADE_OUT: + startFading(); + break; + + case FADE_IN: + break; + + default: + LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL; + return; + } + + registerIdleListener(); } // A return of false from onIdleUpdate means it will be called again next idle update. // A return of true means we have finished with it and the callback will be deleted. bool LLViewerAudio::onIdleUpdate() { - bool fadeIsFinished = false; - - // There is a delay in the login sequence between when the parcel information has - // arrived and the music stream is started and when the audio system is called to set - // initial volume levels. This code extends the fade time so you hear a full fade in. - if ((LLStartUp::getStartupState() < STATE_STARTED)) - { - stream_fade_timer.reset(); - stream_fade_timer.setTimerExpirySec(mFadeTime); - } - - if (mDone) - { - // This should be a rare or never occurring state. - if (mFadeState == FADE_IDLE) - { - deregisterIdleListener(); - fadeIsFinished = true; // Stop calling onIdleUpdate - } - - // we have finished the current fade operation - if (mFadeState == FADE_OUT) - { - if (gAudiop) - { - // Clear URI + bool fadeIsFinished = false; + + // There is a delay in the login sequence between when the parcel information has + // arrived and the music stream is started and when the audio system is called to set + // initial volume levels. This code extends the fade time so you hear a full fade in. + if ((LLStartUp::getStartupState() < STATE_STARTED)) + { + stream_fade_timer.reset(); + stream_fade_timer.setTimerExpirySec(mFadeTime); + } + + if (mDone) + { + // This should be a rare or never occurring state. + if (mFadeState == FADE_IDLE) + { + deregisterIdleListener(); + fadeIsFinished = true; // Stop calling onIdleUpdate + } + + // we have finished the current fade operation + if (mFadeState == FADE_OUT) + { + if (gAudiop) + { + // Clear URI LL_DEBUGS("AudioEngine") << "Done with audio fade" << LL_ENDL; - gAudiop->startInternetStream(LLStringUtil::null); - gAudiop->stopInternetStream(); - } - - if (!mNextStreamURI.empty()) - { - mFadeState = FADE_IN; - - if (gAudiop) - { + gAudiop->startInternetStream(LLStringUtil::null); + gAudiop->stopInternetStream(); + } + + if (!mNextStreamURI.empty()) + { + mFadeState = FADE_IN; + + if (gAudiop) + { LL_DEBUGS("AudioEngine") << "Audio fade in: " << mNextStreamURI << LL_ENDL; - LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); - if(stream && stream->supportsAdjustableBufferSizes()) - stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize")); - - gAudiop->startInternetStream(mNextStreamURI); - } - - startFading(); - } - else - { - mFadeState = FADE_IDLE; - deregisterIdleListener(); - fadeIsFinished = true; // Stop calling onIdleUpdate - } - } - else if (mFadeState == FADE_IN) - { - if (gAudiop && mNextStreamURI != gAudiop->getInternetStreamURL()) - { - mFadeState = FADE_OUT; - startFading(); - } - else - { - mFadeState = FADE_IDLE; - deregisterIdleListener(); - fadeIsFinished = true; // Stop calling onIdleUpdate - } - } - } - - return fadeIsFinished; + LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); + if(stream && stream->supportsAdjustableBufferSizes()) + stream->setBufferSizes(FMODEX_STREAM_BUFFER_SIZE, FMODEX_DECODE_BUFFER_SIZE); + + gAudiop->startInternetStream(mNextStreamURI); + } + + startFading(); + } + else + { + mFadeState = FADE_IDLE; + deregisterIdleListener(); + fadeIsFinished = true; // Stop calling onIdleUpdate + } + } + else if (mFadeState == FADE_IN) + { + if (gAudiop && mNextStreamURI != gAudiop->getInternetStreamURL()) + { + mFadeState = FADE_OUT; + startFading(); + } + else + { + mFadeState = FADE_IDLE; + deregisterIdleListener(); + fadeIsFinished = true; // Stop calling onIdleUpdate + } + } + } + + return fadeIsFinished; } void LLViewerAudio::stopInternetStreamWithAutoFade() { - mFadeState = FADE_IDLE; - mNextStreamURI = LLStringUtil::null; - mDone = true; - - if (gAudiop) - { + mFadeState = FADE_IDLE; + mNextStreamURI = LLStringUtil::null; + mDone = true; + + if (gAudiop) + { LL_DEBUGS("AudioEngine") << "Stop audio fade" << LL_ENDL; - gAudiop->startInternetStream(LLStringUtil::null); - gAudiop->stopInternetStream(); - } + gAudiop->startInternetStream(LLStringUtil::null); + gAudiop->stopInternetStream(); + } } void LLViewerAudio::startFading() { - const F32 AUDIO_MUSIC_FADE_IN_TIME = 3.0f; - const F32 AUDIO_MUSIC_FADE_OUT_TIME = 2.0f; - // This minimum fade time prevents divide by zero and negative times - const F32 AUDIO_MUSIC_MINIMUM_FADE_TIME = 0.01f; - - if (mDone) - { - // The fade state here should only be one of FADE_IN or FADE_OUT, but, in case it is not, - // rather than check for both states assume a fade in and check for the fade out case. - mFadeTime = LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT ? - AUDIO_MUSIC_FADE_OUT_TIME : AUDIO_MUSIC_FADE_IN_TIME; - - // Prevent invalid fade time - mFadeTime = llmax(mFadeTime, AUDIO_MUSIC_MINIMUM_FADE_TIME); - - stream_fade_timer.reset(); - stream_fade_timer.setTimerExpirySec(mFadeTime); - mDone = false; - } + const F32 AUDIO_MUSIC_FADE_IN_TIME = 3.0f; + const F32 AUDIO_MUSIC_FADE_OUT_TIME = 2.0f; + // This minimum fade time prevents divide by zero and negative times + const F32 AUDIO_MUSIC_MINIMUM_FADE_TIME = 0.01f; + + if (mDone) + { + // The fade state here should only be one of FADE_IN or FADE_OUT, but, in case it is not, + // rather than check for both states assume a fade in and check for the fade out case. + mFadeTime = LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT ? + AUDIO_MUSIC_FADE_OUT_TIME : AUDIO_MUSIC_FADE_IN_TIME; + + // Prevent invalid fade time + mFadeTime = llmax(mFadeTime, AUDIO_MUSIC_MINIMUM_FADE_TIME); + + stream_fade_timer.reset(); + stream_fade_timer.setTimerExpirySec(mFadeTime); + mDone = false; + } } F32 LLViewerAudio::getFadeVolume() { - F32 fade_volume = 1.0f; - - if (stream_fade_timer.hasExpired()) - { - mDone = true; - // If we have been fading out set volume to 0 until the next fade state occurs to prevent - // an audio transient. - if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT) - { - fade_volume = 0.0f; - } - } - - if (!mDone) - { - // Calculate how far we are into the fade time - fade_volume = stream_fade_timer.getElapsedTimeF32() / mFadeTime; - - if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT) - { - // If we are not fading in then we are fading out, so invert the fade - // direction; start loud and move towards zero volume. - fade_volume = 1.0f - fade_volume; - } - } - - return fade_volume; + F32 fade_volume = 1.0f; + + if (stream_fade_timer.hasExpired()) + { + mDone = true; + // If we have been fading out set volume to 0 until the next fade state occurs to prevent + // an audio transient. + if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT) + { + fade_volume = 0.0f; + } + } + + if (!mDone) + { + // Calculate how far we are into the fade time + fade_volume = stream_fade_timer.getElapsedTimeF32() / mFadeTime; + + if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT) + { + // If we are not fading in then we are fading out, so invert the fade + // direction; start loud and move towards zero volume. + fade_volume = 1.0f - fade_volume; + } + } + + return fade_volume; } void LLViewerAudio::onTeleportStarted() { - if (gAudiop && !LLViewerAudio::getInstance()->getForcedTeleportFade()) - { - // Even though the music was turned off it was starting up (with autoplay disabled) occasionally - // after a failed teleport or after an intra-parcel teleport. Also, the music sometimes was not - // restarting after a successful intra-parcel teleport. Setting mWasPlaying fixes these issues. - LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty()); - LLViewerAudio::getInstance()->setForcedTeleportFade(true); - LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); - LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null); - } + if (gAudiop && !LLViewerAudio::getInstance()->getForcedTeleportFade()) + { + // Even though the music was turned off it was starting up (with autoplay disabled) occasionally + // after a failed teleport or after an intra-parcel teleport. Also, the music sometimes was not + // restarting after a successful intra-parcel teleport. Setting mWasPlaying fixes these issues. + LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty()); + LLViewerAudio::getInstance()->setForcedTeleportFade(true); + LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); + LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null); + } } void LLViewerAudio::onTeleportFailed() { - // Calling audio_update_volume makes sure that the music stream is properly set to be restored to - // its previous value - audio_update_volume(false); - - if (gAudiop && mWasPlaying) - { - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if (parcel) - { - mNextStreamURI = parcel->getMusicURL(); - LL_INFOS() << "Teleport failed -- setting music stream to " << mNextStreamURI << LL_ENDL; - } - } - mWasPlaying = false; + // Calling audio_update_volume makes sure that the music stream is properly set to be restored to + // its previous value + audio_update_volume(false); + + if (gAudiop && mWasPlaying) + { + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if (parcel) + { + mNextStreamURI = parcel->getMusicURL(); + LL_INFOS() << "Teleport failed -- setting music stream to " << mNextStreamURI << LL_ENDL; + } + } + mWasPlaying = false; } void LLViewerAudio::onTeleportFinished(const LLVector3d& pos, const bool& local) { - // Calling audio_update_volume makes sure that the music stream is properly set to be restored to - // its previous value - audio_update_volume(false); - - if (gAudiop && local && mWasPlaying) - { - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - if (parcel) - { - mNextStreamURI = parcel->getMusicURL(); - LL_INFOS() << "Intraparcel teleport -- setting music stream to " << mNextStreamURI << LL_ENDL; - } - } - mWasPlaying = false; + // Calling audio_update_volume makes sure that the music stream is properly set to be restored to + // its previous value + audio_update_volume(false); + + if (gAudiop && local && mWasPlaying) + { + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + if (parcel) + { + mNextStreamURI = parcel->getMusicURL(); + LL_INFOS() << "Intraparcel teleport -- setting music stream to " << mNextStreamURI << LL_ENDL; + } + } + mWasPlaying = false; } -void init_audio() +void init_audio() { - if (!gAudiop) - { - LL_WARNS() << "Failed to create an appropriate Audio Engine" << LL_ENDL; - return; - } - LLVector3d lpos_global = gAgentCamera.getCameraPositionGlobal(); - LLVector3 lpos_global_f; - - lpos_global_f.setVec(lpos_global); - - gAudiop->setListener(lpos_global_f, - LLVector3::zero, // LLViewerCamera::getInstance()->getVelocity(), // !!! BUG need to replace this with smoothed velocity! - LLViewerCamera::getInstance()->getUpAxis(), - LLViewerCamera::getInstance()->getAtAxis()); + if (!gAudiop) + { + LL_WARNS() << "Failed to create an appropriate Audio Engine" << LL_ENDL; + return; + } + LLVector3d lpos_global = gAgentCamera.getCameraPositionGlobal(); + LLVector3 lpos_global_f; + + lpos_global_f.setVec(lpos_global); + + gAudiop->setListener(lpos_global_f, + LLVector3::zero, // LLViewerCamera::getInstance()->getVelocity(), // !!! BUG need to replace this with smoothed velocity! + LLViewerCamera::getInstance()->getUpAxis(), + LLViewerCamera::getInstance()->getAtAxis()); // load up our initial set of sounds we'll want so they're in memory and ready to be played - BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); - - if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload")) - { - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject"))); - //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen"))); - gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndRestart"))); - } - - audio_update_volume(true); + BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); + + if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload")) + { + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject"))); + //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndRestart"))); + } + + audio_update_volume(true); } void audio_update_volume(bool force_update) { - F32 master_volume = gSavedSettings.getF32("AudioLevelMaster"); - BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); - - LLProgressView* progress = gViewerWindow->getProgressView(); - BOOL progress_view_visible = FALSE; - - if (progress) - { - progress_view_visible = progress->getVisible(); - } - - if (!gViewerWindow->getActive() && gSavedSettings.getBOOL("MuteWhenMinimized")) - { - mute_audio = TRUE; - } - F32 mute_volume = mute_audio ? 0.0f : 1.0f; - - if (gAudiop) - { - // Sound Effects - - gAudiop->setMasterGain ( master_volume ); - - gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); - - if(!LLViewerCamera::getInstance()->cameraUnderWater()) - gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); - else - gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelUnderwaterRolloff")); - - gAudiop->setMuted(mute_audio || progress_view_visible); - - //Play any deferred sounds when unmuted - if(!gAudiop->getMuted()) - { - LLDeferredSounds::instance().playdeferredSounds(); - } - - if (force_update) - { - audio_update_wind(true); - } - - // handle secondary gains - gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_SFX, - gSavedSettings.getBOOL("MuteSounds") ? 0.f : gSavedSettings.getF32("AudioLevelSFX")); - gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_UI, - gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI")); - gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_AMBIENT, - gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient")); - - // Streaming Music - - if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade()) - { - LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty()); - LLViewerAudio::getInstance()->setForcedTeleportFade(false); - } - - F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); - BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); - F32 fade_volume = LLViewerAudio::getInstance()->getFadeVolume(); - - music_volume = mute_volume * master_volume * music_volume * fade_volume; - gAudiop->setInternetStreamGain (music_muted ? 0.f : music_volume); - } - - // Streaming Media - F32 media_volume = gSavedSettings.getF32("AudioLevelMedia"); - BOOL media_muted = gSavedSettings.getBOOL("MuteMedia"); - media_volume = mute_volume * master_volume * media_volume; - LLViewerMedia::getInstance()->setVolume( media_muted ? 0.0f : media_volume ); - - // Voice, this is parametric singleton, it gets initialized when ready - if (LLVoiceClient::instanceExists()) - { - F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice"); - voice_volume = mute_volume * master_volume * voice_volume; - BOOL voice_mute = gSavedSettings.getBOOL("MuteVoice"); - LLVoiceClient *voice_inst = LLVoiceClient::getInstance(); - voice_inst->setVoiceVolume(voice_mute ? 0.f : voice_volume); - voice_inst->setMicGain(voice_mute ? 0.f : gSavedSettings.getF32("AudioLevelMic")); - - if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) - { - voice_inst->setMuteMic(true); - } - else - { - voice_inst->setMuteMic(false); - } - } + F32 master_volume = gSavedSettings.getF32("AudioLevelMaster"); + BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); + + LLProgressView* progress = gViewerWindow->getProgressView(); + BOOL progress_view_visible = FALSE; + + if (progress) + { + progress_view_visible = progress->getVisible(); + } + + if (!gViewerWindow->getActive() && gSavedSettings.getBOOL("MuteWhenMinimized")) + { + mute_audio = TRUE; + } + F32 mute_volume = mute_audio ? 0.0f : 1.0f; + + if (gAudiop) + { + // Sound Effects + + gAudiop->setMasterGain ( master_volume ); + + const F32 AUDIO_LEVEL_DOPPLER = 1.f; + gAudiop->setDopplerFactor(AUDIO_LEVEL_DOPPLER); + + if(!LLViewerCamera::getInstance()->cameraUnderWater()) + { + const F32 AUDIO_LEVEL_ROLLOFF = 1.f; + gAudiop->setRolloffFactor(AUDIO_LEVEL_ROLLOFF); + } + else + { + const F32 AUDIO_LEVEL_UNDERWATER_ROLLOFF = 5.f; + gAudiop->setRolloffFactor(AUDIO_LEVEL_UNDERWATER_ROLLOFF); + } + + gAudiop->setMuted(mute_audio || progress_view_visible); + + //Play any deferred sounds when unmuted + if(!gAudiop->getMuted()) + { + LLDeferredSounds::instance().playdeferredSounds(); + } + + if (force_update) + { + audio_update_wind(true); + } + + // handle secondary gains + gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_SFX, + gSavedSettings.getBOOL("MuteSounds") ? 0.f : gSavedSettings.getF32("AudioLevelSFX")); + gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_UI, + gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI")); + gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_AMBIENT, + gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient")); + + // Streaming Music + + if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade()) + { + LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty()); + LLViewerAudio::getInstance()->setForcedTeleportFade(false); + } + + F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); + BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); + F32 fade_volume = LLViewerAudio::getInstance()->getFadeVolume(); + + music_volume = mute_volume * master_volume * music_volume * fade_volume; + gAudiop->setInternetStreamGain (music_muted ? 0.f : music_volume); + } + + // Streaming Media + F32 media_volume = gSavedSettings.getF32("AudioLevelMedia"); + BOOL media_muted = gSavedSettings.getBOOL("MuteMedia"); + media_volume = mute_volume * master_volume * media_volume; + LLViewerMedia::getInstance()->setVolume( media_muted ? 0.0f : media_volume ); + + // Voice, this is parametric singleton, it gets initialized when ready + if (LLVoiceClient::instanceExists()) + { + F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice"); + voice_volume = mute_volume * master_volume * voice_volume; + BOOL voice_mute = gSavedSettings.getBOOL("MuteVoice"); + LLVoiceClient *voice_inst = LLVoiceClient::getInstance(); + voice_inst->setVoiceVolume(voice_mute ? 0.f : voice_volume); + voice_inst->setMicGain(voice_mute ? 0.f : gSavedSettings.getF32("AudioLevelMic")); + + if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) + { + voice_inst->setMuteMic(true); + } + else + { + voice_inst->setMuteMic(false); + } + } } void audio_update_listener() { - if (gAudiop) - { - // update listener position because agent has moved + if (gAudiop) + { + // update listener position because agent has moved static LLUICachedControl<S32> mEarLocation("MediaSoundsEarLocation", 0); LLVector3d ear_position; switch(mEarLocation) @@ -507,77 +516,77 @@ void audio_update_listener() ear_position = gAgent.getPositionGlobal(); break; } - LLVector3d lpos_global = ear_position; - LLVector3 lpos_global_f; - lpos_global_f.setVec(lpos_global); - - gAudiop->setListener(lpos_global_f, - // LLViewerCamera::getInstance()VelocitySmoothed, - // LLVector3::zero, - gAgent.getVelocity(), // !!! *TODO: need to replace this with smoothed velocity! - LLViewerCamera::getInstance()->getUpAxis(), - LLViewerCamera::getInstance()->getAtAxis()); - } + LLVector3d lpos_global = ear_position; + LLVector3 lpos_global_f; + lpos_global_f.setVec(lpos_global); + + gAudiop->setListener(lpos_global_f, + // LLViewerCamera::getInstance()VelocitySmoothed, + // LLVector3::zero, + gAgent.getVelocity(), // !!! *TODO: need to replace this with smoothed velocity! + LLViewerCamera::getInstance()->getUpAxis(), + LLViewerCamera::getInstance()->getAtAxis()); + } } void audio_update_wind(bool force_update) { #ifdef kAUDIO_ENABLE_WIND - LLViewerRegion* region = gAgent.getRegion(); - if (region) - { + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { // Scale down the contribution of weather-simulation wind to the // ambient wind noise. Wind velocity averages 3.5 m/s, with gusts to 7 m/s // whereas steady-state avatar walk velocity is only 3.2 m/s. // Without this the world feels desolate on first login when you are // standing still. - static LLUICachedControl<F32> wind_level("AudioLevelWind", 0.5f); - LLVector3 scaled_wind_vec = gWindVec * wind_level; - + const F32 WIND_LEVEL = 0.5f; + LLVector3 scaled_wind_vec = gWindVec * WIND_LEVEL; + // Mix in the avatar's motion, subtract because when you walk north, // the apparent wind moves south. LLVector3 final_wind_vec = scaled_wind_vec - gAgent.getVelocity(); - - // rotate the wind vector to be listener (agent) relative - gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal( final_wind_vec ); - - // don't use the setter setMaxWindGain() because we don't - // want to screw up the fade-in on startup by setting actual source gain - // outside the fade-in. - F32 master_volume = gSavedSettings.getBOOL("MuteAudio") ? 0.f : gSavedSettings.getF32("AudioLevelMaster"); - F32 ambient_volume = gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient"); - F32 max_wind_volume = master_volume * ambient_volume; - - const F32 WIND_SOUND_TRANSITION_TIME = 2.f; - // amount to change volume this frame - F32 volume_delta = (LLFrameTimer::getFrameDeltaTimeF32() / WIND_SOUND_TRANSITION_TIME) * max_wind_volume; - if (force_update) - { - // initialize wind volume (force_update) by using large volume_delta - // which is sufficient to completely turn off or turn on wind noise - volume_delta = 1.f; - } - - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return; - } - - // mute wind when not flying - if (gAgent.getFlying()) - { - // volume increases by volume_delta, up to no more than max_wind_volume - gAudiop->mMaxWindGain = llmin(gAudiop->mMaxWindGain + volume_delta, max_wind_volume); - } - else - { - // volume decreases by volume_delta, down to no less than 0 - gAudiop->mMaxWindGain = llmax(gAudiop->mMaxWindGain - volume_delta, 0.f); - } - - gAudiop->updateWind(gRelativeWindVec, gAgentCamera.getCameraPositionAgent()[VZ] - gAgent.getRegion()->getWaterHeight()); - } + + // rotate the wind vector to be listener (agent) relative + gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal( final_wind_vec ); + + // don't use the setter setMaxWindGain() because we don't + // want to screw up the fade-in on startup by setting actual source gain + // outside the fade-in. + F32 master_volume = gSavedSettings.getBOOL("MuteAudio") ? 0.f : gSavedSettings.getF32("AudioLevelMaster"); + F32 ambient_volume = gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient"); + F32 max_wind_volume = master_volume * ambient_volume; + + const F32 WIND_SOUND_TRANSITION_TIME = 2.f; + // amount to change volume this frame + F32 volume_delta = (LLFrameTimer::getFrameDeltaTimeF32() / WIND_SOUND_TRANSITION_TIME) * max_wind_volume; + if (force_update) + { + // initialize wind volume (force_update) by using large volume_delta + // which is sufficient to completely turn off or turn on wind noise + volume_delta = 1.f; + } + + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return; + } + + // mute wind when not flying + if (gAgent.getFlying()) + { + // volume increases by volume_delta, up to no more than max_wind_volume + gAudiop->mMaxWindGain = llmin(gAudiop->mMaxWindGain + volume_delta, max_wind_volume); + } + else + { + // volume decreases by volume_delta, down to no less than 0 + gAudiop->mMaxWindGain = llmax(gAudiop->mMaxWindGain - volume_delta, 0.f); + } + + gAudiop->updateWind(gRelativeWindVec, gAgentCamera.getCameraPositionAgent()[VZ] - gAgent.getRegion()->getWaterHeight()); + } #endif } |