[pulseaudio-discuss] [PATCH v2 2/5] bluetooth: Add "any_audio_profile_connected" field to pa_bluetooth_device.
Tanu Kaskinen
tanuk at iki.fi
Tue Nov 20 06:48:10 PST 2012
The new field makes it easier to check whether any audio profiles are
connected. That information is needed by the discovery module for
deciding whether a new device module should be loaded. The device
module should use this information too to unload itself at the right
time, but that's currently not implemented.
---
src/modules/bluetooth/bluetooth-util.c | 36 +++++++++++++++++++++
src/modules/bluetooth/bluetooth-util.h | 2 ++
src/modules/bluetooth/module-bluetooth-discover.c | 6 +---
3 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 06b4348..19b44dd 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -133,6 +133,7 @@ static pa_bluetooth_device* device_new(const char *path) {
d->audio_source_state = PA_BT_AUDIO_STATE_INVALID;
d->headset_state = PA_BT_AUDIO_STATE_INVALID;
d->hfgw_state = PA_BT_AUDIO_STATE_INVALID;
+ d->any_audio_profile_connected = false;
for (i = 0; i < PA_BLUETOOTH_DEVICE_HOOK_MAX; i++)
pa_hook_init(&d->hooks[i], d);
@@ -495,6 +496,26 @@ static pa_bluetooth_device *found_device(pa_bluetooth_discovery *y, const char*
return d;
}
+static void device_update_any_audio_profile_connected(pa_bluetooth_device *d) {
+ bool old;
+
+ pa_assert(d);
+
+ old = d->any_audio_profile_connected;
+ d->any_audio_profile_connected = d->audio_sink_state >= PA_BT_AUDIO_STATE_CONNECTED ||
+ d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED ||
+ d->headset_state >= PA_BT_AUDIO_STATE_CONNECTED ||
+ d->hfgw_state >= PA_BT_AUDIO_STATE_CONNECTED;
+
+ if (d->any_audio_profile_connected == old)
+ return;
+
+ if (d->any_audio_profile_connected)
+ pa_log_debug("Device %s has now at least one audio profile connected.", d->path);
+ else
+ pa_log_debug("Device %s doesn't have any audio profiles connected anymore.", d->path);
+}
+
static void get_properties_reply(DBusPendingCall *pending, void *userdata) {
DBusMessage *r;
DBusMessageIter arg_i, element_i;
@@ -572,18 +593,25 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) {
if (parse_audio_property(y, &d->headset_state, &dict_i) < 0)
goto finish;
+ device_update_any_audio_profile_connected(d);
+
} else if (dbus_message_has_interface(p->message, "org.bluez.AudioSink")) {
if (parse_audio_property(y, &d->audio_sink_state, &dict_i) < 0)
goto finish;
+ device_update_any_audio_profile_connected(d);
+
} else if (dbus_message_has_interface(p->message, "org.bluez.AudioSource")) {
if (parse_audio_property(y, &d->audio_source_state, &dict_i) < 0)
goto finish;
+ device_update_any_audio_profile_connected(d);
+
} else if (dbus_message_has_interface(p->message, "org.bluez.HandsfreeGateway")) {
if (parse_audio_property(y, &d->hfgw_state, &dict_i) < 0)
goto finish;
+ device_update_any_audio_profile_connected(d);
}
}
@@ -840,17 +868,25 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
if (parse_audio_property(y, &d->headset_state, &arg_i) < 0)
goto fail;
+ device_update_any_audio_profile_connected(d);
+
} else if (dbus_message_has_interface(m, "org.bluez.AudioSink")) {
if (parse_audio_property(y, &d->audio_sink_state, &arg_i) < 0)
goto fail;
+ device_update_any_audio_profile_connected(d);
+
} else if (dbus_message_has_interface(m, "org.bluez.AudioSource")) {
if (parse_audio_property(y, &d->audio_source_state, &arg_i) < 0)
goto fail;
+ device_update_any_audio_profile_connected(d);
+
} else if (dbus_message_has_interface(m, "org.bluez.HandsfreeGateway")) {
if (parse_audio_property(y, &d->hfgw_state, &arg_i) < 0)
goto fail;
+
+ device_update_any_audio_profile_connected(d);
}
run_callback(y, d, FALSE);
diff --git a/src/modules/bluetooth/bluetooth-util.h b/src/modules/bluetooth/bluetooth-util.h
index 3846498..41cb890 100644
--- a/src/modules/bluetooth/bluetooth-util.h
+++ b/src/modules/bluetooth/bluetooth-util.h
@@ -126,6 +126,8 @@ struct pa_bluetooth_device {
/* HandsfreeGateway state */
pa_bt_audio_state_t hfgw_state;
+ bool any_audio_profile_connected;
+
pa_hook hooks[PA_BLUETOOTH_DEVICE_HOOK_MAX];
};
diff --git a/src/modules/bluetooth/module-bluetooth-discover.c b/src/modules/bluetooth/module-bluetooth-discover.c
index 8d64834..58335e2 100644
--- a/src/modules/bluetooth/module-bluetooth-discover.c
+++ b/src/modules/bluetooth/module-bluetooth-discover.c
@@ -74,11 +74,7 @@ static pa_hook_result_t load_module_for_device(pa_bluetooth_discovery *y, const
mi = pa_hashmap_get(u->hashmap, d->path);
- if (!d->dead &&
- (d->audio_sink_state >= PA_BT_AUDIO_STATE_CONNECTED ||
- d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED ||
- d->headset_state >= PA_BT_AUDIO_STATE_CONNECTED ||
- d->hfgw_state >= PA_BT_AUDIO_STATE_CONNECTED)) {
+ if (!d->dead && d->any_audio_profile_connected) {
if (!mi) {
pa_module *m = NULL;
--
1.7.10.4
More information about the pulseaudio-discuss
mailing list