On 08/26/2013 08:15 PM, Felipe F. Tonello wrote: > From: "Felipe F. Tonello" <eu at felipetonello.com> > > This fixes a bug when switching profiles under ALSA UCM. If a jack, hence a > port, was previsouly active, when PA performed a profile switch, the jack > would continue to be available but not active. > > This patche ensures that it activates a port if a jack is previously connected. Thanks, but I'm not sure this is the right way to do it. It feels like setting the active port is more like something for a policy module (e g module-switch-on-port-available), rather than being hardcoded in the module itself. Also, what if two jacks are both available at the time of the profile switch? > > Signed-off-by: Felipe F. Tonello <eu at felipetonello.com> > --- > src/modules/alsa/alsa-sink.c | 5 +++-- > src/modules/alsa/alsa-source.c | 5 +++-- > src/modules/alsa/alsa-ucm.c | 34 ++++++++++++++++++++++++++++++++++ > src/modules/alsa/alsa-ucm.h | 3 +++ > 4 files changed, 43 insertions(+), 4 deletions(-) > > diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c > index f910d19..7560b94 100644 > --- a/src/modules/alsa/alsa-sink.c > +++ b/src/modules/alsa/alsa-sink.c > @@ -2281,9 +2281,10 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca > goto fail; > } > > - if (u->ucm_context) > + if (u->ucm_context) { > pa_alsa_ucm_add_ports(&data.ports, data.proplist, u->ucm_context, true, card); > - else if (u->mixer_path_set) > + pa_alsa_ucm_set_active_port(u->ucm_context, data.ports, &data.active_port); > + } else if (u->mixer_path_set) > pa_alsa_add_ports(&data, u->mixer_path_set, card); > > u->sink = pa_sink_new(m->core, &data, PA_SINK_HARDWARE | PA_SINK_LATENCY | (u->use_tsched ? PA_SINK_DYNAMIC_LATENCY : 0) | > diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c > index faf8965..71079d5 100644 > --- a/src/modules/alsa/alsa-source.c > +++ b/src/modules/alsa/alsa-source.c > @@ -1980,9 +1980,10 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p > goto fail; > } > > - if (u->ucm_context) > + if (u->ucm_context) { > pa_alsa_ucm_add_ports(&data.ports, data.proplist, u->ucm_context, false, card); > - else if (u->mixer_path_set) > + pa_alsa_ucm_set_active_port(u->ucm_context, data.ports, &data.active_port); > + } else if (u->mixer_path_set) > pa_alsa_add_ports(&data, u->mixer_path_set, card); > > u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY|(u->use_tsched ? PA_SOURCE_DYNAMIC_LATENCY : 0)); > diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c > index 7f6b9f1..38a80d9 100644 > --- a/src/modules/alsa/alsa-ucm.c > +++ b/src/modules/alsa/alsa-ucm.c > @@ -969,6 +969,40 @@ int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, const char *new_profile, co > return ret; > } > > +int pa_alsa_ucm_set_active_port(pa_alsa_ucm_mapping_context *context, > + pa_hashmap *ports, > + char **active_port /* OUT */) { > + pa_alsa_ucm_config *ucm; > + pa_alsa_jack *j; > + pa_device_port *port = NULL; > + int ret = -1; > + > + pa_assert(context && context->ucm); > + > + ucm = context->ucm; > + > + if (ports) > + PA_LLIST_FOREACH(j, ucm->jacks) { > + if ((port = pa_hashmap_get(ports, j->name))) > + if (j->plugged_in) > + break; > + port = NULL; > + } > + > + if (port) { > + if (!*active_port) > + *active_port = strdup(port->name); > + else { > + /* This case should be rare case, but still */ > + *active_port = realloc(*active_port, (strlen(port->name) * sizeof(char)) + 1); > + strcpy(*active_port, port->name); > + } > + ret = 0; > + } > + > + return ret; > +} > + > int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port, bool is_sink) { > int i; > int ret = 0; > diff --git a/src/modules/alsa/alsa-ucm.h b/src/modules/alsa/alsa-ucm.h > index c31e5b1..32e1d64 100644 > --- a/src/modules/alsa/alsa-ucm.h > +++ b/src/modules/alsa/alsa-ucm.h > @@ -105,6 +105,9 @@ void pa_alsa_ucm_add_ports_combination( > pa_hashmap *ports, > pa_card_profile *cp, > pa_core *core); > +int pa_alsa_ucm_set_active_port(pa_alsa_ucm_mapping_context *context, > + pa_hashmap *ports, > + char **active_port /* OUT */); > int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port, bool is_sink); > > void pa_alsa_ucm_free(pa_alsa_ucm_config *ucm); > -- David Henningsson, Canonical Ltd. https://launchpad.net/~diwic