[RFCv3 14/20] bluetooth: Suspend sink/source on HFP's stream HUP

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Jo?o Paulo Rechi Vita <jprvita@xxxxxxxxxxxxx>

When the Audio Connection is disconnected the sink and source should be
suspended.
---
 src/modules/bluetooth/module-bluetooth-device.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index ae05a17..9a0b765 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -193,6 +193,7 @@ struct userdata {
 
 enum {
     BLUETOOTH_MESSAGE_IO_THREAD_FAILED,
+    BLUETOOTH_MESSAGE_TRANSPORT_STATE_CHANGED,
     BLUETOOTH_MESSAGE_MAX
 };
 
@@ -527,18 +528,25 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
     return (r < 0 || !failed) ? r : -1;
 }
 
+static void handle_transport_state_change(struct userdata *u, struct pa_bluetooth_transport *transport);
+
 /* Called from main thread context */
 static int device_process_msg(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) {
-    struct bluetooth_msg *u = BLUETOOTH_MSG(obj);
+    struct bluetooth_msg *b = BLUETOOTH_MSG(obj);
+    struct userdata *u = data;
 
     switch (code) {
+        case BLUETOOTH_MESSAGE_TRANSPORT_STATE_CHANGED:
+            handle_transport_state_change(u, u->transport);
+            break;
+
         case BLUETOOTH_MESSAGE_IO_THREAD_FAILED: {
-            if (u->card->module->unload_requested)
+            if (b->card->module->unload_requested)
                 break;
 
             pa_log_debug("Switching the profile to off due to IO thread failure.");
 
-            pa_assert_se(pa_card_set_profile(u->card, "off", false) >= 0);
+            pa_assert_se(pa_card_set_profile(b->card, "off", false) >= 0);
             break;
         }
     }
@@ -1175,6 +1183,12 @@ io_fail:
         pending_read_bytes = 0;
         writable = false;
 
+        if (u->profile == PROFILE_HFGW && pa_bluetooth_discovery_get_bluez_version(u->discovery) == BLUEZ_VERSION_5) {
+            u->transport->state = PA_BLUETOOTH_TRANSPORT_STATE_IDLE;
+            pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_TRANSPORT_STATE_CHANGED, u, 0,
+                              NULL, NULL);
+        }
+
         teardown_stream(u);
     }
 
-- 
1.7.11.7



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux