mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-06 12:39:51 +00:00
hci: pass big_handle to hci_emit_big_sync_stopped to allow safe big_sync object removal
This commit is contained in:
parent
2be4ddd3ce
commit
d04a9afcde
25
src/hci.c
25
src/hci.c
@ -239,7 +239,7 @@ static void hci_iso_notify_can_send_now(void);
|
|||||||
static void hci_emit_big_created(const le_audio_big_t * big, uint8_t status);
|
static void hci_emit_big_created(const le_audio_big_t * big, uint8_t status);
|
||||||
static void hci_emit_big_terminated(const le_audio_big_t * big);
|
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_created(const le_audio_big_sync_t * big_sync, uint8_t status);
|
||||||
static void hci_emit_big_sync_stopped(const le_audio_big_sync_t * big_sync);
|
static void hci_emit_big_sync_stopped(uint8_t big_handle);
|
||||||
static le_audio_big_sync_t * hci_big_sync_for_handle(uint8_t big_handle);
|
static le_audio_big_sync_t * hci_big_sync_for_handle(uint8_t big_handle);
|
||||||
#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */
|
#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */
|
||||||
#endif /* ENABLE_BLE */
|
#endif /* ENABLE_BLE */
|
||||||
@ -2877,16 +2877,15 @@ static void handle_command_complete_event(uint8_t * packet, uint16_t size){
|
|||||||
btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs);
|
btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs);
|
||||||
while (btstack_linked_list_iterator_has_next(&it)) {
|
while (btstack_linked_list_iterator_has_next(&it)) {
|
||||||
le_audio_big_sync_t *big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it);
|
le_audio_big_sync_t *big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it);
|
||||||
if (big_sync->state == LE_AUDIO_BIG_STATE_W4_TERMINATED){
|
uint8_t big_handle = big_sync->big_handle;
|
||||||
btstack_linked_list_iterator_remove(&it);
|
|
||||||
switch (big_sync->state){
|
switch (big_sync->state){
|
||||||
case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED:
|
case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED:
|
||||||
|
btstack_linked_list_iterator_remove(&it);
|
||||||
hci_emit_big_sync_created(big_sync, big_sync->state_vars.status);
|
hci_emit_big_sync_created(big_sync, big_sync->state_vars.status);
|
||||||
break;
|
return;
|
||||||
default:
|
default:
|
||||||
hci_emit_big_sync_stopped(big_sync);
|
btstack_linked_list_iterator_remove(&it);
|
||||||
break;
|
hci_emit_big_sync_stopped(big_handle);
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4013,6 +4012,7 @@ static void event_handler(uint8_t *packet, uint16_t size){
|
|||||||
big_sync = hci_big_sync_for_handle(packet[4]);
|
big_sync = hci_big_sync_for_handle(packet[4]);
|
||||||
if (big_sync != NULL){
|
if (big_sync != NULL){
|
||||||
uint8_t status = packet[3];
|
uint8_t status = packet[3];
|
||||||
|
uint8_t big_handle = packet[4];
|
||||||
if (status == ERROR_CODE_SUCCESS){
|
if (status == ERROR_CODE_SUCCESS){
|
||||||
// store bis_con_handles and trigger iso path setup
|
// store bis_con_handles and trigger iso path setup
|
||||||
uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[16]);
|
uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[16]);
|
||||||
@ -4031,7 +4031,7 @@ static void event_handler(uint8_t *packet, uint16_t size){
|
|||||||
if (big_sync->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) {
|
if (big_sync->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) {
|
||||||
hci_emit_big_sync_created(big_sync, status);
|
hci_emit_big_sync_created(big_sync, status);
|
||||||
} else {
|
} else {
|
||||||
hci_emit_big_sync_stopped(big_sync);
|
hci_emit_big_sync_stopped(big_handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4039,8 +4039,9 @@ static void event_handler(uint8_t *packet, uint16_t size){
|
|||||||
case HCI_SUBEVENT_LE_BIG_SYNC_LOST:
|
case HCI_SUBEVENT_LE_BIG_SYNC_LOST:
|
||||||
big_sync = hci_big_sync_for_handle(packet[4]);
|
big_sync = hci_big_sync_for_handle(packet[4]);
|
||||||
if (big_sync != NULL){
|
if (big_sync != NULL){
|
||||||
|
uint8_t big_handle = packet[4];
|
||||||
btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
|
btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
|
||||||
hci_emit_big_sync_stopped(big_sync);
|
hci_emit_big_sync_stopped(big_handle);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -9088,13 +9089,13 @@ static void hci_emit_big_sync_created(const le_audio_big_sync_t * big_sync, uint
|
|||||||
hci_emit_event(event, pos, 0);
|
hci_emit_event(event, pos, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hci_emit_big_sync_stopped(const le_audio_big_sync_t * big_sync){
|
static void hci_emit_big_sync_stopped(uint8_t big_handle){
|
||||||
uint8_t event [4];
|
uint8_t event [4];
|
||||||
uint16_t pos = 0;
|
uint16_t pos = 0;
|
||||||
event[pos++] = HCI_EVENT_META_GAP;
|
event[pos++] = HCI_EVENT_META_GAP;
|
||||||
event[pos++] = 2;
|
event[pos++] = 2;
|
||||||
event[pos++] = GAP_SUBEVENT_BIG_SYNC_STOPPED;
|
event[pos++] = GAP_SUBEVENT_BIG_SYNC_STOPPED;
|
||||||
event[pos++] = big_sync->big_handle;
|
event[pos++] = big_handle;
|
||||||
hci_emit_event(event, pos, 0);
|
hci_emit_event(event, pos, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9312,7 +9313,7 @@ uint8_t gap_big_sync_terminate(uint8_t big_handle){
|
|||||||
switch (big_sync->state){
|
switch (big_sync->state){
|
||||||
case LE_AUDIO_BIG_STATE_CREATE:
|
case LE_AUDIO_BIG_STATE_CREATE:
|
||||||
btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
|
btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync);
|
||||||
hci_emit_big_sync_stopped(big_sync);
|
hci_emit_big_sync_stopped(big_handle);
|
||||||
break;
|
break;
|
||||||
case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH:
|
case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH:
|
||||||
big_sync->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE;
|
big_sync->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user