From 2acc472e1edd2bfa3ffad5f9b9f760bcec5a3cb9 Mon Sep 17 00:00:00 2001
From: Callum Prentice <callum@gmail.com>
Date: Wed, 5 Apr 2017 14:34:14 -0700
Subject: Fix for MAINT-7227 Drop down lists do not close after use in internal
 web browser. (Surprisingly large amount of changes and new version of
 Dullahan to support this fix)

---
 indra/media_plugins/cef/media_plugin_cef.cpp | 60 ++++++----------------------
 1 file changed, 12 insertions(+), 48 deletions(-)

(limited to 'indra/media_plugins/cef')

diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 906a5ff6e7..965b755887 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -55,7 +55,7 @@ public:
 private:
 	bool init();
 
-	void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height, bool is_popup);
+	void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height);
 	void onCustomSchemeURLCallback(std::string url);
 	void onConsoleMessageCallback(std::string message, std::string source, int line);
 	void onStatusMessageCallback(std::string value);
@@ -84,6 +84,7 @@ private:
 	bool mCookiesEnabled;
 	bool mPluginsEnabled;
 	bool mJavascriptEnabled;
+	bool mDisableGPU;
 	std::string mUserAgentSubtring;
 	std::string mAuthUsername;
 	std::string mAuthPassword;
@@ -117,6 +118,7 @@ MediaPluginBase(host_send_func, host_user_data)
 	mCookiesEnabled = true;
 	mPluginsEnabled = false;
 	mJavascriptEnabled = true;
+	mDisableGPU = true;
 	mUserAgentSubtring = "";
 	mAuthUsername = "";
 	mAuthPassword = "";
@@ -161,56 +163,13 @@ void MediaPluginCEF::postDebugMessage(const std::string& msg)
 
 ////////////////////////////////////////////////////////////////////////////////
 //
-void MediaPluginCEF::onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height, bool is_popup)
+void MediaPluginCEF::onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height)
 {
-	if( is_popup )
-	{
-		delete mPopupBuffer;
-		mPopupBuffer = NULL;
-		mPopupH = 0;
-		mPopupW = 0;
-		mPopupX = 0;
-		mPopupY = 0;
-	}
-
 	if( mPixels && pixels )
 	{
-		if (is_popup)
+		if (mWidth == width && mHeight == height)
 		{
-			if( width > 0 && height> 0 )
-			{
-				mPopupBuffer = new U8[ width * height * mDepth ];
-				memcpy( mPopupBuffer, pixels, width * height * mDepth );
-				mPopupH = height;
-				mPopupW = width;
-				mPopupX = x;
-				mPopupY = mHeight - y - height;
-			}
-		}
-		else
-		{
-			if (mWidth == width && mHeight == height)
-			{
-				memcpy(mPixels, pixels, mWidth * mHeight * mDepth);
-			}
-			if( mPopupBuffer && mPopupH && mPopupW )
-			{
-				U32 bufferSize = mWidth * mHeight * mDepth;
-				U32 popupStride = mPopupW * mDepth;
-				U32 bufferStride = mWidth * mDepth;
-				int dstY = mPopupY;
-
-				int src = 0;
-				int dst = dstY  * mWidth * mDepth + mPopupX * mDepth;
-
-				for( int line = 0; dst + popupStride < bufferSize && line < mPopupH; ++line )
-				{
-					memcpy( mPixels + dst, mPopupBuffer + src, popupStride );
-					src += popupStride;
-					dst += bufferStride;
-				}
-			}
-
+			memcpy(mPixels, pixels, mWidth * mHeight * mDepth);
 		}
 		setDirty(0, 0, mWidth, mHeight);
 	}
@@ -477,7 +436,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			if (message_name == "init")
 			{
 				// event callbacks from Dullahan
-				mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6));
+				mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
 				mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1));
 				mCEFLib->setOnConsoleMessageCallback(std::bind(&MediaPluginCEF::onConsoleMessageCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
 				mCEFLib->setOnStatusMessageCallback(std::bind(&MediaPluginCEF::onStatusMessageCallback, this, std::placeholders::_1));
@@ -499,6 +458,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				settings.cache_path = mCachePath;
 				settings.cookie_store_path = mCookiePath;
 				settings.cookies_enabled = mCookiesEnabled;
+				settings.disable_gpu = mDisableGPU;
 				settings.flash_enabled = mPluginsEnabled;
 				settings.flip_mouse_y = false;
 				settings.flip_pixels_y = true;
@@ -755,6 +715,10 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			{
 				mJavascriptEnabled = message_in.getValueBoolean("enable");
 			}
+			else if (message_name == "gpu_disabled")
+			{
+				mDisableGPU = message_in.getValueBoolean("disable");
+			}
 		}
         else if (message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
         {
-- 
cgit v1.2.3


From 45f67f4ed7922e87ae5dd471bd82506f1e2300da Mon Sep 17 00:00:00 2001
From: Callum Prentice <callum@gmail.com>
Date: Wed, 19 Apr 2017 13:22:32 -0700
Subject: Hopeful fix for MAINT-7220 Windows Error Message 'SLPlugin.exe has
 stopped working ' appears.

---
 indra/media_plugins/cef/media_plugin_cef.cpp | 18 ++++--------------
 1 file changed, 4 insertions(+), 14 deletions(-)

(limited to 'indra/media_plugins/cef')

diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 965b755887..a2f7626e81 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -96,12 +96,6 @@ private:
 	std::string mCookiePath;
 	std::string mPickedFile;
 	dullahan* mCEFLib;
-
-	U8 *mPopupBuffer;
-	U32 mPopupW;
-	U32 mPopupH;
-	U32 mPopupX;
-	U32 mPopupY;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -131,18 +125,13 @@ MediaPluginBase(host_send_func, host_user_data)
 	mPickedFile = "";
 	mCEFLib = new dullahan();
 
-	mPopupBuffer = NULL;
-	mPopupW = 0;
-	mPopupH = 0;
-	mPopupX = 0;
-	mPopupY = 0;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 //
 MediaPluginCEF::~MediaPluginCEF()
 {
-	delete[] mPopupBuffer;
+	mCEFLib->shutdown();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -217,10 +206,11 @@ void MediaPluginCEF::onLoadStartCallback()
 //
 void MediaPluginCEF::onRequestExitCallback()
 {
-	mCEFLib->shutdown();
-
 	LLPluginMessage message("base", "goodbye");
 	sendMessage(message);
+
+	mDeleteMe = true;
+	//mCEFLib->shutdown();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From c49eeb9a6202c5c38338ef229851bd84901ee24c Mon Sep 17 00:00:00 2001
From: Callum Prentice <callum@gmail.com>
Date: Wed, 19 Apr 2017 15:59:29 -0700
Subject: Add back the missing pieces and updated code for the example plugin. 
 It was useful during testing SLPlugin changes. Not shipped with release
 versions of viewer

---
 indra/media_plugins/cef/media_plugin_cef.cpp | 1 -
 1 file changed, 1 deletion(-)

(limited to 'indra/media_plugins/cef')

diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index a2f7626e81..69717be91f 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -210,7 +210,6 @@ void MediaPluginCEF::onRequestExitCallback()
 	sendMessage(message);
 
 	mDeleteMe = true;
-	//mCEFLib->shutdown();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From 8f95d9ad6e4a5eb9d0556adb89eef613458f7c72 Mon Sep 17 00:00:00 2001
From: Callum Prentice <callum@gmail.com>
Date: Thu, 27 Apr 2017 18:04:00 -0700
Subject: FIX for MAINT-6950 Shared media a great distance away (different
 region even) sometimes plays at maximum volume when entering a region or
 moving camera slightly.

---
 indra/media_plugins/cef/CMakeLists.txt       |  8 +++++++-
 indra/media_plugins/cef/media_plugin_cef.cpp | 17 +++++++++++++----
 2 files changed, 20 insertions(+), 5 deletions(-)

(limited to 'indra/media_plugins/cef')

diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 201fb44847..be3cec19c6 100644
--- a/indra/media_plugins/cef/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -46,6 +46,10 @@ set(media_plugin_cef_SOURCE_FILES
     media_plugin_cef.cpp
     )
 
+set(media_plugin_cef_HEADER_FILES
+    volume_catcher.h
+    )
+
 set (media_plugin_cef_LINK_LIBRARIES
   ${LLPLUGIN_LIBRARIES}
   ${MEDIA_PLUGIN_BASE_LIBRARIES}
@@ -53,7 +57,9 @@ set (media_plugin_cef_LINK_LIBRARIES
   ${LLCOMMON_LIBRARIES}
   ${PLUGIN_API_WINDOWS_LIBRARIES})
 
-
+if (WINDOWS)
+  list(APPEND media_plugin_cef_SOURCE_FILES windows_volume_catcher.cpp)
+endif (WINDOWS)
 
 set_source_files_properties(${media_plugin_cef_HEADER_FILES}
                             PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 69717be91f..796e262d6f 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -34,6 +34,7 @@
 #include "llplugininstance.h"
 #include "llpluginmessage.h"
 #include "llpluginmessageclasses.h"
+#include "volume_catcher.h"
 #include "media_plugin_base.h"
 
 #include <functional>
@@ -77,7 +78,7 @@ private:
 	void unicodeInput(LLSD native_key_data);
 
 	void checkEditState();
-    void setVolume(F32 vol);
+    void setVolume();
 
 	bool mEnableMediaPluginDebugging;
 	std::string mHostLanguage;
@@ -95,6 +96,8 @@ private:
 	std::string mCachePath;
 	std::string mCookiePath;
 	std::string mPickedFile;
+	VolumeCatcher mVolumeCatcher;
+	F32 mCurVolume;
 	dullahan* mCEFLib;
 };
 
@@ -123,8 +126,11 @@ MediaPluginBase(host_send_func, host_user_data)
 	mCachePath = "";
 	mCookiePath = "";
 	mPickedFile = "";
+	mCurVolume = 0.0;
+
 	mCEFLib = new dullahan();
 
+	setVolume();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -452,6 +458,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 				settings.flip_mouse_y = false;
 				settings.flip_pixels_y = true;
 				settings.frame_rate = 60;
+				settings.force_wave_audio = true;
 				settings.initial_height = 1024;
 				settings.initial_width = 1024;
 				settings.java_enabled = false;
@@ -713,8 +720,9 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
         {
             if (message_name == "set_volume")
             {
-                F32 volume = (F32)message_in.getValueReal("volume");
-                setVolume(volume);
+				F32 volume = (F32)message_in.getValueReal("volume");
+				mCurVolume = volume;
+                setVolume();
             }
         }
         else
@@ -793,8 +801,9 @@ void MediaPluginCEF::checkEditState()
 	}
 }
 
-void MediaPluginCEF::setVolume(F32 vol)
+void MediaPluginCEF::setVolume()
 {
+	mVolumeCatcher.setVolume(mCurVolume);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-- 
cgit v1.2.3


From 0c9758820c838eb84c5f334c99f1fc6d92a2b740 Mon Sep 17 00:00:00 2001
From: "callum@lindenlab.com" <callum@lindenlab.com>
Date: Fri, 28 Apr 2017 13:48:36 -0700
Subject: Add NULL macOs implementation for 'MAINT-6950 Shared media a great
 distance away (different region even) sometimes plays at maximum volume when
 entering a region or moving camera slightly.' - until we can understand how
 to make real mac_volume_catcher work

---
 indra/media_plugins/cef/CMakeLists.txt             | 16 +++-
 .../media_plugins/cef/mac_volume_catcher_null.cpp  | 95 ++++++++++++++++++++++
 2 files changed, 109 insertions(+), 2 deletions(-)
 create mode 100644 indra/media_plugins/cef/mac_volume_catcher_null.cpp

(limited to 'indra/media_plugins/cef')

diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index be3cec19c6..5452fd9d1e 100644
--- a/indra/media_plugins/cef/CMakeLists.txt
+++ b/indra/media_plugins/cef/CMakeLists.txt
@@ -57,9 +57,21 @@ set (media_plugin_cef_LINK_LIBRARIES
   ${LLCOMMON_LIBRARIES}
   ${PLUGIN_API_WINDOWS_LIBRARIES})
 
-if (WINDOWS)
+# Select which VolumeCatcher implementation to use
+if (LINUX)
+  message(FATAL_ERROR "CEF plugin has been enabled for a Linux compile.\n"
+    "  Please create a volume_catcher implementation for this platform.")
+elseif (DARWIN)
+  list(APPEND media_plugin_cef_SOURCE_FILES mac_volume_catcher_null.cpp)
+  find_library(CORESERVICES_LIBRARY CoreServices)
+  find_library(AUDIOUNIT_LIBRARY AudioUnit)
+  list(APPEND media_plugin_cef_LINK_LIBRARIES
+       ${CORESERVICES_LIBRARY}     # for Component Manager calls
+       ${AUDIOUNIT_LIBRARY}        # for AudioUnit calls
+       )
+elseif (WINDOWS)
   list(APPEND media_plugin_cef_SOURCE_FILES windows_volume_catcher.cpp)
-endif (WINDOWS)
+endif (LINUX)
 
 set_source_files_properties(${media_plugin_cef_HEADER_FILES}
                             PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/indra/media_plugins/cef/mac_volume_catcher_null.cpp b/indra/media_plugins/cef/mac_volume_catcher_null.cpp
new file mode 100644
index 0000000000..f4fcef71aa
--- /dev/null
+++ b/indra/media_plugins/cef/mac_volume_catcher_null.cpp
@@ -0,0 +1,95 @@
+/** 
+ * @file windows_volume_catcher.cpp
+ * @brief A null implementation of volume level control of all audio channels opened by a process.
+ *        We are using this for the macOS version for now until we can understand how to make the 
+ *        exitising mac_volume_catcher.cpp work without the (now, non-existant) QuickTime dependency
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "volume_catcher.h"
+#include "llsingleton.h"
+class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl>
+{
+	LLSINGLETON(VolumeCatcherImpl);
+	// This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance.
+	~VolumeCatcherImpl();
+
+public:
+
+	void setVolume(F32 volume);
+	void setPan(F32 pan);
+	
+private:
+	F32 	mVolume;
+	F32 	mPan;
+	bool mSystemIsVistaOrHigher;
+};
+
+VolumeCatcherImpl::VolumeCatcherImpl()
+:	mVolume(1.0f),			// default volume is max
+	mPan(0.f)				// default pan is centered
+{
+}
+
+VolumeCatcherImpl::~VolumeCatcherImpl()
+{
+}
+
+void VolumeCatcherImpl::setVolume(F32 volume)
+{
+	mVolume = volume;
+}
+
+void VolumeCatcherImpl::setPan(F32 pan)
+{	// remember pan for calculating individual channel levels later
+	mPan = pan;
+}
+
+/////////////////////////////////////////////////////
+
+VolumeCatcher::VolumeCatcher()
+{
+	pimpl = VolumeCatcherImpl::getInstance();
+}
+
+VolumeCatcher::~VolumeCatcher()
+{
+	// Let the instance persist until exit.
+}
+
+void VolumeCatcher::setVolume(F32 volume)
+{
+	pimpl->setVolume(volume);
+}
+
+void VolumeCatcher::setPan(F32 pan)
+{
+	pimpl->setPan(pan);
+}
+
+void VolumeCatcher::pump()
+{
+	// No periodic tasks are necessary for this implementation.
+}
-- 
cgit v1.2.3