wasapi2: Always probe default audio endpoint info
Regardless of GetActivateResult() return code, fill default device information to device provider props Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9468>
This commit is contained in:
parent
fedced4017
commit
2769f8ff44
@ -640,47 +640,47 @@ gst_wasapi2_enumerator_probe_props (IPropertyStore * store,
|
||||
}
|
||||
|
||||
static void
|
||||
probe_default_device_props (GstWasapi2Enumerator * self, EDataFlow flow,
|
||||
GstWasapi2DeviceProps * props, gchar ** actual_device_id,
|
||||
get_default_device (GstWasapi2Enumerator * self, EDataFlow flow,
|
||||
IMMDevice ** device, IPropertyStore ** prop, gchar ** actual_device_id,
|
||||
gchar ** actual_device_name)
|
||||
{
|
||||
auto priv = self->priv;
|
||||
ComPtr < IMMDevice > device;
|
||||
ComPtr < IPropertyStore > prop;
|
||||
ComPtr < IMMDevice > rst_device;
|
||||
ComPtr < IPropertyStore > rst_prop;
|
||||
|
||||
*actual_device_id = nullptr;
|
||||
*actual_device_name = nullptr;
|
||||
|
||||
auto hr = priv->handle->GetDefaultAudioEndpoint (flow,
|
||||
eConsole, &device);
|
||||
if (!gst_wasapi2_result (hr)) {
|
||||
GST_WARNING_OBJECT (self, "Couldn't get default endpoint for %s",
|
||||
gst_wasapi2_data_flow_to_string (flow));
|
||||
auto hr = priv->handle->GetDefaultAudioEndpoint (eCapture,
|
||||
eConsole, &rst_device);
|
||||
if (FAILED (hr))
|
||||
return;
|
||||
|
||||
hr = rst_device->OpenPropertyStore (STGM_READ, &rst_prop);
|
||||
if (FAILED (hr))
|
||||
return;
|
||||
}
|
||||
|
||||
LPWSTR wid = nullptr;
|
||||
hr = device->GetId (&wid);
|
||||
if (gst_wasapi2_result (hr)) {
|
||||
*actual_device_id = g_utf16_to_utf8 ((gunichar2 *) wid,
|
||||
-1, nullptr, nullptr, nullptr);
|
||||
CoTaskMemFree (wid);
|
||||
}
|
||||
|
||||
hr = device->OpenPropertyStore (STGM_READ, &prop);
|
||||
hr = rst_device->GetId (&wid);
|
||||
if (!gst_wasapi2_result (hr))
|
||||
return;
|
||||
|
||||
*actual_device_id = g_utf16_to_utf8 ((gunichar2 *) wid,
|
||||
-1, nullptr, nullptr, nullptr);
|
||||
CoTaskMemFree (wid);
|
||||
|
||||
PROPVARIANT var;
|
||||
PropVariantInit (&var);
|
||||
hr = prop->GetValue (PKEY_Device_FriendlyName, &var);
|
||||
hr = rst_prop->GetValue (PKEY_Device_FriendlyName, &var);
|
||||
if (gst_wasapi2_result (hr)) {
|
||||
*actual_device_name = g_utf16_to_utf8 ((gunichar2 *) var.pwszVal,
|
||||
-1, nullptr, nullptr, nullptr);
|
||||
PropVariantClear (&var);
|
||||
}
|
||||
|
||||
gst_wasapi2_enumerator_probe_props (prop.Get (), props);
|
||||
*device = rst_device.Detach ();
|
||||
*prop = rst_prop.Detach ();
|
||||
return;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -703,21 +703,48 @@ gst_wasapi2_enumerator_execute (GstWasapi2Enumerator * self,
|
||||
if (priv->render_activator)
|
||||
priv->render_activator->GetClient (&default_render_client, 10000);
|
||||
|
||||
ComPtr < IMMDevice > default_capture_device;
|
||||
ComPtr < IPropertyStore > default_capture_prop;
|
||||
gchar *default_capture_device_id = nullptr;
|
||||
gchar *default_capture_device_name = nullptr;
|
||||
|
||||
ComPtr < IMMDevice > default_render_device;
|
||||
ComPtr < IPropertyStore > default_render_prop;
|
||||
gchar *default_render_device_id = nullptr;
|
||||
gchar *default_render_device_name = nullptr;
|
||||
|
||||
get_default_device (self, eCapture, &default_capture_device,
|
||||
&default_capture_prop,
|
||||
&default_capture_device_id, &default_capture_device_name);
|
||||
get_default_device (self, eRender, &default_render_device,
|
||||
&default_render_prop,
|
||||
&default_render_device_id, &default_render_device_name);
|
||||
|
||||
if (priv->capture_activator && !default_capture_client &&
|
||||
default_capture_device) {
|
||||
default_capture_device->Activate (__uuidof (IAudioClient), CLSCTX_ALL,
|
||||
nullptr, &default_capture_client);
|
||||
}
|
||||
|
||||
if (priv->render_activator && !default_render_client && default_render_device) {
|
||||
default_render_device->Activate (__uuidof (IAudioClient), CLSCTX_ALL,
|
||||
nullptr, &default_render_client);
|
||||
}
|
||||
|
||||
if (default_capture_client) {
|
||||
GstWasapi2DeviceProps props;
|
||||
props.form_factor = UnknownFormFactor;
|
||||
props.enumerator_name = "UNKNOWN";
|
||||
|
||||
gchar *actual_device_id = nullptr;
|
||||
gchar *actual_device_name = nullptr;
|
||||
probe_default_device_props (self, eCapture, &props, &actual_device_id,
|
||||
&actual_device_name);
|
||||
if (default_capture_prop)
|
||||
gst_wasapi2_enumerator_probe_props (default_capture_prop.Get (), &props);
|
||||
|
||||
gst_wasapi2_enumerator_add_entry (self, default_capture_client.Get (),
|
||||
priv->scaps, eCapture, TRUE,
|
||||
g_strdup (gst_wasapi2_get_default_device_id (eCapture)),
|
||||
g_strdup ("Default Audio Capture Device"), actual_device_id,
|
||||
actual_device_name, &props, priv->device_list);
|
||||
g_strdup ("Default Audio Capture Device"),
|
||||
g_strdup (default_capture_device_id),
|
||||
g_strdup (default_capture_device_name), &props, priv->device_list);
|
||||
}
|
||||
|
||||
if (default_render_client) {
|
||||
@ -725,16 +752,15 @@ gst_wasapi2_enumerator_execute (GstWasapi2Enumerator * self,
|
||||
props.form_factor = UnknownFormFactor;
|
||||
props.enumerator_name = "UNKNOWN";
|
||||
|
||||
gchar *actual_device_id = nullptr;
|
||||
gchar *actual_device_name = nullptr;
|
||||
probe_default_device_props (self, eRender, &props, &actual_device_id,
|
||||
&actual_device_name);
|
||||
if (default_capture_prop)
|
||||
gst_wasapi2_enumerator_probe_props (default_render_prop.Get (), &props);
|
||||
|
||||
gst_wasapi2_enumerator_add_entry (self, default_render_client.Get (),
|
||||
priv->scaps, eRender, TRUE,
|
||||
g_strdup (gst_wasapi2_get_default_device_id (eRender)),
|
||||
g_strdup ("Default Audio Render Device"), actual_device_id,
|
||||
actual_device_name, &props, priv->device_list);
|
||||
g_strdup ("Default Audio Render Device"),
|
||||
g_strdup (default_render_device_id),
|
||||
g_strdup (default_render_device_name), &props, priv->device_list);
|
||||
}
|
||||
|
||||
for (UINT i = 0; i < count; i++) {
|
||||
@ -807,6 +833,11 @@ gst_wasapi2_enumerator_execute (GstWasapi2Enumerator * self,
|
||||
FALSE, device_id, desc, nullptr, nullptr, &props, priv->device_list);
|
||||
}
|
||||
|
||||
g_free (default_capture_device_id);
|
||||
g_free (default_capture_device_name);
|
||||
g_free (default_render_device_id);
|
||||
g_free (default_render_device_name);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user