guint64 expected_position;
gboolean is_first;
gboolean running;
+ gboolean opened;
UINT32 buffer_size;
UINT32 loopback_buffer_size;
GMutex volume_lock;
gboolean mute_changed;
gboolean volume_changed;
+
+ GstCaps *supported_caps;
};
static void gst_wasapi2_ring_buffer_constructed (GObject * object);
static void
gst_wasapi2_ring_buffer_init (GstWasapi2RingBuffer * self)
{
+ self->opened = FALSE;
+
self->volume = 1.0f;
self->mute = FALSE;
gst_clear_object (&self->client);
gst_clear_object (&self->loopback_client);
+ gst_clear_caps (&self->supported_caps);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
GST_DEBUG_OBJECT (self, "Open");
+ if (self->opened) {
+ GST_DEBUG_OBJECT (self, "Already opened");
+ return TRUE;
+ }
+
self->client = gst_wasapi2_client_new (self->device_class,
-1, self->device_id, self->dispatcher);
if (!self->client) {
}
static gboolean
-gst_wasapi2_ring_buffer_close_device (GstAudioRingBuffer * buf)
+gst_wasapi2_ring_buffer_close_device_internal (GstAudioRingBuffer * buf)
{
GstWasapi2RingBuffer *self = GST_WASAPI2_RING_BUFFER (buf);
- GST_DEBUG_OBJECT (self, "Close");
+ GST_DEBUG_OBJECT (self, "Close device");
if (self->running)
gst_wasapi2_ring_buffer_stop (buf);
gst_clear_object (&self->client);
gst_clear_object (&self->loopback_client);
+ self->opened = FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_wasapi2_ring_buffer_close_device (GstAudioRingBuffer * buf)
+{
+ GstWasapi2RingBuffer *self = GST_WASAPI2_RING_BUFFER (buf);
+
+ GST_DEBUG_OBJECT (self, "Close");
+
+ gst_wasapi2_ring_buffer_close_device_internal (buf);
+
+ gst_clear_caps (&self->supported_caps);
+
return TRUE;
}
GST_DEBUG_OBJECT (buf, "Acquire");
+ if (!self->opened && !gst_wasapi2_ring_buffer_open_device (buf))
+ return FALSE;
+
if (self->device_class == GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) {
if (!gst_wasapi2_ring_buffer_prepare_loopback_client (self)) {
GST_ERROR_OBJECT (self, "Failed to prepare loopback client");
g_clear_pointer (&buf->memory, g_free);
+ /* IAudioClient handle is not reusable once it's initialized */
+ gst_wasapi2_ring_buffer_close_device_internal (buf);
+
return TRUE;
}
{
g_return_val_if_fail (GST_IS_WASAPI2_RING_BUFFER (buf), nullptr);
+ if (buf->supported_caps)
+ return gst_caps_ref (buf->supported_caps);
+
if (!buf->client)
return nullptr;
return nullptr;
}
- return gst_wasapi2_client_get_caps (buf->client);
+ buf->supported_caps = gst_wasapi2_client_get_caps (buf->client);
+ if (buf->supported_caps)
+ return gst_caps_ref (buf->supported_caps);
+
+ return nullptr;
}
HRESULT