From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx> If the card is being set to off profile, it is not necessary to check if the device exists. This could potentially happen during shutdown, immediately before the module is unloaded. --- src/modules/bluetooth/module-bluetooth-device.c | 44 ++++++++++++------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c index 5a035d1..f1af964 100644 --- a/src/modules/bluetooth/module-bluetooth-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -2187,7 +2187,6 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) { struct userdata *u; enum profile *d; pa_queue *inputs = NULL, *outputs = NULL; - const pa_bluetooth_device *device; pa_assert(c); pa_assert(new_profile); @@ -2195,28 +2194,27 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) { d = PA_CARD_PROFILE_DATA(new_profile); - if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) { - pa_log_error("Failed to get device object."); - return -PA_ERR_IO; - } - - /* The state signal is sent by bluez, so it is racy to check - strictly for CONNECTED, we should also accept STREAMING state - as being good enough. However, if the profile is used - concurrently (which is unlikely), ipc will fail later on, and - module will be unloaded. */ - if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) { - pa_log_warn("HSP is not connected, refused to switch profile"); - return -PA_ERR_IO; - } else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) { - pa_log_warn("A2DP Sink is not connected, refused to switch profile"); - return -PA_ERR_IO; - } else if (device->audio_source_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP_SOURCE) { - pa_log_warn("A2DP Source is not connected, refused to switch profile"); - return -PA_ERR_IO; - } else if (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) { - pa_log_warn("HandsfreeGateway is not connected, refused to switch profile"); - return -PA_ERR_IO; + if (*d != PROFILE_OFF) { + const pa_bluetooth_device *device; + + if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) { + pa_log_error("Failed to get device object."); + return -PA_ERR_IO; + } + + if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) { + pa_log_warn("HSP is not connected, refused to switch profile"); + return -PA_ERR_IO; + } else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) { + pa_log_warn("A2DP Sink is not connected, refused to switch profile"); + return -PA_ERR_IO; + } else if (device->audio_source_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP_SOURCE) { + pa_log_warn("A2DP Source is not connected, refused to switch profile"); + return -PA_ERR_IO; + } else if (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) { + pa_log_warn("HandsfreeGateway is not connected, refused to switch profile"); + return -PA_ERR_IO; + } } if (u->sink) { -- 1.7.11.4