mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
bluez5: after registering a2dp profiles, connect them to connected devices
After registering a2dp profiles on startup, call org.bluez.Device1.ConnectProfile on already connected devices, if applicable.
This commit is contained in:
parent
18b5199d44
commit
a81158f3d5
1 changed files with 50 additions and 0 deletions
|
|
@ -681,6 +681,53 @@ static int device_update_props(struct spa_bt_device *device,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int device_try_connect_profile(struct spa_bt_device *device,
|
||||||
|
enum spa_bt_profile profile,
|
||||||
|
const char *profile_uuid)
|
||||||
|
{
|
||||||
|
struct spa_bt_monitor *monitor = device->monitor;
|
||||||
|
DBusMessage *m;
|
||||||
|
|
||||||
|
if (!(device->profiles & profile) || (device->connected_profiles & profile))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
spa_log_info(monitor->log, "device %p %s: A2DP profile %s not connected; try ConnectProfile()",
|
||||||
|
device, device->path, profile_uuid);
|
||||||
|
|
||||||
|
/* Call org.bluez.Device1.ConnectProfile() on device, ignoring result */
|
||||||
|
|
||||||
|
m = dbus_message_new_method_call(BLUEZ_SERVICE,
|
||||||
|
device->path,
|
||||||
|
BLUEZ_DEVICE_INTERFACE,
|
||||||
|
"ConnectProfile");
|
||||||
|
if (m == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
dbus_message_append_args(m, DBUS_TYPE_STRING, &profile_uuid, DBUS_TYPE_INVALID);
|
||||||
|
if (!dbus_connection_send(monitor->conn, m, NULL)) {
|
||||||
|
dbus_message_unref(m);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
dbus_message_unref(m);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void reconnect_device_profiles(struct spa_bt_monitor *monitor)
|
||||||
|
{
|
||||||
|
struct spa_bt_device *device;
|
||||||
|
|
||||||
|
/* Call org.bluez.Device1.ConnectProfile() on connected devices, it they have A2DP but the
|
||||||
|
* profile is not yet connected.
|
||||||
|
*/
|
||||||
|
|
||||||
|
spa_list_for_each(device, &monitor->device_list, link) {
|
||||||
|
if (device->connected) {
|
||||||
|
device_try_connect_profile(device, SPA_BT_PROFILE_A2DP_SINK, SPA_BT_UUID_A2DP_SINK);
|
||||||
|
device_try_connect_profile(device, SPA_BT_PROFILE_A2DP_SOURCE, SPA_BT_UUID_A2DP_SOURCE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct spa_bt_transport *spa_bt_transport_find(struct spa_bt_monitor *monitor, const char *path)
|
struct spa_bt_transport *spa_bt_transport_find(struct spa_bt_monitor *monitor, const char *path)
|
||||||
{
|
{
|
||||||
struct spa_bt_transport *t;
|
struct spa_bt_transport *t;
|
||||||
|
|
@ -1528,6 +1575,9 @@ static DBusHandlerResult object_manager_handler(DBusConnection *c, DBusMessage *
|
||||||
if (!dbus_connection_send(monitor->conn, r, NULL))
|
if (!dbus_connection_send(monitor->conn, r, NULL))
|
||||||
return DBUS_HANDLER_RESULT_NEED_MEMORY;
|
return DBUS_HANDLER_RESULT_NEED_MEMORY;
|
||||||
res = DBUS_HANDLER_RESULT_HANDLED;
|
res = DBUS_HANDLER_RESULT_HANDLED;
|
||||||
|
|
||||||
|
/* Reconnect A2DP profiles for existing connected devices */
|
||||||
|
reconnect_device_profiles(monitor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
res = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
res = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue