mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-07-30 22:57:53 +00:00
nimble/audio: Add subgroups information for modify operation
This commit adds subgroups info for modify source operation. Now metadata field can be handled in scan delegator during modify procedure.
This commit is contained in:
committed by
Szymon Janc
parent
b0c3e4a085
commit
1fa9dfd3c0
@@ -327,8 +327,6 @@ struct ble_svc_audio_bass_operation {
|
||||
/** Number of subgroups */
|
||||
uint16_t num_subgroups;
|
||||
|
||||
/** BIS Synchronisation of subgroups */
|
||||
uint32_t bis_sync[BLE_SVC_AUDIO_BASS_SUB_NUM_MAX];
|
||||
/** Subgroup entries */
|
||||
struct ble_svc_audio_bass_subgroup
|
||||
subgroups[BLE_SVC_AUDIO_BASS_SUB_NUM_MAX];
|
||||
|
||||
@@ -282,28 +282,6 @@ ble_svc_audio_bass_remote_scan_started(uint8_t *data, uint16_t data_len, uint16_
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
check_bis_sync(uint16_t num_subgroups, const uint32_t *bis_sync_list)
|
||||
{
|
||||
uint32_t bis_sync_mask = 0;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (i = 0; i < num_subgroups; i++) {
|
||||
if (bis_sync_list[i] != 0xFFFFFFFF) {
|
||||
for (j = 0; j < num_subgroups; j++) {
|
||||
if (bis_sync_list[i] & bis_sync_mask) {
|
||||
return BLE_HS_EINVAL;
|
||||
}
|
||||
|
||||
bis_sync_mask |= bis_sync_list[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ble_svc_audio_bass_add_source(uint8_t *data, uint16_t data_len, uint16_t conn_handle)
|
||||
{
|
||||
@@ -382,7 +360,7 @@ ble_svc_audio_bass_add_source(uint8_t *data, uint16_t data_len, uint16_t conn_ha
|
||||
data_len -= operation.add_source.subgroups[i].metadata_length;
|
||||
|
||||
if (check_bis_sync(operation.add_source.num_subgroups,
|
||||
operation.add_source.bis_sync)) {
|
||||
operation.add_source.subgroups)) {
|
||||
rc = BLE_HS_EINVAL;
|
||||
ev.bass_operation_status.status = BLE_HS_EREJECT;
|
||||
goto done;
|
||||
@@ -466,6 +444,27 @@ done:
|
||||
}
|
||||
|
||||
static int
|
||||
check_bis_sync(uint16_t num_subgroups, struct ble_svc_audio_bass_subgroup *subgroups)
|
||||
{
|
||||
uint32_t bis_sync_mask = 0;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (i = 0; i < num_subgroups; i++) {
|
||||
if (subgroups[i].bis_sync != 0xFFFFFFFF) {
|
||||
for (j = 0; j < num_subgroups; j++) {
|
||||
if (subgroups[i].bis_sync & bis_sync_mask) {
|
||||
return BLE_HS_EINVAL;
|
||||
}
|
||||
|
||||
bis_sync_mask |= subgroups[i].bis_sync;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ble_svc_audio_bass_modify_source(uint8_t *data, uint16_t data_len, uint16_t conn_handle)
|
||||
{
|
||||
struct ble_svc_audio_bass_operation operation;
|
||||
@@ -517,7 +516,7 @@ ble_svc_audio_bass_modify_source(uint8_t *data, uint16_t data_len, uint16_t conn
|
||||
}
|
||||
|
||||
for (i = 0; i < operation.modify_source.num_subgroups; i++) {
|
||||
operation.modify_source.bis_sync[i] = get_le32(&data[offset]);
|
||||
operation.modify_source.subgroups.bis_sync[i] = get_le32(&data[offset]);
|
||||
offset += 4;
|
||||
operation.modify_source.subgroups[i].metadata_length = data[offset++];
|
||||
data_len -= 5;
|
||||
@@ -532,7 +531,7 @@ ble_svc_audio_bass_modify_source(uint8_t *data, uint16_t data_len, uint16_t conn
|
||||
}
|
||||
|
||||
if (check_bis_sync(operation.modify_source.num_subgroups,
|
||||
operation.modify_source.bis_sync)) {
|
||||
operation.modify_source.subgroups)) {
|
||||
rc = BLE_HS_EINVAL;
|
||||
ev.bass_operation_status.status = BLE_HS_EREJECT;
|
||||
goto done;
|
||||
|
||||
@@ -197,8 +197,9 @@ bass_modify_source_op_handler(struct ble_svc_audio_bass_operation *op, void *arg
|
||||
BLE_AUDIO_DBG_ASSERT(sync_opt->num_subgroups < ARRAY_SIZE(sync_opt->subgroups));
|
||||
|
||||
for (uint8_t i = 0; i < sync_opt->num_subgroups; i++) {
|
||||
sync_opt->subgroups[i].bis_sync = op->modify_source.bis_sync[i];
|
||||
/* FIXME: Missing metadata in Modify Source */
|
||||
sync_opt->subgroups[i].bis_sync = op->modify_source.subgroups[i].bis_sync_state;
|
||||
sync_opt->subgroups[i].metadata_length = op->modify_source.subgroups[i].metadata_length;
|
||||
sync_opt->subgroups[i].metadata = op->modify_source.subgroups[i].metadata;
|
||||
}
|
||||
|
||||
action.type = BLE_AUDIO_SCAN_DELEGATOR_ACTION_SOURCE_MODIFY;
|
||||
|
||||
Reference in New Issue
Block a user