Mark Harmstone : winepulse.drv: Implement PKEY_AudioEndpoint_PhysicalSpeakers device prop.

Alexandre Julliard julliard at winehq.org
Tue Feb 22 16:06:50 CST 2022


Module: wine
Branch: master
Commit: 5a65a60347f887aeb858eceb02319039e1aada58
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5a65a60347f887aeb858eceb02319039e1aada58

Author: Mark Harmstone <mark at harmstone.com>
Date:   Fri Feb 18 20:38:03 2022 +0200

winepulse.drv: Implement PKEY_AudioEndpoint_PhysicalSpeakers device prop.

And get rid of config->speakers_mask and g_phys_speakers_mask since they
are no longer needed.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winepulse.drv/mmdevdrv.c |  7 -------
 dlls/winepulse.drv/pulse.c    | 30 +++++++++++++++++++++---------
 dlls/winepulse.drv/unixlib.h  |  1 -
 3 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index 49fafb65342..7b5ef7cfe39 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -2647,13 +2647,6 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI
 
     TRACE("%s, (%s,%u), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out);
 
-    if (IsEqualGUID(guid, &pulse_render_guid) && IsEqualPropertyKey(*prop, PKEY_AudioEndpoint_PhysicalSpeakers)) {
-        out->vt = VT_UI4;
-        out->ulVal = pulse_config.speakers_mask;
-
-        return out->ulVal ? S_OK : E_FAIL;
-    }
-
     if (!get_pulse_name_by_guid(guid, pulse_name, &params.flow))
         return E_FAIL;
 
diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index d41160bffa7..6552e4ce250 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -87,6 +87,7 @@ typedef struct _PhysDevice {
     enum phys_device_bus_type bus_type;
     USHORT vendor_id, product_id;
     EndpointFormFactor form;
+    DWORD channel_mask;
     UINT index;
     char pulse_name[0];
 } PhysDevice;
@@ -98,7 +99,6 @@ static pa_mainloop *pulse_ml;
 static WAVEFORMATEXTENSIBLE pulse_fmt[2];
 static REFERENCE_TIME pulse_min_period[2], pulse_def_period[2];
 
-static UINT g_phys_speakers_mask = 0;
 static struct list g_phys_speakers = LIST_INIT(g_phys_speakers);
 static struct list g_phys_sources = LIST_INIT(g_phys_sources);
 
@@ -448,7 +448,7 @@ static void fill_device_info(PhysDevice *dev, pa_proplist *p)
 }
 
 static void pulse_add_device(struct list *list, pa_proplist *proplist, int index, EndpointFormFactor form,
-        const char *pulse_name, const char *name)
+        DWORD channel_mask, const char *pulse_name, const char *name)
 {
     DWORD len = strlen(pulse_name), name_len = strlen(name);
     PhysDevice *dev = malloc(FIELD_OFFSET(PhysDevice, pulse_name[len + 1]));
@@ -471,6 +471,7 @@ static void pulse_add_device(struct list *list, pa_proplist *proplist, int index
     dev->name[name_len] = 0;
     dev->form = form;
     dev->index = index;
+    dev->channel_mask = channel_mask;
     fill_device_info(dev, proplist);
     memcpy(dev->pulse_name, pulse_name, len + 1);
 
@@ -479,14 +480,20 @@ static void pulse_add_device(struct list *list, pa_proplist *proplist, int index
 
 static void pulse_phys_speakers_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata)
 {
+    struct list *speaker;
+    DWORD channel_mask;
+
     if (!i || !i->name || !i->name[0])
         return;
+    channel_mask = pulse_channel_map_to_channel_mask(&i->channel_map);
 
     /* For default PulseAudio render device, OR together all of the
      * PKEY_AudioEndpoint_PhysicalSpeakers values of the sinks. */
-    g_phys_speakers_mask |= pulse_channel_map_to_channel_mask(&i->channel_map);
+    speaker = list_head(&g_phys_speakers);
+    if (speaker)
+        LIST_ENTRY(speaker, PhysDevice, entry)->channel_mask |= channel_mask;
 
-    pulse_add_device(&g_phys_speakers, i->proplist, i->index, Speakers, i->name, i->description);
+    pulse_add_device(&g_phys_speakers, i->proplist, i->index, Speakers, channel_mask, i->name, i->description);
 }
 
 static void pulse_phys_sources_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata)
@@ -494,7 +501,7 @@ static void pulse_phys_sources_cb(pa_context *c, const pa_source_info *i, int eo
     if (!i || !i->name || !i->name[0])
         return;
     pulse_add_device(&g_phys_sources, i->proplist, i->index,
-        (i->monitor_of_sink == PA_INVALID_INDEX) ? Microphone : LineLevel, i->name, i->description);
+        (i->monitor_of_sink == PA_INVALID_INDEX) ? Microphone : LineLevel, 0, i->name, i->description);
 }
 
 /* For most hardware on Windows, users must choose a configuration with an even
@@ -714,10 +721,9 @@ static NTSTATUS pulse_test_connect(void *args)
     free_phys_device_lists();
     list_init(&g_phys_speakers);
     list_init(&g_phys_sources);
-    g_phys_speakers_mask = 0;
 
-    pulse_add_device(&g_phys_speakers, NULL, 0, Speakers, "", "PulseAudio");
-    pulse_add_device(&g_phys_sources, NULL, 0, Microphone, "", "PulseAudio");
+    pulse_add_device(&g_phys_speakers, NULL, 0, Speakers, 0, "", "PulseAudio");
+    pulse_add_device(&g_phys_sources, NULL, 0, Microphone, 0, "", "PulseAudio");
 
     o = pa_context_get_sink_info_list(pulse_ctx, &pulse_phys_speakers_cb, NULL);
     if (o) {
@@ -740,7 +746,6 @@ static NTSTATUS pulse_test_connect(void *args)
     pa_mainloop_free(pulse_ml);
     pulse_ml = NULL;
 
-    config->speakers_mask = g_phys_speakers_mask;
     config->modes[0].format = pulse_fmt[0];
     config->modes[0].def_period = pulse_def_period[0];
     config->modes[0].min_period = pulse_min_period[0];
@@ -2172,6 +2177,12 @@ static NTSTATUS pulse_get_prop_value(void *args)
                 params->vt = VT_UI4;
                 params->ulVal = dev->form;
                 return STATUS_SUCCESS;
+            case 3:   /* PhysicalSpeakers */
+                if (!dev->channel_mask)
+                    goto fail;
+                params->vt = VT_UI4;
+                params->ulVal = dev->channel_mask;
+                return STATUS_SUCCESS;
             default:
                 break;
             }
@@ -2180,6 +2191,7 @@ static NTSTATUS pulse_get_prop_value(void *args)
         return STATUS_SUCCESS;
     }
 
+fail:
     params->result = E_FAIL;
     return STATUS_SUCCESS;
 }
diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h
index 4acebb1aa8b..9089e2829fc 100644
--- a/dlls/winepulse.drv/unixlib.h
+++ b/dlls/winepulse.drv/unixlib.h
@@ -37,7 +37,6 @@ struct pulse_config
         REFERENCE_TIME def_period;
         REFERENCE_TIME min_period;
     } modes[2];
-    unsigned int speakers_mask;
 };
 
 struct endpoint




More information about the wine-cvs mailing list