diff --git a/test/le_audio/le_audio_broadcast_source.c b/test/le_audio/le_audio_broadcast_source.c index 464f397c7..a3a364b7b 100644 --- a/test/le_audio/le_audio_broadcast_source.c +++ b/test/le_audio/le_audio_broadcast_source.c @@ -56,6 +56,7 @@ #include "hci_dump.h" #include "btstack_lc3.h" #include "btstack_lc3_google.h" +#include "le-audio/le_audio_base_builder.h" #include "hxcmod.h" #include "mods/mod.h" @@ -117,60 +118,6 @@ static const le_periodic_advertising_parameters_t periodic_params = { .periodic_advertising_properties = 0 }; -static uint8_t periodic_adv_data_1[] = { - // 16 bit service data - 37, BLUETOOTH_DATA_TYPE_SERVICE_DATA_16_BIT_UUID, - // Level 1 - BIG Parameters (common to all BISes) - 0x51, 0x18, // Basic Audio Announcement Service UUID - 0x28, 0x00, 0x00, // Presentation Delay 3 - 0x01, // Num_Subgroups - // Level 2 - BIS Subgroup Parameters (common parameters for subgroups of BISes) - // offset 8 - 0x01, // The number of BISes in this subgroup - 0x06, 0x00, 0x00, 0x00, 0x00, // 0x06 = LC3, vendor id + codec id = 0 - 10, // Codec_Specific_Configuration_Length[i] - // Codec_Specific_Configuration[i] = 8_2 - // offset 15 - 0x02, 0x01, 0x01, // Sampling frequency 0x01 = 0x01 / 8 kHz - 0x02, 0x02, 0x01, // Frame Duration 0x02 = 0x01 / 10 ms - 0x03, 0x04, 0x1E, 0x00, // Octets per Frame 0x04 = 0x1e / 30 - 4, // Metadata_Length[i] - 0x03, 0x02, 0x04, 0x00, // Metadata[i] - // Level 3 - Specific BIS Parameters (if required, for individual BISes) - 0x01, // BIS_index[i[k]] - 6, // Codec_Specific_Configuration_Length[i[k]] - 0x05, 0x03, 0x01, 0x00, 0x00, 0x00 // Codec_Specific_Configuration[i[k]] -}; - -static uint8_t periodic_adv_data_2[] = { - // 16 bit service data - 37+8, BLUETOOTH_DATA_TYPE_SERVICE_DATA_16_BIT_UUID, - // Level 1 - BIG Parameters (common to all BISes) - 0x51, 0x18, // Basic Audio Announcement Service UUID - 0x28, 0x00, 0x00, // Presentation Delay 3 - 0x01, // Num_Subgroups - // Level 2 - BIS Subgroup Parameters (common parameters for subgroups of BISes) - // offset 8 - 0x02, // The number of BISes in this subgroup - 0x06, 0x00, 0x00, 0x00, 0x00, // 0x06 = LC3, vendor id + codec id = 0 - 10, // Codec_Specific_Configuration_Length[i] - // Codec_Specific_Configuration[0] = 8_2 - // offset 15 - 0x02, 0x01, 0x01, // Sampling frequency 0x01 = 0x01 / 8 kHz - 0x02, 0x02, 0x01, // Frame Duration 0x02 = 0x01 / 10 ms - 0x03, 0x04, 0x1E, 0x00, // Octets per Frame 0x04 = 0x1e / 30 - 4, // Metadata_Length[i] - 0x03, 0x02, 0x04, 0x00, // Metadata[0] - // Level 3 - Specific BIS Parameters (if required, for individual BISes) - 0x01, // BIS_index[i[k]] - 6, // Codec_Specific_Configuration_Length[i[k]] - 0x05, 0x03, 0x01, 0x00, 0x00, 0x00, // Codec_Specific_Configuration[i[k]] - // Level 3 - Specific BIS Parameters (if required, for individual BISes) - 0x02, // BIS_index[i[k]] - 6, // Codec_Specific_Configuration_Length[i[k]] - 0x05, 0x03, 0x02, 0x00, 0x00, 0x00 // Codec_Specific_Configuration[i[k]] -}; - // input signal: pre-computed int16 sine wave, 96000 Hz at 300 Hz static const int16_t sine_int16[] = { 0, 643, 1286, 1929, 2571, 3212, 3851, 4489, 5126, 5760, @@ -211,6 +158,8 @@ static bd_addr_t remote; static const char * remote_addr_string = "00:1B:DC:08:E2:72"; static btstack_packet_callback_registration_t hci_event_callback_registration; +static uint8_t period_adv_data[255]; +static uint16_t period_adv_data_len; static uint8_t adv_handle = 0; static unsigned int next_bis_index; @@ -475,21 +424,7 @@ static void setup_advertising() { gap_extended_advertising_setup(&le_advertising_set, &extended_params, &adv_handle); gap_extended_advertising_set_adv_data(adv_handle, sizeof(extended_adv_data), extended_adv_data); gap_periodic_advertising_set_params(adv_handle, &periodic_params); - switch(num_bis){ - case 1: - gap_periodic_advertising_set_data(adv_handle, sizeof(periodic_adv_data_1), periodic_adv_data_1); - printf("BASE: "); - printf_hexdump(periodic_adv_data_1, sizeof(periodic_adv_data_1)); - break; - case 2: - gap_periodic_advertising_set_data(adv_handle, sizeof(periodic_adv_data_2), periodic_adv_data_2); - printf("BASE: "); - printf_hexdump(periodic_adv_data_2, sizeof(periodic_adv_data_2)); - break; - default: - btstack_unreachable(); - break; - } + gap_periodic_advertising_set_data(adv_handle, period_adv_data_len, period_adv_data); gap_periodic_advertising_start(adv_handle, 0); gap_extended_advertising_start(adv_handle, 0, 0); } @@ -531,14 +466,38 @@ static void start_broadcast() {// use values from table // get num samples per frame setup_lc3_encoder(); - // update BASEs - periodic_adv_data_1[17] = codec_configurations[menu_sampling_frequency].samplingrate_index; - periodic_adv_data_1[20] = (frame_duration == BTSTACK_LC3_FRAME_DURATION_7500US) ? 0 : 1; - little_endian_store_16(periodic_adv_data_1, 23, octets_per_frame); - - periodic_adv_data_2[17] = codec_configurations[menu_sampling_frequency].samplingrate_index; - periodic_adv_data_2[20] = (frame_duration == BTSTACK_LC3_FRAME_DURATION_7500US) ? 0 : 1; - little_endian_store_16(periodic_adv_data_2, 23, octets_per_frame); + // setup base + uint8_t codec_id[] = { 0x06, 0x00, 0x00, 0x00, 0x00 }; + uint8_t subgroup_codec_specific_configuration[] = { + 0x02, 0x01, 0x01, + 0x02, 0x02, 0x01, + 0x03, 0x04, 0x1E, 0x00, + }; + subgroup_codec_specific_configuration[2] = codec_configurations[menu_sampling_frequency].samplingrate_index; + subgroup_codec_specific_configuration[5] = (frame_duration == BTSTACK_LC3_FRAME_DURATION_7500US) ? 0 : 1;; + uint8_t subgroup_metadata[] = { + 0x03, 0x02, 0x04, 0x00, // Metadata[i] + }; + little_endian_store_16(subgroup_codec_specific_configuration, 8, octets_per_frame); + uint8_t bis_codec_specific_configuration_1[] = { + 0x05, 0x03, 0x01, 0x00, 0x00, 0x00 + }; + uint8_t bis_codec_specific_configuration_2[] = { + 0x05, 0x03, 0x02, 0x00, 0x00, 0x00 + }; + base_builder_t builder; + le_audio_base_builder_init(&builder, period_adv_data, sizeof(period_adv_data), 40); + le_audio_base_builder_add_subgroup(&builder, codec_id, + sizeof(subgroup_codec_specific_configuration), + subgroup_codec_specific_configuration, + sizeof(subgroup_metadata), subgroup_metadata); + le_audio_base_builder_add_bis(&builder, 1, sizeof(bis_codec_specific_configuration_1), + bis_codec_specific_configuration_1); + if (num_bis == 2){ + le_audio_base_builder_add_bis(&builder, 2, sizeof(bis_codec_specific_configuration_2), + bis_codec_specific_configuration_2); + } + period_adv_data_len = le_audio_base_builder_get_ad_data_size(&builder); // setup mod player setup_mod_player();