| /****************************************************************************** |
| * |
| * Copyright 2021 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ******************************************************************************/ |
| |
| #include "bta_closure_api.h" |
| #include "bta_bap_uclient_api.h" |
| #include "btif_common.h" |
| #include "btif_storage.h" |
| #include "osi/include/thread.h" |
| #include "btif_bap_codec_utils.h" |
| |
| #include "osi/include/properties.h" |
| |
| extern void do_in_bta_thread(const base::Location& from_here, |
| const base::Closure& task); |
| #include <base/bind.h> |
| #include <base/callback.h> |
| #include <base/location.h> |
| #include <base/logging.h> |
| #include <hardware/bluetooth.h> |
| #include <hardware/bt_pacs_client.h> |
| #include <hardware/bt_bap_uclient.h> |
| #include "btif_bap_config.h" |
| |
| using base::Bind; |
| using base::Unretained; |
| using bluetooth::bap::ucast::UcastClient; |
| using bluetooth::bap::pacs::CodecConfig; |
| using bluetooth::bap::pacs::ConnectionState; |
| using bluetooth::bap::ucast::UcastClientCallbacks; |
| using bluetooth::bap::ucast::UcastClientInterface; |
| using bluetooth::bap::ucast::StreamConnect; |
| using bluetooth::bap::ucast::StreamType; |
| using bluetooth::bap::ucast::StreamStateInfo; |
| using bluetooth::bap::ucast::StreamConfigInfo; |
| using bluetooth::bap::ucast::StreamReconfig; |
| |
| using bluetooth::bap::pacs::CodecIndex; |
| using bluetooth::bap::pacs::CodecPriority; |
| using bluetooth::bap::pacs::CodecSampleRate; |
| using bluetooth::bap::pacs::CodecFrameDuration; |
| using bluetooth::bap::pacs::CodecChannelMode; |
| using bluetooth::bap::ucast::CodecQosConfig; |
| using bluetooth::bap::ucast::CISConfig; |
| using bluetooth::bap::ucast::CONTENT_TYPE_MEDIA; |
| using bluetooth::bap::ucast::CONTENT_TYPE_CONVERSATIONAL; |
| using bluetooth::bap::ucast::CONTENT_TYPE_GAME; |
| using bluetooth::bap::ucast::CONTENT_TYPE_LIVE; |
| using bluetooth::bap::ucast::CONTENT_TYPE_UNSPECIFIED; |
| using bluetooth::bap::ucast::ASE_DIRECTION_SRC; |
| using bluetooth::bap::ucast::ASE_DIRECTION_SINK; |
| using bluetooth::bap::ucast::StreamReconfigType; |
| using bluetooth::bap::ucast::ASCSConfig; |
| |
| static thread_t *test_thread; |
| static UcastClientInterface* sUcastClientInterface = nullptr; |
| static RawAddress bap_bd_addr; |
| |
| extern bluetooth::bap::pacs::PacsClientInterface* btif_pacs_client_get_interface(); |
| |
| class UcastClientCallbacksImpl : public UcastClientCallbacks { |
| public: |
| ~UcastClientCallbacksImpl() = default; |
| void OnStreamState(const RawAddress &address, |
| std::vector<StreamStateInfo> streams_state_info) override { |
| for (auto it = streams_state_info.begin(); |
| it != streams_state_info.end(); it++) { |
| LOG(WARNING) << __func__ << " stream type " << (it->stream_type.type); |
| LOG(WARNING) << __func__ << " stream dir " << loghex(it->stream_type.direction); |
| LOG(WARNING) << __func__ << " stream state " << static_cast<int> (it->stream_state); |
| } |
| } |
| void OnStreamConfig(const RawAddress &address, |
| std::vector<StreamConfigInfo> streams_config_info) override { |
| LOG(WARNING) << __func__; |
| for (auto it = streams_config_info.begin(); |
| it != streams_config_info.end(); it++) { |
| LOG(WARNING) << __func__ << " stream type " << (it->stream_type.type); |
| LOG(WARNING) << __func__ << " stream dir " << loghex(it->stream_type.direction); |
| LOG(WARNING) << __func__ << " location " << static_cast<int> (it->audio_location); |
| btif_bap_add_record(address, REC_TYPE_CONFIGURATION, |
| it->stream_type.type, |
| static_cast<CodecDirection> (it->stream_type.direction), |
| &it->codec_config); |
| |
| std::vector<CodecConfig> acm_pac_records; |
| |
| btif_bap_get_records(address, |
| REC_TYPE_CAPABILITY, |
| CONTENT_TYPE_MEDIA | |
| CONTENT_TYPE_UNSPECIFIED, |
| static_cast<CodecDirection> |
| (it->stream_type.direction), |
| &acm_pac_records); |
| |
| LOG(WARNING) << __func__ << " acm len to be 3" << (acm_pac_records.size()); |
| |
| std::vector<CodecConfig> config_pac_records; |
| btif_bap_get_records(address, |
| REC_TYPE_CONFIGURATION, |
| CONTENT_TYPE_MEDIA, |
| static_cast<CodecDirection> |
| (it->stream_type.direction), |
| &config_pac_records); |
| |
| LOG(WARNING) << __func__ << " configs len to be 1" << (config_pac_records.size()); |
| |
| btif_bap_remove_record_by_context (address, REC_TYPE_CONFIGURATION, |
| it->stream_type.type, |
| static_cast<CodecDirection> |
| (it->stream_type.direction)); |
| |
| config_pac_records.clear(); |
| btif_bap_get_records(address, |
| REC_TYPE_CONFIGURATION, |
| CONTENT_TYPE_MEDIA, |
| static_cast<CodecDirection> |
| (it->stream_type.direction), |
| &config_pac_records); |
| |
| LOG(WARNING) << __func__ << " configs len to be 0" << (config_pac_records.size()); |
| |
| #if 0 |
| btif_bap_remove_record_by_context (address, REC_TYPE_CAPABILITY, |
| CONTENT_TYPE_MEDIA | |
| CONTENT_TYPE_UNSPECIFIED, |
| static_cast<CodecDirection> |
| (it->stream_type.direction)); |
| |
| acm_pac_records.clear(); |
| btif_bap_get_records(address, |
| REC_TYPE_CAPABILITY, |
| CONTENT_TYPE_MEDIA | |
| CONTENT_TYPE_UNSPECIFIED, |
| static_cast<CodecDirection> |
| (it->stream_type.direction), |
| &acm_pac_records); |
| |
| LOG(WARNING) << __func__ << " acm len to be 0" << (acm_pac_records.size()); |
| #endif |
| } |
| } |
| void OnStreamAvailable(const RawAddress &address, |
| uint16_t src_audio_contexts, |
| uint16_t sink_audio_contexts) override { |
| LOG(WARNING) << __func__; |
| } |
| }; |
| |
| static UcastClientCallbacksImpl sUcastClientCallbacks; |
| |
| static void event_test_bap_uclient(UNUSED_ATTR void* context) { |
| LOG(INFO) << __func__ << " start " ; |
| sUcastClientInterface = bluetooth::bap::ucast::btif_bap_uclient_get_interface(); |
| sUcastClientInterface->Init(&sUcastClientCallbacks); |
| sleep(1); |
| |
| StreamConnect conn_info; |
| CodecQosConfig codec_qos_config; |
| codec_qos_config.codec_config.codec_type = CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config.codec_config, 100); |
| codec_qos_config.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| CISConfig cis_config_1 = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| CISConfig cis_config_2 = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| codec_qos_config.qos_config.cis_configs.push_back(cis_config_1); |
| codec_qos_config.qos_config.cis_configs.push_back(cis_config_2); |
| |
| ASCSConfig ascs_config = { |
| .cig_id = 1, |
| .cis_id = 0, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| codec_qos_config.qos_config.ascs_configs.push_back(ascs_config); |
| conn_info.stream_type.type = 0x0004; // media |
| conn_info.stream_type.direction = ASE_DIRECTION_SINK; |
| conn_info.stream_type.audio_context = |
| CONTENT_TYPE_MEDIA; |
| conn_info.codec_qos_config_pair.push_back(codec_qos_config); |
| std::vector<StreamConnect> streams; |
| streams.push_back(conn_info); |
| |
| ASCSConfig ascs_config_2 = { |
| .cig_id = 1, |
| .cis_id = 1, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| codec_qos_config.qos_config.ascs_configs.clear(); |
| codec_qos_config.qos_config.ascs_configs.push_back(ascs_config_2); |
| StreamConnect conn_info_2; |
| conn_info_2.stream_type.type = 0x0004; // media |
| conn_info_2.stream_type.direction = ASE_DIRECTION_SINK; |
| conn_info_2.stream_type.audio_context = |
| CONTENT_TYPE_MEDIA; |
| conn_info_2.codec_qos_config_pair.push_back(codec_qos_config); |
| std::vector<StreamConnect> streams_2; |
| streams_2.push_back(conn_info_2); |
| |
| // reconfig information |
| std::vector<StreamReconfig> reconf_streams; |
| codec_qos_config.qos_config.ascs_configs[0].cis_id = 1; |
| UpdateFrameDuration(&codec_qos_config.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_7_5)); |
| |
| codec_qos_config.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x4C, 0x1D, 0x00}, |
| .sdu_interval_s_to_m = {0x4C, 0x1D, 0x00} |
| }; |
| |
| StreamReconfig reconf_info; |
| reconf_info.stream_type.type = 0x0004; // media |
| reconf_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_info.codec_qos_config_pair.push_back(codec_qos_config); |
| reconf_streams.push_back(reconf_info); |
| |
| std::vector<StreamReconfig> reconf_qos_streams; |
| StreamReconfig reconf_qos_info; |
| reconf_qos_info.stream_type.type = 0x0004; // media |
| reconf_qos_info.reconf_type = StreamReconfigType::QOS_CONFIG; |
| reconf_qos_info.stream_type.direction = ASE_DIRECTION_SINK; |
| codec_qos_config.qos_config.cis_configs.clear(); |
| |
| cis_config_1.rtn_m_to_s = 1; |
| cis_config_1.rtn_s_to_m = 1; |
| cis_config_2.rtn_m_to_s = 1; |
| cis_config_2.rtn_s_to_m = 1; |
| codec_qos_config.qos_config.cis_configs.push_back(cis_config_1); |
| codec_qos_config.qos_config.cis_configs.push_back(cis_config_2); |
| reconf_qos_info.codec_qos_config_pair.push_back(codec_qos_config); |
| reconf_qos_streams.push_back(reconf_qos_info); |
| |
| StreamType type_1 = { .type = 0x0004, |
| .direction = ASE_DIRECTION_SINK |
| }; |
| |
| RawAddress bap_bd_addr_2; |
| RawAddress::FromString("00:02:5B:00:FF:01", bap_bd_addr_2); |
| |
| std::vector<StreamType> start_streams; |
| start_streams.push_back(type_1); |
| |
| char bap_test[150] = "generic"; |
| |
| property_get("persist.vendor.service.bt.bap.test", bap_test, "generic"); |
| |
| LOG(INFO) << __func__ << " property" << bap_test; |
| |
| if(!strcmp(bap_test, "generic")) { |
| LOG(INFO) << __func__ << " going for generic test case"; |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, streams_2); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for stream start 1 "; |
| //sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| LOG(INFO) << __func__ << " going for stream start 2"; |
| //sUcastClientInterface->Start( bap_bd_addr_2, start_streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect 1 "; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| LOG(INFO) << __func__ << "going for stream disconnect 2 "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, start_streams); |
| |
| } else if(!strcmp(bap_test, "stereo_recording_stereo_dual_cis")) { |
| LOG(INFO) << __func__ << " going for rxonly test case"; |
| LOG(INFO) << __func__ << " going for connect"; |
| StreamConnect conn_info_media_recording; |
| |
| CodecQosConfig codec_qos_config_media_rx_1; |
| CodecQosConfig codec_qos_config_media_rx_2; |
| |
| CISConfig cis_config_1_media_rx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 0, |
| .max_sdu_s_to_m = 100, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_2_media_rx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 0, |
| .max_sdu_s_to_m = 100, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_1_media_rx_2 = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 0, |
| .max_sdu_s_to_m = 200, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| ASCSConfig ascs_config_1 = { |
| .cig_id = 1, |
| .cis_id = 0, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_2 = { |
| .cig_id = 1, |
| .cis_id = 1, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| codec_qos_config_media_rx_1.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_media_rx_1.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_media_rx_1.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_media_rx_1.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_media_rx_1.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_media_rx_1.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_media_rx_1.codec_config, 100); |
| |
| |
| codec_qos_config_media_rx_2 = codec_qos_config_media_rx_1; |
| UpdateOctsPerFrame(&codec_qos_config_media_rx_2.codec_config, 200); |
| |
| codec_qos_config_media_rx_1.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_media_rx_1.qos_config.cis_configs.push_back(cis_config_1_media_rx); |
| codec_qos_config_media_rx_1.qos_config.cis_configs.push_back(cis_config_2_media_rx); |
| |
| codec_qos_config_media_rx_1.qos_config.ascs_configs.push_back(ascs_config_1); |
| codec_qos_config_media_rx_1.qos_config.ascs_configs.push_back(ascs_config_2); |
| |
| codec_qos_config_media_rx_2.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 1, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_media_rx_2.qos_config.cis_configs.push_back(cis_config_1_media_rx_2); |
| |
| codec_qos_config_media_rx_2.qos_config.ascs_configs.push_back(ascs_config_1); |
| |
| StreamType type_media_rx = { .type = CONTENT_TYPE_MEDIA, |
| .audio_context = CONTENT_TYPE_LIVE, |
| .direction = ASE_DIRECTION_SRC |
| }; |
| |
| conn_info_media_recording.stream_type.type = CONTENT_TYPE_MEDIA; |
| conn_info_media_recording.stream_type.audio_context = CONTENT_TYPE_LIVE; |
| conn_info_media_recording.stream_type.direction = ASE_DIRECTION_SRC; |
| conn_info_media_recording.codec_qos_config_pair.push_back(codec_qos_config_media_rx_1); |
| conn_info_media_recording.codec_qos_config_pair.push_back(codec_qos_config_media_rx_2); |
| |
| std::vector<StreamConnect> media_rx_streams; |
| media_rx_streams.push_back(conn_info_media_recording); |
| |
| std::vector<StreamType> streams; |
| streams.push_back(type_media_rx); |
| |
| |
| sUcastClientInterface->Connect( bap_bd_addr, true, media_rx_streams); |
| |
| sleep(15); |
| |
| LOG(INFO) << __func__ << " going for stream start 1 "; |
| sUcastClientInterface->Start( bap_bd_addr, streams); |
| |
| sleep(10); |
| |
| sUcastClientInterface->Stop( bap_bd_addr, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect 1 "; |
| sUcastClientInterface->Disconnect( bap_bd_addr, streams); |
| |
| } else if(!strcmp(bap_test, "dual_streams_media_tx_voice_rx")) { |
| StreamConnect conn_info_media; |
| StreamConnect conn_info_gaming; |
| |
| // reconfig information |
| CodecQosConfig codec_qos_config_media_tx_1; |
| CodecQosConfig codec_qos_config_gaming_tx; |
| CodecQosConfig codec_qos_config_gaming_tx_rx; |
| |
| CISConfig cis_config_1_media_tx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 155, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_2_media_tx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 155, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_1_gaming_tx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_2_gaming_tx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_1_gaming_tx_rx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| CISConfig cis_config_2_gaming_tx_rx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| ASCSConfig ascs_config = { |
| .cig_id = 1, |
| .cis_id = 0, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| codec_qos_config_media_tx_1.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_media_tx_1.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_media_tx_1.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_media_tx_1.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_media_tx_1.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_media_tx_1.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_media_tx_1.codec_config, 155); |
| codec_qos_config_media_tx_1.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_media_tx_1.qos_config.cis_configs.push_back(cis_config_1_media_tx); |
| codec_qos_config_media_tx_1.qos_config.cis_configs.push_back(cis_config_2_media_tx); |
| |
| codec_qos_config_media_tx_1.qos_config.ascs_configs.push_back(ascs_config); |
| codec_qos_config_gaming_tx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_gaming_tx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_gaming_tx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_gaming_tx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_gaming_tx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_gaming_tx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_gaming_tx.codec_config, 100); |
| codec_qos_config_gaming_tx.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_tx.qos_config.cis_configs.push_back(cis_config_1_gaming_tx); |
| codec_qos_config_gaming_tx.qos_config.cis_configs.push_back(cis_config_2_gaming_tx); |
| |
| codec_qos_config_gaming_tx.qos_config.ascs_configs.push_back(ascs_config); |
| codec_qos_config_gaming_tx_rx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_gaming_tx_rx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_gaming_tx_rx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_16000; |
| codec_qos_config_gaming_tx_rx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_gaming_tx_rx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_gaming_tx_rx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_gaming_tx_rx.codec_config, 40); |
| codec_qos_config_gaming_tx_rx.qos_config.cig_config = { |
| .cig_id = 2, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_tx_rx.qos_config.cis_configs.push_back(cis_config_1_gaming_tx_rx); |
| codec_qos_config_gaming_tx_rx.qos_config.cis_configs.push_back(cis_config_2_gaming_tx_rx); |
| ASCSConfig ascs_config_gaming = { |
| .cig_id = 2, |
| .cis_id = 0, |
| .bi_directional = true, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| codec_qos_config_gaming_tx_rx.qos_config.ascs_configs.push_back(ascs_config_gaming); |
| conn_info_media.stream_type.type = CONTENT_TYPE_MEDIA; |
| conn_info_media.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| conn_info_media.stream_type.direction = ASE_DIRECTION_SINK; |
| conn_info_media.codec_qos_config_pair.push_back(codec_qos_config_media_tx_1); |
| |
| conn_info_gaming.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_gaming.stream_type.audio_context = |
| CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_gaming.stream_type.direction = ASE_DIRECTION_SRC; |
| conn_info_gaming.codec_qos_config_pair.push_back(codec_qos_config_gaming_tx_rx); |
| |
| std::vector<StreamConnect> dual_streams; |
| dual_streams.push_back(conn_info_media); |
| dual_streams.push_back(conn_info_gaming); |
| |
| StreamType type_media = { .type = CONTENT_TYPE_MEDIA, |
| .audio_context = CONTENT_TYPE_MEDIA, |
| .direction = ASE_DIRECTION_SINK |
| }; |
| |
| StreamType type_voice = { .type = CONTENT_TYPE_CONVERSATIONAL, |
| .audio_context = CONTENT_TYPE_CONVERSATIONAL, |
| .direction = ASE_DIRECTION_SRC |
| }; |
| |
| std::vector<StreamType> media_streams; |
| media_streams.push_back(type_media); |
| std::vector<StreamType> voice_streams; |
| voice_streams.push_back(type_voice); |
| |
| LOG(INFO) << __func__ << " going for generic test case"; |
| LOG(INFO) << __func__ << " going for connect with media tx and gaming rx"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, dual_streams); |
| |
| //sUcastClientInterface->Connect( bap_bd_addr_2, true, streams_2); |
| |
| sleep(10); |
| |
| std::vector<StreamReconfig> reconf_streams; |
| |
| StreamReconfig reconf_gaming_tx_info; |
| reconf_gaming_tx_info.stream_type.type = CONTENT_TYPE_MEDIA; // media |
| reconf_gaming_tx_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; // media |
| reconf_gaming_tx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_tx_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_gaming_tx_info.codec_qos_config_pair.push_back(codec_qos_config_gaming_tx); |
| |
| StreamReconfig reconf_gaming_tx_rx_info; |
| reconf_gaming_tx_rx_info.stream_type.type = CONTENT_TYPE_MEDIA; // media |
| reconf_gaming_tx_rx_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; // media |
| reconf_gaming_tx_rx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_tx_rx_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_gaming_tx_rx_info.codec_qos_config_pair.push_back(codec_qos_config_gaming_tx_rx); |
| |
| StreamReconfig reconf_media_info; |
| reconf_media_info.stream_type.type = CONTENT_TYPE_MEDIA; // media |
| reconf_media_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; // media |
| reconf_media_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_media_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_media_info.codec_qos_config_pair.push_back(codec_qos_config_media_tx_1); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream start 1 "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| |
| // switch to Gaming tx |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| |
| // switch to media tx |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| |
| // switch to Gaming tx & rx |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_gaming_tx_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr, voice_streams); |
| |
| // switch to Gaming tx (2nd time) (4th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr, voice_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_gaming_tx_info.reconf_type = StreamReconfigType::QOS_CONFIG; |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| |
| |
| // switch to Gaming tx & rx (2nd time) (5th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_gaming_tx_rx_info.reconf_type = StreamReconfigType::QOS_CONFIG; |
| reconf_streams.push_back(reconf_gaming_tx_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr, voice_streams); |
| |
| // switch to media tx (6th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr, voice_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for stream disconnect 1 "; |
| sUcastClientInterface->Disconnect( bap_bd_addr, media_streams); |
| sUcastClientInterface->Disconnect( bap_bd_addr, voice_streams); |
| //LOG(INFO) << __func__ << "going for stream disconnect 2 "; |
| //sUcastClientInterface->Disconnect( bap_bd_addr_2, start_streams); |
| |
| } else if(!strcmp(bap_test, "tri_streams_media_tx_voice_tx_voice_rx")) { |
| StreamConnect conn_info_media; |
| StreamConnect conn_info_gaming; |
| StreamConnect conn_info_voice_tx; |
| StreamConnect conn_info_voice_rx; |
| |
| // reconfig information |
| CodecQosConfig codec_qos_config_media_tx_1; |
| CodecQosConfig codec_qos_config_gaming_tx; |
| CodecQosConfig codec_qos_config_gaming_tx_rx; |
| CodecQosConfig codec_qos_config_gaming_rx; |
| CodecQosConfig codec_qos_config_voice_tx_rx; |
| |
| CodecQosConfig codec_qos_config_media_tx_2; |
| CodecQosConfig codec_qos_config_gaming_tx_2; |
| CodecQosConfig codec_qos_config_gaming_tx_rx_2; |
| CodecQosConfig codec_qos_config_gaming_rx_2; |
| CodecQosConfig codec_qos_config_voice_tx_rx_2; |
| |
| CISConfig cis_config_1_media_tx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 155, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_2_media_tx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 155, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_1_gaming_tx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_2_gaming_tx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_1_gaming_tx_rx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| CISConfig cis_config_2_gaming_tx_rx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_1_voice_tx_rx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 40, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| CISConfig cis_config_2_voice_tx_rx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 40, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| ASCSConfig ascs_config = { |
| .cig_id = 1, |
| .cis_id = 0, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_gaming = { |
| .cig_id = 2, |
| .cis_id = 0, |
| .bi_directional = true, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_voice = { |
| .cig_id = 3, |
| .cis_id = 0, |
| .bi_directional = true, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_2 = { |
| .cig_id = 1, |
| .cis_id = 1, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_gaming_2 = { |
| .cig_id = 2, |
| .cis_id = 1, |
| .bi_directional = true, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_voice_2 = { |
| .cig_id = 3, |
| .cis_id = 1, |
| .bi_directional = true, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| codec_qos_config_media_tx_1.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_media_tx_1.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_media_tx_1.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_media_tx_1.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_media_tx_1.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_media_tx_1.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_media_tx_1.codec_config, 155); |
| codec_qos_config_media_tx_1.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_media_tx_1.qos_config.cis_configs.push_back(cis_config_1_media_tx); |
| codec_qos_config_media_tx_1.qos_config.cis_configs.push_back(cis_config_2_media_tx); |
| |
| codec_qos_config_media_tx_1.qos_config.ascs_configs.push_back(ascs_config); |
| |
| codec_qos_config_media_tx_2 = codec_qos_config_media_tx_1; |
| codec_qos_config_media_tx_2.qos_config.ascs_configs.clear(); |
| codec_qos_config_media_tx_2.qos_config.ascs_configs.push_back(ascs_config_2); |
| |
| codec_qos_config_gaming_tx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_gaming_tx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_gaming_tx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_gaming_tx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_gaming_tx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_gaming_tx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_gaming_tx.codec_config, 100); |
| codec_qos_config_gaming_tx.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_tx.qos_config.cis_configs.push_back(cis_config_1_gaming_tx); |
| codec_qos_config_gaming_tx.qos_config.cis_configs.push_back(cis_config_2_gaming_tx); |
| |
| codec_qos_config_gaming_tx.qos_config.ascs_configs.push_back(ascs_config); |
| |
| |
| codec_qos_config_gaming_tx_2 = codec_qos_config_gaming_tx; |
| codec_qos_config_gaming_tx_2.qos_config.ascs_configs.clear(); |
| codec_qos_config_gaming_tx_2.qos_config.ascs_configs.push_back(ascs_config_2); |
| |
| codec_qos_config_gaming_tx_rx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_gaming_tx_rx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_gaming_tx_rx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_gaming_tx_rx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_gaming_tx_rx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_gaming_tx_rx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_gaming_tx_rx.codec_config, 100); |
| codec_qos_config_gaming_tx_rx.qos_config.cig_config = { |
| .cig_id = 2, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_tx_rx.qos_config.cis_configs.push_back(cis_config_1_gaming_tx_rx); |
| codec_qos_config_gaming_tx_rx.qos_config.cis_configs.push_back(cis_config_2_gaming_tx_rx); |
| |
| codec_qos_config_gaming_tx_rx.qos_config.ascs_configs.push_back(ascs_config_gaming); |
| |
| codec_qos_config_gaming_tx_rx_2 = codec_qos_config_gaming_tx_rx; |
| codec_qos_config_gaming_tx_rx_2.qos_config.ascs_configs.clear(); |
| codec_qos_config_gaming_tx_rx_2.qos_config.ascs_configs.push_back(ascs_config_gaming_2); |
| |
| |
| codec_qos_config_gaming_rx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_gaming_rx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_gaming_rx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_16000; |
| codec_qos_config_gaming_rx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_gaming_rx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_gaming_rx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_gaming_rx.codec_config, 40); |
| codec_qos_config_gaming_rx.qos_config.cig_config = { |
| .cig_id = 2, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_rx.qos_config.cis_configs.push_back(cis_config_1_gaming_tx_rx); |
| codec_qos_config_gaming_rx.qos_config.cis_configs.push_back(cis_config_2_gaming_tx_rx); |
| |
| codec_qos_config_gaming_rx.qos_config.ascs_configs.push_back(ascs_config_gaming); |
| |
| codec_qos_config_gaming_rx_2 = codec_qos_config_gaming_rx; |
| codec_qos_config_gaming_rx_2.qos_config.ascs_configs.clear(); |
| codec_qos_config_gaming_rx_2.qos_config.ascs_configs.push_back(ascs_config_gaming_2); |
| |
| |
| // voice tx rx |
| codec_qos_config_voice_tx_rx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_voice_tx_rx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_voice_tx_rx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_16000; |
| codec_qos_config_voice_tx_rx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_voice_tx_rx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_voice_tx_rx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_voice_tx_rx.codec_config, 40); |
| codec_qos_config_voice_tx_rx.qos_config.cig_config = { |
| .cig_id = 3, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_voice_tx_rx.qos_config.cis_configs.push_back(cis_config_1_voice_tx_rx); |
| codec_qos_config_voice_tx_rx.qos_config.cis_configs.push_back(cis_config_2_voice_tx_rx); |
| |
| codec_qos_config_voice_tx_rx.qos_config.ascs_configs.push_back(ascs_config_voice); |
| |
| codec_qos_config_voice_tx_rx_2 = codec_qos_config_voice_tx_rx; |
| codec_qos_config_voice_tx_rx_2.qos_config.ascs_configs.clear(); |
| codec_qos_config_voice_tx_rx_2.qos_config.ascs_configs.push_back(ascs_config_voice_2); |
| |
| conn_info_media.stream_type.type = CONTENT_TYPE_MEDIA; |
| conn_info_media.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| conn_info_media.stream_type.direction = ASE_DIRECTION_SINK; |
| conn_info_media.codec_qos_config_pair.push_back(codec_qos_config_media_tx_1); |
| |
| conn_info_gaming.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_gaming.stream_type.audio_context = |
| CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_gaming.stream_type.direction = ASE_DIRECTION_SRC; |
| conn_info_gaming.codec_qos_config_pair.push_back(codec_qos_config_gaming_tx_rx); |
| |
| conn_info_voice_tx.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_tx.stream_type.audio_context = |
| CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_tx.stream_type.direction = ASE_DIRECTION_SINK; |
| conn_info_voice_tx.codec_qos_config_pair.push_back(codec_qos_config_voice_tx_rx); |
| |
| conn_info_voice_rx.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_rx.stream_type.audio_context = |
| CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_rx.stream_type.direction = ASE_DIRECTION_SRC; |
| conn_info_voice_rx.codec_qos_config_pair.push_back(codec_qos_config_voice_tx_rx); |
| |
| std::vector<StreamConnect> tri_streams; |
| tri_streams.push_back(conn_info_media); |
| tri_streams.push_back(conn_info_voice_tx); |
| tri_streams.push_back(conn_info_voice_rx); |
| |
| conn_info_media.codec_qos_config_pair.clear(); |
| conn_info_media.codec_qos_config_pair.push_back(codec_qos_config_media_tx_2); |
| |
| conn_info_voice_tx.codec_qos_config_pair.clear(); |
| conn_info_voice_tx.codec_qos_config_pair.push_back(codec_qos_config_voice_tx_rx_2); |
| |
| conn_info_voice_rx.codec_qos_config_pair.clear(); |
| conn_info_voice_rx.codec_qos_config_pair.push_back(codec_qos_config_voice_tx_rx_2); |
| |
| std::vector<StreamConnect> tri_streams_2; |
| tri_streams_2.push_back(conn_info_media); |
| tri_streams_2.push_back(conn_info_voice_tx); |
| tri_streams_2.push_back(conn_info_voice_rx); |
| |
| StreamType type_media = { .type = CONTENT_TYPE_MEDIA, |
| .audio_context = CONTENT_TYPE_MEDIA, |
| .direction = ASE_DIRECTION_SINK |
| }; |
| |
| StreamType type_voice_tx = { .type = CONTENT_TYPE_CONVERSATIONAL, |
| .audio_context = CONTENT_TYPE_CONVERSATIONAL, |
| .direction = ASE_DIRECTION_SINK |
| }; |
| |
| StreamType type_voice_rx = { .type = CONTENT_TYPE_CONVERSATIONAL, |
| .audio_context = CONTENT_TYPE_CONVERSATIONAL, |
| .direction = ASE_DIRECTION_SRC |
| }; |
| |
| |
| std::vector<StreamType> media_streams; |
| media_streams.push_back(type_media); |
| |
| std::vector<StreamType> gaming_tx_streams; |
| gaming_tx_streams.push_back(type_media); |
| |
| std::vector<StreamType> gaming_rx_streams; |
| gaming_rx_streams.push_back(type_voice_rx); |
| |
| std::vector<StreamType> voice_streams; |
| voice_streams.push_back(type_voice_tx); |
| voice_streams.push_back(type_voice_rx); |
| |
| std::vector<StreamType> all_three_streams; |
| all_three_streams.push_back(type_media); |
| all_three_streams.push_back(type_voice_tx); |
| all_three_streams.push_back(type_voice_rx); |
| |
| #if 0 |
| LOG(INFO) << __func__ << " going for generic test case"; |
| LOG(INFO) << __func__ << " going for connect with media tx and voice tx& rx"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, tri_streams); |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, tri_streams_2); |
| sleep(15); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect all 3 streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr, all_three_streams); |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_three_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for connect all 3 streams"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, tri_streams); |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, tri_streams_2); |
| |
| sleep(15); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect all 3 streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr, all_three_streams); |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_three_streams); |
| |
| sleep(5); |
| #endif |
| |
| LOG(INFO) << __func__ << " going for connect all 3 streams"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, tri_streams); |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, tri_streams_2); |
| |
| std::vector<StreamReconfig> reconf_streams; |
| std::vector<StreamReconfig> reconf_streams_2; |
| |
| StreamReconfig reconf_gaming_tx_info; |
| reconf_gaming_tx_info.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_tx_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_gaming_tx_info.codec_qos_config_pair. |
| push_back(codec_qos_config_gaming_tx); |
| |
| StreamReconfig reconf_gaming_tx_info_2; |
| reconf_gaming_tx_info_2.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_info_2.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_tx_info_2.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_gaming_tx_info_2.codec_qos_config_pair. |
| push_back(codec_qos_config_gaming_tx_2); |
| |
| StreamReconfig reconf_gaming_tx_rx_info; |
| reconf_gaming_tx_rx_info.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_rx_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_rx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_tx_rx_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_gaming_tx_rx_info.codec_qos_config_pair. |
| push_back(codec_qos_config_gaming_tx_rx); |
| |
| StreamReconfig reconf_gaming_tx_rx_info_2; |
| reconf_gaming_tx_rx_info_2.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_rx_info_2.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_rx_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_tx_rx_info_2.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_gaming_tx_rx_info_2.codec_qos_config_pair. |
| push_back(codec_qos_config_gaming_tx_rx_2); |
| |
| StreamReconfig reconf_gaming_rx_info; |
| reconf_gaming_rx_info.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_gaming_rx_info.stream_type.audio_context = |
| CONTENT_TYPE_CONVERSATIONAL; |
| reconf_gaming_rx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_rx_info.stream_type.direction = ASE_DIRECTION_SRC; |
| reconf_gaming_rx_info.codec_qos_config_pair. |
| push_back(codec_qos_config_gaming_rx); |
| |
| StreamReconfig reconf_gaming_rx_info_2; |
| reconf_gaming_rx_info_2.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_gaming_rx_info_2.stream_type.audio_context = |
| CONTENT_TYPE_CONVERSATIONAL; |
| reconf_gaming_rx_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_rx_info_2.stream_type.direction = ASE_DIRECTION_SRC; |
| reconf_gaming_rx_info_2.codec_qos_config_pair. |
| push_back(codec_qos_config_gaming_rx_2); |
| |
| StreamReconfig reconf_media_info; |
| reconf_media_info.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_media_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_media_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_media_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_media_info.codec_qos_config_pair.push_back(codec_qos_config_media_tx_1); |
| |
| StreamReconfig reconf_media_info_2; |
| reconf_media_info_2.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_media_info_2.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_media_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_media_info_2.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_media_info_2.codec_qos_config_pair.push_back(codec_qos_config_media_tx_2); |
| |
| |
| StreamReconfig reconf_voice_tx_info; |
| reconf_voice_tx_info.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_tx_info.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_tx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_voice_tx_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_voice_tx_info.codec_qos_config_pair. |
| push_back(codec_qos_config_voice_tx_rx); |
| |
| StreamReconfig reconf_voice_tx_info_2; |
| reconf_voice_tx_info_2.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_tx_info_2.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_tx_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_voice_tx_info_2.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_voice_tx_info_2.codec_qos_config_pair. |
| push_back(codec_qos_config_voice_tx_rx_2); |
| |
| StreamReconfig reconf_voice_rx_info; |
| reconf_voice_rx_info.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_rx_info.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_rx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_voice_rx_info.stream_type.direction = ASE_DIRECTION_SRC; |
| reconf_voice_rx_info.codec_qos_config_pair. |
| push_back(codec_qos_config_voice_tx_rx); |
| |
| StreamReconfig reconf_voice_rx_info_2; |
| reconf_voice_rx_info_2.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_rx_info_2.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_rx_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_voice_rx_info_2.stream_type.direction = ASE_DIRECTION_SRC; |
| reconf_voice_rx_info_2.codec_qos_config_pair. |
| push_back(codec_qos_config_voice_tx_rx_2); |
| |
| sleep(15); |
| LOG(INFO) << __func__ << " going for stream start 1 "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // switch to Gaming tx |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_gaming_tx_info_2); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // switch to media tx |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_media_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // switch to Gaming tx & rx |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_gaming_tx_rx_info); |
| reconf_streams.push_back(reconf_gaming_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_gaming_tx_rx_info_2); |
| reconf_streams_2.push_back(reconf_gaming_rx_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, gaming_tx_streams); |
| sUcastClientInterface->Start( bap_bd_addr, gaming_rx_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_tx_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_rx_streams); |
| |
| // switch to Gaming tx (2nd time) (4th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, gaming_tx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr, gaming_rx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_tx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_rx_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_gaming_tx_info.reconf_type = StreamReconfigType::QOS_CONFIG; |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_gaming_tx_info_2.reconf_type = StreamReconfigType::QOS_CONFIG; |
| reconf_streams_2.push_back(reconf_gaming_tx_info_2); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // switch to Gaming tx & rx (2nd time) (5th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_gaming_tx_rx_info.reconf_type = StreamReconfigType::QOS_CONFIG; |
| reconf_streams.push_back(reconf_gaming_tx_rx_info); |
| reconf_streams.push_back(reconf_gaming_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_gaming_tx_rx_info_2.reconf_type = StreamReconfigType::QOS_CONFIG; |
| reconf_streams_2.push_back(reconf_gaming_tx_rx_info_2); |
| reconf_streams_2.push_back(reconf_gaming_rx_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, gaming_tx_streams); |
| sUcastClientInterface->Start( bap_bd_addr, gaming_rx_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_tx_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_rx_streams); |
| |
| // switch to media tx (6th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, gaming_tx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr, gaming_rx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_tx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_rx_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_media_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // switch to voice tx & Rx (7th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_voice_rx_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, voice_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| // switch to gaming tx (8th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, voice_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_gaming_tx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_gaming_tx_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_streams_2.push_back(reconf_gaming_tx_info_2); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| |
| // switch to voice tx & Rx (9th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_voice_rx_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, voice_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| // switch to Gaming tx & rx (10th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, voice_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_gaming_tx_rx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_streams.push_back(reconf_gaming_tx_rx_info); |
| reconf_streams.push_back(reconf_gaming_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_gaming_tx_rx_info_2.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_streams_2.push_back(reconf_gaming_tx_rx_info_2); |
| reconf_streams_2.push_back(reconf_gaming_rx_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, gaming_tx_streams); |
| sUcastClientInterface->Start( bap_bd_addr, gaming_rx_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_tx_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_rx_streams); |
| |
| |
| // switch to voice tx & Rx (11th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, gaming_tx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr, gaming_rx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_tx_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_rx_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_voice_rx_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, voice_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| // switch to media tx (12th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, voice_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_media_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, media_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // switch to voice tx & Rx (13th) |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream stop 1 "; |
| sUcastClientInterface->Stop( bap_bd_addr, media_streams); |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| // reconfig the first stream |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| reconf_streams_2.clear(); |
| reconf_streams_2.push_back(reconf_voice_rx_info_2); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams_2); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream reconfgured .start "; |
| sUcastClientInterface->Start( bap_bd_addr, voice_streams); |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for stream disconnect 1 "; |
| sUcastClientInterface->Disconnect( bap_bd_addr, all_three_streams); |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_three_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for connect all 3 streams"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, tri_streams); |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, tri_streams_2); |
| |
| sleep(15); |
| LOG(INFO) << __func__ << "going for stream disconnect all 3 streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr, all_three_streams); |
| |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_three_streams); |
| |
| sleep(5); |
| |
| } else if(!strcmp(bap_test, "stereo_headset_dual_cis")) { |
| StreamConnect conn_info_media; |
| StreamConnect conn_info_gaming; |
| StreamConnect conn_info_voice_tx; |
| StreamConnect conn_info_voice_rx; |
| StreamConnect conn_info_media_recording; |
| |
| // reconfig information |
| CodecQosConfig codec_qos_config_media_tx_1; |
| CodecQosConfig codec_qos_config_media_tx_2; |
| CodecQosConfig codec_qos_config_gaming_tx_1; |
| CodecQosConfig codec_qos_config_gaming_tx_2; |
| CodecQosConfig codec_qos_config_gaming_tx_rx; |
| CodecQosConfig codec_qos_config_voice_tx_rx; |
| CodecQosConfig codec_qos_config_voice_tx_rx_2; |
| CodecQosConfig codec_qos_config_media_rx_1; |
| CodecQosConfig codec_qos_config_media_rx_2; |
| |
| CISConfig cis_config_1_media_tx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 155, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_2_media_tx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 155, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_1_media_tx_2 = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 310, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| |
| CISConfig cis_config_1_gaming_tx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_2_gaming_tx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_1_gaming_tx_2 = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 200, |
| .max_sdu_s_to_m = 0, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| |
| CISConfig cis_config_1_gaming_tx_rx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| CISConfig cis_config_2_gaming_tx_rx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 100, |
| .max_sdu_s_to_m = 40, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_1_voice_tx_rx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 80, |
| .max_sdu_s_to_m = 80, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| CISConfig cis_config_2_voice_tx_rx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 80, |
| .max_sdu_s_to_m = 80, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x02, |
| .rtn_s_to_m = 0x02 |
| }; |
| |
| CISConfig cis_config_1_media_rx = { |
| .cis_id = 0, |
| .max_sdu_m_to_s = 0, |
| .max_sdu_s_to_m = 100, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| |
| CISConfig cis_config_2_media_rx = { |
| .cis_id = 1, |
| .max_sdu_m_to_s = 0, |
| .max_sdu_s_to_m = 100, |
| .phy_m_to_s = 0x02, |
| .phy_s_to_m = 0x02, |
| .rtn_m_to_s = 0x05, |
| .rtn_s_to_m = 0x05 |
| }; |
| ASCSConfig ascs_config_1 = { |
| .cig_id = 1, |
| .cis_id = 0, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_2 = { |
| .cig_id = 1, |
| .cis_id = 1, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_gaming_1 = { |
| .cig_id = 1, |
| .cis_id = 0, |
| .bi_directional = true, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_gaming_2 = { |
| .cig_id = 1, |
| .cis_id = 1, |
| .bi_directional = true, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_voice_1 = { |
| .cig_id = 3, |
| .cis_id = 0, |
| .bi_directional = true, |
| .presentation_delay = {0x40, 0x9C, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_voice_2 = { |
| .cig_id = 3, |
| .cis_id = 1, |
| .bi_directional = true, |
| .presentation_delay = {0x40, 0x9C, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_media_rx_1 = { |
| .cig_id = 4, |
| .cis_id = 0, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| ASCSConfig ascs_config_media_rx_2 = { |
| .cig_id = 4, |
| .cis_id = 1, |
| .bi_directional = false, |
| .presentation_delay = {0x20, 0x4E, 0x00} |
| }; |
| |
| codec_qos_config_media_tx_1.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_media_tx_1.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_media_tx_1.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_media_tx_1.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_media_tx_1.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_media_tx_1.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_media_tx_1.codec_config, 155); |
| |
| codec_qos_config_media_tx_2 = codec_qos_config_media_tx_1; |
| UpdateOctsPerFrame(&codec_qos_config_media_tx_2.codec_config, 310); |
| |
| codec_qos_config_media_tx_1.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_media_tx_1.qos_config.cis_configs.push_back(cis_config_1_media_tx); |
| codec_qos_config_media_tx_1.qos_config.cis_configs.push_back(cis_config_2_media_tx); |
| |
| codec_qos_config_media_tx_1.qos_config.ascs_configs.push_back(ascs_config_1); |
| codec_qos_config_media_tx_1.qos_config.ascs_configs.push_back(ascs_config_2); |
| |
| codec_qos_config_media_tx_2.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 1, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_media_tx_2.qos_config.cis_configs.push_back(cis_config_1_media_tx_2); |
| |
| codec_qos_config_media_tx_2.qos_config.ascs_configs.push_back(ascs_config_1); |
| |
| codec_qos_config_gaming_tx_1.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_gaming_tx_1.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_gaming_tx_1.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_gaming_tx_1.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_gaming_tx_1.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_gaming_tx_1.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_gaming_tx_1.codec_config, 100); |
| |
| codec_qos_config_gaming_tx_2 = codec_qos_config_gaming_tx_1; |
| UpdateOctsPerFrame(&codec_qos_config_gaming_tx_2.codec_config, 200); |
| |
| codec_qos_config_gaming_tx_1.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_tx_1.qos_config.cis_configs.push_back(cis_config_1_gaming_tx); |
| codec_qos_config_gaming_tx_1.qos_config.cis_configs.push_back(cis_config_2_gaming_tx); |
| |
| codec_qos_config_gaming_tx_1.qos_config.ascs_configs.push_back(ascs_config_gaming_1); |
| codec_qos_config_gaming_tx_1.qos_config.ascs_configs.push_back(ascs_config_gaming_2); |
| |
| codec_qos_config_gaming_tx_2.qos_config.cig_config = { |
| .cig_id = 1, |
| .cis_count = 1, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_tx_2.qos_config.cis_configs.push_back(cis_config_1_gaming_tx_2); |
| |
| codec_qos_config_gaming_tx_2.qos_config.ascs_configs.push_back(ascs_config_gaming_1); |
| |
| codec_qos_config_gaming_tx_rx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_gaming_tx_rx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_gaming_tx_rx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_16000; |
| codec_qos_config_gaming_tx_rx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_gaming_tx_rx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_gaming_tx_rx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_gaming_tx_rx.codec_config, 40); |
| codec_qos_config_gaming_tx_rx.qos_config.cig_config = { |
| .cig_id = 2, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_gaming_tx_rx.qos_config.cis_configs.push_back(cis_config_1_gaming_tx_rx); |
| codec_qos_config_gaming_tx_rx.qos_config.cis_configs.push_back(cis_config_2_gaming_tx_rx); |
| |
| codec_qos_config_gaming_tx_rx.qos_config.ascs_configs.push_back(ascs_config_gaming_1); |
| |
| // voice tx rx |
| codec_qos_config_voice_tx_rx.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_voice_tx_rx.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_voice_tx_rx.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_32000; |
| codec_qos_config_voice_tx_rx.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_voice_tx_rx.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_voice_tx_rx.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_voice_tx_rx.codec_config, 80); |
| codec_qos_config_voice_tx_rx.qos_config.cig_config = { |
| .cig_id = 3, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_voice_tx_rx.qos_config.cis_configs.push_back(cis_config_1_voice_tx_rx); |
| codec_qos_config_voice_tx_rx.qos_config.cis_configs.push_back(cis_config_2_voice_tx_rx); |
| |
| codec_qos_config_voice_tx_rx.qos_config.ascs_configs.push_back(ascs_config_voice_1); |
| codec_qos_config_voice_tx_rx.qos_config.ascs_configs.push_back(ascs_config_voice_2); |
| |
| |
| codec_qos_config_media_rx_1.codec_config.codec_type = |
| CodecIndex::CODEC_INDEX_SOURCE_LC3; |
| codec_qos_config_media_rx_1.codec_config.codec_priority = |
| CodecPriority::CODEC_PRIORITY_DEFAULT; |
| codec_qos_config_media_rx_1.codec_config.sample_rate = |
| CodecSampleRate::CODEC_SAMPLE_RATE_48000; |
| codec_qos_config_media_rx_1.codec_config.channel_mode = |
| CodecChannelMode::CODEC_CHANNEL_MODE_MONO; |
| //Frame_Duration |
| UpdateFrameDuration(&codec_qos_config_media_rx_1.codec_config, |
| static_cast<uint8_t>(CodecFrameDuration::FRAME_DUR_10)); |
| // LC3_Blocks_Per_SDU |
| UpdateLc3BlocksPerSdu(&codec_qos_config_media_rx_1.codec_config, 1); |
| UpdateOctsPerFrame(&codec_qos_config_media_rx_1.codec_config, 100); |
| |
| codec_qos_config_media_rx_1.qos_config.cig_config = { |
| .cig_id = 4, |
| .cis_count = 2, |
| .packing = 0x01, // interleaved |
| .framing = 0x00, // unframed |
| .max_tport_latency_m_to_s = 0x000a, |
| .max_tport_latency_s_to_m = 0x000a, |
| .sdu_interval_m_to_s = {0x10, 0x27, 0x00}, |
| .sdu_interval_s_to_m = {0x10, 0x27, 0x00} |
| }; |
| |
| codec_qos_config_media_rx_1.qos_config.cis_configs.push_back(cis_config_1_media_rx); |
| codec_qos_config_media_rx_1.qos_config.cis_configs.push_back(cis_config_2_media_rx); |
| |
| codec_qos_config_media_rx_1.qos_config.ascs_configs.push_back(ascs_config_media_rx_1); |
| codec_qos_config_media_rx_1.qos_config.ascs_configs.push_back(ascs_config_media_rx_2); |
| |
| conn_info_media.stream_type.type = CONTENT_TYPE_MEDIA; |
| conn_info_media.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| conn_info_media.stream_type.direction = ASE_DIRECTION_SINK; |
| conn_info_media.codec_qos_config_pair.push_back(codec_qos_config_media_tx_1); |
| conn_info_media.codec_qos_config_pair.push_back(codec_qos_config_media_tx_2); |
| |
| conn_info_gaming.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_gaming.stream_type.audio_context = CONTENT_TYPE_GAME; |
| conn_info_gaming.stream_type.direction = ASE_DIRECTION_SRC; |
| conn_info_gaming.codec_qos_config_pair.push_back(codec_qos_config_gaming_tx_1); |
| |
| conn_info_voice_tx.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_tx.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_tx.stream_type.direction = ASE_DIRECTION_SINK; |
| conn_info_voice_tx.codec_qos_config_pair.push_back(codec_qos_config_voice_tx_rx); |
| |
| conn_info_voice_rx.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_rx.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| conn_info_voice_rx.stream_type.direction = ASE_DIRECTION_SRC; |
| conn_info_voice_rx.codec_qos_config_pair.push_back(codec_qos_config_voice_tx_rx); |
| |
| conn_info_media_recording.stream_type.type = CONTENT_TYPE_MEDIA; |
| conn_info_media_recording.stream_type.audio_context = CONTENT_TYPE_LIVE; |
| conn_info_media_recording.stream_type.direction = ASE_DIRECTION_SRC; |
| conn_info_media_recording.codec_qos_config_pair.push_back(codec_qos_config_media_rx_1); |
| |
| std::vector<StreamConnect> four_streams; |
| four_streams.push_back(conn_info_media); |
| four_streams.push_back(conn_info_media_recording); |
| four_streams.push_back(conn_info_voice_tx); |
| four_streams.push_back(conn_info_voice_rx); |
| |
| std::vector<StreamConnect> voice_conn_streams; |
| voice_conn_streams.push_back(conn_info_voice_tx); |
| voice_conn_streams.push_back(conn_info_voice_rx); |
| |
| std::vector<StreamConnect> media_conn_streams; |
| media_conn_streams.push_back(conn_info_media); |
| |
| StreamType type_media = { .type = CONTENT_TYPE_MEDIA, |
| .audio_context = CONTENT_TYPE_MEDIA, |
| .direction = ASE_DIRECTION_SINK |
| }; |
| |
| StreamType type_gaming_tx = { .type = CONTENT_TYPE_MEDIA, |
| .audio_context = CONTENT_TYPE_GAME, |
| .direction = ASE_DIRECTION_SINK |
| }; |
| |
| StreamType type_voice_tx = { .type = CONTENT_TYPE_CONVERSATIONAL, |
| .audio_context = CONTENT_TYPE_CONVERSATIONAL, |
| .direction = ASE_DIRECTION_SINK |
| }; |
| |
| StreamType type_voice_rx = { .type = CONTENT_TYPE_CONVERSATIONAL, |
| .audio_context = CONTENT_TYPE_CONVERSATIONAL, |
| .direction = ASE_DIRECTION_SRC |
| }; |
| |
| StreamType type_media_rx = { .type = CONTENT_TYPE_MEDIA, |
| .audio_context = CONTENT_TYPE_LIVE, |
| .direction = ASE_DIRECTION_SRC |
| }; |
| |
| std::vector<StreamType> media_streams; |
| media_streams.push_back(type_media); |
| |
| std::vector<StreamType> gaming_tx_streams; |
| gaming_tx_streams.push_back(type_gaming_tx); |
| |
| std::vector<StreamType> media_rx_streams; |
| media_rx_streams.push_back(type_media_rx); |
| |
| std::vector<StreamType> voice_streams; |
| voice_streams.push_back(type_voice_tx); |
| voice_streams.push_back(type_voice_rx); |
| |
| std::vector<StreamType> all_four_streams; |
| all_four_streams.push_back(type_media); |
| all_four_streams.push_back(type_voice_tx); |
| all_four_streams.push_back(type_voice_rx); |
| all_four_streams.push_back(type_media_rx); |
| |
| std::vector<StreamReconfig> reconf_streams; |
| |
| StreamReconfig reconf_media_info; |
| reconf_media_info.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_media_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_media_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_media_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_media_info.codec_qos_config_pair.push_back(codec_qos_config_media_tx_1); |
| reconf_media_info.codec_qos_config_pair.push_back(codec_qos_config_media_tx_2); |
| |
| StreamReconfig reconf_gaming_tx_info; |
| reconf_gaming_tx_info.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_info.stream_type.audio_context = CONTENT_TYPE_MEDIA; |
| reconf_gaming_tx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_gaming_tx_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_gaming_tx_info.codec_qos_config_pair.push_back(codec_qos_config_gaming_tx_1); |
| reconf_gaming_tx_info.codec_qos_config_pair.push_back(codec_qos_config_gaming_tx_2); |
| |
| StreamReconfig reconf_voice_tx_info; |
| reconf_voice_tx_info.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_tx_info.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_tx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_voice_tx_info.stream_type.direction = ASE_DIRECTION_SINK; |
| reconf_voice_tx_info.codec_qos_config_pair. |
| push_back(codec_qos_config_voice_tx_rx); |
| |
| StreamReconfig reconf_voice_rx_info; |
| reconf_voice_rx_info.stream_type.type = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_rx_info.stream_type.audio_context = CONTENT_TYPE_CONVERSATIONAL; |
| reconf_voice_rx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_voice_rx_info.stream_type.direction = ASE_DIRECTION_SRC; |
| reconf_voice_rx_info.codec_qos_config_pair. |
| push_back(codec_qos_config_voice_tx_rx); |
| |
| StreamReconfig reconf_media_rx_info; |
| reconf_media_rx_info.stream_type.type = CONTENT_TYPE_MEDIA; |
| reconf_media_rx_info.stream_type.audio_context = CONTENT_TYPE_LIVE; |
| reconf_media_rx_info.reconf_type = StreamReconfigType::CODEC_CONFIG; |
| reconf_media_rx_info.stream_type.direction = ASE_DIRECTION_SRC; |
| reconf_media_rx_info.codec_qos_config_pair.push_back(codec_qos_config_media_rx_1); |
| |
| LOG(INFO) << __func__ << " going for generic test case"; |
| LOG(INFO) << __func__ << " going for connect with voice tx and rx"; |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, four_streams); |
| |
| sleep(15); |
| |
| #if 0 |
| // Recording to music switch (12) |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for music stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << "going for music stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| //sleep(5); |
| LOG(INFO) << __func__ << "going for stream disconnect voice streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_four_streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for connect with voice tx and rx"; |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, four_streams); |
| |
| sleep(15); |
| |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for music stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| //sleep(5); |
| LOG(INFO) << __func__ << "going for stream disconnect voice streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_four_streams); |
| |
| sleep(10); |
| |
| |
| LOG(INFO) << __func__ << " going for connect with voice tx and rx"; |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, four_streams); |
| |
| sleep(15); |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_tx_info); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| |
| // Call Tx Rx to Gaming switch (4) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| sleep(5); |
| |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| |
| // Call Tx Rx to Gaming switch (4) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| //sleep(5); |
| LOG(INFO) << __func__ << "going for stream disconnect voice streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_four_streams); |
| |
| sleep(10); |
| |
| |
| LOG(INFO) << __func__ << " going for connect with voice tx and rx"; |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, four_streams); |
| sleep(15); |
| |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_tx_info); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| //sleep(5); |
| LOG(INFO) << __func__ << "going for stream disconnect voice streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_four_streams); |
| |
| sleep(10); |
| |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, four_streams); |
| |
| sleep(1); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect voice streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_four_streams); |
| |
| sleep(10); |
| |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, four_streams); |
| |
| sleep(15); |
| |
| #endif |
| #if 1 |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_tx_info); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| //usleep(200000); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| |
| // Call Tx Rx to Gaming switch (4) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| |
| // Call Tx Rx to Gaming switch (4) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| //usleep(200000); |
| LOG(INFO) << __func__ << "going for stream disconnect voice streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_four_streams); |
| |
| sleep(10); |
| |
| sUcastClientInterface->Connect( bap_bd_addr_2, true, four_streams); |
| #endif |
| |
| sleep(15); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| |
| // Music streaming |
| LOG(INFO) << __func__ << "going for media stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // music to gaming Tx switch (1) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for gaming stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_tx_streams); |
| |
| // Gaming Tx to music switch (2) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_tx_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for gaming stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| // music to Call Tx Rx switch (3) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_tx_info); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| |
| // Call Tx Rx to Gaming switch (4) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for gaming stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_tx_streams); |
| |
| |
| // Gaming to Cal Audio switch (5) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_tx_streams); |
| |
| sleep(5); |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_tx_info); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| |
| |
| // Cal Audio to music switch (6) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for music stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| |
| // music to Recording switch (7) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_rx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for recording stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_rx_streams); |
| |
| |
| // Recording to Gaming switch (8) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_rx_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_gaming_tx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for gaming stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, gaming_tx_streams); |
| |
| |
| // Gaming to Recording switch (9) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, gaming_tx_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_rx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for recording stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_rx_streams); |
| |
| |
| // Recording to Call Audio switch (10) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_rx_streams); |
| |
| sleep(5); |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_voice_tx_info); |
| reconf_streams.push_back(reconf_voice_rx_info); |
| LOG(INFO) << __func__ << " going for voice stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for voice stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, voice_streams); |
| |
| |
| // Call Audio to Recording switch (11) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, voice_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_rx_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for recording stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_rx_streams); |
| |
| |
| // Recording to music switch (12) |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_rx_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| reconf_streams.clear(); |
| reconf_streams.push_back(reconf_media_info); |
| sUcastClientInterface->Reconfigure( bap_bd_addr_2, reconf_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for music stream start "; |
| sUcastClientInterface->Start( bap_bd_addr_2, media_streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << "going for media stream stop "; |
| sUcastClientInterface->Stop( bap_bd_addr_2, media_streams); |
| |
| //sleep(5); |
| LOG(INFO) << __func__ << "going for stream disconnect voice streams "; |
| sUcastClientInterface->Disconnect( bap_bd_addr_2, all_four_streams); |
| |
| sleep(10); |
| |
| } else if(!strcmp(bap_test, "connect")) { |
| LOG(INFO) << __func__ << " going for connect test case"; |
| |
| for ( uint8_t i = 0; i < 5; i++) { |
| LOG(INFO) << __func__ << " iteration " << loghex(i); |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| usleep( i* 1000 * 1000); |
| LOG(INFO) << __func__ << " going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| } |
| } else if(!strcmp(bap_test, "release_in_streaming")) { |
| LOG(INFO) << __func__ << " going for release_in_streaming test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| |
| |
| } else if(!strcmp(bap_test, "release_in_enabling")) { |
| LOG(INFO) << __func__ << " going for release_in_enabling test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| usleep(150 *1000); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| |
| |
| } else if(!strcmp(bap_test, "release_in_disabling")) { |
| LOG(INFO) << __func__ << " going for release_in_disabling test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for stream stop"; |
| sUcastClientInterface->Stop( bap_bd_addr, start_streams); |
| |
| usleep(100 * 1000); |
| LOG(INFO) << __func__ << "going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| |
| } else if(!strcmp(bap_test, "disable_in_enabling")) { |
| LOG(INFO) << __func__ << " going for disable_in_enabling test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| usleep(200 * 1000); |
| LOG(INFO) << __func__ << "going for stream stop"; |
| sUcastClientInterface->Stop( bap_bd_addr, start_streams); |
| |
| } else if(!strcmp(bap_test, "disable_in_streaming")) { |
| LOG(INFO) << __func__ << " going for disable_in_streaming test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << "going for stream stop"; |
| sUcastClientInterface->Stop( bap_bd_addr, start_streams); |
| |
| } else if(!strcmp(bap_test, "release_in_codec_configured")) { |
| LOG(INFO) << __func__ << " going for release_in_codec_configured test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| usleep(2600 * 1000); |
| LOG(INFO) << __func__ << "going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| |
| } else if(!strcmp(bap_test, "release_in_qos_configured")) { |
| LOG(INFO) << __func__ << " going for release_in_qos_configured test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << "going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| |
| } else if(!strcmp(bap_test, "enable_in_qos_configured")) { |
| LOG(INFO) << __func__ << " going for enable_in_qos_configured test case"; |
| |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(10); |
| |
| LOG(INFO) << __func__ << "going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| } else if(!strcmp(bap_test, "start")) { |
| LOG(INFO) << __func__ << " going for start test case"; |
| |
| LOG(INFO) << __func__ << " going for stop while starting test case"; |
| |
| |
| for ( uint8_t i = 0; i < 5; i++) { |
| LOG(INFO) << __func__ << " iteration " << loghex(i); |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(5); |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| usleep( i* 200 * 1000); |
| LOG(INFO) << __func__ << " going for stream stop"; |
| sUcastClientInterface->Stop( bap_bd_addr, start_streams); |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| } |
| |
| LOG(INFO) << __func__ << " going for disconnect while starting test case"; |
| |
| for ( uint8_t i = 0; i < 5; i++) { |
| LOG(INFO) << __func__ << " iteration " << loghex(i); |
| LOG(INFO) << __func__ << " going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| usleep( i* 200 * 1000); |
| LOG(INFO) << __func__ << " going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| sleep(5); |
| } |
| |
| } else if(!strcmp(bap_test, "stop")) { |
| LOG(INFO) << __func__ << " going for stop test case"; |
| LOG(INFO) << __func__ << " going for connect"; |
| |
| for ( uint8_t i = 0; i < 5; i++) { |
| LOG(INFO) << __func__ << " iteration " << loghex(i); |
| LOG(INFO) << __func__ << " going for disconnect while stopping"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream stop"; |
| sUcastClientInterface->Stop( bap_bd_addr, start_streams); |
| usleep( i* 200 * 1000); |
| |
| LOG(INFO) << __func__ << " going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| } |
| |
| } else if(!strcmp(bap_test, "stop")) { |
| LOG(INFO) << __func__ << " going for stop test case"; |
| LOG(INFO) << __func__ << " going for connect"; |
| |
| for ( uint8_t i = 0; i < 5; i++) { |
| LOG(INFO) << __func__ << " iteration " << loghex(i); |
| LOG(INFO) << __func__ << " going for disconnect while stopping"; |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream start"; |
| sUcastClientInterface->Start( bap_bd_addr, start_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream stop"; |
| sUcastClientInterface->Stop( bap_bd_addr, start_streams); |
| usleep( i* 200 * 1000); |
| |
| LOG(INFO) << __func__ << " going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| } |
| } else if(!strcmp(bap_test, "reconfigure")) { |
| LOG(INFO) << __func__ << " going for reconfigure test case"; |
| LOG(INFO) << __func__ << " going for connect"; |
| |
| sUcastClientInterface->Connect( bap_bd_addr, true, streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream codec reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream qos reconfig"; |
| sUcastClientInterface->Reconfigure( bap_bd_addr, reconf_qos_streams); |
| |
| sleep(5); |
| |
| LOG(INFO) << __func__ << " going for stream disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr, start_streams); |
| |
| } |
| |
| LOG(INFO) << __func__ << " Test completed"; |
| #if 0 |
| sleep(2); |
| LOG(INFO) << __func__ << "going for connect"; |
| sUcastClientInterface->Connect( bap_bd_addr); |
| sleep(7); |
| LOG(INFO) << __func__ << "going for discovery"; |
| sUcastClientInterface->StartDiscovery( bap_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for getAudiocontexts"; |
| sUcastClientInterface->GetAvailableAudioContexts( bap_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for disconnect"; |
| sUcastClientInterface->Disconnect( bap_bd_addr); |
| sleep(1); |
| sUcastClientInterface->Cleanup(); |
| sleep(1); |
| sUcastClientInterface->Init(&sUcastClientCallbacks); |
| sleep(1); |
| LOG(INFO) << __func__ << "going for connect 2 "; |
| sUcastClientInterface->Connect( bap_bd_addr); |
| sleep(7); |
| LOG(INFO) << __func__ << "going for discovery 2"; |
| sUcastClientInterface->StartDiscovery( bap_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for getAudiocontexts 2"; |
| sUcastClientInterface->GetAvailableAudioContexts( bap_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for disconnect 2"; |
| sUcastClientInterface->Disconnect( bap_bd_addr); |
| sleep(1); |
| sUcastClientInterface->Cleanup(); |
| #endif |
| } |
| |
| bool test_bap_uclient () { |
| RawAddress::FromString("00:02:5b:00:ff:00", bap_bd_addr); |
| test_thread = thread_new("test_bap_uclient"); |
| LOG(INFO) << __func__ << "going for test setup"; |
| thread_post(test_thread, event_test_bap_uclient, NULL); |
| return true; |
| } |
| |
| // PACS related test code |
| using bluetooth::bap::pacs::PacsClientInterface; |
| using bluetooth::bap::pacs::PacsClientCallbacks; |
| |
| static PacsClientInterface* sPacsClientInterface = nullptr; |
| static uint16_t pacs_client_id = 0; |
| static RawAddress pac_bd_addr; |
| |
| class PacsClientCallbacksImpl : public PacsClientCallbacks { |
| public: |
| ~PacsClientCallbacksImpl() = default; |
| void OnInitialized(int status, |
| int client_id) override { |
| LOG(WARNING) << __func__ << client_id; |
| pacs_client_id = client_id; |
| } |
| void OnConnectionState(const RawAddress& bd_addr, |
| ConnectionState state) override { |
| LOG(WARNING) << __func__; |
| if(state == ConnectionState::CONNECTED) { |
| LOG(WARNING) << __func__ << "connected"; |
| } else if(state == ConnectionState::DISCONNECTED) { |
| LOG(WARNING) << __func__ << "Disconnected"; |
| } |
| |
| } |
| void OnAudioContextAvailable(const RawAddress& bd_addr, |
| uint32_t available_contexts) override { |
| LOG(INFO) << __func__; |
| } |
| void OnSearchComplete(int status, const RawAddress& address, |
| std::vector<bluetooth::bap::pacs::CodecConfig> sink_pac_records, |
| std::vector<bluetooth::bap::pacs::CodecConfig> src_pac_records, |
| uint32_t sink_locations, |
| uint32_t src_locations, |
| uint32_t available_contexts, |
| uint32_t supported_contexts) override { |
| LOG(WARNING) << __func__; |
| } |
| }; |
| |
| static PacsClientCallbacksImpl sPacsClientCallbacks; |
| |
| static void event_test_pacs(UNUSED_ATTR void* context) { |
| sPacsClientInterface = btif_pacs_client_get_interface(); |
| sPacsClientInterface->Init(&sPacsClientCallbacks); |
| sleep(1); |
| LOG(INFO) << __func__ << "going for connect"; |
| sPacsClientInterface->Connect(pacs_client_id, pac_bd_addr); |
| sleep(7); |
| LOG(INFO) << __func__ << "going for discovery"; |
| sPacsClientInterface->StartDiscovery(pacs_client_id, pac_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for getAudiocontexts"; |
| sPacsClientInterface->GetAvailableAudioContexts(pacs_client_id, pac_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for disconnect"; |
| sPacsClientInterface->Disconnect(pacs_client_id, pac_bd_addr); |
| |
| sleep(2); |
| LOG(INFO) << __func__ << "going for connect"; |
| sPacsClientInterface->Connect(pacs_client_id, pac_bd_addr); |
| sleep(7); |
| LOG(INFO) << __func__ << "going for discovery"; |
| sPacsClientInterface->StartDiscovery(pacs_client_id, pac_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for getAudiocontexts"; |
| sPacsClientInterface->GetAvailableAudioContexts(pacs_client_id, pac_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for disconnect"; |
| sPacsClientInterface->Disconnect(pacs_client_id, pac_bd_addr); |
| |
| sleep(1); |
| sPacsClientInterface->Cleanup(pacs_client_id); |
| |
| sleep(1); |
| |
| sPacsClientInterface->Init(&sPacsClientCallbacks); |
| sleep(1); |
| LOG(INFO) << __func__ << "going for connect 2 "; |
| sPacsClientInterface->Connect(pacs_client_id, pac_bd_addr); |
| sleep(7); |
| LOG(INFO) << __func__ << "going for discovery 2"; |
| sPacsClientInterface->StartDiscovery(pacs_client_id, pac_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for getAudiocontexts 2"; |
| sPacsClientInterface->GetAvailableAudioContexts(pacs_client_id, pac_bd_addr); |
| sleep(2); |
| LOG(INFO) << __func__ << "going for disconnect 2"; |
| sPacsClientInterface->Disconnect(pacs_client_id, pac_bd_addr); |
| |
| sleep(1); |
| sPacsClientInterface->Cleanup(pacs_client_id); |
| |
| } |
| |
| bool test_pacs (RawAddress& bd_addr) { |
| |
| test_thread = thread_new("test_pacs"); |
| pac_bd_addr = bd_addr; |
| thread_post(test_thread, event_test_pacs, NULL); |
| return true; |
| } |