From 209b7b781d8d1a5ac5f1442bd647098c2a3c4e18 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Mon, 28 Mar 2011 15:35:15 +0300 Subject: bluetooth: use sco_sink/source to start with right state 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 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c index 6f927645..2cf52736 100644 --- a/src/modules/bluetooth/module-bluetooth-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -1871,39 +1871,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; } } @@ -2356,11 +2363,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); -- cgit