[pulseaudio-commits] 3 commits - src/daemon src/modules
David Henningsson
diwic at kemper.freedesktop.org
Wed Apr 24 01:32:53 PDT 2013
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.henningsson at 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.henningsson at 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.henningsson at 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.henningsson at 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.henningsson at 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.henningsson at 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)
More information about the pulseaudio-commits
mailing list