diff options
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/cmake/Copy3rdPartyLibs.cmake | 2 | ||||
| -rwxr-xr-x | indra/newview/CMakeLists.txt | 2 | ||||
| -rwxr-xr-x | indra/newview/llimview.cpp | 12 | ||||
| -rwxr-xr-x | indra/newview/llpanelvoicedevicesettings.cpp | 30 | ||||
| -rwxr-xr-x | indra/newview/llpanelvoicedevicesettings.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llvoiceclient.cpp | 26 | ||||
| -rwxr-xr-x | indra/newview/llvoiceclient.h | 6 | ||||
| -rwxr-xr-x | indra/newview/llvoicevivox.cpp | 441 | ||||
| -rwxr-xr-x | indra/newview/llvoicevivox.h | 19 | ||||
| -rwxr-xr-x | indra/newview/skins/default/xui/en/panel_sound_devices.xml | 4 | ||||
| -rwxr-xr-x | indra/newview/viewer_manifest.py | 2 | 
11 files changed, 247 insertions, 299 deletions
| diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index a6fd756c88..70d85b864c 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -22,10 +22,8 @@ if(WINDOWS)          SLVoice.exe          ca-bundle.crt          libsndfile-1.dll -        vivoxplatform.dll          vivoxsdk.dll          ortp.dll -        zlib1.dll          vivoxoal.dll          ) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 13040ea423..0e3b802fc7 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1735,8 +1735,6 @@ if (WINDOWS)        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libsndfile-1.dll -      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll -      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll        ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ca-bundle.crt        ${GOOGLE_PERF_TOOLS_SOURCE} diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 5d3a11e245..008388c244 100755 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1262,12 +1262,12 @@ void LLIMModel::sendMessage(const std::string& utf8_text,  	info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id);  	U8 offline = (!info || info->isOnline()) ? IM_ONLINE : IM_OFFLINE; -	 -	if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id))) -	{ -		// User is online through the OOW connector, but not with a regular viewer.  Try to send the message via SLVoice. -		sent = LLVoiceClient::getInstance()->sendTextMessage(other_participant_id, utf8_text); -	} +	// Old call to send messages to SLim client,  no longer supported. +	//if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id))) +	//{ +	//	// User is online through the OOW connector, but not with a regular viewer.  Try to send the message via SLVoice. +	//	sent = LLVoiceClient::getInstance()->sendTextMessage(other_participant_id, utf8_text); +	//}  	if(!sent)  	{ diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 3946d6a63b..07f8045546 100755 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -51,7 +51,7 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()  	mCtrlOutputDevices = NULL;  	mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");  	mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); -	mDevicesUpdated = FALSE; +	mDevicesUpdated = FALSE;  //obsolete  	mUseTuningMode = true;  	// grab "live" mic volume level @@ -80,6 +80,10 @@ BOOL LLPanelVoiceDeviceSettings::postBuild()  	mLocalizedDeviceNames[DEFAULT_DEVICE]				= getString("default_text");  	mLocalizedDeviceNames["No Device"]					= getString("name_no_device");  	mLocalizedDeviceNames["Default System Device"]		= getString("name_default_system_device"); + +	mCtrlOutputDevices->setMouseDownCallback(boost::bind(&LLPanelVoiceDeviceSettings::onOutputDevicesClicked, this)); +	mCtrlInputDevices->setMouseDownCallback(boost::bind(&LLPanelVoiceDeviceSettings::onInputDevicesClicked, this)); +	  	return TRUE;  } @@ -226,9 +230,8 @@ void LLPanelVoiceDeviceSettings::refresh()  			mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM);  			mCtrlOutputDevices->setValue(mOutputDevice);  		} -		mDevicesUpdated = FALSE;  	} -	else if (!mDevicesUpdated) +	else if (LLVoiceClient::getInstance()->deviceSettingsUpdated())  	{  		LLVoiceDeviceList::const_iterator iter; @@ -272,7 +275,6 @@ void LLPanelVoiceDeviceSettings::refresh()  				mOutputDevice = DEFAULT_DEVICE;  			}  		} -		mDevicesUpdated = TRUE;  	}	  } @@ -281,7 +283,6 @@ void LLPanelVoiceDeviceSettings::initialize()  	mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");  	mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");  	mMicVolume = gSavedSettings.getF32("AudioLevelMic"); -	mDevicesUpdated = FALSE;  	// ask for new device enumeration  	LLVoiceClient::getInstance()->refreshDeviceLists(); @@ -314,8 +315,8 @@ void LLPanelVoiceDeviceSettings::onCommitInputDevice()  {  	if(LLVoiceClient::getInstance())  	{ -		LLVoiceClient::getInstance()->setCaptureDevice( -			mCtrlInputDevices->getValue().asString()); +		mInputDevice = mCtrlInputDevices->getValue().asString(); +		LLVoiceClient::getInstance()->setRenderDevice(mInputDevice);  	}  } @@ -323,7 +324,18 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice()  {  	if(LLVoiceClient::getInstance())  	{ -		LLVoiceClient::getInstance()->setRenderDevice( -			mCtrlInputDevices->getValue().asString()); +		 +		mOutputDevice = mCtrlOutputDevices->getValue().asString();  +		LLVoiceClient::getInstance()->setRenderDevice(mOutputDevice);  	}  } + +void LLPanelVoiceDeviceSettings::onOutputDevicesClicked() +{ +	LLVoiceClient::getInstance()->refreshDeviceLists(false);  // fill in the pop up menus again if needed. +} + +void LLPanelVoiceDeviceSettings::onInputDevicesClicked() +{ +	LLVoiceClient::getInstance()->refreshDeviceLists(false);  // fill in the pop up menus again if needed. +} diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h index 83464f476a..355bc02b05 100755 --- a/indra/newview/llpanelvoicedevicesettings.h +++ b/indra/newview/llpanelvoicedevicesettings.h @@ -53,6 +53,8 @@ protected:  	void onCommitInputDevice();  	void onCommitOutputDevice(); +	void onOutputDevicesClicked(); +	void onInputDevicesClicked();  	F32 mMicVolume;  	std::string mInputDevice; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index e24884fe81..56c0910983 100755 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -266,6 +266,18 @@ bool LLVoiceClient::deviceSettingsAvailable()  	}  } +bool LLVoiceClient::deviceSettingsUpdated() +{ +	if (mVoiceModule) +	{ +		return mVoiceModule->deviceSettingsUpdated(); +	} +	else +	{ +		return false; +	} +} +  void LLVoiceClient::refreshDeviceLists(bool clearCurrentList)  {  	if (mVoiceModule) mVoiceModule->refreshDeviceLists(clearCurrentList); @@ -363,6 +375,7 @@ BOOL LLVoiceClient::isSessionCallBackPossible(const LLUUID& id)  	}	  } +/* obsolete  BOOL LLVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message)  {  	if (mVoiceModule)  @@ -374,12 +387,13 @@ BOOL LLVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::str  		return FALSE;  	}	  } +*/  void LLVoiceClient::endUserIMSession(const LLUUID& participant_id)  {  	if (mVoiceModule)   	{ -		mVoiceModule->endUserIMSession(participant_id); +		// mVoiceModule->endUserIMSession(participant_id);  // A SLim leftover  	}  } @@ -645,9 +659,8 @@ void LLVoiceClient::keyDown(KEY key, MASK mask)  	if(!mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak"))  	{ -		bool down = (mPTTKey != KEY_NONE) -		&& gKeyboard->getKeyDown(mPTTKey); -		inputUserControlState(down); +		bool down = (mPTTKey != KEY_NONE) && gKeyboard->getKeyDown(mPTTKey); +		if (down) { inputUserControlState(down); }  	}  } @@ -655,9 +668,8 @@ void LLVoiceClient::keyUp(KEY key, MASK mask)  {  	if(!mPTTIsMiddleMouse)  	{ -		bool down = (mPTTKey != KEY_NONE) -		&& gKeyboard->getKeyDown(mPTTKey); -		inputUserControlState(down); +		bool down = (mPTTKey != KEY_NONE) && gKeyboard->getKeyDown(mPTTKey); +		if (down) { inputUserControlState(down); }  	}  }  void LLVoiceClient::middleMouseState(bool down) diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index fb387301be..51961468ca 100755 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -128,6 +128,7 @@ public:  	// This returns true when it's safe to bring up the "device settings" dialog in the prefs.  	// i.e. when the daemon is running and connected, and the device lists are populated.  	virtual bool deviceSettingsAvailable()=0; +	virtual bool deviceSettingsUpdated() = 0;  	// Requery the vivox daemon for the current list of input/output devices.  	// If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed @@ -214,7 +215,7 @@ public:  	//@{  	virtual BOOL isSessionTextIMPossible(const LLUUID& id)=0;  	virtual BOOL isSessionCallBackPossible(const LLUUID& id)=0; -	virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message)=0; +	//virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message)=0;  	virtual void endUserIMSession(const LLUUID &uuid)=0;	  	//@} @@ -335,6 +336,7 @@ public:  	// This returns true when it's safe to bring up the "device settings" dialog in the prefs.  	// i.e. when the daemon is running and connected, and the device lists are populated.  	bool deviceSettingsAvailable(); +	bool deviceSettingsUpdated();	// returns true when the device list has been updated recently.  	// Requery the vivox daemon for the current list of input/output devices.  	// If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed @@ -431,7 +433,7 @@ public:  	//@{  	BOOL isSessionTextIMPossible(const LLUUID& id);  	BOOL isSessionCallBackPossible(const LLUUID& id); -	BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message); +	//BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message) const {return true;} ;  	void endUserIMSession(const LLUUID &uuid);	  	//@} diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index a6a7a35b03..da8f51bc03 100755 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -60,6 +60,7 @@  #include "lltrans.h"  #include "llviewerwindow.h"  #include "llviewercamera.h" +#include "llversioninfo.h"  #include "llviewernetwork.h"  #include "llnotificationsutil.h" @@ -91,11 +92,10 @@ const F32 LOGIN_RETRY_SECONDS = 10.0f;  const int MAX_LOGIN_RETRIES = 12;  // Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine() -// which is treated as normal. If this number is exceeded we suspect there is a problem with connection -// to voice server (EXT-4313). When voice works correctly, there is from 1 to 15 times. 50 was chosen  -// to make sure we don't make mistake when slight connection problems happen- situation when connection to server is  -// blocked is VERY rare and it's better to sacrifice response time in this situation for the sake of stability. -const int MAX_NORMAL_JOINING_SPATIAL_NUM = 50; +// which is treated as normal. The is the number of frames to wait for a channel join before giving up.  This was changed  +// from the original count of 50 for two reason.  Modern PCs have higher frame rates and sometimes the SLVoice process  +// backs up processing join requests.  There is a log statement that records when channel joins take longer than 100 frames. +const int MAX_NORMAL_JOINING_SPATIAL_NUM = 1500;  // How often to check for expired voice fonts in seconds  const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f; @@ -277,9 +277,10 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :  	mTuningEnergy(0.0f),  	mTuningMicVolume(0),  	mTuningMicVolumeDirty(true), -	mTuningSpeakerVolume(0), +	mTuningSpeakerVolume(50),     // Set to 50 so the user can hear himself when he sets his mic volume  	mTuningSpeakerVolumeDirty(true),  	mTuningExitState(stateDisabled), +	mDevicesListUpdated(false),  	mAreaVoiceDisabled(false),  	mAudioSession(NULL), @@ -450,17 +451,20 @@ bool LLVivoxVoiceClient::writeString(const std::string &str)  				(const char*)str.data(),  				&written); -		if(err == 0) +		if(err == 0 && written == size)  		{  			// Success.  			result = true;  		} -		// TODO: handle partial writes (written is number of bytes written) -		// Need to set socket to non-blocking before this will work. -//		else if(APR_STATUS_IS_EAGAIN(err)) -//		{ -//			//  -//		} +		else if (err == 0 && written != size) { +			// Did a short write,  log it for now +			LL_WARNS("Voice") << ") short write on socket sending data to vivox daemon." << "Sent " << written << "bytes instead of " << size <<LL_ENDL; +		} +		else if(APR_STATUS_IS_EAGAIN(err)) +		{ +			char buf[MAX_STRING]; +			LL_WARNS("Voice") << "EAGAIN error " << err << " (" << apr_strerror(err, buf, MAX_STRING) << ") sending data to vivox daemon." << LL_ENDL; +		}  		else  		{  			// Assume any socket error means something bad.  For now, just close the socket. @@ -498,14 +502,15 @@ void LLVivoxVoiceClient::connectorCreate()  		<< "<AccountManagementServer>" << mVoiceAccountServerURI << "</AccountManagementServer>"  		<< "<Mode>Normal</Mode>"  		<< "<Logging>" -        << "<Folder>" << logpath << "</Folder>" -        << "<FileNamePrefix>Connector</FileNamePrefix>" -        << "<FileNameSuffix>.log</FileNameSuffix>" -        << "<LogLevel>" << loglevel << "</LogLevel>" +		<< "<Folder>" << logpath << "</Folder>" +		<< "<FileNamePrefix>Connector</FileNamePrefix>" +		<< "<FileNameSuffix>.log</FileNameSuffix>" +		<< "<LogLevel>" << loglevel << "</LogLevel>"  		<< "</Logging>" -		<< "<Application></Application>"  //Name can cause problems per vivox. -        << "<MaxCalls>12</MaxCalls>" -        << "</Request>\n\n\n"; +		<< "<Application>" << LLVersionInfo::getChannel().c_str() << " " << LLVersionInfo::getVersion().c_str() << "</Application>" +		//<< "<Application></Application>"  //Name can cause problems per vivox. +		<< "<MaxCalls>12</MaxCalls>" +		<< "</Request>\n\n\n";  	writeString(stream.str());  } @@ -715,8 +720,9 @@ void LLVivoxVoiceClient::stateMachine()  		setVoiceEnabled(false);  	} -	if(mVoiceEnabled || (!mIsInitialized &&!mTerminateDaemon) ) +	if ((getState() == stateRunning) && inSpatialChannel() && mUpdateTimer.hasExpired() && !mTerminateDaemon)  	{ +		// poll the avatar position so its available in various states when a 3d position is sent.  		updatePosition();  	}  	else if(mTuningMode) @@ -725,7 +731,8 @@ void LLVivoxVoiceClient::stateMachine()  	}  	else  	{ -		if((getState() != stateDisabled) && (getState() != stateDisableCleanup)) +		if (!gSavedSettings.getBOOL("EnableVoiceChat")) +		//if((getState() != stateDisabled) && (getState() != stateDisableCleanup))  		{  			// User turned off voice support.  Send the cleanup messages, close the socket, and reset.  			if(!mConnected || mTerminateDaemon) @@ -743,6 +750,10 @@ void LLVivoxVoiceClient::stateMachine()  		}  	} +	 +	// send any requests to adjust mic and speaker settings if they have changed +	sendLocalAudioUpdates();  +  	switch(getState())  	{ @@ -969,8 +980,21 @@ void LLVivoxVoiceClient::stateMachine()  				}  				else  				{ -					// duration parameter is currently unused, per Mike S. -					tuningCaptureStartSendMessage(10000); +					// loop mic back to render device. +					//setMuteMic(0);						// make sure the mic is not muted +					std::ostringstream stream; + +					stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" +						<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" +						<< "<Value>false</Value>" +						<< "</Request>\n\n\n"; + +					// Dirty the mute mic state so that it will get reset when we finishing previewing +					mMuteMicDirty = true; +					mTuningSpeakerVolumeDirty = true; + +					writeString(stream.str()); +					tuningCaptureStartSendMessage(1);  // 1-loop, zero, don't loop  					setState(stateMicTuningRunning);  				} @@ -1240,16 +1264,8 @@ void LLVivoxVoiceClient::stateMachine()  			}  			// Set the initial state of mic mute, local speaker volume, etc. -			{ -				std::ostringstream stream; -				 -				buildLocalAudioUpdates(stream); +			sendLocalAudioUpdates(); -				if(!stream.str().empty()) -				{ -					writeString(stream.str()); -				} -			}  		break;  		//MARK: stateVoiceFontsWait @@ -1414,6 +1430,8 @@ void LLVivoxVoiceClient::stateMachine()  		//MARK: stateSessionJoined  		case stateSessionJoined:		// session handle received +			if (mSpatialJoiningNum > 100) +				LL_WARNS() << "There seems to be problem with connecting to a voice channel. Frames to join were " << mSpatialJoiningNum << LL_ENDL;  			mSpatialJoiningNum = 0;  			// It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4 @@ -1512,7 +1530,7 @@ void LLVivoxVoiceClient::stateMachine()  		//MARK: stateLeavingSession  		case stateLeavingSession:		// waiting for terminate session response  			// The handler for the Session.Terminate response will transition from here to stateSessionTerminated. -		break; +		//break;  // Fall through and clean up session before getting terminated event.  		//MARK: stateSessionTerminated  		case stateSessionTerminated: @@ -1520,8 +1538,9 @@ void LLVivoxVoiceClient::stateMachine()  			// Must do this first, since it uses mAudioSession.  			notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL); -			if(mAudioSession) +			if (mAudioSession)  			{ +				leaveAudioSession();  				sessionState *oldSession = mAudioSession;  				mAudioSession = NULL; @@ -1680,7 +1699,8 @@ void LLVivoxVoiceClient::loginSendMessage()  		<< "<AccountName>" << mAccountName << "</AccountName>"  		<< "<AccountPassword>" << mAccountPassword << "</AccountPassword>"  		<< "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>" -        << "<EnableBuddiesAndPresence>false</EnableBuddiesAndPresence>" +		<< "<EnableBuddiesAndPresence>false</EnableBuddiesAndPresence>" +		<< "<EnablePresencePersistence>0</EnablePresencePersistence>"  		<< "<BuddyManagementMode>Application</BuddyManagementMode>"  		<< "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>"  		<< (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"") @@ -1881,6 +1901,7 @@ void LLVivoxVoiceClient::leaveAudioSession()  			case stateJoiningSession:  			case stateSessionJoined:  			case stateRunning: +            case stateSessionTerminated:  				if(!mAudioSession->mHandle.empty())  				{ @@ -1911,10 +1932,12 @@ void LLVivoxVoiceClient::leaveAudioSession()  			case stateJoinSessionFailed:  			case stateJoinSessionFailedWaiting:  				setState(stateSessionTerminated); +				break; +			case stateLeavingSession:  // managed to get back to this case statement before the media gets disconnected.  			break;  			default: -				LL_WARNS("Voice") << "called from unknown state" << LL_ENDL; +				LL_WARNS("Voice") << "called from unknown state " << getState() << LL_ENDL;  			break;  		}  	} @@ -1967,19 +1990,6 @@ void LLVivoxVoiceClient::sessionMediaDisconnectSendMessage(sessionState *session  } -void LLVivoxVoiceClient::sessionTextDisconnectSendMessage(sessionState *session) -{ -	std::ostringstream stream; -	 -	LL_DEBUGS("Voice") << "Sending Session.TextDisconnect with handle " << session->mHandle << LL_ENDL;	 -	stream -	<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.TextDisconnect.1\">" -		<< "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>" -		<< "<SessionHandle>" << session->mHandle << "</SessionHandle>" -	<< "</Request>\n\n\n"; -	 -	writeString(stream.str()); -}  void LLVivoxVoiceClient::getCaptureDevicesSendMessage()  { @@ -2038,6 +2048,10 @@ void LLVivoxVoiceClient::setCaptureDevice(const std::string& name)  		}  	}  } +void LLVivoxVoiceClient::setDevicesListUpdated(bool state) +{ +	mDevicesListUpdated = state; +}  void LLVivoxVoiceClient::clearRenderDevices()  {	 @@ -2131,14 +2145,15 @@ void LLVivoxVoiceClient::tuningRenderStopSendMessage()  	writeString(stream.str());  } -void LLVivoxVoiceClient::tuningCaptureStartSendMessage(int duration) +void LLVivoxVoiceClient::tuningCaptureStartSendMessage(int loop)  {  	LL_DEBUGS("Voice") << "sending CaptureAudioStart" << LL_ENDL;  	std::ostringstream stream;  	stream  	<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStart.1\">" -    << "<Duration>" << duration << "</Duration>" +	<< "<Duration>-1</Duration>" +    << "<LoopToRenderDevice>" << loop << "</LoopToRenderDevice>"  	<< "</Request>\n\n\n";  	writeString(stream.str()); @@ -2197,6 +2212,16 @@ bool LLVivoxVoiceClient::deviceSettingsAvailable()  	return result;  } +bool LLVivoxVoiceClient::deviceSettingsUpdated() +{ +	if (mDevicesListUpdated) +	{ +		// a hot swap event or a polling of the audio devices has been parsed since the last redraw of the input and output device panel. +		mDevicesListUpdated = !mDevicesListUpdated; // toggle the setting +		return true; +	} +	return false;		 +}  void LLVivoxVoiceClient::refreshDeviceLists(bool clearCurrentList)  { @@ -2360,6 +2385,7 @@ void LLVivoxVoiceClient::sendPositionalUpdate(void)  {	  	std::ostringstream stream; +  	if(mSpatialCoordsDirty)  	{  		LLVector3 l, u, a, vel; @@ -2499,6 +2525,7 @@ void LLVivoxVoiceClient::sendPositionalUpdate(void)  		stream << "</ListenerPosition>"; +		stream << "<ReqDispositionType>1</ReqDispositionType>";  //do not generate responses for update requests  		stream << "</Request>\n\n\n";  	}	 @@ -2567,7 +2594,7 @@ void LLVivoxVoiceClient::sendPositionalUpdate(void)  		}  	} -	buildLocalAudioUpdates(stream); +	//sendLocalAudioUpdates();  obsolete, used to send volume setting on position updates  	if(!stream.str().empty())  	{ @@ -2607,68 +2634,73 @@ void LLVivoxVoiceClient::buildSetRenderDevice(std::ostringstream &stream)  	}  } -void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream) +void LLVivoxVoiceClient::sendLocalAudioUpdates()  { -	buildSetCaptureDevice(stream); +	// Check all of the dirty states and then send messages to those needing to be changed. +	// Tuningmode hands its own mute settings. -	buildSetRenderDevice(stream); +	std::ostringstream stream; -	if(mMuteMicDirty) +	if (mMuteMicDirty && !mTuningMode)  	{  		mMuteMicDirty = false;  		// Send a local mute command. -		 -		LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic?"true":"false") << LL_ENDL; + +		LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"  			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" -			<< "<Value>" << (mMuteMic?"true":"false") << "</Value>" +			<< "<Value>" << (mMuteMic ? "true" : "false") << "</Value>"  			<< "</Request>\n\n\n"; -		 +  	} -	if(mSpeakerMuteDirty) +	if (mSpeakerMuteDirty && !mTuningMode)  	{ -	  const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0))?"true":"false"); +		const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0)) ? "true" : "false");  		mSpeakerMuteDirty = false; -		LL_INFOS("Voice") << "Setting speaker mute to " << muteval  << LL_ENDL; -		 +		LL_INFOS("Voice") << "Setting speaker mute to " << muteval << LL_ENDL; +  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalSpeaker.1\">"  			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"  			<< "<Value>" << muteval << "</Value>" -			<< "</Request>\n\n\n";	 -		 +			<< "</Request>\n\n\n"; +  	} -	 -	if(mSpeakerVolumeDirty) + +	if (mSpeakerVolumeDirty)  	{  		mSpeakerVolumeDirty = false; -		LL_INFOS("Voice") << "Setting speaker volume to " << mSpeakerVolume  << LL_ENDL; +		LL_INFOS("Voice") << "Setting speaker volume to " << mSpeakerVolume << LL_ENDL;  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalSpeakerVolume.1\">"  			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"  			<< "<Value>" << mSpeakerVolume << "</Value>"  			<< "</Request>\n\n\n"; -			 +  	} -	 -	if(mMicVolumeDirty) + +	if (mMicVolumeDirty)  	{  		mMicVolumeDirty = false; -		LL_INFOS("Voice") << "Setting mic volume to " << mMicVolume  << LL_ENDL; +		LL_INFOS("Voice") << "Setting mic volume to " << mMicVolume << LL_ENDL;  		stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalMicVolume.1\">"  			<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"  			<< "<Value>" << mMicVolume << "</Value>" -			<< "</Request>\n\n\n";				 +			<< "</Request>\n\n\n";  	} -	 + +	if (!stream.str().empty()) +	{ +		writeString(stream.str()); +	}  }  ///////////////////////////// @@ -2813,16 +2845,28 @@ void LLVivoxVoiceClient::sessionGroupAddSessionResponse(std::string &requestId,  void LLVivoxVoiceClient::sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString)  {  	sessionState *session = findSession(requestId); -	if(statusCode != 0) +	// 1026 is session already has media,  somehow mediaconnect was called twice on the same session. +	// set the session info to reflect that the user is already connected. +	if (statusCode == 1026) +	{ +		session->mVoiceEnabled = true; +		session->mMediaConnectInProgress = false; +		session->mMediaStreamState = streamStateConnected; +		//session->mTextStreamState = streamStateConnected; +		session->mErrorStatusCode = 0; +	} +	else if (statusCode != 0)  	{  		LL_WARNS("Voice") << "Session.Connect response failure (" << statusCode << "): " << statusString << LL_ENDL; -		if(session) +		if (session)  		{  			session->mMediaConnectInProgress = false; -			session->mErrorStatusCode = statusCode;		 +			session->mErrorStatusCode = statusCode;  			session->mErrorStatusString = statusString; -			if(session == mAudioSession) +			if (session == mAudioSession) +			{  				setState(stateJoinSessionFailed); +			}  		}  	}  	else @@ -2961,7 +3005,6 @@ void LLVivoxVoiceClient::joinedAudioSession(sessionState *session)  	{  		setState(stateSessionJoined); -		// SLIM SDK: we don't always receive a participant state change for ourselves when joining a channel now.  		// Add the current user as a participant here.  		participantState *participant = session->addParticipant(sipURIFromName(mAccountName));  		if(participant) @@ -3017,14 +3060,15 @@ void LLVivoxVoiceClient::sessionRemovedEvent(  		// Reset the media state (we now have no info)  		session->mMediaStreamState = streamStateUnknown; -		session->mTextStreamState = streamStateUnknown; +		//session->mTextStreamState = streamStateUnknown;  		// Conditionally delete the session  		reapSession(session);  	}  	else  	{ -		LL_WARNS("Voice") << "unknown session " << sessionHandle << " removed" << LL_ENDL; +		// Already reaped this session. +		LL_DEBUGS("Voice") << "unknown session " << sessionHandle << " removed" << LL_ENDL;  	}  } @@ -3032,11 +3076,8 @@ void LLVivoxVoiceClient::reapSession(sessionState *session)  {  	if(session)  	{ -		if(!session->mHandle.empty()) -		{ -			LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (non-null session handle)" << LL_ENDL; -		} -		else if(session->mCreateInProgress) +		 +		if(session->mCreateInProgress)  		{  			LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (create in progress)" << LL_ENDL;  		} @@ -3054,7 +3095,6 @@ void LLVivoxVoiceClient::reapSession(sessionState *session)  		}  		else  		{ -			// TODO: Question: Should we check for queued text messages here?  			// We don't have a reason to keep tracking this session, so just delete it.  			LL_DEBUGS("Voice") << "deleting session " << session->mSIPURI << LL_ENDL;  			deleteSession(session); @@ -3228,8 +3268,9 @@ void LLVivoxVoiceClient::mediaStreamUpdatedEvent(  		switch(state)  		{ -			case streamStateIdle: -				// Standard "left audio session" +		case streamStateDisconnecting: +		case streamStateIdle: +				// Standard "left audio session", Vivox state 'disconnected'  				session->mVoiceEnabled = false;  				session->mMediaConnectInProgress = false;  				leftAudioSession(session); @@ -3239,6 +3280,7 @@ void LLVivoxVoiceClient::mediaStreamUpdatedEvent(  				session->mVoiceEnabled = true;  				session->mMediaConnectInProgress = false;  				joinedAudioSession(session); +			case streamStateConnecting: // do nothing, but prevents a warning getting into the logs.    			break;  			case streamStateRinging: @@ -3269,54 +3311,8 @@ void LLVivoxVoiceClient::mediaStreamUpdatedEvent(  	}  	else  	{ -		LL_WARNS("Voice") << "session " << sessionHandle << "not found"<< LL_ENDL; -	} -} - -void LLVivoxVoiceClient::textStreamUpdatedEvent( -	std::string &sessionHandle,  -	std::string &sessionGroupHandle,  -	bool enabled, -	int state,  -	bool incoming) -{ -	sessionState *session = findSession(sessionHandle); -	 -	if(session) -	{ -		// Save the state for later use -		session->mTextStreamState = state; -		 -		// We know about this session -		switch(state) -		{ -			case 0:	// We see this when the text stream closes -				LL_DEBUGS("Voice") << "stream closed" << LL_ENDL; -			break; -			 -			case 1:	// We see this on an incoming call from the Connector -				// Try to send any text messages queued for this session. -				sendQueuedTextMessages(session); - -				// Send the text chat invite to the GUI layer -				// TODO: Question: Should we correlate with the mute list here? -				session->mTextInvitePending = true; -				if(session->mName.empty()) -				{ -					lookupName(session->mCallerID); -				} -				else -				{ -					// Act like we just finished resolving the name -					avatarNameResolved(session->mCallerID, session->mName); -				} -			break; - -			default: -				LL_WARNS("Voice") << "unknown state " << state << LL_ENDL; -			break; -			 -		} +		// session disconnectintg and disconnected events arriving after we have already left the session. +		LL_DEBUGS("Voice") << "session " << sessionHandle << " not found"<< LL_ENDL;  	}  } @@ -3390,6 +3386,7 @@ void LLVivoxVoiceClient::participantRemovedEvent(  	}  	else  	{ +		// a late arriving event on a session we have already left.  		LL_DEBUGS("Voice") << "unknown session " << sessionHandle << LL_ENDL;  	}  } @@ -3474,7 +3471,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(  	}  	else  	{ -		LL_INFOS("Voice") << "unknown session " << sessionHandle << LL_ENDL; +		LL_DEBUGS("Voice") << "unknown session " << sessionHandle << LL_ENDL;  	}  } @@ -4185,7 +4182,7 @@ LLVivoxVoiceClient::sessionState* LLVivoxVoiceClient::startUserIMSession(const L  	if(session->mHandle.empty())  	  {  	    // Session isn't active -- start it up. -	    sessionCreateSendMessage(session, false, true); +	    sessionCreateSendMessage(session, false, false);  	  }  	else  	  {	 @@ -4196,59 +4193,6 @@ LLVivoxVoiceClient::sessionState* LLVivoxVoiceClient::startUserIMSession(const L  	return session;  } -BOOL LLVivoxVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message) -{ -	bool result = false; - -	// Attempt to locate the indicated session -	sessionState *session = startUserIMSession(participant_id); -	if(session) -	{ -		// found the session, attempt to send the message -		session->mTextMsgQueue.push(message); -		 -		// Try to send queued messages (will do nothing if the session is not open yet) -		sendQueuedTextMessages(session); - -		// The message is queued, so we succeed. -		result = true; -	}	 -	else -	{ -		LL_DEBUGS("Voice") << "Session not found for participant ID " << participant_id << LL_ENDL; -	} -	 -	return result; -} - -void LLVivoxVoiceClient::sendQueuedTextMessages(sessionState *session) -{ -	if(session->mTextStreamState == 1) -	{ -		if(!session->mTextMsgQueue.empty()) -		{ -			std::ostringstream stream; -			 -			while(!session->mTextMsgQueue.empty()) -			{ -				std::string message = session->mTextMsgQueue.front(); -				session->mTextMsgQueue.pop(); -				stream -				<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SendMessage.1\">" -					<< "<SessionHandle>" << session->mHandle << "</SessionHandle>" -					<< "<MessageHeader>text/HTML</MessageHeader>" -					<< "<MessageBody>" << message << "</MessageBody>" -				<< "</Request>" -				<< "\n\n\n"; -			}		 -			writeString(stream.str()); -		} -	} -	else -	{ -		// Session isn't connected yet, defer until later. -	} -}  void LLVivoxVoiceClient::endUserIMSession(const LLUUID &uuid)  { @@ -4259,7 +4203,7 @@ void LLVivoxVoiceClient::endUserIMSession(const LLUUID &uuid)  		// found the session  		if(!session->mHandle.empty())  		{ -			sessionTextDisconnectSendMessage(session); +			// sessionTextDisconnectSendMessage(session);  // a SLim leftover,  not used any more.  		}  	}	  	else @@ -4610,7 +4554,7 @@ void LLVivoxVoiceClient::enforceTether(void)  void LLVivoxVoiceClient::updatePosition(void)  { -	 +  	LLViewerRegion *region = gAgent.getRegion();  	if(region && isAgentAvatarValid())  	{ @@ -5073,7 +5017,7 @@ void LLVivoxVoiceClient::filePlaybackSetMode(bool vox, float speed)  LLVivoxVoiceClient::sessionState::sessionState() :          mErrorStatusCode(0),  	mMediaStreamState(streamStateUnknown), -	mTextStreamState(streamStateUnknown), +	//mTextStreamState(streamStateUnknown),  	mCreateInProgress(false),  	mMediaConnectInProgress(false),  	mVoiceInvitePending(false), @@ -6669,6 +6613,10 @@ void LLVivoxProtocolParser::EndTag(const char *tag)  			uriString = string;  		else if (!stricmp("Presence", tag))  			statusString = string; +		else if (!stricmp("CaptureDevices", tag)) +			LLVivoxVoiceClient::getInstance()->setDevicesListUpdated(true); +		else if (!stricmp("RenderDevices", tag)) +			LLVivoxVoiceClient::getInstance()->setDevicesListUpdated(true);  		else if (!stricmp("CaptureDevice", tag))  		{  			LLVivoxVoiceClient::getInstance()->addCaptureDevice(deviceString); @@ -6797,7 +6745,13 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  	if (isEvent)  	{  		const char *eventTypeCstr = eventTypeString.c_str(); -		if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent")) +		if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent")) +		{ +			// These happen so often that logging them is pretty useless. +			squelchDebugOutput = true; +			LLVivoxVoiceClient::getInstance()->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy); +		} +		else if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent"))  		{  			LLVivoxVoiceClient::getInstance()->accountLoginStateChangeEvent(accountHandle, statusCode, statusString, state);  		} @@ -6819,6 +6773,10 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  		{  			LLVivoxVoiceClient::getInstance()->sessionRemovedEvent(sessionHandle, sessionGroupHandle);  		} +		else if (!stricmp(eventTypeCstr, "SessionGroupUpdatedEvent")) +		{ +			//nothng useful to process for this event, but we should not WARN that we have received it. +		}  		else if (!stricmp(eventTypeCstr, "SessionGroupAddedEvent"))  		{  			LLVivoxVoiceClient::getInstance()->sessionGroupAddedEvent(sessionGroupHandle); @@ -6847,19 +6805,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  			*/  			LLVivoxVoiceClient::getInstance()->mediaCompletionEvent(sessionGroupHandle, mediaCompletionType);  		} -		else if (!stricmp(eventTypeCstr, "TextStreamUpdatedEvent")) -		{ -			/* -			 <Event type="TextStreamUpdatedEvent"> -			 <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg1</SessionGroupHandle> -			 <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==1</SessionHandle> -			 <Enabled>true</Enabled> -			 <State>1</State> -			 <Incoming>true</Incoming> -			 </Event> -			 */ -			LLVivoxVoiceClient::getInstance()->textStreamUpdatedEvent(sessionHandle, sessionGroupHandle, enabled, state, incoming); -		}  		else if (!stricmp(eventTypeCstr, "ParticipantAddedEvent"))  		{  			/*  @@ -6886,52 +6831,20 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  			 */  			LLVivoxVoiceClient::getInstance()->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString);  		} -		else if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent")) -		{ -			/* -			 <Event type="ParticipantUpdatedEvent"> -			 <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> -			 <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle> -			 <ParticipantUri>sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com</ParticipantUri> -			 <IsModeratorMuted>false</IsModeratorMuted> -			 <IsSpeaking>true</IsSpeaking> -			 <Volume>44</Volume> -			 <Energy>0.0879437</Energy> -			 </Event> -			 */ -			 -			// These happen so often that logging them is pretty useless. -			squelchDebugOutput = true; -			 -			LLVivoxVoiceClient::getInstance()->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy); -		}  		else if (!stricmp(eventTypeCstr, "AuxAudioPropertiesEvent"))  		{  			// These are really spammy in tuning mode  			squelchDebugOutput = true; -  			LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy);  		} -		else if (!stricmp(eventTypeCstr, "BuddyChangedEvent")) -		{ -			/* -			 <Event type="BuddyChangedEvent"> -			 <AccountHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==</AccountHandle> -			 <BuddyURI>sip:x9fFHFZjOTN6OESF1DUPrZQ==@bhr.vivox.com</BuddyURI> -			 <DisplayName>Monroe Tester</DisplayName> -			 <BuddyData /> -			 <GroupID>0</GroupID> -			 <ChangeType>Set</ChangeType> -			 </Event> -			 */		 -			// TODO: Question: Do we need to process this at all? -		}  		else if (!stricmp(eventTypeCstr, "MessageEvent"))    		{ +			//TODO:  This probably is not received any more, it was used to support SLim clients  			LLVivoxVoiceClient::getInstance()->messageEvent(sessionHandle, uriString, alias, messageHeader, messageBody, applicationString);  		}  		else if (!stricmp(eventTypeCstr, "SessionNotificationEvent"))    		{ +			//TODO:  This probably is not received any more, it was used to support SLim clients  			LLVivoxVoiceClient::getInstance()->sessionNotificationEvent(sessionHandle, uriString, notificationType);  		}  		else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent")) @@ -6951,19 +6864,29 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  			 */  			// We don't need to process this, but we also shouldn't warn on it, since that confuses people.  		} -		 -		else if (!stricmp(eventTypeCstr, "SessionGroupRemovedEvent"))   +		else if (!stricmp(eventTypeCstr, "SessionGroupRemovedEvent"))  		{ -			/* -			 <Event type="SessionGroupRemovedEvent"> -			 <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle> -			 </Event> -			 */  			// We don't need to process this, but we also shouldn't warn on it, since that confuses people.  		} -		else if (!stricmp(eventTypeCstr, "VoiceServiceConnectionStateChangedEvent"))   +		else if (!stricmp(eventTypeCstr, "VoiceServiceConnectionStateChangedEvent"))  		{	// Yet another ignored event  		} +		else if (!stricmp(eventTypeCstr, "AudioDeviceHotSwapEvent")) +		{ +			/* +			<Event type = "AudioDeviceHotSwapEvent"> +			<EventType>RenderDeviceChanged< / EventType> +			<RelevantDevice> +			<Device>Speakers(Turtle Beach P11 Headset)< / Device> +			<DisplayName>Speakers(Turtle Beach P11 Headset)< / DisplayName> +			<Type>SpecificDevice< / Type> +			< / RelevantDevice> +			< / Event> +			*/ +			// an audio device was removed or added, fetch and update the local list of audio devices. +			LLVivoxVoiceClient::getInstance()->getCaptureDevicesSendMessage(); +			LLVivoxVoiceClient::getInstance()->getRenderDevicesSendMessage(); +		}  		else  		{  			LL_WARNS("VivoxProtocolParser") << "Unknown event type " << eventTypeString << LL_ENDL; @@ -6972,7 +6895,12 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  	else  	{  		const char *actionCstr = actionString.c_str(); -		if (!stricmp(actionCstr, "Connector.Create.1")) +		if (!stricmp(actionCstr, "Session.Set3DPosition.1")) +		{ +			// We don't need to process these, but they're so spammy we don't want to log them. +			squelchDebugOutput = true; +		} +		else if (!stricmp(actionCstr, "Connector.Create.1"))  		{  			LLVivoxVoiceClient::getInstance()->connectorCreateResponse(statusCode, statusString, connectorHandle, versionID);  		} @@ -7000,11 +6928,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  		{  			LLVivoxVoiceClient::getInstance()->connectorShutdownResponse(statusCode, statusString);			  		} -		else if (!stricmp(actionCstr, "Session.Set3DPosition.1")) -		{ -			// We don't need to process these, but they're so spammy we don't want to log them. -			squelchDebugOutput = true; -		}  		else if (!stricmp(actionCstr, "Account.GetSessionFonts.1"))  		{  			LLVivoxVoiceClient::getInstance()->accountGetSessionFontsResponse(statusCode, statusString); diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index a4ec9f2a69..1b8a45744a 100755 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -91,6 +91,7 @@ public:  	// This returns true when it's safe to bring up the "device settings" dialog in the prefs.  	// i.e. when the daemon is running and connected, and the device lists are populated.  	virtual bool deviceSettingsAvailable(); +	virtual bool deviceSettingsUpdated();  //return if the list has been updated and never fetched,  only to be called from the voicepanel.  	// Requery the vivox daemon for the current list of input/output devices.  	// If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed @@ -109,7 +110,7 @@ public:  	virtual bool isParticipant(const LLUUID& speaker_id);  	// Send a text message to the specified user, initiating the session if necessary. -	virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message); +	// virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message) const {return false;};  	// close any existing text IM session with the specified user  	virtual void endUserIMSession(const LLUUID &uuid); @@ -261,6 +262,8 @@ protected:  		streamStateIdle = 1,  		streamStateConnected = 2,  		streamStateRinging = 3, +		streamStateConnecting = 6,  // same as Vivox session_media_connecting enum +		streamStateDisconnecting = 7,  //Same as Vivox session_media_disconnecting enum  	};	  	struct participantState  	{ @@ -325,7 +328,6 @@ protected:  		LLUUID		mCallerID;  		int			mErrorStatusCode;  		int			mMediaStreamState; -		int			mTextStreamState;  		bool		mCreateInProgress;	// True if a Session.Create has been sent for this session and no response has been received yet.  		bool		mMediaConnectInProgress;	// True if a Session.MediaConnect has been sent for this session and no response has been received yet.  		bool		mVoiceInvitePending;	// True if a voice invite is pending for this session (usually waiting on a name lookup) @@ -457,14 +459,15 @@ protected:  	void clearCaptureDevices();  	void addCaptureDevice(const std::string& name);  	void clearRenderDevices(); +	void setDevicesListUpdated(bool state);  	void addRenderDevice(const std::string& name);	  	void buildSetAudioDevices(std::ostringstream &stream);  	void getCaptureDevicesSendMessage();  	void getRenderDevicesSendMessage(); -	// local audio updates -	void buildLocalAudioUpdates(std::ostringstream &stream);		 +	// local audio updates, mic mute, speaker mute, mic volume and speaker volumes +	void sendLocalAudioUpdates();  	///////////////////////////// @@ -480,7 +483,6 @@ protected:  	void accountLoginStateChangeEvent(std::string &accountHandle, int statusCode, std::string &statusString, int state);  	void mediaCompletionEvent(std::string &sessionGroupHandle, std::string &mediaCompletionType);  	void mediaStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, int statusCode, std::string &statusString, int state, bool incoming); -	void textStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, bool enabled, int state, bool incoming);  	void sessionAddedEvent(std::string &uriString, std::string &alias, std::string &sessionHandle, std::string &sessionGroupHandle, bool isChannel, bool incoming, std::string &nameString, std::string &applicationString);  	void sessionGroupAddedEvent(std::string &sessionGroupHandle);  	void sessionRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle); @@ -596,7 +598,7 @@ protected:  	void sessionTerminateSendMessage(sessionState *session);  	void sessionGroupTerminateSendMessage(sessionState *session);  	void sessionMediaDisconnectSendMessage(sessionState *session); -	void sessionTextDisconnectSendMessage(sessionState *session); +	// void sessionTextDisconnectSendMessage(sessionState *session); @@ -676,7 +678,9 @@ private:  	bool mTuningMicVolumeDirty;  	int mTuningSpeakerVolume;  	bool mTuningSpeakerVolumeDirty; -	state mTuningExitState;					// state to return to when we leave tuning mode. +	state mTuningExitState;			    // state to return to when we leave tuning mode. +	bool mDevicesListUpdated;			// set to true when the device list has been updated +										// and false when the panelvoicedevicesettings has queried for an update status.  	std::string mSpatialSessionURI;  	std::string mSpatialSessionCredentials; @@ -760,7 +764,6 @@ private:  	// start a text IM session with the specified user  	// This will be asynchronous, the session may be established at a future time.  	sessionState* startUserIMSession(const LLUUID& uuid); -	void sendQueuedTextMessages(sessionState *session);  	void enforceTether(void); diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml index 46cbc1e87f..3dbb7fb7fc 100755 --- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -98,7 +98,7 @@       name="My volume label"       top_pad="14"       width="200"> -        My volume: +        Mic volume:      </text>      <slider_bar       control_name="AudioLevelMic" @@ -110,7 +110,7 @@       left_delta="95"       max_val="2"       name="mic_volume_slider" -     tool_tip="Change the volume using this slider" +     tool_tip="Change the mic level using this slider"       top_pad="-18"       width="110" />      <text diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index cae6bded9f..fa80730407 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -400,8 +400,6 @@ class Windows_i686_Manifest(ViewerManifest):              self.path("vivoxsdk.dll")              self.path("ortp.dll")              self.path("libsndfile-1.dll") -            self.path("zlib1.dll") -            self.path("vivoxplatform.dll")              self.path("vivoxoal.dll")              self.path("ca-bundle.crt") | 
