Skip to content

Commit 7ef2f81

Browse files
Thalleyaescolar
authored andcommitted
Bluetooth: Audio: Add helpers for assisted listening stream
Added helper functions to set and get assisted listening stream values for codec capabilities and codec configs. Signed-off-by: Emil Gydesen <[email protected]>
1 parent b9ef11d commit 7ef2f81

File tree

4 files changed

+239
-8
lines changed

4 files changed

+239
-8
lines changed

doc/releases/release-notes-4.0.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,14 @@ Bluetooth
9191

9292
* :c:func:`bt_tbs_client_register_cb` now supports multiple listeners and may now return an error.
9393

94+
* Added APIs for getting and setting the assisted listening stream values in codec capabilities
95+
and codec configuration:
96+
97+
* :c:func:`bt_audio_codec_cfg_meta_get_assisted_listening_stream`
98+
* :c:func:`bt_audio_codec_cfg_meta_set_assisted_listening_stream`
99+
* :c:func:`bt_audio_codec_cap_meta_get_assisted_listening_stream`
100+
* :c:func:`bt_audio_codec_cap_meta_set_assisted_listening_stream`
101+
94102
* Host
95103

96104
* Added API :c:func:`bt_gatt_get_uatt_mtu` to get current Unenhanced ATT MTU of a given

include/zephyr/bluetooth/audio/audio.h

Lines changed: 77 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,12 @@ enum bt_audio_active_state {
419419
BT_AUDIO_ACTIVE_STATE_ENABLED = 0x01,
420420
};
421421

422+
/** Assisted Listening Stream defined by the Generic Audio assigned numbers (bluetooth.com). */
423+
enum bt_audio_assisted_listening_stream {
424+
/** Unspecified audio enhancement */
425+
BT_AUDIO_ASSISTED_LISTENING_STREAM_UNSPECIFIED = 0x00,
426+
};
427+
422428
/**
423429
* @brief Codec metadata type IDs
424430
*
@@ -435,7 +441,7 @@ enum bt_audio_metadata_type {
435441
*
436442
* See the BT_AUDIO_CONTEXT_* for valid values.
437443
*/
438-
BT_AUDIO_METADATA_TYPE_PREF_CONTEXT = 0x01,
444+
BT_AUDIO_METADATA_TYPE_PREF_CONTEXT = 0x01,
439445

440446
/**
441447
* @brief Streaming audio context.
@@ -447,42 +453,49 @@ enum bt_audio_metadata_type {
447453
*
448454
* See the BT_AUDIO_CONTEXT_* for valid values.
449455
*/
450-
BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT = 0x02,
456+
BT_AUDIO_METADATA_TYPE_STREAM_CONTEXT = 0x02,
451457

452458
/** UTF-8 encoded title or summary of stream content */
453-
BT_AUDIO_METADATA_TYPE_PROGRAM_INFO = 0x03,
459+
BT_AUDIO_METADATA_TYPE_PROGRAM_INFO = 0x03,
454460

455461
/**
456462
* @brief Language
457463
*
458464
* 3 octet lower case language code defined by ISO 639-3
459465
* Possible values can be found at https://iso639-3.sil.org/code_tables/639/data
460466
*/
461-
BT_AUDIO_METADATA_TYPE_LANG = 0x04,
467+
BT_AUDIO_METADATA_TYPE_LANG = 0x04,
462468

463469
/** Array of 8-bit CCID values */
464-
BT_AUDIO_METADATA_TYPE_CCID_LIST = 0x05,
470+
BT_AUDIO_METADATA_TYPE_CCID_LIST = 0x05,
465471

466472
/**
467473
* @brief Parental rating
468474
*
469475
* See @ref bt_audio_parental_rating for valid values.
470476
*/
471-
BT_AUDIO_METADATA_TYPE_PARENTAL_RATING = 0x06,
477+
BT_AUDIO_METADATA_TYPE_PARENTAL_RATING = 0x06,
472478

473479
/** UTF-8 encoded URI for additional Program information */
474-
BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI = 0x07,
480+
BT_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI = 0x07,
475481

476482
/**
477483
* @brief Audio active state
478484
*
479485
* See @ref bt_audio_active_state for valid values.
480486
*/
481-
BT_AUDIO_METADATA_TYPE_AUDIO_STATE = 0x08,
487+
BT_AUDIO_METADATA_TYPE_AUDIO_STATE = 0x08,
482488

483489
/** Broadcast Audio Immediate Rendering flag */
484490
BT_AUDIO_METADATA_TYPE_BROADCAST_IMMEDIATE = 0x09,
485491

