diff options
-rw-r--r-- | indra/newview/CMakeLists.txt | 2 | ||||
-rw-r--r-- | indra/newview/llfloatervoiceeffect.cpp | 172 | ||||
-rw-r--r-- | indra/newview/llfloatervoiceeffect.h | 69 | ||||
-rw-r--r-- | indra/newview/llpanelvoiceeffect.cpp | 10 | ||||
-rw-r--r-- | indra/newview/llviewerfloaterreg.cpp | 4 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_voice_effect.xml | 123 |
6 files changed, 375 insertions, 5 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index f2a2a129f8..d400510b91 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -214,6 +214,7 @@ set(viewer_SOURCE_FILES llfloaterurldisplay.cpp llfloaterurlentry.cpp llfloatervoicedevicesettings.cpp + llfloatervoiceeffect.cpp llfloaterwater.cpp llfloaterwhitelistentry.cpp llfloaterwindlight.cpp @@ -731,6 +732,7 @@ set(viewer_HEADER_FILES llfloaterurldisplay.h llfloaterurlentry.h llfloatervoicedevicesettings.h + llfloatervoiceeffect.h llfloaterwater.h llfloaterwhitelistentry.h llfloaterwindlight.h diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp new file mode 100644 index 0000000000..5a579f5aeb --- /dev/null +++ b/indra/newview/llfloatervoiceeffect.cpp @@ -0,0 +1,172 @@ +/** + * @file llfloatervoiceeffect.cpp + * @brief Selection and preview of voice effect. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2002-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 "llfloatervoiceeffect.h" + +#include "llscrolllistctrl.h" +#include "lltrans.h" + +LLFloaterVoiceEffect::LLFloaterVoiceEffect(const LLSD& key) + : LLFloater(key) +{ + mCommitCallbackRegistrar.add("VoiceEffect.Record", boost::bind(&LLFloaterVoiceEffect::onClickRecord, this)); + mCommitCallbackRegistrar.add("VoiceEffect.Play", boost::bind(&LLFloaterVoiceEffect::onClickPlay, this)); +} + +// virtual +LLFloaterVoiceEffect::~LLFloaterVoiceEffect() +{ + if(LLVoiceClient::instanceExists()) + { + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->removeObserver(this); + } + } +} + +// virtual +BOOL LLFloaterVoiceEffect::postBuild() +{ + setDefaultBtn("record_btn"); + + mVoiceEffectList = getChild<LLScrollListCtrl>("voice_effect_list"); + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->addObserver(this); + } + + update(); + + return TRUE; +} + +// virtual +void LLFloaterVoiceEffect::onClose(bool app_quitting) +{ + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) + { + effect_interface->clearPreviewBuffer(); + } +} + +void LLFloaterVoiceEffect::update() +{ + if (!mVoiceEffectList) + { + return; + } + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (!effect_interface) // || !LLVoiceClient::instance().isVoiceWorking()) + { + mVoiceEffectList->setEnabled(false); + return; + } + + mVoiceEffectList->deleteAllItems(); + LLSD element; + element["id"] = LLUUID::null; + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = getString("no_voice_effect"); + mVoiceEffectList->addElement(element, ADD_BOTTOM); + + const voice_effect_list_t& effect_list = effect_interface->getVoiceEffectList(); + if (!effect_list.empty()) + { + for (voice_effect_list_t::const_iterator it = effect_list.begin(); it != effect_list.end(); ++it) + { + LLSD element; + element["id"] = it->second; + element["columns"][1]["column"] = "name"; + element["columns"][1]["value"] = it->first; + mVoiceEffectList->addElement(element, ADD_BOTTOM); + } + } + + mVoiceEffectList->setValue(effect_interface->getVoiceEffect()); + mVoiceEffectList->setEnabled(true); + + bool recording = effect_interface->isPreviewRecording(); + getChild<LLButton>("record_btn")->setVisible(!recording); + getChild<LLButton>("record_stop_btn")->setVisible(recording); + + getChild<LLButton>("play_btn")->setEnabled(effect_interface->isPreviewReady()); + bool playing = effect_interface->isPreviewPlaying(); + getChild<LLButton>("play_btn")->setVisible(!playing); + getChild<LLButton>("play_stop_btn")->setVisible(playing); +} + +// virtual +void LLFloaterVoiceEffect::onVoiceEffectChanged(bool new_effects) +{ + update(); +} + +void LLFloaterVoiceEffect::onClickRecord() +{ + LL_DEBUGS("Voice") << "Record clicked" << LL_ENDL; + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) // && LLVoiceClient::instance().isVoiceWorking()) + { + bool record = !effect_interface->isPreviewRecording(); + effect_interface->recordPreviewBuffer(record); + getChild<LLButton>("record_btn")->setVisible(!record); + getChild<LLButton>("record_stop_btn")->setVisible(record); + } +} + +void LLFloaterVoiceEffect::onClickPlay() +{ + LL_DEBUGS("Voice") << "Play clicked" << LL_ENDL; + if (!mVoiceEffectList) + { + return; + } + + const LLUUID& effect_id = mVoiceEffectList->getCurrentID(); + + LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); + if (effect_interface) // && LLVoiceClient::instance().isVoiceWorking()) + { + bool play = !effect_interface->isPreviewPlaying(); + effect_interface->playPreviewBuffer(play, effect_id); + getChild<LLButton>("play_btn")->setVisible(!play); + getChild<LLButton>("play_stop_btn")->setVisible(play); + } +} diff --git a/indra/newview/llfloatervoiceeffect.h b/indra/newview/llfloatervoiceeffect.h new file mode 100644 index 0000000000..cd639dba5a --- /dev/null +++ b/indra/newview/llfloatervoiceeffect.h @@ -0,0 +1,69 @@ +/** + * @file llfloatervoiceeffect.h + * @brief Selection and preview of voice effects. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2002-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$ + */ + +#ifndef LL_LLFLOATERVOICEEFFECT_H +#define LL_LLFLOATERVOICEEFFECT_H + +#include "llfloater.h" +#include "llvoiceclient.h" + +class LLButton; +class LLScrollListCtrl; + +class LLFloaterVoiceEffect + : public LLFloater + , public LLVoiceEffectObserver +{ +public: + LOG_CLASS(LLFloaterVoiceEffect); + + LLFloaterVoiceEffect(const LLSD& key); + virtual ~LLFloaterVoiceEffect(); + + virtual BOOL postBuild(); + virtual void onClose(bool app_quitting); + +private: + void update(); + + /// Called by voice effect provider when voice effect list is changed. + virtual void onVoiceEffectChanged(bool new_effects); + + void onClickRecord(); + void onClickPlay(); +// void onClickActivate(); + + LLUUID mSelectedID; + LLScrollListCtrl* mVoiceEffectList; +}; + +#endif diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp index c51ec91b66..6210fc7cc7 100644 --- a/indra/newview/llpanelvoiceeffect.cpp +++ b/indra/newview/llpanelvoiceeffect.cpp @@ -36,8 +36,8 @@ #include "llpanelvoiceeffect.h" #include "llcombobox.h" +#include "llfloaterreg.h" #include "llpanel.h" -#include "llvoicechannel.h" #include "llvoiceclient.h" static LLRegisterPanelClassWrapper<LLPanelVoiceEffect> t_panel_voice_effect("panel_voice_effect"); @@ -64,7 +64,6 @@ LLPanelVoiceEffect::~LLPanelVoiceEffect() BOOL LLPanelVoiceEffect::postBuild() { mVoiceEffectCombo = getChild<LLComboBox>("voice_effect"); - update(); LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); if (effect_interface) @@ -72,6 +71,8 @@ BOOL LLPanelVoiceEffect::postBuild() effect_interface->addObserver(this); } + update(); + return TRUE; } @@ -91,12 +92,13 @@ void LLPanelVoiceEffect::onCommitVoiceEffect() LLSD value = mVoiceEffectCombo->getValue(); if (value.asInteger() == GET_VOICE_EFFECTS) { - LL_DEBUGS("Voice") << "GET VOICE FONTS!" << LL_ENDL; + // Open the voice morphing info web page LLWeb::loadURL(getString("get_voice_effects_url")); } else if (value.asInteger() == PREVIEW_VOICE_EFFECTS) { - LL_DEBUGS("Voice") << "PREVIEW VOICE FONTS!" << LL_ENDL; + // Open the voice effects management floater + LLFloaterReg::showInstance("voice_effect"); } else { diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 506cebfe73..c4a5d6e3fd 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -102,6 +102,7 @@ #include "llfloateruipreview.h" #include "llfloaterurldisplay.h" #include "llfloatervoicedevicesettings.h" +#include "llfloatervoiceeffect.h" #include "llfloaterwater.h" #include "llfloaterwhitelistentry.h" #include "llfloaterwindlight.h" @@ -253,7 +254,8 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload"); LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>); - + LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>); + LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>); LLFloaterWindowSizeUtil::registerFloater(); LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>); diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml new file mode 100644 index 0000000000..5627eb3aff --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_resize="true" + height="465" + name="voice_effects" + help_topic="voice_effects" + title="VOICE EFFECTS" + background_visible="true" + follows="all" + label="Places" + layout="topleft" + min_height="350" + min_width="240" + width="313"> + <string name="no_voice_effect"> + No Voice Effect + </string> + <scroll_list + bottom_delta="400" + draw_heading="true" + follows="all" + layout="topleft" + left="0" + multi_select="false" + top="20" + name="voice_effect_list"> + <scroll_list.columns + label="New" + name="new" + width="48" /> + <scroll_list.columns + label="Name" + name="name" + width="153" /> + <scroll_list.columns + label="Expires" + name="expires" + width="100" /> + <scroll_list.columns + label="" + name="key" + width="-1" /> + </scroll_list> + <panel + background_visible="true" + bevel_style="none" + top_pad="0" + follows="left|right|bottom" + height="30" + label="bottom_panel" + layout="topleft" + left="0" + name="bottom_panel" + width="313"> +<!-- + <button + follows="bottom|left" + font="SansSerifBigBold" + height="10" + image_hover_selected="Activate_Checkmark" + image_selected="Activate_Checkmark" + image_unselected="Activate_Checkmark" + layout="topleft" + left="10" + name="activate_btn" + tool_tip="Activate/Deactivate selected voice effect" + top="10" + width="10" + <button.commit_callback + function="VoiceEffect.Activate" /> + </button> +--> + </panel> + <button + follows="left|bottom" + height="23" + label="Record" + layout="topleft" + left="6" + name="record_btn" + top_pad="5" + width="83"> + <button.commit_callback + function="VoiceEffect.Record" /> + </button> + <button + follows="left|bottom" + height="23" + label="Stop" + layout="topleft" + left_delta="0" + name="record_stop_btn" + top_delta="0" + width="83"> + <button.commit_callback + function="VoiceEffect.Record" /> + </button> + <button + follows="left|bottom" + height="23" + label="Play" + layout="topleft" + left_pad="6" + name="play_btn" + top_delta="0" + width="83"> + <button.commit_callback + function="VoiceEffect.Play" /> + </button> + <button + follows="left|bottom" + height="23" + label="Stop" + layout="topleft" + left_delta="0" + name="play_stop_btn" + top_delta="0" + width="83"> + <button.commit_callback + function="VoiceEffect.Play" /> + </button> +</floater> |