bluetooth: Don't find device if set profile is off

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.
This commit is contained in:
Mikel Astiz 2012-09-28 17:45:29 +02:00 committed by Tanu Kaskinen
parent b76ee00873
commit 0c5054e04a

View file

@ -2184,7 +2184,6 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
struct userdata *u; struct userdata *u;
enum profile *d; enum profile *d;
pa_queue *inputs = NULL, *outputs = NULL; pa_queue *inputs = NULL, *outputs = NULL;
const pa_bluetooth_device *device;
pa_assert(c); pa_assert(c);
pa_assert(new_profile); pa_assert(new_profile);
@ -2192,28 +2191,27 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
d = PA_CARD_PROFILE_DATA(new_profile); d = PA_CARD_PROFILE_DATA(new_profile);
if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) { if (*d != PROFILE_OFF) {
pa_log_error("Failed to get device object."); const pa_bluetooth_device *device;
return -PA_ERR_IO;
}
/* The state signal is sent by bluez, so it is racy to check if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
strictly for CONNECTED, we should also accept STREAMING state pa_log_error("Failed to get device object.");
as being good enough. However, if the profile is used return -PA_ERR_IO;
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) { if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) {
pa_log_warn("HSP is not connected, refused to switch profile"); pa_log_warn("HSP is not connected, refused to switch profile");
return -PA_ERR_IO; return -PA_ERR_IO;
} else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) { } 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"); pa_log_warn("A2DP Sink is not connected, refused to switch profile");
return -PA_ERR_IO; return -PA_ERR_IO;
} else if (device->audio_source_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP_SOURCE) { } 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"); pa_log_warn("A2DP Source is not connected, refused to switch profile");
return -PA_ERR_IO; return -PA_ERR_IO;
} else if (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) { } else if (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) {
pa_log_warn("HandsfreeGateway is not connected, refused to switch profile"); pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
return -PA_ERR_IO; return -PA_ERR_IO;
}
} }
if (u->sink) { if (u->sink) {