From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx> 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; +}; + 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) { + 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; + + 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; +typedef struct pa_bluetooth_backend pa_bluetooth_backend; + +struct pa_bluetooth_backend { +}; + +int pa_bt_backend_register(pa_bluetooth_discovery *y, pa_bluetooth_backend *b, enum profile p, void *bp); +void pa_bt_backend_unregister(pa_bluetooth_discovery *y, pa_bluetooth_backend *b, enum profile p); + #endif -- 1.8.1.4