From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx> 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c index dd255e9..b6bdd52 100644 --- a/src/modules/bluetooth/module-bluetooth-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -2265,7 +2265,8 @@ 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); @@ -2273,6 +2274,15 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) { move_all_end(u, inputs, outputs); return 0; + +off: + stop_thread(u); + move_all_end(u, inputs, outputs); + + if (pa_card_set_profile(u->card, "off", FALSE) < 0) + pa_log_debug("Failed to switch profile to off"); + + 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) { -- 1.7.11.4