[pulseaudio-discuss] [RFC v2 06/15] bluetooth: Handle transports configured before UUID received
João Paulo Rechi Vita
jprvita at gmail.com
Wed Apr 17 10:00:59 PDT 2013
On Tue, Apr 16, 2013 at 10:40 AM, Mikel Astiz <mikel.astiz.oss at gmail.com> wrote:
> From: Mikel Astiz <mikel.astiz at bmw-carit.de>
>
> Now that the transport can be configured from some other process (i.e.
> oFono), there is no guarantee that the UUID from BlueZ will already have
> been received.
>
> This requires PulseAudio to assume that the UUID is actually supported
> by the device and that BlueZ will eventually propagate it.
oFono never calls EndpointSetConfiguration(), so I think we don't need
this patch.
> ---
> src/modules/bluetooth/bluetooth-util.c | 53 ++++++++++++++++++++++++++++++++++
> 1 file changed, 53 insertions(+)
>
> diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
> index eb504e5..f2de3c8 100644
> --- a/src/modules/bluetooth/bluetooth-util.c
> +++ b/src/modules/bluetooth/bluetooth-util.c
> @@ -140,6 +140,33 @@ static int profile_from_interface(const char *interface, enum profile *p) {
> return -1;
> }
>
> +static void profile_to_remote_uuid(enum profile p, const char *res[2]) {
> + pa_assert(p != PROFILE_OFF);
> +
> + switch(p) {
> + case PROFILE_A2DP:
> + res[0] = A2DP_SINK_UUID;
> + res[1] = NULL;
> + return;
> + case PROFILE_A2DP_SOURCE:
> + res[0] = A2DP_SOURCE_UUID;
> + res[1] = NULL;
> + return;
> + case PROFILE_HSP:
> + res[0] = HSP_HS_UUID;
> + res[1] = HFP_HS_UUID;
> + return;
> + case PROFILE_HFGW:
> + res[0] = HSP_AG_UUID;
> + res[1] = HFP_AG_UUID;
> + return;
> + case PROFILE_OFF:
> + break;
> + }
> +
> + pa_assert_not_reached();
> +}
> +
> static pa_bluetooth_transport_state_t audio_state_to_transport_state(pa_bt_audio_state_t state) {
> switch (state) {
> case PA_BT_AUDIO_STATE_INVALID: /* Typically if state hasn't been received yet */
> @@ -1526,6 +1553,7 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage
> DBusMessageIter args, props;
> DBusMessage *r;
> bool old_any_connected;
> + const char *remote_uuid[2];
>
> if (!dbus_message_iter_init(m, &args) || !pa_streq(dbus_message_get_signature(m), "oa{sv}")) {
> pa_log("Invalid signature for method SetConfiguration");
> @@ -1588,6 +1616,10 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage
> dbus_message_iter_next(&props);
> }
>
> + /* FIXME: with BlueZ 5, check if this is racy in case a newly paired
> + * device gets connected very fast, before BlueZ has created it. This is
> + * very unlikely since the device will be created before the pairing
> + * procedure is complete */
> d = found_device(y, dev_path);
> if (!d)
> goto fail;
> @@ -1601,6 +1633,27 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage
> else
> p = PROFILE_A2DP_SOURCE;
>
> + /* Check if the UUID was already reported by BlueZ, since the telephony
> + * component (oFono) could be faster than BlueZ */
> + profile_to_remote_uuid(p, remote_uuid);
> +
> + if (!pa_bluetooth_uuid_has(d->uuids, remote_uuid[0]) && !pa_bluetooth_uuid_has(d->uuids, remote_uuid[1])) {
> + pa_bluetooth_uuid *node;
> + struct pa_bluetooth_hook_uuid_data uuiddata;
> +
> + pa_log_info("Endpoint with UUID '%s' configured before remote UUID was reported by BlueZ.", uuid);
> +
> + /* This might generate duplicated UUID_ADDED hooks since the endpoint
> + * doesn't receive the exact remote UUID (HSP cannot be distinguished
> + * from HFP). However, these duplicated hooks should do no harm */
> + node = uuid_new(remote_uuid[0]);
> + PA_LLIST_PREPEND(pa_bluetooth_uuid, d->uuids, node);
> +
> + uuiddata.device = d;
> + uuiddata.uuid = uuid;
> + pa_hook_fire(&d->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_UUID_ADDED], &uuiddata);
> + }
> +
> if (d->transports[p] != NULL) {
> pa_log("Cannot configure transport %s because profile %d is already used", path, p);
> goto fail2;
> --
> 1.8.1.4
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
--
João Paulo Rechi Vita
http://about.me/jprvita
More information about the pulseaudio-discuss
mailing list