nRF Connect SDK API 3.4.99
Loading...
Searching...
No Matches
bt_le_audio_tx.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5 */
6
15#ifndef _LE_AUDIO_TX_H_
16#define _LE_AUDIO_TX_H_
17
18#include <zephyr/net_buf.h>
19#include <zephyr/sys/atomic.h>
20#include <zephyr/bluetooth/audio/audio.h>
21#include <zephyr/bluetooth/audio/bap.h>
22#include <zephyr/bluetooth/audio/cap.h>
23
24#include "zbus_common.h"
25#include "le_audio.h"
26#include "audio_defines.h"
27
30 struct bt_cap_stream *cap_stream;
32};
33
35
36#define HCI_ISO_BUF_PER_CHAN 2
37
38#if defined(CONFIG_BT_ISO_MAX_CIG) && defined(CONFIG_BT_ISO_MAX_BIG)
39#define GROUP_MAX (CONFIG_BT_ISO_MAX_BIG + CONFIG_BT_ISO_MAX_CIG)
40#elif defined(CONFIG_BT_ISO_MAX_CIG)
41#define GROUP_MAX CONFIG_BT_ISO_MAX_CIG
42#elif defined(CONFIG_BT_ISO_MAX_BIG)
43#define GROUP_MAX CONFIG_BT_ISO_MAX_BIG
44#else
45#error Neither CIG nor BIG defined
46#endif
47
48#if (defined(CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT) && defined(CONFIG_BT_BAP_UNICAST))
49#define SUBGROUP_MAX (1 + CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT)
50#elif (defined(CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT) && !defined(CONFIG_BT_BAP_UNICAST))
51#define SUBGROUP_MAX CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT
52#else
53#define SUBGROUP_MAX 1
54#endif
55
56#define TX_STREAMS_MAX CONFIG_BT_ISO_MAX_CHAN
57
58#define TX_BUF_NUM (TX_STREAMS_MAX * HCI_ISO_BUF_PER_CHAN)
59
60struct tx_inf {
62 struct bt_iso_tx_info iso_tx;
63 struct bt_iso_tx_info iso_tx_readback;
66};
67
69 struct net_buf_pool *iso_tx_pool;
71 /* Estimated timestamp from the controller and validity */
74 /* Real timestamp from the controller */
76 /* Timestamp - when the last correction was applied */
78 /* Counter to track subsequent rapid corrections. Indicates an error state */
80 /* Correction between estimated and real timestamps */
81 int64_t corr_diff_us;
82 /* The previous "now" timestamp and validity */
83 uint32_t ts_last_us;
85 /* This device is Bluetooth clock master (central/unicast client or broadcast source) */
87 /* Status of the last submitted data */
89};
90
91#define BT_LE_AUDIO_TX_DEFINE(name) \
92 NET_BUF_POOL_FIXED_DEFINE(name##_cfg_buf, TX_BUF_NUM, \
93 BT_ISO_SDU_BUF_SIZE(CONFIG_BT_ISO_TX_MTU), \
94 CONFIG_BT_CONN_TX_USER_DATA_SIZE, NULL); \
95 static struct bt_le_audio_tx_ctx name##_ctx = { \
96 .iso_tx_pool = &name##_cfg_buf, \
97 }; \
98 static struct bt_le_audio_tx_ctx *name = &name##_ctx
99
100#define BT_LE_AUDIO_TX_DEFINE_INDEXED(name, group_idx, subgroup_idx) \
101 NET_BUF_POOL_FIXED_DEFINE(name##_##group_idx##_##subgroup_idx##_buf, TX_BUF_NUM, \
102 BT_ISO_SDU_BUF_SIZE(CONFIG_BT_ISO_TX_MTU), \
103 CONFIG_BT_CONN_TX_USER_DATA_SIZE, NULL); \
104 static struct bt_le_audio_tx_ctx name##_##group_idx##_##subgroup_idx##_ctx = { \
105 .iso_tx_pool = &name##_##group_idx##_##subgroup_idx##_buf, \
106 }; \
107 __unused static struct bt_le_audio_tx_ctx *name##_##group_idx##_##subgroup_idx = \
108 &name##_##group_idx##_##subgroup_idx##_ctx
109
146int bt_le_audio_tx_send(struct bt_le_audio_tx_ctx *ctx, struct net_buf const *const audio_frame,
147 struct le_audio_tx_info *tx, uint8_t num_tx);
148
160
177
194int bt_le_audio_tx_init(struct bt_le_audio_tx_ctx *ctx, bool is_clock_master);
195
202#endif /* _LE_AUDIO_TX_H_ */
Globally accessible audio related defines.
int bt_le_audio_tx_stream_started(struct bt_le_audio_tx_ctx *ctx, struct stream_index stream_idx)
Initializes per-stream TX bookkeeping when a stream enters streaming state.
int bt_le_audio_tx_send(struct bt_le_audio_tx_ctx *ctx, struct net_buf const *const audio_frame, struct le_audio_tx_info *tx, uint8_t num_tx)
Sends N channels of synchronized audio data to the controller.
int bt_le_audio_tx_stream_sent(struct bt_le_audio_tx_ctx *ctx, struct stream_index stream_idx)
Releases one outstanding TX pool allocation for the provided stream.
int bt_le_audio_tx_init(struct bt_le_audio_tx_ctx *ctx, bool is_clock_master)
Initializes the TX path context and shared ISO flush worker.
#define TX_STREAMS_MAX
Definition bt_le_audio_tx.h:56
bool is_ble_clock_master
Definition bt_le_audio_tx.h:86
struct net_buf_pool * iso_tx_pool
Definition bt_le_audio_tx.h:69
bool ts_ctlr_esti_us_valid
Definition bt_le_audio_tx.h:73
bool ts_last_us_valid
Definition bt_le_audio_tx.h:84
uint32_t ts_ctlr_real_us_last
Definition bt_le_audio_tx.h:75
uint32_t ts_last_us
Definition bt_le_audio_tx.h:83
uint32_t subsequent_rapid_corrections
Definition bt_le_audio_tx.h:79
uint32_t ts_ctlr_esti_us
Definition bt_le_audio_tx.h:72
int64_t corr_diff_us
Definition bt_le_audio_tx.h:81
enum tx_data_status last_data_status
Definition bt_le_audio_tx.h:88
uint32_t ts_last_correction
Definition bt_le_audio_tx.h:77
struct tx_inf tx_info_arr[CONFIG_BT_ISO_MAX_CHAN]
Definition bt_le_audio_tx.h:70
Definition bt_le_audio_tx.h:68
struct bt_cap_stream * cap_stream
Definition bt_le_audio_tx.h:30
struct stream_index idx
Definition bt_le_audio_tx.h:29
uint8_t audio_location
Definition bt_le_audio_tx.h:31
Definition bt_le_audio_tx.h:28
Stream index structure for identifying audio streams.
Definition le_audio.h:75
struct bt_iso_tx_info iso_tx
Definition bt_le_audio_tx.h:62
bool hci_wrn_printed
Definition bt_le_audio_tx.h:65
atomic_t iso_tx_pool_alloc
Definition bt_le_audio_tx.h:64
struct bt_iso_tx_info iso_tx_readback
Definition bt_le_audio_tx.h:63
uint16_t iso_conn_handle
Definition bt_le_audio_tx.h:61
Definition bt_le_audio_tx.h:60
tx_data_status
Definition zbus_common.h:52