[pulseaudio-discuss] [RFC v0 3/5] bluetooth: Expose card profile availability
Mikel Astiz
mikel.astiz.oss at gmail.com
Wed Feb 13 05:48:14 PST 2013
From: Mikel Astiz <mikel.astiz at bmw-carit.de>
Use the transport's state to not only update the ports availability, but
also to update the card profile availability flag. The interpretation is
as follows:
- PA_PROFILE_AVAILABLE_UNKNOWN: BT profile is connected but no audio
- PA_PROFILE_AVAILABLE_NO: BT profile disconnected
- PA_PROFILE_AVAILABLE_YES: BT profile connected and audio streaming
---
src/modules/bluetooth/module-bluetooth-device.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 33b2afa..0eaa4e5 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1210,11 +1210,21 @@ static pa_port_available_t transport_state_to_availability_merged(pa_bluetooth_t
return PA_PORT_AVAILABLE_UNKNOWN;
}
+static pa_profile_available_t transport_state_to_profile_availability(pa_bluetooth_transport_state_t state) {
+ if (state == PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED)
+ return PA_PROFILE_AVAILABLE_NO;
+ else if (state >= PA_BLUETOOTH_TRANSPORT_STATE_PLAYING)
+ return PA_PROFILE_AVAILABLE_YES;
+ else
+ return PA_PROFILE_AVAILABLE_UNKNOWN;
+}
+
/* Run from main thread */
static void handle_transport_state_change(struct userdata *u, struct pa_bluetooth_transport *transport) {
bool acquire = false;
bool release = false;
enum profile profile;
+ pa_card_profile *cp;
pa_bluetooth_transport_state_t state;
pa_assert(u);
@@ -1223,9 +1233,13 @@ static void handle_transport_state_change(struct userdata *u, struct pa_bluetoot
profile = transport->profile;
state = transport->state;
- if (!pa_hashmap_get(u->card->profiles, pa_bt_profile_to_string(profile)))
+ /* Update profile availability */
+ if (!(cp = pa_hashmap_get(u->card->profiles, pa_bt_profile_to_string(profile))))
return;
+ pa_card_profile_set_available(cp, transport_state_to_profile_availability(state));
+
+ /* Update port availability */
switch (profile) {
case PROFILE_HFGW: {
pa_device_port *port;
@@ -1301,6 +1315,7 @@ static void handle_transport_state_change(struct userdata *u, struct pa_bluetoot
pa_assert_not_reached();
}
+ /* Acquire or release transport as needed */
if (acquire)
if (bt_transport_acquire(u, true) >= 0) {
if (u->source) {
--
1.8.1
More information about the pulseaudio-discuss
mailing list