blob: 5bdc5f8dbc345510e244335eba806b349bf5d4e8 [file]
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2022 Intel Corporation. All rights reserved.
* Copyright 2023-2025 NXP
*
*/
#include <stdbool.h>
#include <inttypes.h>
#include "src/shared/bap-defs.h"
struct bt_bap;
struct bt_bap_pac;
struct bt_bap_stream;
typedef void (*bt_bap_ready_func_t)(struct bt_bap *bap, void *user_data);
typedef void (*bt_bap_destroy_func_t)(void *user_data);
typedef void (*bt_bap_debug_func_t)(const char *str, void *user_data);
typedef void (*bt_bap_pac_func_t)(struct bt_bap_pac *pac, void *user_data);
typedef bool (*bt_bap_pac_foreach_t)(struct bt_bap_pac *lpac,
struct bt_bap_pac *rpac,
void *user_data);
typedef void (*bt_bap_pac_select_t)(struct bt_bap_pac *pac, int err,
struct iovec *caps,
struct iovec *metadata,
struct bt_bap_qos *qos,
void *user_data);
typedef void (*bt_bap_pac_config_t)(struct bt_bap_stream *stream, int err);
typedef void (*bt_bap_state_func_t)(struct bt_bap_stream *stream,
uint8_t old_state, uint8_t new_state,
void *user_data);
typedef void (*bt_bap_connecting_func_t)(struct bt_bap_stream *stream,
bool state, int fd,
void *user_data);
typedef void (*bt_bap_stream_func_t)(struct bt_bap_stream *stream,
uint8_t code, uint8_t reason,
void *user_data);
typedef void (*bt_bap_func_t)(struct bt_bap *bap, void *user_data);
typedef void (*bt_bap_bis_func_t)(uint8_t sid, uint8_t bis, uint8_t sgrp,
struct iovec *caps, struct iovec *meta,
struct bt_bap_qos *qos, void *user_data);
typedef void (*bt_bap_bcode_reply_t)(void *user_data, int err);
typedef void (*bt_bap_bcode_func_t)(struct bt_bap_stream *stream,
bt_bap_bcode_reply_t reply, void *reply_data,
void *user_data);
extern struct bt_iso_qos bap_sink_pa_qos;
/* Local PAC related functions */
struct bt_bap_pac_qos {
uint8_t framing;
uint8_t phys;
uint8_t rtn;
uint16_t latency;
uint32_t pd_min;
uint32_t pd_max;
uint32_t ppd_min;
uint32_t ppd_max;
uint32_t location;
uint16_t supported_context;
uint16_t context;
};
struct bt_bap_pac_ops {
int (*select)(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
uint32_t chan_alloc, struct bt_bap_pac_qos *qos,
bt_bap_pac_select_t cb, void *cb_data, void *user_data);
void (*cancel_select)(struct bt_bap_pac *lpac,
bt_bap_pac_select_t cb, void *cb_data, void *user_data);
int (*config)(struct bt_bap_stream *stream, struct iovec *cfg,
struct bt_bap_qos *qos, bt_bap_pac_config_t cb,
void *user_data);
void (*clear)(struct bt_bap_stream *stream, void *user_data);
};
struct bt_bap_pac *bt_bap_add_vendor_pac_full(struct gatt_db *db,
const char *name, uint8_t type,
uint8_t id, uint16_t cid, uint16_t vid,
struct bt_bap_pac_qos *qos,
struct iovec *data,
struct iovec *metadata,
struct bt_bap_pac_ops *ops,
void *ops_user_data);
struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
const char *name, uint8_t type,
uint8_t id, uint16_t cid, uint16_t vid,
struct bt_bap_pac_qos *qos,
struct iovec *data,
struct iovec *metadata);
struct bt_bap_pac *bt_bap_add_pac(struct gatt_db *db, const char *name,
uint8_t type, uint8_t id,
struct bt_bap_pac_qos *qos,
struct iovec *data,
struct iovec *metadata);
bool bt_bap_pac_set_ops(struct bt_bap_pac *pac, struct bt_bap_pac_ops *ops,
void *user_data);
bool bt_bap_remove_pac(struct bt_bap_pac *pac);
uint8_t bt_bap_pac_get_type(struct bt_bap_pac *pac);
uint32_t bt_bap_pac_get_locations(struct bt_bap_pac *pac);
uint16_t bt_bap_pac_get_supported_context(struct bt_bap_pac *pac);
uint16_t bt_bap_pac_get_context(struct bt_bap_pac *pac);
struct bt_bap_pac_qos *bt_bap_pac_get_qos(struct bt_bap_pac *pac);
struct iovec *bt_bap_pac_get_data(struct bt_bap_pac *pac);
struct iovec *bt_bap_pac_get_metadata(struct bt_bap_pac *pac);
uint8_t bt_bap_stream_get_type(struct bt_bap_stream *stream);
struct bt_bap_stream *bt_bap_pac_get_stream(struct bt_bap_pac *pac);
/* Session related function */
unsigned int bt_bap_register(bt_bap_func_t added, bt_bap_func_t removed,
void *user_data);
bool bt_bap_unregister(unsigned int id);
struct bt_bap *bt_bap_new(struct gatt_db *ldb, struct gatt_db *rdb);
bool bt_bap_set_user_data(struct bt_bap *bap, void *user_data);
void *bt_bap_get_user_data(struct bt_bap *bap);
struct bt_att *bt_bap_get_att(struct bt_bap *bap);
struct gatt_db *bt_bap_get_db(struct bt_bap *bap, bool remote);
struct bt_bap *bt_bap_ref(struct bt_bap *bap);
void bt_bap_unref(struct bt_bap *bap);
bool bt_bap_attach(struct bt_bap *bap, struct bt_gatt_client *client);
bool bt_bap_attach_broadcast(struct bt_bap *bap);
void bt_bap_detach(struct bt_bap *bap);
bool bt_bap_set_debug(struct bt_bap *bap, bt_bap_debug_func_t cb,
void *user_data, bt_bap_destroy_func_t destroy);
unsigned int bt_bap_pac_register(struct bt_bap *bap, bt_bap_pac_func_t added,
bt_bap_pac_func_t removed, void *user_data,
bt_bap_destroy_func_t destroy);
bool bt_bap_pac_unregister(struct bt_bap *bap, unsigned int id);
unsigned int bt_bap_ready_register(struct bt_bap *bap,
bt_bap_ready_func_t func, void *user_data,
bt_bap_destroy_func_t destroy);
bool bt_bap_ready_unregister(struct bt_bap *bap, unsigned int id);
unsigned int bt_bap_state_register(struct bt_bap *bap,
bt_bap_state_func_t func,
bt_bap_connecting_func_t connecting,
void *user_data, bt_bap_destroy_func_t destroy);
bool bt_bap_state_unregister(struct bt_bap *bap, unsigned int id);
const char *bt_bap_stream_statestr(uint8_t state);
void bt_bap_foreach_pac(struct bt_bap *bap, uint8_t type,
bt_bap_pac_foreach_t func, void *user_data);
int bt_bap_pac_get_vendor_codec(struct bt_bap_pac *pac, uint8_t *id,
uint16_t *cid, uint16_t *vid,
struct iovec **data, struct iovec **metadata);
int bt_bap_pac_get_codec(struct bt_bap_pac *pac, uint8_t *id,
struct iovec **data, struct iovec **metadata);
void bt_bap_pac_set_user_data(struct bt_bap_pac *pac, void *user_data);
void *bt_bap_pac_get_user_data(struct bt_bap_pac *pac);
/* Stream related functions */
int bt_bap_select(struct bt_bap *bap,
struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
unsigned int max_channels, int *count,
bt_bap_pac_select_t func, void *user_data);
void bt_bap_cancel_select(struct bt_bap_pac *lpac, bt_bap_pac_select_t func,
void *user_data);
struct bt_bap_stream *bt_bap_stream_new(struct bt_bap *bap,
struct bt_bap_pac *lpac,
struct bt_bap_pac *rpac,
struct bt_bap_qos *pqos,
struct iovec *data);
void bt_bap_stream_lock(struct bt_bap_stream *stream);
void bt_bap_stream_unlock(struct bt_bap_stream *stream);
struct bt_bap *bt_bap_stream_get_session(struct bt_bap_stream *stream);
uint8_t bt_bap_stream_get_state(struct bt_bap_stream *stream);
bool bt_bap_stream_set_user_data(struct bt_bap_stream *stream, void *user_data);
void *bt_bap_stream_get_user_data(struct bt_bap_stream *stream);
unsigned int bt_bap_stream_config(struct bt_bap_stream *stream,
struct bt_bap_qos *pqos,
struct iovec *data,
bt_bap_stream_func_t func,
void *user_data);
unsigned int bt_bap_stream_qos(struct bt_bap_stream *stream,
struct bt_bap_qos *qos,
bt_bap_stream_func_t func,
void *user_data);
unsigned int bt_bap_stream_enable(struct bt_bap_stream *stream,
bool enable_links,
struct iovec *metadata,
bt_bap_stream_func_t func,
void *user_data);
unsigned int bt_bap_stream_start(struct bt_bap_stream *stream,
bt_bap_stream_func_t func,
void *user_data);
unsigned int bt_bap_stream_disable(struct bt_bap_stream *stream,
bool disable_links,
bt_bap_stream_func_t func,
void *user_data);
unsigned int bt_bap_stream_stop(struct bt_bap_stream *stream,
bt_bap_stream_func_t func,
void *user_data);
unsigned int bt_bap_stream_metadata(struct bt_bap_stream *stream,
struct iovec *metadata,
bt_bap_stream_func_t func,
void *user_data);
unsigned int bt_bap_stream_release(struct bt_bap_stream *stream,
bt_bap_stream_func_t func,
void *user_data);
uint8_t bt_bap_stream_get_dir(struct bt_bap_stream *stream);
uint32_t bt_bap_stream_get_location(struct bt_bap_stream *stream);
struct iovec *bt_bap_stream_get_config(struct bt_bap_stream *stream);
struct bt_bap_qos *bt_bap_stream_get_qos(struct bt_bap_stream *stream);
struct iovec *bt_bap_stream_get_metadata(struct bt_bap_stream *stream);
struct io *bt_bap_stream_get_io(struct bt_bap_stream *stream);
bool bt_bap_match_bcast_sink_stream(const void *data, const void *user_data);
bool bt_bap_stream_set_io(struct bt_bap_stream *stream, int fd);
int bt_bap_stream_cancel(struct bt_bap_stream *stream, unsigned int id);
int bt_bap_stream_io_link(struct bt_bap_stream *stream,
struct bt_bap_stream *link);
int bt_bap_stream_io_unlink(struct bt_bap_stream *stream,
struct bt_bap_stream *link);
struct queue *bt_bap_stream_io_get_links(struct bt_bap_stream *stream);
bool bt_bap_stream_io_get_qos(struct bt_bap_stream *stream,
struct bt_bap_qos **in,
struct bt_bap_qos **out);
uint8_t bt_bap_stream_io_dir(struct bt_bap_stream *stream);
int bt_bap_stream_io_connecting(struct bt_bap_stream *stream, int fd);
bool bt_bap_stream_io_is_connecting(struct bt_bap_stream *stream, int *fd);
bool bt_bap_new_bcast_source(struct bt_bap *bap, const char *name);
void bt_bap_update_bcast_source(struct bt_bap_pac *pac,
struct bt_bap_codec *codec,
struct iovec *data,
struct iovec *metadata);
bool bt_bap_pac_bcast_is_local(struct bt_bap *bap, struct bt_bap_pac *pac);
struct iovec *bt_bap_stream_get_base(struct bt_bap_stream *stream);
struct iovec *bt_bap_merge_caps(struct iovec *l2_caps, struct iovec *l3_caps);
void bt_bap_verify_bis(struct bt_bap *bap, uint8_t bis_index,
struct iovec *caps,
struct bt_bap_pac **lpac);
bool bt_bap_parse_base(uint8_t sid, struct iovec *base,
struct bt_bap_qos *qos,
util_debug_func_t func,
bt_bap_bis_func_t handler,
void *user_data);
unsigned int bt_bap_bis_cb_register(struct bt_bap *bap,
bt_bap_bis_func_t probe,
bt_bap_func_t remove,
void *user_data,
bt_bap_destroy_func_t destroy);
bool bt_bap_bis_cb_unregister(struct bt_bap *bap, unsigned int id);
void bt_bap_bis_probe(struct bt_bap *bap, uint8_t sid, uint8_t bis,
uint8_t sgrp, struct iovec *caps, struct iovec *meta,
struct bt_bap_qos *qos);
void bt_bap_bis_remove(struct bt_bap *bap);
void bt_bap_req_bcode(struct bt_bap_stream *stream,
bt_bap_bcode_reply_t reply,
void *reply_data);
unsigned int bt_bap_bcode_cb_register(struct bt_bap *bap,
bt_bap_bcode_func_t func,
void *user_data,
bt_bap_destroy_func_t destroy);
bool bt_bap_bcode_cb_unregister(struct bt_bap *bap, unsigned int id);
struct bt_bap *bt_bap_get_session(struct bt_att *att, struct gatt_db *db);
void bt_bap_iso_qos_to_bap_qos(struct bt_iso_qos *iso_qos,
struct bt_bap_qos *bap_qos);
void bt_bap_qos_to_iso_qos(struct bt_bap_qos *bap_qos,
struct bt_iso_qos *iso_qos);