mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 *t;
 | 
			
		||||
| 
						 | 
				
			
			@ -1528,6 +1575,9 @@ static DBusHandlerResult object_manager_handler(DBusConnection *c, DBusMessage *
 | 
			
		|||
		if (!dbus_connection_send(monitor->conn, r, NULL))
 | 
			
		||||
			return DBUS_HANDLER_RESULT_NEED_MEMORY;
 | 
			
		||||
		res = DBUS_HANDLER_RESULT_HANDLED;
 | 
			
		||||
 | 
			
		||||
		/* Reconnect A2DP profiles for existing connected devices */
 | 
			
		||||
		reconnect_device_profiles(monitor);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		res = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue