--- src/modules/alsa/alsa-sink.c | 9 +++++++++ src/modules/alsa/alsa-source.c | 9 +++++++++ src/modules/alsa/module-alsa-card.c | 26 ++++++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index fda621b..a7c66db 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -42,6 +42,7 @@ #include <pulsecore/core.h> #include <pulsecore/i18n.h> #include <pulsecore/module.h> +#include <pulsecore/sink-node.h> #include <pulsecore/memchunk.h> #include <pulsecore/sink.h> #include <pulsecore/modargs.h> @@ -94,6 +95,7 @@ struct userdata { pa_core *core; pa_module *module; pa_sink *sink; + pa_sink_node *sink_node; pa_thread *thread; pa_thread_mq thread_mq; @@ -2034,6 +2036,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca pa_sink_new_data data; pa_alsa_profile_set *profile_set = NULL; void *state = NULL; + bool belong_to_card = !!mapping; pa_assert(m); pa_assert(ma); @@ -2419,6 +2422,9 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca pa_sink_put(u->sink); + if (!belong_to_card) + u->sink_node = pa_sink_node_new(u->sink, "alsa-output"); + if (profile_set) pa_alsa_profile_set_free(profile_set); @@ -2439,6 +2445,9 @@ fail: static void userdata_free(struct userdata *u) { pa_assert(u); + if (u->sink_node) + pa_sink_node_free(u->sink_node); + if (u->sink) pa_sink_unlink(u->sink); diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c index da8222d..a93ba95 100644 --- a/src/modules/alsa/alsa-source.c +++ b/src/modules/alsa/alsa-source.c @@ -37,6 +37,7 @@ #include <pulsecore/core.h> #include <pulsecore/i18n.h> #include <pulsecore/module.h> +#include <pulsecore/source-node.h> #include <pulsecore/memchunk.h> #include <pulsecore/sink.h> #include <pulsecore/modargs.h> @@ -84,6 +85,7 @@ struct userdata { pa_core *core; pa_module *module; pa_source *source; + pa_source_node *source_node; pa_thread *thread; pa_thread_mq thread_mq; @@ -1743,6 +1745,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p pa_source_new_data data; pa_alsa_profile_set *profile_set = NULL; void *state = NULL; + bool belong_to_card = !!mapping; pa_assert(m); pa_assert(ma); @@ -2094,6 +2097,9 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p pa_source_put(u->source); + if (!belong_to_card) + u->source_node = pa_source_node_new(u->source, "alsa-input"); + if (profile_set) pa_alsa_profile_set_free(profile_set); @@ -2114,6 +2120,9 @@ fail: static void userdata_free(struct userdata *u) { pa_assert(u); + if (u->source_node) + pa_source_node_free(u->source_node); + if (u->source) pa_source_unlink(u->source); diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c index fe05e3d..b09b71b 100644 --- a/src/modules/alsa/module-alsa-card.c +++ b/src/modules/alsa/module-alsa-card.c @@ -26,8 +26,10 @@ #include <pulse/xmalloc.h> #include <pulsecore/core-util.h> +#include <pulsecore/dynarray.h> #include <pulsecore/i18n.h> #include <pulsecore/modargs.h> +#include <pulsecore/port-node.h> #include <pulsecore/queue.h> #include <modules/reserve-wrap.h> @@ -116,6 +118,7 @@ struct userdata { pa_alsa_fdlist *mixer_fdl; pa_card *card; + pa_dynarray *nodes; pa_modargs *modargs; @@ -613,6 +616,8 @@ int pa__init(pa_module *m) { const char *profile = NULL; char *fn = NULL; pa_bool_t namereg_fail = FALSE; + void *state; + pa_device_port *port; pa_alsa_refcnt_inc(); @@ -766,6 +771,24 @@ int pa__init(pa_module *m) { "is abused (i.e. fixes are not pushed to ALSA), the decibel fix feature may be removed in some future " "PulseAudio version.", u->card->name); + u->nodes = pa_dynarray_new((pa_free_cb_t) pa_port_node_free); + + PA_HASHMAP_FOREACH(port, u->card->ports, state) { + pa_port_node *node; + + if ((node = pa_port_node_new(port, port->direction == PA_DIRECTION_OUTPUT ? "alsa-output" : "alsa-input"))) + pa_dynarray_append(u->nodes, node); + else { + /* We could perhaps just ignore failures, but it's nice to be able + * to assume that nodes exist either for all or none of the + * ports. */ + pa_log("Failed to create a node for port %s. Removing all nodes of card %s.", port->name, u->card->name); + pa_dynarray_free(u->nodes); + u->nodes = NULL; + break; + } + } + return 0; fail: @@ -805,6 +828,9 @@ void pa__done(pa_module*m) { if (!(u = m->userdata)) goto finish; + if (u->nodes) + pa_dynarray_free(u->nodes); + if (u->sink_input_put_hook_slot) pa_hook_slot_free(u->sink_input_put_hook_slot); -- 1.8.1.2