[pulseaudio-discuss] [RFC next v0 01/11] bluetooth: Add backend infrastructure with core->backend reporting

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Mon Jun 24 12:32:42 PDT 2013


On Wed, 2013-05-15 at 10:46 +0200, Mikel Astiz wrote:
> From: Mikel Astiz <mikel.astiz at bmw-carit.de>
> 
> Components other than BlueZ can also implement Bluetooth profiles and
> some infrastructure is required to keep the codebase cleanly split.
> ---
>  src/modules/bluetooth/bluetooth-util.c | 32 ++++++++++++++++++++++++++++++++
>  src/modules/bluetooth/bluetooth-util.h | 12 ++++++++++++
>  2 files changed, 44 insertions(+)
> 
> diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
> index 5924736..b8fe450 100644
> --- a/src/modules/bluetooth/bluetooth-util.c
> +++ b/src/modules/bluetooth/bluetooth-util.c
> @@ -91,6 +91,11 @@ typedef enum pa_bluez_version {
>      BLUEZ_VERSION_5,
>  } pa_bluez_version_t;
>  
> +struct profile_data {
> +    pa_bluetooth_backend *backend;
> +    void *backend_private;
> +};

Why isn't the private pointer part of pa_bluetooth_backend?

> +
>  struct pa_bluetooth_discovery {
>      PA_REFCNT_DECLARE;
>  
> @@ -101,6 +106,7 @@ struct pa_bluetooth_discovery {
>      bool adapters_listed;
>      pa_hashmap *devices;
>      pa_hashmap *transports;
> +    struct profile_data profiles[PA_BLUETOOTH_PROFILE_COUNT];
>      pa_hook hooks[PA_BLUETOOTH_HOOK_MAX];
>      bool filter_added;
>  };
> @@ -2281,3 +2287,29 @@ bool pa_bluetooth_uuid_has(pa_bluetooth_uuid *uuids, const char *uuid) {
>  
>      return false;
>  }
> +
> +int pa_bt_backend_register(pa_bluetooth_discovery *y, pa_bluetooth_backend *b, enum profile p, void *bp) {

The p and bp parameters seem redundant. I already asked about the
private pointer, but here's another similar question: why doesn't the
backend have a profile field?

> +    pa_assert(y);
> +    pa_assert(b);
> +
> +    if (y->profiles[p].backend) {
> +        pa_log_error("Bluetooth backend already exists for profile %s", pa_bt_profile_to_string(p));
> +        return -1;
> +    }
> +
> +    y->profiles[p].backend = b;
> +    y->profiles[p].backend_private = bp;
> +
> +    return 0;
> +}
> +
> +void pa_bt_backend_unregister(pa_bluetooth_discovery *y, pa_bluetooth_backend *b, enum profile p) {
> +    pa_assert(y);
> +    pa_assert(b);
> +
> +    if (y->profiles[p].backend != b)
> +        return;

Shouldn't this be an assertion?

> +
> +    y->profiles[p].backend = NULL;
> +    y->profiles[p].backend_private = NULL;
> +}
> diff --git a/src/modules/bluetooth/bluetooth-util.h b/src/modules/bluetooth/bluetooth-util.h
> index 3361b0f..969f489 100644
> --- a/src/modules/bluetooth/bluetooth-util.h
> +++ b/src/modules/bluetooth/bluetooth-util.h
> @@ -175,4 +175,16 @@ char *pa_bluetooth_cleanup_name(const char *name);
>  bool pa_bluetooth_uuid_has(pa_bluetooth_uuid *uuids, const char *uuid);
>  const char *pa_bt_profile_to_string(enum profile profile);
>  
> +/*
> + * Backend registration mechanism
> + */
> +struct pa_bluetooth_backend;

This line is redundant, given the typedef that follows.

-- 
Tanu



More information about the pulseaudio-discuss mailing list