summaryrefslogtreecommitdiff
path: root/indra/media_plugins/cef
diff options
context:
space:
mode:
Diffstat (limited to 'indra/media_plugins/cef')
-rw-r--r--indra/media_plugins/cef/CMakeLists.txt20
-rw-r--r--indra/media_plugins/cef/mac_volume_catcher_null.cpp95
-rw-r--r--indra/media_plugins/cef/media_plugin_cef.cpp94
3 files changed, 142 insertions, 67 deletions
diff --git a/indra/media_plugins/cef/CMakeLists.txt b/indra/media_plugins/cef/CMakeLists.txt
index 201fb44847..5452fd9d1e 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,21 @@ set (media_plugin_cef_LINK_LIBRARIES
${LLCOMMON_LIBRARIES}
${PLUGIN_API_WINDOWS_LIBRARIES})
-
+# 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 (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.
+}
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 906a5ff6e7..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>
@@ -55,7 +56,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);
@@ -77,13 +78,14 @@ private:
void unicodeInput(LLSD native_key_data);
void checkEditState();
- void setVolume(F32 vol);
+ void setVolume();
bool mEnableMediaPluginDebugging;
std::string mHostLanguage;
bool mCookiesEnabled;
bool mPluginsEnabled;
bool mJavascriptEnabled;
+ bool mDisableGPU;
std::string mUserAgentSubtring;
std::string mAuthUsername;
std::string mAuthPassword;
@@ -94,13 +96,9 @@ private:
std::string mCachePath;
std::string mCookiePath;
std::string mPickedFile;
+ VolumeCatcher mVolumeCatcher;
+ F32 mCurVolume;
dullahan* mCEFLib;
-
- U8 *mPopupBuffer;
- U32 mPopupW;
- U32 mPopupH;
- U32 mPopupX;
- U32 mPopupY;
};
////////////////////////////////////////////////////////////////////////////////
@@ -117,6 +115,7 @@ MediaPluginBase(host_send_func, host_user_data)
mCookiesEnabled = true;
mPluginsEnabled = false;
mJavascriptEnabled = true;
+ mDisableGPU = true;
mUserAgentSubtring = "";
mAuthUsername = "";
mAuthPassword = "";
@@ -127,20 +126,18 @@ MediaPluginBase(host_send_func, host_user_data)
mCachePath = "";
mCookiePath = "";
mPickedFile = "";
+ mCurVolume = 0.0;
+
mCEFLib = new dullahan();
- mPopupBuffer = NULL;
- mPopupW = 0;
- mPopupH = 0;
- mPopupX = 0;
- mPopupY = 0;
+ setVolume();
}
////////////////////////////////////////////////////////////////////////////////
//
MediaPluginCEF::~MediaPluginCEF()
{
- delete[] mPopupBuffer;
+ mCEFLib->shutdown();
}
////////////////////////////////////////////////////////////////////////////////
@@ -161,56 +158,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);
}
@@ -258,10 +212,10 @@ void MediaPluginCEF::onLoadStartCallback()
//
void MediaPluginCEF::onRequestExitCallback()
{
- mCEFLib->shutdown();
-
LLPluginMessage message("base", "goodbye");
sendMessage(message);
+
+ mDeleteMe = true;
}
////////////////////////////////////////////////////////////////////////////////
@@ -477,7 +431,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,10 +453,12 @@ 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;
settings.frame_rate = 60;
+ settings.force_wave_audio = true;
settings.initial_height = 1024;
settings.initial_width = 1024;
settings.java_enabled = false;
@@ -755,13 +711,18 @@ 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)
{
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
@@ -840,8 +801,9 @@ void MediaPluginCEF::checkEditState()
}
}
-void MediaPluginCEF::setVolume(F32 vol)
+void MediaPluginCEF::setVolume()
{
+ mVolumeCatcher.setVolume(mCurVolume);
}
////////////////////////////////////////////////////////////////////////////////