summaryrefslogtreecommitdiffstats
path: root/src/modules/bluetooth
diff options
context:
space:
mode:
authorMarc-André Lureau <marc-andre.lureau@nokia.com>2011-03-28 15:35:15 +0300
committerColin Guthrie <colin@mageia.org>2011-04-01 13:30:50 +0100
commit209b7b781d8d1a5ac5f1442bd647098c2a3c4e18 (patch)
tree7e9628d091d0eb54e29c748d1d7a49a413c313dc /src/modules/bluetooth
parent13849f153cf44ff9b1e2157b3b6bc8b8c990a70f (diff)
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..
Diffstat (limited to 'src/modules/bluetooth')
-rw-r--r--src/modules/bluetooth/module-bluetooth-device.c39
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 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);