From 477b45be1be256b7496e1d45b41754c6e40ef58a Mon Sep 17 00:00:00 2001 From: Maki Date: Fri, 19 Apr 2024 02:32:29 -0400 Subject: Add toggle for PipeWire volume catcher, and refactoring --- .../media_plugins/cef/linux/volume_catcher_linux.h | 151 +++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 indra/media_plugins/cef/linux/volume_catcher_linux.h (limited to 'indra/media_plugins/cef/linux/volume_catcher_linux.h') diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.h b/indra/media_plugins/cef/linux/volume_catcher_linux.h new file mode 100644 index 0000000000..5149dd62e0 --- /dev/null +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.h @@ -0,0 +1,151 @@ +/** + * @file volume_catcher_impl.h + * @brief + * + * @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 + */ + +#ifndef VOLUME_CATCHER_LINUX_H +#define VOLUME_CATCHER_LINUX_H + +#include "linden_common.h" + +#include "../volume_catcher.h" + +#include +#include + +extern "C" { +// There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken. +#include +#include + +#include + +#include "apr_pools.h" +#include "apr_dso.h" +} + +#include "media_plugin_base.h" + +class VolumeCatcherPulseAudio : public virtual VolumeCatcherImpl +{ +public: + VolumeCatcherPulseAudio(); + ~VolumeCatcherPulseAudio(); + + void setVolume(F32 volume); + void setPan(F32 pan); + void pump(); + + // for internal use - can't be private because used from our C callbacks + + bool loadsyms(std::string pa_dso_name); + void init(); + void cleanup(); + + void update_all_volumes(F32 volume); + void update_index_volume(U32 index, F32 volume); + void connected_okay(); + + std::set mSinkInputIndices; + std::map mSinkInputNumChannels; + F32 mDesiredVolume; + pa_glib_mainloop *mMainloop; + pa_context *mPAContext; + bool mConnected; + bool mGotSyms; +}; + +class VolumeCatcherPipeWire : public virtual VolumeCatcherImpl +{ +public: + VolumeCatcherPipeWire(); + ~VolumeCatcherPipeWire(); + + bool loadsyms(std::string pw_dso_name); + void init(); + void cleanup(); + + // some of these should be private + + void pwLock(); + void pwUnlock(); + + void setVolume(F32 volume); + void setPan(F32 pan); + void pump(); + + void handleRegistryEventGlobal( + uint32_t id, uint32_t permissions, const char* type, + uint32_t version, const struct spa_dict* props + ); + + class ChildNode + { + public: + bool mActive = false; + + pw_proxy* mProxy = nullptr; + spa_hook mNodeListener {}; + spa_hook mProxyListener {}; + VolumeCatcherPipeWire* mImpl = nullptr; + + void updateVolume(); + void destroy(); + }; + + bool mGotSyms = false; + + F32 mVolume = 1.0f; // max by default + // F32 mPan = 0.0f; // center + + pw_thread_loop* mThreadLoop; + pw_context* mContext; + pw_core* mCore; + pw_registry* mRegistry; + spa_hook mRegistryListener; + + std::unordered_set mChildNodes; + std::mutex mChildNodesMutex; +}; + +// static void debugClear() +// { +// auto file = fopen("volume-catcher-log.txt", "w"); +// fprintf(file, "\n"); +// fclose(file); +// } + +// static void debugPrint(const char* format, ...) +// { +// va_list args; +// va_start(args, format); +// auto file = fopen("volume-catcher-log.txt", "a"); +// vfprintf(file, format, args); +// fclose(file); +// va_end(args); +// } + +#endif // VOLUME_CATCHER_LINUX_H -- cgit v1.3 From 576508ebab789207c5d82c13ff627cb623d74994 Mon Sep 17 00:00:00 2001 From: Maki Date: Sat, 20 Apr 2024 17:35:30 -0400 Subject: Use RAII for mutexes for PipeWire volume catcher --- .../media_plugins/cef/linux/volume_catcher_linux.h | 4 +-- .../cef/linux/volume_catcher_pipewire.cpp | 39 +++++++++++----------- 2 files changed, 21 insertions(+), 22 deletions(-) (limited to 'indra/media_plugins/cef/linux/volume_catcher_linux.h') diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.h b/indra/media_plugins/cef/linux/volume_catcher_linux.h index 5149dd62e0..0f11c537b1 100644 --- a/indra/media_plugins/cef/linux/volume_catcher_linux.h +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.h @@ -90,8 +90,8 @@ public: // some of these should be private - void pwLock(); - void pwUnlock(); + void lock(); + void unlock(); void setVolume(F32 volume); void setPan(F32 pan); diff --git a/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp b/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp index a779cf868e..c05054cf52 100755 --- a/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp +++ b/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp @@ -100,19 +100,20 @@ void VolumeCatcherPipeWire::init() if (!mThreadLoop) return; - pwLock(); + // i dont think we need to lock this early + // std::lock_guard pwLock(*this); mContext = llpw_context_new( llpw_thread_loop_get_loop(mThreadLoop), NULL, 0 ); if (!mContext) - return pwUnlock(); + return; mCore = llpw_context_connect(mContext, NULL, 0); if (!mCore) - return pwUnlock(); + return; mRegistry = pw_core_get_registry(mCore, PW_VERSION_REGISTRY, 0); @@ -126,26 +127,24 @@ void VolumeCatcherPipeWire::init() llpw_thread_loop_start(mThreadLoop); - pwUnlock(); - // debugPrint("started thread loop\n"); } void VolumeCatcherPipeWire::cleanup() { - mChildNodesMutex.lock(); + std::unique_lock childNodesLock(mChildNodesMutex); for (auto* childNode : mChildNodes) { childNode->destroy(); } mChildNodes.clear(); - mChildNodesMutex.unlock(); + childNodesLock.unlock(); - pwLock(); + std::unique_lock pwLock(*this); if (mRegistry) llpw_proxy_destroy((struct pw_proxy*)mRegistry); spa_zero(mRegistryListener); if (mCore) llpw_core_disconnect(mCore); if (mContext) llpw_context_destroy(mContext); - pwUnlock(); + pwLock.unlock(); if (!mThreadLoop) return; @@ -156,16 +155,16 @@ void VolumeCatcherPipeWire::cleanup() // debugPrint("cleanup done\n"); } -void VolumeCatcherPipeWire::pwLock() { +void VolumeCatcherPipeWire::lock() { if (!mThreadLoop) return; llpw_thread_loop_lock(mThreadLoop); } -void VolumeCatcherPipeWire::pwUnlock() { +void VolumeCatcherPipeWire::unlock() { if (!mThreadLoop) - return; + return; llpw_thread_loop_unlock(mThreadLoop); } @@ -210,9 +209,9 @@ void VolumeCatcherPipeWire::ChildNode::updateVolume() spa_pod_builder_array(&builder, sizeof(float), SPA_TYPE_Float, channels, volumes); spa_pod* pod = static_cast(spa_pod_builder_pop(&builder, &frame)); - mImpl->pwLock(); + std::lock_guard pwLock(*mImpl); + pw_node_set_param(mProxy, SPA_PARAM_Props, 0, pod); - mImpl->pwUnlock(); } void VolumeCatcherPipeWire::ChildNode::destroy() @@ -229,9 +228,9 @@ void VolumeCatcherPipeWire::ChildNode::destroy() spa_hook_remove(&mNodeListener); spa_hook_remove(&mProxyListener); - mImpl->pwLock(); + std::lock_guard pwLock(*mImpl); + llpw_proxy_destroy(mProxy); - mImpl->pwUnlock(); } static void nodeEventInfo(void* data, const struct pw_node_info* info) @@ -254,9 +253,9 @@ static void nodeEventInfo(void* data, const struct pw_node_info* info) childNode->updateVolume(); - childNode->mImpl->mChildNodesMutex.lock(); + std::lock_guard childNodesLock(childNode->mImpl->mChildNodesMutex); + childNode->mImpl->mChildNodes.insert(childNode); - childNode->mImpl->mChildNodesMutex.unlock(); } static const struct pw_node_events NODE_EVENTS = { @@ -314,9 +313,9 @@ void VolumeCatcherPipeWire::setVolume(F32 volume) mVolume = volume; - mChildNodesMutex.lock(); + std::unique_lock childNodeslock(mChildNodesMutex); std::unordered_set copyOfChildNodes(mChildNodes); - mChildNodesMutex.unlock(); + childNodeslock.unlock(); // debugPrint("for %d nodes\n", copyOfChildNodes.size()); -- cgit v1.3 From 19c6368991706d1bcb4a3b02e08cd70e1e6324c7 Mon Sep 17 00:00:00 2001 From: Nicky Date: Sun, 21 Apr 2024 18:50:38 +0200 Subject: Stream the volume catcher a little: - Use LL_DEBUGS() for potential debug output. - Enclose mutex locking in their own scope, to make unlocking automatic and also limit the life time of a lock to as short as possible - Introduce mCleanupMutex to replace std::unique_lock pwLock(*this). I'm baffled using lock as a mutex like that did even compile. - Remove virtual inheritance, as it is not needed here. --- .../cef/linux/volume_catcher_linux.cpp | 28 ++-- .../media_plugins/cef/linux/volume_catcher_linux.h | 30 +---- .../cef/linux/volume_catcher_pipewire.cpp | 141 ++++++++++----------- indra/media_plugins/cef/volume_catcher.h | 2 +- 4 files changed, 86 insertions(+), 115 deletions(-) (limited to 'indra/media_plugins/cef/linux/volume_catcher_linux.h') diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.cpp b/indra/media_plugins/cef/linux/volume_catcher_linux.cpp index 3c037b45ba..439c0a6768 100644 --- a/indra/media_plugins/cef/linux/volume_catcher_linux.cpp +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.cpp @@ -32,28 +32,29 @@ VolumeCatcher::VolumeCatcher() { - // only init once we receive which implementation to use - - // debugClear(); - // debugPrint("init volume catcher\n"); } -void VolumeCatcher::onEnablePipeWireVolumeCatcher(bool enable) { +void VolumeCatcher::onEnablePipeWireVolumeCatcher(bool enable) +{ if (pimpl != nullptr) return; - if (enable) { - // debugPrint("volume catcher using pipewire\n"); + if (enable) + { + LL_DEBUGS() << "volume catcher using pipewire" << LL_ENDL; pimpl = new VolumeCatcherPipeWire(); - } else { - // debugPrint("volume catcher using pulseaudio\n"); + } + else + { + LL_DEBUGS() << "volume catcher using pulseaudio" << LL_ENDL; pimpl = new VolumeCatcherPulseAudio(); } } VolumeCatcher::~VolumeCatcher() { - if (pimpl != nullptr) { + if (pimpl != nullptr) + { delete pimpl; pimpl = nullptr; } @@ -68,15 +69,12 @@ void VolumeCatcher::setVolume(F32 volume) void VolumeCatcher::setPan(F32 pan) { - if (pimpl != nullptr) { + if (pimpl != nullptr) pimpl->setPan(pan); - } } void VolumeCatcher::pump() { - if (pimpl != nullptr) { + if (pimpl != nullptr) pimpl->pump(); - } } - diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.h b/indra/media_plugins/cef/linux/volume_catcher_linux.h index 0f11c537b1..ff00d0672e 100644 --- a/indra/media_plugins/cef/linux/volume_catcher_linux.h +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.h @@ -49,7 +49,7 @@ extern "C" { #include "media_plugin_base.h" -class VolumeCatcherPulseAudio : public virtual VolumeCatcherImpl +class VolumeCatcherPulseAudio : public VolumeCatcherImpl { public: VolumeCatcherPulseAudio(); @@ -78,7 +78,7 @@ public: bool mGotSyms; }; -class VolumeCatcherPipeWire : public virtual VolumeCatcherImpl +class VolumeCatcherPipeWire : public VolumeCatcherImpl { public: VolumeCatcherPipeWire(); @@ -121,31 +121,15 @@ public: F32 mVolume = 1.0f; // max by default // F32 mPan = 0.0f; // center - pw_thread_loop* mThreadLoop; - pw_context* mContext; - pw_core* mCore; - pw_registry* mRegistry; + pw_thread_loop* mThreadLoop = nullptr; + pw_context* mContext = nullptr; + pw_core* mCore = nullptr; + pw_registry* mRegistry = nullptr; spa_hook mRegistryListener; std::unordered_set mChildNodes; std::mutex mChildNodesMutex; + std::mutex mCleanupMutex; }; -// static void debugClear() -// { -// auto file = fopen("volume-catcher-log.txt", "w"); -// fprintf(file, "\n"); -// fclose(file); -// } - -// static void debugPrint(const char* format, ...) -// { -// va_list args; -// va_start(args, format); -// auto file = fopen("volume-catcher-log.txt", "a"); -// vfprintf(file, format, args); -// fclose(file); -// va_end(args); -// } - #endif // VOLUME_CATCHER_LINUX_H diff --git a/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp b/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp index ca1808d63c..027fdb77f6 100755 --- a/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp +++ b/indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp @@ -62,8 +62,7 @@ VolumeCatcherPipeWire::~VolumeCatcherPipeWire() static void registryEventGlobal( void *data, uint32_t id, uint32_t permissions, const char *type, - uint32_t version, const struct spa_dict *props -) + uint32_t version, const struct spa_dict *props) { static_cast(data)->handleRegistryEventGlobal( id, permissions, type, version, props @@ -82,14 +81,14 @@ bool VolumeCatcherPipeWire::loadsyms(std::string pw_dso_name) void VolumeCatcherPipeWire::init() { - // debugPrint("init\n"); - + LL_DEBUGS() << "init" << LL_ENDL; + mGotSyms = loadsyms("libpipewire-0.3.so.0"); if (!mGotSyms) return; - // debugPrint("got syms\n"); + LL_DEBUGS() << "successfully got symbols" << LL_ENDL; llpw_init(NULL, NULL); @@ -115,7 +114,7 @@ void VolumeCatcherPipeWire::init() mRegistry = pw_core_get_registry(mCore, PW_VERSION_REGISTRY, 0); - // debugPrint("got registry\n"); + LL_DEBUGS() << "pw_core_get_registry: " << (mRegistry?"success":"nullptr") << LL_ENDL; spa_zero(mRegistryListener); @@ -125,27 +124,31 @@ void VolumeCatcherPipeWire::init() llpw_thread_loop_start(mThreadLoop); - // debugPrint("started thread loop\n"); + LL_DEBUGS() << "thread loop started" << LL_ENDL; } void VolumeCatcherPipeWire::cleanup() { - std::unique_lock childNodesLock(mChildNodesMutex); - for (auto* childNode : mChildNodes) { - childNode->destroy(); - } - mChildNodes.clear(); - childNodesLock.unlock(); - - std::unique_lock pwLock(*this); - if (mRegistry) - llpw_proxy_destroy((struct pw_proxy*)mRegistry); - spa_zero(mRegistryListener); - if (mCore) - llpw_core_disconnect(mCore); - if (mContext) - llpw_context_destroy(mContext); - pwLock.unlock(); + { + std::unique_lock childNodesLock(mChildNodesMutex); + for (auto *childNode: mChildNodes) + childNode->destroy(); + + mChildNodes.clear(); + } + + { + std::unique_lock pwLock(mCleanupMutex); + if (mRegistry) + llpw_proxy_destroy((struct pw_proxy *) mRegistry); + + spa_zero(mRegistryListener); + + if (mCore) + llpw_core_disconnect(mCore); + if (mContext) + llpw_context_destroy(mContext); + } if (!mThreadLoop) return; @@ -153,49 +156,33 @@ void VolumeCatcherPipeWire::cleanup() llpw_thread_loop_stop(mThreadLoop); llpw_thread_loop_destroy(mThreadLoop); - // debugPrint("cleanup done\n"); + LL_DEBUGS() << "cleanup done" << LL_ENDL; } -void VolumeCatcherPipeWire::lock() { +void VolumeCatcherPipeWire::lock() +{ if (!mThreadLoop) return; llpw_thread_loop_lock(mThreadLoop); } -void VolumeCatcherPipeWire::unlock() { +void VolumeCatcherPipeWire::unlock() +{ if (!mThreadLoop) return; llpw_thread_loop_unlock(mThreadLoop); } -// #define INV_LERP(a, b, v) (v - a) / (b - a) - -// #include - void VolumeCatcherPipeWire::ChildNode::updateVolume() { if (!mActive) return; F32 volume = std::clamp(mImpl->mVolume, 0.0f, 1.0f); - // F32 pan = std::clamp(mImpl->mPan, -1.0f, 1.0f); - - // debugClear(); - // struct timeval time; - // gettimeofday(&time, NULL); - // double t = (double)time.tv_sec + (double)(time.tv_usec / 1000) / 1000; - // debugPrint("time is %f\n", t); - // F32 pan = std::sin(t * 2.0d); - // debugPrint("pan is %f\n", pan); - - // uint32_t channels = 2; - // float volumes[channels]; - // volumes[1] = INV_LERP(-1.0f, 0.0f, pan) * volume; // left - // volumes[0] = INV_LERP(1.0f, 0.0f, pan) * volume; // right - - uint32_t channels = 1; + + const uint32_t channels = 1; float volumes[channels]; volumes[0] = volume; @@ -210,9 +197,10 @@ void VolumeCatcherPipeWire::ChildNode::updateVolume() spa_pod_builder_array(&builder, sizeof(float), SPA_TYPE_Float, channels, volumes); spa_pod* pod = static_cast(spa_pod_builder_pop(&builder, &frame)); - std::lock_guard pwLock(*mImpl); - - pw_node_set_param(mProxy, SPA_PARAM_Props, 0, pod); + { + std::lock_guard pwLock(*mImpl); + pw_node_set_param(mProxy, SPA_PARAM_Props, 0, pod); + } } void VolumeCatcherPipeWire::ChildNode::destroy() @@ -222,16 +210,18 @@ void VolumeCatcherPipeWire::ChildNode::destroy() mActive = false; - std::unique_lock childNodesLock(mImpl->mChildNodesMutex); - mImpl->mChildNodes.erase(this); - childNodesLock.unlock(); - + { + std::unique_lock childNodesLock(mImpl->mChildNodesMutex); + mImpl->mChildNodes.erase(this); + } + spa_hook_remove(&mNodeListener); spa_hook_remove(&mProxyListener); - std::lock_guard pwLock(*mImpl); - - llpw_proxy_destroy(mProxy); + { + std::lock_guard pwLock(*mImpl); + llpw_proxy_destroy(mProxy); + } } static void nodeEventInfo(void* data, const struct pw_node_info* info) @@ -246,17 +236,18 @@ static void nodeEventInfo(void* data, const struct pw_node_info* info) if (!isPluginPid(pid)) return; - // const char* appName = spa_dict_lookup(info->props, PW_KEY_APP_NAME); - // debugPrint("got app: %s\n", appName); + const char* appName = spa_dict_lookup(info->props, PW_KEY_APP_NAME); + LL_DEBUGS() << "got app: " << appName << LL_ENDL; auto* const childNode = static_cast(data); - // debugPrint("init volume to: %f\n", childNode->mImpl->mVolume); + LL_DEBUGS() << "init volume: " << childNode->mImpl->mVolume << LL_ENDL; childNode->updateVolume(); - std::lock_guard childNodesLock(childNode->mImpl->mChildNodesMutex); - - childNode->mImpl->mChildNodes.insert(childNode); + { + std::lock_guard childNodesLock(childNode->mImpl->mChildNodesMutex); + childNode->mImpl->mChildNodes.insert(childNode); + } } static const struct pw_node_events NODE_EVENTS = { @@ -284,9 +275,9 @@ static const struct pw_proxy_events PROXY_EVENTS = { void VolumeCatcherPipeWire::handleRegistryEventGlobal( uint32_t id, uint32_t permissions, const char *type, uint32_t version, - const struct spa_dict *props -) { - if (props == nullptr || strcmp(type, PW_TYPE_INTERFACE_Node) != 0) + const struct spa_dict *props) +{ + if (props == nullptr || type == nullptr || strcmp(type, PW_TYPE_INTERFACE_Node) != 0) return; const char* mediaClass = spa_dict_lookup(props, PW_KEY_MEDIA_CLASS); @@ -310,27 +301,25 @@ void VolumeCatcherPipeWire::handleRegistryEventGlobal( void VolumeCatcherPipeWire::setVolume(F32 volume) { - // debugPrint("setting all volume to: %f\n", volume); + LL_DEBUGS() << "setting volume to: " << volume << LL_ENDL; mVolume = volume; - std::unique_lock childNodeslock(mChildNodesMutex); - std::unordered_set copyOfChildNodes(mChildNodes); - childNodeslock.unlock(); + { + std::unique_lock childNodeslock(mChildNodesMutex); + std::unordered_set copyOfChildNodes(mChildNodes); - // debugPrint("for %d nodes\n", copyOfChildNodes.size()); + LL_DEBUGS() << "found " << copyOfChildNodes.size() << " child nodes" << LL_ENDL; - for (auto* childNode : copyOfChildNodes) { - childNode->updateVolume(); - } + for (auto* childNode : copyOfChildNodes) + childNode->updateVolume(); + } } void VolumeCatcherPipeWire::setPan(F32 pan) { - // mPan = pan; - // setVolume(mVolume); } void VolumeCatcherPipeWire::pump() { -} \ No newline at end of file +} diff --git a/indra/media_plugins/cef/volume_catcher.h b/indra/media_plugins/cef/volume_catcher.h index e11ecf5881..3e53a7e961 100644 --- a/indra/media_plugins/cef/volume_catcher.h +++ b/indra/media_plugins/cef/volume_catcher.h @@ -43,7 +43,7 @@ public: virtual void pump() = 0; // call this at least a few times a second if you can - it affects how quickly we can 'catch' a new audio source and adjust its volume }; -class VolumeCatcher : public virtual VolumeCatcherImpl +class VolumeCatcher : public VolumeCatcherImpl { public: VolumeCatcher(); -- cgit v1.3 From 7d62d0c5752814f27a17c86618f628d0e4ff9b0d Mon Sep 17 00:00:00 2001 From: Nicky Date: Wed, 22 May 2024 13:20:39 +0200 Subject: Move Linux specific VolumeCatcherImport into the linux specific files. --- .../cef/linux/volume_catcher_linux.cpp | 12 +++++----- .../media_plugins/cef/linux/volume_catcher_linux.h | 26 +++++++++++++++++----- indra/media_plugins/cef/volume_catcher.h | 16 ++----------- 3 files changed, 27 insertions(+), 27 deletions(-) (limited to 'indra/media_plugins/cef/linux/volume_catcher_linux.h') diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.cpp b/indra/media_plugins/cef/linux/volume_catcher_linux.cpp index b4d20935e7..7d33242063 100644 --- a/indra/media_plugins/cef/linux/volume_catcher_linux.cpp +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.cpp @@ -1,4 +1,4 @@ -/** +/** * @file volume_catcher.cpp * @brief Linux volume catcher which will pick an implementation to use * @@ -6,21 +6,21 @@ * $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 @@ -28,8 +28,6 @@ #include "volume_catcher_linux.h" -//////////////////////////////////////////////////// - VolumeCatcher::VolumeCatcher() { } diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.h b/indra/media_plugins/cef/linux/volume_catcher_linux.h index ff00d0672e..9101575b70 100644 --- a/indra/media_plugins/cef/linux/volume_catcher_linux.h +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.h @@ -1,26 +1,26 @@ -/** +/** * @file volume_catcher_impl.h - * @brief + * @brief * * @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 @@ -49,6 +49,20 @@ extern "C" { #include "media_plugin_base.h" +class VolumeCatcherImpl +{ +public: + virtual ~VolumeCatcherImpl() = default; + + virtual void setVolume(F32 volume) = 0; // 0.0 - 1.0 + + // Set the left-right pan of audio sources + // where -1.0 = left, 0 = center, and 1.0 = right + virtual void setPan(F32 pan) = 0; + + virtual void pump() = 0; // call this at least a few times a second if you can - it affects how quickly we can 'catch' a new audio source and adjust its volume +}; + class VolumeCatcherPulseAudio : public VolumeCatcherImpl { public: diff --git a/indra/media_plugins/cef/volume_catcher.h b/indra/media_plugins/cef/volume_catcher.h index 51a309fb97..d6ac8e9159 100644 --- a/indra/media_plugins/cef/volume_catcher.h +++ b/indra/media_plugins/cef/volume_catcher.h @@ -31,21 +31,9 @@ #include "linden_common.h" -class VolumeCatcherImpl -{ -public: - virtual ~VolumeCatcherImpl() = default; - - virtual void setVolume(F32 volume) = 0; // 0.0 - 1.0 - - // Set the left-right pan of audio sources - // where -1.0 = left, 0 = center, and 1.0 = right - virtual void setPan(F32 pan) = 0; - - virtual void pump() = 0; // call this at least a few times a second if you can - it affects how quickly we can 'catch' a new audio source and adjust its volume -}; +class VolumeCatcherImpl; -class VolumeCatcher : public VolumeCatcherImpl +class VolumeCatcher { public: VolumeCatcher(); -- cgit v1.3 From 8789d372c7617d86a30395190db4dba3b8545226 Mon Sep 17 00:00:00 2001 From: Nicky Date: Wed, 22 May 2024 13:31:15 +0200 Subject: Tabs to spaces. --- .../media_plugins/cef/linux/volume_catcher_linux.h | 132 ++++++++++----------- indra/media_plugins/cef/volume_catcher.h | 14 +-- 2 files changed, 73 insertions(+), 73 deletions(-) (limited to 'indra/media_plugins/cef/linux/volume_catcher_linux.h') diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.h b/indra/media_plugins/cef/linux/volume_catcher_linux.h index 9101575b70..475e8ca52e 100644 --- a/indra/media_plugins/cef/linux/volume_catcher_linux.h +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.h @@ -52,97 +52,97 @@ extern "C" { class VolumeCatcherImpl { public: - virtual ~VolumeCatcherImpl() = default; + virtual ~VolumeCatcherImpl() = default; - virtual void setVolume(F32 volume) = 0; // 0.0 - 1.0 + virtual void setVolume(F32 volume) = 0; // 0.0 - 1.0 - // Set the left-right pan of audio sources - // where -1.0 = left, 0 = center, and 1.0 = right - virtual void setPan(F32 pan) = 0; + // Set the left-right pan of audio sources + // where -1.0 = left, 0 = center, and 1.0 = right + virtual void setPan(F32 pan) = 0; - virtual void pump() = 0; // call this at least a few times a second if you can - it affects how quickly we can 'catch' a new audio source and adjust its volume + virtual void pump() = 0; // call this at least a few times a second if you can - it affects how quickly we can 'catch' a new audio source and adjust its volume }; class VolumeCatcherPulseAudio : public VolumeCatcherImpl { public: - VolumeCatcherPulseAudio(); - ~VolumeCatcherPulseAudio(); - - void setVolume(F32 volume); - void setPan(F32 pan); - void pump(); - - // for internal use - can't be private because used from our C callbacks - - bool loadsyms(std::string pa_dso_name); - void init(); - void cleanup(); - - void update_all_volumes(F32 volume); - void update_index_volume(U32 index, F32 volume); - void connected_okay(); - - std::set mSinkInputIndices; - std::map mSinkInputNumChannels; - F32 mDesiredVolume; - pa_glib_mainloop *mMainloop; - pa_context *mPAContext; - bool mConnected; - bool mGotSyms; + VolumeCatcherPulseAudio(); + ~VolumeCatcherPulseAudio(); + + void setVolume(F32 volume); + void setPan(F32 pan); + void pump(); + + // for internal use - can't be private because used from our C callbacks + + bool loadsyms(std::string pa_dso_name); + void init(); + void cleanup(); + + void update_all_volumes(F32 volume); + void update_index_volume(U32 index, F32 volume); + void connected_okay(); + + std::set mSinkInputIndices; + std::map mSinkInputNumChannels; + F32 mDesiredVolume; + pa_glib_mainloop *mMainloop; + pa_context *mPAContext; + bool mConnected; + bool mGotSyms; }; class VolumeCatcherPipeWire : public VolumeCatcherImpl { public: - VolumeCatcherPipeWire(); - ~VolumeCatcherPipeWire(); + VolumeCatcherPipeWire(); + ~VolumeCatcherPipeWire(); - bool loadsyms(std::string pw_dso_name); - void init(); - void cleanup(); + bool loadsyms(std::string pw_dso_name); + void init(); + void cleanup(); - // some of these should be private + // some of these should be private - void lock(); - void unlock(); + void lock(); + void unlock(); - void setVolume(F32 volume); - void setPan(F32 pan); - void pump(); + void setVolume(F32 volume); + void setPan(F32 pan); + void pump(); - void handleRegistryEventGlobal( - uint32_t id, uint32_t permissions, const char* type, - uint32_t version, const struct spa_dict* props - ); + void handleRegistryEventGlobal( + uint32_t id, uint32_t permissions, const char* type, + uint32_t version, const struct spa_dict* props + ); - class ChildNode - { - public: - bool mActive = false; + class ChildNode + { + public: + bool mActive = false; - pw_proxy* mProxy = nullptr; - spa_hook mNodeListener {}; - spa_hook mProxyListener {}; - VolumeCatcherPipeWire* mImpl = nullptr; + pw_proxy* mProxy = nullptr; + spa_hook mNodeListener {}; + spa_hook mProxyListener {}; + VolumeCatcherPipeWire* mImpl = nullptr; - void updateVolume(); - void destroy(); - }; + void updateVolume(); + void destroy(); + }; - bool mGotSyms = false; + bool mGotSyms = false; - F32 mVolume = 1.0f; // max by default - // F32 mPan = 0.0f; // center + F32 mVolume = 1.0f; // max by default + // F32 mPan = 0.0f; // center - pw_thread_loop* mThreadLoop = nullptr; - pw_context* mContext = nullptr; - pw_core* mCore = nullptr; - pw_registry* mRegistry = nullptr; - spa_hook mRegistryListener; + pw_thread_loop* mThreadLoop = nullptr; + pw_context* mContext = nullptr; + pw_core* mCore = nullptr; + pw_registry* mRegistry = nullptr; + spa_hook mRegistryListener; - std::unordered_set mChildNodes; - std::mutex mChildNodesMutex; + std::unordered_set mChildNodes; + std::mutex mChildNodesMutex; std::mutex mCleanupMutex; }; diff --git a/indra/media_plugins/cef/volume_catcher.h b/indra/media_plugins/cef/volume_catcher.h index d6ac8e9159..6933854e8e 100644 --- a/indra/media_plugins/cef/volume_catcher.h +++ b/indra/media_plugins/cef/volume_catcher.h @@ -36,20 +36,20 @@ class VolumeCatcherImpl; class VolumeCatcher { public: - VolumeCatcher(); - ~VolumeCatcher(); + VolumeCatcher(); + ~VolumeCatcher(); - void setVolume(F32 volume); - void setPan(F32 pan); + void setVolume(F32 volume); + void setPan(F32 pan); - void pump(); + void pump(); #if LL_LINUX - void onEnablePipeWireVolumeCatcher(bool enable); + void onEnablePipeWireVolumeCatcher(bool enable); #endif private: - VolumeCatcherImpl *pimpl; + VolumeCatcherImpl *pimpl; }; #endif // VOLUME_CATCHER_H -- cgit v1.3 From bdf46af9aff96a749dcf2612a2bdc6e8e394971e Mon Sep 17 00:00:00 2001 From: AiraYumi Date: Tue, 21 May 2024 20:52:38 -0400 Subject: fix "lines starting with tabs found" --- indra/llplugin/llpluginclassmedia.cpp | 6 +- indra/llplugin/llpluginclassmedia.h | 2 +- indra/media_plugins/base/media_plugin_base.cpp | 70 +++++++++++----------- indra/media_plugins/base/media_plugin_base.h | 8 +-- .../media_plugins/cef/linux/volume_catcher_linux.h | 18 +++--- indra/media_plugins/cef/media_plugin_cef.cpp | 26 ++++---- indra/newview/llviewermedia.cpp | 4 +- 7 files changed, 67 insertions(+), 67 deletions(-) (limited to 'indra/media_plugins/cef/linux/volume_catcher_linux.h') diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 6e16c4d552..4e5013ec8f 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -984,9 +984,9 @@ void LLPluginClassMedia::enableMediaPluginDebugging( bool enable ) #if LL_LINUX void LLPluginClassMedia::enablePipeWireVolumeCatcher( bool enable ) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "enable_pipewire_volume_catcher"); - message.setValueBoolean( "enable", enable ); - sendMessage( message ); + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "enable_pipewire_volume_catcher"); + message.setValueBoolean( "enable", enable ); + sendMessage( message ); } #endif diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index f4f374c894..5d2f3bbb79 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -136,7 +136,7 @@ public: bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data); #if LL_LINUX - void enablePipeWireVolumeCatcher( bool enable ); + void enablePipeWireVolumeCatcher( bool enable ); #endif static std::string sOIDcookieUrl; diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp index b57421f077..b21f29ac32 100644 --- a/indra/media_plugins/base/media_plugin_base.cpp +++ b/indra/media_plugins/base/media_plugin_base.cpp @@ -258,46 +258,46 @@ int WINAPI DllEntryPoint( HINSTANCE hInstance, unsigned long reason, void* param #if LL_LINUX pid_t getParentPid( pid_t aPid ) { - std::stringstream strm; - strm << "/proc/" << aPid << "/status"; - std::ifstream in{ strm.str() }; - - if( !in.is_open() ) - return 0; - - pid_t res {0}; - while( !in.eof() && res == 0 ) - { - std::string line; - line.resize( 1024, 0 ); - in.getline( &line[0], line.length() ); - - auto i = line.find( "PPid:" ); - - if( i == std::string::npos ) - continue; - - char const *pIn = line.c_str() + 5; // Skip over pid; - while( *pIn != 0 && isspace( *pIn ) ) - ++pIn; - - if( *pIn ) - res = atoll( pIn ); - } - return res; + std::stringstream strm; + strm << "/proc/" << aPid << "/status"; + std::ifstream in{ strm.str() }; + + if( !in.is_open() ) + return 0; + + pid_t res {0}; + while( !in.eof() && res == 0 ) + { + std::string line; + line.resize( 1024, 0 ); + in.getline( &line[0], line.length() ); + + auto i = line.find( "PPid:" ); + + if( i == std::string::npos ) + continue; + + char const *pIn = line.c_str() + 5; // Skip over pid; + while( *pIn != 0 && isspace( *pIn ) ) + ++pIn; + + if( *pIn ) + res = atoll( pIn ); + } + return res; } bool isPluginPid( pid_t aPid ) { - auto myPid = getpid(); + auto myPid = getpid(); - do - { - if( aPid == myPid ) - return true; - aPid = getParentPid( aPid ); - } while( aPid > 1 ); + do + { + if( aPid == myPid ) + return true; + aPid = getParentPid( aPid ); + } while( aPid > 1 ); - return false; + return false; } #endif diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h index 1f8fcf98ee..a084fc9834 100644 --- a/indra/media_plugins/base/media_plugin_base.h +++ b/indra/media_plugins/base/media_plugin_base.h @@ -61,10 +61,10 @@ extern SymbolGrabber gSymbolGrabber; // extern SymbolGrabber gSymbolGrabber; #define LL_GRAB_SYM(SYMBOL_GRABBER, REQUIRED, SYMBOL_NAME, RETURN, ...) \ - RETURN (*ll##SYMBOL_NAME)(__VA_ARGS__) = nullptr; \ - size_t gRegistered##SYMBOL_NAME = SYMBOL_GRABBER.registerSymbol( \ - { REQUIRED, #SYMBOL_NAME , (apr_dso_handle_sym_t*)&ll##SYMBOL_NAME} \ - ); + RETURN (*ll##SYMBOL_NAME)(__VA_ARGS__) = nullptr; \ + size_t gRegistered##SYMBOL_NAME = SYMBOL_GRABBER.registerSymbol( \ + { REQUIRED, #SYMBOL_NAME , (apr_dso_handle_sym_t*)&ll##SYMBOL_NAME} \ + ); #endif diff --git a/indra/media_plugins/cef/linux/volume_catcher_linux.h b/indra/media_plugins/cef/linux/volume_catcher_linux.h index 475e8ca52e..505f9ffb31 100644 --- a/indra/media_plugins/cef/linux/volume_catcher_linux.h +++ b/indra/media_plugins/cef/linux/volume_catcher_linux.h @@ -112,22 +112,22 @@ public: void pump(); void handleRegistryEventGlobal( - uint32_t id, uint32_t permissions, const char* type, - uint32_t version, const struct spa_dict* props + uint32_t id, uint32_t permissions, const char* type, + uint32_t version, const struct spa_dict* props ); class ChildNode { public: - bool mActive = false; + bool mActive = false; - pw_proxy* mProxy = nullptr; - spa_hook mNodeListener {}; - spa_hook mProxyListener {}; - VolumeCatcherPipeWire* mImpl = nullptr; + pw_proxy* mProxy = nullptr; + spa_hook mNodeListener {}; + spa_hook mProxyListener {}; + VolumeCatcherPipeWire* mImpl = nullptr; - void updateVolume(); - void destroy(); + void updateVolume(); + void destroy(); }; bool mGotSyms = false; diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index ebd8642040..1346dd2a52 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -903,21 +903,21 @@ void MediaPluginCEF::receiveMessage(const char* message_string) keyEvent(key_event, native_key_data); #endif - } - else if (message_name == "enable_media_plugin_debugging") - { - mEnableMediaPluginDebugging = message_in.getValueBoolean("enable"); - } + } + else if (message_name == "enable_media_plugin_debugging") + { + mEnableMediaPluginDebugging = message_in.getValueBoolean("enable"); + } #if LL_LINUX - else if (message_name == "enable_pipewire_volume_catcher") - { - bool enable = message_in.getValueBoolean("enable"); - mVolumeCatcher.onEnablePipeWireVolumeCatcher(enable); - } + else if (message_name == "enable_pipewire_volume_catcher") + { + bool enable = message_in.getValueBoolean("enable"); + mVolumeCatcher.onEnablePipeWireVolumeCatcher(enable); + } #endif - if (message_name == "pick_file_response") - { - LLSD file_list_llsd = message_in.getValueLLSD("file_list"); + if (message_name == "pick_file_response") + { + LLSD file_list_llsd = message_in.getValueLLSD("file_list"); LLSD::array_const_iterator iter = file_list_llsd.beginArray(); LLSD::array_const_iterator end = file_list_llsd.endArray(); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 5d58e0b0b2..c8b7a9c29b 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1766,8 +1766,8 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ media_source->enableMediaPluginDebugging( media_plugin_debugging_enabled || clean_browser); #if LL_LINUX - bool media_plugin_pipewire_volume_catcher = gSavedSettings.getBOOL("MediaPluginPipeWireVolumeCatcher"); - media_source->enablePipeWireVolumeCatcher( media_plugin_pipewire_volume_catcher ); + bool media_plugin_pipewire_volume_catcher = gSavedSettings.getBOOL("MediaPluginPipeWireVolumeCatcher"); + media_source->enablePipeWireVolumeCatcher( media_plugin_pipewire_volume_catcher ); #endif // need to set agent string here before instance created -- cgit v1.3