[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