diff options
| author | Mike Antipov <mantipov@productengine.com> | 2010-01-25 17:06:35 +0200 | 
|---|---|---|
| committer | Mike Antipov <mantipov@productengine.com> | 2010-01-25 17:06:35 +0200 | 
| commit | 2ea3fd95635073e68aa7626ea24c540717190127 (patch) | |
| tree | 42a2bc61908bcf05b2a5c6c407303835ce1f6c77 | |
| parent | c4cb6628b995fb785848493e263e607263ae68fd (diff) | |
Fixed normal bug EXT-4108 ([BSI] Voice volume sliders do not preserve settings per resident between voice sessions)
- moved necessary functionality from LLMuteList to LLVoiceClient. It was used only in active speackers floater which is deprecated.
- initialized saving/loading of voice level in voice client.
- also saving voice levels between session is activated.
--HG--
branch : product-engine
| -rw-r--r-- | indra/newview/llmutelist.cpp | 72 | ||||
| -rw-r--r-- | indra/newview/llmutelist.h | 9 | ||||
| -rw-r--r-- | indra/newview/llspeakers.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llvoiceclient.cpp | 122 | 
4 files changed, 122 insertions, 83 deletions
| diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 7ee4c64f8f..8e9fa97faf 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -52,12 +52,8 @@  #include <boost/tokenizer.hpp> -#include "llcrc.h" -#include "lldir.h"  #include "lldispatcher.h" -#include "llsdserialize.h"  #include "llxfermanager.h" -#include "message.h"  #include "llagent.h"  #include "llviewergenericmessage.h"	// for gGenericDispatcher @@ -219,61 +215,17 @@ LLMuteList* LLMuteList::getInstance()  // LLMuteList()  //-----------------------------------------------------------------------------  LLMuteList::LLMuteList() : -	mIsLoaded(FALSE), -	mUserVolumesLoaded(FALSE) +	mIsLoaded(FALSE)  {  	gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList);  } -void LLMuteList::loadUserVolumes() -{ -	// call once, after LLDir::setLindenUserDir() has been called -	if (mUserVolumesLoaded) -		return; -	mUserVolumesLoaded = TRUE; -	 -	// load per-resident voice volume information -	// conceptually, this is part of the mute list information, although it is only stored locally -	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml"); - -	LLSD settings_llsd; -	llifstream file; -	file.open(filename); -	if (file.is_open()) -	{ -		LLSDSerialize::fromXML(settings_llsd, file); -	} - -	for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); -		 iter != settings_llsd.endMap(); ++iter) -	{ -		mUserVolumeSettings.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal())); -	} -} -  //-----------------------------------------------------------------------------  // ~LLMuteList()  //-----------------------------------------------------------------------------  LLMuteList::~LLMuteList()  { -	// If we quit from the login screen we will not have an SL account -	// name.  Don't try to save, otherwise we'll dump a file in -	// C:\Program Files\SecondLife\ or similar. JC -	std::string user_dir = gDirUtilp->getLindenUserDir(); -	if (!user_dir.empty()) -	{ -		std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml"); -		LLSD settings_llsd; - -		for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter) -		{ -			settings_llsd[iter->first.asString()] = iter->second; -		} -		llofstream file; -		file.open(filename); -		LLSDSerialize::toPrettyXML(settings_llsd, file); -	}  }  BOOL LLMuteList::isLinden(const std::string& name) const @@ -715,8 +667,6 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c  //-----------------------------------------------------------------------------  void LLMuteList::requestFromServer(const LLUUID& agent_id)  { -	loadUserVolumes(); -	  	std::string agent_id_string;  	std::string filename;  	agent_id.toString(agent_id_string); @@ -751,26 +701,6 @@ void LLMuteList::cache(const LLUUID& agent_id)  	}  } -void LLMuteList::setSavedResidentVolume(const LLUUID& id, F32 volume) -{ -	// store new value in volume settings file -	mUserVolumeSettings[id] = volume; -} - -F32 LLMuteList::getSavedResidentVolume(const LLUUID& id) -{ -	const F32 DEFAULT_VOLUME = 0.5f; - -	user_volume_map_t::iterator found_it = mUserVolumeSettings.find(id); -	if (found_it != mUserVolumeSettings.end()) -	{ -		return found_it->second; -	} -	//FIXME: assumes default, should get this from somewhere -	return DEFAULT_VOLUME; -} - -  //-----------------------------------------------------------------------------  // Static message handlers  //----------------------------------------------------------------------------- diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 409b637bf2..e1e81a24b4 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -127,12 +127,7 @@ public:  	// call this method on logout to save everything.  	void cache(const LLUUID& agent_id); -	void setSavedResidentVolume(const LLUUID& id, F32 volume); -	F32 getSavedResidentVolume(const LLUUID& id); -  private: -	void loadUserVolumes(); -	  	BOOL loadFromFile(const std::string& filename);  	BOOL saveToFile(const std::string& filename); @@ -179,12 +174,8 @@ private:  	observer_set_t mObservers;  	BOOL mIsLoaded; -	BOOL mUserVolumesLoaded;  	friend class LLDispatchEmptyMuteList; - -	typedef std::map<LLUUID, F32> user_volume_map_t;  -	user_volume_map_t mUserVolumeSettings;  };  class LLMuteListObserver diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 9608cd1263..6f9a1ccdbe 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -70,8 +70,6 @@ LLSpeaker::LLSpeaker(const LLUUID& id, const std::string& name, const ESpeakerTy  	{  		mDisplayName = name;  	} - -	gVoiceClient->setUserVolume(id, LLMuteList::getInstance()->getSavedResidentVolume(id));  } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index e52d6a089b..68b271d6cb 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -37,8 +37,10 @@  // library includes  #include "llnotificationsutil.h" +#include "llsdserialize.h"  #include "llsdutil.h" +  // project includes  #include "llvoavatar.h"  #include "llbufferstream.h" @@ -1092,6 +1094,119 @@ static void killGateway()  #endif +class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage> +{ +	LOG_CLASS(LLSpeakerVolumeStorage); +public: + +	/** +	 * Sets internal voluem level for specified user. +	 * +	 * @param[in] speaker_id - LLUUID of user to store volume level for +	 * @param[in] volume - internal volume level to be stored for user. +	 */ +	void storeSpeakerVolume(const LLUUID& speaker_id, S32 volume); + +	/** +	 * Gets stored internal volume level for specified speaker. +	 * +	 * If specified user is not found default level will be returned. It is equivalent of  +	 * external level 0.5 from the 0.0..1.0 range. +	 * Default internal level is calculated as: internal = 400 * external^2 +	 * Maps 0.0 to 1.0 to internal values 0-400 with default 0.5 == 100 +	 * +	 * @param[in] speaker_id - LLUUID of user to get his volume level +	 */ +	S32 getSpeakerVolume(const LLUUID& speaker_id); + +private: +	friend class LLSingleton<LLSpeakerVolumeStorage>; +	LLSpeakerVolumeStorage(); +	~LLSpeakerVolumeStorage(); + +	const static std::string SETTINGS_FILE_NAME; + +	void load(); +	void save(); + +	typedef std::map<LLUUID, S32> speaker_data_map_t; +	speaker_data_map_t mSpeakersData; +}; + +const std::string LLSpeakerVolumeStorage::SETTINGS_FILE_NAME = "volume_settings.xml"; + +LLSpeakerVolumeStorage::LLSpeakerVolumeStorage() +{ +	load(); +} + +LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage() +{ +	save(); +} + +void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, S32 volume) +{ +	mSpeakersData[speaker_id] = volume; +} + +S32 LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id) +{ +	// default internal level of user voice. +	static const S32 DEFAULT_INTERNAL_VOLUME_LEVEL = 100; +	S32 ret_val = DEFAULT_INTERNAL_VOLUME_LEVEL; +	speaker_data_map_t::const_iterator it = mSpeakersData.find(speaker_id); +	 +	if (it != mSpeakersData.end()) +	{ +		ret_val = it->second; +	} +	return ret_val; +} + +void LLSpeakerVolumeStorage::load() +{ +	// load per-resident voice volume information +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME); + +	LLSD settings_llsd; +	llifstream file; +	file.open(filename); +	if (file.is_open()) +	{ +		LLSDSerialize::fromXML(settings_llsd, file); +	} + +	for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); +		iter != settings_llsd.endMap(); ++iter) +	{ +		mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger())); +	} +} + +void LLSpeakerVolumeStorage::save() +{ +	// If we quit from the login screen we will not have an SL account +	// name.  Don't try to save, otherwise we'll dump a file in +	// C:\Program Files\SecondLife\ or similar. JC +	std::string user_dir = gDirUtilp->getLindenUserDir(); +	if (!user_dir.empty()) +	{ +		std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME); +		LLSD settings_llsd; + +		for(speaker_data_map_t::const_iterator iter = mSpeakersData.begin(); iter != mSpeakersData.end(); ++iter) +		{ +			settings_llsd[iter->first.asString()] = iter->second; +		} + +		llofstream file; +		file.open(filename); +		LLSDSerialize::toPrettyXML(settings_llsd, file); +	} +} + +  ///////////////////////////////////////////////////////////////////////////////////////////////  LLVoiceClient::LLVoiceClient() : @@ -4914,7 +5029,9 @@ LLVoiceClient::participantState *LLVoiceClient::sessionState::addParticipant(con  		}  		mParticipantsByUUID.insert(participantUUIDMap::value_type(&(result->mAvatarID), result)); -		 + +		result->mUserVolume = LLSpeakerVolumeStorage::getInstance()->getSpeakerVolume(result->mAvatarID); +  		LL_DEBUGS("Voice") << "participant \"" << result->mURI << "\" added." << LL_ENDL;  	} @@ -6163,6 +6280,9 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume)  			participant->mUserVolume = llclamp(ivol, 0, 400);  			participant->mVolumeDirty = TRUE;  			mAudioSession->mVolumeDirty = TRUE; + +			// store this volume setting for future sessions +			LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, participant->mUserVolume);  		}  	}  } | 
