summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/llfloatervoiceeffect.cpp172
-rw-r--r--indra/newview/llfloatervoiceeffect.h69
-rw-r--r--indra/newview/llpanelvoiceeffect.cpp10
-rw-r--r--indra/newview/llviewerfloaterreg.cpp4
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_effect.xml123
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>