mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -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);
|
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) {
|
static struct uuid *uuid_new(const char *uuid) {
|
||||||
struct uuid *node;
|
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);
|
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) {
|
static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *userdata) {
|
||||||
DBusMessageIter arg_i;
|
DBusMessageIter arg_i;
|
||||||
DBusError err;
|
DBusError err;
|
||||||
|
|
@ -387,6 +412,7 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *
|
||||||
struct device *d;
|
struct device *d;
|
||||||
const char *profile;
|
const char *profile;
|
||||||
DBusMessageIter variant_i;
|
DBusMessageIter variant_i;
|
||||||
|
dbus_bool_t connected;
|
||||||
|
|
||||||
if (!dbus_message_iter_init(msg, &arg_i)) {
|
if (!dbus_message_iter_init(msg, &arg_i)) {
|
||||||
pa_log("dbus: message has no parameters");
|
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);
|
dbus_message_iter_get_basic(&arg_i, &value);
|
||||||
|
|
||||||
|
if (!pa_streq(value, "Connected"))
|
||||||
|
goto done;
|
||||||
|
|
||||||
if (!dbus_message_iter_next(&arg_i)) {
|
if (!dbus_message_iter_next(&arg_i)) {
|
||||||
pa_log("Property value missing");
|
pa_log("Property value missing");
|
||||||
goto done;
|
goto done;
|
||||||
|
|
@ -412,25 +441,29 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *msg, void *
|
||||||
|
|
||||||
dbus_message_iter_recurse(&arg_i, &variant_i);
|
dbus_message_iter_recurse(&arg_i, &variant_i);
|
||||||
|
|
||||||
if (dbus_message_iter_get_arg_type(&variant_i) == DBUS_TYPE_BOOLEAN) {
|
if (dbus_message_iter_get_arg_type(&variant_i) != DBUS_TYPE_BOOLEAN) {
|
||||||
dbus_bool_t connected;
|
pa_log("Property value not a boolean.");
|
||||||
dbus_message_iter_get_basic(&variant_i, &connected);
|
|
||||||
|
|
||||||
if (!pa_streq(value, "Connected") || !connected)
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(d = device_find(u, dbus_message_get_path(msg)))) {
|
dbus_message_iter_get_basic(&variant_i, &connected);
|
||||||
d = device_new(dbus_message_get_path(msg));
|
|
||||||
PA_LLIST_PREPEND(struct device, u->device_list, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dbus_message_is_signal(msg, "org.bluez.Headset", "PropertyChanged"))
|
if (dbus_message_is_signal(msg, "org.bluez.Headset", "PropertyChanged"))
|
||||||
profile = "hsp";
|
profile = "hsp";
|
||||||
else
|
else
|
||||||
profile = "a2dp";
|
profile = "a2dp";
|
||||||
|
|
||||||
|
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);
|
load_module_for_device(u, d, profile);
|
||||||
|
} else if (d)
|
||||||
|
unload_module_for_device(u, d, profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue