master
Richard Nelson 2010-09-27 09:46:20 -07:00
commit ad440a68bb
19 changed files with 356 additions and 312 deletions

View File

@ -183,5 +183,9 @@ viewer-tut-teamcity.email = enus@lindenlab.com
viewer-tut-teamcity.build_server = false
viewer-tut-teamcity.build_server_tests = false
# ========================================
# experience
# ========================================
viewer-experience.public_build = false
# eof

View File

@ -3066,7 +3066,10 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask)
mAltKeyTrigger = FALSE;
}
if(!result && (key == KEY_F10 && mask == MASK_CONTROL) && !gKeyboard->getKeyRepeated(key))
if(!result
&& (key == KEY_F10 && mask == MASK_CONTROL)
&& !gKeyboard->getKeyRepeated(key)
&& isInVisibleChain())
{
if (getHighlightedItem())
{

View File

@ -133,12 +133,6 @@ private:
bool filterIgnoredNotifications(LLNotificationPtr notification)
{
// filter everything if we are to ignore ALL
if(LLNotifications::instance().getIgnoreAllNotifications())
{
return false;
}
LLNotificationFormPtr form = notification->getForm();
// Check to see if the user wants to ignore this alert
return !notification->getForm()->getIgnored();
@ -173,6 +167,20 @@ bool handleIgnoredNotification(const LLSD& payload)
return false;
}
bool defaultResponse(const LLSD& payload)
{
if (payload["sigtype"].asString() == "add")
{
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
if (pNotif)
{
// supply default response
pNotif->respond(pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON));
}
}
return false;
}
namespace LLNotificationFilters
{
// a sample filter
@ -1187,9 +1195,11 @@ void LLNotifications::createDefaultChannels()
{
// now construct the various channels AFTER loading the notifications,
// because the history channel is going to rewrite the stored notifications file
LLNotificationChannel::buildChannel("Expiration", "",
LLNotificationChannel::buildChannel("Enabled", "",
!boost::bind(&LLNotifications::getIgnoreAllNotifications, this));
LLNotificationChannel::buildChannel("Expiration", "Enabled",
boost::bind(&LLNotifications::expirationFilter, this, _1));
LLNotificationChannel::buildChannel("Unexpired", "",
LLNotificationChannel::buildChannel("Unexpired", "Enabled",
!boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind
LLNotificationChannel::buildChannel("Unique", "Unexpired",
boost::bind(&LLNotifications::uniqueFilter, this, _1));
@ -1203,6 +1213,8 @@ void LLNotifications::createDefaultChannels()
new LLPersistentNotificationChannel();
// connect action methods to these channels
LLNotifications::instance().getChannel("Enabled")->
connectFailedFilter(&defaultResponse);
LLNotifications::instance().getChannel("Expiration")->
connectChanged(boost::bind(&LLNotifications::expirationHandler, this, _1));
// uniqueHandler slot should be added as first slot of the signal due to

View File

@ -163,8 +163,6 @@ LLView::~LLView()
if (mDefaultWidgets)
{
std::for_each(mDefaultWidgets->begin(), mDefaultWidgets->end(),
DeletePairedPointer());
delete mDefaultWidgets;
mDefaultWidgets = NULL;
}
@ -1682,18 +1680,7 @@ BOOL LLView::hasChild(const std::string& childname, BOOL recurse) const
//-----------------------------------------------------------------------------
LLView* LLView::getChildView(const std::string& name, BOOL recurse) const
{
LLView* child = findChildView(name, recurse);
if (!child)
{
child = getDefaultWidget<LLView>(name);
if (!child)
{
LLView::Params view_params;
view_params.name = name;
child = LLUICtrlFactory::create<LLView>(view_params);
}
}
return child;
return getChild<LLView>(name, recurse);
}
static LLFastTimer::DeclareTimer FTM_FIND_VIEWS("Find Widgets");
@ -2804,11 +2791,14 @@ LLView::root_to_view_iterator_t LLView::endRootToView()
// only create maps on demand, as they incur heap allocation/deallocation cost
// when a view is constructed/deconstructed
LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const
LLView& LLView::getDefaultWidgetContainer() const
{
if (!mDefaultWidgets)
{
mDefaultWidgets = new default_widget_map_t();
LLView::Params p;
p.name = "default widget container";
p.visible = false; // ensures default widgets can't steal focus, etc.
mDefaultWidgets = new LLView(p);
}
return *mDefaultWidgets;
}

View File

@ -461,12 +461,8 @@ public:
template <class T> T* getDefaultWidget(const std::string& name) const
{
default_widget_map_t::const_iterator found_it = getDefaultWidgetMap().find(name);
if (found_it == getDefaultWidgetMap().end())
{
return NULL;
}
return dynamic_cast<T*>(found_it->second);
LLView* widgetp = getDefaultWidgetContainer().findChildView(name);
return dynamic_cast<T*>(widgetp);
}
//////////////////////////////////////////////
@ -580,9 +576,9 @@ private:
typedef std::map<std::string, LLView*> default_widget_map_t;
// allocate this map no demand, as it is rarely needed
mutable default_widget_map_t* mDefaultWidgets;
mutable LLView* mDefaultWidgets;
default_widget_map_t& getDefaultWidgetMap() const;
LLView& getDefaultWidgetContainer() const;
public:
// Depth in view hierarchy during rendering
@ -649,7 +645,7 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co
return NULL;
}
getDefaultWidgetMap()[name] = result;
getDefaultWidgetContainer().addChild(result);
}
}
return result;

View File

@ -149,7 +149,7 @@
<key>nonotifications</key>
<map>
<key>desc</key>
<string>User will not get any notifications. NOTE: All notifications that occur will get added to ignore file for future runs.</string>
<string>User will not get any notifications.</string>
<key>map-to</key>
<string>IgnoreAllNotifications</string>
</map>

View File

@ -3914,7 +3914,7 @@
<key>Comment</key>
<string>Ignore all notifications so we never need user input on them.</string>
<key>Persist</key>
<integer>0</integer>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@ -4537,6 +4537,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>LocalFileSystemBrowsingEnabled</key>
<map>
<key>Comment</key>
<string>Enable/disable access to the local file system via the file picker</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>LoginSRVTimeout</key>
<map>
<key>Comment</key>
@ -11355,6 +11366,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>VoiceDisableMic</key>
<map>
<key>Comment</key>
<string>Completely disable the ability to open the mic.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>VoiceEffectExpiryWarningTime</key>
<map>
<key>Comment</key>

View File

@ -2135,7 +2135,7 @@ bool LLAppViewer::initConfiguration()
if (clp.hasOption("nonotifications"))
{
gSavedSettings.setBOOL("IgnoreAllNotifications", TRUE);
gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false);
}
if (clp.hasOption("debugsession"))
@ -2182,8 +2182,8 @@ bool LLAppViewer::initConfiguration()
if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
{
// hack to force the skin to default.
//gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
gDirUtilp->setSkinFolder("default");
gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
//gDirUtilp->setSkinFolder("default");
}
mYieldTime = gSavedSettings.getS32("YieldTime");

View File

@ -33,6 +33,7 @@
#include "lldir.h"
#include "llframetimer.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "llwindow.h" // beforeDialog()
#if LL_SDL
@ -104,6 +105,20 @@ LLFilePicker::~LLFilePicker()
// nothing
}
// utility function to check if access to local file system via file browser
// is enabled and if not, tidy up and indicate we're not allowed to do this.
bool LLFilePicker::check_local_file_access_enabled()
{
// if local file browsing is turned off, return without opening dialog
bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled");
if ( ! local_file_system_browsing_enabled )
{
mFiles.clear();
return false;
}
return true;
}
const std::string LLFilePicker::getFirstFile()
{
@ -203,6 +218,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
}
BOOL success = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
// don't provide default file selection
mFilesW[0] = '\0';
@ -241,6 +262,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
}
BOOL success = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
// don't provide default file selection
mFilesW[0] = '\0';
@ -304,6 +331,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
}
BOOL success = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
mOFN.lpstrFile = mFilesW;
if (!filename.empty())
{
@ -581,6 +614,12 @@ OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter)
NavDialogRef navRef = NULL;
NavReplyRecord navReply;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
memset(&navReply, 0, sizeof(navReply));
// NOTE: we are passing the address of a local variable here.
@ -809,6 +848,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
BOOL success = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
OSStatus error = noErr;
reset();
@ -845,6 +890,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
BOOL success = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
OSStatus error = noErr;
reset();
@ -876,6 +927,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
BOOL success = FALSE;
OSStatus error = noErr;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
reset();
mNavOptions.optionFlags &= ~kNavAllowMultipleFiles;
@ -1100,6 +1157,12 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
{
BOOL rtn = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
gViewerWindow->mWindow->beforeDialog();
reset();
@ -1189,6 +1252,12 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
{
BOOL rtn = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
gViewerWindow->mWindow->beforeDialog();
reset();
@ -1233,6 +1302,12 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
{
BOOL rtn = FALSE;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
gViewerWindow->mWindow->beforeDialog();
reset();
@ -1263,6 +1338,13 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
{
// if local file browsing is turned off, return without opening dialog
// (Even though this is a stub, I think we still should not return anything at all)
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
reset();
llinfos << "getSaveFile suggested filename is [" << filename
@ -1277,6 +1359,13 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
{
// if local file browsing is turned off, return without opening dialog
// (Even though this is a stub, I think we still should not return anything at all)
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
reset();
// HACK: Static filenames for 'open' until we implement filepicker
@ -1295,6 +1384,13 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
{
// if local file browsing is turned off, return without opening dialog
// (Even though this is a stub, I think we still should not return anything at all)
if ( check_local_file_access_enabled() == false )
{
return FALSE;
}
reset();
return FALSE;
}

View File

@ -140,6 +140,10 @@ private:
//FILENAME_BUFFER_SIZE = 65536
FILENAME_BUFFER_SIZE = 65000
};
// utility function to check if access to local file system via file browser
// is enabled and if not, tidy up and indicate we're not allowed to do this.
bool check_local_file_access_enabled();
#if LL_WINDOWS
OPENFILENAMEW mOFN; // for open and save dialogs

View File

@ -40,7 +40,8 @@ bool view_visible(LLView* viewp)
}
LLPopupView::LLPopupView()
LLPopupView::LLPopupView(const LLPopupView::Params& p)
: LLPanel(p)
{
// register ourself as handler of UI popups
LLUI::setPopupFuncs(boost::bind(&LLPopupView::addPopup, this, _1), boost::bind(&LLPopupView::removePopup, this, _1), boost::bind(&LLPopupView::clearPopups, this));

View File

@ -32,7 +32,7 @@
class LLPopupView : public LLPanel
{
public:
LLPopupView();
LLPopupView(const Params& p = LLPanel::Params());
~LLPopupView();
/*virtual*/ void draw();

View File

@ -1524,7 +1524,7 @@ void LLViewerWindow::initBase()
mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle();
mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle();
mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle();
mPopupView = main_view->findChild<LLPopupView>("popup_holder");
mPopupView = main_view->getChild<LLPopupView>("popup_holder");
mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle();
// Constrain floaters to inside the menu and status bar regions.

View File

@ -35,6 +35,7 @@
#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "llui.h"
#include "llkeyboard.h"
const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f;
@ -113,8 +114,18 @@ LLVoiceClient::LLVoiceClient()
mVoiceModule(NULL),
m_servicePump(NULL),
mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")),
mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault"))
mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")),
mPTTDirty(true),
mPTT(true),
mUsePTT(true),
mPTTIsMiddleMouse(false),
mPTTKey(0),
mPTTIsToggle(false),
mUserPTTState(false),
mMuteMic(false),
mDisableMic(false)
{
updateSettings();
}
//---------------------------------------------------
@ -173,6 +184,14 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion()
void LLVoiceClient::updateSettings()
{
setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
std::string keyString = gSavedSettings.getString("PushToTalkButton");
setPTTKey(keyString);
setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
mDisableMic = gSavedSettings.getBOOL("VoiceDisableMic");
updateMicMuteLogic();
if (mVoiceModule) mVoiceModule->updateSettings();
}
@ -481,6 +500,26 @@ void LLVoiceClient::setVoiceEnabled(bool enabled)
if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled);
}
void LLVoiceClient::updateMicMuteLogic()
{
// If not configured to use PTT, the mic should be open (otherwise the user will be unable to speak).
bool new_mic_mute = false;
if(mUsePTT)
{
// If configured to use PTT, track the user state.
new_mic_mute = !mUserPTTState;
}
if(mMuteMic || mDisableMic)
{
// Either of these always overrides any other PTT setting.
new_mic_mute = true;
}
if (mVoiceModule) mVoiceModule->setMuteMic(new_mic_mute);
}
void LLVoiceClient::setLipSyncEnabled(BOOL enabled)
{
if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled);
@ -500,7 +539,8 @@ BOOL LLVoiceClient::lipSyncEnabled()
void LLVoiceClient::setMuteMic(bool muted)
{
if (mVoiceModule) mVoiceModule->setMuteMic(muted);
mMuteMic = muted;
updateMicMuteLogic();
}
@ -509,64 +549,116 @@ void LLVoiceClient::setMuteMic(bool muted)
void LLVoiceClient::setUserPTTState(bool ptt)
{
if (mVoiceModule) mVoiceModule->setUserPTTState(ptt);
mUserPTTState = ptt;
updateMicMuteLogic();
}
bool LLVoiceClient::getUserPTTState()
{
if (mVoiceModule)
{
return mVoiceModule->getUserPTTState();
}
else
{
return false;
}
return mUserPTTState;
}
void LLVoiceClient::setUsePTT(bool usePTT)
{
if (mVoiceModule) mVoiceModule->setUsePTT(usePTT);
if(usePTT && !mUsePTT)
{
// When the user turns on PTT, reset the current state.
mUserPTTState = false;
}
mUsePTT = usePTT;
updateMicMuteLogic();
}
void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle)
{
if (mVoiceModule) mVoiceModule->setPTTIsToggle(PTTIsToggle);
if(!PTTIsToggle && mPTTIsToggle)
{
// When the user turns off toggle, reset the current state.
mUserPTTState = false;
}
mPTTIsToggle = PTTIsToggle;
updateMicMuteLogic();
}
bool LLVoiceClient::getPTTIsToggle()
{
if (mVoiceModule)
{
return mVoiceModule->getPTTIsToggle();
}
else {
return false;
}
return mPTTIsToggle;
}
void LLVoiceClient::setPTTKey(std::string &key)
{
if(key == "MiddleMouse")
{
mPTTIsMiddleMouse = true;
}
else
{
mPTTIsMiddleMouse = false;
if(!LLKeyboard::keyFromString(key, &mPTTKey))
{
// If the call failed, don't match any key.
key = KEY_NONE;
}
}
}
void LLVoiceClient::inputUserControlState(bool down)
{
if (mVoiceModule) mVoiceModule->inputUserControlState(down);
if(mPTTIsToggle)
{
if(down) // toggle open-mic state on 'down'
{
toggleUserPTTState();
}
}
else // set open-mic state as an absolute
{
setUserPTTState(down);
}
}
void LLVoiceClient::toggleUserPTTState(void)
{
if (mVoiceModule) mVoiceModule->toggleUserPTTState();
setUserPTTState(!getUserPTTState());
}
void LLVoiceClient::keyDown(KEY key, MASK mask)
{
if (mVoiceModule) mVoiceModule->keyDown(key, mask);
if (gKeyboard->getKeyRepeated(key))
{
// ignore auto-repeat keys
return;
}
if(!mPTTIsMiddleMouse)
{
bool down = (mPTTKey != KEY_NONE)
&& gKeyboard->getKeyDown(mPTTKey);
inputUserControlState(down);
}
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
if (mVoiceModule) mVoiceModule->keyUp(key, mask);
if(!mPTTIsMiddleMouse)
{
bool down = (mPTTKey != KEY_NONE)
&& gKeyboard->getKeyDown(mPTTKey);
inputUserControlState(down);
}
}
void LLVoiceClient::middleMouseState(bool down)
{
if (mVoiceModule) mVoiceModule->middleMouseState(down);
if(mPTTIsMiddleMouse)
{
if(mPTTIsMiddleMouse)
{
inputUserControlState(down);
}
}
}

View File

@ -191,25 +191,9 @@ public:
virtual void setVoiceEnabled(bool enabled)=0;
virtual void setLipSyncEnabled(BOOL enabled)=0;
virtual BOOL lipSyncEnabled()=0;
virtual void setMuteMic(bool muted)=0; // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
virtual void setMuteMic(bool muted)=0; // Set the mute state of the local mic.
//@}
////////////////////////
/// @name PTT
//@{
virtual void setUserPTTState(bool ptt)=0;
virtual bool getUserPTTState()=0;
virtual void setUsePTT(bool usePTT)=0;
virtual void setPTTIsToggle(bool PTTIsToggle)=0;
virtual bool getPTTIsToggle()=0;
virtual void toggleUserPTTState(void)=0;
virtual void inputUserControlState(bool down)=0; // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
virtual void keyDown(KEY key, MASK mask)=0;
virtual void keyUp(KEY key, MASK mask)=0;
virtual void middleMouseState(bool down)=0;
//@}
//////////////////////////
/// @name nearby speaker accessors
//@{
@ -406,6 +390,9 @@ public:
void setUsePTT(bool usePTT);
void setPTTIsToggle(bool PTTIsToggle);
bool getPTTIsToggle();
void setPTTKey(std::string &key);
void updateMicMuteLogic();
BOOL lipSyncEnabled();
@ -471,6 +458,17 @@ protected:
LLCachedControl<bool> mVoiceEffectEnabled;
LLCachedControl<std::string> mVoiceEffectDefault;
bool mPTTDirty;
bool mPTT;
bool mUsePTT;
bool mPTTIsMiddleMouse;
KEY mPTTKey;
bool mPTTIsToggle;
bool mUserPTTState;
bool mMuteMic;
bool mDisableMic;
};
/**

View File

@ -44,7 +44,6 @@
#include "llviewernetwork.h" // for gGridChoice
#include "llbase64.h"
#include "llviewercontrol.h"
#include "llkeyboard.h"
#include "llappviewer.h" // for gDisconnected, gDisableVoice
#include "llmutelist.h" // to check for muted avatars
#include "llagent.h"
@ -322,14 +321,8 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mRenderDeviceDirty(false),
mSpatialCoordsDirty(false),
mPTTDirty(true),
mPTT(true),
mUsePTT(true),
mPTTIsMiddleMouse(false),
mPTTKey(0),
mPTTIsToggle(false),
mUserPTTState(false),
mMuteMic(false),
mMuteMicDirty(false),
mFriendsListDirty(true),
mEarLocation(0),
@ -431,10 +424,6 @@ const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion()
void LLVivoxVoiceClient::updateSettings()
{
setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat"));
setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
std::string keyString = gSavedSettings.getString("PushToTalkButton");
setPTTKey(keyString);
setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
setEarLocation(gSavedSettings.getS32("VoiceEarLocation"));
std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
@ -946,7 +935,7 @@ void LLVivoxVoiceClient::stateMachine()
setState(stateDaemonLaunched);
// Dirty the states we'll need to sync with the daemon when it comes up.
mPTTDirty = true;
mMuteMicDirty = true;
mMicVolumeDirty = true;
mSpeakerVolumeDirty = true;
mSpeakerMuteDirty = true;
@ -1531,7 +1520,7 @@ void LLVivoxVoiceClient::stateMachine()
if(mAudioSession && mAudioSession->mVoiceEnabled)
{
// Dirty state that may need to be sync'ed with the daemon.
mPTTDirty = true;
mMuteMicDirty = true;
mSpeakerVolumeDirty = true;
mSpatialCoordsDirty = true;
@ -1572,35 +1561,6 @@ void LLVivoxVoiceClient::stateMachine()
}
else
{
// Figure out whether the PTT state needs to change
{
bool newPTT;
if(mUsePTT)
{
// If configured to use PTT, track the user state.
newPTT = mUserPTTState;
}
else
{
// If not configured to use PTT, it should always be true (otherwise the user will be unable to speak).
newPTT = true;
}
if(mMuteMic)
{
// This always overrides any other PTT setting.
newPTT = false;
}
// Dirty if state changed.
if(newPTT != mPTT)
{
mPTT = newPTT;
mPTTDirty = true;
}
}
if(!inSpatialChannel())
{
// When in a non-spatial channel, never send positional updates.
@ -1622,7 +1582,7 @@ void LLVivoxVoiceClient::stateMachine()
// Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often
// -- the user can only click so fast) or every 10hz, whichever is sooner.
// Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged.
if((mAudioSession && mAudioSession->mMuteDirty) || mPTTDirty || mUpdateTimer.hasExpired())
if((mAudioSession && mAudioSession->mMuteDirty) || mMuteMicDirty || mUpdateTimer.hasExpired())
{
mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
sendPositionalUpdate();
@ -2745,19 +2705,17 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
buildSetRenderDevice(stream);
if(mPTTDirty)
if(mMuteMicDirty)
{
mPTTDirty = false;
mMuteMicDirty = false;
// Send a local mute command.
// NOTE that the state of "PTT" is the inverse of "local mute".
// (i.e. when PTT is true, we send a mute command with "false", and vice versa)
LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << 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>" << (mPTT?"false":"true") << "</Value>"
<< "<Value>" << (mMuteMic?"true":"false") << "</Value>"
<< "</Request>\n\n\n";
}
@ -5230,38 +5188,11 @@ void LLVivoxVoiceClient::leaveChannel(void)
void LLVivoxVoiceClient::setMuteMic(bool muted)
{
mMuteMic = muted;
}
void LLVivoxVoiceClient::setUserPTTState(bool ptt)
{
mUserPTTState = ptt;
}
bool LLVivoxVoiceClient::getUserPTTState()
{
return mUserPTTState;
}
void LLVivoxVoiceClient::inputUserControlState(bool down)
{
if(mPTTIsToggle)
if(mMuteMic != muted)
{
if(down) // toggle open-mic state on 'down'
{
toggleUserPTTState();
}
mMuteMic = muted;
mMuteMicDirty = true;
}
else // set open-mic state as an absolute
{
setUserPTTState(down);
}
}
void LLVivoxVoiceClient::toggleUserPTTState(void)
{
mUserPTTState = !mUserPTTState;
}
void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
@ -5312,48 +5243,6 @@ BOOL LLVivoxVoiceClient::lipSyncEnabled()
}
}
void LLVivoxVoiceClient::setUsePTT(bool usePTT)
{
if(usePTT && !mUsePTT)
{
// When the user turns on PTT, reset the current state.
mUserPTTState = false;
}
mUsePTT = usePTT;
}
void LLVivoxVoiceClient::setPTTIsToggle(bool PTTIsToggle)
{
if(!PTTIsToggle && mPTTIsToggle)
{
// When the user turns off toggle, reset the current state.
mUserPTTState = false;
}
mPTTIsToggle = PTTIsToggle;
}
bool LLVivoxVoiceClient::getPTTIsToggle()
{
return mPTTIsToggle;
}
void LLVivoxVoiceClient::setPTTKey(std::string &key)
{
if(key == "MiddleMouse")
{
mPTTIsMiddleMouse = true;
}
else
{
mPTTIsMiddleMouse = false;
if(!LLKeyboard::keyFromString(key, &mPTTKey))
{
// If the call failed, don't match any key.
key = KEY_NONE;
}
}
}
void LLVivoxVoiceClient::setEarLocation(S32 loc)
{
@ -5394,44 +5283,6 @@ void LLVivoxVoiceClient::setMicGain(F32 volume)
}
}
void LLVivoxVoiceClient::keyDown(KEY key, MASK mask)
{
if (gKeyboard->getKeyRepeated(key))
{
// ignore auto-repeat keys
return;
}
if(!mPTTIsMiddleMouse)
{
bool down = (mPTTKey != KEY_NONE)
&& gKeyboard->getKeyDown(mPTTKey);
inputUserControlState(down);
}
}
void LLVivoxVoiceClient::keyUp(KEY key, MASK mask)
{
if(!mPTTIsMiddleMouse)
{
bool down = (mPTTKey != KEY_NONE)
&& gKeyboard->getKeyDown(mPTTKey);
inputUserControlState(down);
}
}
void LLVivoxVoiceClient::middleMouseState(bool down)
{
if(mPTTIsMiddleMouse)
{
if(mPTTIsMiddleMouse)
{
inputUserControlState(down);
}
}
}
/////////////////////////////
// Accessors for data related to nearby speakers
BOOL LLVivoxVoiceClient::getVoiceEnabled(const LLUUID& id)
@ -7005,8 +6856,8 @@ void LLVivoxVoiceClient::captureBufferRecordStartSendMessage()
<< "<Value>false</Value>"
<< "</Request>\n\n\n";
// Dirty the PTT state so that it will get reset when we finishing previewing
mPTTDirty = true;
// Dirty the mute mic state so that it will get reset when we finishing previewing
mMuteMicDirty = true;
writeString(stream.str());
}
@ -7020,7 +6871,7 @@ void LLVivoxVoiceClient::captureBufferRecordStopSendMessage()
LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL;
// Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing.
// Mute the mic. Mic mute state was dirtied at recording start, so will be reset when finished previewing.
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
<< "<Value>true</Value>"

View File

@ -173,25 +173,9 @@ public:
virtual void setVoiceEnabled(bool enabled);
virtual BOOL lipSyncEnabled();
virtual void setLipSyncEnabled(BOOL enabled);
virtual void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
virtual void setMuteMic(bool muted); // Set the mute state of the local mic.
//@}
////////////////////////
/// @name PTT
//@{
virtual void setUserPTTState(bool ptt);
virtual bool getUserPTTState();
virtual void setUsePTT(bool usePTT);
virtual void setPTTIsToggle(bool PTTIsToggle);
virtual bool getPTTIsToggle();
virtual void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
virtual void toggleUserPTTState(void);
virtual void keyDown(KEY key, MASK mask);
virtual void keyUp(KEY key, MASK mask);
virtual void middleMouseState(bool down);
//@}
//////////////////////////
/// @name nearby speaker accessors
//@{
@ -534,9 +518,6 @@ protected:
// Use this to determine whether to show a "no speech" icon in the menu bar.
// PTT
void setPTTKey(std::string &key);
/////////////////////////////
// Recording controls
void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200);
@ -800,15 +781,8 @@ private:
LLVector3 mAvatarVelocity;
LLMatrix3 mAvatarRot;
bool mPTTDirty;
bool mPTT;
bool mUsePTT;
bool mPTTIsMiddleMouse;
KEY mPTTKey;
bool mPTTIsToggle;
bool mUserPTTState;
bool mMuteMic;
bool mMuteMicDirty;
// Set to true when the friends list is known to have changed.
bool mFriendsListDirty;

View File

@ -2069,7 +2069,7 @@ Would you be my friend?
<button
default="true"
index="0"
name="Offer"
name="OK"
text="OK"/>
<button
index="1"
@ -2091,7 +2091,7 @@ Would you be my friend?
<button
default="true"
index="0"
name="Offer"
name="OK"
text="OK"/>
<button
index="1"
@ -2114,7 +2114,7 @@ Would you be my friend?
<button
default="true"
index="0"
name="Offer"
name="OK"
text="OK"/>
<button
index="1"
@ -4810,24 +4810,6 @@ Some terms in your search query were excluded due to content restrictions as cla
Please select at least one type of content to search (General, Moderate, or Adult).
</notification>
<notification
icon="notify.tga"
name="GroupVote"
type="notify">
[NAME] has proposed to vote on:
[MESSAGE]
<form name="form">
<button
index="0"
name="VoteNow"
text="Vote Now"/>
<button
index="1"
name="Later"
text="Later"/>
</form>
</notification>
<notification
icon="notify.tga"
name="SystemMessage"
@ -6313,13 +6295,9 @@ Avatar '[NAME]' left appearance mode.
type="alertmodal">
We're having trouble connecting using [PROTOCOL] [HOSTID].
Please check your network and firewall setup.
<form name="form">
<button
default="true"
index="0"
name="OK"
text="OK"/>
</form>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
@ -6332,13 +6310,9 @@ We're having trouble connecting to your voice server:
Voice communications will not be available.
Please check your network and firewall setup.
<form name="form">
<button
default="true"
index="0"
name="OK"
text="OK"/>
</form>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="left|right|top|bottom"
height="768"
layout="topleft"
left="0"
mouse_opaque="false"
tab_stop="false"
name="main_view"
width="1024">
<view top="0"
follows="all"
height="768"
left="0"
mouse_opaque="false"
name="world_view_rect"
width="1024"/>
<panel top="0"
follows="all"
height="768"
mouse_opaque="true"
name="progress_view"
filename="panel_progress.xml"
class="progress_view"
width="1024"
visible="false"/>
</panel>