diff options
Diffstat (limited to 'audio/manager.c')
-rw-r--r-- | audio/manager.c | 58 |
1 files changed, 53 insertions, 5 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; +} |