[pulseaudio-commits] 4 commits - src/daemon src/modules

Tanu Kaskinen tanuk at kemper.freedesktop.org
Wed Nov 28 19:55:49 PST 2012


 src/daemon/default.pa.in                        |    4 +
 src/modules/bluetooth/module-bluetooth-device.c |   72 +++++++++++++++++-------
 src/modules/bluetooth/module-bluetooth-policy.c |    4 +
 src/modules/module-virtual-surround-sink.c      |    6 +-
 4 files changed, 64 insertions(+), 22 deletions(-)

New commits:
commit 6ef23eb4af309018b5e0e834d634e92deef79877
Author: Mikel Astiz <mikel.astiz at bmw-carit.de>
Date:   Mon Nov 26 18:32:09 2012 +0100

    conf: Load bluetooth-policy module by default
    
    Headset use-cases shouldn't get affected by this module and the support
    for A2DP source is interesting, therefore load the module by default.

diff --git a/src/daemon/default.pa.in b/src/daemon/default.pa.in
index e3f1f4f..13e548b 100755
--- a/src/daemon/default.pa.in
+++ b/src/daemon/default.pa.in
@@ -84,6 +84,10 @@ load-module module-jackdbus-detect
 
 ifelse(@HAVE_BLUEZ@, 1, [dnl
 ### Automatically load driver modules for Bluetooth hardware
+.ifexists module-bluetooth-policy at PA_SOEXT@
+load-module module-bluetooth-policy
+.endif
+
 .ifexists module-bluetooth-discover at PA_SOEXT@
 load-module module-bluetooth-discover
 .endif

commit 71bd458bd1f9c92e2d929b8741346112109b17e0
Author: Mikel Astiz <mikel.astiz at bmw-carit.de>
Date:   Mon Nov 26 18:32:08 2012 +0100

    bluetooth: Disable profile auto-switch policy for headsets
    
    Given that headsets have just one single port exposing whether the
    audio is streaming (playing) or not, it's not possible that
    module-bluetooth-policy would distinguish A2DP/HSP cases, and thus
    the automatic selection of the card profile is not deterministic.
    
    For this reason, disable the policy entirely for headsets and focus
    only on HFGW and A2DP source profiles.

diff --git a/src/modules/bluetooth/module-bluetooth-policy.c b/src/modules/bluetooth/module-bluetooth-policy.c
index 87a5716..f0bffe9 100644
--- a/src/modules/bluetooth/module-bluetooth-policy.c
+++ b/src/modules/bluetooth/module-bluetooth-policy.c
@@ -187,6 +187,10 @@ static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port
     if (!s || !pa_streq(s, "bluetooth"))
         return PA_HOOK_OK;
 
+    /* Do not automatically switch profiles for headsets, just in case */
+    if (pa_hashmap_get(port->profiles, "hsp") || pa_hashmap_get(port->profiles, "a2dp"))
+        return PA_HOOK_OK;
+
     is_active_profile = card->active_profile == pa_hashmap_get(port->profiles, card->active_profile->name);
 
     if (is_active_profile && port->available == PA_PORT_AVAILABLE_YES)

commit 40329acc1a28145643e49207e9d65cd05bbda2c8
Author: Mikel Astiz <mikel.astiz at bmw-carit.de>
Date:   Mon Nov 26 18:32:07 2012 +0100

    bluetooth: Merge headset ports into one
    
    Merge the former "hsp-output" and "a2dp-output" ports into one single
    port, in order to fix the regression of having several independent
    entries in the UI.

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index dd1bb86..506a479 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1281,6 +1281,15 @@ static pa_port_available_t audio_state_to_availability(pa_bt_audio_state_t state
         return PA_PORT_AVAILABLE_UNKNOWN;
 }
 
+static pa_port_available_t audio_state_to_availability_merged(pa_bt_audio_state_t state1, pa_bt_audio_state_t state2) {
+    if (state1 < PA_BT_AUDIO_STATE_CONNECTED && state2 < PA_BT_AUDIO_STATE_CONNECTED)
+        return PA_PORT_AVAILABLE_NO;
+    else if (state1 >= PA_BT_AUDIO_STATE_PLAYING || state2 >= PA_BT_AUDIO_STATE_PLAYING)
+        return PA_PORT_AVAILABLE_YES;
+    else
+        return PA_PORT_AVAILABLE_UNKNOWN;
+}
+
 /* Run from main thread */
 static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) {
     DBusError err;
@@ -1356,9 +1365,14 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
 
         if (state != PA_BT_AUDIO_STATE_INVALID && pa_hashmap_get(u->card->profiles, "hsp")) {
             pa_device_port *port;
-            pa_port_available_t available = audio_state_to_availability(state);
+            pa_port_available_t available;
 
-            pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-output"));
+            if (pa_hashmap_get(u->card->profiles, "a2dp") == NULL)
+                available = audio_state_to_availability(state);
+            else
+                available = audio_state_to_availability_merged(state, u->device->audio_sink_state);
+
+            pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-output"));
             pa_device_port_set_available(port, available);
 
             pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-input"));
@@ -1385,9 +1399,14 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
 
         if (state != PA_BT_AUDIO_STATE_INVALID && pa_hashmap_get(u->card->profiles, "a2dp")) {
             pa_device_port *port;
-            pa_port_available_t available = audio_state_to_availability(state);
+            pa_port_available_t available;
+
+            if (pa_hashmap_get(u->card->profiles, "hsp") == NULL)
+                available = audio_state_to_availability(state);
+            else
+                available = audio_state_to_availability_merged(state, u->device->headset_state);
 
-            pa_assert_se(port = pa_hashmap_get(u->card->ports, "a2dp-output"));
+            pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-output"));
             pa_device_port_set_available(port, available);
 
             acquire = (available == PA_PORT_AVAILABLE_YES && u->profile == PROFILE_A2DP);
@@ -1614,7 +1633,7 @@ static void connect_ports(struct userdata *u, void *sink_or_source_new_data, pa_
 
     switch (u->profile) {
         case PROFILE_A2DP:
-            pa_assert_se(port = pa_hashmap_get(u->card->ports, "a2dp-output"));
+            pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-output"));
             pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
             pa_device_port_ref(port);
             break;
@@ -1627,7 +1646,7 @@ static void connect_ports(struct userdata *u, void *sink_or_source_new_data, pa_
 
         case PROFILE_HSP:
             if (direction == PA_DIRECTION_OUTPUT) {
-                pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-output"));
+                pa_assert_se(port = pa_hashmap_get(u->card->ports, "bluetooth-output"));
                 pa_assert_se(pa_hashmap_put(data.sink_new_data->ports, port->name, port) >= 0);
             } else {
                 pa_assert_se(port = pa_hashmap_get(u->card->ports, "hsp-input"));
@@ -2247,13 +2266,20 @@ static void create_ports_for_profile(struct userdata *u, pa_hashmap *ports, pa_c
 
     switch (*d) {
         case PROFILE_A2DP:
-            pa_assert_se(port = pa_device_port_new(u->core, "a2dp-output", _("Bluetooth High Quality (A2DP)"), 0));
-            pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0);
-            port->is_output = 1;
-            port->is_input = 0;
-            port->priority = profile->priority * 100;
-            port->available = audio_state_to_availability(device->audio_sink_state);
-            pa_hashmap_put(port->profiles, profile->name, profile);
+            if ((port = pa_hashmap_get(ports, "bluetooth-output")) != NULL) {
+                port->priority = PA_MAX(port->priority, profile->priority * 100);
+                port->available = audio_state_to_availability_merged(device->headset_state, device->audio_sink_state);
+                pa_hashmap_put(port->profiles, profile->name, profile);
+            } else {
+                pa_assert_se(port = pa_device_port_new(u->core, "bluetooth-output", _("Bluetooth Output"), 0));
+                pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0);
+                port->is_output = 1;
+                port->is_input = 0;
+                port->priority = profile->priority * 100;
+                port->available = audio_state_to_availability(device->audio_sink_state);
+                pa_hashmap_put(port->profiles, profile->name, profile);
+            }
+
             break;
 
         case PROFILE_A2DP_SOURCE:
@@ -2267,13 +2293,19 @@ static void create_ports_for_profile(struct userdata *u, pa_hashmap *ports, pa_c
             break;
 
         case PROFILE_HSP:
-            pa_assert_se(port = pa_device_port_new(u->core, "hsp-output", _("Bluetooth Telephony (HSP/HFP)"), 0));
-            pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0);
-            port->is_output = 1;
-            port->is_input = 0;
-            port->priority = profile->priority * 100;
-            port->available = audio_state_to_availability(device->headset_state);
-            pa_hashmap_put(port->profiles, profile->name, profile);
+            if ((port = pa_hashmap_get(ports, "bluetooth-output")) != NULL) {
+                port->priority = PA_MAX(port->priority, profile->priority * 100);
+                port->available = audio_state_to_availability_merged(device->headset_state, device->audio_sink_state);
+                pa_hashmap_put(port->profiles, profile->name, profile);
+            } else {
+                pa_assert_se(port = pa_device_port_new(u->core, "bluetooth-output", _("Bluetooth Output"), 0));
+                pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0);
+                port->is_output = 1;
+                port->is_input = 0;
+                port->priority = profile->priority * 100;
+                port->available = audio_state_to_availability(device->headset_state);
+                pa_hashmap_put(port->profiles, profile->name, profile);
+            }
 
             pa_assert_se(port = pa_device_port_new(u->core, "hsp-input", _("Bluetooth Telephony (HSP/HFP)"), 0));
             pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0);

commit 523af5b30220df76515b8b9fa62d0f80bffc541f
Author: Niels Ole Salscheider <niels_ole at salscheider-online.de>
Date:   Sat Nov 24 12:32:51 2012 +0100

    virtual-surround: check if resampled memblock is not equal to input
    
    Since commit e32a408b3cdd46857fdf12210c1bf5bdbf3a96f8, we silence the
    input memblock in order to give the resampler enough input samples, if
    necessary.
    But if there is no need to resample the hrir, the resampled memblock is
    actually the same as the input memblock. Thus, we have to make sure that
    we do not silence it in this case.

diff --git a/src/modules/module-virtual-surround-sink.c b/src/modules/module-virtual-surround-sink.c
index 4915278..adaa58f 100644
--- a/src/modules/module-virtual-surround-sink.c
+++ b/src/modules/module-virtual-surround-sink.c
@@ -738,8 +738,10 @@ int pa__init(pa_module*m) {
     /* add silence to the hrir until we get enough samples out of the resampler */
     while (hrir_copied_length < hrir_total_length) {
         pa_resampler_run(resampler, &hrir_temp_chunk, &hrir_temp_chunk_resampled);
-        /* Silence input block */
-        pa_silence_memblock(hrir_temp_chunk.memblock, &hrir_temp_ss);
+        if (hrir_temp_chunk.memblock != hrir_temp_chunk_resampled.memblock) {
+            /* Silence input block */
+            pa_silence_memblock(hrir_temp_chunk.memblock, &hrir_temp_ss);
+        }
 
         if (hrir_temp_chunk_resampled.memblock) {
             /* Copy hrir data */



More information about the pulseaudio-commits mailing list