[pulseaudio-discuss] [PATCH] Support jack detection in UCM on ubuntu 1:1.1-0ubuntu4

Feng Wei feng.wei at linaro.org
Sun Feb 19 23:43:40 PST 2012


Still can't work well on embedded devices without driver support.
Index: pulseaudio-1.1/src/modules/alsa/alsa-jack-inputdev.h
===================================================================
--- pulseaudio-1.1.orig/src/modules/alsa/alsa-jack-inputdev.h	2012-02-16
17:49:05.184505051 +0800
+++ pulseaudio-1.1/src/modules/alsa/alsa-jack-inputdev.h	2012-02-16
17:56:21.376505285 +0800
@@ -25,11 +25,13 @@
 #include <pulsecore/idxset.h>
 #include <pulsecore/hashmap.h>
 #include "alsa-mixer.h"
+#include "alsa-ucm.h"

 struct pa_alsa_jack_inputdev_link {
     pa_device_port *port;
     pa_alsa_path *path;
     pa_alsa_jack_inputdev *dev;
+    struct pa_alsa_ucm_device *ucm_dev;
     int64_t switches_enable;
 };

@@ -39,6 +41,7 @@
 /* Match an alsa path against input devices. Returns NULL if no match.
    Returned link pointer is owned by input device and does not need
to be freed. */
 pa_alsa_jack_inputdev_link* pa_alsa_jack_inputdev_match(pa_hashmap*
devs, pa_alsa_path* path);
+pa_alsa_jack_inputdev_link*
pa_alsa_jack_inputdev_match_ucm(pa_hashmap* devs, struct
pa_alsa_ucm_device *ucm_dev);

 /* Start listening to input dev change events, and reports initial state */
 void pa_alsa_jack_inputdev_start(pa_hashmap* devs, pa_core* core);
Index: pulseaudio-1.1/src/modules/alsa/alsa-ucm.c
===================================================================
--- pulseaudio-1.1.orig/src/modules/alsa/alsa-ucm.c	2012-02-16
17:49:05.356505051 +0800
+++ pulseaudio-1.1/src/modules/alsa/alsa-ucm.c	2012-02-16
18:04:23.296505541 +0800
@@ -51,6 +51,7 @@
 #include "alsa-mixer.h"
 #include "alsa-util.h"
 #include "alsa-ucm.h"
+#include "alsa-jack-inputdev.h"

 #define PA_UCM_PLAYBACK_PRIORITY_UNSET(device)
((device)->playback_channels && !(device)->playback_priority)
 #define PA_UCM_CAPTURE_PRIORITY_UNSET(device)
((device)->capture_channels && !(device)->capture_priority)
@@ -588,7 +589,12 @@
         pa_hashmap_put(ports, name, port);
         pa_log_debug("Add port %s: %s", port->name, port->description);
         port->profiles = pa_hashmap_new(pa_idxset_string_hash_func,
pa_idxset_string_compare_func);
-        /* TODO: jack detection */
+    }
+    if (num == 1) { //not combinated port
+        if (dev->jack_inputdev_link) {
+            dev->jack_inputdev_link->port = port;
+            pa_device_port_ref(port);
+        }
     }
     port->priority = priority;
     if (is_sink)
@@ -1127,3 +1133,14 @@
         }
     }
 }
+
+void ucm_jack_inputdev_probe(pa_hashmap* devs, pa_alsa_ucm_config *ucm) {
+    struct pa_alsa_ucm_verb *verb;
+    struct pa_alsa_ucm_device *dev;
+
+    PA_LLIST_FOREACH(verb, ucm->verbs) {
+        PA_LLIST_FOREACH(dev, verb->devices) {
+            dev->jack_inputdev_link =
pa_alsa_jack_inputdev_match_ucm(devs, dev);
+        }
+    }
+}
Index: pulseaudio-1.1/src/modules/alsa/alsa-ucm.h
===================================================================
--- pulseaudio-1.1.orig/src/modules/alsa/alsa-ucm.h	2012-02-16
17:49:05.360505051 +0800
+++ pulseaudio-1.1/src/modules/alsa/alsa-ucm.h	2012-02-16
17:49:05.376505051 +0800
@@ -32,6 +32,7 @@
 typedef struct pa_alsa_ucm_config pa_alsa_ucm_config;
 typedef struct pa_alsa_ucm_mapping_context pa_alsa_ucm_mapping_context;
 typedef struct pa_alsa_port_data_ucm pa_alsa_port_data_ucm;
