diff options
| author | Gilbert Gonzales <gilbert@lindenlab.com> | 2013-01-25 17:47:36 -0800 | 
|---|---|---|
| committer | Gilbert Gonzales <gilbert@lindenlab.com> | 2013-01-25 17:47:36 -0800 | 
| commit | c418d616276ce16d910c6e5528f6aa058803e1c7 (patch) | |
| tree | af7c6d992eb34c37d58ffb55561e5a62893617c3 /indra | |
| parent | daa9db305a5ae2c0c5b0c2425d6482de6dee7b2c (diff) | |
CHUI-667 Upon exit from DND mode, a maximum of one sound should be played. Solution. Added a deferred sound class which will have sound id's added to it and upon unmuting the deferred sounds will be played.
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llui.cpp | 31 | ||||
| -rw-r--r-- | indra/llui/llui.h | 3 | ||||
| -rwxr-xr-x | indra/newview/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/lldeferredsounds.cpp | 45 | ||||
| -rw-r--r-- | indra/newview/lldeferredsounds.h | 44 | ||||
| -rw-r--r-- | indra/newview/lldonotdisturbnotificationstorage.cpp | 20 | ||||
| -rw-r--r-- | indra/newview/llnotificationofferhandler.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llprogressview.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llvieweraudio.cpp | 7 | 
10 files changed, 165 insertions, 8 deletions
| diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index ee09625890..2a774d54a3 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -77,6 +77,7 @@ std::list<std::string> gUntranslated;  /*static*/ LLUI::settings_map_t LLUI::sSettingGroups;  /*static*/ LLImageProviderInterface* LLUI::sImageProvider = NULL;  /*static*/ LLUIAudioCallback LLUI::sAudioCallback = NULL; +/*static*/ LLUIAudioCallback LLUI::sDeferredAudioCallback = NULL;  /*static*/ LLVector2		LLUI::sGLScaleFactor(1.f, 1.f);  /*static*/ LLWindow*		LLUI::sWindow = NULL;  /*static*/ LLView*			LLUI::sRootView = NULL; @@ -101,16 +102,18 @@ static LLDefaultChildRegistry::Register<LLToolBar> register_toolbar("toolbar");  //  // Functions  // -void make_ui_sound(const char* namep) + +LLUUID find_ui_sound(const char * namep)  {  	std::string name = ll_safe_string(namep); +	LLUUID uuid = LLUUID(NULL);  	if (!LLUI::sSettingGroups["config"]->controlExists(name))  	{  		llwarns << "tried to make UI sound for unknown sound name: " << name << llendl;	  	}  	else  	{ -		LLUUID uuid(LLUI::sSettingGroups["config"]->getString(name)); +		uuid = LLUUID(LLUI::sSettingGroups["config"]->getString(name));  		if (uuid.isNull())  		{  			if (LLUI::sSettingGroups["config"]->getString(name) == LLUUID::null.asString()) @@ -124,7 +127,6 @@ void make_ui_sound(const char* namep)  			{  				llwarns << "UI sound named: " << name << " does not translate to a valid uuid" << llendl;	  			} -  		}  		else if (LLUI::sAudioCallback != NULL)  		{ @@ -132,9 +134,28 @@ void make_ui_sound(const char* namep)  			{  				llinfos << "UI sound name: " << name << llendl;	  			} -			LLUI::sAudioCallback(uuid);  		}  	} + +	return uuid; +} + +void make_ui_sound(const char* namep) +{ +	LLUUID soundUUID = find_ui_sound(namep); +	if(soundUUID.notNull()) +	{ +		LLUI::sAudioCallback(soundUUID); +	} +} + +void make_ui_sound_deferred(const char* namep) +{ +	LLUUID soundUUID = find_ui_sound(namep); +	if(soundUUID.notNull()) +	{ +		LLUI::sDeferredAudioCallback(soundUUID); +	}  }  BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom) @@ -1608,6 +1629,7 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv  void LLUI::initClass(const settings_map_t& settings,  					 LLImageProviderInterface* image_provider,  					 LLUIAudioCallback audio_callback, +					 LLUIAudioCallback deferred_audio_callback,  					 const LLVector2* scale_factor,  					 const std::string& language)  { @@ -1622,6 +1644,7 @@ void LLUI::initClass(const settings_map_t& settings,  	sImageProvider = image_provider;  	sAudioCallback = audio_callback; +	sDeferredAudioCallback = deferred_audio_callback;  	sGLScaleFactor = (scale_factor == NULL) ? LLVector2(1.f, 1.f) : *scale_factor;  	sWindow = NULL; // set later in startup  	LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow"); diff --git a/indra/llui/llui.h b/indra/llui/llui.h index e54cae1d78..4c1703392a 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -62,6 +62,7 @@ class LLHelp;  // UI colors  extern const LLColor4 UI_VERTEX_COLOR;  void make_ui_sound(const char* name); +void make_ui_sound_deferred(const char * name);  BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom);  void gl_state_for_2d(S32 width, S32 height); @@ -274,6 +275,7 @@ public:  	static void initClass(const settings_map_t& settings,  						  LLImageProviderInterface* image_provider,  						  LLUIAudioCallback audio_callback = NULL, +						  LLUIAudioCallback deferred_audio_callback = NULL,  						  const LLVector2 *scale_factor = NULL,  						  const std::string& language = LLStringUtil::null);  	static void cleanupClass(); @@ -359,6 +361,7 @@ public:  	//  	static settings_map_t sSettingGroups;  	static LLUIAudioCallback sAudioCallback; +	static LLUIAudioCallback sDeferredAudioCallback;  	static LLVector2		sGLScaleFactor;  	static LLWindow*		sWindow;  	static LLView*			sRootView; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index d40537fc78..bd4cdac5f2 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -151,6 +151,7 @@ set(viewer_SOURCE_FILES      lldaycyclemanager.cpp      lldebugmessagebox.cpp      lldebugview.cpp +    lldeferredsounds.cpp      lldelayedgestureerror.cpp      lldirpicker.cpp      lldonotdisturbnotificationstorage.cpp @@ -739,6 +740,7 @@ set(viewer_HEADER_FILES      lldaycyclemanager.h      lldebugmessagebox.h      lldebugview.h +    lldeferredsounds.h      lldelayedgestureerror.h      lldirpicker.h      lldonotdisturbnotificationstorage.h diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 3c42734e6e..a291fac5a1 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -201,6 +201,7 @@  #include "llviewercontrol.h"  #include "lleventnotifier.h"  #include "llcallbacklist.h" +#include "lldeferredsounds.h"  #include "pipeline.h"  #include "llgesturemgr.h"  #include "llsky.h" @@ -220,6 +221,7 @@  #include "llmachineid.h"  #include "llmainlooprepeater.h" +#include <queue>  // *FIX: These extern globals should be cleaned up.  // The globals either represent state/config/resource-storage of either  @@ -456,7 +458,7 @@ void idle_afk_check()  }  // A callback set in LLAppViewer::init() -static void ui_audio_callback(const LLUUID& uuid) +void ui_audio_callback(const LLUUID& uuid)  {  	if (gAudiop)  	{ @@ -464,6 +466,15 @@ static void ui_audio_callback(const LLUUID& uuid)  	}  } +// A callback set in LLAppViewer::init() +static void deferred_ui_audio_callback(const LLUUID& uuid) +{ +	if (gAudiop) +	{ +		LLDeferredSounds::instance().deferSound(uuid); +	} +} +  bool	create_text_segment_icon_from_url_match(LLUrlMatch* match,LLTextBase* base)  {  	if(!match || !base || base->getPlainText()) @@ -778,6 +789,7 @@ bool LLAppViewer::init()  	LLUI::initClass(settings_map,  		LLUIImageList::getInstance(),  		ui_audio_callback, +		deferred_ui_audio_callback,  		&LLUI::sGLScaleFactor);  	LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ; diff --git a/indra/newview/lldeferredsounds.cpp b/indra/newview/lldeferredsounds.cpp new file mode 100644 index 0000000000..2b2b493875 --- /dev/null +++ b/indra/newview/lldeferredsounds.cpp @@ -0,0 +1,45 @@ +/**  +* @file lldeferredsounds.cpp +* @brief Implementation of lldeferredsounds +* @author Gilbert@lindenlab.com +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2013, 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$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "lldeferredsounds.h" + +void ui_audio_callback(const LLUUID& uuid); + +void LLDeferredSounds::deferSound(LLUUID sound) +{ +	soundQueue.push(sound); +} +void LLDeferredSounds::playdeferredSounds() +{ +	while(soundQueue.size()) +	{ +		ui_audio_callback(soundQueue.front()); +		soundQueue.pop(); +	} +} diff --git a/indra/newview/lldeferredsounds.h b/indra/newview/lldeferredsounds.h new file mode 100644 index 0000000000..50da9acf2b --- /dev/null +++ b/indra/newview/lldeferredsounds.h @@ -0,0 +1,44 @@ +/**  +* @file   lldeferredsounds.h +* @brief  Header file for lldeferredsounds +* @author Gilbert@lindenlab.com +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2013, 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$ +*/ +#ifndef LL_LLDEFERREDSOUNDS_H +#define LL_LLDEFERREDSOUNDS_H + +#include "llsingleton.h" + +class LLDeferredSounds : public LLSingleton<LLDeferredSounds> +{ +private: +	std::queue<LLUUID> soundQueue; +public: +	//Add sounds to be played once progress bar is hidden (such as after teleport or loading screen) +	void deferSound(LLUUID sound); + +	void playdeferredSounds(); +}; + +#endif // LL_LLDEFERREDSOUNDS_H + diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp index 15c42e8285..6e39d049a5 100644 --- a/indra/newview/lldonotdisturbnotificationstorage.cpp +++ b/indra/newview/lldonotdisturbnotificationstorage.cpp @@ -146,6 +146,7 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()  	LLNotifications& instance = LLNotifications::instance();      bool imToastExists = false; +    bool offerExists = false;  	for (LLSD::array_const_iterator notification_it = data.beginArray();  		 notification_it != data.endArray(); @@ -160,6 +161,10 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()          {              imToastExists = true;          } +        else if(notificationName == offerName) +        { +            offerExists = true; +        }          //New notification needs to be added          notification = (LLNotificationPtr) new LLNotification(notification_params.with("is_dnd", true)); @@ -183,6 +188,11 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()          LLFloaterReg::showInstance("im_container");      } +    if(imToastExists || offerExists) +    { +		make_ui_sound_deferred("UISndNewIncomingIMSession"); +    } +      //writes out empty .xml file (since LLCommunicationChannel::mHistory is empty)  	saveNotifications();  } @@ -196,6 +206,7 @@ void LLDoNotDisturbNotificationStorage::updateNotifications()      LLNotifications& instance = LLNotifications::instance();      bool imToastExists = false; +    bool offerExists = false;      for (LLCommunicationChannel::history_list_t::const_iterator it = commChannel->beginHistory();          it != commChannel->endHistory(); @@ -208,6 +219,10 @@ void LLDoNotDisturbNotificationStorage::updateNotifications()          {              imToastExists = true;          } +        else if(notificationName == offerName) +        { +            offerExists = true; +        }          //Notification already exists in notification pipeline (same instance of app running)          if (notification) @@ -222,6 +237,11 @@ void LLDoNotDisturbNotificationStorage::updateNotifications()          LLFloaterReg::showInstance("im_container");      } +    if(imToastExists || offerExists) +    { +        make_ui_sound("UISndNewIncomingIMSession"); +    } +      //When exit DND mode, write empty notifications file      if(commChannel->getHistorySize())      { diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index da38c9063b..cde7bb18ce 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -120,7 +120,8 @@ bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)  				channel->addToast(p);              //Will not play a notification sound for inventory and teleport offer based upon chat preference -            bool playSound = !((notification->getName() == "UserGiveItem" +            bool playSound = !((notification->isDND()) +                               && (notification->getName() == "UserGiveItem"                                      && gSavedSettings.getBOOL("PlaySoundInventoryOffer") == FALSE)                                  ||  notification->getName() == "TeleportOffered"                                      && gSavedSettings.getBOOL("PlaySoundTeleportOffer") == FALSE); diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index f86e583b9e..989f0b0e60 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -96,7 +96,7 @@ BOOL LLProgressView::postBuild()  	getChild<LLTextBox>("message_text")->setClickedCallback(onClickMessage, this);  	// hidden initially, until we need it -	LLPanel::setVisible(FALSE); +	setVisible(FALSE);  	LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLProgressView::onAlertModal, this, _1)); @@ -265,7 +265,7 @@ void LLProgressView::draw()  			gFocusMgr.releaseFocusIfNeeded( this );  			// turn off panel that hosts intro so we see the world -			LLPanel::setVisible(FALSE); +			setVisible(FALSE);  			// stop observing events since we no longer care  			mMediaCtrl->remObserver( this ); diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 8d8c401dac..564bf7997a 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -30,6 +30,7 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llappviewer.h" +#include "lldeferredsounds.h"  #include "llvieweraudio.h"  #include "llviewercamera.h"  #include "llviewercontrol.h" @@ -388,6 +389,12 @@ void audio_update_volume(bool force_update)  		gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));  		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); | 
