Merged in lindenlab/viewer-release
commit
a50e4c3aee
1
.hgtags
1
.hgtags
|
|
@ -539,3 +539,4 @@ ad0e15543836d64d6399d28b32852510435e344a 5.1.0-release
|
|||
2ea47f358b171178eb9a95503a1670d519c2886f 5.1.5-release
|
||||
04538b8157c1f5cdacd9403f0a395452d4a93689 5.1.6-release
|
||||
ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release
|
||||
23ea0fe36fadf009a60c080392ce80e4bf8af8d9 5.1.8-release
|
||||
|
|
|
|||
|
|
@ -3032,9 +3032,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>b1b0134bc55f55a7c1a04ee78d70c64d</string>
|
||||
<string>a605ec940768c878527d3b8f2ff61288</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12438/73598/slvoice-4.9.0002.27586.511884-darwin64-511884.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/21421/157284/slvoice-4.9.0002.30313.517593-darwin64-517593.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -3068,9 +3068,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>ec50c31efce74bdedee470b5388aeeec</string>
|
||||
<string>5a78539626b5f23522d0b466247f48b4</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12434/73576/slvoice-4.9.0002.27586.511884-windows-511884.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/21422/157291/slvoice-4.9.0002.30313.517593-windows-517593.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -3080,16 +3080,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>4bf45d641bf5b2bd6b2cc39edcb01a6e</string>
|
||||
<string>1f8e09c053c00d9dc44ea74568e63dc1</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/12433/73570/slvoice-4.9.0002.27586.511884-windows64-511884.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/21423/157298/slvoice-4.9.0002.30313.517593-windows64-517593.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>4.9.0002.27586.511884</string>
|
||||
<string>4.9.0002.30313.517593</string>
|
||||
</map>
|
||||
<key>tut</key>
|
||||
<map>
|
||||
|
|
@ -3664,10 +3664,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<map>
|
||||
<key>command</key>
|
||||
<string>xcodebuild</string>
|
||||
<key>filters</key>
|
||||
<array>
|
||||
<string>setenv</string>
|
||||
</array>
|
||||
<key>options</key>
|
||||
<array>
|
||||
<string>-configuration</string>
|
||||
|
|
@ -3724,10 +3720,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<map>
|
||||
<key>command</key>
|
||||
<string>xcodebuild</string>
|
||||
<key>filters</key>
|
||||
<array>
|
||||
<string>setenv</string>
|
||||
</array>
|
||||
<key>options</key>
|
||||
<array>
|
||||
<string>-configuration</string>
|
||||
|
|
|
|||
1
build.sh
1
build.sh
|
|
@ -114,7 +114,6 @@ pre_build()
|
|||
-DRELEASE_CRASH_REPORTING:BOOL="$RELEASE_CRASH_REPORTING" \
|
||||
-DVIEWER_CHANNEL:STRING="${viewer_channel}" \
|
||||
-DGRID:STRING="\"$viewer_grid\"" \
|
||||
-DLL_TESTS:BOOL="$run_tests" \
|
||||
-DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url \
|
||||
"${SIGNING[@]}" \
|
||||
|| fatal "$variant configuration failed"
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
5.1.8
|
||||
5.1.9
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
// Library includes (after viewer)
|
||||
#include "lluictrlfactory.h"
|
||||
|
||||
|
||||
static LLPanelInjector<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings");
|
||||
static const std::string DEFAULT_DEVICE("Default");
|
||||
|
||||
|
|
@ -233,18 +232,18 @@ void LLPanelVoiceDeviceSettings::refresh()
|
|||
}
|
||||
else if (LLVoiceClient::getInstance()->deviceSettingsUpdated())
|
||||
{
|
||||
LLVoiceDeviceList::const_iterator iter;
|
||||
LLVoiceDeviceList::const_iterator device;
|
||||
|
||||
if(mCtrlInputDevices)
|
||||
{
|
||||
mCtrlInputDevices->removeall();
|
||||
mCtrlInputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
|
||||
|
||||
for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin();
|
||||
iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
|
||||
iter++)
|
||||
for(device=LLVoiceClient::getInstance()->getCaptureDevices().begin();
|
||||
device != LLVoiceClient::getInstance()->getCaptureDevices().end();
|
||||
device++)
|
||||
{
|
||||
mCtrlInputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
|
||||
mCtrlInputDevices->add(getLocalizedDeviceName(device->display_name), device->full_name, ADD_BOTTOM);
|
||||
}
|
||||
|
||||
// Fix invalid input audio device preference.
|
||||
|
|
@ -261,10 +260,11 @@ void LLPanelVoiceDeviceSettings::refresh()
|
|||
mCtrlOutputDevices->removeall();
|
||||
mCtrlOutputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
|
||||
|
||||
for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();
|
||||
iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
|
||||
for(device = LLVoiceClient::getInstance()->getRenderDevices().begin();
|
||||
device != LLVoiceClient::getInstance()->getRenderDevices().end();
|
||||
device++)
|
||||
{
|
||||
mCtrlOutputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
|
||||
mCtrlOutputDevices->add(getLocalizedDeviceName(device->display_name), device->full_name, ADD_BOTTOM);
|
||||
}
|
||||
|
||||
// Fix invalid output audio device preference.
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ LLVoiceHandler gVoiceHandler;
|
|||
|
||||
std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserver::EStatusType inStatus)
|
||||
{
|
||||
std::string result = "UNKNOWN";
|
||||
std::string result = "UNTRANSLATED";
|
||||
|
||||
// Prevent copy-paste errors when updating this list...
|
||||
#define CASE(x) case x: result = #x; break
|
||||
|
|
@ -92,12 +92,18 @@ std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserv
|
|||
CASE(STATUS_JOINED);
|
||||
CASE(STATUS_LEFT_CHANNEL);
|
||||
CASE(STATUS_VOICE_DISABLED);
|
||||
CASE(STATUS_VOICE_ENABLED);
|
||||
CASE(BEGIN_ERROR_STATUS);
|
||||
CASE(ERROR_CHANNEL_FULL);
|
||||
CASE(ERROR_CHANNEL_LOCKED);
|
||||
CASE(ERROR_NOT_AVAILABLE);
|
||||
CASE(ERROR_UNKNOWN);
|
||||
default:
|
||||
{
|
||||
std::ostringstream stream;
|
||||
stream << "UNKNOWN(" << (int)inStatus << ")";
|
||||
result = stream.str();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,8 +40,19 @@ class LLVOAvatar;
|
|||
|
||||
// devices
|
||||
|
||||
typedef std::vector<std::string> LLVoiceDeviceList;
|
||||
class LLVoiceDevice
|
||||
{
|
||||
public:
|
||||
std::string display_name; // friendly value for the user
|
||||
std::string full_name; // internal value for selection
|
||||
|
||||
LLVoiceDevice(const std::string& display_name, const std::string& full_name)
|
||||
:display_name(display_name)
|
||||
,full_name(full_name)
|
||||
{
|
||||
};
|
||||
};
|
||||
typedef std::vector<LLVoiceDevice> LLVoiceDeviceList;
|
||||
|
||||
class LLVoiceClientParticipantObserver
|
||||
{
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ namespace {
|
|||
const int CONNECT_RETRY_MAX = 3;
|
||||
|
||||
const F32 LOGIN_ATTEMPT_TIMEOUT = 30.0f;
|
||||
const F32 LOGOUT_ATTEMPT_TIMEOUT = 5.0f;
|
||||
const int LOGIN_RETRY_MAX = 3;
|
||||
|
||||
const F32 PROVISION_RETRY_TIMEOUT = 2.0;
|
||||
|
|
@ -259,9 +260,16 @@ static void killGateway()
|
|||
{
|
||||
if (sGatewayPtr)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "SLVoice " << sGatewayPtr->getStatusString() << LL_ENDL;
|
||||
|
||||
sGatewayPump.stopListening("VivoxDaemonPump");
|
||||
sGatewayPtr->kill();
|
||||
sGatewayPtr->kill(__FUNCTION__);
|
||||
sGatewayPtr=NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice") << "no gateway" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -283,7 +291,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
|
|||
mDevicesListUpdated(false),
|
||||
|
||||
mAreaVoiceDisabled(false),
|
||||
mAudioSession(),
|
||||
mAudioSession(), // TBD - should be NULL
|
||||
mAudioSessionChanged(false),
|
||||
mNextAudioSession(),
|
||||
|
||||
|
|
@ -416,6 +424,7 @@ void LLVivoxVoiceClient::cleanUp()
|
|||
deleteAllSessions();
|
||||
deleteAllVoiceFonts();
|
||||
deleteVoiceFontTemplates();
|
||||
LL_DEBUGS("Voice") << "exiting" << LL_ENDL;
|
||||
}
|
||||
|
||||
//---------------------------------------------------
|
||||
|
|
@ -645,18 +654,18 @@ void LLVivoxVoiceClient::idle(void* user_data)
|
|||
//
|
||||
void LLVivoxVoiceClient::voiceControlCoro()
|
||||
{
|
||||
LL_DEBUGS("Voice") << "starting" << LL_ENDL;
|
||||
mIsCoroutineActive = true;
|
||||
LLCoros::set_consuming(true);
|
||||
|
||||
while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
|
||||
{
|
||||
LL_INFOS("Voice") << "Suspending voiceControlCoro() due to teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
|
||||
LL_DEBUGS("Voice") << "Suspending voiceControlCoro() momentarily for teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL;
|
||||
llcoro::suspendUntilTimeout(1.0);
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
|
||||
if (startAndConnectSession())
|
||||
{
|
||||
if (mTuningMode)
|
||||
|
|
@ -666,6 +675,7 @@ void LLVivoxVoiceClient::voiceControlCoro()
|
|||
|
||||
waitForChannel(); // this doesn't normally return unless relog is needed or shutting down
|
||||
|
||||
LL_DEBUGS("Voice") << "lost channel RelogRequested=" << mRelogRequested << LL_ENDL;
|
||||
endAndDisconnectSession();
|
||||
}
|
||||
|
||||
|
|
@ -673,16 +683,23 @@ void LLVivoxVoiceClient::voiceControlCoro()
|
|||
// that we attempted to relog into Vivox and were rejected.
|
||||
// Rather than just quit out of voice, we will tear it down (above)
|
||||
// and then reconstruct the voice connecion from scratch.
|
||||
LL_DEBUGS("Voice")
|
||||
<< "disconnected"
|
||||
<< " RelogRequested=" << mRelogRequested
|
||||
<< LL_ENDL;
|
||||
if (mRelogRequested)
|
||||
{
|
||||
LL_INFOS("Voice") << "will attempt to reconnect to voice" << LL_ENDL;
|
||||
while (isGatewayRunning() || gAgent.getTeleportState() != LLAgent::TELEPORT_NONE)
|
||||
{
|
||||
LL_INFOS("Voice") << "waiting for SLVoice to exit" << LL_ENDL;
|
||||
llcoro::suspendUntilTimeout(1.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
while (mRelogRequested);
|
||||
while (mVoiceEnabled && mRelogRequested);
|
||||
mIsCoroutineActive = false;
|
||||
LL_INFOS("Voice") << "exiting" << LL_ENDL;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -714,6 +731,8 @@ bool LLVivoxVoiceClient::startAndConnectSession()
|
|||
|
||||
bool LLVivoxVoiceClient::endAndDisconnectSession()
|
||||
{
|
||||
LL_DEBUGS("Voice") << LL_ENDL;
|
||||
|
||||
breakVoiceConnection(true);
|
||||
|
||||
killGateway();
|
||||
|
|
@ -723,13 +742,15 @@ bool LLVivoxVoiceClient::endAndDisconnectSession()
|
|||
|
||||
bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data)
|
||||
{
|
||||
if (!LLAppViewer::isExiting())
|
||||
if (!LLAppViewer::isExiting() && mVoiceEnabled)
|
||||
{
|
||||
LL_WARNS("Voice") << "SLVoice terminated " << ll_stream_notation_sd(data) << LL_ENDL;
|
||||
terminateAudioSession(false);
|
||||
closeSocket();
|
||||
cleanUp();
|
||||
LLVoiceClient::getInstance()->setUserPTTState(false);
|
||||
gAgent.setVoiceConnected(false);
|
||||
mRelogRequested = true;
|
||||
}
|
||||
sGatewayPump.stopListening("VivoxDaemonPump");
|
||||
return false;
|
||||
|
|
@ -741,6 +762,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
|
|||
if (!voiceEnabled())
|
||||
{
|
||||
// Voice is locked out, we must not launch the vivox daemon.
|
||||
LL_WARNS("Voice") << "voice disabled; not starting daemon" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -748,11 +770,6 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
|
|||
{
|
||||
#ifndef VIVOXDAEMON_REMOTEHOST
|
||||
// Launch the voice daemon
|
||||
|
||||
// *FIX:Mani - Using the executable dir instead
|
||||
// of mAppRODataDir, the working directory from which the app
|
||||
// is launched.
|
||||
//std::string exe_path = gDirUtilp->getAppRODataDir();
|
||||
std::string exe_path = gDirUtilp->getExecutableDir();
|
||||
exe_path += gDirUtilp->getDirDelimiter();
|
||||
#if LL_WINDOWS
|
||||
|
|
@ -807,13 +824,16 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
|
|||
params.postend = sGatewayPump.getName();
|
||||
sGatewayPump.listen("VivoxDaemonPump", boost::bind(&LLVivoxVoiceClient::callbackEndDaemon, this, _1));
|
||||
|
||||
LL_INFOS("Voice") << "Launching SLVoice" << LL_ENDL;
|
||||
LL_DEBUGS("Voice") << "SLVoice params " << params << LL_ENDL;
|
||||
|
||||
sGatewayPtr = LLProcess::create(params);
|
||||
|
||||
mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL;
|
||||
LL_WARNS("Voice") << exe_path << " not found." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
|
|
@ -836,6 +856,10 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
|
|||
|
||||
mMainSessionGroupHandle.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice") << " gateway running; not attempting to start" << LL_ENDL;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
|
||||
|
|
@ -900,12 +924,15 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
|
|||
|
||||
while (!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived())
|
||||
{
|
||||
LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL;
|
||||
// *TODO* Pump a message for wake up.
|
||||
llcoro::suspend();
|
||||
}
|
||||
|
||||
std::string url = gAgent.getRegionCapability("ProvisionVoiceAccountRequest");
|
||||
|
||||
LL_DEBUGS("Voice") << "region ready for voice provisioning; url=" << url << LL_ENDL;
|
||||
|
||||
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
|
||||
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("voiceAccountProvision", httpPolicy));
|
||||
|
|
@ -953,14 +980,23 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
|
|||
std::string voiceUserName = result["username"].asString();
|
||||
std::string voicePassword = result["password"].asString();
|
||||
|
||||
//LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response:" << dumpResponse() << LL_ENDL;
|
||||
|
||||
if (result.has("voice_sip_uri_hostname"))
|
||||
{
|
||||
voiceSipUriHostname = result["voice_sip_uri_hostname"].asString();
|
||||
|
||||
}
|
||||
|
||||
// this key is actually misnamed -- it will be an entire URI, not just a hostname.
|
||||
if (result.has("voice_account_server_name"))
|
||||
{
|
||||
voiceAccountServerUri = result["voice_account_server_name"].asString();
|
||||
}
|
||||
|
||||
LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response"
|
||||
<< " user " << (voiceUserName.empty() ? "not set" : "set")
|
||||
<< " password " << (voicePassword.empty() ? "not set" : "set")
|
||||
<< " sip uri " << voiceSipUriHostname
|
||||
<< " account uri " << voiceAccountServerUri
|
||||
<< LL_ENDL;
|
||||
|
||||
setLoginInfo(voiceUserName, voicePassword, voiceSipUriHostname, voiceAccountServerUri);
|
||||
|
||||
|
|
@ -972,8 +1008,11 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
|
|||
LLEventPump &voiceConnectPump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
|
||||
if (!mVoiceEnabled && mIsInitialized)
|
||||
{
|
||||
LL_WARNS("Voice") << "cannot establish connection; enabled "<<mVoiceEnabled<<" initialized "<<mIsInitialized<<LL_ENDL;
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
LLSD result;
|
||||
bool connected(false);
|
||||
bool giving_up(false);
|
||||
|
|
@ -1035,7 +1074,7 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
|
|||
|
||||
bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
|
||||
{
|
||||
LL_DEBUGS("Voice") << LL_ENDL;
|
||||
LL_DEBUGS("Voice") << "( wait=" << corowait << ")" << LL_ENDL;
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
bool retval(true);
|
||||
|
||||
|
|
@ -1044,7 +1083,9 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
|
|||
|
||||
if (corowait)
|
||||
{
|
||||
LLSD result = llcoro::suspendUntilEventOn(voicePump);
|
||||
LLSD timeoutResult(LLSDMap("connector", "timeout"));
|
||||
|
||||
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
|
||||
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
|
||||
|
||||
retval = result.has("connector");
|
||||
|
|
@ -1073,6 +1114,7 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
|
|||
#endif
|
||||
}
|
||||
|
||||
LL_DEBUGS("Voice") << "closing SLVoice socket" << LL_ENDL;
|
||||
closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
|
||||
cleanUp();
|
||||
mConnected = false;
|
||||
|
|
@ -1174,31 +1216,35 @@ bool LLVivoxVoiceClient::loginToVivox()
|
|||
|
||||
void LLVivoxVoiceClient::logoutOfVivox(bool wait)
|
||||
{
|
||||
|
||||
if (!mIsLoggedIn)
|
||||
return;
|
||||
|
||||
// Ensure that we'll re-request provisioning before logging in again
|
||||
mAccountPassword.clear();
|
||||
mVoiceAccountServerURI.clear();
|
||||
|
||||
logoutSendMessage();
|
||||
|
||||
if (wait)
|
||||
if (mIsLoggedIn)
|
||||
{
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
LLSD timeoutResult(LLSDMap("lougout", "timeout"));
|
||||
// Ensure that we'll re-request provisioning before logging in again
|
||||
mAccountPassword.clear();
|
||||
mVoiceAccountServerURI.clear();
|
||||
|
||||
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
|
||||
logoutSendMessage();
|
||||
|
||||
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
|
||||
|
||||
if (result.has("logout"))
|
||||
if (wait)
|
||||
{
|
||||
}
|
||||
}
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
LLSD timeoutResult(LLSDMap("logout", "timeout"));
|
||||
|
||||
mIsLoggedIn = false;
|
||||
LL_DEBUGS("Voice")
|
||||
<< "waiting for logout response on "
|
||||
<< voicePump.getName()
|
||||
<< LL_ENDL;
|
||||
|
||||
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
|
||||
|
||||
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice") << "not waiting for logout" << LL_ENDL;
|
||||
}
|
||||
|
||||
mIsLoggedIn = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1269,6 +1315,10 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo()
|
|||
// state. If the cap request is still pending,
|
||||
// the responder will check to see if we've moved
|
||||
// to a new session and won't change any state.
|
||||
LL_DEBUGS("Voice") << "terminate requested " << mSessionTerminateRequested
|
||||
<< " enabled " << mVoiceEnabled
|
||||
<< " initialized " << mIsInitialized
|
||||
<< LL_ENDL;
|
||||
terminateAudioSession(true);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1293,17 +1343,30 @@ bool LLVivoxVoiceClient::requestParcelVoiceInfo()
|
|||
LLSD voice_credentials = result["voice_credentials"];
|
||||
if (voice_credentials.has("channel_uri"))
|
||||
{
|
||||
LL_DEBUGS("Voice") << "got voice channel uri" << LL_ENDL;
|
||||
uri = voice_credentials["channel_uri"].asString();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Voice") << "No voice channel uri" << LL_ENDL;
|
||||
}
|
||||
|
||||
if (voice_credentials.has("channel_credentials"))
|
||||
{
|
||||
LL_DEBUGS("Voice") << "got voice channel credentials" << LL_ENDL;
|
||||
credentials =
|
||||
voice_credentials["channel_credentials"].asString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Voice") << "No voice channel credentials" << LL_ENDL;
|
||||
|
||||
if (!uri.empty())
|
||||
LL_INFOS("Voice") << "Voice URI is " << uri << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Voice") << "No voice credentials" << LL_ENDL;
|
||||
}
|
||||
|
||||
// set the spatial channel. If no voice credentials or uri are
|
||||
// available, then we simply drop out of voice spatially.
|
||||
|
|
@ -1366,7 +1429,10 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
|
|||
|
||||
if (!mVoiceEnabled && mIsInitialized)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting." << LL_ENDL;
|
||||
LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting"
|
||||
<< " enabled " << mVoiceEnabled
|
||||
<< " initialized " << mIsInitialized
|
||||
<< LL_ENDL;
|
||||
mIsJoiningSession = false;
|
||||
// User bailed out during connect -- jump straight to teardown.
|
||||
terminateAudioSession(true);
|
||||
|
|
@ -1489,7 +1555,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
|
|||
|
||||
if (mAudioSession)
|
||||
{
|
||||
LL_INFOS("Voice") << "Terminating current voice session " << mAudioSession->mHandle << LL_ENDL;
|
||||
LL_INFOS("Voice") << "terminateAudioSession(" << wait << ") Terminating current voice session " << mAudioSession->mHandle << LL_ENDL;
|
||||
|
||||
if (mIsLoggedIn)
|
||||
{
|
||||
|
|
@ -1519,7 +1585,9 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
|
|||
LLSD result;
|
||||
do
|
||||
{
|
||||
result = llcoro::suspendUntilEventOn(voicePump);
|
||||
LLSD timeoutResult(LLSDMap("session", "timeout"));
|
||||
|
||||
result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGOUT_ATTEMPT_TIMEOUT, timeoutResult);
|
||||
|
||||
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
|
||||
if (result.has("session"))
|
||||
|
|
@ -1534,7 +1602,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
|
|||
}
|
||||
|
||||
std::string message = result["session"].asString();
|
||||
if (message == "removed")
|
||||
if (message == "removed" || message == "timeout")
|
||||
break;
|
||||
}
|
||||
} while (true);
|
||||
|
|
@ -1559,11 +1627,10 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
|
|||
|
||||
// The old session may now need to be deleted.
|
||||
reapSession(oldSession);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Voice") << "stateSessionTerminated with NULL mAudioSession" << LL_ENDL;
|
||||
LL_WARNS("Voice") << "terminateAudioSession(" << wait << ") with NULL mAudioSession" << LL_ENDL;
|
||||
}
|
||||
|
||||
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
|
||||
|
|
@ -1573,13 +1640,15 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
|
|||
// the region chat.
|
||||
mSessionTerminateRequested = false;
|
||||
|
||||
if ((mVoiceEnabled || !mIsInitialized) && !mRelogRequested && !LLApp::isExiting())
|
||||
{
|
||||
// Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state).
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
bool status=((mVoiceEnabled || !mIsInitialized) && !mRelogRequested && !LLApp::isExiting());
|
||||
LL_DEBUGS("Voice") << "exiting"
|
||||
<< " VoiceEnabled " << mVoiceEnabled
|
||||
<< " IsInitialized " << mIsInitialized
|
||||
<< " RelogRequested " << mRelogRequested
|
||||
<< " AppExiting " << LLApp::isExiting()
|
||||
<< " returning " << status
|
||||
<< LL_ENDL;
|
||||
return status;
|
||||
}
|
||||
|
||||
bool LLVivoxVoiceClient::waitForChannel()
|
||||
|
|
@ -1640,7 +1709,18 @@ bool LLVivoxVoiceClient::waitForChannel()
|
|||
sessionStatePtr_t joinSession = mNextAudioSession;
|
||||
mNextAudioSession.reset();
|
||||
if (!runSession(joinSession))
|
||||
{
|
||||
LL_DEBUGS("Voice") << "runSession returned false; leaving inner loop" << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice")
|
||||
<< "runSession returned true to inner loop"
|
||||
<< " RelogRequested=" << mRelogRequested
|
||||
<< " VoiceEnabled=" << mVoiceEnabled
|
||||
<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mNextAudioSession)
|
||||
|
|
@ -1649,20 +1729,33 @@ bool LLVivoxVoiceClient::waitForChannel()
|
|||
}
|
||||
} while (mVoiceEnabled && !mRelogRequested);
|
||||
|
||||
LL_DEBUGS("Voice")
|
||||
<< "leaving inner waitForChannel loop"
|
||||
<< " RelogRequested=" << mRelogRequested
|
||||
<< " VoiceEnabled=" << mVoiceEnabled
|
||||
<< LL_ENDL;
|
||||
|
||||
mIsProcessingChannels = false;
|
||||
|
||||
logoutOfVivox(true);
|
||||
|
||||
if (mRelogRequested)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Relog Requested, restarting provisioning" << LL_ENDL;
|
||||
if (!provisionVoiceAccount())
|
||||
{
|
||||
LL_WARNS("Voice") << "provisioning voice failed; giving up" << LL_ENDL;
|
||||
giveUp();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (mVoiceEnabled && mRelogRequested);
|
||||
} while (mVoiceEnabled && mRelogRequested && isGatewayRunning());
|
||||
|
||||
LL_DEBUGS("Voice")
|
||||
<< "exiting"
|
||||
<< " RelogRequested=" << mRelogRequested
|
||||
<< " VoiceEnabled=" << mVoiceEnabled
|
||||
<< LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1676,6 +1769,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
|||
|
||||
if (mSessionTerminateRequested)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "runSession terminate requested " << LL_ENDL;
|
||||
terminateAudioSession(true);
|
||||
}
|
||||
// if a relog has been requested then addAndJoineSession
|
||||
|
|
@ -1694,7 +1788,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
|||
mIsInChannel = true;
|
||||
mMuteMicDirty = true;
|
||||
|
||||
while (mVoiceEnabled && !mSessionTerminateRequested && !mTuningMode)
|
||||
while (mVoiceEnabled && isGatewayRunning() && !mSessionTerminateRequested && !mTuningMode)
|
||||
{
|
||||
sendCaptureAndRenderDevices();
|
||||
if (mAudioSession && mAudioSession->mParticipantsChanged)
|
||||
|
|
@ -1744,7 +1838,9 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
|||
mIsInitialized = true;
|
||||
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, UPDATE_THROTTLE_SECONDS, timeoutEvent);
|
||||
if (!result.has("timeout")) // logging the timeout event spams the log
|
||||
{
|
||||
LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
|
||||
}
|
||||
if (result.has("session"))
|
||||
{
|
||||
if (result.has("handle"))
|
||||
|
|
@ -1765,6 +1861,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
|||
|
||||
if (message == "removed")
|
||||
{
|
||||
LL_DEBUGS("Voice") << "session removed" << LL_ENDL;
|
||||
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
|
||||
break;
|
||||
}
|
||||
|
|
@ -1774,15 +1871,16 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
|||
std::string message = result["login"];
|
||||
if (message == "account_logout")
|
||||
{
|
||||
LL_DEBUGS("Voice") << "logged out" << LL_ENDL;
|
||||
mIsLoggedIn = false;
|
||||
mRelogRequested = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mIsInChannel = false;
|
||||
LL_DEBUGS("Voice") << "terminating at end of runSession" << LL_ENDL;
|
||||
terminateAudioSession(true);
|
||||
|
||||
return true;
|
||||
|
|
@ -1978,6 +2076,7 @@ bool LLVivoxVoiceClient::performMicTuning()
|
|||
|
||||
if (mTuningSpeakerVolumeDirty)
|
||||
{
|
||||
LL_INFOS("Voice") << "setting tuning speaker level to " << mTuningSpeakerVolume << LL_ENDL;
|
||||
stream
|
||||
<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetSpeakerLevel.1\">"
|
||||
<< "<Level>" << mTuningSpeakerVolume << "</Level>"
|
||||
|
|
@ -2335,11 +2434,10 @@ void LLVivoxVoiceClient::clearCaptureDevices()
|
|||
mCaptureDevices.clear();
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::addCaptureDevice(const std::string& name)
|
||||
void LLVivoxVoiceClient::addCaptureDevice(const LLVoiceDevice& device)
|
||||
{
|
||||
LL_DEBUGS("Voice") << name << LL_ENDL;
|
||||
|
||||
mCaptureDevices.push_back(name);
|
||||
LL_DEBUGS("Voice") << "display: '" << device.display_name << "' device: '" << device.full_name << "'" << LL_ENDL;
|
||||
mCaptureDevices.push_back(device);
|
||||
}
|
||||
|
||||
LLVoiceDeviceList& LLVivoxVoiceClient::getCaptureDevices()
|
||||
|
|
@ -2377,10 +2475,10 @@ void LLVivoxVoiceClient::clearRenderDevices()
|
|||
mRenderDevices.clear();
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::addRenderDevice(const std::string& name)
|
||||
void LLVivoxVoiceClient::addRenderDevice(const LLVoiceDevice& device)
|
||||
{
|
||||
LL_DEBUGS("Voice") << name << LL_ENDL;
|
||||
mRenderDevices.push_back(name);
|
||||
LL_DEBUGS("Voice") << "display: '" << device.display_name << "' device: '" << device.full_name << "'" << LL_ENDL;
|
||||
mRenderDevices.push_back(device);
|
||||
}
|
||||
|
||||
LLVoiceDeviceList& LLVivoxVoiceClient::getRenderDevices()
|
||||
|
|
@ -2528,13 +2626,13 @@ bool LLVivoxVoiceClient::deviceSettingsAvailable()
|
|||
}
|
||||
bool LLVivoxVoiceClient::deviceSettingsUpdated()
|
||||
{
|
||||
bool updated = mDevicesListUpdated;
|
||||
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;
|
||||
mDevicesListUpdated = false; // toggle the setting
|
||||
}
|
||||
return false;
|
||||
return updated;
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::refreshDeviceLists(bool clearCurrentList)
|
||||
|
|
@ -2553,8 +2651,7 @@ void LLVivoxVoiceClient::daemonDied()
|
|||
// The daemon died, so the connection is gone. Reset everything and start over.
|
||||
LL_WARNS("Voice") << "Connection to vivox daemon lost. Resetting state."<< LL_ENDL;
|
||||
|
||||
// Try to relaunch the daemon
|
||||
/*TODO:*/
|
||||
//TODO: Try to relaunch the daemon
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::giveUp()
|
||||
|
|
@ -2915,7 +3012,6 @@ void LLVivoxVoiceClient::sendPositionAndVolumeUpdate(void)
|
|||
}
|
||||
}
|
||||
|
||||
//sendLocalAudioUpdates(); obsolete, used to send volume setting on position updates
|
||||
std::string update(stream.str());
|
||||
if(!update.empty())
|
||||
{
|
||||
|
|
@ -2960,7 +3056,6 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()
|
|||
{
|
||||
// Check all of the dirty states and then send messages to those needing to be changed.
|
||||
// Tuningmode hands its own mute settings.
|
||||
|
||||
std::ostringstream stream;
|
||||
|
||||
if (mMuteMicDirty && !mTuningMode)
|
||||
|
|
@ -2969,7 +3064,7 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()
|
|||
|
||||
// Send a local mute command.
|
||||
|
||||
LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;
|
||||
LL_INFOS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic ? "true" : "false") << LL_ENDL;
|
||||
|
||||
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
|
||||
<< "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"
|
||||
|
|
@ -3231,8 +3326,6 @@ void LLVivoxVoiceClient::sessionConnectResponse(std::string &requestId, int stat
|
|||
{
|
||||
LL_DEBUGS("Voice") << "Session.Connect response received (success)" << LL_ENDL;
|
||||
}
|
||||
|
||||
/*TODO: Post response?*/
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::logoutResponse(int statusCode, std::string &statusString)
|
||||
|
|
@ -4037,7 +4130,7 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
|
|||
|
||||
void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;
|
||||
LL_DEBUGS("VoiceEnergy") << "got energy " << energy << LL_ENDL;
|
||||
mTuningEnergy = energy;
|
||||
}
|
||||
|
||||
|
|
@ -4989,6 +5082,12 @@ void LLVivoxVoiceClient::setMuteMic(bool muted)
|
|||
|
||||
void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
|
||||
{
|
||||
LL_DEBUGS("Voice")
|
||||
<< "( " << (enabled ? "enabled" : "disabled") << " )"
|
||||
<< " was "<< (mVoiceEnabled ? "enabled" : "disabled")
|
||||
<< " coro "<< (mIsCoroutineActive ? "active" : "inactive")
|
||||
<< LL_ENDL;
|
||||
|
||||
if (enabled != mVoiceEnabled)
|
||||
{
|
||||
// TODO: Refactor this so we don't call into LLVoiceChannel, but simply
|
||||
|
|
@ -4998,6 +5097,7 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
|
|||
|
||||
if (enabled)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "enabling" << LL_ENDL;
|
||||
LLVoiceChannel::getCurrentVoiceChannel()->activate();
|
||||
status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED;
|
||||
|
||||
|
|
@ -5005,6 +5105,10 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
|
|||
{
|
||||
LLCoros::instance().launch("LLVivoxVoiceClient::voiceControlCoro();",
|
||||
boost::bind(&LLVivoxVoiceClient::voiceControlCoro, LLVivoxVoiceClient::getInstance()));
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice") << "coro should be active.. not launching" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -5013,8 +5117,13 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
|
|||
LLVoiceChannel::getCurrentVoiceChannel()->deactivate();
|
||||
status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED;
|
||||
}
|
||||
notifyStatusObservers(status);
|
||||
|
||||
notifyStatusObservers(status);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("Voice") << " no-op" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
bool LLVivoxVoiceClient::voiceEnabled()
|
||||
|
|
@ -5718,7 +5827,7 @@ void LLVivoxVoiceClient::deleteSession(const sessionStatePtr_t &session)
|
|||
|
||||
void LLVivoxVoiceClient::deleteAllSessions()
|
||||
{
|
||||
LL_DEBUGS("Voice") << "called" << LL_ENDL;
|
||||
LL_DEBUGS("Voice") << LL_ENDL;
|
||||
|
||||
while (!mSessionsByHandle.empty())
|
||||
{
|
||||
|
|
@ -5769,6 +5878,10 @@ void LLVivoxVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
|
|||
|
||||
void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "( " << LLVoiceClientStatusObserver::status2string(status) << " )"
|
||||
<< " mAudioSession=" << mAudioSession
|
||||
<< LL_ENDL;
|
||||
|
||||
if(mAudioSession)
|
||||
{
|
||||
if(status == LLVoiceClientStatusObserver::ERROR_UNKNOWN)
|
||||
|
|
@ -5813,8 +5926,8 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta
|
|||
LL_DEBUGS("Voice")
|
||||
<< " " << LLVoiceClientStatusObserver::status2string(status)
|
||||
<< ", session URI " << getAudioSessionURI()
|
||||
<< (inSpatialChannel()?", proximal is true":", proximal is false")
|
||||
<< LL_ENDL;
|
||||
<< ", proximal is " << inSpatialChannel()
|
||||
<< LL_ENDL;
|
||||
|
||||
for (status_observer_set_t::iterator it = mStatusObservers.begin();
|
||||
it != mStatusObservers.end();
|
||||
|
|
@ -7022,16 +7135,20 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
|
|||
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);
|
||||
LLVivoxVoiceClient::getInstance()->addCaptureDevice(LLVoiceDevice(displayNameString, deviceString));
|
||||
}
|
||||
else if (!stricmp("RenderDevice", tag))
|
||||
{
|
||||
LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString);
|
||||
LLVivoxVoiceClient::getInstance()->addRenderDevice(LLVoiceDevice(displayNameString, deviceString));
|
||||
}
|
||||
else if (!stricmp("BlockMask", tag))
|
||||
blockMask = string;
|
||||
|
|
|
|||
|
|
@ -432,10 +432,10 @@ protected:
|
|||
//----------------------------------
|
||||
// devices
|
||||
void clearCaptureDevices();
|
||||
void addCaptureDevice(const std::string& name);
|
||||
void addCaptureDevice(const LLVoiceDevice& device);
|
||||
void clearRenderDevices();
|
||||
void setDevicesListUpdated(bool state);
|
||||
void addRenderDevice(const std::string& name);
|
||||
void addRenderDevice(const LLVoiceDevice& device);
|
||||
void buildSetAudioDevices(std::ostringstream &stream);
|
||||
|
||||
void getCaptureDevicesSendMessage();
|
||||
|
|
|
|||
Loading…
Reference in New Issue