[libgnome-volume-control] mixer-control: do not use port name string to select the headset ports



commit 7a621180b46421e356b33972e3446775a504139c
Author: Jaroslav Kysela <perex perex cz>
Date:   Tue Jun 2 12:20:45 2020 +0200

    mixer-control: do not use port name string to select the headset ports
    
    It is a bad idea to use the variable port name to check the port
    type. Use only the new port type and availability group string
    for the decision.
    
    Also, select the ports by priority, if there multiple ports
    with the similar type.

 gvc-mixer-control.c | 54 +++++++++++++++++++++++++++++++----------------------
 1 file changed, 32 insertions(+), 22 deletions(-)
---
diff --git a/gvc-mixer-control.c b/gvc-mixer-control.c
index 2dc2cb7..8b39080 100644
--- a/gvc-mixer-control.c
+++ b/gvc-mixer-control.c
@@ -2283,19 +2283,11 @@ typedef struct {
 } headset_ports;
 
 /*
-   TODO: Check if we still need this with the changed PA port names
-
    In PulseAudio without ucm, ports will show up with the following names:
    Headphones - analog-output-headphones
    Headset mic - analog-input-headset-mic (was: analog-input-microphone-headset)
    Jack in mic-in mode - analog-input-headphone-mic (was: analog-input-microphone)
 
-   In PulseAudio with ucm, the ports name depends on the ucm, with the current
-   ucm2, the ports will show up with the following names:
-   Headphones - [Out] Headphone
-   Headset mic - [In] Headset
-   Jack in mic-in mode - [In] Mic2
-
    However, since regular mics also show up as analog-input-microphone,
    we need to check for certain controls on alsa mixer level too, to know
    if we deal with a separate mic jack, or a multi-function jack with a
@@ -2312,11 +2304,17 @@ typedef struct {
      this case, unless we already need to do this for the mic-in mode.
 
    From the PA_PROCOTOL_VERSION=34, The device_port structure adds 2 members
-   available_group and type, with the help of these 2 members, we could
+   availability_group and type, with the help of these 2 members, we could
    consolidate the port checking and port setting for non-ucm and with-ucm
    cases.
 */
 
+#define HEADSET_PORT_SET(dst, src) \
+        do { \
+                if (!(dst) || (dst)->priority < (src)->priority) \
+                        dst = src; \
+        } while (0)
+
 #define GET_PORT_NAME(x) (x ? g_strdup (x->name) : NULL)
 
 static headset_ports *
@@ -2343,21 +2341,16 @@ get_headset_ports (GvcMixerControl    *control,
                                 h->internalspk = p;
                 } else {
 #if (PA_PROTOCOL_VERSION >= 34)
-                        if (p->available_group && strcmp (p->available_group, "Headphone Mic") == 0) {
-                                if (p->type == PA_DEVICE_PORT_TYPE_HEADPHONES)
-                                        h->headphones = p;
-                                else if (p->type == PA_DEVICE_PORT_TYPE_HEADSET)
-                                        h->headsetmic = p;
-                                else if (p->type == PA_DEVICE_PORT_TYPE_MIC)
-                                        h->headphonemic = p;
+                        /* in the first loop, set only headphones */
+                        /* the microphone ports are assigned in the second loop */
+                        if (p->type == PA_DEVICE_PORT_TYPE_HEADPHONES) {
+                                if (p->availability_group)
+                                        HEADSET_PORT_SET (h->headphones, p);
                         } else if (p->type == PA_DEVICE_PORT_TYPE_SPEAKER) {
-                                if (strcmp (p->name, "analog-output-speaker") == 0 ||
-                                    strcmp (p->name, "[Out] Speaker") == 0 )
-                                        h->internalspk = p;
+                                HEADSET_PORT_SET (h->internalspk, p);
                         } else if (p->type == PA_DEVICE_PORT_TYPE_MIC) {
-                                if (strcmp (p->name, "analog-input-internal-mic") == 0 ||
-                                    strcmp (p->name, "[In] Mic1") == 0 )
-                                        h->internalmic = p;
+                                if (!p->availability_group)
+                                        HEADSET_PORT_SET (h->internalmic, p);
                         }
 #else
                         g_warning_once ("libgnome-volume-control running against PulseAudio %u, "
@@ -2367,6 +2360,23 @@ get_headset_ports (GvcMixerControl    *control,
 #endif
                 }
         }
+
+#if (PA_PROTOCOL_VERSION >= 34)
+        if (h->headphones && (control->priv->server_protocol_version >= 34)) {
+                for (i = 0; i < c->n_ports; i++) {
+                        pa_card_port_info *p = c->ports[i];
+                        if (g_strcmp0(h->headphones->availability_group, p->availability_group))
+                                continue;
+                        if (p->direction != PA_DIRECTION_INPUT)
+                                continue;
+                        if (p->type == PA_DEVICE_PORT_TYPE_HEADSET)
+                                HEADSET_PORT_SET (h->headsetmic, p);
+                        else if (p->type == PA_DEVICE_PORT_TYPE_MIC)
+                                HEADSET_PORT_SET (h->headphonemic, p);
+                }
+        }
+#endif
+
         return h;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]