From ae04702d2381eefad0d92b0d1b8b2b0138f5a41b Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sat, 12 Aug 2023 21:16:59 +0900 Subject: [PATCH] wasapi2: Use C++ atomic instead of GLib Release-Acquire ordering could be faster than MemoryBarrier() Part-of: --- .../sys/wasapi2/gstwasapi2client.cpp | 22 ++++++++++++++----- .../sys/wasapi2/gstwasapi2ringbuffer.cpp | 12 +++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2client.cpp b/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2client.cpp index b6b09ee0cd..89e1b507d9 100644 --- a/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2client.cpp +++ b/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2client.cpp @@ -40,6 +40,7 @@ #include #include #include +#include /* *INDENT-OFF* */ using namespace ABI::Windows::ApplicationModel::Core; @@ -315,7 +316,7 @@ public: { GstWasapi2Client *client = (GstWasapi2Client *) g_weak_ref_get (&client_); if (client) { - gst_wasapi2_client_set_endpoint_muted (client, !!notify->bMuted); + gst_wasapi2_client_set_endpoint_muted (client, notify->bMuted); gst_object_unref (client); } return S_OK; @@ -349,10 +350,17 @@ enum #define DEFAULT_DEVICE_INDEX -1 #define DEFAULT_DEVICE_CLASS GST_WASAPI2_CLIENT_DEVICE_CLASS_CAPTURE +struct GstWasapi2ClientPrivate +{ + std::atomic < bool >is_endpoint_muted; +}; + struct _GstWasapi2Client { GstObject parent; + GstWasapi2ClientPrivate *priv; + GstWasapi2ClientDeviceClass device_class; gchar *device_id; gchar *device_name; @@ -366,7 +374,6 @@ struct _GstWasapi2Client GMutex endpoint_volume_lock; IAudioEndpointVolume *audio_endpoint_volume; GstWasapiEndpointVolumeCallback *endpoint_volume_callback; - gint is_endpoint_muted; GstCaps *supported_caps; @@ -481,6 +488,9 @@ gst_wasapi2_client_init (GstWasapi2Client * self) self->context = g_main_context_new (); self->loop = g_main_loop_new (self->context, FALSE); + + self->priv = new GstWasapi2ClientPrivate (); + self->priv->is_endpoint_muted.store (false, std::memory_order_release); } static void @@ -531,6 +541,8 @@ gst_wasapi2_client_finalize (GObject * object) g_mutex_clear (&self->endpoint_volume_lock); + delete self->priv; + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -664,7 +676,7 @@ gst_wasapi2_client_on_endpoint_volume_activated (GstWasapi2Client * self, hr = audio_endpoint_volume->GetMute (&initially_muted); if (gst_wasapi2_result (hr)) { - gst_wasapi2_client_set_endpoint_muted (self, !!initially_muted); + gst_wasapi2_client_set_endpoint_muted (self, initially_muted); } } } @@ -679,7 +691,7 @@ gst_wasapi2_client_set_endpoint_muted (GstWasapi2Client * self, gboolean muted) { GST_DEBUG_OBJECT (self, "Audio Endpoint Volume: muted=%d", muted); - g_atomic_int_set (&self->is_endpoint_muted, muted); + self->priv->is_endpoint_muted.store (muted, std::memory_order_release); } /* *INDENT-OFF* */ @@ -1287,5 +1299,5 @@ gst_wasapi2_client_is_endpoint_muted (GstWasapi2Client * client) { g_return_val_if_fail (GST_IS_WASAPI2_CLIENT (client), FALSE); - return g_atomic_int_get (&client->is_endpoint_muted); + return client->priv->is_endpoint_muted.load (std::memory_order_acquire); } diff --git a/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp b/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp index f60eca9542..b4648a4f09 100644 --- a/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp +++ b/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp @@ -22,6 +22,7 @@ #include #include #include +#include GST_DEBUG_CATEGORY_STATIC (gst_wasapi2_ring_buffer_debug); #define GST_CAT_DEFAULT gst_wasapi2_ring_buffer_debug @@ -141,6 +142,7 @@ private: struct GstWasapi2RingBufferPrivate { std::shared_ptr obj_ptr; + std::atomic monitor_device_mute; }; /* *INDENT-ON* */ @@ -186,8 +188,6 @@ struct _GstWasapi2RingBuffer gboolean mute_changed; gboolean volume_changed; - gboolean monitor_device_mute; - GstCaps *supported_caps; GstWasapi2RingBufferPrivate *priv; @@ -254,6 +254,7 @@ gst_wasapi2_ring_buffer_init (GstWasapi2RingBuffer * self) self->priv = new GstWasapi2RingBufferPrivate (); self->priv->obj_ptr = std::make_shared < GstWasapi2RingBufferPtr > (self); + self->priv->monitor_device_mute.store (false, std::memory_order_release); } static void @@ -484,7 +485,7 @@ gst_wasapi2_ring_buffer_read (GstWasapi2RingBuffer * self) gint segment; guint8 *readptr; gint len; - gboolean is_device_muted; + bool is_device_muted; if (!capture_client) { GST_ERROR_OBJECT (self, "IAudioCaptureClient is not available"); @@ -498,7 +499,8 @@ gst_wasapi2_ring_buffer_read (GstWasapi2RingBuffer * self) goto out; } - is_device_muted = g_atomic_int_get (&self->monitor_device_mute) && + is_device_muted = + self->priv->monitor_device_mute.load (std::memory_order_acquire) && gst_wasapi2_client_is_endpoint_muted (self->client); to_read_bytes = to_read * GST_AUDIO_INFO_BPF (info); @@ -1517,5 +1519,5 @@ gst_wasapi2_ring_buffer_set_device_mute_monitoring (GstWasapi2RingBuffer * buf, { g_return_if_fail (GST_IS_WASAPI2_RING_BUFFER (buf)); - g_atomic_int_set (&buf->monitor_device_mute, value); + buf->priv->monitor_device_mute.store (value, std::memory_order_release); }