mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-05 13:29:57 -05:00
Unload module-bluetooth-device if the remote device disconnects.
This commit is contained in:
parent
c8a963af02
commit
3d7b76d159
1 changed files with 44 additions and 11 deletions
|
|
@ -91,6 +91,16 @@ static void module_free(struct module *m) {
|
|||
pa_xfree(m);
|
||||
}
|
||||
|
||||
static struct module* module_find(struct device *d, const char *profile) {
|
||||
struct module *m;
|
||||
|
||||
for (m = d->module_list; d; d = d->next)
|
||||
if (pa_streq(m->profile, profile))
|
||||
return m;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct uuid *uuid_new(const char *uuid) {
|
||||
struct uuid *node;
|
||||
|
||||
|
|
@ -345,6 +355,21 @@ static void load_module_for_device(struct userdata *u, struct device *d, const c
|
|||
PA_LLIST_PREPEND(struct module, d->module_list, m);
|
||||
}
|
||||
|
||||
static void unload_module_for_device(struct userdata *u, struct device *d, const char *profile) {
|
||||
struct module *m;
|
||||
|
||||
pa_assert(u);
|
||||
pa_assert(d);
|
||||
|
||||
if (!(m = module_find(d, profile)))
|
||||
return;
|
||||
|
||||
pa_module_unload_request(m->pa_m, TRUE);
|
||||
|
||||
PA_LLIST_REMOVE(struct module, d->module_list, m);
|
||||
module_free(m);
|
||||
}
|
||||
|
||||
static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *userdata) {
|
||||
DBusMessageIter arg_i;
|
||||
DBusError err;
|
||||
|
|
@ -387,6 +412,7 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *
|
|||
struct device *d;
|
||||
const char *profile;
|
||||
DBusMessageIter variant_i;
|
||||
dbus_bool_t connected;
|
||||
|
||||
if (!dbus_message_iter_init(msg, &arg_i)) {
|
||||
pa_log("dbus: message has no parameters");
|
||||
|
|
@ -400,6 +426,9 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *
|
|||
|
||||
dbus_message_iter_get_basic(&arg_i, &value);
|
||||
|
||||
if (!pa_streq(value, "Connected"))
|
||||
goto done;
|
||||
|
||||
if (!dbus_message_iter_next(&arg_i)) {
|
||||
pa_log("Property value missing");
|
||||
goto done;
|
||||
|
|
@ -412,25 +441,29 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *
|
|||
|
||||
dbus_message_iter_recurse(&arg_i, &variant_i);
|
||||
|
||||
if (dbus_message_iter_get_arg_type(&variant_i) == DBUS_TYPE_BOOLEAN) {
|
||||
dbus_bool_t connected;
|
||||
dbus_message_iter_get_basic(&variant_i, &connected);
|
||||
|
||||
if (!pa_streq(value, "Connected") || !connected)
|
||||
goto done;
|
||||
if (dbus_message_iter_get_arg_type(&variant_i) != DBUS_TYPE_BOOLEAN) {
|
||||
pa_log("Property value not a boolean.");
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!(d = device_find(u, dbus_message_get_path(msg)))) {
|
||||
d = device_new(dbus_message_get_path(msg));
|
||||
PA_LLIST_PREPEND(struct device, u->device_list, d);
|
||||
}
|
||||
dbus_message_iter_get_basic(&variant_i, &connected);
|
||||
|
||||
if (dbus_message_is_signal(msg, "org.bluez.Headset", "PropertyChanged"))
|
||||
profile = "hsp";
|
||||
else
|
||||
profile = "a2dp";
|
||||
|
||||
load_module_for_device(u, d, profile);
|
||||
d = device_find(u, dbus_message_get_path(msg));
|
||||
|
||||
if (connected) {
|
||||
if (!d) {
|
||||
d = device_new(dbus_message_get_path(msg));
|
||||
PA_LLIST_PREPEND(struct device, u->device_list, d);
|
||||
}
|
||||
|
||||
load_module_for_device(u, d, profile);
|
||||
} else if (d)
|
||||
unload_module_for_device(u, d, profile);
|
||||
}
|
||||
|
||||
done:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue