From 24c55c9a689aaf7c8c961a5eb4aab5283b0fb1fa Mon Sep 17 00:00:00 2001
From: Aimee Linden <aimee@lindenlab.com>
Date: Tue, 18 May 2010 14:16:25 +0100
Subject: EXT-7337 WIP Implemented prototype voice font preview floater.

---
 indra/newview/CMakeLists.txt                       |   2 +
 indra/newview/llfloatervoiceeffect.cpp             | 172 +++++++++++++++++++++
 indra/newview/llfloatervoiceeffect.h               |  69 +++++++++
 indra/newview/llpanelvoiceeffect.cpp               |  10 +-
 indra/newview/llviewerfloaterreg.cpp               |   4 +-
 .../skins/default/xui/en/floater_voice_effect.xml  | 123 +++++++++++++++
 6 files changed, 375 insertions(+), 5 deletions(-)
 create mode 100644 indra/newview/llfloatervoiceeffect.cpp
 create mode 100644 indra/newview/llfloatervoiceeffect.h
 create mode 100644 indra/newview/skins/default/xui/en/floater_voice_effect.xml

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>
-- 
cgit v1.2.3