492+
/**
493+
* @brief Assisted listening stream
494+
*
495+
* See @ref bt_audio_assisted_listening_stream for valid values.
496+
*/
497+
BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM = 0x0A,
498+
486499
/** Extended metadata */
487500
BT_AUDIO_METADATA_TYPE_EXTENDED = 0xFE,
488501

@@ -1581,6 +1594,34 @@ int bt_audio_codec_cfg_meta_get_bcast_audio_immediate_rend_flag(
15811594
int bt_audio_codec_cfg_meta_set_bcast_audio_immediate_rend_flag(
15821595
struct bt_audio_codec_cfg *codec_cfg);
15831596

1597+
/**
1598+
* @brief Extract assisted listening stream
1599+
*
1600+
* See @ref BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM for more information about this value.
1601+
*
1602+
* @param codec_cfg The codec data to search in.
1603+
*
1604+
* @retval value The assisted listening stream value if positive or 0
1605+
* @retval -EINVAL if arguments are invalid
1606+
* @retval -ENODATA if not found
1607+
* @retval -EBADMSG if found value has invalid size
1608+
*/
1609+
int bt_audio_codec_cfg_meta_get_assisted_listening_stream(
1610+
const struct bt_audio_codec_cfg *codec_cfg);
1611+
1612+
/**
1613+
* @brief Set the assisted listening stream value of a codec configuration metadata.
1614+
*
1615+
* @param codec_cfg The codec configuration to set data for.
1616+
* @param val The assisted listening stream value to set.
1617+
*
1618+
* @retval length The data_len of @p codec_cap on success
1619+
* @retval -EINVAL if arguments are invalid
1620+
* @retval -ENOMEM if the new value could not set or added due to memory
1621+
*/
1622+
int bt_audio_codec_cfg_meta_set_assisted_listening_stream(
1623+
struct bt_audio_codec_cfg *codec_cfg, enum bt_audio_assisted_listening_stream val);
1624+
15841625
/**
15851626
* @brief Extract extended metadata
15861627
*
@@ -2124,6 +2165,34 @@ int bt_audio_codec_cap_meta_get_bcast_audio_immediate_rend_flag(
21242165
int bt_audio_codec_cap_meta_set_bcast_audio_immediate_rend_flag(
21252166
struct bt_audio_codec_cap *codec_cap);
21262167

2168+
/**
2169+
* @brief Extract assisted listening stream
2170+
*
2171+
* See @ref BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM for more information about this value.
2172+
*
2173+
* @param codec_cap The codec data to search in.
2174+
*
2175+
* @retval value The assisted listening stream value if positive or 0
2176+
* @retval -EINVAL if arguments are invalid
2177+
* @retval -ENODATA if not found
2178+
* @retval -EBADMSG if found value has invalid size
2179+
*/
2180+
int bt_audio_codec_cap_meta_get_assisted_listening_stream(
2181+
const struct bt_audio_codec_cap *codec_cap);
2182+
2183+
/**
2184+
* @brief Set the assisted listening stream value of a codec capability metadata.
2185+
*
2186+
* @param codec_cap The codec capability to set data for.
2187+
* @param val The assisted listening stream value to set.
2188+
*
2189+
* @retval length The data_len of @p codec_cap on success
2190+
* @retval -EINVAL if arguments are invalid
2191+
* @retval -ENOMEM if the new value could not set or added due to memory
2192+
*/
2193+
int bt_audio_codec_cap_meta_set_assisted_listening_stream(
2194+
struct bt_audio_codec_cap *codec_cap, enum bt_audio_assisted_listening_stream val);
2195+
21272196
/**
21282197
* @brief Extract extended metadata
21292198
*

subsys/bluetooth/audio/codec.c

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,52 @@ static int codec_meta_set_bcast_audio_immediate_rend_flag(uint8_t meta[], size_t
10561056
BT_AUDIO_METADATA_TYPE_BROADCAST_IMMEDIATE, NULL, 0);
10571057
}
10581058

1059+
static int codec_meta_get_assisted_listening_stream(const uint8_t meta[], size_t meta_len)
1060+
{
1061+
const uint8_t *data;
1062+
int ret;
1063+
1064+
CHECKIF(meta == NULL) {
1065+
LOG_DBG("meta is NULL");
1066+
return -EINVAL;
1067+
}
1068+
1069+
ret = codec_meta_get_val(meta, meta_len, BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM,
1070+
&data);
1071+
if (data == NULL) {
1072+
return -ENODATA;
1073+
}
1074+
1075+
if (ret != sizeof(uint8_t)) {
1076+
return -EBADMSG;
1077+
}
1078+
1079+
return data[0];
1080+
}
1081+
1082+
static int codec_meta_set_assisted_listening_stream(uint8_t meta[], size_t meta_len,
1083+
size_t meta_size,
1084+
enum bt_audio_assisted_listening_stream val)
1085+
{
1086+
uint8_t val_u8;
1087+
1088+
CHECKIF(meta == NULL) {
1089+
LOG_DBG("meta is NULL");
1090+
return -EINVAL;
1091+
}
1092+
1093+
if (val != BT_AUDIO_ASSISTED_LISTENING_STREAM_UNSPECIFIED) {
1094+
LOG_DBG("Invalid value: %d", val);
1095+
return -EINVAL;
1096+
}
1097+
1098+
val_u8 = (uint8_t)val;
1099+
1100+
return codec_meta_set_val(meta, meta_len, meta_size,
1101+
BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM, &val_u8,
1102+
sizeof(val_u8));
1103+
}
1104+
10591105
static int codec_meta_get_extended(const uint8_t meta[], size_t meta_len,
10601106
const uint8_t **extended_meta)
10611107
{
@@ -1426,6 +1472,31 @@ int bt_audio_codec_cfg_meta_set_bcast_audio_immediate_rend_flag(
14261472
return ret;
14271473
}
14281474

1475+
int bt_audio_codec_cfg_meta_get_assisted_listening_stream(
1476+
const struct bt_audio_codec_cfg *codec_cfg)
1477+
{
1478+
CHECKIF(codec_cfg == NULL) {
1479+
LOG_DBG("codec_cfg is NULL");
1480+
return -EINVAL;
1481+
}
1482+
1483+
return codec_meta_get_assisted_listening_stream(codec_cfg->meta, codec_cfg->meta_len);
1484+
}
1485+
1486+
int bt_audio_codec_cfg_meta_set_assisted_listening_stream(
1487+
struct bt_audio_codec_cfg *codec_cfg, enum bt_audio_assisted_listening_stream val)
1488+
{
1489+
int ret;
1490+
1491+
ret = codec_meta_set_assisted_listening_stream(codec_cfg->meta, codec_cfg->meta_len,
1492+
ARRAY_SIZE(codec_cfg->meta), val);
1493+
if (ret >= 0) {
1494+
codec_cfg->meta_len = ret;
1495+
}
1496+
1497+
return ret;
1498+
}
1499+
14291500
int bt_audio_codec_cfg_meta_get_extended(const struct bt_audio_codec_cfg *codec_cfg,
14301501
const uint8_t **extended_meta)
14311502
{
@@ -1754,6 +1825,31 @@ int bt_audio_codec_cap_meta_set_bcast_audio_immediate_rend_flag(
17541825
return ret;
17551826
}
17561827

1828+
int bt_audio_codec_cap_meta_get_assisted_listening_stream(
1829+
const struct bt_audio_codec_cap *codec_cap)
1830+
{
1831+
CHECKIF(codec_cap == NULL) {
1832+
LOG_DBG("codec_cap is NULL");
1833+
return -EINVAL;
1834+
}
1835+
1836+
return codec_meta_get_assisted_listening_stream(codec_cap->meta, codec_cap->meta_len);
1837+
}
1838+
1839+
int bt_audio_codec_cap_meta_set_assisted_listening_stream(
1840+
struct bt_audio_codec_cap *codec_cap, enum bt_audio_assisted_listening_stream val)
1841+
{
1842+
int ret;
1843+
1844+
ret = codec_meta_set_assisted_listening_stream(codec_cap->meta, codec_cap->meta_len,
1845+
ARRAY_SIZE(codec_cap->meta), val);
1846+
if (ret >= 0) {
1847+
codec_cap->meta_len = ret;
1848+
}
1849+
1850+
return ret;
1851+
}
1852+
17571853
int bt_audio_codec_cap_meta_get_extended(const struct bt_audio_codec_cap *codec_cap,
17581854
const uint8_t **extended_meta)
17591855
{

tests/bluetooth/audio/codec/src/main.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,35 @@ ZTEST(audio_codec_test_suite, test_bt_audio_codec_cfg_meta_set_bcast_audio_immed
930930
zassert_equal(ret, 0, "Unexpected return value %d", ret);
931931
}
932932

933+
ZTEST(audio_codec_test_suite, test_bt_audio_codec_cfg_meta_get_assisted_listening_stream)
934+
{
935+
const struct bt_audio_codec_cfg codec_cfg = BT_AUDIO_CODEC_CFG(
936+
BT_HCI_CODING_FORMAT_LC3, 0x0000, 0x0000, {},
937+
{BT_AUDIO_CODEC_DATA(BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM,
938+
BT_AUDIO_ASSISTED_LISTENING_STREAM_UNSPECIFIED)});
939+
int ret;
940+
941+
ret = bt_audio_codec_cfg_meta_get_assisted_listening_stream(&codec_cfg);
942+
zassert_equal(ret, 0x00, "Unexpected return value %d", ret);
943+
}
944+
945+
ZTEST(audio_codec_test_suite, test_bt_audio_codec_cfg_meta_set_assisted_listening_stream)
946+
{
947+
struct bt_audio_codec_cfg codec_cfg =
948+
BT_AUDIO_CODEC_CFG(BT_HCI_CODING_FORMAT_LC3, 0x0000, 0x0000, {}, {});
949+
int ret;
950+
951+
ret = bt_audio_codec_cfg_meta_get_assisted_listening_stream(&codec_cfg);
952+
zassert_equal(ret, -ENODATA, "Unexpected return value %d", ret);
953+
954+
ret = bt_audio_codec_cfg_meta_set_assisted_listening_stream(
955+
&codec_cfg, BT_AUDIO_ASSISTED_LISTENING_STREAM_UNSPECIFIED);
956+
zassert_true(ret > 0, "Unexpected return value %d", ret);
957+
958+
ret = bt_audio_codec_cfg_meta_get_assisted_listening_stream(&codec_cfg);
959+
zassert_equal(ret, 0x00, "Unexpected return value %d", ret);
960+
}
961+
933962
ZTEST(audio_codec_test_suite, test_bt_audio_codec_cfg_meta_get_extended)
934963
{
935964
const uint8_t expected_data[] = {0x00, 0x01, 0x02, 0x03};
@@ -1815,6 +1844,35 @@ ZTEST(audio_codec_test_suite, test_bt_audio_codec_cap_meta_set_bcast_audio_immed
18151844
zassert_equal(ret, 0, "Unexpected return value %d", ret);
18161845
}
18171846

1847+
ZTEST(audio_codec_test_suite, test_bt_audio_codec_cap_meta_get_assisted_listening_stream)
1848+
{
1849+
const struct bt_audio_codec_cap codec_cap = BT_AUDIO_CODEC_CAP(
1850+
BT_HCI_CODING_FORMAT_LC3, 0x0000, 0x0000, {},
1851+
{BT_AUDIO_CODEC_DATA(BT_AUDIO_METADATA_TYPE_ASSISTED_LISTENING_STREAM,
1852+
BT_AUDIO_ASSISTED_LISTENING_STREAM_UNSPECIFIED)});
1853+
int ret;
1854+
1855+
ret = bt_audio_codec_cap_meta_get_assisted_listening_stream(&codec_cap);
1856+
zassert_equal(ret, 0x00, "Unexpected return value %d", ret);
1857+
}
1858+
1859+
ZTEST(audio_codec_test_suite, test_bt_audio_codec_cap_meta_set_assisted_listening_stream)
1860+
{
1861+
struct bt_audio_codec_cap codec_cap =
1862+
BT_AUDIO_CODEC_CAP(BT_HCI_CODING_FORMAT_LC3, 0x0000, 0x0000, {}, {});
1863+
int ret;
1864+
1865+
ret = bt_audio_codec_cap_meta_get_assisted_listening_stream(&codec_cap);
1866+
zassert_equal(ret, -ENODATA, "Unexpected return value %d", ret);
1867+
1868+
ret = bt_audio_codec_cap_meta_set_assisted_listening_stream(
1869+
&codec_cap, BT_AUDIO_ASSISTED_LISTENING_STREAM_UNSPECIFIED);
1870+
zassert_true(ret > 0, "Unexpected return value %d", ret);
1871+
1872+
ret = bt_audio_codec_cap_meta_get_assisted_listening_stream(&codec_cap);
1873+
zassert_equal(ret, 0x00, "Unexpected return value %d", ret);
1874+
}
1875+
18181876
ZTEST(audio_codec_test_suite, test_bt_audio_codec_cap_meta_get_extended)
18191877
{
18201878
const uint8_t expected_data[] = {0x00, 0x01, 0x02, 0x03};

0 commit comments

Comments
 (0)