bluez5: release transports on profile change

SCO transports have timer-delayed release, but they need to be released
immediately when changing profiles to close connections before switching
to A2DP.
This commit is contained in:
Pauli Virtanen 2021-03-08 23:39:01 +02:00
parent 6fd870a5f0
commit 511bafb436
3 changed files with 25 additions and 0 deletions

View file

@ -1184,6 +1184,28 @@ int spa_bt_transport_release(struct spa_bt_transport *transport)
return res;
}
static int spa_bt_transport_release_now(struct spa_bt_transport *transport)
{
int res;
if (transport->acquire_refcount == 0)
return 0;
spa_bt_transport_stop_release_timer(transport);
res = spa_bt_transport_impl(transport, release, 0);
if (res >= 0)
transport->acquire_refcount = 0;
return res;
}
int spa_bt_device_release_transports(struct spa_bt_device *device)
{
struct spa_bt_transport *t;
spa_list_for_each(t, &device->transport_list, device_link)
spa_bt_transport_release_now(t);
}
static void spa_bt_transport_release_timer_event(struct spa_source *source)
{
struct spa_bt_transport *transport = source->data;

View file

@ -270,6 +270,8 @@ static int set_profile(struct impl *this, uint32_t profile, const struct a2dp_co
emit_remove_nodes(this);
spa_bt_device_release_transports(this->bt_dev);
this->profile = profile;
this->selected_a2dp_codec = a2dp_codec;

View file

@ -404,6 +404,7 @@ int spa_bt_device_check_profiles(struct spa_bt_device *device, bool force);
int spa_bt_device_ensure_a2dp_codec(struct spa_bt_device *device, const struct a2dp_codec **codecs);
bool spa_bt_device_supports_a2dp_codec(struct spa_bt_device *device, const struct a2dp_codec *codec);
const struct a2dp_codec **spa_bt_device_get_supported_a2dp_codecs(struct spa_bt_device *device, size_t *count);
int spa_bt_device_release_transports(struct spa_bt_device *device);
#define spa_bt_device_emit(d,m,v,...) spa_hook_list_call(&(d)->listener_list, \
struct spa_bt_device_events, \