hci.c (7aa35f6a68be293b189765703d55a2983fa71909) | hci.c (2a6c0f8203a6e80b026f1d5508f53de0dbb70501) |
---|---|
1/* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright --- 219 unchanged lines hidden (view full) --- 228static void hci_iso_stream_finalize(hci_iso_stream_t * iso_stream); 229static hci_iso_stream_t * hci_iso_stream_for_cis_handle(hci_con_handle_t cis_handle); 230static void hci_iso_stream_requested_finalize(void); 231static void hci_iso_stream_requested_confirm(void); 232static void hci_iso_packet_handler(uint8_t * packet, uint16_t size); 233static le_audio_big_t * hci_big_for_handle(uint8_t big_handle); 234static void hci_emit_big_created(const le_audio_big_t * big, uint8_t status); 235static void hci_emit_big_terminated(const le_audio_big_t * big); | 1/* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright --- 219 unchanged lines hidden (view full) --- 228static void hci_iso_stream_finalize(hci_iso_stream_t * iso_stream); 229static hci_iso_stream_t * hci_iso_stream_for_cis_handle(hci_con_handle_t cis_handle); 230static void hci_iso_stream_requested_finalize(void); 231static void hci_iso_stream_requested_confirm(void); 232static void hci_iso_packet_handler(uint8_t * packet, uint16_t size); 233static le_audio_big_t * hci_big_for_handle(uint8_t big_handle); 234static void hci_emit_big_created(const le_audio_big_t * big, uint8_t status); 235static void hci_emit_big_terminated(const le_audio_big_t * big); |
236static void hci_emit_big_sync_created(const le_audio_big_sync_t * big_sync, uint8_t status); 237static void hci_emit_big_sync_stopped(const le_audio_big_sync_t * big_sync); 238static le_audio_big_sync_t * hci_big_sync_for_handle(uint8_t big_handle); |
|
236#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */ 237#endif /* ENABLE_BLE */ 238 239// the STACK is here 240#ifndef HAVE_MALLOC 241static hci_stack_t hci_stack_static; 242#endif 243static hci_stack_t * hci_stack = NULL; --- 2508 unchanged lines hidden (view full) --- 2752 big->state = LE_AUDIO_BIG_STATE_ACTIVE; 2753 hci_emit_big_created(big, ERROR_CODE_SUCCESS); 2754 } else { 2755 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH; 2756 } 2757 } else { 2758 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED; 2759 big->state_vars.status = status; | 239#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */ 240#endif /* ENABLE_BLE */ 241 242// the STACK is here 243#ifndef HAVE_MALLOC 244static hci_stack_t hci_stack_static; 245#endif 246static hci_stack_t * hci_stack = NULL; --- 2508 unchanged lines hidden (view full) --- 2755 big->state = LE_AUDIO_BIG_STATE_ACTIVE; 2756 hci_emit_big_created(big, ERROR_CODE_SUCCESS); 2757 } else { 2758 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH; 2759 } 2760 } else { 2761 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED; 2762 big->state_vars.status = status; |
2760 break; | |
2761 } 2762 return; 2763 } 2764 } | 2763 } 2764 return; 2765 } 2766 } |
2767 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs); 2768 while (btstack_linked_list_iterator_has_next(&it)) { 2769 le_audio_big_sync_t *big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it); 2770 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH){ 2771 status = packet[OFFSET_OF_DATA_IN_COMMAND_COMPLETE]; 2772 if (status == ERROR_CODE_SUCCESS){ 2773 big_sync->state_vars.next_bis++; 2774 if (big_sync->state_vars.next_bis == big_sync->num_bis){ 2775 big_sync->state = LE_AUDIO_BIG_STATE_ACTIVE; 2776 hci_emit_big_sync_created(big_sync, ERROR_CODE_SUCCESS); 2777 } else { 2778 big_sync->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH; 2779 } 2780 } else { 2781 big_sync->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED; 2782 big_sync->state_vars.status = status; 2783 } 2784 return; 2785 } 2786 } |
|
2765 break; 2766 } | 2787 break; 2788 } |
2789 case HCI_OPCODE_HCI_LE_BIG_TERMINATE_SYNC: { 2790 // lookup BIG by state 2791 btstack_linked_list_iterator_t it; 2792 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs); 2793 while (btstack_linked_list_iterator_has_next(&it)) { 2794 le_audio_big_sync_t *big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it); 2795 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_TERMINATED){ 2796 btstack_linked_list_iterator_remove(&it); 2797 switch (big_sync->state){ 2798 case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED: 2799 hci_emit_big_sync_created(big_sync, big_sync->state_vars.status); 2800 break; 2801 default: 2802 hci_emit_big_sync_stopped(big_sync); 2803 break; 2804 } 2805 return; 2806 } 2807 } 2808 break; 2809 } |
|
2767#endif 2768#endif 2769 default: 2770 break; 2771 } 2772} 2773 2774static void handle_command_status_event(uint8_t * packet, uint16_t size) { --- 287 unchanged lines hidden (view full) --- 3062#ifdef ENABLE_CLASSIC 3063 hci_link_type_t link_type; 3064 bd_addr_t addr; 3065 bd_addr_type_t addr_type; 3066#endif 3067#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS 3068 hci_iso_stream_t * iso_stream; 3069 le_audio_big_t * big; | 2810#endif 2811#endif 2812 default: 2813 break; 2814 } 2815} 2816 2817static void handle_command_status_event(uint8_t * packet, uint16_t size) { --- 287 unchanged lines hidden (view full) --- 3105#ifdef ENABLE_CLASSIC 3106 hci_link_type_t link_type; 3107 bd_addr_t addr; 3108 bd_addr_type_t addr_type; 3109#endif 3110#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS 3111 hci_iso_stream_t * iso_stream; 3112 le_audio_big_t * big; |
3113 le_audio_big_sync_t * big_sync; |
|
3070#endif 3071 3072 // log_info("HCI:EVENT:%02x", hci_event_packet_get_type(packet)); 3073 3074 switch (hci_event_packet_get_type(packet)) { 3075 3076 case HCI_EVENT_COMMAND_COMPLETE: 3077 handle_command_complete_event(packet, size); --- 692 unchanged lines hidden (view full) --- 3770 uint8_t status = packet[3]; 3771 if (status == ERROR_CODE_SUCCESS){ 3772 // store bis_con_handles and trigger iso path setup 3773 uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[20]); 3774 uint8_t i; 3775 for (i=0;i<num_bis;i++){ 3776 big->bis_con_handles[i] = little_endian_read_16(packet, 21 + (2 * i)); 3777 } | 3114#endif 3115 3116 // log_info("HCI:EVENT:%02x", hci_event_packet_get_type(packet)); 3117 3118 switch (hci_event_packet_get_type(packet)) { 3119 3120 case HCI_EVENT_COMMAND_COMPLETE: 3121 handle_command_complete_event(packet, size); --- 692 unchanged lines hidden (view full) --- 3814 uint8_t status = packet[3]; 3815 if (status == ERROR_CODE_SUCCESS){ 3816 // store bis_con_handles and trigger iso path setup 3817 uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[20]); 3818 uint8_t i; 3819 for (i=0;i<num_bis;i++){ 3820 big->bis_con_handles[i] = little_endian_read_16(packet, 21 + (2 * i)); 3821 } |
3778 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH; 3779 big->state_vars.next_bis = 0; | 3822 if (big->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) { 3823 big->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH; 3824 big->state_vars.next_bis = 0; 3825 } |
3780 } else { | 3826 } else { |
3781 // create BIG failed | 3827 // create BIG failed or has been stopped by us |
3782 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); | 3828 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); |
3783 hci_emit_big_created(big, status); | 3829 if (big->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED){ 3830 hci_emit_big_created(big, status); 3831 } else { 3832 hci_emit_big_terminated(big); 3833 } |
3784 } 3785 } 3786 break; 3787 case HCI_SUBEVENT_LE_TERMINATE_BIG_COMPLETE: 3788 big = hci_big_for_handle(hci_subevent_le_terminate_big_complete_get_big_handle(packet)); 3789 if (big != NULL){ 3790 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); 3791 switch (big->state){ 3792 case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED: 3793 hci_emit_big_created(big, big->state_vars.status); 3794 break; 3795 default: 3796 hci_emit_big_terminated(big); 3797 break; 3798 } 3799 } 3800 break; | 3834 } 3835 } 3836 break; 3837 case HCI_SUBEVENT_LE_TERMINATE_BIG_COMPLETE: 3838 big = hci_big_for_handle(hci_subevent_le_terminate_big_complete_get_big_handle(packet)); 3839 if (big != NULL){ 3840 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); 3841 switch (big->state){ 3842 case LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED: 3843 hci_emit_big_created(big, big->state_vars.status); 3844 break; 3845 default: 3846 hci_emit_big_terminated(big); 3847 break; 3848 } 3849 } 3850 break; |
3851 case HCI_SUBEVENT_LE_BIG_SYNC_ESTABLISHED: 3852 big_sync = hci_big_sync_for_handle(packet[4]); 3853 if (big_sync != NULL){ 3854 uint8_t status = packet[3]; 3855 if (status == ERROR_CODE_SUCCESS){ 3856 // store bis_con_handles and trigger iso path setup 3857 uint8_t num_bis = btstack_min(MAX_NR_BIS, packet[16]); 3858 uint8_t i; 3859 for (i=0;i<num_bis;i++){ 3860 big_sync->bis_con_handles[i] = little_endian_read_16(packet, 17 + (2 * i)); 3861 } 3862 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) { 3863 // trigger iso path setup 3864 big_sync->state = LE_AUDIO_BIG_STATE_SETUP_ISO_PATH; 3865 big_sync->state_vars.next_bis = 0; 3866 } 3867 } else { 3868 // create BIG Sync failed or has been stopped by us 3869 btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync); 3870 if (big_sync->state == LE_AUDIO_BIG_STATE_W4_ESTABLISHED) { 3871 hci_emit_big_sync_created(big_sync, status); 3872 } else { 3873 hci_emit_big_sync_stopped(big_sync); 3874 } 3875 } 3876 } 3877 break; 3878 case HCI_SUBEVENT_LE_BIG_SYNC_LOST: 3879 big_sync = hci_big_sync_for_handle(packet[4]); 3880 if (big_sync != NULL){ 3881 btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync); 3882 hci_emit_big_sync_stopped(big_sync); 3883 } 3884 break; |
|
3801#endif 3802 default: 3803 break; 3804 } 3805 break; 3806#endif 3807 case HCI_EVENT_VENDOR_SPECIFIC: 3808 // Vendor specific commands often create vendor specific event instead of num completed packets --- 2084 unchanged lines hidden (view full) --- 5893#endif 5894 5895 return false; 5896} 5897 5898#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS 5899static bool hci_run_iso_tasks(void){ 5900 btstack_linked_list_iterator_t it; | 3885#endif 3886 default: 3887 break; 3888 } 3889 break; 3890#endif 3891 case HCI_EVENT_VENDOR_SPECIFIC: 3892 // Vendor specific commands often create vendor specific event instead of num completed packets --- 2084 unchanged lines hidden (view full) --- 5977#endif 5978 5979 return false; 5980} 5981 5982#ifdef ENABLE_LE_ISOCHRONOUS_STREAMS 5983static bool hci_run_iso_tasks(void){ 5984 btstack_linked_list_iterator_t it; |
5985 5986 // BIG |
|
5901 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs); 5902 while (btstack_linked_list_iterator_has_next(&it)){ 5903 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it); 5904 switch (big->state){ 5905 case LE_AUDIO_BIG_STATE_CREATE: 5906 big->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED; 5907 hci_send_cmd(&hci_le_create_big, 5908 big->params->big_handle, --- 10 unchanged lines hidden (view full) --- 5919 big->params->broadcast_code); 5920 return true; 5921 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH: 5922 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH; 5923 hci_send_cmd(&hci_le_setup_iso_data_path, big->bis_con_handles[big->state_vars.next_bis], 0, 0, 0, 0, 0, 0, 0, NULL); 5924 return true; 5925 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED: 5926 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED; | 5987 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs); 5988 while (btstack_linked_list_iterator_has_next(&it)){ 5989 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it); 5990 switch (big->state){ 5991 case LE_AUDIO_BIG_STATE_CREATE: 5992 big->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED; 5993 hci_send_cmd(&hci_le_create_big, 5994 big->params->big_handle, --- 10 unchanged lines hidden (view full) --- 6005 big->params->broadcast_code); 6006 return true; 6007 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH: 6008 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH; 6009 hci_send_cmd(&hci_le_setup_iso_data_path, big->bis_con_handles[big->state_vars.next_bis], 0, 0, 0, 0, 0, 0, 0, NULL); 6010 return true; 6011 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED: 6012 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED; |
5927 hci_send_cmd(&hci_le_terminate_big, big->big_handle); | 6013 hci_send_cmd(&hci_le_terminate_big, big->big_handle, big->state_vars.status); |
5928 break; 5929 case LE_AUDIO_BIG_STATE_TERMINATE: 5930 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED; | 6014 break; 6015 case LE_AUDIO_BIG_STATE_TERMINATE: 6016 big->state = LE_AUDIO_BIG_STATE_W4_TERMINATED; |
5931 hci_send_cmd(&hci_le_terminate_big, big->big_handle); | 6017 hci_send_cmd(&hci_le_terminate_big, big->big_handle, ERROR_CODE_SUCCESS); |
5932 return true; 5933 default: 5934 break; 5935 } 5936 } | 6018 return true; 6019 default: 6020 break; 6021 } 6022 } |
6023 6024 // BIG Sync 6025 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs); 6026 while (btstack_linked_list_iterator_has_next(&it)){ 6027 le_audio_big_sync_t * big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it); 6028 switch (big_sync->state){ 6029 case LE_AUDIO_BIG_STATE_CREATE: 6030 big_sync->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED; 6031 hci_send_cmd(&hci_le_big_create_sync, 6032 big_sync->params->big_handle, 6033 big_sync->params->sync_handle, 6034 big_sync->params->encryption, 6035 big_sync->params->broadcast_code, 6036 big_sync->params->mse, 6037 big_sync->params->big_sync_timeout_10ms, 6038 big_sync->params->num_bis, 6039 big_sync->params->bis_indices); 6040 return true; 6041 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH: 6042 big_sync->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH; 6043 hci_send_cmd(&hci_le_setup_iso_data_path, big_sync->bis_con_handles[big_sync->state_vars.next_bis], 1, 0, 0, 0, 0, 0, 0, NULL); 6044 return true; 6045 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATHS_FAILED: 6046 big_sync->state = LE_AUDIO_BIG_STATE_W4_TERMINATED_AFTER_SETUP_FAILED; 6047 hci_send_cmd(&hci_le_big_terminate_sync, big_sync->big_handle); 6048 break; 6049 case LE_AUDIO_BIG_STATE_TERMINATE: 6050 big_sync->state = LE_AUDIO_BIG_STATE_W4_TERMINATED; 6051 hci_send_cmd(&hci_le_big_terminate_sync, big_sync->big_handle); 6052 return true; 6053 default: 6054 break; 6055 } 6056 } 6057 |
|
5937 return false; 5938} 5939#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */ 5940#endif 5941 5942static bool hci_run_general_pending_commands(void){ 5943 btstack_linked_item_t * it; 5944 for (it = (btstack_linked_item_t *) hci_stack->connections; it != NULL; it = it->next){ --- 2813 unchanged lines hidden (view full) --- 8758 uint16_t pos = 0; 8759 event[pos++] = HCI_EVENT_META_GAP; 8760 event[pos++] = 2; 8761 event[pos++] = GAP_SUBEVENT_BIG_TERMINATED; 8762 event[pos++] = big->big_handle; 8763 hci_emit_event(event, pos, 0); 8764} 8765 | 6058 return false; 6059} 6060#endif /* ENABLE_LE_ISOCHRONOUS_STREAMS */ 6061#endif 6062 6063static bool hci_run_general_pending_commands(void){ 6064 btstack_linked_item_t * it; 6065 for (it = (btstack_linked_item_t *) hci_stack->connections; it != NULL; it = it->next){ --- 2813 unchanged lines hidden (view full) --- 8879 uint16_t pos = 0; 8880 event[pos++] = HCI_EVENT_META_GAP; 8881 event[pos++] = 2; 8882 event[pos++] = GAP_SUBEVENT_BIG_TERMINATED; 8883 event[pos++] = big->big_handle; 8884 hci_emit_event(event, pos, 0); 8885} 8886 |
8887static void hci_emit_big_sync_created(const le_audio_big_sync_t * big_sync, uint8_t status){ 8888 uint8_t event [6 + (MAX_NR_BIS * 2)]; 8889 uint16_t pos = 0; 8890 event[pos++] = HCI_EVENT_META_GAP; 8891 event[pos++] = 4; 8892 event[pos++] = GAP_SUBEVENT_BIG_SYNC_CREATED; 8893 event[pos++] = status; 8894 event[pos++] = big_sync->big_handle; 8895 event[pos++] = big_sync->num_bis; 8896 uint8_t i; 8897 for (i=0;i<big_sync->num_bis;i++){ 8898 little_endian_store_16(event, pos, big_sync->bis_con_handles[i]); 8899 pos += 2; 8900 } 8901 hci_emit_event(event, pos, 0); 8902} 8903 8904static void hci_emit_big_sync_stopped(const le_audio_big_sync_t * big_sync){ 8905 uint8_t event [4]; 8906 uint16_t pos = 0; 8907 event[pos++] = HCI_EVENT_META_GAP; 8908 event[pos++] = 2; 8909 event[pos++] = GAP_SUBEVENT_BIG_SYNC_STOPPED; 8910 event[pos++] = big_sync->big_handle; 8911 hci_emit_event(event, pos, 0); 8912} 8913 |
|
8766static le_audio_big_t * hci_big_for_handle(uint8_t big_handle){ 8767 btstack_linked_list_iterator_t it; 8768 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs); 8769 while (btstack_linked_list_iterator_has_next(&it)){ 8770 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it); 8771 if ( big->big_handle == big_handle ) { 8772 return big; 8773 } 8774 } 8775 return NULL; 8776} 8777 | 8914static le_audio_big_t * hci_big_for_handle(uint8_t big_handle){ 8915 btstack_linked_list_iterator_t it; 8916 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_bigs); 8917 while (btstack_linked_list_iterator_has_next(&it)){ 8918 le_audio_big_t * big = (le_audio_big_t *) btstack_linked_list_iterator_next(&it); 8919 if ( big->big_handle == big_handle ) { 8920 return big; 8921 } 8922 } 8923 return NULL; 8924} 8925 |
8926static le_audio_big_sync_t * hci_big_sync_for_handle(uint8_t big_handle){ 8927 btstack_linked_list_iterator_t it; 8928 btstack_linked_list_iterator_init(&it, &hci_stack->le_audio_big_syncs); 8929 while (btstack_linked_list_iterator_has_next(&it)){ 8930 le_audio_big_sync_t * big_sync = (le_audio_big_sync_t *) btstack_linked_list_iterator_next(&it); 8931 if ( big_sync->big_handle == big_handle ) { 8932 return big_sync; 8933 } 8934 } 8935 return NULL; 8936} 8937 |
|
8778uint8_t gap_big_create(le_audio_big_t * storage, le_audio_big_params_t * big_params){ 8779 if (hci_big_for_handle(big_params->big_handle) != NULL){ 8780 return ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS; 8781 } | 8938uint8_t gap_big_create(le_audio_big_t * storage, le_audio_big_params_t * big_params){ 8939 if (hci_big_for_handle(big_params->big_handle) != NULL){ 8940 return ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS; 8941 } |
8782 | |
8783 if (big_params->num_bis == 0){ 8784 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS; 8785 } 8786 if (big_params->num_bis > MAX_NR_BIS){ 8787 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS; 8788 } 8789 8790 le_audio_big_t * big = storage; 8791 big->big_handle = big_params->big_handle; 8792 big->params = big_params; 8793 big->state = LE_AUDIO_BIG_STATE_CREATE; 8794 big->num_bis = big_params->num_bis; 8795 btstack_linked_list_add(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); 8796 8797 hci_run(); 8798 8799 return ERROR_CODE_SUCCESS; 8800} 8801 | 8942 if (big_params->num_bis == 0){ 8943 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS; 8944 } 8945 if (big_params->num_bis > MAX_NR_BIS){ 8946 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS; 8947 } 8948 8949 le_audio_big_t * big = storage; 8950 big->big_handle = big_params->big_handle; 8951 big->params = big_params; 8952 big->state = LE_AUDIO_BIG_STATE_CREATE; 8953 big->num_bis = big_params->num_bis; 8954 btstack_linked_list_add(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); 8955 8956 hci_run(); 8957 8958 return ERROR_CODE_SUCCESS; 8959} 8960 |
8961uint8_t gap_big_sync_create(le_audio_big_sync_t * storage, le_audio_big_sync_params_t * big_sync_params){ 8962 if (hci_big_sync_for_handle(big_sync_params->big_handle) != NULL){ 8963 return ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS; 8964 } 8965 if (big_sync_params->num_bis == 0){ 8966 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS; 8967 } 8968 if (big_sync_params->num_bis > MAX_NR_BIS){ 8969 return ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS; 8970 } 8971 8972 le_audio_big_sync_t * big_sync = storage; 8973 big_sync->big_handle = big_sync_params->big_handle; 8974 big_sync->params = big_sync_params; 8975 big_sync->state = LE_AUDIO_BIG_STATE_CREATE; 8976 big_sync->num_bis = big_sync_params->num_bis; 8977 btstack_linked_list_add(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync); 8978 8979 hci_run(); 8980 8981 return ERROR_CODE_SUCCESS; 8982} 8983 |
|
8802uint8_t gap_big_terminate(uint8_t big_handle){ 8803 le_audio_big_t * big = hci_big_for_handle(big_handle); 8804 if (big == NULL){ 8805 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; 8806 } 8807 switch (big->state){ 8808 case LE_AUDIO_BIG_STATE_CREATE: 8809 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); | 8984uint8_t gap_big_terminate(uint8_t big_handle){ 8985 le_audio_big_t * big = hci_big_for_handle(big_handle); 8986 if (big == NULL){ 8987 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; 8988 } 8989 switch (big->state){ 8990 case LE_AUDIO_BIG_STATE_CREATE: 8991 btstack_linked_list_remove(&hci_stack->le_audio_bigs, (btstack_linked_item_t *) big); |
8992 hci_emit_big_terminated(big); |
|
8810 break; | 8993 break; |
8811 case LE_AUDIO_BIG_STATE_W4_ESTABLISHED: 8812 big->state = LE_AUDIO_BIG_STATE_W4_ESTABLISHED_THEN_TERMINATE; | 8994 case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH: 8995 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE; |
8813 break; | 8996 break; |
8997 case LE_AUDIO_BIG_STATE_W4_ESTABLISHED: |
|
8814 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH: 8815 case LE_AUDIO_BIG_STATE_ACTIVE: 8816 big->state = LE_AUDIO_BIG_STATE_TERMINATE; 8817 hci_run(); 8818 break; | 8998 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH: 8999 case LE_AUDIO_BIG_STATE_ACTIVE: 9000 big->state = LE_AUDIO_BIG_STATE_TERMINATE; 9001 hci_run(); 9002 break; |
9003 default: 9004 return ERROR_CODE_COMMAND_DISALLOWED; 9005 } 9006 return ERROR_CODE_SUCCESS; 9007} 9008 9009uint8_t gap_big_sync_terminate(uint8_t big_handle){ 9010 le_audio_big_sync_t * big_sync = hci_big_sync_for_handle(big_handle); 9011 if (big_sync == NULL){ 9012 return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; 9013 } 9014 switch (big_sync->state){ 9015 case LE_AUDIO_BIG_STATE_CREATE: 9016 btstack_linked_list_remove(&hci_stack->le_audio_big_syncs, (btstack_linked_item_t *) big_sync); 9017 hci_emit_big_sync_stopped(big_sync); 9018 break; |
|
8819 case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH: | 9019 case LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH: |
8820 big->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE; | 9020 big_sync->state = LE_AUDIO_BIG_STATE_W4_SETUP_ISO_PATH_THEN_TERMINATE; |
8821 break; | 9021 break; |
9022 case LE_AUDIO_BIG_STATE_W4_ESTABLISHED: 9023 case LE_AUDIO_BIG_STATE_SETUP_ISO_PATH: 9024 case LE_AUDIO_BIG_STATE_ACTIVE: 9025 big_sync->state = LE_AUDIO_BIG_STATE_TERMINATE; 9026 hci_run(); 9027 break; |
|
8822 default: 8823 return ERROR_CODE_COMMAND_DISALLOWED; 8824 } 8825 return ERROR_CODE_SUCCESS; 8826} 8827 8828#endif 8829#endif /* ENABLE_BLE */ --- 69 unchanged lines hidden --- | 9028 default: 9029 return ERROR_CODE_COMMAND_DISALLOWED; 9030 } 9031 return ERROR_CODE_SUCCESS; 9032} 9033 9034#endif 9035#endif /* ENABLE_BLE */ --- 69 unchanged lines hidden --- |