[pulseaudio-discuss] [PATCH 17/17] sink, source: Add ports in pa_sink/source_set_prototype()

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Mon Dec 30 05:04:52 PST 2013


Card implementations don't need to care about adding the ports to
sinks and sources, so a lot of code can be removed.
---
 src/modules/alsa/alsa-mixer.c                   |  72 -------------
 src/modules/alsa/alsa-sink.c                    |   5 +-
 src/modules/alsa/alsa-source.c                  |   5 +-
 src/modules/alsa/alsa-ucm.c                     | 129 ------------------------
 src/modules/alsa/alsa-ucm.h                     |  11 --
 src/modules/alsa/module-alsa-card.c             |   8 --
 src/modules/bluetooth/module-bluetooth-device.c |  17 ----
 src/pulsecore/sink.c                            |   8 ++
 src/pulsecore/source.c                          |   8 ++
 9 files changed, 18 insertions(+), 245 deletions(-)

diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 61d292d..d48d789 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -4523,78 +4523,6 @@ void pa_alsa_profile_set_drop_unsupported(pa_alsa_profile_set *ps) {
     }
 }
 
-static pa_device_port* device_port_alsa_init(pa_hashmap *ports, /* card ports */
-    pa_alsa_path *path,
-    pa_alsa_setting *setting,
-    pa_hashmap *extra /* sink/source ports */) {
-
-    char *name = NULL;
-    pa_device_port *p;
-
-    pa_assert(path);
-
-    if (setting)
-        name = pa_sprintf_malloc("%s;%s", path->name, setting->name);
-    else
-        name = pa_xstrdup(path->name);
-
-    p = pa_hashmap_get(ports, name);
-    pa_assert(p);
-    pa_xfree(name);
-
-    if (extra) {
-        pa_hashmap_put(extra, p->name, p);
-        pa_device_port_ref(p);
-    }
-
-    return p;
-}
-
-void pa_alsa_path_set_add_ports(
-        pa_alsa_path_set *ps,
-        pa_hashmap *ports, /* card ports */
-        pa_hashmap *extra /* sink/source ports */) {
-
-    pa_alsa_path *path;
-    void *state;
-
-    pa_assert(ports);
-
-    if (!ps)
-        return;
-
-    PA_HASHMAP_FOREACH(path, ps->paths, state) {
-        if (!path->settings || !path->settings->next)
-            /* If there is no or just one setting we only need a
-             * single entry */
-            device_port_alsa_init(ports, path, path->settings, extra);
-        else {
-            pa_alsa_setting *s;
-            PA_LLIST_FOREACH(s, path->settings)
-                device_port_alsa_init(ports, path, s, extra);
-        }
-    }
-}
-
-void pa_alsa_add_ports(void *sink_or_source_new_data, pa_alsa_path_set *ps, pa_card *card) {
-    pa_hashmap *ports;
-
-    pa_assert(sink_or_source_new_data);
-    pa_assert(ps);
-
-    if (ps->direction == PA_ALSA_DIRECTION_OUTPUT)
-        ports = ((pa_sink_new_data *) sink_or_source_new_data)->ports;
-    else
-        ports = ((pa_source_new_data *) sink_or_source_new_data)->ports;
-
-    if (ps->paths && pa_hashmap_size(ps->paths) > 0) {
-        pa_assert(card);
-        pa_alsa_path_set_add_ports(ps, card->ports, ports);
-    }
-
-    pa_log_debug("Added %u ports", pa_hashmap_size(ports));
-}
-
 static pa_device_port *create_port(pa_core *core, pa_alsa_path *path, pa_alsa_setting *setting) {
     char *name = NULL;
     char *description = NULL;
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index aa81a6f..2f80ef8 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -2285,11 +2285,8 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
         goto fail;
     }
 
-    if (u->ucm_context) {
-        pa_alsa_ucm_add_ports(&data.ports, u->ucm_context, true, card);
+    if (u->ucm_context)
         pa_alsa_ucm_set_intended_roles(data.proplist, u->ucm_context, PA_DIRECTION_OUTPUT);
-    } else if (u->mixer_path_set)
-        pa_alsa_add_ports(&data, u->mixer_path_set, card);
 
     if (mapping)
         pa_sink_new_data_set_prototype(&data, mapping->sink_prototype);
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index feb4f0f..d2d4332 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1991,11 +1991,8 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
         goto fail;
     }
 
-    if (u->ucm_context) {
-        pa_alsa_ucm_add_ports(&data.ports, u->ucm_context, false, card);
+    if (u->ucm_context)
         pa_alsa_ucm_set_intended_roles(data.proplist, u->ucm_context, PA_DIRECTION_INPUT);
-    } else if (u->mixer_path_set)
-        pa_alsa_add_ports(&data, u->mixer_path_set, card);
 
     if (mapping)
         pa_source_new_data_set_prototype(&data, mapping->source_prototype);
diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
index 21efc40..d9137ad 100644
--- a/src/modules/alsa/alsa-ucm.c
+++ b/src/modules/alsa/alsa-ucm.c
@@ -664,49 +664,6 @@ int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, cons
     return 0;
 }
 
