diff options
| -rw-r--r-- | audio/manager.c | 58 | ||||
| -rw-r--r-- | audio/manager.h | 6 | 
2 files changed, 55 insertions, 9 deletions
| diff --git a/audio/manager.c b/audio/manager.c index a6a040fe..5a043f5e 100644 --- a/audio/manager.c +++ b/audio/manager.c @@ -50,6 +50,7 @@  #include <gdbus.h>  #include "glib-helper.h" +#include "../src/manager.h"  #include "../src/adapter.h"  #include "../src/device.h" @@ -684,12 +685,10 @@ static int audio_probe(struct btd_device *device, GSList *records)  	adapter_get_address(adapter, &src);  	device_get_address(device, &dst); -	dev = manager_find_device(&dst, NULL, FALSE); +	dev = manager_get_device(&src, &dst, path, NULL);  	if (!dev) { -		dev = device_register(connection, path, &src, &dst); -		if (!dev) -			return -EINVAL; -		devices = g_slist_append(devices, dev); +		debug("audio_probe: unable to get a device object"); +		return -1;  	}  	g_slist_foreach(records, (GFunc) handle_record, dev); @@ -1057,3 +1056,52 @@ struct audio_device *manager_find_device(const bdaddr_t *bda, const char *interf  	return NULL;  } + +struct audio_device *manager_get_device(bdaddr_t *src, bdaddr_t *dst, +					const char *path, gboolean *created) +{ +	struct audio_device *dev; + +	if (created) +		*created = FALSE; + +	dev = manager_find_device(dst, NULL, FALSE); +	if (dev) +		return dev; + +	if (!path) { +		struct btd_adapter *adapter; +		struct btd_device *device; +		char addr[18]; + +		ba2str(src, addr); + +		adapter = manager_find_adapter(src); +		if (!adapter) { +			error("Unable to get a btd_adapter object for %s", +					addr); +			return NULL; +		} + +		ba2str(dst, addr); + +		device = adapter_get_device(connection, adapter, addr); +		if (!device) { +			error("Unable to get btd_device object for %s", addr); +			return NULL; +		} + +		path = device_get_path(device); +	} + +	dev = device_register(connection, path, src, dst); +	if (!dev) +		return NULL; + +	devices = g_slist_append(devices, dev); + +	if (created) +		*created = TRUE; + +	return dev; +} diff --git a/audio/manager.h b/audio/manager.h index 708b52be..7feaf83c 100644 --- a/audio/manager.h +++ b/audio/manager.h @@ -30,8 +30,6 @@ struct enabled_interfaces {  	gboolean control;  }; -typedef void (*create_dev_cb_t) (struct audio_device *dev, void *user_data); -  int audio_manager_init(DBusConnection *conn, GKeyFile *config);  void audio_manager_exit(void); @@ -40,5 +38,5 @@ gboolean server_is_enabled(bdaddr_t *src, uint16_t svc);  struct audio_device *manager_find_device(const bdaddr_t *bda, const char *interface,  					gboolean connected); -gboolean manager_create_device(bdaddr_t *bda, create_dev_cb_t cb, -				void *user_data); +struct audio_device *manager_get_device(bdaddr_t *sba, bdaddr_t *dba, +					const char *path, gboolean *created); | 
