src/daemon/default.pa.in | 5 + src/modules/alsa/module-alsa-card.c | 2 src/modules/module-switch-on-port-available.c | 67 ++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 8 deletions(-)
New commits: commit d389e7d37ca603417e018d2031c09256854a8810 Author: David Henningsson <david.hennings...@canonical.com> Date: Tue Apr 16 13:09:38 2013 +0200 default.pa: Load switch-on-port-available before udev-detect We need to pick the right port as early as possible, before the first volume is picked up. Hence this module needs to be loaded before the sound card modules are loaded. Signed-off-by: David Henningsson <david.hennings...@canonical.com> diff --git a/src/daemon/default.pa.in b/src/daemon/default.pa.in index b4c4965..f50d929 100755 --- a/src/daemon/default.pa.in +++ b/src/daemon/default.pa.in @@ -44,6 +44,9 @@ load-module module-card-restore ### stored in /usr/share/application load-module module-augment-properties +### Should be after module-*-restore but before module-*-detect +load-module module-switch-on-port-available + ### Load audio drivers statically ### (it's probably better to not load these drivers manually, but instead ### use module-udev-detect -- see below -- for doing this automatically) @@ -193,8 +196,6 @@ ifelse(@HAVE_X11@, 1, [dnl #.endif ])dnl -load-module module-switch-on-port-available - ### Make some devices default #set-default-sink output #set-default-source input commit fe73f47828294285332654801d16ffdd4e729f7e Author: David Henningsson <david.hennings...@canonical.com> Date: Tue Apr 16 16:20:36 2013 +0200 module-switch-on-port-available: Handle hotplugged cards If a card is hot-plugged (which all cards will be when we load this module before module-*-detect), make sure we don't start up a sink with an unavailable port selected. Signed-off-by: David Henningsson <david.hennings...@canonical.com> diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c index 9b2029b..abd8777 100644 --- a/src/modules/module-switch-on-port-available.c +++ b/src/modules/module-switch-on-port-available.c @@ -31,7 +31,9 @@ #include "module-switch-on-port-available-symdef.h" struct userdata { - pa_hook_slot *callback_slot; + pa_hook_slot *available_slot; + pa_hook_slot *sink_new_slot; + pa_hook_slot *source_new_slot; }; static pa_device_port* find_best_port(pa_hashmap *ports) { @@ -218,6 +220,52 @@ static void handle_all_unavailable(pa_core *core) { } } +static pa_device_port *new_sink_source(pa_hashmap *ports, const char *name) { + + void *state; + pa_device_port *i, *p = NULL; + + if (!ports) + return NULL; + if (name) + p = pa_hashmap_get(ports, name); + if (!p) + PA_HASHMAP_FOREACH(i, ports, state) + if (!p || i->priority > p->priority) + p = i; + if (!p) + return NULL; + if (p->available != PA_AVAILABLE_NO) + return NULL; + + pa_assert_se(p = find_best_port(ports)); + return p; +} + +static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) { + + pa_device_port *p = new_sink_source(new_data->ports, new_data->active_port); + + if (p) { + pa_log_debug("Switching initial port for sink '%s' to '%s'", new_data->name, p->name); + pa_sink_new_data_set_port(new_data, p->name); + } + return PA_HOOK_OK; +} + +static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data *new_data, struct userdata *u) { + + pa_device_port *p = new_sink_source(new_data->ports, new_data->active_port); + + if (p) { + pa_log_debug("Switching initial port for source '%s' to '%s'", new_data->name, + new_data->active_port); + pa_source_new_data_set_port(new_data, p->name); + } + return PA_HOOK_OK; +} + + int pa__init(pa_module*m) { struct userdata *u; @@ -225,8 +273,13 @@ int pa__init(pa_module*m) { m->userdata = u = pa_xnew(struct userdata, 1); - u->callback_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED], - PA_HOOK_LATE, (pa_hook_cb_t) port_available_hook_callback, u); + /* Make sure we are after module-device-restore, so we can overwrite that suggestion if necessary */ + u->sink_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_NEW], + PA_HOOK_NORMAL, (pa_hook_cb_t) sink_new_hook_callback, u); + u->source_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_NEW], + PA_HOOK_NORMAL, (pa_hook_cb_t) source_new_hook_callback, u); + u->available_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED], + PA_HOOK_LATE, (pa_hook_cb_t) port_available_hook_callback, u); handle_all_unavailable(m->core); @@ -241,8 +294,12 @@ void pa__done(pa_module*m) { if (!(u = m->userdata)) return; - if (u->callback_slot) - pa_hook_slot_free(u->callback_slot); + if (u->available_slot) + pa_hook_slot_free(u->available_slot); + if (u->sink_new_slot) + pa_hook_slot_free(u->sink_new_slot); + if (u->source_new_slot) + pa_hook_slot_free(u->source_new_slot); pa_xfree(u); } commit 0b83787d4e844f47affbc903d97b0ca69e234570 Author: David Henningsson <david.hennings...@canonical.com> Date: Tue Apr 16 15:17:37 2013 +0200 alsa: Initialize ports before sinks/sources This way port availability has been filled in when we create the sink, which will later enable us to pick the right port directly. Signed-off-by: David Henningsson <david.hennings...@canonical.com> diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c index 2529c0d..9b739dc 100644 --- a/src/modules/alsa/module-alsa-card.c +++ b/src/modules/alsa/module-alsa-card.c @@ -748,8 +748,8 @@ int pa__init(pa_module *m) { u->card->userdata = u; u->card->set_profile = card_set_profile; - init_profile(u); init_jacks(u); + init_profile(u); init_eld_ctls(u); if (reserve) _______________________________________________ pulseaudio-commits mailing list pulseaudio-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pulseaudio-commits