From c9f56593e37a27e68d2fdfb26b3a48043dd072cb Mon Sep 17 00:00:00 2001 From: João Paulo Rechi Vita Date: Mon, 21 Jul 2008 09:42:29 -0300 Subject: Adding dynamic bluetooth audio devices detection --- src/modules/module-bt-discover.c | 84 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/modules/module-bt-discover.c b/src/modules/module-bt-discover.c index 4f862f9c..f6a9736c 100644 --- a/src/modules/module-bt-discover.c +++ b/src/modules/module-bt-discover.c @@ -348,6 +348,69 @@ void detect_devices(adapter_t *adapter_list, pa_dbus_connection *conn) { } } +static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *userdata) { + DBusMessageIter arg_i; + DBusError err; + const char *value; + struct userdata *u; + + pa_assert(bus); + pa_assert(msg); + pa_assert(userdata); + u = userdata; + dbus_error_init(&err); + + pa_log("dbus: interface=%s, path=%s, member=%s\n", + dbus_message_get_interface(msg), + dbus_message_get_path(msg), + dbus_message_get_member(msg)); + + if (dbus_message_is_signal(msg, "org.bluez.Manager", "AdapterAdded")) { + if (!dbus_message_iter_init(msg, &arg_i)) + pa_log("dbus: message has no parameters"); + else if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_OBJECT_PATH) + pa_log("dbus: argument is not object path"); + else { + dbus_message_iter_get_basic(&arg_i, &value); + pa_log("hcid: adapter %s added", value); + } + } + else if (dbus_message_is_signal(msg, "org.bluez.Manager", "AdapterRemoved")) { + if (!dbus_message_iter_init(msg, &arg_i)) + pa_log("dbus: message has no parameters"); + else if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_OBJECT_PATH) + pa_log("dbus: argument is not object path"); + else { + dbus_message_iter_get_basic(&arg_i, &value); + pa_log("hcid: adapter %s removed", value); + } + } + else if (dbus_message_is_signal(msg, "org.bluez.Adapter", "DeviceCreated")) { + if (!dbus_message_iter_init(msg, &arg_i)) + pa_log("dbus: message has no parameters"); + else if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_OBJECT_PATH) + pa_log("dbus: argument is not object path"); + else { + dbus_message_iter_get_basic(&arg_i, &value); + pa_log("hcid: device %s created", value); + } + } + else if (dbus_message_is_signal(msg, "org.bluez.Adapter", "DeviceRemoved")) { + if (!dbus_message_iter_init(msg, &arg_i)) + pa_log("dbus: message has no parameters"); + else if (dbus_message_iter_get_arg_type(&arg_i) != DBUS_TYPE_OBJECT_PATH) + pa_log("dbus: argument is not object path"); + else { + dbus_message_iter_get_basic(&arg_i, &value); + pa_log("hcid: device %s removed", value); + } + } + +finish: + dbus_error_free(&err); + return DBUS_HANDLER_RESULT_HANDLED; +} + void pa__done(pa_module* m) { struct userdata *u; adapter_t *adapter_list_i, *adapter_list_next_i; @@ -418,7 +481,7 @@ int pa__init(pa_module* m) { goto fail; } - /* static detection of bluetooth devices */ + /* static detection of bluetooth audio devices */ u->adapter_list = adapter_new("/ADAPTER_HEAD"); detect_adapters(u->adapter_list, u->conn); detect_devices(u->adapter_list, u->conn); @@ -437,6 +500,25 @@ int pa__init(pa_module* m) { adapter_list_i = adapter_list_i->next; } + /* dynamic detection of bluetooth audio devices */ + if (!dbus_connection_add_filter(pa_dbus_connection_get(u->conn), filter_cb, u, NULL)) { + pa_log_error("Failed to add filter function"); + goto fail; + } + dbus_connection_flush(pa_dbus_connection_get(u->conn)); + dbus_bus_add_match(pa_dbus_connection_get(u->conn), "type='signal',interface='org.bluez.Manager'", &err); + dbus_connection_flush(pa_dbus_connection_get(u->conn)); + if (dbus_error_is_set(&err)) { + pa_log_error("Unable to subscribe to org.bluez.Manager signals: %s: %s", err.name, err.message); + goto fail; + } + dbus_bus_add_match(pa_dbus_connection_get(u->conn), "type='signal',interface='org.bluez.Adapter'", &err); + dbus_connection_flush(pa_dbus_connection_get(u->conn)); + if (dbus_error_is_set(&err)) { + pa_log_error("Unable to subscribe to org.bluez.Adapter signals: %s: %s", err.name, err.message); + goto fail; + } + return 0; fail: -- cgit