From c4b68b02de3558677c0e4fb077daae5385e9378a Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Wed, 25 Mar 2026 20:32:13 +0530 Subject: [PATCH 01/35] pal: configs: update speaker tmic position as per tunning. update speaker tmic position as per tunning requriements. AMIC4 to AMIC3(top right MIC). Signed-off-by: ffrancis --- configs/qcom/mobile/art/mixer_paths_art_qrd.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/configs/qcom/mobile/art/mixer_paths_art_qrd.xml b/configs/qcom/mobile/art/mixer_paths_art_qrd.xml index 5c649bbf..96d0adbf 100644 --- a/configs/qcom/mobile/art/mixer_paths_art_qrd.xml +++ b/configs/qcom/mobile/art/mixer_paths_art_qrd.xml @@ -1222,17 +1222,17 @@ - + - + - - - - - - + + + + + + From 6462781ebccdfd7bdde317f8773115fed667272b Mon Sep 17 00:00:00 2001 From: Afroza Nasrin Date: Wed, 28 Jan 2026 15:44:18 +0530 Subject: [PATCH 02/35] pal : Check sound card state in stream create Move the sound card readiness check from Stream constructor to Stream::create() so we don't call child/base class constructors or allocate resources when the card is offline. Signed-off-by: ffrancis --- stream/src/Stream.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/stream/src/Stream.cpp b/stream/src/Stream.cpp index 2f3333bd..73716e47 100644 --- a/stream/src/Stream.cpp +++ b/stream/src/Stream.cpp @@ -52,12 +52,7 @@ std::mutex Stream::mBaseStreamMutex; std::mutex Stream::pauseMutex; Stream::Stream() { - rm = ResourceManager::getInstance(); - if (PAL_CARD_STATUS_DOWN(rm->getSoundCardState())) { - PAL_ERR(LOG_TAG, "Error:Sound card offline/standby, can not create stream"); - usleep(SSR_RECOVERY); - throw std::runtime_error("Sound card offline/standby"); - } + } Stream::~Stream(){ @@ -112,6 +107,13 @@ Stream* Stream::create(struct pal_stream_attributes *sAttr, struct pal_device *d } PAL_VERBOSE(LOG_TAG,"get RM instance success and noOfDevices %d \n", noOfDevices); + /* check sound card status */ + if (PAL_CARD_STATUS_DOWN(rm->getSoundCardState())) { + PAL_ERR(LOG_TAG, "Error:Sound card offline/standby, can not create stream"); + usleep(SSR_RECOVERY); + goto exit; + } + palDevsAttr = (pal_device *)calloc(noOfDevices, sizeof(struct pal_device)); if (!palDevsAttr) { PAL_ERR(LOG_TAG, "palDevsAttr not created"); From b663a0fc517b016467d510d4dc2233f370b79bf7 Mon Sep 17 00:00:00 2001 From: "Huang, Yidong" Date: Wed, 1 Apr 2026 17:25:22 +0800 Subject: [PATCH 03/35] configs: art: enable life logger by default Enable life logger by default so that V2 apis will be used by ASR/SDZ. Also correct tagID used when getting module instance id for ASR/SDZ v2 event registration. Signed-off-by: ffrancis --- configs/qcom/mobile/art/resourcemanager_art_cdp.xml | 2 +- configs/qcom/mobile/art/resourcemanager_art_mtp.xml | 2 +- configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml | 2 +- configs/qcom/mobile/art/resourcemanager_art_qrd.xml | 2 +- configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml | 2 +- .../ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp | 8 +++++--- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/configs/qcom/mobile/art/resourcemanager_art_cdp.xml b/configs/qcom/mobile/art/resourcemanager_art_cdp.xml index e38e429d..c9cb3ae9 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_cdp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_cdp.xml @@ -1823,7 +1823,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_mtp.xml b/configs/qcom/mobile/art/resourcemanager_art_mtp.xml index 16a345c6..5510722b 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_mtp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_mtp.xml @@ -1851,7 +1851,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml b/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml index 42443d4b..8e36d633 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml @@ -1851,7 +1851,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_qrd.xml b/configs/qcom/mobile/art/resourcemanager_art_qrd.xml index 9eb68856..8b164a87 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_qrd.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_qrd.xml @@ -1852,7 +1852,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml b/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml index 25d210cc..0ec6b7d0 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml @@ -1867,7 +1867,7 @@ - + diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp index 9a29fa88..e485899c 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp +++ b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp @@ -150,19 +150,21 @@ uint32_t getMiid(SessionAlsaPcm* session, uint64_t eventId, mixer* mxr, case EVENT_ID_SH_MEM_PUSH_MODE_EOS_MARKER: tagId = SHMEM_ENDPOINT; break; - case EVENT_ID_ACD_DETECTION_EVENT : + case EVENT_ID_ACD_DETECTION_EVENT: tagId = CONTEXT_DETECTION_ENGINE; break; - case EVENT_ID_ASR_OUTPUT : + case EVENT_ID_ASR_OUTPUT: + case EVENT_ID_ASR_OUTPUT_V2: tagId = TAG_MODULE_ASR; break; case EVENT_ID_SDZ_OUTPUT: + case EVENT_ID_SDZ_OUTPUT_V2: tagId = TAG_MODULE_SDZ; break; case EVENT_ID_SH_MEM_PULL_PUSH_MODE_WATERMARK: tagId = SHMEM_ENDPOINT; break; - default : + default: PAL_ERR(LOG_TAG, "Event id %x not handled!!!", eventId); } From fcfda4758b8f6159b1131a9a56034eeb20953e01 Mon Sep 17 00:00:00 2001 From: Sairam Peri Date: Thu, 2 Apr 2026 14:27:16 +0530 Subject: [PATCH 04/35] session: pcm: fix the get tagged ModuleInfo failure In the getTagsWithModuleInfo api we are fetching backends based on the input or output dierection. But UPD being bi-deirection it is faiing these checks and unable to fetch the module tag. Hence add the check for UPD to support bi-dorectional streams. Signed-off-by: ffrancis --- session/SessionAlsaPcm/src/SessionAlsaPcm.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp b/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp index 2d94d938..59463511 100644 --- a/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp +++ b/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp @@ -3323,7 +3323,11 @@ int SessionAlsaPcm::getTagsWithModuleInfo(custom_payload_uc_info_t* uc_info, } - if (uc_info->direction == PAL_AUDIO_INPUT) { + if (uc_info->pal_stream_type == PAL_STREAM_SENSOR_PCM_RENDERER){ + status = SessionAlsaUtils::getTagsWithModuleInfo(mixer, DeviceId, + rxAifBackEnds[0].second.data(), payload); + } else if (uc_info->direction == PAL_AUDIO_INPUT || + uc_info->direction == PAL_AUDIO_INPUT_OUTPUT ) { status = SessionAlsaUtils::getTagsWithModuleInfo(mixer, DeviceId, txAifBackEnds[0].second.data(), payload); } else if (uc_info->direction == PAL_AUDIO_OUTPUT) { From 663401c05df8986c7915521108c04ac3305c4efe Mon Sep 17 00:00:00 2001 From: Saketh Cherukuri Date: Fri, 3 Apr 2026 12:18:47 +0530 Subject: [PATCH 05/35] configs: QCP RM changes: replace Connectivity proxy with Slimbus pal: configs: QCP: Resource Manager changes to replace Connectivity proxy with Slimbus Replaced backend names Signed-off-by: ffrancis --- ...urcemanager_hamoa_x1e80100_qcp_wsa884x.xml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml b/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml index 5512e7e2..4c7cca5e 100644 --- a/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml +++ b/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml @@ -36,7 +36,7 @@ - + @@ -473,7 +473,7 @@ PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET - BTFM_PROXY-TX-0 + SLIM-DEV1-TX-7 1 1 8000 @@ -643,7 +643,7 @@ PAL_DEVICE_IN_BLUETOOTH_A2DP - BTFM_PROXY-TX-0 + SLIM-DEV1-TX-7 1 1 bt-a2dp-mic @@ -652,7 +652,7 @@ PAL_DEVICE_IN_BLUETOOTH_BLE - BTFM_PROXY-TX-0 + SLIM-DEV1-TX-7 1 1 bt-ble-mic @@ -745,7 +745,7 @@ PAL_DEVICE_IN_BLUETOOTH_HFP - BTFM_PROXY-TX-1 + SLIM-DEV1-TX-7 1 1 8000 @@ -953,7 +953,7 @@ PAL_DEVICE_OUT_BLUETOOTH_A2DP - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-a2dp @@ -966,7 +966,7 @@ PAL_DEVICE_OUT_BLUETOOTH_BLE - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-ble @@ -979,7 +979,7 @@ PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-ble @@ -988,7 +988,7 @@ PAL_DEVICE_OUT_BLUETOOTH_SCO - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-sco @@ -1187,7 +1187,7 @@ PAL_DEVICE_OUT_BLUETOOTH_HFP - BTFM_PROXY-RX-1 + SLIM-DEV1-RX-7 1 1 bt-hfp From fd8378f2985c5af729d5c789aef2703562ddbefa Mon Sep 17 00:00:00 2001 From: Ajender Reddy Date: Thu, 2 Apr 2026 16:15:04 +0530 Subject: [PATCH 06/35] Bluetooth: treat HFP disconnection as always successful Audio HAL models BT SCO/HFP input and output as separate devices, while BTHost maintains a single HFP offload session shared by both directions. As a result, disconnect events can arrive out of order, with one stream still active when the other is being torn down. Previously, HFP close/open paths propagated failures in these cases, causing spurious errors during normal connect or disconnect sequences. This change makes HFP lifecycle handling more tolerant by: - Treating repeated open requests as successful and idempotent. - Allowing close to fail internally when the session is still in use, while callers explicitly ignore the close status for HFP disconnects. - Adding clearer logging to reflect already-open or still-in-use states. These updates prevent erroneous failure reporting when input and output streams are disconnected at different times, while preserving correct state management inside the HFP profile. Signed-off-by: ffrancis --- device/Bluetooth/internal/HFPProfile.cpp | 12 ++++++------ device/Bluetooth/src/Bluetooth.cpp | 6 +++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/device/Bluetooth/internal/HFPProfile.cpp b/device/Bluetooth/internal/HFPProfile.cpp index 346a6de4..7d8f24dd 100644 --- a/device/Bluetooth/internal/HFPProfile.cpp +++ b/device/Bluetooth/internal/HFPProfile.cpp @@ -72,18 +72,16 @@ Status HFPProfile::open() noexcept { std::lock_guard lock(mLock); PAL_INFO(LOG_TAG, "current state: %s, start count: %d", toString(mState).c_str(), mStreamCounter); - if (mState == State::OPENED) { - return Status::OK; - } - // CHECK(mState == State::CLOSED); if (mState == State::CLOSED) { auto ret = TIME_LOG(sBTHostAPI->audio_stream_open_api(HFP_HARDWARE_OFFLOAD_DATAPATH)); // CHECK(ret == 0); mState = State::OPENED; mStreamCounter = 0; return Status::OK; + } else { + PAL_INFO(LOG_TAG, ": already opened"); + return Status::OK; } - return Status::FAILED; } Status HFPProfile::start() noexcept { @@ -144,8 +142,10 @@ Status HFPProfile::close() noexcept { mState = State::CLOSED; mStreamCounter = 0; return Status::OK; + } else { + PAL_ERR(LOG_TAG, ":HFP is still used"); + return Status::FAILED; } - return Status::FAILED; } std::optional HFPProfile::getCodec() noexcept { diff --git a/device/Bluetooth/src/Bluetooth.cpp b/device/Bluetooth/src/Bluetooth.cpp index 4187f7ce..b7e3f16c 100644 --- a/device/Bluetooth/src/Bluetooth.cpp +++ b/device/Bluetooth/src/Bluetooth.cpp @@ -2773,7 +2773,11 @@ int32_t BtSco::setDeviceParameter(uint32_t param_id, void *param) status = openBTHost(); } else { // close BTHost with HFP - status = closeBTHost(); + /* ignore status; + * disconnection for OUTPUT may arrive later where a INPUT + * stream is still active or vice versa. + */ + closeBTHost(); } break; } From 679dc4e7ee9ee5eec84c52f464c0e08b7788adc7 Mon Sep 17 00:00:00 2001 From: "Huang, Yidong" Date: Fri, 3 Apr 2026 15:19:33 +0800 Subject: [PATCH 07/35] pal: update default asr config for lifelogger Update default asr config to have continuous mode enabled for lifelogger. Signed-off-by: ffrancis --- .../mobile/art/resourcemanager_art_cdp.xml | 2 +- .../mobile/art/resourcemanager_art_mtp.xml | 2 +- .../art/resourcemanager_art_mtp_qmp.xml | 2 +- .../mobile/art/resourcemanager_art_qrd.xml | 2 +- .../art/resourcemanager_art_qrd_qmp.xml | 2 +- utils/inc/ASRPlatformInfo.h | 3 -- utils/src/ASRPlatformInfo.cpp | 30 +++++++++---------- 7 files changed, 20 insertions(+), 23 deletions(-) diff --git a/configs/qcom/mobile/art/resourcemanager_art_cdp.xml b/configs/qcom/mobile/art/resourcemanager_art_cdp.xml index c9cb3ae9..a4140eae 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_cdp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_cdp.xml @@ -1835,7 +1835,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_mtp.xml b/configs/qcom/mobile/art/resourcemanager_art_mtp.xml index 5510722b..e19a1a03 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_mtp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_mtp.xml @@ -1863,7 +1863,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml b/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml index 8e36d633..2866ae35 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml @@ -1863,7 +1863,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_qrd.xml b/configs/qcom/mobile/art/resourcemanager_art_qrd.xml index 8b164a87..b896df77 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_qrd.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_qrd.xml @@ -1864,7 +1864,7 @@ - + diff --git a/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml b/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml index 0ec6b7d0..8eb3de09 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml @@ -1879,7 +1879,7 @@ - + diff --git a/utils/inc/ASRPlatformInfo.h b/utils/inc/ASRPlatformInfo.h index cb9590e7..7e1e1c3f 100644 --- a/utils/inc/ASRPlatformInfo.h +++ b/utils/inc/ASRPlatformInfo.h @@ -97,9 +97,6 @@ class ASRDefaultConfig : public SoundTriggerXml void HandleEndTag(struct xml_userdata *data, const std::string& tag); int32_t GetDefaultASRConfig(struct pal_asr_config *config); - -private: - struct pal_asr_config asr_config_; }; class ASRStreamConfig : public SoundTriggerXml diff --git a/utils/src/ASRPlatformInfo.cpp b/utils/src/ASRPlatformInfo.cpp index 86feaee5..95fb628a 100644 --- a/utils/src/ASRPlatformInfo.cpp +++ b/utils/src/ASRPlatformInfo.cpp @@ -37,6 +37,7 @@ #define LOG_TAG "PAL: ASRPlatformInfo" +static struct pal_asr_config default_asr_config = {0}; void ASRCommonConfig::HandleStartTag(const std::string& tag, const char** attribs) { @@ -108,31 +109,31 @@ void ASRDefaultConfig::HandleStartTag(const std::string& tag, const char** attri if (tag == "param") { if (key == "input_language_code") { - asr_config_.input_language_code = std::stoi(value); + default_asr_config.input_language_code = std::stoi(value); } else if (key == "output_language_code") { - asr_config_.output_language_code = std::stoi(value); + default_asr_config.output_language_code = std::stoi(value); } else if (key == "enable_language_detection") { - asr_config_.enable_language_detection = (value == "true"); + default_asr_config.enable_language_detection = (value == "true"); } else if (key == "enable_translation") { - asr_config_.enable_translation = (value == "true"); + default_asr_config.enable_translation = (value == "true"); } else if (key == "enable_continuous_mode") { - asr_config_.enable_continuous_mode = (value == "true"); + default_asr_config.enable_continuous_mode = (value == "true"); } else if (key == "enable_partial_transcription") { - asr_config_.enable_partial_transcription = (value == "true"); + default_asr_config.enable_partial_transcription = (value == "true"); } else if (key == "enable_logger_mode") { - asr_config_.enable_logger_mode = (value == "true"); + default_asr_config.enable_logger_mode = (value == "true"); } else if (key == "enable_timestamp") { - asr_config_.enable_timestamp = (value == "true"); + default_asr_config.enable_timestamp = (value == "true"); } else if (key == "enable_speaker_diarization") { - asr_config_.enable_speaker_diarization = (value == "true"); + default_asr_config.enable_speaker_diarization = (value == "true"); } else if (key == "threshold") { - asr_config_.threshold = std::stoi(value); + default_asr_config.threshold = std::stoi(value); } else if (key == "timeout_duration") { - asr_config_.timeout_duration = std::stoi(value); + default_asr_config.timeout_duration = std::stoi(value); } else if (key == "silence_detection_duration") { - asr_config_.silence_detection_duration = std::stoi(value); + default_asr_config.silence_detection_duration = std::stoi(value); } else if (key == "outputBufferMode") { - asr_config_.outputBufferMode = (value == "true"); + default_asr_config.outputBufferMode = (value == "true"); } else { PAL_ERR(LOG_TAG, "Invalid attribute %s", key.c_str()); } @@ -148,7 +149,6 @@ void ASRDefaultConfig::HandleEndTag(struct xml_userdata *data, const std::string ASRDefaultConfig::ASRDefaultConfig() { - memset(&asr_config_, 0, sizeof(asr_config_)); } int32_t ASRDefaultConfig::GetDefaultASRConfig(struct pal_asr_config *config) @@ -158,7 +158,7 @@ int32_t ASRDefaultConfig::GetDefaultASRConfig(struct pal_asr_config *config) return -EINVAL; } - memcpy(config, &asr_config_, sizeof(asr_config_)); + memcpy(config, &default_asr_config, sizeof(default_asr_config)); return 0; } From 99c6338f87e423eaf57448542365014de6e1d807 Mon Sep 17 00:00:00 2001 From: Ankit Mishra Date: Mon, 6 Apr 2026 13:09:37 +0530 Subject: [PATCH 08/35] PAL: In batch mode read only notified bytes GSL engine was checking current mmap position while calculating bytes to read which happens to be more than, what was notified to apk, and apk reads only notified number of bytes, due to which in next event some bytes were missed,as next read will start of current mmap position. Add a check if batch mode is there, then instead of calculating based on mmap position, calculate based on notified bytes. Signed-off-by: ffrancis --- .../src/SoundTriggerEngineGsl.cpp | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp b/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp index 7de81826..a09c93a5 100644 --- a/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp +++ b/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp @@ -222,6 +222,7 @@ int32_t SoundTriggerEngineGsl::ReadMmapBufWriteToRingBuf(size_t& offset, size_t size_t size = 0; PAL_DBG(LOG_TAG, "Bytes to read and write in ring buffer is : %d", size_to_read); + PAL_DBG(LOG_TAG, "Offset : %d, mmap write position : %d", offset, mmap_write_position_); if (offset + size_to_read <= mmap_buffer_size_) { size = buffer_->write((void *)((uint8_t *)mmap_buffer_.buffer + offset), size_to_read); if (vui_ptfm_info_->GetEnableDebugDumps()) { @@ -234,7 +235,7 @@ int32_t SoundTriggerEngineGsl::ReadMmapBufWriteToRingBuf(size_t& offset, size_t mmap_buffer_size_ - offset); if (vui_ptfm_info_->GetEnableDebugDumps()) { ST_DBG_FILE_WRITE(dsp_output_fd, (void *)((uint8_t *)mmap_buffer_.buffer + offset), - size_to_read); + mmap_buffer_size_ - offset); } size += buffer_->write((void *)mmap_buffer_.buffer, size_to_read + offset - mmap_buffer_size_); @@ -245,7 +246,8 @@ int32_t SoundTriggerEngineGsl::ReadMmapBufWriteToRingBuf(size_t& offset, size_t offset = size_to_read + offset - mmap_buffer_size_; } mmap_write_position_ += BytesToFrames(size_to_read); - PAL_DBG(LOG_TAG, "%d written to ring buffer", size); + PAL_DBG(LOG_TAG, "Bytes written to ring buffer : %d, mmap write position : %d", + size, mmap_write_position_); return 0; } @@ -410,11 +412,17 @@ int32_t SoundTriggerEngineGsl::StartBuffering(StreamSoundTrigger *s) { ATRACE_ASYNC_BEGIN("stEngine: lab read", (int32_t)module_type_); #endif if (mmap_buffer_size_ != 0) { - status = BytesToRead(s, size_to_read); - if (status) { - PAL_ERR(LOG_TAG, "Failed to get bytes to read"); - status = -EINVAL; - goto exit; + if (batch_mode_) { + param.data = &size_to_read; + vui_intf_->GetParameter(PARAM_MMAP_BYTES_TO_READ, ¶m); + PAL_INFO(LOG_TAG, "Bytes to read : %d", size_to_read); + } else { + status = BytesToRead(s, size_to_read); + if (status) { + PAL_ERR(LOG_TAG, "Failed to get bytes to read"); + status = -EINVAL; + goto exit; + } } if (size_to_read == 0) { retry_cnt++; From 80fa6963ed479b08710c75298633c8b3ae58ab95 Mon Sep 17 00:00:00 2001 From: Yuhui Zhao Date: Fri, 27 Mar 2026 17:09:46 +0800 Subject: [PATCH 09/35] PAL: separate fd ownership for Binder shared memory pal_stream_set_param() passes payload via shared memory fd. Reusing the same fd with ScopedFileDescriptor could close an fd already owned by the Binder Parcel, causing SIGABRT. Duplicate the fd so local wrapper and Binder manage their lifetimes independently. Signed-off-by: ffrancis --- ipc/aidl/client/PalClientWrapper.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ipc/aidl/client/PalClientWrapper.cpp b/ipc/aidl/client/PalClientWrapper.cpp index 7dfc968b..e8a18345 100644 --- a/ipc/aidl/client/PalClientWrapper.cpp +++ b/ipc/aidl/client/PalClientWrapper.cpp @@ -415,7 +415,8 @@ int32_t pal_stream_set_param(pal_stream_handle_t *stream_handle, uint32_t param_ if (memPayload) { PalParamPayloadShmem payload; memcpy(memPayload, param_payload->payload, param_payload->payload_size); - payload.fd = ScopedFileDescriptor(sharedFd); + int parcelFd = dup(sharedFd); + payload.fd = ScopedFileDescriptor(parcelFd); payload.payloadSize = param_payload->payload_size; auto aidlStreamHandle = convertLegacyHandleToAidlHandle(stream_handle); status = statusTFromBinderStatus( @@ -753,4 +754,4 @@ int32_t pal_cshm_dealloc(pal_cshm_id_t memID) { RETURN_IF_PAL_SERVICE_NOT_REGISTERED(client); return statusTFromBinderStatus(client->ipc_pal_cshm_dealloc(memID)); -} \ No newline at end of file +} From f6950ac9d2d48b9a1e1ab49a7edf4658011c4f59 Mon Sep 17 00:00:00 2001 From: Ravulapati Vishnu Vardhan Rao Date: Thu, 31 Jul 2025 22:09:22 +0530 Subject: [PATCH 10/35] pal: Addition of four channels sp support Add support for 4-ch speaker configs in the WSA884x sp implementation Signed-off-by: ffrancis --- device/Speaker/inc/SpeakerProtection.h | 6 + device/Speaker/inc/SpeakerProtectionwsa88xx.h | 3 + .../Speaker/src/SpeakerProtectionwsa884x.cpp | 606 +++++++++++------- 3 files changed, 398 insertions(+), 217 deletions(-) diff --git a/device/Speaker/inc/SpeakerProtection.h b/device/Speaker/inc/SpeakerProtection.h index a60c136b..bf4a6fc3 100644 --- a/device/Speaker/inc/SpeakerProtection.h +++ b/device/Speaker/inc/SpeakerProtection.h @@ -88,12 +88,18 @@ #define SPKR_RIGHT_WSA_TEMP "SpkrRight WSA Temp" #define SPKR_LEFT_WSA_TEMP "SpkrLeft WSA Temp" +#define SPKR2_RIGHT_WSA_TEMP "Spkr2Right WSA Temp" +#define SPKR2_LEFT_WSA_TEMP "Spkr2Left WSA Temp" #define SPKR_RIGHT_WSA_DEV_NUM "SpkrRight WSA Get DevNum" #define SPKR_LEFT_WSA_DEV_NUM "SpkrLeft WSA Get DevNum" +#define SPKR2_RIGHT_WSA_DEV_NUM "Spkr2Right WSA Get DevNum" +#define SPKR2_LEFT_WSA_DEV_NUM "Spkr2Left WSA Get DevNum" #define SPKR_RIGHT_WSA_DC_DET "SpkrRight WSA PA Disable" #define SPKR_LEFT_WSA_DC_DET "SpkrLeft WSA PA Disable" +#define SPKR2_RIGHT_WSA_DC_DET "Spkr2Right WSA PA Disable" +#define SPKR2_LEFT_WSA_DC_DET "Spkr2Left WSA PA Disable" #define TZ_TEMP_MIN_THRESHOLD (-30) #define TZ_TEMP_MAX_THRESHOLD (80) diff --git a/device/Speaker/inc/SpeakerProtectionwsa88xx.h b/device/Speaker/inc/SpeakerProtectionwsa88xx.h index 61dd836e..938d1d71 100644 --- a/device/Speaker/inc/SpeakerProtectionwsa88xx.h +++ b/device/Speaker/inc/SpeakerProtectionwsa88xx.h @@ -34,6 +34,9 @@ class SpeakerProtectionwsa884x : public SpeakerProtection { protected : static bool viTxSetupThrdCreated; + static struct pcm *cps2Pcm; + struct param_id_sp_th_vi_calib_res_cfg_t *callback_res_data; + std::vector pcmDevIdCPS2; private : diff --git a/device/Speaker/src/SpeakerProtectionwsa884x.cpp b/device/Speaker/src/SpeakerProtectionwsa884x.cpp index ceddb89c..c677f014 100644 --- a/device/Speaker/src/SpeakerProtectionwsa884x.cpp +++ b/device/Speaker/src/SpeakerProtectionwsa884x.cpp @@ -15,9 +15,9 @@ #include #include "SessionAR.h" - std::thread SpeakerProtectionwsa884x::viTxSetupThread; std::mutex SpeakerProtectionwsa884x::calibrationMutex; +struct pcm * SpeakerProtectionwsa884x::cps2Pcm = NULL; bool SpeakerProtectionwsa884x::viTxSetupThrdCreated; SpeakerProtectionwsa884x::SpeakerProtectionwsa884x(struct pal_device *device, @@ -112,6 +112,9 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() case 2 : ch_info.channels = CHANNELS_2; break; + case 4 : + ch_info.channels = CHANNELS_4; + break; default: PAL_DBG(LOG_TAG, "Unsupported channel. Set default as 2"); ch_info.channels = CHANNELS_2; @@ -148,14 +151,21 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() // Enable VI module switch(numberOfChannels) { - case 1 : + case 1: // TODO: check it from RM.xml for left or right configuration calVector.push_back(std::make_pair(SPK_PRO_VI_MAP, RIGHT_SPKR)); - break; - case 2 : + calVector.push_back(std::make_pair(CHANNELS, CHANNELS_1)); + break; + case 2: calVector.push_back(std::make_pair(SPK_PRO_VI_MAP, STEREO_SPKR)); - break; - default : + calVector.push_back(std::make_pair(CHANNELS, CHANNELS_2)); + break; + case 4: + //QUAD_SPKR needs to be added in kvh2xml.h + calVector.push_back(std::make_pair(SPK_PRO_VI_MAP, QUAD_SPKR)); + calVector.push_back(std::make_pair(CHANNELS, CHANNELS_4)); + break; + default: PAL_ERR(LOG_TAG, "Unsupported channel"); goto exit; } @@ -244,6 +254,9 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() case 2 : config.channels = CHANNELS_2; break; + case 4 : + config.channels = CHANNELS_4; + break; default: PAL_DBG(LOG_TAG, "Unsupported channel. Set default as 2"); config.channels = CHANNELS_2; @@ -269,9 +282,9 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() ret = SessionAlsaUtils::getModuleInstanceId(virtMixer, pcmDevIdsTx.at(0), backEndNameTx.c_str(), - MODULE_VI, &miid); + MODULE_VI, &miid); if (0 != ret) { - PAL_ERR(LOG_TAG, "Failed to get tag info %x, status = %d", MODULE_VI, ret); + PAL_ERR(LOG_TAG, "Failed to get tag info status = %d", ret); goto free_fe; } @@ -349,7 +362,7 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() event_cfg.is_register = 1; ret = SessionAlsaUtils::registerMixerEvent(virtMixer, pcmDevIdsTx.at(0), - backEndNameTx.c_str(), MODULE_VI, (void *)&event_cfg, + backEndNameTx.c_str(), MODULE_VI, (void *)&event_cfg, payload_size); if (ret) { PAL_ERR(LOG_TAG, "Unable to register event to DSP"); @@ -388,6 +401,9 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() case 2 : deviceRx.config.ch_info.channels = CHANNELS_2; break; + case 4 : + deviceRx.config.ch_info.channels = CHANNELS_4; + break; default: PAL_DBG(LOG_TAG, "Unsupported channel. Set default as 2"); deviceRx.config.ch_info.channels = CHANNELS_2; @@ -418,9 +434,16 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() case 1 : // TODO: Fetch the configuration from RM.xml calVector.push_back(std::make_pair(SPK_PRO_DEV_MAP, RIGHT_MONO)); + calVector.push_back(std::make_pair(CHANNELS, CHANNELS_1)); break; case 2 : calVector.push_back(std::make_pair(SPK_PRO_DEV_MAP, LEFT_RIGHT)); + calVector.push_back(std::make_pair(CHANNELS, CHANNELS_2)); + break; + case 4 : + //LEFT_RIGHT_QUAD needs to be added in kvh2xml.h + calVector.push_back(std::make_pair(SPK_PRO_DEV_MAP, LEFT_RIGHT_QUAD)); + calVector.push_back(std::make_pair(CHANNELS, CHANNELS_4)); break; default : PAL_ERR(LOG_TAG, "Unsupported channels for speaker"); @@ -491,10 +514,21 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() config.rate = SAMPLINGRATE_48K; config.format = PCM_FORMAT_S16_LE; - if (numberOfChannels > 1) - config.channels = CHANNELS_2; - else - config.channels = CHANNELS_1; + switch (numberOfChannels) { + case 1: + config.channels = CHANNELS_1; + break; + case 2: + config.channels = CHANNELS_2; + break; + case 4: + config.channels = CHANNELS_4; + break; + default: + PAL_INFO(LOG_ERR, "Unsupported channels %d, setting to 1", numberOfChannels); + config.channels = CHANNELS_1; + } + config.period_size = DEFAULT_PERIOD_SIZE; config.period_count = DEFAULT_PERIOD_COUNT; config.start_threshold = 0; @@ -505,6 +539,12 @@ int SpeakerProtectionwsa884x::spkrStartCalibration() // Set the operation mode for SP module spModeConfg.operation_mode = CALIBRATION_MODE; + if (customPayloadSize) { + free(customPayload); + customPayloadSize = 0; + customPayload = NULL; + } + ret = SessionAlsaUtils::getModuleInstanceId(virtMixer, pcmDevIdsRx.at(0), backEndNameRx.c_str(), MODULE_SP, &miid); @@ -595,8 +635,9 @@ err_pcm_open : if (txPcm) { event_cfg.is_register = 0; + //Register for VI module callback status = SessionAlsaUtils::registerMixerEvent(virtMixer, pcmDevIdsTx.at(0), - backEndNameTx.c_str(), MODULE_VI, (void *)&event_cfg, + backEndNameTx.c_str(), MODULE_VI, (void *)&event_cfg, payload_size); if (status) { PAL_ERR(LOG_TAG, "Unable to deregister event to DSP"); @@ -790,8 +831,16 @@ int SpeakerProtectionwsa884x::viTxSetupThreadLoop() ch_info.ch_map[1] = PAL_CHMAP_CHANNEL_FR; config.channels = CHANNELS_2; break; + case 4: + ch_info.channels = CHANNELS_4; + ch_info.ch_map[0] = PAL_CHMAP_CHANNEL_FL; + ch_info.ch_map[1] = PAL_CHMAP_CHANNEL_FR; + ch_info.ch_map[2] = PAL_CHMAP_CHANNEL_LB; + ch_info.ch_map[3] = PAL_CHMAP_CHANNEL_RB; + config.channels = CHANNELS_4; + break; default: - PAL_DBG(LOG_TAG, "Unsupported channel. Set defauly as 2"); + PAL_DBG(LOG_TAG, "Unsupported channel. Set default as 2"); ch_info.channels = CHANNELS_2; config.channels = CHANNELS_2; } @@ -850,6 +899,10 @@ int SpeakerProtectionwsa884x::viTxSetupThreadLoop() case 2 : calVector.push_back(std::make_pair(SPK_PRO_VI_MAP, STEREO_SPKR)); break; + case 4 : + //QUAD_SPKR needs to be added in kvh2xml.h + calVector.push_back(std::make_pair(SPK_PRO_VI_MAP, QUAD_SPKR)); + break; default : PAL_ERR(LOG_TAG, "Unsupported channel"); goto exit; @@ -1226,7 +1279,7 @@ int32_t SpeakerProtectionwsa884x::spkrProtProcessingMode(bool flag) char mSndDeviceName_SP[128] = {0}; uint8_t* payload = NULL; uint32_t devicePropId[] = {0x08000010, 1, 0x2}; - uint32_t miid = 0; + uint32_t miid = 0, deviceid = 0; uint32_t param_sp_op_mode = 0; uint32_t param_cps_ch_map = 0; bool isTxFeandBeConnected = true; @@ -1244,7 +1297,7 @@ int32_t SpeakerProtectionwsa884x::spkrProtProcessingMode(bool flag) struct agmMetaData deviceMetaData(nullptr, 0); struct mixer_ctl *beMetaDataMixerCtrl = nullptr; FILE *fp; - std::string backEndName, backEndNameRx, backEndNameCPS; + std::string backEndName, backEndNameRx, backEndNameCPS, backEndNameCPS2; std::vector > keyVector; std::vector > calVector; std::shared_ptr rm; @@ -1270,7 +1323,7 @@ int32_t SpeakerProtectionwsa884x::spkrProtProcessingMode(bool flag) struct agm_event_reg_cfg event_cfg; session_callback sessionCb; pal_spkr_prot_payload spkrProtPayload; - int id; + int id, id2; PAL_DBG(LOG_TAG, "Flag %d", flag); deviceMutex.lock(); @@ -1286,6 +1339,7 @@ int32_t SpeakerProtectionwsa884x::spkrProtProcessingMode(bool flag) txPcm = NULL; rxPcm = NULL; cpsPcm = NULL; + cps2Pcm = NULL; PAL_DBG(LOG_TAG, "Stopped calibration mode"); } numberOfRequest++; @@ -1442,216 +1496,292 @@ int32_t SpeakerProtectionwsa884x::spkrProtProcessingMode(bool flag) dev = Device::getInstance(&mDeviceAttr, rm); dev->getCurrentSndDevName(mSndDeviceName_SP); - if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER && strstr(mSndDeviceName_SP, "mono")) - rm->getDeviceInfo(PAL_DEVICE_IN_CPS_FEEDBACK, PAL_STREAM_VOICE_CALL, "", &cps_device); - else if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER) - rm->getDeviceInfo(PAL_DEVICE_IN_CPS_FEEDBACK, PAL_STREAM_PROXY, "", &cps_device); - - // Configure device attribute - if (cps_device.channels > 1) { - ch_info.channels = CHANNELS_2; - ch_info.ch_map[0] = PAL_CHMAP_CHANNEL_FL; - ch_info.ch_map[1] = PAL_CHMAP_CHANNEL_FR; - } - else { - ch_info.channels = CHANNELS_1; - if (mDeviceAttr.id == PAL_DEVICE_OUT_HANDSET) - ch_info.ch_map[0] = PAL_CHMAP_CHANNEL_FL; - else - ch_info.ch_map[0] = PAL_CHMAP_CHANNEL_FR; + if(numberOfChannels != CHANNELS_4) { + if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER && strstr(mSndDeviceName_SP, "mono")) + rm->getDeviceInfo(PAL_DEVICE_IN_CPS_FEEDBACK, PAL_STREAM_VOICE_CALL, "", &cps_device); + else if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER) + rm->getDeviceInfo(PAL_DEVICE_IN_CPS_FEEDBACK, PAL_STREAM_PROXY, "", &cps_device); } - deviceCPS.config.ch_info = ch_info; - deviceCPS.config.sample_rate = cps_device.samplerate; - deviceCPS.config.bit_width = cps_device.bit_width; - deviceCPS.config.aud_fmt_id = rm->getAudioFmt(cps_device.bit_width); - // Setup CPS path - deviceCPS.id = PAL_DEVICE_IN_CPS_FEEDBACK; + // Configure device attribute + for (int ch = numberOfChannels; ch != 0; ch = ch >> 2) { + PAL_DBG(LOG_TAG, "Opening CPS for ch: %d \n", ch); + bool isFirstDevice = (ch == numberOfChannels); + if(numberOfChannels == CHANNELS_4) { + if(!isFirstDevice) { + if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER && strstr(mSndDeviceName_SP, "mono")) { + rm->getDeviceInfo(PAL_DEVICE_IN_CPS_FEEDBACK,PAL_STREAM_VOICE_CALL,"",&cps_device); + } + else if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER) { + rm->getDeviceInfo(PAL_DEVICE_IN_CPS_FEEDBACK,PAL_STREAM_PROXY,"",&cps_device); + } + }else { + if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER && strstr(mSndDeviceName_SP, "mono")) { + rm->getDeviceInfo(PAL_DEVICE_IN_CPS2_FEEDBACK,PAL_STREAM_VOICE_CALL,"",&cps_device); + } + else if (mDeviceAttr.id == PAL_DEVICE_OUT_SPEAKER) { + rm->getDeviceInfo(PAL_DEVICE_IN_CPS2_FEEDBACK,PAL_STREAM_PROXY,"",&cps_device); + } + } + } + // Configure device attribute + if (cps_device.channels > 1) { + ch_info.channels = CHANNELS_2; + ch_info.ch_map[0] = PAL_CHMAP_CHANNEL_FL; + ch_info.ch_map[1] = PAL_CHMAP_CHANNEL_FR; + } + else { + ch_info.channels = CHANNELS_1; + if (mDeviceAttr.id == PAL_DEVICE_OUT_HANDSET) + ch_info.ch_map[0] = PAL_CHMAP_CHANNEL_FL; + else + ch_info.ch_map[0] = PAL_CHMAP_CHANNEL_FR; + } - ret = rm->getAudioRoute(&audioRoute); - if (0 != ret) { - PAL_ERR(LOG_TAG, "Failed to get the audio_route address status %d", ret); - goto err_pcm_open; - } - strlcpy(mSndDeviceName_cps, cps_device.sndDevName.c_str(), DEVICE_NAME_MAX_SIZE); + deviceCPS.config.ch_info = ch_info; + deviceCPS.config.sample_rate = cps_device.samplerate; + deviceCPS.config.bit_width = cps_device.bit_width; + deviceCPS.config.aud_fmt_id = rm->getAudioFmt(cps_device.bit_width); - if (mDeviceAttr.id == PAL_DEVICE_OUT_HANDSET) { - strlcat(mSndDeviceName_cps, FEEDBACK_MONO_1, DEVICE_NAME_MAX_SIZE); - } + if (ch != CHANNELS_4) + deviceCPS.id = PAL_DEVICE_IN_CPS_FEEDBACK; + else + deviceCPS.id = PAL_DEVICE_IN_CPS2_FEEDBACK; - PAL_DBG(LOG_TAG, "get the audio route %s", mSndDeviceName_cps); + ret = rm->getAudioRoute(&audioRoute); + if (0 != ret) { + PAL_ERR(LOG_TAG, "Failed to get the audio_route address status %d", ret); + goto err_pcm_open; + } + strlcpy(mSndDeviceName_cps, cps_device.sndDevName.c_str(), DEVICE_NAME_MAX_SIZE); - rm->getBackendName(deviceCPS.id, backEndNameCPS); - if (!strlen(backEndNameCPS.c_str())) { - PAL_ERR(LOG_TAG, "Failed to obtain CPS backend name for %d", deviceCPS.id); - goto err_pcm_open; - } + if (mDeviceAttr.id == PAL_DEVICE_OUT_HANDSET) { + strlcat(mSndDeviceName_cps, FEEDBACK_MONO_1, DEVICE_NAME_MAX_SIZE); + } - PayloadBuilder::getDeviceKV(deviceCPS.id, keyVector); - if (0 != ret) { - PAL_ERR(LOG_TAG, "Failed to obtain device KV for %d", device.id); - goto err_pcm_open; - } + PAL_DBG(LOG_TAG, "get the audio route %s", mSndDeviceName_cps); - // Enable the CPS module - switch (cps_device.channels) { - case 1 : - if (mDeviceAttr.id == PAL_DEVICE_OUT_HANDSET) - calVector.push_back(std::make_pair(SPK_PRO_CPS_MAP, L_SPKR)); - else - calVector.push_back(std::make_pair(SPK_PRO_CPS_MAP, R_SPKR)); - break; - case 2 : - calVector.push_back(std::make_pair(SPK_PRO_CPS_MAP, ST_SPKR)); - break; - default : - PAL_ERR(LOG_TAG, "Unsupported channel"); + rm->getBackendName(deviceCPS.id, backEndNameCPS); + if (!strlen(backEndNameCPS.c_str())) { + PAL_ERR(LOG_TAG, "Failed to obtain CPS backend name for %d", deviceCPS.id); goto err_pcm_open; - } + } - SessionAlsaUtils::getAgmMetaData(keyVector, calVector, - (struct prop_data *)devicePropId, deviceMetaData); - if (!deviceMetaData.size) { - PAL_ERR(LOG_TAG, "CPS device metadata is zero"); - ret = -ENOMEM; - goto err_pcm_open; - } - connectCtrlNameBeCPS<< backEndNameCPS << " metadata"; - beMetaDataMixerCtrl = mixer_get_ctl_by_name(virtMixer, - connectCtrlNameBeCPS.str().data()); - if (!beMetaDataMixerCtrl) { - PAL_ERR(LOG_TAG, "invalid mixer control for CPS : %s", backEndNameCPS.c_str()); - ret = -EINVAL; - goto err_pcm_open; - } + PayloadBuilder::getDeviceKV(deviceCPS.id, keyVector); + if (0 != ret) { + PAL_ERR(LOG_TAG, "Failed to obtain device KV for %d", device.id); + goto err_pcm_open; + } - if (deviceMetaData.size) { - ret = mixer_ctl_set_array(beMetaDataMixerCtrl, (void *)deviceMetaData.buf, - deviceMetaData.size); - free(deviceMetaData.buf); - deviceMetaData.buf = nullptr; - } - else { - PAL_ERR(LOG_TAG, "Device Metadata not set for CPS path"); - ret = -EINVAL; - goto err_pcm_open; - } + // Enable the CPS module + switch (cps_device.channels) { + case 1 : + if (mDeviceAttr.id == PAL_DEVICE_OUT_HANDSET) + calVector.push_back(std::make_pair(SPK_PRO_CPS_MAP, L_SPKR)); + else + calVector.push_back(std::make_pair(SPK_PRO_CPS_MAP, R_SPKR)); + break; + case 2 : + calVector.push_back(std::make_pair(SPK_PRO_CPS_MAP, ST_SPKR)); + break; + case 4 : + calVector.push_back(std::make_pair(SPK_PRO_CPS_MAP, ST_SPKR)); // Nothing changes between any of these KVs + break; + default : + PAL_ERR(LOG_TAG, "Unsupported channel"); + goto err_pcm_open; + } - ret = Device::setMediaConfig(rm, backEndNameCPS, &deviceCPS); - if (ret) { - PAL_ERR(LOG_TAG, "setMediaConfig for feedback device failed"); - goto err_pcm_open; - } + SessionAlsaUtils::getAgmMetaData(keyVector, calVector, + (struct prop_data *)devicePropId, deviceMetaData); + if (!deviceMetaData.size) { + PAL_ERR(LOG_TAG, "CPS device metadata is zero"); + ret = -ENOMEM; + goto err_pcm_open; + } - /* Retrieve Hostless PCM device id */ - sAttr.type = PAL_STREAM_LOW_LATENCY; - sAttr.direction = PAL_AUDIO_INPUT_OUTPUT; - dir = TX_HOSTLESS; - id = rm->allocateFrontEndIds(PCM_RECORD_HOSTLESS); - if (id < 0) { - PAL_ERR(LOG_TAG, "allocateFrontEndIds failed"); - ret = -ENOSYS; - goto err_pcm_open; - } - pcmDevIdCPS.push_back(id); + // Reset stream before using it again + connectCtrlNameBeCPS.str(""); + connectCtrlNameBeCPS.clear(); - connectCtrlNameCPS << "PCM" << pcmDevIdCPS.at(0) << " connect"; - connectCtrl2 = mixer_get_ctl_by_name(virtMixer, connectCtrlNameCPS.str().data()); + connectCtrlNameBeCPS<< backEndNameCPS << " metadata"; - if (!connectCtrl2) { - PAL_ERR(LOG_TAG, "invalid mixer control: %s", connectCtrlNameCPS.str().data()); - goto free_fe; - } + beMetaDataMixerCtrl = mixer_get_ctl_by_name(virtMixer, + connectCtrlNameBeCPS.str().data()); + if (!beMetaDataMixerCtrl) { + PAL_ERR(LOG_TAG, "invalid mixer control for CPS : %s", backEndNameCPS.c_str()); + ret = -EINVAL; + goto err_pcm_open; + } - ret = mixer_ctl_set_enum_by_string(connectCtrl2, backEndNameCPS.c_str()); - if (ret) { - PAL_ERR(LOG_TAG, "Mixer control %s set with %s failed: %d", - connectCtrlNameCPS.str().data(), backEndNameCPS.c_str(), ret); - goto free_fe; - } + if (deviceMetaData.size) { + ret = mixer_ctl_set_array(beMetaDataMixerCtrl, (void *)deviceMetaData.buf, + deviceMetaData.size); + free(deviceMetaData.buf); + deviceMetaData.buf = nullptr; + } + else { + PAL_ERR(LOG_TAG, "Device Metadata not set for CPS path"); + ret = -EINVAL; + goto err_pcm_open; + } - isCPSFeandBeConnected = true; + ret = Device::setMediaConfig(rm, backEndNameCPS, &deviceCPS); + if (ret) { + PAL_ERR(LOG_TAG, "setMediaConfig for feedback device failed"); + goto err_pcm_open; + } - config.rate = cps_device.samplerate; - switch (cps_device.bit_width) { - case 32 : - config.format = PCM_FORMAT_S32_LE; - break; - default: - PAL_DBG(LOG_TAG, "Unsupported bit width. Set default as 16"); - config.format = PCM_FORMAT_S16_LE; - break; - } + /* Retrieve Hostless PCM device id */ + sAttr.type = PAL_STREAM_LOW_LATENCY; + sAttr.direction = PAL_AUDIO_INPUT_OUTPUT; + dir = TX_HOSTLESS; + + // Reset stream before using it again + connectCtrlNameCPS.str(""); + connectCtrlNameCPS.clear(); + + if (ch != CHANNELS_4) { + id = rm->allocateFrontEndIds(PCM_RECORD_HOSTLESS); + if (pcmDevIdCPS.size() == 0) { + PAL_ERR(LOG_TAG, "allocateFrontEndIds failed"); + ret = -ENOSYS; + goto err_pcm_open; + } + pcmDevIdCPS.push_back(id); + connectCtrlNameCPS << "PCM" << pcmDevIdCPS.at(0) << " connect"; + } else { + id2 = rm->allocateFrontEndIds(PCM_RECORD_HOSTLESS); + + if (pcmDevIdCPS2.size() == 0) { + PAL_ERR(LOG_TAG, "allocateFrontEndIds failed"); + ret = -ENOSYS; + goto err_pcm_open; + } + pcmDevIdCPS.push_back(id2); + connectCtrlNameCPS << "PCM" << pcmDevIdCPS2.at(0) << " connect"; + } + connectCtrl2 = mixer_get_ctl_by_name(virtMixer, connectCtrlNameCPS.str().data()); - switch (cps_device.channels) { - case 1 : - config.channels = CHANNELS_1; - break; - case 2 : - config.channels = CHANNELS_2; - break; - default : - PAL_DBG(LOG_TAG, "Unsupported channel. Set default as 2"); - config.channels = CHANNELS_2; - break; - } - config.period_size = DEFAULT_PERIOD_SIZE; - config.period_count = DEFAULT_PERIOD_COUNT; - config.start_threshold = 0; - config.stop_threshold = INT_MAX; - config.silence_threshold = 0; + if (!connectCtrl2) { + PAL_ERR(LOG_TAG, "invalid mixer control: %s", connectCtrlNameCPS.str().data()); + goto free_fe; + } - flags = PCM_IN; + ret = mixer_ctl_set_enum_by_string(connectCtrl2, backEndNameCPS.c_str()); + if (ret) { + PAL_ERR(LOG_TAG, "Mixer control %s set with %s failed: %d", + connectCtrlNameCPS.str().data(), backEndNameCPS.c_str(), ret); + goto free_fe; + } - ret = SessionAlsaUtils::getModuleInstanceId(virtMixer, pcmDevIdCPS.at(0), - backEndNameCPS.c_str(), TAG_MODULE_CPS, &miid); - if (0 != ret) { - PAL_ERR(LOG_TAG, "Failed to get tag info %x, status = %d", TAG_MODULE_CPS, ret); - goto free_fe; - } + isCPSFeandBeConnected = true; - // Setting Channel Map configuration for CPS module - // TODO: Move this to ACDB file - cpsChannelMapConfg.num_ch = cps_device.channels; - payloadSize = 0; - if (rm->GetSpeakerProtectionVersion() == SPV5) - param_cps_ch_map = PARAM_ID_CPS_CHANNEL_MAP_V5; - else - param_cps_ch_map = PARAM_ID_CPS_CHANNEL_MAP; + config.rate = cps_device.samplerate; + switch (cps_device.bit_width) { + case 32 : + config.format = PCM_FORMAT_S32_LE; + break; + default: + PAL_DBG(LOG_TAG, "Unsupported bit width. Set default as 16"); + config.format = PCM_FORMAT_S16_LE; + break; + } - builder->payloadSPConfig(&payload, &payloadSize, miid, - param_cps_ch_map,(void *)&cpsChannelMapConfg); - if (payloadSize) { - ret = updateCustomPayload(payload, payloadSize); - free(payload); + switch (cps_device.channels) { + case 1 : + config.channels = CHANNELS_1; + break; + case 2 : + config.channels = CHANNELS_2; + break; + case 4 : + config.channels = CHANNELS_4; + break; + default : + PAL_DBG(LOG_TAG, "Unsupported channel. Set default as 2"); + config.channels = CHANNELS_2; + break; + } + config.period_size = DEFAULT_PERIOD_SIZE; + config.period_count = DEFAULT_PERIOD_COUNT; + config.start_threshold = 0; + config.stop_threshold = INT_MAX; + config.silence_threshold = 0; + + flags = PCM_IN; + if (ch != CHANNELS_4) { + deviceid = pcmDevIdCPS.at(0); + } else { + deviceid = pcmDevIdCPS2.at(0); + } + ret = SessionAlsaUtils::getModuleInstanceId(virtMixer, deviceid, + backEndNameCPS.c_str(), TAG_MODULE_CPS, &miid); if (0 != ret) { - PAL_ERR(LOG_TAG," updateCustomPayload Failed for CPS CHANNEL_MAP_CFG\n"); + PAL_ERR(LOG_TAG, "Failed to get tag info %x, status = %d", TAG_MODULE_CPS, ret); + goto free_fe; } - } - cpsPcm = pcm_open(rm->getVirtualSndCard(), pcmDevIdCPS.at(0), flags, &config); - if (!cpsPcm) { - PAL_ERR(LOG_TAG, "cpsPcm open failed"); - goto free_fe; - } + cpsChannelMapConfg.num_ch = cps_device.channels * 2; + payloadSize = 0; - if (!pcm_is_ready(cpsPcm)) { - PAL_ERR(LOG_TAG, "cpsPcm open not ready"); - goto err_pcm_open; - } + if (rm->GetSpeakerProtectionVersion() == SPV5) + param_cps_ch_map = PARAM_ID_CPS_CHANNEL_MAP_V5; + else + param_cps_ch_map = PARAM_ID_CPS_CHANNEL_MAP; - enableDevice(audioRoute, mSndDeviceName_cps); - PAL_DBG(LOG_TAG, "pcm start for CPS"); - if (pcm_start(cpsPcm) < 0) { - PAL_ERR(LOG_TAG, "pcm start failed for CPS path"); - goto err_pcm_open; - } + if(isFirstDevice) { + builder->payloadSPConfig(&payload, &payloadSize, miid, + param_cps_ch_map,(void *)&cpsChannelMapConfg); + if (payloadSize) { + ret = updateCustomPayload(payload, payloadSize); + free(payload); + if (0 != ret) { + PAL_ERR(LOG_TAG," updateCustomPayload Failed for CPS CHANNEL_MAP_CFG\n"); + } + } + } - // Free up the local variables - goto exit; - } - else { + if (ch != CHANNELS_4) { + cpsPcm = pcm_open(rm->getVirtualSndCard(), pcmDevIdCPS.at(0), flags, &config); + if (!cpsPcm) { + PAL_ERR(LOG_TAG, "cpsPcm open failed"); + goto free_fe; + } + if (!pcm_is_ready(cpsPcm)) { + PAL_ERR(LOG_TAG, "cpsPcm open not ready"); + goto err_pcm_open; + } + enableDevice(audioRoute, mSndDeviceName_cps); + PAL_DBG(LOG_TAG, " pcm start for CPS"); + if (pcm_start(cpsPcm) < 0) { + PAL_ERR(LOG_TAG, "pcm start failed for CPS path"); + goto err_pcm_open; + } + } else { + cps2Pcm = pcm_open(rm->getVirtualSndCard(), pcmDevIdCPS2.at(0), flags, &config); + if (!cps2Pcm) { + PAL_ERR(LOG_TAG, "cps2Pcm open failed"); + goto free_fe; + } + if (!pcm_is_ready(cps2Pcm)) { + PAL_ERR(LOG_TAG, "cps2Pcm open not ready"); + goto err_pcm_open; + } + enableDevice(audioRoute, mSndDeviceName_cps); + PAL_DBG(LOG_TAG, "pcm start for CPS2"); + if (pcm_start(cps2Pcm) < 0) { + PAL_ERR(LOG_TAG, "pcm start failed for CPS path"); + goto err_pcm_open; + } + } + keyVector.clear(); + calVector.clear(); + } + // Free up the local variables + goto exit; + } else { if (numberOfRequest == 0) { PAL_ERR(LOG_TAG, "Device not started yet, Stop not expected"); goto exit; @@ -1703,9 +1833,13 @@ int32_t SpeakerProtectionwsa884x::spkrProtProcessingMode(bool flag) txPcm = NULL; } PAL_DBG(LOG_TAG, "Closing CPS path"); - if (cpsPcm) { + if(cpsPcm || cps2Pcm) { rm = ResourceManager::getInstance(); - deviceCPS.id = PAL_DEVICE_IN_CPS_FEEDBACK; + for (int ch = numberOfChannels; ch != 0; ch = ch >> 2) { + if (ch != CHANNELS_4) + deviceCPS.id = PAL_DEVICE_IN_CPS_FEEDBACK; + else + deviceCPS.id = PAL_DEVICE_IN_CPS2_FEEDBACK; ret = rm->getAudioRoute(&audioRoute); if (0 != ret) { @@ -1713,25 +1847,42 @@ int32_t SpeakerProtectionwsa884x::spkrProtProcessingMode(bool flag) goto exit; } - strlcpy(mSndDeviceName_cps, cps_device.sndDevName.c_str(), DEVICE_NAME_MAX_SIZE); - rm->getBackendName(deviceCPS.id, backEndNameCPS); - if (!strlen(backEndNameCPS.c_str())) { - PAL_ERR(LOG_TAG, "Failed to obtain CPS backend name for %d", deviceCPS.id); - goto exit; - } - pcm_stop(cpsPcm); - if (pcmDevIdCPS.size() != 0) { - if (isCPSFeandBeConnected) { - disconnectFeandBe(pcmDevIdCPS, backEndNameCPS); + strlcpy(mSndDeviceName_cps, cps_device.sndDevName.c_str(), DEVICE_NAME_MAX_SIZE); + rm->getBackendName(deviceCPS.id, backEndNameCPS); + if (!strlen(backEndNameCPS.c_str())) { + PAL_ERR(LOG_TAG, "Failed to obtain CPS backend name for %d", deviceCPS.id); + goto exit; + } + if (ch != CHANNELS_4) { + pcm_stop(cpsPcm); + if (pcmDevIdCPS.size() != 0) { + if (isCPSFeandBeConnected) { + disconnectFeandBe(pcmDevIdCPS, backEndNameCPS); + } + sAttr.type = PAL_STREAM_LOW_LATENCY; + sAttr.direction = PAL_AUDIO_INPUT_OUTPUT; + rm->freeFrontEndIds(PCM_RECORD_HOSTLESS, pcmDevIdCPS); + pcmDevIdCPS.clear(); + } + pcm_close(cpsPcm); + disableDevice(audioRoute, mSndDeviceName_cps); + cpsPcm = NULL; + } else { + pcm_stop(cps2Pcm); + if (pcmDevIdCPS2.size() != 0) { + if (isCPSFeandBeConnected) { + disconnectFeandBe(pcmDevIdCPS2, backEndNameCPS); + } + sAttr.type = PAL_STREAM_LOW_LATENCY; + sAttr.direction = PAL_AUDIO_INPUT_OUTPUT; + rm->freeFrontEndIds(PCM_RECORD_HOSTLESS, pcmDevIdCPS2); + pcmDevIdCPS2.clear(); + } + pcm_close(cps2Pcm); + disableDevice(audioRoute, mSndDeviceName_cps); + cps2Pcm = NULL; } - sAttr.type = PAL_STREAM_LOW_LATENCY; - sAttr.direction = PAL_AUDIO_INPUT_OUTPUT; - rm->freeFrontEndIds(PCM_RECORD_HOSTLESS, pcmDevIdCPS); - pcmDevIdCPS.clear(); } - pcm_close(cpsPcm); - disableDevice(audioRoute, mSndDeviceName_cps); - cpsPcm = NULL; goto exit; } } @@ -1743,14 +1894,35 @@ err_pcm_open : cpsPcm = NULL; } + if (cps2Pcm) { + pcm_close(cps2Pcm); + disableDevice(audioRoute, mSndDeviceName_cps); + cps2Pcm = NULL; + } + free_fe: + if (pcmDevIdCPS.size() != 0) { if (isCPSFeandBeConnected) { + deviceCPS.id = PAL_DEVICE_IN_CPS_FEEDBACK; + ret = rm->getSndDeviceName(deviceCPS.id , mSndDeviceName_cps); + rm->getBackendName(deviceCPS.id, backEndNameCPS); disconnectFeandBe(pcmDevIdCPS, backEndNameCPS); } rm->freeFrontEndIds(PCM_RECORD_HOSTLESS, pcmDevIdCPS); pcmDevIdCPS.clear(); } + if (pcmDevIdCPS2.size() != 0) { + if (isCPSFeandBeConnected) { + deviceCPS.id = PAL_DEVICE_IN_CPS2_FEEDBACK; + ret = rm->getSndDeviceName(deviceCPS.id , mSndDeviceName_cps); + rm->getBackendName(deviceCPS.id, backEndNameCPS2); + disconnectFeandBe(pcmDevIdCPS2, backEndNameCPS2); + } + rm->freeFrontEndIds(PCM_RECORD_HOSTLESS, pcmDevIdCPS2); + pcmDevIdCPS2.clear(); + } + exit: deviceMutex.unlock(); if(builder) { From 137a3fb45e8ae69241d40f99f4f4877a9c5ed5c4 Mon Sep 17 00:00:00 2001 From: Yuhui Zhao Date: Mon, 6 Apr 2026 12:55:14 +0800 Subject: [PATCH 11/35] pal: configs: swap amic3 and amic5 in VA nlpi case Swap amic3 and amic5 in VA nlpi case, the configuration is incorrect. Update the mic configuration for hdr usecase. Signed-off-by: ffrancis --- .../qcom/mobile/art/mixer_paths_art_qrd.xml | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/configs/qcom/mobile/art/mixer_paths_art_qrd.xml b/configs/qcom/mobile/art/mixer_paths_art_qrd.xml index 96d0adbf..5d83a4aa 100644 --- a/configs/qcom/mobile/art/mixer_paths_art_qrd.xml +++ b/configs/qcom/mobile/art/mixer_paths_art_qrd.xml @@ -747,13 +747,14 @@ - + - - - - - + + + + + + @@ -764,18 +765,18 @@ - + - + - + - + - + - + @@ -792,27 +793,27 @@ - + + - - - - + + - - + + - + + + - + - @@ -832,10 +833,10 @@ - + - + @@ -1393,8 +1394,8 @@ - - + + @@ -1405,8 +1406,8 @@ - - + + @@ -1424,18 +1425,18 @@ - + - + - - + + From 414b71f50c620e1ba5f8649b7a8cbb4a7e831ed4 Mon Sep 17 00:00:00 2001 From: Afroza Nasrin Date: Sun, 5 Apr 2026 23:16:50 +0530 Subject: [PATCH 12/35] pal: Enable deep-buffer MMAP usecase selection When deep-buffer streams are opened MMAP flag, then treat it as an MMAP/ULL usecase and open stream graph with "deep_buffer_mmap" custom config. Signed-off-by: ffrancis --- session/SessionAR/src/PayloadBuilder.cpp | 6 ++++++ session/SessionAR/src/SessionAlsaUtils.cpp | 15 +++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/session/SessionAR/src/PayloadBuilder.cpp b/session/SessionAR/src/PayloadBuilder.cpp index 248297bd..bd490c41 100644 --- a/session/SessionAR/src/PayloadBuilder.cpp +++ b/session/SessionAR/src/PayloadBuilder.cpp @@ -3237,6 +3237,12 @@ int PayloadBuilder::populateStreamKV(Stream* s, "bit_perfect")); PAL_INFO(LOG_TAG, "BitPerfect Playback, hence select PCM_IMMUTABLE KV"); } + } else if (sattr->type == PAL_STREAM_DEEP_BUFFER && + (sattr->flags & PAL_STREAM_FLAG_MMAP_MASK)) { + filled_selector_pairs.push_back( + std::make_pair(CUSTOM_CONFIG_SEL, + "deep_buffer_mmap")); + PAL_INFO(LOG_TAG, "Deep buffer playback in mmap mode"); } retrieveKVs(filled_selector_pairs ,sattr->type, all_streams, keyVector); diff --git a/session/SessionAR/src/SessionAlsaUtils.cpp b/session/SessionAR/src/SessionAlsaUtils.cpp index 2b6e1af5..4dd0ba5d 100644 --- a/session/SessionAR/src/SessionAlsaUtils.cpp +++ b/session/SessionAR/src/SessionAlsaUtils.cpp @@ -279,13 +279,16 @@ int SessionAlsaUtils::getCalMetadata(std::vector > &ckv, stru } bool SessionAlsaUtils::isMmapUsecase(struct pal_stream_attributes &sAttr) -{ - return ((sAttr.type == PAL_STREAM_ULTRA_LOW_LATENCY) && - ((sAttr.flags & PAL_STREAM_FLAG_MMAP_MASK) - ||(sAttr.flags & PAL_STREAM_FLAG_MMAP_NO_IRQ_MASK)) - ); + { + bool isUllWithMmap = (sAttr.type == PAL_STREAM_ULTRA_LOW_LATENCY) && + ((sAttr.flags & PAL_STREAM_FLAG_MMAP_MASK) || + (sAttr.flags & PAL_STREAM_FLAG_MMAP_NO_IRQ_MASK)); -} + bool isDeepBufferWithMmap = (sAttr.type == PAL_STREAM_DEEP_BUFFER) && + (sAttr.flags & PAL_STREAM_FLAG_MMAP_MASK); + + return isUllWithMmap || isDeepBufferWithMmap; + } struct mixer_ctl *SessionAlsaUtils::getStaticMixerControl(struct mixer *am, std::string name) { From e88bc2a2af8999aba07941d5f9370af74940f119 Mon Sep 17 00:00:00 2001 From: Ritu Sharma Date: Wed, 8 Apr 2026 16:10:39 +0530 Subject: [PATCH 13/35] pal: Declare proxyOut_dattr outside if condition Declare proxyOut_dattr outside if condition to fix out of scope issues when it is being referenced by candidateConfig outside of if condition for RTProxyIn device. Signed-off-by: ffrancis --- device/RTProxy/src/RTProxy.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/device/RTProxy/src/RTProxy.cpp b/device/RTProxy/src/RTProxy.cpp index 7e93b125..b469ea78 100644 --- a/device/RTProxy/src/RTProxy.cpp +++ b/device/RTProxy/src/RTProxy.cpp @@ -208,6 +208,8 @@ int32_t RTProxyIn::getDeviceConfig(struct pal_device *deviceattr, } struct pal_media_config *candidateConfig = &sAttr->in_media_config; + struct pal_device proxyOut_dattr = {}; + PAL_DBG(LOG_TAG, "sattr chn=0x%x fmt id=0x%x rate = 0x%x width=0x%x", sAttr->in_media_config.ch_info.channels, sAttr->in_media_config.aud_fmt_id, @@ -217,7 +219,6 @@ int32_t RTProxyIn::getDeviceConfig(struct pal_device *deviceattr, if (!rm->ifVoiceorVoipCall(sAttr->type) && rm->isDeviceAvailable(PAL_DEVICE_OUT_PROXY)) { PAL_DBG(LOG_TAG, "This is NOT voice call. out proxy is available"); std::shared_ptr devOut = nullptr; - struct pal_device proxyOut_dattr; proxyOut_dattr.id = PAL_DEVICE_OUT_PROXY; devOut = Device::getInstance(&proxyOut_dattr, rm); if (devOut) { From 753787ab325b4ebad9718dc5583060ad5595d962 Mon Sep 17 00:00:00 2001 From: Farida Moughal Date: Wed, 24 Dec 2025 11:02:21 +0530 Subject: [PATCH 14/35] pal: Add CPS2_FEEDBACK device to palmapping Add CPS2_FEEDBACK device in palmmaping.h Signed-off-by: ffrancis --- inc/PalMappings.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inc/PalMappings.h b/inc/PalMappings.h index 647c72a8..f660d8f1 100644 --- a/inc/PalMappings.h +++ b/inc/PalMappings.h @@ -137,6 +137,7 @@ static const std::map deviceIdLUT { {std::string{ "PAL_DEVICE_IN_ECHO_REF" }, PAL_DEVICE_IN_ECHO_REF}, {std::string{ "PAL_DEVICE_IN_HAPTICS_VI_FEEDBACK" }, PAL_DEVICE_IN_HAPTICS_VI_FEEDBACK}, {std::string{ "PAL_DEVICE_IN_CPS_FEEDBACK" }, PAL_DEVICE_IN_CPS_FEEDBACK}, + {std::string{ "PAL_DEVICE_IN_CPS2_FEEDBACK" }, PAL_DEVICE_IN_CPS2_FEEDBACK}, {std::string{ "PAL_DEVICE_IN_DUMMY" }, PAL_DEVICE_IN_DUMMY}, {std::string{ "PAL_DEVICE_IN_BLUETOOTH_HFP" }, PAL_DEVICE_IN_BLUETOOTH_HFP}, {std::string{ "PAL_DEVICE_IN_SPEAKER_MIC2" }, PAL_DEVICE_IN_SPEAKER_MIC2}, @@ -201,6 +202,7 @@ static const std::map deviceNameLUT { {PAL_DEVICE_IN_ECHO_REF, std::string{"PAL_DEVICE_IN_ECHO_REF"}}, {PAL_DEVICE_IN_HAPTICS_VI_FEEDBACK, std::string{"PAL_DEVICE_IN_HAPTICS_VI_FEEDBACK"}}, {PAL_DEVICE_IN_CPS_FEEDBACK, std::string{"PAL_DEVICE_IN_CPS_FEEDBACK"}}, + {PAL_DEVICE_IN_CPS2_FEEDBACK, std::string{"PAL_DEVICE_IN_CPS2_FEEDBACK"}}, {PAL_DEVICE_IN_DUMMY, std::string{"PAL_DEVICE_IN_DUMMY"}}, {PAL_DEVICE_IN_BLUETOOTH_HFP, std::string{"PAL_DEVICE_IN_BLUETOOTH_HFP"}}, {PAL_DEVICE_IN_SPEAKER_MIC2, std::string{"PAL_DEVICE_IN_SPEAKER_MIC2"}}, From f2f377bd084607cb7cf2332fe91aca1545edc506 Mon Sep 17 00:00:00 2001 From: Farida Moughal Date: Tue, 4 Nov 2025 16:46:39 +0530 Subject: [PATCH 15/35] pal: Add 4ch SP support in payloadbuilder Add support to send CKV for 4ch SP Signed-off-by: ffrancis --- session/SessionAR/src/PayloadBuilder.cpp | 50 ++++++++++++++++-------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/session/SessionAR/src/PayloadBuilder.cpp b/session/SessionAR/src/PayloadBuilder.cpp index bd490c41..44dbca50 100644 --- a/session/SessionAR/src/PayloadBuilder.cpp +++ b/session/SessionAR/src/PayloadBuilder.cpp @@ -3856,15 +3856,23 @@ int PayloadBuilder::populateCalKeyVector(Stream *s, std::vector 1) { - PAL_DBG(LOG_TAG, "Multi channel speaker"); - ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, LEFT_RIGHT)); - } - else { - PAL_DBG(LOG_TAG, "Mono channel speaker"); - ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, RIGHT_MONO)); - } - break; + switch (dAttr.config.ch_info.channels) { + case 1: + PAL_DBG(LOG_TAG, "Mono channel speaker"); + ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, RIGHT_MONO)); + break; + case 2: + PAL_DBG(LOG_TAG, "Stereo channel speaker"); + ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, LEFT_RIGHT)); + break; + case 4: + PAL_DBG(LOG_TAG, "QUAD channel speaker"); + ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, LEFT_RIGHT_QUAD)); + break; + default: + PAL_DBG(LOG_TAG, "Unsupport number of channels %d", dAttr.config.ch_info.channels); + } + break; } } break; @@ -3882,14 +3890,22 @@ int PayloadBuilder::populateCalKeyVector(Stream *s, std::vector 1) { - PAL_DBG(LOG_TAG, "Multi channel Haptics Dev"); - ckv.push_back(std::make_pair(HAPTICS_PRO_DEV_MAP, HAPTICS_LEFT_RIGHT)); - } - else { - PAL_DBG(LOG_TAG, "Mono channel Haptics Dev"); - ckv.push_back(std::make_pair(HAPTICS_PRO_DEV_MAP, HAPTICS_LEFT_MONO)); - } + switch (dAttr.config.ch_info.channels) { + case 1: + PAL_DBG(LOG_TAG, "Mono channel speaker"); + ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, RIGHT_SPKR)); + break; + case 2: + PAL_DBG(LOG_TAG, "Stereo channel speaker"); + ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, STEREO_SPKR)); + break; + case 4: + PAL_DBG(LOG_TAG, "QUAD channel speaker"); + ckv.push_back(std::make_pair(SPK_PRO_DEV_MAP, QUAD_SPKR)); + break; + default: + PAL_DBG(LOG_TAG, "Unsupport number of channels %d", dAttr.config.ch_info.channels); + } break; } } From 92f5d2cb63a882e6d8c34a50756a020782086765 Mon Sep 17 00:00:00 2001 From: Farida Moughal Date: Wed, 24 Dec 2025 11:09:19 +0530 Subject: [PATCH 16/35] pal: plugins: Add CPS2_FEEDBACK device in pluginmanager Add CPS2_FEEDBACK device in pluginmanagerstatic Signed-off-by: ffrancis --- plugins/PluginManager/src/PluginManagerStatic.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/PluginManager/src/PluginManagerStatic.cpp b/plugins/PluginManager/src/PluginManagerStatic.cpp index e27437eb..199f7a72 100644 --- a/plugins/PluginManager/src/PluginManagerStatic.cpp +++ b/plugins/PluginManager/src/PluginManagerStatic.cpp @@ -189,6 +189,10 @@ int32_t getDeviceFunc(void** func, std::string name) { PAL_VERBOSE(LOG_TAG, "speaker feedback device CPS"); *reinterpret_cast(func) = &CreateSpeakerDevice; break; + case PAL_DEVICE_IN_CPS2_FEEDBACK: + PAL_VERBOSE(LOG_TAG, "speaker feedback device CPS2"); + *reinterpret_cast(func) = &CreateSpeakerDevice; + break; case PAL_DEVICE_OUT_WIRED_HEADSET: case PAL_DEVICE_OUT_WIRED_HEADPHONE: PAL_VERBOSE(LOG_TAG, "headphone device"); From 9bd39f0ae3ac220c1b82fe4bb76a1a1749b9d38f Mon Sep 17 00:00:00 2001 From: Afroza Nasrin Date: Wed, 8 Apr 2026 15:27:58 +0530 Subject: [PATCH 17/35] pal: Add GKV support for pcm deep buffer mmap playback Add new GKV PCM_DEEP_BUFFER_MMAP as stream type for pcm deep buffer mmap playback and custom config support to select these GKVs. Signed-off-by: ffrancis --- configs/qcom/mobile/art/usecaseKvManager.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configs/qcom/mobile/art/usecaseKvManager.xml b/configs/qcom/mobile/art/usecaseKvManager.xml index 78831bc7..6a0b7964 100644 --- a/configs/qcom/mobile/art/usecaseKvManager.xml +++ b/configs/qcom/mobile/art/usecaseKvManager.xml @@ -60,6 +60,12 @@ + + + + + + From f949c4fee831fd0a31e231be48e0b5e45882d452 Mon Sep 17 00:00:00 2001 From: "Huang, Yidong" Date: Mon, 30 Mar 2026 10:57:39 +0800 Subject: [PATCH 18/35] pal: add support for any motion detection on Skyros Add support for any motion detection on Skyros as other sensor events TILT_TO_WAKE/INTENT_TO_SPEAK are not supported on the platform. Use new modality bit for any motion detection to replace TILT_TO_WAKE/INTENT_TO_SPEAK for Skyros. Signed-off-by: ffrancis --- .../mobile/chora/resourcemanager_chora_atp.xml | 3 +++ .../mobile/chora/resourcemanager_chora_cdp.xml | 3 +++ .../mobile/chora/resourcemanager_chora_mtp.xml | 3 +++ .../mobile/chora/resourcemanager_chora_mtp_qmp.xml | 3 +++ .../mobile/chora/resourcemanager_chora_qrd.xml | 3 +++ .../api/vui-interface/SoundTriggerUtils.h | 1 + .../src/SoundTriggerEngineGsl.cpp | 14 ++++++++++++++ utils/inc/VoiceUIPlatformInfo.h | 2 ++ utils/src/VoiceUIPlatformInfo.cpp | 5 ++++- 9 files changed, 36 insertions(+), 1 deletion(-) diff --git a/configs/qcom/mobile/chora/resourcemanager_chora_atp.xml b/configs/qcom/mobile/chora/resourcemanager_chora_atp.xml index e9756bd1..1ba12626 100644 --- a/configs/qcom/mobile/chora/resourcemanager_chora_atp.xml +++ b/configs/qcom/mobile/chora/resourcemanager_chora_atp.xml @@ -2045,6 +2045,9 @@ + + + diff --git a/configs/qcom/mobile/chora/resourcemanager_chora_cdp.xml b/configs/qcom/mobile/chora/resourcemanager_chora_cdp.xml index 410c817f..330a6763 100644 --- a/configs/qcom/mobile/chora/resourcemanager_chora_cdp.xml +++ b/configs/qcom/mobile/chora/resourcemanager_chora_cdp.xml @@ -2031,6 +2031,9 @@ + + + diff --git a/configs/qcom/mobile/chora/resourcemanager_chora_mtp.xml b/configs/qcom/mobile/chora/resourcemanager_chora_mtp.xml index e9756bd1..1ba12626 100644 --- a/configs/qcom/mobile/chora/resourcemanager_chora_mtp.xml +++ b/configs/qcom/mobile/chora/resourcemanager_chora_mtp.xml @@ -2045,6 +2045,9 @@ + + + diff --git a/configs/qcom/mobile/chora/resourcemanager_chora_mtp_qmp.xml b/configs/qcom/mobile/chora/resourcemanager_chora_mtp_qmp.xml index e9756bd1..1ba12626 100644 --- a/configs/qcom/mobile/chora/resourcemanager_chora_mtp_qmp.xml +++ b/configs/qcom/mobile/chora/resourcemanager_chora_mtp_qmp.xml @@ -2045,6 +2045,9 @@ + + + diff --git a/configs/qcom/mobile/chora/resourcemanager_chora_qrd.xml b/configs/qcom/mobile/chora/resourcemanager_chora_qrd.xml index 92c7e363..7a589644 100644 --- a/configs/qcom/mobile/chora/resourcemanager_chora_qrd.xml +++ b/configs/qcom/mobile/chora/resourcemanager_chora_qrd.xml @@ -2029,6 +2029,9 @@ + + + diff --git a/plugins/vui_interface/api/vui-interface/SoundTriggerUtils.h b/plugins/vui_interface/api/vui-interface/SoundTriggerUtils.h index 6350c695..6994280d 100644 --- a/plugins/vui_interface/api/vui-interface/SoundTriggerUtils.h +++ b/plugins/vui_interface/api/vui-interface/SoundTriggerUtils.h @@ -433,6 +433,7 @@ typedef enum mma_mode_bit_type { CAMERA_FACE = 4, CAMERA_GAZE = 5, ONOFFBODY_DETECTION = 6, + AMD = 7, } mma_mode_bit_type_t; typedef struct tiuv_threshold_config { diff --git a/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp b/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp index a09c93a5..6b7f9a65 100644 --- a/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp +++ b/stream/StreamSoundTrigger/src/SoundTriggerEngineGsl.cpp @@ -2153,6 +2153,20 @@ int32_t SoundTriggerEngineGsl::UpdateSessionPayload(StreamSoundTrigger *s, st_pa mode_bit &= ~(1 << NVD); mode_bit |= (1 << SPEECH); } + /* + * Platforms not supporting TILT_TO_WAKE/INTENT2SPEAK_ACCEL + * need to replace sensor modality with Any Motion Detect(AMD) + */ + if (sm_cfg_ && sm_cfg_->GetEnableAMD()) { + if (mode_bit & (1 << TILT_TO_WAKE)) { + mode_bit &= ~(1 << TILT_TO_WAKE); + mode_bit |= (1 << AMD); + } + if (mode_bit & (1 << INTENT2SPEAK_ACCEL)) { + mode_bit &= ~(1 << INTENT2SPEAK_ACCEL); + mode_bit |= (1 << AMD); + } + } intf_param.data = (void *)&mode_bit; intf_param.size = sizeof(uint32_t); } diff --git a/utils/inc/VoiceUIPlatformInfo.h b/utils/inc/VoiceUIPlatformInfo.h index bbdcfbef..caca5db3 100644 --- a/utils/inc/VoiceUIPlatformInfo.h +++ b/utils/inc/VoiceUIPlatformInfo.h @@ -150,6 +150,7 @@ class VUIStreamConfig : public SoundTriggerXml uint32_t GetBatchSizeInMs() const { return batch_size_in_ms_; } bool IsClientHandleSSR() const { return client_handling_ssr_; } bool GetEnableLPILabEC(st_module_type_t type); + bool GetEnableAMD() const { return enable_amd_; } private: std::string name_; @@ -182,6 +183,7 @@ class VUIStreamConfig : public SoundTriggerXml std::map> vui_uuid_1st_stage_cfg_list_; std::vector ext_det_prop_list_; bool client_handling_ssr_; + bool enable_amd_; }; class VoiceUIPlatformInfo : public SoundTriggerPlatformInfo diff --git a/utils/src/VoiceUIPlatformInfo.cpp b/utils/src/VoiceUIPlatformInfo.cpp index 164c923a..526b71b9 100644 --- a/utils/src/VoiceUIPlatformInfo.cpp +++ b/utils/src/VoiceUIPlatformInfo.cpp @@ -223,7 +223,8 @@ VUIStreamConfig::VUIStreamConfig() : client_handling_ssr_(false), mmap_buffer_duration_(0), mmap_frame_length_(0), - mmap_enable_(false) + mmap_enable_(false), + enable_amd_(false) { ext_det_prop_list_.clear(); } @@ -434,6 +435,8 @@ void VUIStreamConfig::HandleStartTag(const std::string& tag, const char** attrib mmap_buffer_duration_ = std::stoi(value); } else if (key == "mmap_frame_length") { mmap_frame_length_ = std::stoi(value); + } else if (key == "enable_amd") { + enable_amd_ = (value == "true"); } else { PAL_ERR(LOG_TAG, "Invalid attribute %s", key.c_str()); } From 1a297b622df9a634cfe4feb8a6e1ed5f83a486c9 Mon Sep 17 00:00:00 2001 From: Kiran Tukaram Kadam Date: Fri, 10 Apr 2026 12:52:50 +0530 Subject: [PATCH 19/35] PAL: configs: hamoa_la: updated xml configs hamoa_la xml configs updated for QCP & CRD Signed-off-by: ffrancis --- ...mixer_paths_hamoa_x1e80100_crd_wsa884x.xml | 49 +++- ...mixer_paths_hamoa_x1e80100_qcp_wsa884x.xml | 217 ++++++++++++++++++ ...urcemanager_hamoa_x1e80100_crd_wsa884x.xml | 50 ++-- ...urcemanager_hamoa_x1e80100_qcp_wsa884x.xml | 18 ++ .../compute/hamoa_la/usecaseKvManager.xml | 8 + 5 files changed, 319 insertions(+), 23 deletions(-) diff --git a/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_crd_wsa884x.xml b/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_crd_wsa884x.xml index dceb9ab7..2930ea73 100644 --- a/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_crd_wsa884x.xml +++ b/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_crd_wsa884x.xml @@ -27,7 +27,7 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Changes from Qualcomm Technologies, Inc. are provided under the following license: -* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. * SPDX-License-Identifier: BSD-3-Clause-Clear * --> @@ -72,6 +72,8 @@ + + @@ -845,9 +847,9 @@ - + - + @@ -960,13 +962,13 @@ - + - + @@ -1161,12 +1163,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -1254,12 +1280,16 @@ + + + + @@ -1273,8 +1303,12 @@ + + + + @@ -1290,6 +1324,11 @@ + + + + + diff --git a/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_qcp_wsa884x.xml b/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_qcp_wsa884x.xml index af2d9c12..28adb41c 100644 --- a/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_qcp_wsa884x.xml +++ b/configs/qcom/compute/hamoa_la/mixer_paths_hamoa_x1e80100_qcp_wsa884x.xml @@ -1,5 +1,6 @@ + @@ -76,6 +80,7 @@ + @@ -97,6 +102,7 @@ + @@ -135,6 +141,7 @@ + @@ -175,6 +182,7 @@ + @@ -185,6 +193,7 @@ + @@ -193,24 +202,30 @@ + + + + + + @@ -220,220 +235,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -453,22 +541,28 @@ + + + + + + @@ -476,6 +570,7 @@ + @@ -483,6 +578,7 @@ + @@ -490,13 +586,16 @@ + + + @@ -512,14 +611,17 @@ + + + @@ -534,6 +636,7 @@ + @@ -549,55 +652,73 @@ + + + + + + + + + + + + + + + + + + @@ -606,6 +727,7 @@ + @@ -617,6 +739,7 @@ + @@ -631,14 +754,17 @@ + + + @@ -647,6 +773,7 @@ + @@ -658,6 +785,7 @@ + @@ -672,9 +800,11 @@ + + @@ -688,6 +818,7 @@ + @@ -701,9 +832,11 @@ + + @@ -711,76 +844,98 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -789,6 +944,7 @@ + @@ -797,10 +953,13 @@ + + + @@ -811,20 +970,26 @@ + + + + + + @@ -835,6 +1000,7 @@ + @@ -845,6 +1011,7 @@ + @@ -852,6 +1019,7 @@ + @@ -859,6 +1027,7 @@ + @@ -869,6 +1038,7 @@ + @@ -876,6 +1046,7 @@ + @@ -883,16 +1054,21 @@ + + + + + @@ -901,23 +1077,30 @@ + + + + + + + @@ -931,27 +1114,35 @@ + + + + + + + + @@ -995,6 +1186,7 @@ + @@ -1002,9 +1194,11 @@ + + @@ -1014,15 +1208,18 @@ + + + @@ -1035,10 +1232,12 @@ + + @@ -1051,26 +1250,32 @@ + + + + + + @@ -1078,6 +1283,7 @@ + @@ -1085,6 +1291,7 @@ + @@ -1092,6 +1299,7 @@ + @@ -1102,26 +1310,33 @@ + + + + + + + @@ -1133,6 +1348,7 @@ + @@ -1144,6 +1360,7 @@ + diff --git a/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_crd_wsa884x.xml b/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_crd_wsa884x.xml index ac3b1770..60974bd2 100644 --- a/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_crd_wsa884x.xml +++ b/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_crd_wsa884x.xml @@ -40,7 +40,7 @@ - + @@ -132,8 +132,8 @@ - - + + @@ -477,7 +477,7 @@ PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET - BTFM_PROXY-TX-0 + SLIM-DEV1-TX-7 1 1 8000 @@ -620,8 +620,8 @@ PAL_DEVICE_IN_VI_FEEDBACK CODEC_DMA-LPAIF_WSA-TX-0 - 2 - 2 + 4 + 4 8000 32 vi-feedback @@ -645,9 +645,23 @@ cps-feedback-mono-2 + + PAL_DEVICE_IN_CPS2_FEEDBACK + CODEC_DMA-LPAIF_WSA2-TX-2 + 2 + 2 + 24000 + 32 + wsa2-cps-feedback + + PAL_STREAM_VOICE_CALL + 1 + cps-feedback-mono-2 + + PAL_DEVICE_IN_BLUETOOTH_A2DP - BTFM_PROXY-TX-0 + SLIM-DEV1-TX-7 1 1 bt-a2dp-mic @@ -656,7 +670,7 @@ PAL_DEVICE_IN_BLUETOOTH_BLE - BTFM_PROXY-TX-0 + SLIM-DEV1-TX-7 1 1 bt-ble-mic @@ -749,7 +763,7 @@ PAL_DEVICE_IN_BLUETOOTH_HFP - BTFM_PROXY-TX-1 + SLIM-DEV1-TX-7 1 1 8000 @@ -780,8 +794,8 @@ PAL_DEVICE_OUT_SPEAKER CODEC_DMA-LPAIF_WSA-RX-0 - 2 - 2 + 4 + 4 48000 speaker 1 @@ -808,7 +822,7 @@ - PAL_AUDIO_FMT_PCM_S24_LE + PAL_AUDIO_FMT_PCM_S16_LE 0 0 - 0 + 30 PAL_STREAM_VOICE_CALL 1 @@ -957,7 +971,7 @@ PAL_DEVICE_OUT_BLUETOOTH_A2DP - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-a2dp @@ -970,7 +984,7 @@ PAL_DEVICE_OUT_BLUETOOTH_BLE - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-ble @@ -983,7 +997,7 @@ PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-ble @@ -992,7 +1006,7 @@ PAL_DEVICE_OUT_BLUETOOTH_SCO - BTFM_PROXY-RX-0 + SLIM-DEV1-RX-7 1 1 bt-sco @@ -1191,7 +1205,7 @@ PAL_DEVICE_OUT_BLUETOOTH_HFP - BTFM_PROXY-RX-1 + SLIM-DEV1-RX-7 1 1 bt-hfp diff --git a/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml b/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml index 4c7cca5e..60974bd2 100644 --- a/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml +++ b/configs/qcom/compute/hamoa_la/resourcemanager_hamoa_x1e80100_qcp_wsa884x.xml @@ -1,5 +1,6 @@ + 2.0 @@ -641,6 +645,20 @@ cps-feedback-mono-2 + + PAL_DEVICE_IN_CPS2_FEEDBACK + CODEC_DMA-LPAIF_WSA2-TX-2 + 2 + 2 + 24000 + 32 + wsa2-cps-feedback + + PAL_STREAM_VOICE_CALL + 1 + cps-feedback-mono-2 + + PAL_DEVICE_IN_BLUETOOTH_A2DP SLIM-DEV1-TX-7 diff --git a/configs/qcom/compute/hamoa_la/usecaseKvManager.xml b/configs/qcom/compute/hamoa_la/usecaseKvManager.xml index b7e3513c..a62ac45d 100644 --- a/configs/qcom/compute/hamoa_la/usecaseKvManager.xml +++ b/configs/qcom/compute/hamoa_la/usecaseKvManager.xml @@ -26,6 +26,7 @@ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * Changes from Qualcomm Technologies, Inc. are provided under the following license: * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. * SPDX-License-Identifier: BSD-3-Clause-Clear @@ -665,6 +666,13 @@ + + + + + + + From 460fe39f5669bf8c7c39cfda71ff0486cd1174e8 Mon Sep 17 00:00:00 2001 From: Kunlei Zhang Date: Sun, 12 Apr 2026 00:26:18 +0800 Subject: [PATCH 20/35] pal: configs: add support for UV call Add support for UV call Signed-off-by: ffrancis --- configs/qcom/mobile/art/usecaseKvManager.xml | 48 ++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/configs/qcom/mobile/art/usecaseKvManager.xml b/configs/qcom/mobile/art/usecaseKvManager.xml index 6a0b7964..0411cd34 100644 --- a/configs/qcom/mobile/art/usecaseKvManager.xml +++ b/configs/qcom/mobile/art/usecaseKvManager.xml @@ -1439,6 +1439,12 @@ + + + + + + @@ -1463,6 +1469,12 @@ + + + + + + @@ -1545,6 +1557,12 @@ + + + + + + @@ -1569,6 +1587,12 @@ + + + + + + @@ -1630,12 +1654,24 @@ + + + + + + + + + + + + @@ -1676,12 +1712,24 @@ + + + + + + + + + + + + From 0c0b080e8a6b9bc660fe681f797c1a134e7601f9 Mon Sep 17 00:00:00 2001 From: Afroza Nasrin Date: Sun, 5 Apr 2026 23:17:11 +0530 Subject: [PATCH 21/35] pal: Register for watermark events for deepbuffer MMAP usecase Register watermark events for deep-buffer MMAP stream and call client provided callback on receiving these events. Total number of watermark levels are fixed, and the bytes value is dervied from the size of the ring buffer. Signed-off-by: ffrancis --- .../src/ConfigSessionAlsaPcm.cpp | 77 +++++++++++++++++++ session/SessionAR/inc/SessionAR.h | 2 +- session/SessionAR/src/SessionAR.cpp | 18 ++++- session/SessionAlsaPcm/src/SessionAlsaPcm.cpp | 4 +- 4 files changed, 95 insertions(+), 6 deletions(-) diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp index e485899c..e408f57d 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp +++ b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp @@ -83,6 +83,8 @@ #include #include /* Definition of SYSLOG_* constants */ #include +#include "sh_mem_pull_push_mode_api.h" +#include "history_buffer_api.h" /*interface implementation*/ extern "C" int pcmPluginConfig(Stream* stream, plugin_config_name_t config, @@ -283,6 +285,81 @@ int32_t pcmPluginConfigSetConfigStart(Stream* s, void* pluginPayload) sAttr.type == PAL_STREAM_ASR || sAttr.type == PAL_STREAM_CALL_TRANSLATION) { handleEventRegistration(session, 1, mxr, txAifBackEnds, pcmDevIds); + } else if (sAttr.type == PAL_STREAM_DEEP_BUFFER && + (sAttr.flags & PAL_STREAM_FLAG_MMAP_MASK)) { + struct agm_event_reg_cfg *watermark_event_cfg = nullptr; + struct event_cfg_sh_mem_pull_push_mode_watermark_t *watermark_payload = nullptr; + struct event_cfg_sh_mem_pull_push_mode_watermark_level_t *levels = nullptr; + size_t in_buf_size = 0, in_buf_count = 0, out_buf_size = 0, out_buf_count = 0; + uint32_t period_size = 0; + uint32_t period_count = 0; + constexpr uint32_t kWatermarkNumLevels = 10; + size_t watermark_payload_size = 0; + + /* Total shared buffer with DSP = period_size * period_count. + * Register watermark at 10 equal levels + */ + s->getBufInfo(&in_buf_size, &in_buf_count, &out_buf_size, &out_buf_count); + period_size = static_cast(out_buf_size); + period_count = static_cast(out_buf_count); + const uint32_t watermarkStepBytes = + (period_size * period_count) / kWatermarkNumLevels; + + watermark_payload_size = sizeof(uint32_t) + + (kWatermarkNumLevels * sizeof(struct event_cfg_sh_mem_pull_push_mode_watermark_level_t)); + + watermark_payload = (struct event_cfg_sh_mem_pull_push_mode_watermark_t *)calloc(1, watermark_payload_size); + if (!watermark_payload) { + PAL_ERR(LOG_TAG, "Failed to allocate memory for watermark payload"); + status = -ENOMEM; + goto exit; + } + + watermark_payload->num_water_mark_levels = kWatermarkNumLevels; + levels = (struct event_cfg_sh_mem_pull_push_mode_watermark_level_t *) + ((uint8_t *)watermark_payload + sizeof(uint32_t)); + + for (uint32_t i = 0; i < kWatermarkNumLevels; ++i) { + levels[i].watermark_level_bytes = (i + 1) * watermarkStepBytes; + PAL_DBG(LOG_TAG, "watermark registered at byte %d",levels[i].watermark_level_bytes); + } + + tagId = SHMEM_ENDPOINT; + if (miid == 0 && tagId != 0) { + status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), + rxAifBackEnds[0].second.data(), tagId, &miid); + if (status) { + PAL_ERR(LOG_TAG, "Failed to get tag info %x, status = %d", tagId, status); + free(watermark_payload); + goto exit; + } + } + + payload_size = sizeof(struct agm_event_reg_cfg) + watermark_payload_size; + watermark_event_cfg = (struct agm_event_reg_cfg *)calloc(1, payload_size); + if (!watermark_event_cfg) { + PAL_ERR(LOG_TAG, "Failed to allocate memory for watermark event config"); + status = -ENOMEM; + free(watermark_payload); + goto exit; + } + + watermark_event_cfg->event_config_payload_size = watermark_payload_size; + watermark_event_cfg->is_register = 1; + watermark_event_cfg->event_id = EVENT_ID_SH_MEM_PULL_PUSH_MODE_WATERMARK; + watermark_event_cfg->module_instance_id = miid; + + memcpy(watermark_event_cfg->event_config_payload, + watermark_payload, + watermark_payload_size); + + SessionAlsaUtils::registerMixerEvent(mxr, pcmDevIds.at(0), + (void *)watermark_event_cfg, payload_size); + + free(watermark_event_cfg); + free(watermark_payload); + miid = 0; + tagId = 0; } else if (sAttr.type == PAL_STREAM_ULTRASOUND && session->getRegisterForEvents()) { payload_size = sizeof(struct agm_event_reg_cfg); std::vector pcmDevTxIds; diff --git a/session/SessionAR/inc/SessionAR.h b/session/SessionAR/inc/SessionAR.h index 30a4c2a8..c741c97d 100644 --- a/session/SessionAR/inc/SessionAR.h +++ b/session/SessionAR/inc/SessionAR.h @@ -138,7 +138,7 @@ class SessionAR : public Session int setEffectParameters(Stream *s, effect_pal_payload_t *effectPayload); public: SessionAR(); - static void handleSoftPauseCallBack(uint64_t hdl, uint32_t event_id, void *data, uint32_t event_size); + static void handleSessionCallback(uint64_t hdl, uint32_t event_id, void *data, uint32_t event_size); int HDRConfigKeyToDevOrientation(const char* hdr_custom_key); void setPmQosMixerCtl(pmQosVote vote); virtual int32_t getParameters(Stream *s, uint32_t param_id, void **payload) override; diff --git a/session/SessionAR/src/SessionAR.cpp b/session/SessionAR/src/SessionAR.cpp index 988f8db9..c31d262a 100644 --- a/session/SessionAR/src/SessionAR.cpp +++ b/session/SessionAR/src/SessionAR.cpp @@ -42,6 +42,7 @@ #include #include "apm_api.h" #include +#include "sh_mem_pull_push_mode_api.h" struct pcm *SessionAR::pcmEcTx = NULL; std::vector SessionAR::pcmDevEcTxIds = {0}; @@ -59,16 +60,27 @@ SessionAR::SessionAR() { } } -void SessionAR::handleSoftPauseCallBack(uint64_t hdl, uint32_t event_id, - void *data __unused, - uint32_t event_size __unused) +void SessionAR::handleSessionCallback(uint64_t hdl, uint32_t event_id, + void *data, + uint32_t event_size) { + Stream *s = NULL; + pal_stream_callback cb; + PAL_DBG(LOG_TAG,"Event id %x ", event_id); if (event_id == EVENT_ID_SOFT_PAUSE_PAUSE_COMPLETE) { PAL_DBG(LOG_TAG, "Pause done"); pauseCV.notify_all(); } + if (event_id == EVENT_ID_SH_MEM_PULL_PUSH_MODE_WATERMARK) { + PAL_DBG(LOG_TAG, "Watermark event received, notifying client"); + s = reinterpret_cast(hdl); + if (s->getCallBack(&cb) == 0) { + cb(reinterpret_cast(s), event_id, (uint32_t *)data, + event_size, s->cookie); + } + } } void SessionAR::setPmQosMixerCtl(pmQosVote vote) diff --git a/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp b/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp index 59463511..ea5bb616 100644 --- a/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp +++ b/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp @@ -168,11 +168,11 @@ int SessionAlsaPcm::open(Stream * s) goto exit; } - // Register for Soft pause events + // Register for events if (sAttr.direction == PAL_AUDIO_OUTPUT && sAttr.type != PAL_STREAM_HAPTICS && sAttr.type != PAL_STREAM_CALL_TRANSLATION) - registerCallBack(handleSoftPauseCallBack, (uint64_t)s); + registerCallBack(handleSessionCallback, (uint64_t)s); // enable dual mono if (rm->IsDualMonoEnabled() == true) { From f919c68ff840ead8d0ee9f82e860e648654fe6c2 Mon Sep 17 00:00:00 2001 From: Kunlei Zhang Date: Mon, 13 Apr 2026 18:43:48 +0800 Subject: [PATCH 22/35] pal: configs: update sidetone and ec state for UV call Set sidetone and ec to off for UV call. Signed-off-by: ffrancis --- .../mobile/art/resourcemanager_art_cdp.xml | 24 +++++++++++++++++++ .../mobile/art/resourcemanager_art_mtp.xml | 24 +++++++++++++++++++ .../art/resourcemanager_art_mtp_qmp.xml | 24 +++++++++++++++++++ .../mobile/art/resourcemanager_art_qrd.xml | 24 +++++++++++++++++++ .../art/resourcemanager_art_qrd_qmp.xml | 24 +++++++++++++++++++ 5 files changed, 120 insertions(+) diff --git a/configs/qcom/mobile/art/resourcemanager_art_cdp.xml b/configs/qcom/mobile/art/resourcemanager_art_cdp.xml index a4140eae..5653ea8f 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_cdp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_cdp.xml @@ -206,6 +206,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -233,6 +236,9 @@ 4 quad-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -333,6 +339,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -364,6 +373,9 @@ 4 quad-mic + + OFF + PAL_STREAM_LOOPBACK @@ -422,6 +434,9 @@ 48000 16 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -434,6 +449,9 @@ 1 headset-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -524,6 +542,9 @@ PAL_STREAM_VOIP_TX 1 + + 0 + PAL_STREAM_LOW_LATENCY @@ -549,6 +570,9 @@ 1 HW 1 + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY diff --git a/configs/qcom/mobile/art/resourcemanager_art_mtp.xml b/configs/qcom/mobile/art/resourcemanager_art_mtp.xml index e19a1a03..e964dad5 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_mtp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_mtp.xml @@ -235,6 +235,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -262,6 +265,9 @@ 4 quad-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -362,6 +368,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -393,6 +402,9 @@ 4 quad-mic + + OFF + PAL_STREAM_LOOPBACK @@ -452,6 +464,9 @@ 48000 16 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -464,6 +479,9 @@ 1 headset-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -554,6 +572,9 @@ PAL_STREAM_VOIP_TX 1 + + 0 + PAL_STREAM_LOW_LATENCY @@ -579,6 +600,9 @@ 1 HW 1 + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY diff --git a/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml b/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml index 2866ae35..c2052e14 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_mtp_qmp.xml @@ -235,6 +235,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -262,6 +265,9 @@ 4 quad-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -362,6 +368,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -393,6 +402,9 @@ 4 quad-mic + + OFF + PAL_STREAM_LOOPBACK @@ -452,6 +464,9 @@ 48000 16 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -464,6 +479,9 @@ 1 headset-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -554,6 +572,9 @@ PAL_STREAM_VOIP_TX 1 + + 0 + PAL_STREAM_LOW_LATENCY @@ -579,6 +600,9 @@ 1 HW 1 + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY diff --git a/configs/qcom/mobile/art/resourcemanager_art_qrd.xml b/configs/qcom/mobile/art/resourcemanager_art_qrd.xml index b896df77..b0a64be3 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_qrd.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_qrd.xml @@ -235,6 +235,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -262,6 +265,9 @@ 4 quad-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -362,6 +368,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -393,6 +402,9 @@ 4 quad-mic + + OFF + PAL_STREAM_LOOPBACK @@ -452,6 +464,9 @@ 48000 16 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -464,6 +479,9 @@ 1 headset-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -554,6 +572,9 @@ PAL_STREAM_VOIP_TX 1 + + 0 + PAL_STREAM_LOW_LATENCY @@ -579,6 +600,9 @@ 1 HW 1 + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY diff --git a/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml b/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml index 8eb3de09..add8cd4d 100644 --- a/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml +++ b/configs/qcom/mobile/art/resourcemanager_art_qrd_qmp.xml @@ -243,6 +243,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -270,6 +273,9 @@ 4 quad-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -382,6 +388,9 @@ PAL_STREAM_VOIP_TX 2 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -413,6 +422,9 @@ 4 quad-mic + + OFF + PAL_STREAM_LOOPBACK @@ -464,6 +476,9 @@ 48000 16 1 + + 0 + PAL_STREAM_VOICE_CALL @@ -476,6 +491,9 @@ 1 headset-mic + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY @@ -566,6 +584,9 @@ PAL_STREAM_VOIP_TX 1 + + 0 + PAL_STREAM_LOW_LATENCY @@ -591,6 +612,9 @@ 1 HW 1 + + OFF + PAL_STREAM_ULTRA_LOW_LATENCY From bb8c27bfb8308b47c43eaf337f4bced01f00ae44 Mon Sep 17 00:00:00 2001 From: Shijie Lin Date: Mon, 13 Apr 2026 20:43:33 -0700 Subject: [PATCH 23/35] Revert "PAL:BTUtils: Protect active stream access" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reason for revert: Signed-off-by: ffrancis --- utils/src/BTUtils.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/utils/src/BTUtils.cpp b/utils/src/BTUtils.cpp index 4118ba6c..d27623d1 100644 --- a/utils/src/BTUtils.cpp +++ b/utils/src/BTUtils.cpp @@ -434,7 +434,6 @@ int32_t BTUtilsDeviceNotReady(Stream *s, bool& a2dpSuspend) dattr.id = spkrDattr.id; dev = spkrDev; - rm->lockActiveStream(); rm->getActiveStream_l(activeStreams, spkrDev); if (activeStreams.empty()) { rm->getActiveStream_l(activeStreams, handsetDev); @@ -456,7 +455,6 @@ int32_t BTUtilsDeviceNotReady(Stream *s, bool& a2dpSuspend) dev->setDeviceAttributes(dattr); } } - rm->unlockActiveStream(); PAL_INFO(LOG_TAG, "mute stream and route to device %d", dattr.id); @@ -527,9 +525,7 @@ void handleA2dpBleConcurrency(std::shared_ptr *inDev, PAL_ERR(LOG_TAG, "getting a2dp/ble device instance failed"); return; } - rm->lockActiveStream(); rm->getActiveStream_l(streams, dev); - rm->unlockActiveStream(); if (streams.size() == 0) { return; } @@ -545,9 +541,7 @@ void handleA2dpBleConcurrency(std::shared_ptr *inDev, } else if (inDevAttr->id == PAL_DEVICE_OUT_BLUETOOTH_A2DP) { devAttr.id = PAL_DEVICE_IN_BLUETOOTH_BLE; dev = Device::getInstance(&devAttr, rm); - rm->lockActiveStream(); rm->getActiveStream_l(streams, dev); - rm->unlockActiveStream(); if (streams.size() > 0) { inDevAttr->id = PAL_DEVICE_OUT_DUMMY; if (rm->getDeviceConfig(inDevAttr, NULL)) { From 90e0a6201c2692ca07354e2b6989d138a8f0b068 Mon Sep 17 00:00:00 2001 From: Ajender Reddy Date: Tue, 7 Apr 2026 11:38:09 +0530 Subject: [PATCH 24/35] Bluetooth: skip BT host operations where BtSco as HFP devices The BtSco class is shared by both SCO and HFP use cases, but their requirements differ. HFP client devices do not require Bluetooth host codec negotiation, while SCO devices do. Introduce an explicit HFP client flag to distinguish these roles and avoid executing unnecessary BT host operations for HFP clients. This clarifies current behavior while keeping the existing shared implementation intact, and avoids incorrect codec handling for HFP devices until SCO and HFP devices are fully separated. Later, as a Todo, need to create different class for HFP devices. Signed-off-by: ffrancis --- device/Bluetooth/inc/Bluetooth.h | 4 +++- device/Bluetooth/src/Bluetooth.cpp | 23 ++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/device/Bluetooth/inc/Bluetooth.h b/device/Bluetooth/inc/Bluetooth.h index 41732b08..f7272d89 100644 --- a/device/Bluetooth/inc/Bluetooth.h +++ b/device/Bluetooth/inc/Bluetooth.h @@ -296,9 +296,11 @@ class BtSco : public Bluetooth static std::shared_ptr sObjTx; static std::shared_ptr sObjHfpRx; static std::shared_ptr sObjHfpTx; - BtSco(struct pal_device *device, std::shared_ptr Rm); + BtSco(struct pal_device* device, std::shared_ptr Rm, + const bool isActAsHFPDevice = false); bool mIsScoOn = false; bool mIsHfpOn = false; + bool mIsActAsHFPDevice = false; static bool sIsWbSpeechEnabled; static int sSwbSpeechMode; static bool sIsSwbLc3Enabled; diff --git a/device/Bluetooth/src/Bluetooth.cpp b/device/Bluetooth/src/Bluetooth.cpp index b7e3f16c..81630a71 100644 --- a/device/Bluetooth/src/Bluetooth.cpp +++ b/device/Bluetooth/src/Bluetooth.cpp @@ -77,6 +77,8 @@ extern "C" void CreateBtDevice(struct pal_device *device, break; case PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET: case PAL_DEVICE_OUT_BLUETOOTH_SCO: + *dev = BtSco::getInstance(device, rm); + break; case PAL_DEVICE_IN_BLUETOOTH_HFP: case PAL_DEVICE_OUT_BLUETOOTH_HFP: *dev = BtSco::getInstance(device, rm); @@ -2666,9 +2668,8 @@ std::shared_ptr BtSco::sObjHfpRx = nullptr; std::shared_ptr BtSco::sObjHfpTx = nullptr; bool BtSco::sIsHFPSyncEnabled = true; -BtSco::BtSco(struct pal_device *device, std::shared_ptr Rm) - : Bluetooth(device, Rm) -{ +BtSco::BtSco(struct pal_device* device, std::shared_ptr Rm, const bool isActAsHFPDevice) + : Bluetooth(device, Rm), mIsActAsHFPDevice(isActAsHFPDevice) { sHFPProfile = device::bt::HFPProfile::getInstance(); mCodecType = (device->id == PAL_DEVICE_OUT_BLUETOOTH_SCO) ? ENC : DEC; mPluginHandler = NULL; @@ -2713,6 +2714,9 @@ int32_t BtSco::checkAndUpdateSampleRate(uint32_t *sampleRate) } int BtSco::openBTHost() { + if(mIsActAsHFPDevice) { + return 0; + } if(!sIsHFPSyncEnabled) { /* HFP sync disabled. Hence, return success.*/ return 0; @@ -2725,6 +2729,9 @@ int BtSco::openBTHost() { } int BtSco::closeBTHost() { + if(mIsActAsHFPDevice) { + return 0; + } if (!sIsHFPSyncEnabled) { /* HFP sync disabled. Hence, return success.*/ return 0; @@ -2977,6 +2984,9 @@ int BtSco::getCodecConfigFromBTHost() { } int BtSco::startBTHost() { + if(mIsActAsHFPDevice) { + return 0; + } if (!sIsHFPSyncEnabled) { /* HFP sync disabled. Hence, return success.*/ return 0; @@ -3073,6 +3083,9 @@ int BtSco::start() } int BtSco::stopBTHost() { + if(mIsActAsHFPDevice) { + return 0; + } if (!sIsHFPSyncEnabled) { /* HFP sync disabled. Hence, return success.*/ return 0; @@ -3150,7 +3163,7 @@ std::shared_ptr BtSco::getInstance(struct pal_device *device, std::lock_guard lock(Device::mInstMutex); if (!sObjHfpRx) { PAL_DBG(LOG_TAG, "creating instance for %d", device->id); - std::shared_ptr sp(new BtSco(device, Rm)); + std::shared_ptr sp(new BtSco(device, Rm, true)); sObjHfpRx = sp; } } @@ -3160,7 +3173,7 @@ std::shared_ptr BtSco::getInstance(struct pal_device *device, std::lock_guard lock(Device::mInstMutex); if (!sObjHfpTx) { PAL_DBG(LOG_TAG, "creating instance for %d", device->id); - std::shared_ptr sp(new BtSco(device, Rm)); + std::shared_ptr sp(new BtSco(device, Rm, true)); sObjHfpTx = sp; } } From 927a275c53718b9d67610526dd2829249a0f7a24 Mon Sep 17 00:00:00 2001 From: "Huang, Yidong" Date: Mon, 13 Apr 2026 14:55:42 +0800 Subject: [PATCH 25/35] pal: free front end ids after mixer event callback deregistered When closing VoiceUI usecase, mixer event callback fails to be deregistered as front end id is released before this deregistration. This may cause unexpected unload failure. Free front end ids after mixer event callback is deregistered to avoid failure in unload operation. Signed-off-by: ffrancis --- session/SessionAlsaPcm/src/SessionAlsaPcm.cpp | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp b/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp index ea5bb616..cd69258a 100644 --- a/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp +++ b/session/SessionAlsaPcm/src/SessionAlsaPcm.cpp @@ -1537,7 +1537,6 @@ int SessionAlsaPcm::close(Stream * s) sAttr.type == PAL_STREAM_SENSOR_PCM_DATA) ldir = TX_HOSTLESS; - freeFrontEndIds(sAttr, ldir); pcm = NULL; break; case PAL_AUDIO_OUTPUT: @@ -1608,7 +1607,6 @@ int SessionAlsaPcm::close(Stream * s) (sAttr.type == PAL_STREAM_SENSOR_PCM_RENDERER)) ldir = RX_HOSTLESS; - freeFrontEndIds(sAttr, ldir); pcm = NULL; break; case PAL_AUDIO_INPUT | PAL_AUDIO_OUTPUT: @@ -1658,23 +1656,17 @@ int SessionAlsaPcm::close(Stream * s) PAL_ERR(LOG_TAG, "pcm_close - tx failed %d", status); } - if (pcmDevRxIds.size()) - freeFrontEndIds(sAttr, RX_HOSTLESS); - if (pcmDevTxIds.size()) - freeFrontEndIds(sAttr, TX_HOSTLESS); pcmRx = NULL; pcmTx = NULL; break; } - frontEndIdAllocated = false; - mState = SESSION_IDLE; if (sAttr.type == PAL_STREAM_VOICE_UI || sAttr.type == PAL_STREAM_ACD || sAttr.type == PAL_STREAM_ASR || sAttr.type == PAL_STREAM_CONTEXT_PROXY || sAttr.type == PAL_STREAM_ULTRASOUND || - sAttr.type ==PAL_STREAM_CALL_TRANSLATION || + sAttr.type == PAL_STREAM_CALL_TRANSLATION || (sAttr.type == PAL_STREAM_HAPTICS && sAttr.info.opt_stream_info.haptics_type == PAL_STREAM_HAPTICS_TOUCH)) { switch (sAttr.type) { @@ -1699,6 +1691,18 @@ int SessionAlsaPcm::close(Stream * s) } } + if (sAttr.direction == PAL_AUDIO_INPUT || + sAttr.direction == PAL_AUDIO_OUTPUT) { + freeFrontEndIds(sAttr, ldir); + } else { + if (pcmDevRxIds.size()) + freeFrontEndIds(sAttr, RX_HOSTLESS); + if (pcmDevTxIds.size()) + freeFrontEndIds(sAttr, TX_HOSTLESS); + } + frontEndIdAllocated = false; + mState = SESSION_IDLE; + builder->freeCustomPayload(); if (eventPayloadList.size() > 0) clearEventPayloadList(); From 925997dcf44657985f6c262bac03cfb7aae36cbe Mon Sep 17 00:00:00 2001 From: Saketh Cherukuri Date: Thu, 26 Mar 2026 14:47:45 +0530 Subject: [PATCH 26/35] pal: configs: Disable AUDIO_FLUENCE_SMECNS for hamoa_la Fluence NPOR for Hamoa_la Signed-off-by: ffrancis --- configs/qcom/compute/hamoa_la/usecaseKvManager.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/configs/qcom/compute/hamoa_la/usecaseKvManager.xml b/configs/qcom/compute/hamoa_la/usecaseKvManager.xml index a62ac45d..c52d71a9 100644 --- a/configs/qcom/compute/hamoa_la/usecaseKvManager.xml +++ b/configs/qcom/compute/hamoa_la/usecaseKvManager.xml @@ -1330,8 +1330,6 @@ - - From e664be31daa393cd66d9312b96009449e6abc00d Mon Sep 17 00:00:00 2001 From: fmoughal Date: Fri, 17 Apr 2026 12:58:10 +0530 Subject: [PATCH 27/35] pal: Remove 4ch SP support for Haptics in payloadbuilder Remove 4ch SP support for Haptics in payloadbuilder Signed-off-by: ffrancis --- session/SessionAR/src/PayloadBuilder.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/session/SessionAR/src/PayloadBuilder.cpp b/session/SessionAR/src/PayloadBuilder.cpp index 44dbca50..767cc04a 100644 --- a/session/SessionAR/src/PayloadBuilder.cpp +++ b/session/SessionAR/src/PayloadBuilder.cpp @@ -3890,22 +3890,14 @@ int PayloadBuilder::populateCalKeyVector(Stream *s, std::vector 1) { + PAL_DBG(LOG_TAG, "Multi channel Haptics Dev"); + ckv.push_back(std::make_pair(HAPTICS_PRO_DEV_MAP, HAPTICS_LEFT_RIGHT)); + } + else { + PAL_DBG(LOG_TAG, "Mono channel Haptics Dev"); + ckv.push_back(std::make_pair(HAPTICS_PRO_DEV_MAP, HAPTICS_LEFT_MONO)); + } break; } } From 0544c59cc9499361167e7f5565ba8570561d260e Mon Sep 17 00:00:00 2001 From: SHIKHAR MATHUR Date: Wed, 28 Jan 2026 11:58:39 -0800 Subject: [PATCH 28/35] pal : initial support for FFECNS UV audio cue add support for FFECNS/FNN UV audio cue. Based on the multi-usecase specific enable/disable value configure the usecase to start with applying the trained cue_data to the FFECNS/FFN module param to filter out the User Verified captured data/audio only. Signed-off-by: ffrancis --- Android.mk | 6 + Makefile.am | 2 + inc/PalDefs.h | 25 +- .../src/ConfigSessionAlsaPcm.cpp | 57 +++ .../src/ConfigSessionAlsaVoice.cpp | 26 ++ resource_manager/src/ResourceManager.cpp | 28 +- session/SessionAR/inc/PayloadBuilder.h | 5 +- session/SessionAR/inc/SessionAlsaUtils.h | 10 +- session/SessionAR/src/PayloadBuilder.cpp | 56 +++ session/SessionAR/src/SessionAlsaUtils.cpp | 48 +++ utils/inc/UvVoiceCueUtils.h | 30 ++ utils/src/UvVoiceCueUtils.cpp | 334 ++++++++++++++++++ 12 files changed, 619 insertions(+), 8 deletions(-) create mode 100644 utils/inc/UvVoiceCueUtils.h create mode 100644 utils/src/UvVoiceCueUtils.cpp diff --git a/Android.mk b/Android.mk index 0f71bc43..c029d8b3 100644 --- a/Android.mk +++ b/Android.mk @@ -189,6 +189,12 @@ else LOCAL_SRC_FILES += utils/src/BTUtils.cpp endif +ifeq ($(TARGET_DISABLE_PAL_UVVOICECUE),true) +LOCAL_CFLAGS += -DUVVOICECUE_FEATURES_DISABLED +else +LOCAL_SRC_FILES += utils/src/UvVoiceCueUtils.cpp +endif + include $(BUILD_SHARED_LIBRARY) #------------------------------------------- diff --git a/Makefile.am b/Makefile.am index ed745a81..93bd6171 100644 --- a/Makefile.am +++ b/Makefile.am @@ -40,6 +40,7 @@ pal_sources = $(top_srcdir)/stream/src/Stream.cpp \ $(top_srcdir)/utils/src/ACDPlatformInfo.cpp \ $(top_srcdir)/utils/src/ASRPlatformInfo.cpp \ $(top_srcdir)/utils/src/STUtils.cpp + $(top_srcdir)/utils/src/UvVoiceCueUtils.cpp else AM_CPPFLAGS := -I $(top_srcdir)/stream/inc AM_CPPFLAGS += -I $(top_srcdir)/device/inc @@ -78,6 +79,7 @@ pal_sources = $(top_srcdir)/stream/src/Stream.cpp \ $(top_srcdir)/utils/src/ASRPlatformInfo.cpp \ $(top_srcdir)/utils/src/STUtils.cpp \ $(top_srcdir)/utils/src/BTUtils.cpp + $(top_srcdir)/utils/src/UvVoiceCueUtils.cpp endif AM_CPPFLAGS += -D__unused=__attribute__\(\(__unused__\)\) -DLINUX_ENABLED diff --git a/inc/PalDefs.h b/inc/PalDefs.h index f5fd83af..7705ea63 100644 --- a/inc/PalDefs.h +++ b/inc/PalDefs.h @@ -60,7 +60,7 @@ extern "C" { #define PAL_MAX_LATENCY_MODES 8 #define PAL_CUSTOM_PARAM_MAX_STRING_LENGTH 64 -#define PAL_VERSION "2.1" +#define PAL_VERSION "2.2" #define PAL_MAX_SOUND_DOSE_VALUES 10 #define SEND_MSG_PARAM "sendMsg" @@ -903,6 +903,8 @@ typedef enum { PAL_PARAM_ID_MULTI_CLIENT_ASR_OUTPUT = 107, PAL_PARAM_ID_MULTI_CLIENT_SDZ_OUTPUT = 108, PAL_PARAM_ID_VOICE_NS_RX_CFG = 109, + PAL_PARAM_ID_UV_VOICE_CUE_ENABLE = 110, + PAL_PARAM_ID_UV_VOICE_CUE_DATA_BYTE = 111, } pal_param_id_type_t; /** HDMI/DP */ @@ -1541,10 +1543,29 @@ struct call_translation_config { bool enable; pal_call_translation_direction call_translation_dir; /** Direction for the call_translation usecase */ struct pal_tts_config tts_module_config; /** TTS module config */ - struct pal_nmt_config nmt_module_config; /** NMT module config */ + struct pal_nmt_config nmt_module_config; /** NMT module config */ struct pal_asr_config asr_module_config; /** ASR module config */ }; +enum { + UV_FLUENCE_TELEPHONY_BIT = 0x1, // (1 << 0) = 1 -> voice + UV_FLUENCE_AUDIO_BIT = 0x1 << 1, // (1 << 1) = 2 -> audio + UV_FLUENCE_VOIP_BIT = 0x1 << 2, // (1 << 2) = 4 -> voip + UV_FLUENCE_SVA_BIT = 0x1 << 3, // (1 << 3) = 8 -> sva + + // Union of all defined bits + UV_FLUENCE_BIT_ALL = UV_FLUENCE_TELEPHONY_BIT | + UV_FLUENCE_AUDIO_BIT | + UV_FLUENCE_VOIP_BIT | + UV_FLUENCE_SVA_BIT, +}; + +typedef struct uv_fluence_config { + uint32_t usecase_mask; /**< Bit mask indicating which use case(s) are to be updated. */ + size_t param_size; /**< Size of voice cue payload in bytes. */ + uint8_t *voice_cue_param; /**< Pointer to voice cue payload. */ +} uv_fluence_config_t; + #define MAX_TRANSCRIPTION_CHAR_SIZE 1024 #define MAX_JSON_CHAR_SIZE 4096 #define MAX_NUM_WORDS 200 diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp index e408f57d..b7b6d075 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp +++ b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp @@ -75,6 +75,10 @@ #include "ConfigSessionAlsaPcm.h" #include "ConfigSessionUtils.h" +#ifndef UVVOICECUE_FEATURES_DISABLED +#include "UvVoiceCueUtils.h" +#endif + // ASR handlecb def supports #include "asr_module_calibration_api.h" #include "sdz_api.h" @@ -248,6 +252,9 @@ int32_t pcmPluginConfigSetConfigStart(Stream* s, void* pluginPayload) int payload_size = 0; uint32_t tag = 0; std::vector MIIDs; + #ifndef UVVOICECUE_FEATURES_DISABLED + uint32_t currentValues; + #endif PAL_DBG(LOG_TAG, "Enter"); memset(&streamData, 0, sizeof(struct sessionToPayloadParam)); @@ -574,6 +581,23 @@ int32_t pcmPluginConfigSetConfigStart(Stream* s, void* pluginPayload) PAL_ERR(LOG_TAG, "Cannot set the mux-demux tag, as ongoing voice with Call Translation not found"); goto set_mixer; } + #ifndef UVVOICECUE_FEATURES_DISABLED + currentValues = getUvMaskUseCaseValues(); + if ((currentValues & UV_FLUENCE_VOIP_BIT) && + (getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0)) { + status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), + txAifBackEnds[0].second.data(), TAG_UVCALL_VOICECUE, &miid); + if (status != 0) { + PAL_ERR(LOG_TAG,"getModuleInstanceId failed\n"); + } else { + PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d\n", miid, pcmDevIds.at(0)); + status = SessionAlsaUtils::checkAndSetUvVoiceCue(s, mxr, pcmDevIds.at(0), miid, rm, builder, UV_FLUENCE_VOIP_BIT); + if (0 != status) { + PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); + } + } + } + #endif } configure_pspfmfc: status = s->getAssociatedDevices(associatedDevices); @@ -672,6 +696,22 @@ int32_t pcmPluginConfigSetConfigStart(Stream* s, void* pluginPayload) SessionAlsaUtils::setMixerParameter(mxr, pcmDevIds.at(0), payload, payloadSize); builder->freeCustomPayload(); + #ifndef UVVOICECUE_FEATURES_DISABLED + currentValues = getUvMaskUseCaseValues(); + if ((currentValues & UV_FLUENCE_SVA_BIT) && + (getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0)) { + status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), txAifBackEnds[0].second.data(), TAG_UVCALL_VOICECUE, &miid); + if (status != 0) { + PAL_ERR(LOG_TAG,"getModuleInstanceId failed\n"); + } else { + PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d\n", miid, pcmDevIds.at(0)); + status = SessionAlsaUtils::checkAndSetUvVoiceCue(s, mxr, pcmDevIds.at(0), miid, rm, builder, UV_FLUENCE_SVA_BIT); + if (0 != status) { + PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); + } + } + } + #endif } else if (sAttr.type == PAL_STREAM_ULTRA_LOW_LATENCY) { status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), txAifBackEnds[0].second.data(), @@ -776,6 +816,23 @@ int32_t pcmPluginConfigSetConfigStart(Stream* s, void* pluginPayload) status = 0; } } + #ifndef UVVOICECUE_FEATURES_DISABLED + currentValues = getUvMaskUseCaseValues(); + if ((currentValues & UV_FLUENCE_AUDIO_BIT) && + (getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0)) { + status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), + txAifBackEnds[0].second.data(), TAG_UVCALL_VOICECUE, &miid); + if (status != 0) { + PAL_ERR(LOG_TAG,"getModuleInstanceId failed\n"); + } else { + PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d\n", miid, pcmDevIds.at(0)); + status = SessionAlsaUtils::checkAndSetUvVoiceCue(s, mxr, pcmDevIds.at(0), miid, rm, builder, UV_FLUENCE_AUDIO_BIT); + if (0 != status) { + PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); + } + } + } + #endif } if (sAttr.type == PAL_STREAM_CALL_TRANSLATION) { status = configureCallTranslationModules(s, builder, mxr, session, rm); diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp index 5aeac613..ca7e194b 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp +++ b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp @@ -61,6 +61,10 @@ SPDX-License-Identifier: BSD-3-Clause-Clear #include "ConfigSessionUtils.h" #include "ConfigSessionAlsaVoice.h" +#ifndef UVVOICECUE_FEATURES_DISABLED +#include "UvVoiceCueUtils.h" +#endif + #define POP_SUPPRESSOR_RAMP_DELAY (1*1000) /*interface implementation*/ @@ -318,6 +322,10 @@ int32_t voicePluginConfigSetConfigStart(Stream* s, void* pluginPayload) std::vector> associatedDevices; std::vector> txAifBackEnds; ReconfigPluginPayload ppld; +#ifndef UVVOICECUE_FEATURES_DISABLED + uint32_t miid = 0; + uint32_t currentValues; +#endif PAL_DBG(LOG_TAG,"Enter"); rm = ResourceManager::getInstance(); @@ -416,6 +424,24 @@ int32_t voicePluginConfigSetConfigStart(Stream* s, void* pluginPayload) silence_det_setup_done: status = 0; } +#ifndef UVVOICECUE_FEATURES_DISABLED + currentValues = getUvMaskUseCaseValues(); + if ((currentValues & UV_FLUENCE_TELEPHONY_BIT) && + (getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0)) { + status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), + txAifBackEnds[0].second.data(), TAG_UVCALL_VOICECUE, &miid); + if (status != 0) { + PAL_ERR(LOG_TAG,"getModuleInstanceId failed\n"); + goto exit; + } else { + PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d\n", miid, pcmDevIds.at(0)); + status = SessionAlsaUtils::checkAndSetUvVoiceCue(s, mxr, pcmDevIds.at(0), miid, rm, builder, UV_FLUENCE_TELEPHONY_BIT); + if (0 != status) { + PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); + } + } + } +#endif exit: if (builder) delete builder; diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp index 85047703..1aa09495 100644 --- a/resource_manager/src/ResourceManager.cpp +++ b/resource_manager/src/ResourceManager.cpp @@ -64,6 +64,10 @@ #include "BTUtils.h" #endif +#ifndef UVVOICECUE_FEATURES_DISABLED +#include "UvVoiceCueUtils.h" +#endif + #ifdef PAL_CUTILS_SUPPORTED @@ -985,6 +989,10 @@ ResourceManager::ResourceManager() throw std::runtime_error("Failed to allocate ContextManager"); } + #ifndef UVVOICECUE_FEATURES_DISABLED + PAL_DBG(LOG_TAG, "Retrieve the Cue Data from bin file if it already exists."); + retrieveVoiceCueFromFile(); + #endif #ifdef SOC_PERIPHERAL_PROT socPerithread = std::thread(loadSocPeripheralLib); @@ -7693,6 +7701,24 @@ int ResourceManager::setParameter(uint32_t param_id, void *param_payload, PAL_DBG(LOG_TAG, "wnr module enable state updated to %d", rm->wnrEnableStatus); } break; + case PAL_PARAM_ID_UV_VOICE_CUE_ENABLE: + { + #ifndef UVVOICECUE_FEATURES_DISABLED + status = handleUvVoiceCueEnable(param_payload, payload_size); + if (status) + PAL_ERR(LOG_TAG, "handleUvVoiceCueEnable failed, status %d", status); + #endif + break; + } + case PAL_PARAM_ID_UV_VOICE_CUE_DATA_BYTE: + { + #ifndef UVVOICECUE_FEATURES_DISABLED + status = handleUvVoiceCueData(param_payload, payload_size); + if (status) + PAL_ERR(LOG_TAG, "handleUvVoiceCueData failed, status %d", status); + #endif + break; + } default: #ifndef SOUND_TRIGGER_FEATURES_DISABLED mResourceManagerMutex.unlock(); @@ -10388,4 +10414,4 @@ int ResourceManager::setUltrasoundGain(pal_ultrasound_gain_t gain, Stream *s) } return status; -} +} \ No newline at end of file diff --git a/session/SessionAR/inc/PayloadBuilder.h b/session/SessionAR/inc/PayloadBuilder.h index 688fd9af..7064f457 100644 --- a/session/SessionAR/inc/PayloadBuilder.h +++ b/session/SessionAR/inc/PayloadBuilder.h @@ -293,7 +293,10 @@ class PayloadBuilder pal_param_dtmf_gen_tone_cfg_t *dtmf_payload); int payloadSoundDoseInfo(uint8_t **payload, size_t *size, uint32_t moduleId); - +#ifndef UVVOICECUE_FEATURES_DISABLED + void payloadUvVoiceCueData(uint8_t** payload, size_t* size, + uint32_t miid, void *cueData, uint32_t usecaseMask); +#endif int populateStreamKV(Stream* s, std::vector > &keyVector); int populateStreamKV(Stream* s, std::vector > &keyVectorRx, std::vector > &keyVectorTx ,struct vsid_info vsidinfo); diff --git a/session/SessionAR/inc/SessionAlsaUtils.h b/session/SessionAR/inc/SessionAlsaUtils.h index 48335e11..22f3a326 100644 --- a/session/SessionAR/inc/SessionAlsaUtils.h +++ b/session/SessionAR/inc/SessionAlsaUtils.h @@ -26,9 +26,9 @@ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * Changes from Qualcomm Innovation Center, Inc. are provided under the following license: - * Copyright (c) 2023-2025 Qualcomm Innovation Center, Inc. All rights reserved. - * SPDX-License-Identifier: BSD-3-Clause-Clear + * Changes from Qualcomm Technologies, Inc. are provided under the following license: + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * SPDX-License-Identifier: BSD-3-Clause-Clear */ #ifndef SESSION_ALSAUTILS_H @@ -190,7 +190,9 @@ class SessionAlsaUtils void *payload, int size); static int flush(std::shared_ptr rm, uint32_t id); static int getScoDevCount(void); - +#ifndef UVVOICECUE_FEATURES_DISABLED + static int checkAndSetUvVoiceCue(Stream *s, struct mixer *mixer, int device, uint32_t miid, const std::shared_ptr& rm, PayloadBuilder* builder, uint32_t usecaseMask); +#endif }; #endif //SESSION_ALSA_UTILS diff --git a/session/SessionAR/src/PayloadBuilder.cpp b/session/SessionAR/src/PayloadBuilder.cpp index 767cc04a..3f0800cd 100644 --- a/session/SessionAR/src/PayloadBuilder.cpp +++ b/session/SessionAR/src/PayloadBuilder.cpp @@ -92,6 +92,11 @@ #define PARAM_ID_MODULE_ENABLE 0x08001026 +#ifndef UVVOICECUE_FEATURES_DISABLED +#define PARAM_ID_FFECNS_VOICECUE 0x08001BB2 +#define PARAM_ID_FLUENCE_NN_VOICECUE 0x08001AD3 +#endif + /* ID of the Master Gain parameter used by MODULE_ID_VOL_CTRL. */ #define PARAM_ID_VOL_CTRL_MASTER_GAIN 0x08001035 /* ID of the channel mixer coeff for MODULE_ID_MFC */ @@ -5817,3 +5822,54 @@ void PayloadBuilder::payloadVoiceNsRxConfigEnableDisable(uint8_t** payload, size PAL_DBG(LOG_TAG, "customPayload address %p and size %zu", payloadInfo, *size); } + +#ifndef UVVOICECUE_FEATURES_DISABLED +void PayloadBuilder::payloadUvVoiceCueData(uint8_t** payload, size_t* size, + uint32_t miid, void *cueData, uint32_t usecaseMask) +{ + struct apm_module_param_data_t* header = NULL; + uint8_t* payloadInfo = NULL; + size_t payloadSize = 0, padBytes = 0; + pal_param_payload *palPayload = (pal_param_payload *)cueData; + + payloadSize = sizeof(struct apm_module_param_data_t) + palPayload->payload_size; + padBytes = PAL_PADDING_8BYTE_ALIGN(payloadSize); + + payloadInfo = (uint8_t*) calloc(1, payloadSize + padBytes); + if (!payloadInfo) { + PAL_ERR(LOG_TAG, "payloadInfo malloc failed %s", strerror(errno)); + return; + } + header = (struct apm_module_param_data_t *)payloadInfo; + header->module_instance_id = miid; + + switch (usecaseMask) { + case UV_FLUENCE_TELEPHONY_BIT: + case UV_FLUENCE_VOIP_BIT: + header->param_id = PARAM_ID_FLUENCE_NN_VOICECUE; + break; + case UV_FLUENCE_AUDIO_BIT: + case UV_FLUENCE_SVA_BIT: + header->param_id = PARAM_ID_FFECNS_VOICECUE; + break; + default: + PAL_ERR(LOG_TAG, "Invalid UV usecaseMask 0x%x", usecaseMask); + free(payloadInfo); + return; + } + + header->error_code = 0x0; + header->param_size = payloadSize - sizeof(struct apm_module_param_data_t); + PAL_DBG(LOG_TAG, "header params \n IID:%x param_id:%x error_code:%d param_size:%d", + header->module_instance_id, header->param_id, + header->error_code, header->param_size); + + uint8_t *dataPayload = (uint8_t *)(payloadInfo + sizeof(struct apm_module_param_data_t)); + memcpy(dataPayload, palPayload->payload, palPayload->payload_size); + + *size = payloadSize + padBytes; + *payload = payloadInfo; + PAL_DBG(LOG_TAG, "customPayload address %pK and size %zu", payloadInfo, + *size); +} +#endif \ No newline at end of file diff --git a/session/SessionAR/src/SessionAlsaUtils.cpp b/session/SessionAR/src/SessionAlsaUtils.cpp index 4dd0ba5d..810b9cc5 100644 --- a/session/SessionAR/src/SessionAlsaUtils.cpp +++ b/session/SessionAR/src/SessionAlsaUtils.cpp @@ -48,6 +48,10 @@ #include #include "gsl_intf.h" +#ifndef UVVOICECUE_FEATURES_DISABLED +#include "UvVoiceCueUtils.h" +#endif + static constexpr const char* const COMPRESS_SND_DEV_NAME_PREFIX = "COMPRESS"; static constexpr const char* const PCM_SND_DEV_NAME_PREFIX = "PCM"; static constexpr const char* const PCM_SND_VOICE_DEV_NAME_PREFIX = "VOICEMMODE"; @@ -2795,3 +2799,47 @@ int32_t SessionAlsaUtils::pauseInCallMusic() { PAL_DBG(LOG_TAG,"Exit ret: %d", status); return status; } + +#ifndef UVVOICECUE_FEATURES_DISABLED +int SessionAlsaUtils::checkAndSetUvVoiceCue(Stream *s, struct mixer *mixer, int device, uint32_t miid, const std::shared_ptr& rm, PayloadBuilder* builder, uint32_t usecaseMask) +{ + int status = 0; + uint8_t* payload = NULL; + size_t payloadSize = 0; + + PAL_DBG(LOG_TAG, "%s: Enter", __func__); + if(getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0) { + size_t byteSize = sizeof(pal_param_payload) + getVoiceCueDataSize(); + std::unique_ptr bytes = std::make_unique(byteSize); + pal_param_payload *palParamPayload = reinterpret_cast(bytes.get()); + palParamPayload->payload_size = getVoiceCueDataSize(); + memcpy(palParamPayload->payload, getVoiceCueDataPtr(), getVoiceCueDataSize()); + + PAL_DBG(LOG_TAG,"%s: setting cached voice cue", __func__); + builder->payloadUvVoiceCueData(&payload, &payloadSize, miid, palParamPayload, usecaseMask); + if (payload && payloadSize) { + status = builder->updateCustomPayload(payload, payloadSize); + builder->freeCustomPayload(&payload, &payloadSize); + if (status != 0) + PAL_ERR(LOG_TAG,"updateCustomPayload Failed\n"); + } + if (status != 0) { + PAL_ERR(LOG_TAG,"Configuring blob data for UV Voice Call failed with status %d", status); + goto exit; + } + builder->getCustomPayload(&payload, &payloadSize); + status = SessionAlsaUtils::setMixerParameter(mixer, device, + payload, payloadSize); + builder->freeCustomPayload(); + if (status != 0) { + PAL_ERR(LOG_TAG,"setMixerParameter failed"); + goto exit; + } + } else { + PAL_DBG(LOG_TAG,"%s: voice cue is not set", __func__); + } +exit: + PAL_DBG(LOG_TAG, "%s: Exit", __func__); + return status; +} +#endif \ No newline at end of file diff --git a/utils/inc/UvVoiceCueUtils.h b/utils/inc/UvVoiceCueUtils.h new file mode 100644 index 00000000..8e5caa17 --- /dev/null +++ b/utils/inc/UvVoiceCueUtils.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * SPDX-License-Identifier: BSD-3-Clause-Clear + */ + +#ifndef UVVOICECUE_UTILS_H +#define UVVOICECUE_UTILS_H + +#include +#include + +#define VOICE_CUE_FILE_NAME "/data/vendor/audio/voice_cue.bin" + +int32_t writeBufferToFile(const char *filePath, const uint8_t *data, size_t size); +int32_t readBufferFromFile(const char *filePath, uint8_t **data, size_t *size); + +uint8_t *getVoiceCueDataPtr(); +size_t getVoiceCueDataSize(); +uint32_t getUvMaskUseCaseValues(); + +int32_t storeVoiceCueToFile(uint8_t *data, uint32_t size); +int32_t retrieveVoiceCueFromFile(); + +void cacheUvUseCaseMask(uint32_t usecaseMask); + +/* New helper APIs to reduce ResourceManager switch-case code */ +int32_t handleUvVoiceCueEnable(void *param_payload, size_t payload_size); +int32_t handleUvVoiceCueData(void *param_payload, size_t payload_size); + +#endif // UVVOICECUE_UTILS_H \ No newline at end of file diff --git a/utils/src/UvVoiceCueUtils.cpp b/utils/src/UvVoiceCueUtils.cpp new file mode 100644 index 00000000..71bb5218 --- /dev/null +++ b/utils/src/UvVoiceCueUtils.cpp @@ -0,0 +1,334 @@ +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * SPDX-License-Identifier: BSD-3-Clause-Clear + */ + +#define LOG_TAG "PAL: UVVoiceCueUtils" + +#include +#include +#include +#include +#include +#include +#include + +#include "ResourceManager.h" +#include "UvVoiceCueUtils.h" + +namespace { +std::mutex gVoiceCueMutex; +uv_fluence_config_t cachedRmUvConfig = {}; +} + +uint8_t *getVoiceCueDataPtr() +{ + std::lock_guard lock(gVoiceCueMutex); + return cachedRmUvConfig.voice_cue_param; +} + +size_t getVoiceCueDataSize() +{ + std::lock_guard lock(gVoiceCueMutex); + return cachedRmUvConfig.param_size; +} + +uint32_t getUvMaskUseCaseValues() +{ + std::lock_guard lock(gVoiceCueMutex); + return cachedRmUvConfig.usecase_mask; +} + +void cacheUvUseCaseMask(uint32_t usecaseMask) +{ + std::lock_guard lock(gVoiceCueMutex); + cachedRmUvConfig.usecase_mask = usecaseMask; +} + +int32_t handleUvVoiceCueEnable(void *param_payload, size_t payload_size) +{ + pal_param_payload *palPayload = nullptr; + uv_fluence_config_t *incoming = nullptr; + + if (!param_payload) { + PAL_ERR(LOG_TAG, "param_payload is null"); + return -EINVAL; + } + + if (payload_size < sizeof(pal_param_payload)) { + PAL_ERR(LOG_TAG, "payload_size %zu is too small", payload_size); + return -EINVAL; + } + + palPayload = reinterpret_cast(param_payload); + + if (palPayload->payload_size < sizeof(uv_fluence_config_t)) { + PAL_ERR(LOG_TAG, "Invalid UV fluence payload size %u", + palPayload->payload_size); + return -EINVAL; + } + + incoming = reinterpret_cast(palPayload->payload); + + PAL_DBG(LOG_TAG, "Enable Cmd -> usecase_mask: 0x%x", + incoming->usecase_mask); + + { + std::lock_guard lock(gVoiceCueMutex); + cachedRmUvConfig.usecase_mask = incoming->usecase_mask; + } + + PAL_INFO(LOG_TAG, "Decoded UV config: audio=%d voice=%d voip=%d sva=%d", + !!(incoming->usecase_mask & UV_FLUENCE_AUDIO_BIT), + !!(incoming->usecase_mask & UV_FLUENCE_TELEPHONY_BIT), + !!(incoming->usecase_mask & UV_FLUENCE_VOIP_BIT), + !!(incoming->usecase_mask & UV_FLUENCE_SVA_BIT)); + + return 0; +} + +int32_t handleUvVoiceCueData(void *param_payload, size_t payload_size) +{ + pal_param_payload *palPayload = nullptr; + uint8_t *incomingData = nullptr; + size_t incomingSize = 0; + uint8_t *newVoiceCue = nullptr; + int32_t fileStatus = 0; + + if (!param_payload || payload_size < sizeof(pal_param_payload)) { + PAL_ERR(LOG_TAG, "Invalid param payload for UV_VOICE_CUE_DATA_BYTE"); + return -EINVAL; + } + + palPayload = reinterpret_cast(param_payload); + incomingData = reinterpret_cast(palPayload->payload); + incomingSize = palPayload->payload_size; + + PAL_DBG(LOG_TAG, "Received Voice Cue Data. Size: %zu bytes", incomingSize); + + if (!incomingData || incomingSize == 0) { + PAL_ERR(LOG_TAG, "Invalid Voice Cue data received. data: %p size: %zu", + incomingData, incomingSize); + return -EINVAL; + } + + newVoiceCue = static_cast(calloc(1, incomingSize)); + if (!newVoiceCue) { + PAL_ERR(LOG_TAG, "Failed to allocate memory for Voice Cue Data"); + return -ENOMEM; + } + + memcpy(newVoiceCue, incomingData, incomingSize); + + { + std::lock_guard lock(gVoiceCueMutex); + + if (cachedRmUvConfig.voice_cue_param != nullptr) { + free(cachedRmUvConfig.voice_cue_param); + cachedRmUvConfig.voice_cue_param = nullptr; + cachedRmUvConfig.param_size = 0; + } + + cachedRmUvConfig.voice_cue_param = newVoiceCue; + cachedRmUvConfig.param_size = incomingSize; + } + + newVoiceCue = nullptr; // ownership moved to cache + + PAL_DBG(LOG_TAG, "Cached %zu bytes of cue data successfully", incomingSize); + + fileStatus = storeVoiceCueToFile(getVoiceCueDataPtr(), + static_cast(incomingSize)); + if (fileStatus != 0) { + PAL_ERR(LOG_TAG, "Failed to persist cue data to file! Status: %d", + fileStatus); + } else { + PAL_DBG(LOG_TAG, "Successfully saved cue data to file."); + } + + return 0; +} + +int32_t storeVoiceCueToFile(uint8_t *data, uint32_t size) +{ + int32_t status = 0; + + PAL_INFO(LOG_TAG, "Enter, size %u", size); + + if (!data || size == 0) { + PAL_ERR(LOG_TAG, "Invalid data pointer or size is 0"); + return -EINVAL; + } + + status = writeBufferToFile(VOICE_CUE_FILE_NAME, data, size); + if (status) { + PAL_ERR(LOG_TAG, "Failed to store voice cue to file %s, status %d", + VOICE_CUE_FILE_NAME, status); + return status; + } + + PAL_INFO(LOG_TAG, "Successfully stored %u bytes to %s", + size, VOICE_CUE_FILE_NAME); + return 0; +} + +int32_t retrieveVoiceCueFromFile() +{ + uint8_t *tmpData = nullptr; + size_t tmpSize = 0; + int32_t status = 0; + + status = readBufferFromFile(VOICE_CUE_FILE_NAME, &tmpData, &tmpSize); + if (status) { + PAL_ERR(LOG_TAG, "Failed to retrieve voice cue from file %s, status %d", + VOICE_CUE_FILE_NAME, status); + return status; + } + + if (!tmpData || tmpSize == 0) { + PAL_DBG(LOG_TAG, "No valid voice cue data found in file"); + return 0; + } + + { + std::lock_guard lock(gVoiceCueMutex); + + if (cachedRmUvConfig.voice_cue_param) { + free(cachedRmUvConfig.voice_cue_param); + cachedRmUvConfig.voice_cue_param = nullptr; + cachedRmUvConfig.param_size = 0; + } + + cachedRmUvConfig.voice_cue_param = tmpData; + cachedRmUvConfig.param_size = tmpSize; + } + + PAL_INFO(LOG_TAG, "Successfully restored %zu bytes of cue data", tmpSize); + return 0; +} + +int32_t writeBufferToFile(const char *filePath, const uint8_t *data, size_t size) +{ + int fd = -1; + size_t totalWritten = 0; + + if (!filePath || !data || size == 0) { + PAL_ERR(LOG_TAG, "Invalid input. filePath %p, data %p, size %zu", + filePath, data, size); + return -EINVAL; + } + + fd = open(filePath, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) { + PAL_ERR(LOG_TAG, "Failed to open file %s for write, errno %d (%s)", + filePath, errno, strerror(errno)); + return -errno; + } + + while (totalWritten < size) { + ssize_t written = write(fd, data + totalWritten, size - totalWritten); + if (written < 0) { + if (errno == EINTR) + continue; + + PAL_ERR(LOG_TAG, "Write failed for file %s, errno %d (%s)", + filePath, errno, strerror(errno)); + close(fd); + return -errno; + } + + if (written == 0) { + PAL_ERR(LOG_TAG, "Write returned 0 for file %s", filePath); + close(fd); + return -EIO; + } + + totalWritten += static_cast(written); + } + + close(fd); + PAL_DBG(LOG_TAG, "Successfully wrote %zu bytes to %s", + totalWritten, filePath); + + return 0; +} + +int32_t readBufferFromFile(const char *filePath, uint8_t **data, size_t *size) +{ + int fd = -1; + struct stat st; + uint8_t *buffer = nullptr; + size_t totalRead = 0; + + if (!filePath || !data || !size) { + PAL_ERR(LOG_TAG, "Invalid input. filePath %p, data %p, size %p", + filePath, data, size); + return -EINVAL; + } + + *data = nullptr; + *size = 0; + + if (stat(filePath, &st) != 0) { + PAL_ERR(LOG_TAG, "stat failed for %s, errno %d (%s)", + filePath, errno, strerror(errno)); + return -errno; + } + + if (st.st_size <= 0) { + PAL_ERR(LOG_TAG, "File %s is empty or invalid, size %lld", + filePath, static_cast(st.st_size)); + return -EINVAL; + } + + fd = open(filePath, O_RDONLY); + if (fd < 0) { + PAL_ERR(LOG_TAG, "Failed to open file %s for read, errno %d (%s)", + filePath, errno, strerror(errno)); + return -errno; + } + + buffer = static_cast(calloc(1, static_cast(st.st_size))); + if (!buffer) { + PAL_ERR(LOG_TAG, "Failed to allocate %lld bytes for file read", + static_cast(st.st_size)); + close(fd); + return -ENOMEM; + } + + while (totalRead < static_cast(st.st_size)) { + ssize_t bytesRead = read(fd, buffer + totalRead, + static_cast(st.st_size) - totalRead); + if (bytesRead < 0) { + if (errno == EINTR) + continue; + + PAL_ERR(LOG_TAG, "Read failed for file %s, errno %d (%s)", + filePath, errno, strerror(errno)); + free(buffer); + close(fd); + return -errno; + } + + if (bytesRead == 0) { + break; + } + + totalRead += static_cast(bytesRead); + } + + close(fd); + + if (totalRead != static_cast(st.st_size)) { + PAL_ERR(LOG_TAG, "Partial read from %s. expected %zu actual %zu", + filePath, static_cast(st.st_size), totalRead); + free(buffer); + return -EIO; + } + + *data = buffer; + *size = totalRead; + + PAL_DBG(LOG_TAG, "Successfully read %zu bytes from %s", totalRead, filePath); + return 0; +} \ No newline at end of file From d96f567cbc99d2e1568cdce8740ecb4705dc0e65 Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Fri, 17 Apr 2026 19:19:36 +0530 Subject: [PATCH 29/35] pal: configs: art: Update UPD controls for mtp qmp variant Update correct Audio Interface number depends on the backend used for UPD. Signed-off-by: ffrancis --- configs/qcom/mobile/art/mixer_paths_art_mtp_qmp.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/configs/qcom/mobile/art/mixer_paths_art_mtp_qmp.xml b/configs/qcom/mobile/art/mixer_paths_art_mtp_qmp.xml index 644bcb4c..cbe46dee 100644 --- a/configs/qcom/mobile/art/mixer_paths_art_mtp_qmp.xml +++ b/configs/qcom/mobile/art/mixer_paths_art_mtp_qmp.xml @@ -1222,7 +1222,14 @@ - + + + + + + + + From abf1c8cf517d5567f3594134aadc98b0b4a8ea6c Mon Sep 17 00:00:00 2001 From: Kunlei Zhang Date: Sun, 12 Apr 2026 19:15:31 +0800 Subject: [PATCH 30/35] pal : Fix voicecue data set failure for UV VoIP call Fix voicecue data set failure for UV VoIP call. Signed-off-by: ffrancis --- .../src/ConfigSessionAlsaPcm.cpp | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp index b7b6d075..c470c6ba 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp +++ b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaPcm/src/ConfigSessionAlsaPcm.cpp @@ -581,23 +581,6 @@ int32_t pcmPluginConfigSetConfigStart(Stream* s, void* pluginPayload) PAL_ERR(LOG_TAG, "Cannot set the mux-demux tag, as ongoing voice with Call Translation not found"); goto set_mixer; } - #ifndef UVVOICECUE_FEATURES_DISABLED - currentValues = getUvMaskUseCaseValues(); - if ((currentValues & UV_FLUENCE_VOIP_BIT) && - (getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0)) { - status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), - txAifBackEnds[0].second.data(), TAG_UVCALL_VOICECUE, &miid); - if (status != 0) { - PAL_ERR(LOG_TAG,"getModuleInstanceId failed\n"); - } else { - PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d\n", miid, pcmDevIds.at(0)); - status = SessionAlsaUtils::checkAndSetUvVoiceCue(s, mxr, pcmDevIds.at(0), miid, rm, builder, UV_FLUENCE_VOIP_BIT); - if (0 != status) { - PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); - } - } - } - #endif } configure_pspfmfc: status = s->getAssociatedDevices(associatedDevices); @@ -621,6 +604,26 @@ int32_t pcmPluginConfigSetConfigStart(Stream* s, void* pluginPayload) PAL_ERR(LOG_TAG, "build MFC payload failed"); } } + #ifndef UVVOICECUE_FEATURES_DISABLED + if (sAttr.type == PAL_STREAM_VOIP_TX) { + currentValues = getUvMaskUseCaseValues(); + if ((currentValues & UV_FLUENCE_VOIP_BIT) && + (getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0)) { + status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), + txAifBackEnds[0].second.data(), TAG_UVCALL_VOICECUE, &miid); + if (status != 0) { + PAL_ERR(LOG_TAG,"getModuleInstanceId failed\n"); + } else { + PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d\n", miid, pcmDevIds.at(0)); + status = SessionAlsaUtils::checkAndSetUvVoiceCue(s, mxr, pcmDevIds.at(0), miid, rm, builder, UV_FLUENCE_VOIP_BIT); + if (0 != status) { + PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); + } + goto exit; + } + } + } + #endif set_mixer: builder->getCustomPayload(&payload, &payloadSize); status = SessionAlsaUtils::setMixerParameter(mxr, pcmDevIds.at(0), From 380037cc53853830dda151e9e9171b123dd1a0ef Mon Sep 17 00:00:00 2001 From: Kunlei Zhang Date: Mon, 13 Apr 2026 18:49:19 +0800 Subject: [PATCH 31/35] pal : Fix device switch failure for UV voice call Fix device switch failure for UV voice call. Signed-off-by: ffrancis --- .../src/ConfigSessionAlsaVoice.cpp | 53 ++++++++- .../inc/ConfigSessionUtils.h | 6 ++ .../src/ConfigSessionUtils.cpp | 101 ++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp index ca7e194b..eef13163 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp +++ b/plugins/configs/qcom/mobile/default/ConfigSessionAlsaVoice/src/ConfigSessionAlsaVoice.cpp @@ -223,9 +223,38 @@ int32_t voicePostReconfig(Stream* s, void* pluginPayload) { struct ReconfigPluginPayload* reconfigPld = nullptr; reconfigPld = reinterpret_cast(pluginPayload); std::shared_ptr rm = nullptr; - PAL_DBG(LOG_TAG,"Enter"); rm = ResourceManager::getInstance(); + +#ifndef UVVOICECUE_FEATURES_DISABLED + uint32_t miid = 0; + struct mixer* mxr = nullptr; + uint32_t currentValues; + PayloadBuilder* builder = nullptr; + Session* sess = nullptr; + SessionAlsaVoice* session = nullptr; + std::vector pcmDevIds; + std::vector> txAifBackEnds; + status = rm->getVirtualAudioMixer(&mxr); + if (status) { + PAL_ERR(LOG_TAG, "mixer error"); + goto exit; + } + status = s->getAssociatedSession(&sess); + if (0 != status) { + PAL_ERR(LOG_TAG, "getAssociatedSession Failed \n"); + goto exit; + } + session = static_cast(sess); + status = session->getFrontEndIds(pcmDevIds, TX_HOSTLESS); + if (status) { + PAL_ERR(LOG_TAG, "getFrontEndIds failed %d", status); + goto exit; + } + txAifBackEnds = session->getTxBEVecRef(); + builder = new PayloadBuilder(); +#endif + if (!reconfigPld->config_ctrl.compare("silence_detection")) { status = voiceSilenceDetectionConfig(SD_CONNECT, &reconfigPld->dAttr, pluginPayload); if (status) { @@ -235,7 +264,29 @@ int32_t voicePostReconfig(Stream* s, void* pluginPayload) { status = rxMFCCoeffConfig(s, pluginPayload); } +#ifndef UVVOICECUE_FEATURES_DISABLED + currentValues = getUvMaskUseCaseValues(); + if ((currentValues & UV_FLUENCE_TELEPHONY_BIT) && + (getVoiceCueDataPtr() != nullptr && getVoiceCueDataSize() > 0)) { + PAL_DBG(LOG_TAG,"Enter UV post config : 2"); + status = SessionAlsaUtils::getModuleInstanceId(mxr, pcmDevIds.at(0), + txAifBackEnds[0].second.data(), TAG_UVCALL_VOICECUE, &miid); + if (status != 0) { + PAL_ERR(LOG_TAG,"getModuleInstanceId failed\n"); + goto exit; + } else { + PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d\n", miid, pcmDevIds.at(0)); + status = SessionAlsaUtils::checkAndSetUvVoiceCue(s, mxr, pcmDevIds.at(0), miid, rm, builder, UV_FLUENCE_TELEPHONY_BIT); + if (0 != status) { + PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); + } + } + } +#endif + exit: + if (builder) + delete builder; PAL_DBG(LOG_TAG,"Exit ret: %d", status); return status; } diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionUtils/inc/ConfigSessionUtils.h b/plugins/configs/qcom/mobile/default/ConfigSessionUtils/inc/ConfigSessionUtils.h index b3cd3b8b..17b70dc3 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionUtils/inc/ConfigSessionUtils.h +++ b/plugins/configs/qcom/mobile/default/ConfigSessionUtils/inc/ConfigSessionUtils.h @@ -37,4 +37,10 @@ int disableSilenceDetection(const std::shared_ptr rm, /* Forward Declaration for Silence Detection Callback */ void handleSilenceDetectionCb(uint64_t hdl __unused, uint32_t event_id, void *event_data, uint32_t event_size); +#ifndef UVVOICECUE_FEATURES_DISABLED +int32_t pcmPostReconfigSetUvVoiceCue(Stream *streamHandle, + Session *sess, + struct mixer *mixerHandle, + const std::vector &pcmDevIds); +#endif #endif diff --git a/plugins/configs/qcom/mobile/default/ConfigSessionUtils/src/ConfigSessionUtils.cpp b/plugins/configs/qcom/mobile/default/ConfigSessionUtils/src/ConfigSessionUtils.cpp index 38f73be0..1a5266cc 100644 --- a/plugins/configs/qcom/mobile/default/ConfigSessionUtils/src/ConfigSessionUtils.cpp +++ b/plugins/configs/qcom/mobile/default/ConfigSessionUtils/src/ConfigSessionUtils.cpp @@ -58,6 +58,9 @@ #include "SessionAlsaPcm.h" #include "SessionAlsaUtils.h" #include "ConfigSessionUtils.h" +#ifndef UVVOICECUE_FEATURES_DISABLED +#include "UvVoiceCueUtils.h" +#endif #include "apm_api.h" #include #include @@ -260,6 +263,13 @@ int reconfigCommon(Stream* streamHandle, void* pluginPayload) PAL_ERR(LOG_TAG, "setMixerParameter failed"); goto exit; } + #ifndef UVVOICECUE_FEATURES_DISABLED + status = pcmPostReconfigSetUvVoiceCue(streamHandle, sess, mixerHandle, pcmDevIds); + if (status != 0) { + PAL_ERR(LOG_TAG, "pcm post reconfig UV cue update failed %d", status); + goto exit; + } + #endif exit: if (builder) { @@ -1137,3 +1147,94 @@ void handleSilenceDetectionCb(uint64_t hdl __unused, uint32_t event_id, void *ev return; } +#ifndef UVVOICECUE_FEATURES_DISABLED +int32_t pcmPostReconfigSetUvVoiceCue(Stream *streamHandle, + Session *sess, + struct mixer *mixerHandle, + const std::vector &pcmDevIds) +{ + int32_t status = 0; + uint32_t miid = 0; + uint32_t currentValues = 0; + uint32_t uvBit = 0; + pal_stream_attributes sAttr = {}; + SessionAlsaPcm *session = nullptr; + std::shared_ptr rm = nullptr; + std::vector> txAifBackEnds; + PayloadBuilder *builder = nullptr; + + if (!streamHandle || !sess || !mixerHandle) { + PAL_ERR(LOG_TAG, "Invalid input"); + return -EINVAL; + } + if (pcmDevIds.empty()) { + PAL_ERR(LOG_TAG, "pcmDevIds is empty"); + return -EINVAL; + } + if (getVoiceCueDataPtr() == nullptr || getVoiceCueDataSize() == 0) { + PAL_DBG(LOG_TAG, "No voice cue data present, skipping"); + return 0; + } + status = streamHandle->getStreamAttributes(&sAttr); + if (status) { + PAL_ERR(LOG_TAG, "getStreamAttributes failed %d", status); + return status; + } + switch (sAttr.type) { + case PAL_STREAM_VOIP_TX: + uvBit = UV_FLUENCE_VOIP_BIT; + break; + case PAL_STREAM_VOICE_UI: + case PAL_STREAM_ASR: + case PAL_STREAM_ACD: + uvBit = UV_FLUENCE_SVA_BIT; + break; + case PAL_STREAM_DEEP_BUFFER: + uvBit = UV_FLUENCE_AUDIO_BIT; + break; + default: + PAL_DBG(LOG_TAG, "UV cue not needed for stream type %d", sAttr.type); + return 0; + } + currentValues = getUvMaskUseCaseValues(); + if (!(currentValues & uvBit)) { + PAL_DBG(LOG_TAG, "UV mask not enabled for stream type %d", sAttr.type); + return 0; + } + + rm = ResourceManager::getInstance(); + session = static_cast(sess); + txAifBackEnds = session->getTxBEVecRef(); + + if (txAifBackEnds.empty()) { + PAL_ERR(LOG_TAG, "txAifBackEnds is empty"); + return -EINVAL; + } + builder = new PayloadBuilder(); + status = SessionAlsaUtils::getModuleInstanceId(mixerHandle, + pcmDevIds.at(0), + txAifBackEnds[0].second.data(), + TAG_UVCALL_VOICECUE, + &miid); + if (status != 0) { + PAL_ERR(LOG_TAG, "getModuleInstanceId failed"); + goto exit; + } + PAL_DBG(LOG_TAG, "Setting audio cue data update to SPF for miid : %x and id = %d", + miid, pcmDevIds.at(0)); + status = SessionAlsaUtils::checkAndSetUvVoiceCue(streamHandle, + mixerHandle, + pcmDevIds.at(0), + miid, + rm, + builder, + uvBit); + if (status != 0) { + PAL_ERR(LOG_TAG, "failed to initialize UV Voice feature with status :%d", status); + } +exit: + if (builder) + delete builder; + return status; +} +#endif \ No newline at end of file From c42d5597dbe29459ceaf3f48b49a311b5834fde8 Mon Sep 17 00:00:00 2001 From: Harendra Gautam Date: Mon, 30 Mar 2026 15:10:51 +0530 Subject: [PATCH 32/35] pal: configs: shikra: Update Resource manager and Mixer Path XML Modify Reesource manager and Mixer Path XML as per record and playback device configuration. Signed-off-by: ffrancis --- .../IoT/shikra/mixer_paths_shikra_cpu.xml | 43 ++++++++++++++---- .../IoT/shikra/mixer_paths_shikra_dsp.xml | 44 +++++++++++++++---- .../IoT/shikra/resourcemanager_shikra_cpu.xml | 4 +- .../IoT/shikra/resourcemanager_shikra_dsp.xml | 10 ++--- 4 files changed, 78 insertions(+), 23 deletions(-) diff --git a/configs/qcom/IoT/shikra/mixer_paths_shikra_cpu.xml b/configs/qcom/IoT/shikra/mixer_paths_shikra_cpu.xml index e5ee5495..f34b994e 100644 --- a/configs/qcom/IoT/shikra/mixer_paths_shikra_cpu.xml +++ b/configs/qcom/IoT/shikra/mixer_paths_shikra_cpu.xml @@ -509,6 +509,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -533,7 +558,7 @@ - + @@ -550,7 +575,7 @@ - + @@ -561,14 +586,16 @@ - - - - + + + + - - + + + + diff --git a/configs/qcom/IoT/shikra/mixer_paths_shikra_dsp.xml b/configs/qcom/IoT/shikra/mixer_paths_shikra_dsp.xml index e5ee5495..ab255475 100644 --- a/configs/qcom/IoT/shikra/mixer_paths_shikra_dsp.xml +++ b/configs/qcom/IoT/shikra/mixer_paths_shikra_dsp.xml @@ -509,6 +509,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -533,7 +558,7 @@ - + @@ -550,7 +575,7 @@ - + @@ -560,15 +585,18 @@ + - - - - + + + + - - + + + + diff --git a/configs/qcom/IoT/shikra/resourcemanager_shikra_cpu.xml b/configs/qcom/IoT/shikra/resourcemanager_shikra_cpu.xml index 4fe7a102..9ca89269 100644 --- a/configs/qcom/IoT/shikra/resourcemanager_shikra_cpu.xml +++ b/configs/qcom/IoT/shikra/resourcemanager_shikra_cpu.xml @@ -127,7 +127,7 @@ PCM_RT_PROXY-TX-2 2 1 - headset-mic + headset-va-mic 0 PAL_STREAM_LOW_LATENCY @@ -150,7 +150,7 @@ PAL_DEVICE_NONE - QAIF-QAIF_AUD-RX-1 + PCM_RT_PROXY-RX-2 2 1 none diff --git a/configs/qcom/IoT/shikra/resourcemanager_shikra_dsp.xml b/configs/qcom/IoT/shikra/resourcemanager_shikra_dsp.xml index 77ebf26f..fdb16128 100644 --- a/configs/qcom/IoT/shikra/resourcemanager_shikra_dsp.xml +++ b/configs/qcom/IoT/shikra/resourcemanager_shikra_dsp.xml @@ -137,7 +137,7 @@ CODEC_DMA-QAIF-TX-0 2 1 - headset-mic + headset-va-mic 0 PAL_STREAM_LOW_LATENCY @@ -212,7 +212,7 @@ PAL_DEVICE_OUT_SPEAKER - QAIF-QAIF_AUD-RX-1 + QAIF-QAIF_AUD-RX-2 2 2 48000 @@ -256,7 +256,7 @@ PAL_DEVICE_OUT_HANDSET - QAIF-QAIF_AUD-RX-1 + QAIF-QAIF_AUD-RX-2 2 1 @@ -268,7 +268,7 @@ PAL_DEVICE_OUT_WIRED_HEADPHONE - CODEC_DMA-QAIF-RX-2 + CODEC_DMA-QAIF-RX-1 2 2 1 @@ -276,7 +276,7 @@ PAL_DEVICE_OUT_WIRED_HEADSET - CODEC_DMA-QAIF-RX-2 + CODEC_DMA-QAIF-RX-1 2 2 1 From 2210ad66a4c4e6e9a288cd0f20208bdebfaf6ebf Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Mon, 20 Apr 2026 22:52:48 +0530 Subject: [PATCH 33/35] pal: configs: route pebble/art headphones via AIF2 Update headphone and tty-headphones mixer paths to use RX2/RX3 with AIF2_PB instead of RX0/RX1 with AIF1_PB on ART and Pebble targets. This aligns playback routing with the intended RX macro paths for these usecases and avoids incorrect backend selection in headphone routes. Signed-off-by: ffrancis --- configs/qcom/mobile/art/mixer_paths_art_qrd.xml | 4 ++-- .../art/mixer_paths_pebble_mtp_wcd9378.xml | 16 ++++++++-------- .../qcom/mobile/art/mixer_paths_pebble_qrd.xml | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/configs/qcom/mobile/art/mixer_paths_art_qrd.xml b/configs/qcom/mobile/art/mixer_paths_art_qrd.xml index 5d83a4aa..f687592c 100644 --- a/configs/qcom/mobile/art/mixer_paths_art_qrd.xml +++ b/configs/qcom/mobile/art/mixer_paths_art_qrd.xml @@ -479,8 +479,8 @@ - - + + diff --git a/configs/qcom/mobile/art/mixer_paths_pebble_mtp_wcd9378.xml b/configs/qcom/mobile/art/mixer_paths_pebble_mtp_wcd9378.xml index fad166b5..5747b0bb 100644 --- a/configs/qcom/mobile/art/mixer_paths_pebble_mtp_wcd9378.xml +++ b/configs/qcom/mobile/art/mixer_paths_pebble_mtp_wcd9378.xml @@ -351,10 +351,10 @@ - - - - + + + + @@ -366,10 +366,10 @@ - - - - + + + + diff --git a/configs/qcom/mobile/art/mixer_paths_pebble_qrd.xml b/configs/qcom/mobile/art/mixer_paths_pebble_qrd.xml index 06222c41..c1576c77 100644 --- a/configs/qcom/mobile/art/mixer_paths_pebble_qrd.xml +++ b/configs/qcom/mobile/art/mixer_paths_pebble_qrd.xml @@ -477,8 +477,8 @@ - - + + From 1666e3ff649a6a4db71837a47bf9836f0e343d0e Mon Sep 17 00:00:00 2001 From: Hanuma Sri Saketh Valluri Date: Tue, 3 Feb 2026 11:26:11 +0530 Subject: [PATCH 34/35] pal: Fix various compilation errors Fix following type of compilation errors: -Wformat, -Wwritable-strings, -Wreorder-ctor Signed-off-by: ffrancis --- context_manager/src/ContextManager.cpp | 12 ++++++------ resource_manager/src/ResourceManager.cpp | 8 ++++---- stream/src/Stream.cpp | 2 +- utils/src/ACDPlatformInfo.cpp | 4 ++-- utils/src/ASRPlatformInfo.cpp | 4 ++-- utils/src/BTUtils.cpp | 2 +- utils/src/MemLogBuilder.cpp | 2 +- utils/src/MetadataParser.cpp | 22 +++++++++++----------- utils/src/STUtils.cpp | 6 +++--- utils/src/VoiceUIPlatformInfo.cpp | 6 +++--- 10 files changed, 34 insertions(+), 34 deletions(-) diff --git a/context_manager/src/ContextManager.cpp b/context_manager/src/ContextManager.cpp index 56ba31af..7a6c4667 100644 --- a/context_manager/src/ContextManager.cpp +++ b/context_manager/src/ContextManager.cpp @@ -195,7 +195,7 @@ int32_t ContextManager::build_and_send_register_ack(Usecase *uc, uint32_t see_id pal_param->payload_size = payload_size; - rc = send_asps_response(PAL_CUSTOM_PARAM_AR_TAG_MODULE_CONFIG, pal_param); + rc = send_asps_response(std::string(PAL_CUSTOM_PARAM_AR_TAG_MODULE_CONFIG), pal_param); if (rc) { PAL_ERR(LOG_TAG, "Error:%d sending register ack opcode %x", rc, PARAM_ID_ASPS_SENSOR_REGISTER_ACK); @@ -313,7 +313,7 @@ int32_t ContextManager::send_asps_basic_response(int32_t status, uint32_t event_ pal_param->payload_size = PAL_ALIGN_8BYTE(sizeof(struct param_id_asps_basic_ack_t) + sizeof(struct apm_module_param_data_t)); - rc = s->setCustomParam(nullptr, PAL_CUSTOM_PARAM_AR_TAG_MODULE_CONFIG, (void*)pal_param->payload, pal_param->payload_size); + rc = s->setCustomParam(nullptr, std::string(PAL_CUSTOM_PARAM_AR_TAG_MODULE_CONFIG), (void*)pal_param->payload, pal_param->payload_size); if (rc) { PAL_ERR(LOG_TAG, "Error:%d setting params on proxy stream for basick ack", rc); } @@ -1080,12 +1080,12 @@ int32_t Usecase::GetModuleIIDs(std::vector tags, PAL_VERBOSE(LOG_TAG, "Enter usecase:0x%x", this->usecase_id); rc = pal_stream_get_custom_param(this->pal_stream, - PAL_CUSTOM_PARAM_AR_TAG_MODULE_INFO, + (char *)PAL_CUSTOM_PARAM_AR_TAG_MODULE_INFO, data, &tag_module_size); if (rc == ENODATA) { tag_module_info.resize(tag_module_size); rc = pal_stream_get_custom_param(this->pal_stream, - PAL_CUSTOM_PARAM_AR_TAG_MODULE_INFO, + (char *)PAL_CUSTOM_PARAM_AR_TAG_MODULE_INFO, data, &tag_module_size); @@ -1170,7 +1170,7 @@ int32_t Usecase::GetAckDataOnSuccessfullStart(uint32_t *size, void *data) *size = (no_of_miid * sizeof(uint32_t)); exit: - PAL_DBG(LOG_TAG, "Exit %d, number of MIID %d", rc, no_of_miid); + PAL_DBG(LOG_TAG, "Exit %d, number of MIID %zu", rc, no_of_miid); return rc; } @@ -1273,7 +1273,7 @@ int32_t UsecaseACD::GetAckDataOnSuccessfullStart(uint32_t *size, void *data) sizeof(uint32_t) * requested_context_list->num_contexts); } else { rc = -ENODATA; - PAL_ERR(LOG_TAG, "size %d too small for ack data in UsecaseACD, need %d", + PAL_ERR(LOG_TAG, "size %d too small for ack data in UsecaseACD, need %lu", (int)(*size), sizeof(asps_acd_usecase_register_ack_payload_t) + sizeof(uint32_t) * requested_context_list->num_contexts); } diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp index 1aa09495..5937be28 100644 --- a/resource_manager/src/ResourceManager.cpp +++ b/resource_manager/src/ResourceManager.cpp @@ -2640,7 +2640,7 @@ bool ResourceManager::isStreamSupported(Stream *s, struct pal_device *devices, i } if (cur_sessions - 1 == max_sessions) { - PAL_DBG(LOG_TAG, "current sessions is %d, maximum sessions is %d", cur_sessions, max_sessions); + PAL_DBG(LOG_TAG, "current sessions is %zu, maximum sessions is %zu", cur_sessions, max_sessions); PAL_ERR(LOG_TAG, "no new session allowed for stream %d", attributes.type); goto exit; } @@ -5555,7 +5555,7 @@ int ResourceManager::findActiveStreamsNotInDisconnectList( rm->getActiveStream_l(activeStreams, devObj); - PAL_DBG(LOG_TAG, "activeStreams size = %d, device: %s", activeStreams.size(), + PAL_DBG(LOG_TAG, "activeStreams size = %zu, device: %s", activeStreams.size(), deviceNameLUT.at((pal_device_id_t)devObj->getSndDeviceId()).c_str()); for (sIter = activeStreams.begin(); sIter != activeStreams.end(); sIter++) { @@ -10031,7 +10031,7 @@ void ResourceManager::WbSpeechConfig(pal_device_id_t devId, dev->getDeviceAttributes(&curDevAttr); status = dev->setDeviceParameter(param_id, param_payload); if (status) - PAL_ERR(LOG_TAG, "set device param %d, status: ", param_id, status); + PAL_ERR(LOG_TAG, "set device param %d, status: %d", param_id, status); // check and force device switch if SCO is connected. if (!dev->isDeviceReady(devId)) return; @@ -10324,7 +10324,7 @@ int ResourceManager::setUltrasoundGain(pal_ultrasound_gain_t gain, Stream *s) } else { status = getActiveStream_l(activeStreams, NULL); if ((0 != status) || (activeStreams.size() == 0)) { - PAL_DBG(LOG_TAG, "No active stream available, status = %d, nStream = %d", + PAL_DBG(LOG_TAG, "No active stream available, status = %d, nStream = %zu", status, activeStreams.size()); return -ENOENT; } diff --git a/stream/src/Stream.cpp b/stream/src/Stream.cpp index 73716e47..06743e76 100644 --- a/stream/src/Stream.cpp +++ b/stream/src/Stream.cpp @@ -165,7 +165,7 @@ Stream* Stream::create(struct pal_stream_attributes *sAttr, struct pal_device *d rm->isBtDevice(palDevsAttr[count].id)) { palDevsAttr[count].address = dAttr[i].address; } - PAL_VERBOSE(LOG_TAG, "count: %d, i: %d, length of dAttr custom_config: %d", count, i, strlen(dAttr[i].custom_config.custom_key)); + PAL_VERBOSE(LOG_TAG, "count: %d, i: %d, length of dAttr custom_config: %zu", count, i, strlen(dAttr[i].custom_config.custom_key)); if (strlen(dAttr[i].custom_config.custom_key)) { strlcpy(palDevsAttr[count].custom_config.custom_key, dAttr[i].custom_config.custom_key, PAL_MAX_CUSTOM_KEY_SIZE); PAL_DBG(LOG_TAG, "found custom key %s", dAttr[i].custom_config.custom_key); diff --git a/utils/src/ACDPlatformInfo.cpp b/utils/src/ACDPlatformInfo.cpp index e347f411..285fabb1 100644 --- a/utils/src/ACDPlatformInfo.cpp +++ b/utils/src/ACDPlatformInfo.cpp @@ -107,9 +107,9 @@ void ACDSoundModelInfo::HandleEndTag(struct xml_userdata *data, const std::strin } ACDStreamConfig::ACDStreamConfig() : + lpi_enable_(true), curr_child_(nullptr), - sound_model_cnt(0), - lpi_enable_(true) + sound_model_cnt(0) { } diff --git a/utils/src/ASRPlatformInfo.cpp b/utils/src/ASRPlatformInfo.cpp index 95fb628a..968cfebd 100644 --- a/utils/src/ASRPlatformInfo.cpp +++ b/utils/src/ASRPlatformInfo.cpp @@ -268,8 +268,8 @@ void ASRStreamConfig::HandleEndTag(struct xml_userdata *data, const std::string& std::shared_ptr ASRPlatformInfo::me_ = nullptr; ASRStreamConfig::ASRStreamConfig() : - curr_child_(nullptr), - lpi_enable_(true) + lpi_enable_(true), + curr_child_(nullptr) { for (int i = 0; i < ASR_MAX_PARAM_IDS; i++) { module_tag_ids_[i] = 0; diff --git a/utils/src/BTUtils.cpp b/utils/src/BTUtils.cpp index d27623d1..2fc76de2 100644 --- a/utils/src/BTUtils.cpp +++ b/utils/src/BTUtils.cpp @@ -2120,7 +2120,7 @@ void reconfigureScoStreams() { dattr = nullptr; } - PAL_DBG(LOG_TAG, "streamDevDisconnect size=%d and streamDevConnect size=%d", + PAL_DBG(LOG_TAG, "streamDevDisconnect size=%zu and streamDevConnect size=%zu", streamDevDisconnect.size(), streamDevConnect.size()); status = rm->streamDevSwitch(streamDevDisconnect, streamDevConnect); if (status) { diff --git a/utils/src/MemLogBuilder.cpp b/utils/src/MemLogBuilder.cpp index 69b1ed1e..0b015f9a 100644 --- a/utils/src/MemLogBuilder.cpp +++ b/utils/src/MemLogBuilder.cpp @@ -56,7 +56,7 @@ int palStateQueueBuilder(pal_state_queue &que, Stream *s, pal_state_queue_state que.state = state; que.error = error; - PAL_DBG(LOG_TAG, "Stream handle = " "%" PRId64 "\n", s); + PAL_DBG(LOG_TAG, "Stream handle = %p\n", s); memset(que.device_attr, 0, sizeof(que.device_attr)); diff --git a/utils/src/MetadataParser.cpp b/utils/src/MetadataParser.cpp index 99464c18..e39bf6b1 100644 --- a/utils/src/MetadataParser.cpp +++ b/utils/src/MetadataParser.cpp @@ -20,7 +20,7 @@ int MetadataParser::parseMetadata(uint8_t* metadata, size_t metadataSize, if (!metadata || metadataSize < std::min(START_METADATA_SIZE(), END_METADATA_SIZE())) { //TODO: may not work for multiple frames/buffer - ALOGE("%s: Metadata payload smaller than expected, bytes 0x%x, expected 0x%x", + ALOGE("%s: Metadata payload smaller than expected, bytes 0x%zx, expected 0x%lx", __func__, mdBytesRead, std::min(START_METADATA_SIZE(), END_METADATA_SIZE())); return -EINVAL; } @@ -39,21 +39,21 @@ int MetadataParser::parseMetadata(uint8_t* metadata, size_t metadataSize, size_t startMetadataPayloadSize = metadataItem->payload_size; if (mdBytesRead + startMetadataPayloadSize > metadataSize) { ALOGE("%s: Metadata item payload size larger than advertized metadata size" - " metadata id 0x%x, mdBytesRead = 0x%x, item payload size 0x%x," - " metadata size = 0x%x ", __func__, metadataItem->metadata_id, + " metadata id 0x%x, mdBytesRead = 0x%zx, item payload size 0x%zx," + " metadata size = 0x%zx ", __func__, metadataItem->metadata_id, mdBytesRead, startMetadataPayloadSize, metadataSize); return -EINVAL; } module_cmn_md_buffer_start_t* startMetadata = reinterpret_cast(metadata + mdBytesRead); if (!startMetadata) { - ALOGE("%s: Metadata start payload not found at offset 0x%x", + ALOGE("%s: Metadata start payload not found at offset 0x%zx", __func__, mdBytesRead); return -EINVAL; } bufferInfo->frame_index = static_cast((static_cast( startMetadata->buffer_index_msw) << 32) | startMetadata->buffer_index_lsw); - ALOGV("%s: startMetadata frame_index %llu", __func__, bufferInfo->frame_index); + ALOGV("%s: startMetadata frame_index %lu", __func__, bufferInfo->frame_index); mdBytesRead += sizeof(module_cmn_md_buffer_start_t); break; } @@ -61,7 +61,7 @@ int MetadataParser::parseMetadata(uint8_t* metadata, size_t metadataSize, size_t endMetadataPayloadSize = metadataItem->payload_size; if (mdBytesRead + endMetadataPayloadSize > metadataSize) { ALOGE("%s: Metadata item payload size larger than advertized metadata size," - " metadata id 0x%x, mdBytesRead = 0x%x, item payload size 0x%x," + " metadata id 0x%x, mdBytesRead = 0x%zx, item payload size 0x%zx," " metadata size = 0x%x ", __func__, metadataItem->metadata_id, mdBytesRead, endMetadataPayloadSize, static_cast(metadataSize)); return -EINVAL; @@ -69,7 +69,7 @@ int MetadataParser::parseMetadata(uint8_t* metadata, size_t metadataSize, module_cmn_md_buffer_end_t* endMetadata = reinterpret_cast(metadata + mdBytesRead); if (!endMetadata) { - ALOGE("%s: Metadata end payload not found at offset 0x%x", + ALOGE("%s: Metadata end payload not found at offset 0x%zx", __func__, mdBytesRead); return -EINVAL; } @@ -96,8 +96,8 @@ int MetadataParser::parseMetadata(uint8_t* metadata, size_t metadataSize, size_t mfMetadataPayloadSize = metadataItem->payload_size; if (mdBytesRead + mfMetadataPayloadSize > metadataSize){ ALOGE("%s: Metadata item payload size larger than advertized metadata size," - " metadata id 0x%x, mdBytesRead = 0x%x, item payload size 0x%x," - " metadata size = 0x%x ", __func__, metadataItem->metadata_id, + " metadata id 0x%x, mdBytesRead = 0x%zx, item payload size 0x%zx," + " metadata size = 0x%zx ", __func__, metadataItem->metadata_id, mdBytesRead, mfMetadataPayloadSize, metadataSize); return -EINVAL; } @@ -106,7 +106,7 @@ int MetadataParser::parseMetadata(uint8_t* metadata, size_t metadataSize, mdBytesRead += sizeof(media_format_t); if (!mfPayload) { - ALOGE("%s: Media metadata payload not found at offset 0x%x", + ALOGE("%s: Media metadata payload not found at offset 0x%zx", __func__, mdBytesRead); return -EINVAL; } @@ -128,7 +128,7 @@ int MetadataParser::parseMetadata(uint8_t* metadata, size_t metadataSize, break; } default: { - ALOGE("%s: Unknown Metadata marker found at offset 0x%x, Metadata ID=0x%x", + ALOGE("%s: Unknown Metadata marker found at offset 0x%zx, Metadata ID=0x%x", __func__, mdBytesRead, metadataItem->metadata_id); // increment bytes read mdBytesRead += metadataItem->payload_size; diff --git a/utils/src/STUtils.cpp b/utils/src/STUtils.cpp index 3afda84c..fba45789 100644 --- a/utils/src/STUtils.cpp +++ b/utils/src/STUtils.cpp @@ -143,7 +143,7 @@ int32_t voiceuiDmgrRestartUseCases(vui_dmgr_param_restart_usecases_t *uc_info) getMatchingStreams(activeStreams, streams, uc_info->usecases[i].vendor_uuid); } // Reuse SSR mechanism for stream teardown and bring up. - PAL_INFO(LOG_TAG, "restart %d streams", streams.size()); + PAL_INFO(LOG_TAG, "restart %zu streams", streams.size()); for (auto &s : streams) { s->getStreamType(&type); status = s->ssrDownHandler(); @@ -1386,8 +1386,8 @@ int setSTParameter(uint32_t param_id, void *param_payload, if (std::find(onResourceAvailCbList.begin(), onResourceAvailCbList.end(), cb) == onResourceAvailCbList.end()) { onResourceAvailCbList.push_back(cb); - PAL_VERBOSE(LOG_TAG, "setParameter onResourceAvailCb %pk" - " onResourceAvailCookie %pk", resources_avail->callback, + PAL_VERBOSE(LOG_TAG, "setParameter onResourceAvailCb %p" + " onResourceAvailCookie %lu", resources_avail->callback, resources_avail->cookie); } else { PAL_DBG(LOG_TAG, "Resource available callback is already registered"); diff --git a/utils/src/VoiceUIPlatformInfo.cpp b/utils/src/VoiceUIPlatformInfo.cpp index 526b71b9..a899cae3 100644 --- a/utils/src/VoiceUIPlatformInfo.cpp +++ b/utils/src/VoiceUIPlatformInfo.cpp @@ -104,9 +104,9 @@ void VUISecondStageConfig::HandleStartTag(const std::string& tag, const char **a } VUIFirstStageConfig::VUIFirstStageConfig() : + lpi_supported_(true), module_type_(ST_MODULE_TYPE_GMM), module_name_("GMM"), - lpi_supported_(true), enable_lpi_lab_ec_(false) { for (int i = 0; i < MAX_PARAM_IDS; i++) { @@ -217,9 +217,9 @@ VUIStreamConfig::VUIStreamConfig() : pre_roll_duration_(0), supported_first_stage_engine_count_(1), enable_intra_concurrent_detection_(false), - curr_child_(nullptr), lpi_enable_(true), batch_size_in_ms_(0), + curr_child_(nullptr), client_handling_ssr_(false), mmap_buffer_duration_(0), mmap_frame_length_(0), @@ -305,7 +305,7 @@ void VUIStreamConfig::ReadDetectionPropertyList(const char *prop_string) { int ret = 0; char *token = nullptr; - char *delims = ","; + const char *delims = ","; char *save = nullptr; PAL_VERBOSE(LOG_TAG, "Detection property list %s", prop_string); From a9fff8341e6c7273f0408474278acffdeba6e229 Mon Sep 17 00:00:00 2001 From: Manikantan R Date: Fri, 5 Jun 2026 00:55:33 +0530 Subject: [PATCH 35/35] pal : make UvVoiceCue support opt-in at build time Add a configure option to enable UvVoiceCue features explicitly and build UvVoiceCueUtils when that option is set. By default the feature is disabled, and a preprocessor flag to PAL and SessionAR is exported so UvVoiceCue code paths can be compiled out cleanly. This keeps the feature off by default and avoids pulling in optional voice cue sources and dependencies unless they are needed. Signed-off-by: ffrancis --- Makefile.am | 8 ++++++-- configure.ac | 18 ++++++++++++------ session/SessionAR/Makefile.am | 1 + 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Makefile.am b/Makefile.am index 93bd6171..fd9ce911 100644 --- a/Makefile.am +++ b/Makefile.am @@ -40,7 +40,6 @@ pal_sources = $(top_srcdir)/stream/src/Stream.cpp \ $(top_srcdir)/utils/src/ACDPlatformInfo.cpp \ $(top_srcdir)/utils/src/ASRPlatformInfo.cpp \ $(top_srcdir)/utils/src/STUtils.cpp - $(top_srcdir)/utils/src/UvVoiceCueUtils.cpp else AM_CPPFLAGS := -I $(top_srcdir)/stream/inc AM_CPPFLAGS += -I $(top_srcdir)/device/inc @@ -79,11 +78,16 @@ pal_sources = $(top_srcdir)/stream/src/Stream.cpp \ $(top_srcdir)/utils/src/ASRPlatformInfo.cpp \ $(top_srcdir)/utils/src/STUtils.cpp \ $(top_srcdir)/utils/src/BTUtils.cpp - $(top_srcdir)/utils/src/UvVoiceCueUtils.cpp endif + +if COMPILE_UVVOICECUE_FEATURES +pal_sources += $(top_srcdir)/utils/src/UvVoiceCueUtils.cpp +endif + AM_CPPFLAGS += -D__unused=__attribute__\(\(__unused__\)\) -DLINUX_ENABLED AM_CPPFLAGS += -DCONFIG_GSL +AM_CPPFLAGS += @UVVOICECUE_FEATURE_FLAGS@ library_includedir = $(includedir)/pal lib_LTLIBRARIES = libpal.la diff --git a/configure.ac b/configure.ac index 96c380e5..0eed43b4 100644 --- a/configure.ac +++ b/configure.ac @@ -141,6 +141,18 @@ AC_ARG_WITH([streamSoundTrigger], [with_streamSoundTrigger=no]) AM_CONDITIONAL([COMPILE_STREAMSOUNDTRIGGER], [test "x${with_streamSoundTrigger}" = "xyes"]) +AC_ARG_WITH([UvVoiceCueFeature], + AS_HELP_STRING([use UvVoiceCueFeature (default is no)]), + [with_UvVoiceCueFeature=$withval], + [with_UvVoiceCueFeature=no]) +AM_CONDITIONAL([COMPILE_UVVOICECUE_FEATURES], [test "x${with_UvVoiceCueFeature}" = "xyes"]) + +AS_IF([test "x${with_UvVoiceCueFeature}" = "xno"], + [UVVOICECUE_FEATURE_FLAGS="-DUVVOICECUE_FEATURES_DISABLED"], + [UVVOICECUE_FEATURE_FLAGS=""]) + +AC_SUBST([UVVOICECUE_FEATURE_FLAGS]) + AC_CONFIG_FILES([ Makefile \ pal.pc \ stream/Makefile \ @@ -248,10 +260,4 @@ plugins/PluginManager/plugin_manager.pc \ plugins/codecs/Makefile \ plugins/codecs/codecs.pc ]) -AC_ARG_WITH([adsprpcd], - AS_HELP_STRING([compile adsprpcd (default is no)]), - [with_adsprpcd=$withval], - [with_adsprpcd=no]) -AM_CONDITIONAL([COMPILE_ADSPRPCD], [test "x${with_adsprpcd}" = "xyes"]) - AC_OUTPUT diff --git a/session/SessionAR/Makefile.am b/session/SessionAR/Makefile.am index 6c18fb44..9cab0d11 100644 --- a/session/SessionAR/Makefile.am +++ b/session/SessionAR/Makefile.am @@ -52,6 +52,7 @@ libsession_ar_la_LDFLAGS = -shared -avoid-version libsession_ar_la_CPPFLAGS += @GLIB_CFLAGS@ -include glib.h libsession_ar_la_CPPFLAGS += -DACD_SM_FILEPATH=\"/etc/models/acd/\" libsession_ar_la_CPPFLAGS += -D__unused=__attribute__\(\(__unused__\)\) -DLINUX_ENABLED +libsession_ar_la_CPPFLAGS += @UVVOICECUE_FEATURE_FLAGS@ if USE_SYSLOG libsession_ar_la_CPPFLAGS += -DPAL_USE_SYSLOG