wasapi2: Use C++ atomic instead of GLib

Release-Acquire ordering could be faster than MemoryBarrier()

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5176>
This commit is contained in:
Seungha Yang 2023-08-12 21:16:59 +09:00 committed by GStreamer Marge Bot
parent c992dd2184
commit ae04702d23
2 changed files with 24 additions and 10 deletions

View file

@ -40,6 +40,7 @@
#include <string>
#include <locale>
#include <codecvt>
#include <atomic>
/* *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);
}

View file

@ -22,6 +22,7 @@
#include <mfapi.h>
#include <wrl.h>
#include <memory>
#include <atomic>
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<GstWasapi2RingBufferPtr> obj_ptr;
std::atomic<bool> 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);
}