Bluetooth: audio: Enable auto ATT MTU Exchange for BASS and unicast client
This enables automatic MTU exchange for services that require MTU size bigger than default ATT MTU to operate. Signed-off-by: Mariusz Skamra <mariusz.skamra@codecoup.pl>
This commit is contained in:
parent
e9becda611
commit
6eafc64855
5 changed files with 24 additions and 87 deletions
|
@ -31,7 +31,6 @@ NET_BUF_POOL_FIXED_DEFINE(tx_pool, 1,
|
|||
static struct bt_audio_lc3_preset preset_16_2_1 = BT_AUDIO_LC3_UNICAST_PRESET_16_2_1;
|
||||
|
||||
static K_SEM_DEFINE(sem_connected, 0, 1);
|
||||
static K_SEM_DEFINE(sem_mtu_exchanged, 0, 1);
|
||||
static K_SEM_DEFINE(sem_sink_discovered, 0, 1);
|
||||
static K_SEM_DEFINE(sem_stream_configured, 0, 1);
|
||||
static K_SEM_DEFINE(sem_stream_qos, 0, 1);
|
||||
|
@ -334,17 +333,6 @@ static void discover_sink_cb(struct bt_conn *conn,
|
|||
k_sem_give(&sem_sink_discovered);
|
||||
}
|
||||
|
||||
static void gatt_mtu_cb(struct bt_conn *conn, uint8_t err,
|
||||
struct bt_gatt_exchange_params *params)
|
||||
{
|
||||
if (err != 0) {
|
||||
printk("Failed to exchange MTU (%u)\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
k_sem_give(&sem_mtu_exchanged);
|
||||
}
|
||||
|
||||
static void connected(struct bt_conn *conn, uint8_t err)
|
||||
{
|
||||
char addr[BT_ADDR_LE_STR_LEN];
|
||||
|
@ -424,28 +412,6 @@ static int scan_and_connect(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int exchange_mtu(void)
|
||||
{
|
||||
struct bt_gatt_exchange_params mtu_params = {
|
||||
.func = gatt_mtu_cb
|
||||
};
|
||||
int err;
|
||||
|
||||
err = bt_gatt_exchange_mtu(default_conn, &mtu_params);
|
||||
if (err != 0) {
|
||||
printk("Failed to exchange MTU %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = k_sem_take(&sem_mtu_exchanged, K_FOREVER);
|
||||
if (err != 0) {
|
||||
printk("failed to take sem_mtu_exchanged (err %d)\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int discover_sink(void)
|
||||
{
|
||||
static struct bt_audio_discover_params params;
|
||||
|
@ -579,13 +545,6 @@ void main(void)
|
|||
}
|
||||
printk("Connected\n");
|
||||
|
||||
printk("Initiating MTU exchange\n");
|
||||
err = exchange_mtu();
|
||||
if (err != 0) {
|
||||
return;
|
||||
}
|
||||
printk("MTU exchanged\n");
|
||||
|
||||
printk("Discovering sink\n");
|
||||
err = discover_sink();
|
||||
if (err != 0) {
|
||||
|
|
|
@ -32,6 +32,7 @@ config BT_AUDIO_UNICAST_CLIENT
|
|||
select BT_CENTRAL
|
||||
select BT_GATT_CLIENT
|
||||
select BT_GATT_AUTO_DISCOVER_CCC
|
||||
select BT_GATT_AUTO_UPDATE_MTU
|
||||
help
|
||||
This option enables support for Bluetooth Unicast Audio Client
|
||||
using Isochronous channels.
|
||||
|
|
|
@ -65,6 +65,7 @@ config BT_BASS_CLIENT
|
|||
select BT_ISO_SYNC_RECEIVER
|
||||
select BT_GATT_CLIENT
|
||||
select BT_GATT_AUTO_DISCOVER_CCC
|
||||
select BT_GATT_AUTO_UPDATE_MTU
|
||||
help
|
||||
This option enables support for the Broadcast Audio Scan Service
|
||||
client.
|
||||
|
|
|
@ -226,17 +226,6 @@ static struct bt_bass_client_cb bass_cbs = {
|
|||
.rem_src = bass_client_rem_src_cb,
|
||||
};
|
||||
|
||||
static void mtu_cb(struct bt_conn *conn, uint8_t err,
|
||||
struct bt_gatt_exchange_params *params)
|
||||
{
|
||||
if (err != 0) {
|
||||
FAIL("Failed to exchange MTU (%u)\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
g_mtu_exchanged = true;
|
||||
}
|
||||
|
||||
static void connected(struct bt_conn *conn, uint8_t err)
|
||||
{
|
||||
char addr[BT_ADDR_LE_STR_LEN];
|
||||
|
@ -258,6 +247,15 @@ static struct bt_conn_cb conn_callbacks = {
|
|||
.disconnected = disconnected,
|
||||
};
|
||||
|
||||
static void att_mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
|
||||
{
|
||||
g_mtu_exchanged = true;
|
||||
}
|
||||
|
||||
static struct bt_gatt_cb gatt_callbacks = {
|
||||
.att_mtu_updated = att_mtu_updated,
|
||||
};
|
||||
|
||||
static void sync_cb(struct bt_le_per_adv_sync *sync,
|
||||
struct bt_le_per_adv_sync_synced_info *info)
|
||||
{
|
||||
|
@ -310,18 +308,6 @@ static struct bt_le_per_adv_sync_cb sync_callbacks = {
|
|||
|
||||
static void test_exchange_mtu(void)
|
||||
{
|
||||
static struct bt_gatt_exchange_params mtu_params = {
|
||||
.func = mtu_cb,
|
||||
};
|
||||
int err;
|
||||
|
||||
printk("Exchanging MTU\n");
|
||||
err = bt_gatt_exchange_mtu(g_conn, &mtu_params);
|
||||
if (err != 0) {
|
||||
FAIL("Failed to exchange MTU %d\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
WAIT_FOR(g_mtu_exchanged);
|
||||
printk("MTU exchanged\n");
|
||||
}
|
||||
|
@ -495,6 +481,7 @@ static void test_main(void)
|
|||
}
|
||||
|
||||
bt_conn_cb_register(&conn_callbacks);
|
||||
bt_gatt_cb_register(&gatt_callbacks);
|
||||
bt_bass_client_register_cb(&bass_cbs);
|
||||
bt_le_per_adv_sync_cb_register(&sync_callbacks);
|
||||
|
||||
|
|
|
@ -153,18 +153,6 @@ static void discover_sink_cb(struct bt_conn *conn,
|
|||
}
|
||||
}
|
||||
|
||||
static void gatt_mtu_cb(struct bt_conn *conn, uint8_t err,
|
||||
struct bt_gatt_exchange_params *params)
|
||||
{
|
||||
if (err != 0) {
|
||||
FAIL("Failed to exchange MTU (%u)\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
printk("MTU exchanged\n");
|
||||
SET_FLAG(flag_mtu_exchanged);
|
||||
}
|
||||
|
||||
static void connected(struct bt_conn *conn, uint8_t err)
|
||||
{
|
||||
char addr[BT_ADDR_LE_STR_LEN];
|
||||
|
@ -188,6 +176,16 @@ BT_CONN_CB_DEFINE(conn_callbacks) = {
|
|||
.disconnected = disconnected,
|
||||
};
|
||||
|
||||
static void att_mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
|
||||
{
|
||||
printk("MTU exchanged\n");
|
||||
SET_FLAG(flag_mtu_exchanged);
|
||||
}
|
||||
|
||||
static struct bt_gatt_cb gatt_callbacks = {
|
||||
.att_mtu_updated = att_mtu_updated,
|
||||
};
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
int err;
|
||||
|
@ -201,6 +199,8 @@ static void init(void)
|
|||
for (size_t i = 0; i < ARRAY_SIZE(g_streams); i++) {
|
||||
g_streams[i].ops = &stream_ops;
|
||||
}
|
||||
|
||||
bt_gatt_cb_register(&gatt_callbacks);
|
||||
}
|
||||
|
||||
static void scan_and_connect(void)
|
||||
|
@ -219,17 +219,6 @@ static void scan_and_connect(void)
|
|||
|
||||
static void exchange_mtu(void)
|
||||
{
|
||||
struct bt_gatt_exchange_params mtu_params = {
|
||||
.func = gatt_mtu_cb
|
||||
};
|
||||
int err;
|
||||
|
||||
err = bt_gatt_exchange_mtu(default_conn, &mtu_params);
|
||||
if (err != 0) {
|
||||
FAIL("Failed to exchange MTU %d\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
WAIT_FOR_FLAG(flag_mtu_exchanged);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue