]> code.delx.au - pulseaudio/commitdiff
bluetooth: Check return value of init_profile()
authorMikel Astiz <mikel.astiz@bmw-carit.de>
Fri, 19 Oct 2012 08:11:22 +0000 (10:11 +0200)
committerTanu Kaskinen <tanuk@iki.fi>
Fri, 19 Oct 2012 15:21:18 +0000 (18:21 +0300)
If profile could not be successfully initialized, the card should be
set to PROFILE_OFF automatically. If sinks or sources exist, they need
to be destroyed, therefore stop_thread() is called.

src/modules/bluetooth/module-bluetooth-device.c

index ee17fdeb9aefe3353c75312e3efaf1d3c7658c95..33d42fe1ce11b2d31756afa1f1e975499b3b0fd8 100644 (file)
@@ -2229,12 +2229,20 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
         save_sco_volume_callbacks(u);
 
     if (u->profile != PROFILE_OFF)
-        init_profile(u);
+        if (init_profile(u) < 0)
+            goto off;
 
     if (u->sink || u->source)
         start_thread(u);
 
     return 0;
+
+off:
+    stop_thread(u);
+
+    pa_assert_se(pa_card_set_profile(u->card, "off", false) >= 0);
+
+    return -PA_ERR_IO;
 }
 
 static void create_ports_for_profile(struct userdata *u, const pa_bluetooth_device *device, pa_card_new_data *card_new_data, pa_card_profile *profile) {