summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/device.c60
1 files changed, 58 insertions, 2 deletions
diff --git a/audio/device.c b/audio/device.c
index 450b2afe..87ddf5b7 100644
--- a/audio/device.c
+++ b/audio/device.c
@@ -135,12 +135,67 @@ static void device_unregister(DBusConnection *conn, void *data)
device_free(device);
}
+char *find_adapter(DBusConnection *conn, bdaddr_t *src)
+{
+ DBusMessage *msg, *reply;
+ DBusError derr;
+ char address[18], *addr_ptr = address;
+ char *path, *ret;
+
+ msg = dbus_message_new_method_call("org.bluez", "/org/bluez",
+ "org.bluez.Manager",
+ "FindAdapter");
+ if (!msg) {
+ error("Unable to allocate new method call");
+ return NULL;
+ }
+
+ ba2str(src, address);
+
+ dbus_message_append_args(msg, DBUS_TYPE_STRING, &addr_ptr,
+ DBUS_TYPE_INVALID);
+
+ dbus_error_init(&derr);
+ reply = dbus_connection_send_with_reply_and_block(conn, msg, -1,
+ &derr);
+
+ dbus_message_unref(msg);
+
+ if (dbus_error_is_set(&derr) ||
+ dbus_set_error_from_message(&derr, reply)) {
+ error("FindAdapter(%s) failed: %s", address, derr.message);
+ dbus_error_free(&derr);
+ return NULL;
+ }
+
+ dbus_error_init(&derr);
+ dbus_message_get_args(reply, &derr,
+ DBUS_TYPE_STRING, &path,
+ DBUS_TYPE_INVALID);
+
+ if (dbus_error_is_set(&derr)) {
+ error("Unable to get message args");
+ dbus_message_unref(reply);
+ dbus_error_free(&derr);
+ return FALSE;
+ }
+
+ ret = g_strdup(path);
+
+ dbus_message_unref(reply);
+
+ debug("Got path %s for adapter with address %s", ret, address);
+
+ return ret;
+}
+
struct device *device_register(DBusConnection *conn,
const char *path, bdaddr_t *bda)
{
struct device *dev;
bdaddr_t src;
int dev_id;
+ char *adapter_path;
if (!conn || !path)
return NULL;
@@ -150,6 +205,8 @@ struct device *device_register(DBusConnection *conn,
if ((dev_id < 0) || (hci_devba(dev_id, &src) < 0))
return NULL;
+ adapter_path = find_adapter(conn, &src);
+
dev = g_new0(struct device, 1);
if (!dbus_connection_create_object_path(conn, path, dev,
@@ -171,8 +228,7 @@ struct device *device_register(DBusConnection *conn,
bacpy(&dev->dst, bda);
bacpy(&dev->src, &src);
dev->conn = dbus_connection_ref(conn);
- dev->adapter_path = g_malloc0(16);
- snprintf(dev->adapter_path, 16, "/org/bluez/hci%d", dev_id);
+ dev->adapter_path = adapter_path;
return dev;
}