[PATCH 2/5] bluetooth: use sco_sink/source to start with right state

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

 



From: Marc-Andr? Lureau <marc-andre.lureau@xxxxxxxxx>

Note from Tanu Kaskinen: I resolved some conflicts with newer upstream code, so
if this patch is broken, blame me..
---
 src/modules/bluetooth/module-bluetooth-device.c |   39 +++++++++++++---------
 1 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index af08003..10fb5ed 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1873,39 +1873,46 @@ static char *get_name(const char *type, pa_modargs *ma, const char *device_id, p
     return pa_sprintf_malloc("bluez_%s.%s", type, n);
 }
 
-static void sco_over_pcm_state_update(struct userdata *u) {
+static int sco_over_pcm_state_update(struct userdata *u) {
     pa_assert(u);
     pa_assert(USE_SCO_OVER_PCM(u));
 
     if (PA_SINK_IS_OPENED(pa_sink_get_state(u->hsp.sco_sink)) ||
         PA_SOURCE_IS_OPENED(pa_source_get_state(u->hsp.sco_source))) {
 
-        if (u->service_fd >= 0)
-            return;
+        if (u->service_fd >= 0 && u->stream_fd >= 0)
+            return 0;
 
         init_bt(u);
 
         pa_log_debug("Resuming SCO over PCM");
-        if (init_profile(u) < 0)
+        if (init_profile(u) < 0) {
             pa_log("Can't resume SCO over PCM");
+            return -1;
+        }
 
         if (u->transport)
-            bt_transport_acquire(u, TRUE);
+            return bt_transport_acquire(u, TRUE);
         else
-            start_stream_fd(u);
+            return start_stream_fd(u);
+
     } else {
+        if (u->service_fd < 0 && u->stream_fd < 0)
+            return 0;
 
-        if (u->service_fd < 0)
-            return;
+        pa_log_debug("Closing SCO over PCM");
 
         if (u->transport)
             bt_transport_release(u);
-        else
+        else if (u->stream_fd >= 0)
             stop_stream_fd(u);
 
-        pa_log_debug("Closing SCO over PCM");
-        pa_close(u->service_fd);
-        u->service_fd = -1;
+        if (u->service_fd >= 0) {
+            pa_close(u->service_fd);
+            u->service_fd = -1;
+        }
+
+        return 0;
     }
 }
 
@@ -2358,11 +2365,11 @@ static int start_thread(struct userdata *u) {
     pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
 
     if (USE_SCO_OVER_PCM(u)) {
-        if (u->transport) {
-            if (bt_transport_acquire(u, TRUE) < 0)
-                return -1;
-        } else if (start_stream_fd(u) < 0)
+        if (sco_over_pcm_state_update(u) < 0) {
+            u->sink = NULL;
+            u->source = NULL;
             return -1;
+        }
 
         pa_sink_ref(u->sink);
         pa_source_ref(u->source);
-- 
1.7.4.1




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

  Powered by Linux