hci: track cis setup

This commit is contained in:
Matthias Ringwald 2022-09-06 12:40:27 +02:00
parent f43072f38b
commit 3abcd16cde
2 changed files with 14 additions and 6 deletions

View File

@ -318,6 +318,7 @@ typedef struct {
uint8_t num_cis;
hci_con_handle_t cis_con_handles[MAX_NR_CIS];
hci_con_handle_t acl_con_handles[MAX_NR_CIS];
bool cis_setup_active[MAX_NR_CIS];
// request to send
bool can_send_now_requested;
} le_audio_cig_t;

View File

@ -243,7 +243,8 @@ static void hci_emit_big_terminated(const le_audio_big_t * big);
static void hci_emit_big_sync_created(const le_audio_big_sync_t * big_sync, uint8_t status);
static void hci_emit_big_sync_stopped(uint8_t big_handle);
static void hci_emit_cig_created(const le_audio_cig_t * cig, uint8_t status);
static void hci_emit_cis_created(const le_audio_cig_t * cig, uint8_t cis_index, uint8_t status);
static void
hci_emit_cis_created(uint8_t cig_id, hci_con_handle_t cis_con_handle, uint8_t status);
static le_audio_big_sync_t * hci_big_sync_for_handle(uint8_t big_handle);
#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */
#endif /* ENABLE_BLE */
@ -3977,6 +3978,7 @@ static void event_handler(uint8_t *packet, uint16_t size){
iso_stream = hci_iso_stream_for_con_handle(handle);
if (iso_stream){
uint8_t status = hci_subevent_le_cis_established_get_status(packet);
uint8_t cig_id = iso_stream->group_id;
if (status == ERROR_CODE_SUCCESS){
iso_stream->state = HCI_ISO_STREAM_STATE_ESTABLISHED;
} else {
@ -3984,12 +3986,13 @@ static void event_handler(uint8_t *packet, uint16_t size){
}
// CIG/CIS
if (iso_stream->iso_type == HCI_ISO_TYPE_CIS){
le_audio_cig_t * cig = hci_cig_for_id(iso_stream->group_id);
le_audio_cig_t * cig = hci_cig_for_id(cig_id);
if (cig){
uint8_t i;
for (i=0;i<cig->num_cis;i++){
if (cig->cis_con_handles[i] == handle){
hci_emit_cis_created(cig, i, status);
cig->cis_setup_active[i] = false;
hci_emit_cis_created(cig_id, handle, status);
}
}
}
@ -6368,6 +6371,9 @@ static bool hci_run_iso_tasks(void){
hci_stack->iso_active_operation_group_id = cig->params->cig_id;
hci_stack->iso_active_operation_type = HCI_ISO_TYPE_CIS;
cig->state = LE_AUDIO_CIG_STATE_W4_CREATE_CIS;
for (i=0;i<cig->num_cis;i++){
cig->cis_setup_active[i] = true;
}
hci_send_cmd(&hci_le_create_cis, cig->num_cis, cig->cis_con_handles, cig->acl_con_handles);
return true;
default:
@ -9217,15 +9223,16 @@ static void hci_emit_cig_created(const le_audio_cig_t * cig, uint8_t status){
hci_emit_event(event, pos, 0);
}
static void hci_emit_cis_created(const le_audio_cig_t * cig, uint8_t cis_index, uint8_t status){
static void
hci_emit_cis_created(uint8_t cig_id, hci_con_handle_t cis_con_handle, uint8_t status) {
uint8_t event [7];
uint16_t pos = 0;
event[pos++] = HCI_EVENT_META_GAP;
event[pos++] = 5;
event[pos++] = GAP_SUBEVENT_CIS_CREATED;
event[pos++] = status;
event[pos++] = cig->cig_id;
little_endian_store_16(event, pos, cig->cis_con_handles[cis_index]);
event[pos++] = cig_id;
little_endian_store_16(event, pos, cis_con_handle);
pos += 2;
hci_emit_event(event, pos, 0);
}