123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- /**
- * @file llvoiceremotectrl.cpp
- * @brief A remote control for voice chat
- *
- * $LicenseInfo:firstyear=2005&license=viewergpl$
- *
- * Copyright (c) 2005-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
- #include "llviewerprecompiledheaders.h"
- #include "llvoiceremotectrl.h"
- #include "llbutton.h"
- #include "lliconctrl.h"
- #include "lltextbox.h"
- #include "lluictrlfactory.h"
- #include "llagent.h"
- #include "llfloaterchatterbox.h"
- #include "llfloateractivespeakers.h"
- #include "lloverlaybar.h"
- #include "llviewercontrol.h"
- #include "llviewerparcelmgr.h"
- #include "llvoicechannel.h"
- LLVoiceRemoteCtrl::LLVoiceRemoteCtrl (const std::string& name)
- : LLPanel(name)
- {
- setIsChrome(true);
- #if EXPANDED_VOICE_CTRL
- if (gSavedSettings.getBool("ShowVoiceChannelPopup"))
- {
- LLUICtrlFactory::getInstance()->buildPanel(this,
- "panel_voice_remote_expanded.xml");
- }
- else
- {
- LLUICtrlFactory::getInstance()->buildPanel(this,
- "panel_voice_remote.xml");
- }
- #else
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_voice_remote.xml");
- #endif
- setFocusRoot(true);
- }
- bool LLVoiceRemoteCtrl::postBuild()
- {
- mTalkBtn = getChild<LLButton>("push_to_talk");
- mTalkBtn->setClickedCallback(onBtnTalkClicked);
- mTalkBtn->setHeldDownCallback(onBtnTalkHeld);
- mTalkBtn->setMouseUpCallback(onBtnTalkReleased);
- mTalkLockBtn = getChild<LLButton>("ptt_lock");
- mTalkLockBtn->setClickedCallback(onBtnLock);
- mTalkLockBtn->setCallbackUserData(this);
- mSpeakersBtn = getChild<LLButton>("speakers_btn");
- mSpeakersBtn->setClickedCallback(onClickSpeakers);
- mSpeakersBtn->setCallbackUserData(this);
- mIcon = getChild<LLIconCtrl>("voice_volume");
- #if EXPANDED_VOICE_CTRL
- childSetAction("show_channel", onClickPopupBtn, this);
- childSetAction("end_call_btn", onClickEndCall, this);
- LLTextBox* text = getChild<LLTextBox>("channel_label");
- if (text)
- {
- text->setUseEllipses(true);
- }
- childSetAction("voice_channel_bg", onClickVoiceChannel, this);
- #endif
- return true;
- }
- void LLVoiceRemoteCtrl::draw()
- {
- bool voice_active = false;
- if (gViewerParcelMgr.allowAgentVoice())
- {
- LLVoiceChannel* channelp = LLVoiceChannel::getCurrentVoiceChannel();
- if (channelp)
- {
- voice_active = channelp->isActive();
- }
- }
- mTalkBtn->setEnabled(voice_active);
- mTalkLockBtn->setEnabled(voice_active);
- // Propagate PTT state to button display,
- if (!mTalkBtn->hasMouseCapture())
- {
- mTalkBtn->setToggleState(gVoiceClient.isAgentMicOpen());
- }
- mSpeakersBtn->setToggleState(LLFloaterActiveSpeakers::instanceVisible(LLSD()));
- static LLCachedControl<bool> ptt_enabled(gSavedSettings,
- "PTTCurrentlyEnabled");
- mTalkLockBtn->setToggleState(!ptt_enabled);
- static S32 last_icon_number = -1;
- S32 icon_number = 4;
- std::string talk_blip_image;
- if (gVoiceClient.getIsSpeaking(gAgentID))
- {
- F32 voice_power = gVoiceClient.getCurrentPower(gAgentID);
- if (voice_power > OVERDRIVEN_POWER_LEVEL)
- {
- talk_blip_image = "icn_voice_ptt-on-lvl3.tga";
- icon_number = 3;
- }
- else
- {
- F32 power = gVoiceClient.getCurrentPower(gAgentID);
- S32 icon_image_idx =
- llmin(2, llfloor((power / OVERDRIVEN_POWER_LEVEL) * 3.f));
- icon_number = icon_image_idx;
- switch (icon_image_idx)
- {
- case 0:
- talk_blip_image = "icn_voice_ptt-on.tga";
- break;
- case 1:
- talk_blip_image = "icn_voice_ptt-on-lvl1.tga";
- break;
- case 2:
- talk_blip_image = "icn_voice_ptt-on-lvl2.tga";
- }
- }
- }
- else
- {
- talk_blip_image = "icn_voice_ptt-off.tga";
- }
- if (icon_number != last_icon_number)
- {
- last_icon_number = icon_number;
- mIcon->setImage(talk_blip_image);
- }
- LLFloater* floaterp =
- LLFloaterChatterBox::getInstance()->getCurrentVoiceFloater();
- std::string active_channel_name;
- if (floaterp)
- {
- active_channel_name = floaterp->getTitle();
- }
- #if EXPANDED_VOICE_CTRL
- LLVoiceChannel* curchannelp = LLVoiceChannel::getCurrentVoiceChannel();
- childSetEnabled("end_call_btn",
- LLVoiceClient::voiceEnabled() && curchannelp &&
- curchannelp->isActive() &&
- curchannelp != LLVoiceChannelProximal::getInstance());
- childSetValue("channel_label", active_channel_name);
- childSetToolTip("voice_channel_bg", active_channel_name);
- if (curchannelp)
- {
- LLIconCtrl* iconp = getChild<LLIconCtrl>("voice_channel_icon");
- if (iconp && floaterp)
- {
- iconp->setImage(floaterp->getString("voice_icon"));
- }
- LLButton* buttonp = getChild<LLButton>("voice_channel_bg");
- if (buttonp)
- {
- LLColor4 bg_color;
- if (curchannelp->isActive())
- {
- bg_color = lerp(LLColor4::green, LLColor4::white, 0.7f);
- }
- else if (curchannelp->getState() == LLVoiceChannel::STATE_ERROR)
- {
- bg_color = lerp(LLColor4::red, LLColor4::white, 0.7f);
- }
- else // active, but not connected
- {
- bg_color = lerp(LLColor4::yellow, LLColor4::white, 0.7f);
- }
- buttonp->setImageColor(bg_color);
- }
- }
- LLButton* buttonp = getChild<LLButton>("show_channel");
- if (buttonp)
- {
- if (buttonp->getToggleState())
- {
- buttonp->setImageOverlay(std::string("arrow_down.tga"));
- }
- else
- {
- buttonp->setImageOverlay(std::string("arrow_up.tga"));
- }
- }
- #endif
- LLPanel::draw();
- }
- //static
- void LLVoiceRemoteCtrl::onBtnTalkClicked(void *user_data)
- {
- // when in toggle mode, clicking talk button turns mic on/off
- if (gSavedSettings.getBool("PushToTalkToggle"))
- {
- gVoiceClient.toggleUserPTTState();
- }
- }
- //static
- void LLVoiceRemoteCtrl::onBtnTalkHeld(void *user_data)
- {
- // when not in toggle mode, holding down talk button turns on mic
- if (!gSavedSettings.getBool("PushToTalkToggle"))
- {
- gVoiceClient.setUserPTTState(true);
- }
- }
- //static
- void LLVoiceRemoteCtrl::onBtnTalkReleased(void* user_data)
- {
- // when not in toggle mode, releasing talk button turns off mic
- if (!gSavedSettings.getBool("PushToTalkToggle"))
- {
- gVoiceClient.setUserPTTState(false);
- }
- }
- //static
- void LLVoiceRemoteCtrl::onBtnLock(void* user_data)
- {
- LLVoiceRemoteCtrl* self = (LLVoiceRemoteCtrl*)user_data;
- if (self)
- {
- gSavedSettings.setBool("PTTCurrentlyEnabled",
- !self->mTalkLockBtn->getToggleState());
- }
- }
- //static
- void LLVoiceRemoteCtrl::onClickSpeakers(void *user_data)
- {
- LLFloaterActiveSpeakers::toggleInstance(LLSD());
- }
- #if EXPANDED_VOICE_CTRL
- //static
- void LLVoiceRemoteCtrl::onClickPopupBtn(void* user_data)
- {
- LLVoiceRemoteCtrl* self = (LLVoiceRemoteCtrl*)user_data;
- remotep->deleteAllChildren();
- if (gSavedSettings.getBool("ShowVoiceChannelPopup"))
- {
- LLUICtrlFactory::getInstance()->buildPanel(self,
- "panel_voice_remote_expanded.xml");
- }
- else
- {
- LLUICtrlFactory::getInstance()->buildPanel(self,
- "panel_voice_remote.xml");
- }
- if (gOverlayBarp)
- {
- gOverlayBarp->setDirty();
- }
- }
- //static
- void LLVoiceRemoteCtrl::onClickEndCall(void* user_data)
- {
- LLVoiceChannel* curchannelp = LLVoiceChannel::getCurrentVoiceChannel();
- if (curchannelp && curchannelp != LLVoiceChannelProximal::getInstance())
- {
- curchannelp->deactivate();
- }
- }
- //static
- void LLVoiceRemoteCtrl::onClickVoiceChannel(void* user_data)
- {
- LLFloaterChatterBox::showInstance();
- }
- #endif
|