+typedef struct pa_alsa_jack_inputdev_link pa_alsa_jack_inputdev_link;

 int ucm_set_profile(struct pa_alsa_ucm_config *ucm, const char
*new_profile, const char *old_profile);
 void free_ucm(struct pa_alsa_ucm_config *ucm);
@@ -45,6 +46,7 @@
 int ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port
*port, int is_sink);
 void ucm_new_stream_role(pa_alsa_ucm_config *ucm, const char *role,
int is_sink);
 void ucm_del_stream_role(pa_alsa_ucm_config *ucm, const char *role,
int is_sink);
+void ucm_jack_inputdev_probe(pa_hashmap* devs, pa_alsa_ucm_config *ucm);

 /* UCM modifier action direction */
 enum {
@@ -66,6 +68,7 @@
     int n_suppdev;
     char **conflicting_devices;
     char **supported_devices;
+    pa_alsa_jack_inputdev_link *jack_inputdev_link;
 };

 struct pa_alsa_ucm_modifier {
Index: pulseaudio-1.1/src/modules/alsa/module-alsa-card.c
===================================================================
--- pulseaudio-1.1.orig/src/modules/alsa/module-alsa-card.c	2012-02-16
17:49:05.360505051 +0800
+++ pulseaudio-1.1/src/modules/alsa/module-alsa-card.c	2012-02-16
17:49:05.376505051 +0800
@@ -640,6 +640,8 @@

     u->profile_set->ignore_dB = ignore_dB;
     u->profile_set->jack_inputdevs =
pa_alsa_jack_inputdev_enum(alsa_card_index);
+    if (u->use_ucm)
+        ucm_jack_inputdev_probe(u->profile_set->jack_inputdevs, &u->ucm);
     pa_alsa_profile_set_probe(u->profile_set, u->device_id,
&m->core->default_sample_spec, m->core->default_n_fragments,
m->core->default_fragment_size_msec);
     pa_alsa_profile_set_dump(u->profile_set);

Index: pulseaudio-1.1/src/modules/alsa/alsa-jack-inputdev.c
===================================================================
--- pulseaudio-1.1.orig/src/modules/alsa/alsa-jack-inputdev.c	2012-02-16
17:55:32.776505258 +0800
+++ pulseaudio-1.1/src/modules/alsa/alsa-jack-inputdev.c	2012-02-16
18:09:41.668505711 +0800
@@ -257,6 +257,29 @@
     return NULL;
 }

+pa_alsa_jack_inputdev_link*
pa_alsa_jack_inputdev_match_ucm(pa_hashmap* devs, struct
pa_alsa_ucm_device *ucm_dev) {
+    void *state;
+    pa_alsa_jack_inputdev *inputdev;
+    const char *dev_name;
+    pa_alsa_jack_inputdev_link *jil;
+
+    dev_name = pa_proplist_gets(ucm_dev->proplist, PA_PROP_UCM_NAME);
+
+    PA_HASHMAP_FOREACH(inputdev, devs, state) {
+        if (strstr(inputdev->devname, dev_name)) {
+            /* Found a match, let's add it! */
+            jil = pa_xnew0(pa_alsa_jack_inputdev_link, 1);
+            jil->dev = inputdev;
+            jil->ucm_dev = ucm_dev;
+            jil->switches_enable = inputdev->switches_supported;
+            pa_hashmap_put(inputdev->links, jil, jil);
+            pa_log_info("Matched input device %s to ucm device %s",
inputdev->devname, dev_name);
+            return jil;
+        }
+    }
+    return NULL;
+}
+
 static void jack_report(pa_alsa_jack_inputdev *dev, uint64_t bitmask,
uint64_t bitvalue) {
     pa_alsa_jack_inputdev_link *jil;
     void* state;

-- 
Wei.Feng (irc wei_feng)
Linaro Multimedia Team
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog


More information about the pulseaudio-discuss mailing list