-static void ucm_add_port_combination(
-        pa_hashmap *hash,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_alsa_ucm_device **pdevices,
-        int num,
-        pa_hashmap *ports,
-        pa_core *core) {
-
-    pa_device_port *port;
-    int i;
-    char *name = NULL;
-    const char *dev_name;
-    pa_alsa_ucm_device *dev;
-
-    dev = pdevices[0];
-    dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME);
-
-    name = pa_sprintf_malloc("%s%s", is_sink ? PA_UCM_PRE_TAG_OUTPUT : PA_UCM_PRE_TAG_INPUT, dev_name);
-
-    for (i = 1; i < num; i++) {
-        char *tmp;
-
-        dev = pdevices[i];
-        dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME);
-
-        tmp = pa_sprintf_malloc("%s+%s", name, dev_name);
-        pa_xfree(name);
-        name = tmp;
-    }
-
-    port = pa_hashmap_get(ports, name);
-    pa_assert(port);
-    pa_xfree(name);
-
-    if (hash) {
-        pa_hashmap_put(hash, port->name, port);
-        pa_device_port_ref(port);
-    }
-
-    return;
-}
-
 static int ucm_port_contains(const char *port_name, const char *dev_name, bool is_sink) {
     int ret = 0;
     const char *r;
@@ -771,47 +728,6 @@ static bool ucm_check_conformance(
     return true;
 }
 
-static inline pa_alsa_ucm_device *get_next_device(pa_idxset *idxset, uint32_t *idx) {
-    pa_alsa_ucm_device *dev;
-
-    if (*idx == PA_IDXSET_INVALID)
-        dev = pa_idxset_first(idxset, idx);
-    else
-        dev = pa_idxset_next(idxset, idx);
-
-    return dev;
-}
-
-static void ucm_add_ports_combination(
-        pa_hashmap *hash,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_alsa_ucm_device **pdevices,
-        int dev_num,
-        uint32_t map_index,
-        pa_hashmap *ports,
-        pa_core *core) {
-
-    pa_alsa_ucm_device *dev;
-    uint32_t idx = map_index;
-
-    if ((dev = get_next_device(context->ucm_devices, &idx)) == NULL)
-        return;
-
-    /* check if device at map_index can combine with existing devices combination */
-    if (ucm_check_conformance(pdevices, dev_num, dev)) {
-        /* add device at map_index to devices combination */
-        pdevices[dev_num] = dev;
-        /* add current devices combination as a new port */
-        ucm_add_port_combination(hash, context, is_sink, pdevices, dev_num + 1, ports, core);
-        /* try more elements combination */
-        ucm_add_ports_combination(hash, context, is_sink, pdevices, dev_num + 1, idx, ports, core);
-    }
-
-    /* try other device with current elements number */
-    ucm_add_ports_combination(hash, context, is_sink, pdevices, dev_num, idx, ports, core);
-}
-
 static char* merge_roles(const char *cur, const char *add) {
     char *r, *ret;
     const char *state = NULL;
@@ -841,36 +757,6 @@ static char* merge_roles(const char *cur, const char *add) {
     return ret;
 }
 
-void pa_alsa_ucm_add_ports_combination(
-        pa_hashmap *p,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_hashmap *ports,
-        pa_core *core) {
-
-    pa_alsa_ucm_device **pdevices;
-
-    pa_assert(context->ucm_devices);
-
-    if (pa_idxset_size(context->ucm_devices) > 0) {
-        pdevices = pa_xnew(pa_alsa_ucm_device *, pa_idxset_size(context->ucm_devices));
-        ucm_add_ports_combination(p, context, is_sink, pdevices, 0, PA_IDXSET_INVALID, ports, core);
-        pa_xfree(pdevices);
-    }
-}
-
-void pa_alsa_ucm_add_ports(
-        pa_hashmap **p,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_card *card) {
-
-    pa_assert(p);
-    pa_assert(*p);
-
-    pa_alsa_ucm_add_ports_combination(*p, context, is_sink, card->ports, card->core);
-}
-
 void pa_alsa_ucm_set_intended_roles(pa_proplist *proplist, pa_alsa_ucm_mapping_context *context, pa_direction_t direction) {
     uint32_t idx;
     char *merged_roles;
@@ -1760,21 +1646,6 @@ int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, cons
     return -1;
 }
 
-void pa_alsa_ucm_add_ports(
-        pa_hashmap **hash,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_card *card) {
-}
-
-void pa_alsa_ucm_add_ports_combination(
-        pa_hashmap *hash,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_hashmap *ports,
-        pa_core *core) {
-}
-
 void pa_alsa_ucm_set_intended_roles(pa_proplist *proplist, pa_alsa_ucm_mapping_context *context, pa_direction_t direction) {
 }
 
diff --git a/src/modules/alsa/alsa-ucm.h b/src/modules/alsa/alsa-ucm.h
index 476ba41..c3195f8 100644
--- a/src/modules/alsa/alsa-ucm.h
+++ b/src/modules/alsa/alsa-ucm.h
@@ -98,17 +98,6 @@ int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, const char *new_profile, co
 
 int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, const char *verb_desc, pa_alsa_ucm_verb **p_verb);
 
-void pa_alsa_ucm_add_ports(
-        pa_hashmap **hash,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_card *card);
-void pa_alsa_ucm_add_ports_combination(
-        pa_hashmap *hash,
-        pa_alsa_ucm_mapping_context *context,
-        bool is_sink,
-        pa_hashmap *ports,
-        pa_core *core);
 void pa_alsa_ucm_set_intended_roles(pa_proplist *proplist, pa_alsa_ucm_mapping_context *context, pa_direction_t direction);
 int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port, bool is_sink);
 
diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
index 64c6fa0..b27f885 100644
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -179,10 +179,6 @@ static void add_profiles(struct userdata *u, pa_card_new_data *data) {
             PA_IDXSET_FOREACH(m, ap->output_mappings, idx) {
                 pa_hashmap_put(cp->sink_prototypes, m->sink_prototype, m->sink_prototype);
 
-                if (u->use_ucm)
-                    pa_alsa_ucm_add_ports_combination(NULL, &m->ucm_context, true, data->ports, u->core);
-                else
-                    pa_alsa_path_set_add_ports(m->output_path_set, data->ports, NULL);
                 if (m->channel_map.channels > cp->max_sink_channels)
                     cp->max_sink_channels = m->channel_map.channels;
             }
@@ -192,10 +188,6 @@ static void add_profiles(struct userdata *u, pa_card_new_data *data) {
             PA_IDXSET_FOREACH(m, ap->input_mappings, idx) {
                 pa_hashmap_put(cp->source_prototypes, m->source_prototype, m->source_prototype);
 
-                if (u->use_ucm)
-                    pa_alsa_ucm_add_ports_combination(NULL, &m->ucm_context, false, data->ports, u->core);
-                else
-                    pa_alsa_path_set_add_ports(m->input_path_set, data->ports, NULL);
                 if (m->channel_map.channels > cp->max_source_channels)
                     cp->max_source_channels = m->channel_map.channels;
             }
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 05ff5a1..199c85e 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1503,20 +1503,6 @@ static pa_hook_result_t transport_speaker_gain_changed_cb(pa_bluetooth_discovery
     return PA_HOOK_OK;
 }
 
-static void connect_ports(struct userdata *u, void *sink_or_source_new_data, pa_direction_t direction) {
-    if (direction == PA_DIRECTION_OUTPUT) {
-        pa_sink_new_data *sink_new_data = sink_or_source_new_data;
-
-        pa_assert_se(pa_hashmap_put(sink_new_data->ports, u->output_port->name, u->output_port) >= 0);
-        pa_device_port_ref(u->output_port);
-    } else {
-        pa_source_new_data *source_new_data = sink_or_source_new_data;
-
-        pa_assert_se(pa_hashmap_put(source_new_data->ports, u->input_port->name, u->input_port) >= 0);
-        pa_device_port_ref(u->input_port);
-    }
-}
-
 static int sink_set_port_cb(pa_sink *s, pa_device_port *p) {
     return 0;
 }
@@ -1559,7 +1545,6 @@ static int add_sink(struct userdata *u) {
             pa_sink_new_data_done(&data);
             return -1;
         }
-        connect_ports(u, &data, PA_DIRECTION_OUTPUT);
 
         if (!u->transport_acquired)
             switch (u->profile) {
@@ -1633,8 +1618,6 @@ static int add_source(struct userdata *u) {
             return -1;
         }
 
-        connect_ports(u, &data, PA_DIRECTION_INPUT);
-
         if (!u->transport_acquired)
             switch (u->profile) {
                 case PROFILE_HSP:
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 8bd9544..1045952 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -140,9 +140,17 @@ void pa_sink_new_data_set_port(pa_sink_new_data *data, const char *port) {
 }
 
 void pa_sink_new_data_set_prototype(pa_sink_new_data *data, pa_device_prototype *prototype) {
+    pa_device_port *port;
+    void *state;
+
     pa_assert(data);
+    pa_assert(prototype);
+    pa_assert(!data->prototype);
 
     data->prototype = prototype;
+
+    PA_HASHMAP_FOREACH(port, prototype->ports, state)
+        pa_hashmap_put(data->ports, port->name, pa_device_port_ref(port));
 }
 
 void pa_sink_new_data_done(pa_sink_new_data *data) {
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index 25b7a78..08a816b 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -137,9 +137,17 @@ void pa_source_new_data_set_port(pa_source_new_data *data, const char *port) {
 }
 
 void pa_source_new_data_set_prototype(pa_source_new_data *data, pa_device_prototype *prototype) {
+    pa_device_port *port;
+    void *state;
+
     pa_assert(data);
+    pa_assert(prototype);
+    pa_assert(!data->prototype);
 
     data->prototype = prototype;
+
+    PA_HASHMAP_FOREACH(port, prototype->ports, state)
+        pa_hashmap_put(data->ports, port->name, pa_device_port_ref(port));
 }
 
 void pa_source_new_data_done(pa_source_new_data *data) {
-- 
1.8.3.1



More information about the pulseaudio-discuss mailing list