[pulseaudio-discuss] [PATCH 06/17] bluetooth: Implement transport acquire for hf_audio_agent transports

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Fri Sep 5 06:03:23 PDT 2014


On Fri, 2014-08-22 at 17:04 +0300, Luiz Augusto von Dentz wrote:
> From: João Paulo Rechi Vita <jprvita at openbossa.org>
> 
> ---
>  src/modules/bluetooth/backend-ofono.c | 66 ++++++++++++++++++++++++++++++++++-
>  1 file changed, 65 insertions(+), 1 deletion(-)
> 
> diff --git a/src/modules/bluetooth/backend-ofono.c b/src/modules/bluetooth/backend-ofono.c
> index 79765bb..5fb99de 100644
> --- a/src/modules/bluetooth/backend-ofono.c
> +++ b/src/modules/bluetooth/backend-ofono.c
> @@ -23,9 +23,13 @@
>  #include <config.h>
>  #endif
>  
> +#include <errno.h>
> +#include <poll.h>
> +
>  #include <pulsecore/core-util.h>
>  #include <pulsecore/dbus-shared.h>
>  #include <pulsecore/shared.h>
> +#include <pulsecore/core-error.h>
>  
>  #include "bluez5-util.h"
>  
> @@ -118,8 +122,68 @@ static void hf_audio_card_free(void *data) {
>      pa_xfree(card);
>  }
>  
> +static int socket_accept(int sock)
> +{
> +    char c;
> +    struct pollfd pfd;
> +
> +    if (sock < 0)
> +        return -ENOTCONN;
> +
> +    memset(&pfd, 0, sizeof(pfd));
> +    pfd.fd = sock;
> +    pfd.events = POLLOUT;
> +
> +    if (poll(&pfd, 1, 0) < 0)
> +        return -errno;
> +
> +    /* If socket already writable then it is not in defer setup state */

I think this "defer setup" thing needs to be explained somewhere. What
is it, why is it needed?

> +    if ((pfd.revents & POLLOUT))
> +        return 0;
> +
> +    /* Enable socket by reading 1 byte */
> +    if (read(sock, &c, 1) < 0)
> +        return -errno;
> +
> +    return 0;
> +}
> +
>  static int hf_audio_agent_transport_acquire(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) {
> -    return -1;
> +    pa_bluetooth_backend *backend = t->userdata;
> +    hf_audio_card *card;
> +    int err;
> +
> +    pa_assert(backend);
> +    pa_assert_se(card = pa_hashmap_get(backend->cards, t->path));

I think it would be good to set the transport userdata to point to the
hf_audio_card, and get the backend from the hf_audio_card object.

> +
> +    if (!optional) {
> +        DBusMessage *m;
> +
> +        pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.ofono.HandsfreeAudioCard", "Connect"));
> +        pa_assert_se(dbus_connection_send(pa_dbus_connection_get(backend->connection), m, NULL));
> +
> +        return -1;

I'd like to have a comment here explaining what !optional means and why
it's a good idea to send a Connect message and then return -1. Is this
some kind of an "asynchronous acquire" thing, i.e. the acquire operation
will complete once oFono calls NewConnection()? If Connect() returns an
error, do we need to care about that?

> +    }
> +
> +    /* The correct block size should take into account the SCO MTU from
> +     * the Bluetooth adapter and (for adapters in the USB bus) the MxPS
> +     * value from the Isoc USB endpoint in use by btusb and should be
> +     * made available to userspace by the Bluetooth kernel subsystem.
> +     * Meanwhile the empiric value 48 will be used. */

Do you know what downsides the hardcoding has? Those could be documented
here. Also, is the kernel bug tracked somewhere?

-- 
Tanu



More information about the pulseaudio-discuss mailing list