diff options
author | Maki <maki@hotmilk.space> | 2024-04-20 17:35:30 -0400 |
---|---|---|
committer | Maki <maki@hotmilk.space> | 2024-04-20 17:35:30 -0400 |
commit | 576508ebab789207c5d82c13ff627cb623d74994 (patch) | |
tree | 92b4b79472ac6cdc94c015120f48a5bcba076acf /indra/media_plugins | |
parent | 477b45be1be256b7496e1d45b41754c6e40ef58a (diff) |
Use RAII for mutexes for PipeWire volume catcher
Diffstat (limited to 'indra/media_plugins')
-rw-r--r-- | indra/media_plugins/cef/linux/volume_catcher_linux.h | 4 | ||||
-rwxr-xr-x | indra/media_plugins/cef/linux/volume_catcher_pipewire.cpp | 39 |
2 files changed, 21 insertions, 22 deletions
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*>(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<ChildNode*> copyOfChildNodes(mChildNodes); - mChildNodesMutex.unlock(); + childNodeslock.unlock(); // debugPrint("for %d nodes\n", copyOfChildNodes.size()); |