mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
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:
parent
6fd870a5f0
commit
511bafb436
3 changed files with 25 additions and 0 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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, \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue