Merge "Bluetooth: Add conditional check to call init"
diff --git a/Pal.cpp b/Pal.cpp
index e0fc84f..82e9529 100644
--- a/Pal.cpp
+++ b/Pal.cpp
@@ -66,6 +66,7 @@
#include <set>
#include <unistd.h>
#include <stdlib.h>
+#include <mutex>
#include <PalApi.h>
#include "Stream.h"
#include "Device.h"
@@ -84,6 +85,9 @@
return PAL_VERSION;
}
+static std::mutex pal_mutex;
+static uint32_t pal_init_ref_cnt = 0;
+
static void notify_concurrent_stream(pal_stream_type_t type,
pal_stream_direction_t dir,
bool active)
@@ -113,6 +117,13 @@
PAL_DBG(LOG_TAG, "Enter.");
int32_t ret = 0;
std::shared_ptr<ResourceManager> ri = NULL;
+
+ pal_mutex.lock();
+ if (pal_init_ref_cnt++ > 0) {
+ PAL_DBG(LOG_TAG, "PAL already initialized, cnt: %d", pal_init_ref_cnt);
+ goto exit;
+ }
+
try {
ri = ResourceManager::getInstance();
} catch (const std::exception& e) {
@@ -135,6 +146,7 @@
}
exit:
+ pal_mutex.unlock();
PAL_DBG(LOG_TAG, "Exit. exit status : %d ", ret);
return ret;
}
@@ -151,6 +163,17 @@
std::shared_ptr<ResourceManager> ri = NULL;
+ pal_mutex.lock();
+ if (pal_init_ref_cnt > 0) {
+ pal_init_ref_cnt--;
+ PAL_DBG(LOG_TAG, "decrease pal ref cnt to %d", pal_init_ref_cnt);
+ if (pal_init_ref_cnt > 0)
+ goto exit;
+ } else {
+ PAL_ERR(LOG_TAG, "pal not initialized yet");
+ goto exit;
+ }
+
try {
ri = ResourceManager::getInstance();
} catch (const std::exception& e) {
@@ -159,6 +182,9 @@
ri->deInitContextManager();
ResourceManager::deinit();
+
+exit:
+ pal_mutex.unlock();
PAL_DBG(LOG_TAG, "Exit.");
return;
}
@@ -314,18 +340,13 @@
goto exit;
}
- s = reinterpret_cast<Stream *>(stream_handle);
- s->getStreamAttributes(&sAttr);
- if (sAttr.type == PAL_STREAM_VOICE_UI)
- rm->handleDeferredSwitch();
-
rm->lockActiveStream();
if (!rm->isActiveStream(stream_handle)) {
rm->unlockActiveStream();
status = -EINVAL;
goto exit;
}
-
+ s = reinterpret_cast<Stream *>(stream_handle);
status = rm->increaseStreamUserCounter(s);
if (0 != status) {
rm->unlockActiveStream();
@@ -333,6 +354,11 @@
goto exit;
}
rm->unlockActiveStream();
+
+ s->getStreamAttributes(&sAttr);
+ if (sAttr.type == PAL_STREAM_VOICE_UI)
+ rm->handleDeferredSwitch();
+
status = s->start();
rm->lockActiveStream();
@@ -404,23 +430,11 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
-
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- status = -EINVAL;
- return status;
- }
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle) || !buf) {
- rm->unlockActiveStream();
+ if (!stream_handle || !buf) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->unlockActiveStream();
-
PAL_VERBOSE(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->write(buf);
@@ -436,23 +450,11 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
-
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- status = -EINVAL;
- return status;
- }
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle) || !buf) {
- rm->unlockActiveStream();
+ if (!stream_handle || !buf) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->unlockActiveStream();
-
PAL_VERBOSE(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->read(buf);
@@ -469,23 +471,12 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -505,22 +496,11 @@
int status;
std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle, status %d", status);
return status;
}
- rm->unlockActiveStream();
-
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK param_id %d", stream_handle,
param_id);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -533,11 +513,17 @@
PAL_ERR(LOG_TAG, "set parameters failed status %d param_id %u", status, param_id);
return status;
}
-
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ return status;
+ }
if (param_id == PAL_PARAM_ID_STOP_BUFFERING) {
PAL_DBG(LOG_TAG, "Buffering stopped, handle deferred LPI<->NLPI switch");
rm->handleDeferredSwitch();
}
+
PAL_DBG(LOG_TAG, "Exit. status %d", status);
return status;
}
@@ -638,12 +624,11 @@
if (0 != status) {
PAL_ERR(LOG_TAG, "mute failed with status %d", status);
- return status;
+ goto exit;
}
exit:
PAL_DBG(LOG_TAG, "Exit. status %d", status);
-
return status;
}
@@ -651,23 +636,12 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- status = -EINVAL;
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -684,23 +658,12 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- status = -EINVAL;
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -736,6 +699,8 @@
goto exit;
}
+ PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
+
rm->lockActiveStream();
if (!rm->isActiveStream(stream_handle)) {
rm->unlockActiveStream();
@@ -771,23 +736,12 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- status = -EINVAL;
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -806,23 +760,12 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- status = -EINVAL;
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -842,24 +785,13 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
+ if (!stream_handle) {
status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
- status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
- return status;
- }
- rm->unlockActiveStream();
-
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -878,12 +810,12 @@
Stream *s = NULL;
int status = -EINVAL;
std::shared_ptr<ResourceManager> rm = NULL;
+ PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK\n", stream_handle);
if (!stream_handle) {
PAL_ERR(LOG_TAG, "Invalid input parameters status %d\n", status);
return status;
}
- PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK\n", stream_handle);
rm = ResourceManager::getInstance();
if (!rm) {
@@ -891,19 +823,15 @@
return status;
}
- rm->lockActiveStream();
- s = reinterpret_cast<Stream *>(stream_handle);
- status = rm->increaseStreamUserCounter(s);
- if (0 != status) {
- rm->unlockActiveStream();
- PAL_ERR(LOG_TAG, "failed to increase stream user count");
- return status;
- }
- rm->unlockActiveStream();
- status = s->getTimestamp(stime);
+ PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK\n", stream_handle);
rm->lockActiveStream();
- rm->decreaseStreamUserCounter(s);
+ if (rm->isActiveStream(stream_handle)) {
+ s = reinterpret_cast<Stream *>(stream_handle);
+ status = s->getTimestamp(stime);
+ } else {
+ PAL_ERR(LOG_TAG, "stream handle in stale state.\n");
+ }
rm->unlockActiveStream();
if (0 != status) {
@@ -924,26 +852,14 @@
{
Stream *s = NULL;
int status = 0;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- status = -EINVAL;
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
-
s = reinterpret_cast<Stream *>(stream_handle);
status = s->addRemoveEffect(effect, enable);
if (0 != status) {
@@ -988,6 +904,8 @@
return status;
}
+ PAL_INFO(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
+
rm->lockActiveStream();
if (!rm->isActiveStream(stream_handle)) {
rm->unlockActiveStream();
@@ -1050,22 +968,23 @@
break;
}
- /*
- * When USB headset is disconnected the music playback pauses
- * and the policy manager sends routing=0. But if the USB is connected
- * back before the standby time, it can not switch device to usb hs any more
- * because current pal device is usb hs which equals new device when resuming playback.
- * So routing to default device first during handling routing = 0 msg will guarantee
- * the device switch to usb can be executed once USB is connected again.
- */
- bool curPalDevice_usb = curPalDevices.find(PAL_DEVICE_OUT_USB_DEVICE) != curPalDevices.end() ||
- curPalDevices.find(PAL_DEVICE_OUT_USB_HEADSET) != curPalDevices.end();
- bool activeDevices_usb = activeDevices.find(PAL_DEVICE_OUT_USB_DEVICE) != activeDevices.end() ||
- activeDevices.find(PAL_DEVICE_OUT_USB_HEADSET) != activeDevices.end();
- bool usb_active = rm->isDeviceAvailable(PAL_DEVICE_OUT_USB_DEVICE) ||
- rm->isDeviceAvailable(PAL_DEVICE_OUT_USB_HEADSET);
+ /*
+ * When headset is disconnected the music playback pauses
+ * and the policy manager sends routing=0. But if the headset is connected
+ * back before the standby time, it can not switch device to headset any more
+ * because current pal device is headset which equals new device when resuming playback.
+ * So routing to default device first during handling routing = 0 msg will guarantee
+ * the device switch to headset can be executed once headset is connected again.
+ */
if (devices[0].id == PAL_DEVICE_NONE &&
- curPalDevice_usb && activeDevices_usb && !usb_active)
+ (rm->isDisconnectedDeviceStillActive(curPalDevices,activeDevices,
+ PAL_DEVICE_OUT_USB_DEVICE) ||
+ rm->isDisconnectedDeviceStillActive(curPalDevices,activeDevices,
+ PAL_DEVICE_OUT_USB_HEADSET) ||
+ rm->isDisconnectedDeviceStillActive(curPalDevices,activeDevices,
+ PAL_DEVICE_OUT_WIRED_HEADPHONE) ||
+ rm->isDisconnectedDeviceStillActive(curPalDevices,activeDevices,
+ PAL_DEVICE_OUT_WIRED_HEADSET)))
{
devices[0].id = PAL_DEVICE_OUT_SPEAKER;
}
@@ -1141,23 +1060,12 @@
{
int status = 0;
Stream *s = NULL;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
- status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- return status;
- }
-
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
+ if (!stream_handle) {
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
- rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
@@ -1219,24 +1127,13 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
+ if (!stream_handle) {
status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid resource manager");
+ PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
- status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
- return status;
- }
- rm->unlockActiveStream();
-
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->GetMmapPosition(position);
@@ -1254,24 +1151,13 @@
{
Stream *s = NULL;
int status;
- std::shared_ptr<ResourceManager> rm = NULL;
- rm = ResourceManager::getInstance();
- if (!rm) {
+ if (!stream_handle) {
status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid resource manager");
+ PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
- rm->lockActiveStream();
- if (!stream_handle || !rm->isActiveStream(stream_handle)) {
- rm->unlockActiveStream();
- status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
- return status;
- }
- rm->unlockActiveStream();
-
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->createMmapBuffer(min_size_frames, info);
diff --git a/configs/kalama/mixer_paths_kalama_aim.xml b/configs/kalama/mixer_paths_kalama_aim.xml
new file mode 100644
index 0000000..dd86f3d
--- /dev/null
+++ b/configs/kalama/mixer_paths_kalama_aim.xml
@@ -0,0 +1,1509 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
+
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* 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) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted (subject to the limitations in the
+* disclaimer below) provided that the following conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+*
+* * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
+
+<mixer>
+ <!-- These are the initial mixer settings -->
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="0" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="0" />
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_1" value="0" />
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_2" value="0" />
+
+ <!-- WSA controls -->
+ <ctl name="WSA RX0 MUX" value="ZERO" />
+ <ctl name="WSA RX1 MUX" value="ZERO" />
+ <ctl name="WSA_RX0 INP0" value="ZERO" />
+ <ctl name="WSA_RX1 INP0" value="ZERO" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="0" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="0" />
+ <ctl name="WSA PBR Enable" value="0" />
+ <ctl name="Idle Detect" value="0" />
+ <ctl name="WSA SPKRRECV" value="0" />
+ <ctl name="SpkrLeft COMP Switch" value="0" />
+ <ctl name="SpkrRight COMP Switch" value="0" />
+ <ctl name="SpkrLeft VISENSE Switch" value="0" />
+ <ctl name="SpkrRight VISENSE Switch" value="0" />
+ <ctl name="SpkrLeft CPS Switch" value="0" />
+ <ctl name="SpkrRight CPS Switch" value="0" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="0" />
+ <ctl name="SpkrRight SWR DAC_Port Switch" value="0" />
+ <ctl name="SpkrLeft PBR Switch" value="0" />
+ <ctl name="SpkrRight PBR Switch" value="0" />
+ <ctl name="SpkrLeft WSA MODE" value="0" />
+ <ctl name="SpkrRight WSA MODE" value="0" />
+
+ <!-- RX Controls -->
+ <ctl name="RX_MACRO RX0 MUX" value="ZERO" />
+ <ctl name="RX_MACRO RX1 MUX" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT0 DEM MUX" value="NORMAL_DSM_OUT" />
+ <ctl name="RX INT1 DEM MUX" value="NORMAL_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="0" />
+ <ctl name="RX_COMP2 Switch" value="0" />
+ <ctl name="HPHL_COMP Switch" value="0" />
+ <ctl name="HPHR_COMP Switch" value="0" />
+ <ctl name="EAR_RDAC Switch" value="0" />
+ <ctl name="HPHL_RDAC Switch" value="0" />
+ <ctl name="HPHR_RDAC Switch" value="0" />
+ <ctl name="AUX_RDAC Switch" value="0" />
+ <ctl name="RX_FIR Filter" value="OFF" />
+ <ctl name="RX_EAR Mode" value="OFF" />
+
+ <!-- TX Controls -->
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="0" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="0" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="0" />
+ <ctl name="VA_AIF1_CAP Mixer DEC3" value="0" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC2 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC3 MUX" value="SWR_MIC" />
+ <ctl name="VA DMIC MUX0" value="ZERO" />
+ <ctl name="VA DMIC MUX1" value="ZERO" />
+ <ctl name="VA DMIC MUX2" value="ZERO" />
+ <ctl name="VA DMIC MUX3" value="ZERO" />
+ <ctl name="VA SMIC MUX0" value="ZERO" />
+ <ctl name="VA SMIC MUX1" value="ZERO" />
+ <ctl name="VA SMIC MUX2" value="ZERO" />
+ <ctl name="VA SMIC MUX3" value="ZERO" />
+ <ctl name="VA_DEC0 MODE" value="ADC_DEFAULT" />
+ <ctl name="ADC2_BCS Disable" value="0" />
+ <ctl name="ADC1_MIXER Switch" value="0" />
+ <ctl name="ADC2_MIXER Switch" value="0" />
+ <ctl name="ADC3_MIXER Switch" value="0" />
+ <ctl name="ADC4_MIXER Switch" value="0" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="DEC0_BCS Switch" value="0" />
+ <ctl name="ADC2_BCS Disable" value="0" />
+ <ctl name="ADC3 MUX" value="INP4" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="VA_AMIC1_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC2_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC3_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC4_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="0" />
+ <ctl name="AMIC1_MIXER Switch" value="0" />
+ <ctl name="AMIC2_MIXER Switch" value="0" />
+ <ctl name="AMIC3_MIXER Switch" value="0" />
+ <ctl name="AMIC4_MIXER Switch" value="0" />
+ <ctl name="AMIC5_MIXER Switch" value="0" />
+
+ <ctl name="TX_AIF1_CAP Mixer DEC0" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC5" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC6" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC7" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC0" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC1" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC2" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC3" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC4" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC5" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC6" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC7" value="0" />
+ <ctl name="TX DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX0" value="ZERO" />
+ <ctl name="TX SMIC MUX0" value="ZERO" />
+ <ctl name="TX DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX1" value="ZERO" />
+ <ctl name="TX SMIC MUX1" value="ZERO" />
+ <ctl name="TX DEC2 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX2" value="ZERO" />
+ <ctl name="TX SMIC MUX2" value="ZERO" />
+ <ctl name="TX DEC3 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX3" value="ZERO" />
+ <ctl name="TX SMIC MUX3" value="ZERO" />
+ <ctl name="TX DEC4 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX4" value="ZERO" />
+ <ctl name="TX SMIC MUX4" value="ZERO" />
+ <ctl name="TX DEC5 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX5" value="ZERO" />
+ <ctl name="TX SMIC MUX5" value="ZERO" />
+ <ctl name="TX DEC6 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX6" value="ZERO" />
+ <ctl name="TX SMIC MUX6" value="ZERO" />
+ <ctl name="TX DEC7 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX7" value="ZERO" />
+ <ctl name="TX SMIC MUX7" value="ZERO" />
+
+ <!-- Volume controls -->
+ <ctl name="WSA_RX0 Digital Volume" value="84" />
+ <ctl name="WSA_RX1 Digital Volume" value="84" />
+ <ctl name="RX_RX0 Digital Volume" value="84" />
+ <ctl name="RX_RX1 Digital Volume" value="84" />
+ <ctl name="RX_RX2 Digital Volume" value="84" />
+ <ctl name="HPHL Volume" value="20" />
+ <ctl name="HPHR Volume" value="20" />
+
+ <ctl name="TX_DEC0 Volume" value="84" />
+ <ctl name="TX_DEC1 Volume" value="84" />
+ <ctl name="TX_DEC2 Volume" value="84" />
+ <ctl name="TX_DEC3 Volume" value="84" />
+ <ctl name="TX_DEC4 Volume" value="84" />
+ <ctl name="TX_DEC5 Volume" value="84" />
+ <ctl name="TX_DEC6 Volume" value="84" />
+ <ctl name="TX_DEC7 Volume" value="84" />
+
+ <ctl name="ADC1 Volume" value="12" />
+ <ctl name="ADC2 Volume" value="12" />
+ <ctl name="ADC3 Volume" value="12" />
+ <ctl name="ADC4 Volume" value="12" />
+
+ <ctl name="VA_DEC0 Volume" value="84" />
+ <ctl name="VA_DEC1 Volume" value="84" />
+ <ctl name="VA_DEC2 Volume" value="84" />
+ <ctl name="VA_DEC3 Volume" value="84" />
+
+ <!-- Compander controls -->
+ <ctl name="WSA_COMP1 Switch" value="0" />
+ <ctl name="WSA_COMP2 Switch" value="0" />
+
+ <!-- Headphone class-H mode -->
+ <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
+
+ <!-- IIR/voice anc -->
+ <ctl name="IIR0 Band1" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band2" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band3" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band4" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band5" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Enable Band1" value="0" />
+ <ctl name="IIR0 Enable Band2" value="0" />
+ <ctl name="IIR0 Enable Band3" value="0" />
+ <ctl name="IIR0 Enable Band4" value="0" />
+ <ctl name="IIR0 Enable Band5" value="0" />
+ <ctl name="IIR0 INP0 Volume" value="40" />
+ <ctl name="IIR0 INP0 MUX" value="ZERO" />
+ <ctl name="IIR0 INP1 MUX" value="ZERO" />
+ <ctl name="IIR0 INP2 MUX" value="ZERO" />
+ <ctl name="IIR0 INP3 MUX" value="ZERO" />
+
+ <!-- vbat related data -->
+ <ctl name="GSM mode Enable" value="OFF" />
+ <ctl name="WSA_Softclip0 Enable" value="0" />
+ <ctl name="WSA_Softclip1 Enable" value="0" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="0" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="0" />
+
+ <!-- Codec controls end -->
+
+ <!-- defaults for mmap record -->
+
+ <!-- HIFI Filter coefficients for headphones path -->
+ <path name="hifi-filter-coefficients">
+ <ctl name="RX0 FIR Coeff Num" value="8" />
+ <ctl name="RX0 FIR Coeff Group0" value="08 00 00 00 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ <ctl name="RX0 FIR Coeff Group1" value="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ <ctl name="RX1 FIR Coeff Num" value="8" />
+ <ctl name="RX1 FIR Coeff Group0" value="08 00 00 00 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ <ctl name="RX1 FIR Coeff Group1" value="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ </path>
+
+ <!-- These are audio route (FE to BE) specific mixer settings -->
+ <path name="gsm-mode">
+ <ctl name="GSM mode Enable" value="ON" />
+ </path>
+
+
+ <!-- These are actual sound device specific mixer settings -->
+
+ <path name="amic2">
+ <ctl name="TX DEC0 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX0" value="SWR_MIC10" />
+ <ctl name="DEC0_BCS Switch" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="ADC2 Volume" value="20" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX3_CH3" />
+ <ctl name="MBHC ChMap" value="SWRM_TX1_CH3" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="BCS Channel" value="CH2" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC2_MIXER Switch" value="1" />
+ </path>
+
+ <path name="amic5">
+ <ctl name="TX DEC3 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX3" value="SWR_MIC9" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ </path>
+
+ <path name="amic6">
+ <ctl name="TX DEC0 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX0" value="SWR_MIC4" />
+ <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="ADC3 MUX" value="INP6" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="AMIC6_MIXER Switch" value="1" />
+ </path>
+
+ <path name="dmic1">
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH2" />
+ <ctl name="DMIC1_MIXER Switch" value="1" />
+ </path>
+
+ <path name="dmic2">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC1" />
+ </path>
+
+ <path name="dmic3">
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC3" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="DMIC3 ChMap" value="SWRM_TX1_CH4" />
+ <ctl name="DMIC3_MIXER Switch" value="1" />
+ </path>
+
+ <path name="dmic4">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC3" />
+ </path>
+
+ <path name="dmic5">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC4" />
+ </path>
+
+ <path name="dmic6">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC5" />
+ </path>
+
+ <path name="speaker">
+ <ctl name="WSA RX0 MUX" value="AIF1_PB" />
+ <ctl name="WSA RX1 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX0 INP0" value="RX0" />
+ <ctl name="WSA_RX1 INP0" value="RX1" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="WSA_COMP2 Switch" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft CPS Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrRight COMP Switch" value="1" />
+ <ctl name="SpkrRight VISENSE Switch" value="1" />
+ <ctl name="SpkrRight CPS Switch" value="1" />
+ <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrLeft PBR Switch" value="1" />
+ <ctl name="SpkrRight PBR Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ </path>
+
+ <path name="haptics-dev">
+ <ctl name="SWR DAC_Port Switch" value="1" />
+ </path>
+
+ <path name="speaker-mono">
+ <ctl name="WSA RX0 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX0 INP0" value="RX0" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft CPS Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrLeft PBR Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ </path>
+
+ <path name="speaker-mono-2">
+ <ctl name="WSA RX1 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX1 INP0" value="RX1" />
+ <ctl name="WSA_COMP2 Switch" value="1" />
+ <ctl name="SpkrRight COMP Switch" value="1" />
+ <ctl name="SpkrRight VISENSE Switch" value="1" />
+ <ctl name="SpkrRight CPS Switch" value="1" />
+ <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrRight PBR Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ </path>
+
+ <path name="speaker-mono-vbat">
+ <path name="speaker-mono" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="speaker-mono-2-vbat">
+ <path name="speaker-mono-2" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="speaker-vbat">
+ <path name="speaker" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="speaker-hdk">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="speaker-fluid">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="speaker-liquid">
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-safe">
+ <path name="speaker-mono"/>
+ </path>
+
+ <path name="speaker-hdk-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="speaker-fluid-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="speaker-liquid-vbat">
+ <path name="speaker-vbat" />
+ </path>
+
+ <path name="speaker-safe-vbat">
+ <path name="speaker-mono-vbat"/>
+ </path>
+
+ <path name="sidetone-iir">
+ <ctl name="IIR0 Enable Band1" value="1" />
+ <ctl name="IIR0 Enable Band2" value="1" />
+ <ctl name="IIR0 Enable Band3" value="1" />
+ <ctl name="IIR0 Enable Band4" value="1" />
+ <ctl name="IIR0 Enable Band5" value="1" />
+ </path>
+
+ <path name="sidetone-headphones">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="40" />
+ <ctl name="IIR0 INP0 MUX" value="DEC0" />
+ <ctl name="RX INT0 MIX2 INP" value="SRC0" />
+ <ctl name="RX INT1 MIX2 INP" value="SRC0" />
+ </path>
+
+ <path name="sidetone-handset">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="40" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ <ctl name="RX INT2 MIX2 INP" value="SRC0" />
+ <ctl name="WSA_RX0 INT0 SIDETONE MIX" value="SRC0" />
+ </path>
+
+ <path name="sidetone-heaphone-handset-mic">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="0" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ <ctl name="RX INT0 MIX2 INP" value="SRC0" />
+ <ctl name="RX INT1 MIX2 INP" value="SRC0" />
+ </path>
+
+ <path name="afe-sidetone">
+ <ctl name="Voice Sidetone Enable" value="1" />
+ </path>
+
+ <path name="play-fm">
+ </path>
+
+ <path name="speaker-mic">
+ <path name="amic5" />
+ </path>
+
+ <path name="speaker-mic-liquid">
+ <path name="amic5" />
+ </path>
+
+ <path name="speaker-mic-sbc">
+ </path>
+
+ <path name="speaker-protected">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ <path name="speaker" />
+ </path>
+
+ <path name="voice-speaker-protected">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="voice-speaker-2-protected">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ <path name="speaker-mono-2" />
+ </path>
+
+ <path name="voice-speaker-stereo-protected">
+ <path name="speaker-protected" />
+ </path>
+
+ <path name="speaker-protected-vbat">
+ <path name="speaker-protected" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="voice-speaker-protected-vbat">
+ <path name="voice-speaker-protected" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="voice-speaker-2-protected-vbat">
+ <path name="voice-speaker-2-protected" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="voice-speaker-stereo-protected-vbat">
+ <path name="speaker-protected-vbat" />
+ </path>
+
+ <path name="vi-feedback">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ </path>
+
+ <path name="vi-feedback-mono-1">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ </path>
+
+ <path name="vi-feedback-mono-2">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ </path>
+
+ <path name="cps-feedback">
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_1" value="1" />
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_2" value="1" />
+ </path>
+
+ <path name="cps-feedback-mono-1">
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_1" value="1" />
+ </path>
+
+ <path name="cps-feedback-mono-2">
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_2" value="1" />
+ </path>
+
+ <path name="handset">
+ <ctl name="WSA RX0 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX0 INP0" value="RX0" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft CPS Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="EAR SPKR PA Gain" value="G_6_DB" />
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ </path>
+
+ <path name="handset-vbat">
+ <path name="handset" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="handset-mic">
+ <path name="amic6" />
+ </path>
+
+ <path name="handset-mic-unprocessed">
+ <path name="amic6" />
+ <ctl name="TX_DEC2 Volume" value="102" />
+ </path>
+
+ <path name="ultrasound-handset">
+ <ctl name="WSA RX_MIX0 MUX" value="AIF_MIX1_PB" />
+ <ctl name="WSA_RX0 MIX INP" value="RX_MIX0" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="EAR SPKR PA Gain" value="G_6_DB" />
+ </path>
+
+ <path name="ultrasound-handset-vbat">
+ <path name="ultrasound-handset" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="ultrasound-mic">
+ <path name="amic6" />
+ </path>
+
+ <path name="headphones">
+ <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
+ <ctl name="RX_MACRO RX1 MUX" value="AIF1_PB" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="RX1" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="1" />
+ <ctl name="RX_COMP2 Switch" value="1" />
+ <ctl name="HPHL_COMP Switch" value="1" />
+ <ctl name="HPHR_COMP Switch" value="1" />
+ <ctl name="HPHL_RDAC Switch" value="1" />
+ <ctl name="HPHR_RDAC Switch" value="1" />
+ </path>
+
+ <path name="headphones-and-haptics">
+ <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
+ <ctl name="RX_MACRO RX1 MUX" value="AIF1_PB" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="RX1" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="1" />
+ <ctl name="RX_COMP2 Switch" value="1" />
+ <ctl name="HPHL_COMP Switch" value="1" />
+ <ctl name="HPHR_COMP Switch" value="1" />
+ <ctl name="HPHL_RDAC Switch" value="1" />
+ <ctl name="HPHR_RDAC Switch" value="1" />
+ <ctl name="SWR DAC_Port Switch" value="1" />
+ </path>
+
+ <path name="headphones-44.1">
+ <path name="headphones" />
+ </path>
+
+ <path name="headphones-hifi-filter">
+ <ctl name="RX_FIR Filter" value="ON" />
+ <path name="headphones" />
+ </path>
+
+ <path name="hph-highquality-mode">
+ </path>
+
+ <path name="hph-lowpower-mode">
+ </path>
+
+ <path name="true-native-mode">
+ </path>
+
+ <path name="line">
+ <path name="headphones" />
+ </path>
+
+ <path name="headset-mic">
+ <ctl name="TX_DEC0 Volume" value="84" />
+ <path name="amic2" />
+ </path>
+
+ <path name="headset-mic-liquid">
+ <path name="amic2" />
+ </path>
+
+ <path name="voice-handset">
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-tmus">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-hac">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-hdk">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-tmus-hdk">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-speaker">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="voice-speaker-stereo">
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ <path name="speaker" />
+ </path>
+
+ <path name="voice-speaker-2">
+ <path name="speaker-mono-2" />
+ </path>
+
+ <path name="voice-speaker-hdk">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="voice-speaker-fluid">
+ <path name="speaker-fluid" />
+ </path>
+
+ <path name="voice-speaker-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="voice-speaker-stereo-vbat">
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ <path name="speaker-vbat" />
+ </path>
+
+ <path name="voice-speaker-2-vbat">
+ <path name="speaker-mono-2-vbat" />
+ </path>
+
+ <path name="voice-speaker-hdk-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="voice-speaker-fluid-vbat">
+ <path name="speaker-fluid-vbat" />
+ </path>
+
+ <path name="voice-speaker-mic">
+ <path name="speaker-mic" />
+ </path>
+
+ <path name="voice-headphones">
+ <path name="headphones" />
+ </path>
+
+ <path name="voice-headset">
+ <path name="headphones" />
+ </path>
+
+ <path name="voice-line">
+ <path name="voice-headphones" />
+ </path>
+
+ <path name="voice-headset-mic">
+ <path name="headset-mic" />
+ </path>
+
+ <path name="speaker-and-headphones">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones-hifi-filter" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-safe-and-headphones">
+ <path name="headphones" />
+ <path name="speaker-safe" />
+ </path>
+
+ <path name="speaker-and-line">
+ <path name="speaker-and-headphones" />
+ </path>
+
+ <path name="speaker-and-headphones-liquid">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-and-line-liquid">
+ <path name="speaker-and-headphones-liquid" />
+ </path>
+
+ <path name="usb-headphones">
+ </path>
+
+ <path name="usb-headset">
+ </path>
+
+ <path name="usb-headset-mic">
+ </path>
+
+ <path name="speaker-and-usb-headphones">
+ <path name="speaker" />
+ <path name="usb-headphones" />
+ </path>
+
+ <path name="speaker-safe-and-usb-headphones">
+ <path name="speaker-safe" />
+ <path name="usb-headphones" />
+ </path>
+
+ <path name="bt-sco">
+ </path>
+
+ <path name="bt-sco-mic">
+ </path>
+
+ <path name="bt-sco-wb">
+ </path>
+
+ <path name="bt-sco-mic-wb">
+ </path>
+
+ <path name="bt-sco-swb">
+ </path>
+
+ <path name="bt-sco-mic-swb">
+ </path>
+
+ <path name="bt-a2dp">
+ </path>
+
+ <path name="bt-a2dp-mic">
+ </path>
+
+ <path name="bt-ble">
+ </path>
+
+ <path name="bt-ble-mic">
+ </path>
+
+ <path name="va-mic-mono">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC9" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC4 Volume" value="10" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic-dmic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC9" />
+ <ctl name="VA SMIC MUX1" value="SWR_MIC4" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="ADC3 Volume" value="10" />
+ <ctl name="ADC4 Volume" value="10" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC6_MIXER Switch" value="1" />
+ <ctl name="AMIC6_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic-tmic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC2 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC9" />
+ <ctl name="VA SMIC MUX1" value="SWR_MIC4" />
+ <ctl name="VA SMIC MUX2" value="SWR_MIC1" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC3 MUX" value="INP6" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="DMIC1_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC6_MIXER Switch" value="1" />
+ <ctl name="AMIC6_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic-qmic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC3 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC2 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC3 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA DEC2 MUX" value="SWR_MIC" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC9" />
+ <ctl name="VA SMIC MUX1" value="SWR_MIC4" />
+ <ctl name="VA SMIC MUX3" value="SWR_MIC8" />
+ <ctl name="VA SMIC MUX2" value="SWR_MIC5" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="ADC2_BCS Disable" value="1" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="ADC3 MUX" value="INP4" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX3_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="ADC1 Volume" value="10" />
+ <ctl name="ADC2 Volume" value="10" />
+ <ctl name="ADC3 Volume" value="10" />
+ <ctl name="ADC4 Volume" value="10" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC1_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC3_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC4_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic">
+ <path name="va-mic-mono" />
+ </path>
+
+ <path name="va-mic-mono-lpi">
+ <ctl name="VA_DEC0 Volume" value="96" />
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC4" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="ADC3 MUX" value="INP6" />
+ <ctl name="VA_AMIC6_MIXER Switch" value="1" />
+ <ctl name="AMIC6_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic-dmic-lpi">
+ <ctl name="VA_DEC0 Volume" value="96" />
+ <ctl name="VA_DEC1 Volume" value="96" />
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC9" />
+ <ctl name="VA SMIC MUX1" value="SWR_MIC4" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC6_MIXER Switch" value="1" />
+ <ctl name="AMIC6_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic-tmic-lpi">
+ <ctl name="VA_DEC0 Volume" value="96" />
+ <ctl name="VA_DEC1 Volume" value="96" />
+ <ctl name="VA_DEC2 Volume" value="96" />
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC2 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC9" />
+ <ctl name="VA SMIC MUX1" value="SWR_MIC4" />
+ <ctl name="VA SMIC MUX2" value="SWR_MIC1" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC3 MUX" value="INP6" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="DMIC1_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC6_MIXER Switch" value="1" />
+ <ctl name="AMIC6_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic-qmic-lpi">
+ <ctl name="VA_DEC0 Volume" value="96" />
+ <ctl name="VA_DEC1 Volume" value="96" />
+ <ctl name="VA_DEC2 Volume" value="96" />
+ <ctl name="VA_DEC3 Volume" value="96" />
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC2 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC3 MUX" value="SWR_MIC" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC9" />
+ <ctl name="VA SMIC MUX1" value="SWR_MIC4" />
+ <ctl name="VA SMIC MUX2" value="SWR_MIC1" />
+ <ctl name="VA SMIC MUX3" value="SWR_MIC3" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC3 MUX" value="INP6" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="DMIC1 ChMap" value="SWRM_TX1_CH1" />
+ <ctl name="DMIC3 ChMap" value="SWRM_TX1_CH4" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="DMIC1_MIXER Switch" value="1" />
+ <ctl name="DMIC3_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC6_MIXER Switch" value="1" />
+ <ctl name="AMIC6_MIXER Switch" value="1" />
+ </path>
+
+ <path name="va-mic-lpi">
+ <path name="va-mic-mono-lpi" />
+ </path>
+
+ <path name="headset-va-mic-lpi">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC10" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX3_CH3" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_BCS Disable" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC2_MIXER Switch" value="1" />
+ </path>
+
+ <path name="headset-va-mic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC10" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX3_CH3" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_BCS Disable" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC2_MIXER Switch" value="1" />
+ </path>
+
+ <path name="lpi-pcm-logging">
+ <ctl name="LPI PCM Logging Enable" value="1" />
+ </path>
+
+ <!-- Dual MIC devices -->
+ <path name="handset-dmic-endfire">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC3 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
+ <ctl name="TX SMIC MUX3" value="SWR_MIC5" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ <ctl name="AMIC3_MIXER Switch" value="1" />
+ </path>
+
+ <path name="speaker-dmic-endfire">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC3 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC9" />
+ <ctl name="TX SMIC MUX3" value="SWR_MIC4" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ </path>
+
+ <path name="dmic-endfire">
+ <path name="handset-dmic-endfire" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ </path>
+
+ <path name="dmic-endfire-liquid">
+ <path name="handset-dmic-endfire" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ </path>
+
+ <path name="handset-stereo-dmic-ef">
+ <path name="handset-dmic-endfire" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef-tmus">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-speaker-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-rec-dmic-ef">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-fluence">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="hearing-aid-mic">
+ <path name="voice-speaker-mic"/>
+ </path>
+
+ <path name="handset-stereo-dmic-ef-liquid">
+ <path name="handset-dmic-endfire" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef-liquid">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef-liquid-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-speaker-dmic-ef-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-fluence-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="speaker-dmic-broadside">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DEC1 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ </path>
+
+ <path name="dmic-broadside">
+ <path name="speaker-dmic-broadside" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ </path>
+
+ <path name="voice-speaker-dmic-broadside">
+ <path name="dmic-broadside" />
+ </path>
+
+ <!-- Tri MIC devices -->
+ <path name="three-mic">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DEC1 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC3 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
+ <ctl name="TX SMIC MUX3" value="SWR_MIC5" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ <ctl name="AMIC3_MIXER Switch" value="1" />
+ </path>
+
+ <path name="speaker-tmic">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DEC1 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC3 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
+ <ctl name="TX SMIC MUX3" value="SWR_MIC5" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ <ctl name="AMIC3_MIXER Switch" value="1" />
+ </path>
+
+ <path name="voice-speaker-tmic">
+ <path name="speaker-tmic" />
+ </path>
+
+ <!-- Quad MIC devices -->
+ <path name="speaker-qmic">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="1" />
+ <ctl name="TX DEC1 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC3 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC4 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
+ <ctl name="TX SMIC MUX3" value="SWR_MIC5" />
+ <ctl name="TX SMIC MUX4" value="SWR_MIC8" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="ADC3 MUX" value="INP4" />
+ <ctl name="ADC2_BCS Disable" value="1" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX3_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ <ctl name="AMIC3_MIXER Switch" value="1" />
+ <ctl name="AMIC4_MIXER Switch" value="1" />
+ </path>
+
+ <path name="speaker-qmic-liquid">
+ </path>
+
+ <path name="voice-speaker-qmic">
+ <path name="speaker-qmic" />
+ </path>
+
+ <path name="quad-mic">
+ <path name="speaker-qmic" />
+ </path>
+
+ <path name="voice-speaker-qmic-liquid">
+ <path name="speaker-qmic-liquid" />
+ </path>
+
+ <path name="quad-mic-liquid">
+ <path name="speaker-qmic-liquid" />
+ </path>
+
+ <path name="handset-dual-amic-quad-adc-hdr">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="1"/>
+ <ctl name="TX DEC1 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC2 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC3 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC4 MUX" value="SWR_MIC"/>
+ <ctl name="ADC3 MUX" value="INP4"/>
+ <ctl name="HDR12 MUX" value="HDR12"/>
+ <ctl name="HDR34 MUX" value="HDR34"/>
+ <ctl name="ADC4 MUX" value="INP5"/>
+ <ctl name="TX2 MODE" value="ADC_HIFI"/>
+ <ctl name="TX0 MODE" value="ADC_HIFI"/>
+ <ctl name="TX3 MODE" value="ADC_HIFI"/>
+ <ctl name="TX1 MODE" value="ADC_HIFI"/>
+ <ctl name="ADC3 ChMap" value="SWRM_TX3_CH1"/>
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1"/>
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2"/>
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2"/>
+ <ctl name="ADC3_MIXER Switch" value="1"/>
+ <ctl name="ADC1_MIXER Switch" value="1"/>
+ <ctl name="ADC4_MIXER Switch" value="1"/>
+ <ctl name="ADC2_MIXER Switch" value="1"/>
+ <ctl name="AMIC1_MIXER Switch" value="1"/>
+ <ctl name="AMIC5_MIXER Switch" value="1"/>
+ <ctl name="TX_DEC1 Volume" value="84"/>
+ <ctl name="TX_DEC2 Volume" value="84"/>
+ <ctl name="TX_DEC3 Volume" value="84"/>
+ <ctl name="TX_DEC4 Volume" value="84"/>
+ <ctl name="ADC1 Volume" value="16"/>
+ <ctl name="ADC2 Volume" value="0"/>
+ <ctl name="ADC3 Volume" value="0"/>
+ <ctl name="ADC4 Volume" value="16"/>
+ </path>
+
+ <path name="unprocessed-hdr-mic-landscape">
+ <path name="handset-dual-amic-quad-adc-hdr" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX2" value="SWR_MIC8"/>
+ <ctl name="TX SMIC MUX3" value="SWR_MIC4"/>
+ <ctl name="TX SMIC MUX4" value="SWR_MIC5"/>
+ </path>
+
+ <path name="unprocessed-hdr-mic-inverted-landscape">
+ <path name="handset-dual-amic-quad-adc-hdr" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC4"/>
+ <ctl name="TX SMIC MUX2" value="SWR_MIC5"/>
+ <ctl name="TX SMIC MUX3" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX4" value="SWR_MIC8"/>
+ </path>
+
+ <path name="handset-single-amic-quad-adc">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="1"/>
+ <ctl name="TX DEC1 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC2 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC3 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC4 MUX" value="SWR_MIC"/>
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX2" value="SWR_MIC8"/>
+ <ctl name="TX SMIC MUX3" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX4" value="SWR_MIC8"/>
+ <ctl name="HDR34 MUX" value="HDR34"/>
+ <ctl name="TX2 MODE" value="ADC_HIFI"/>
+ <ctl name="TX3 MODE" value="ADC_HIFI"/>
+ <ctl name="ADC3 ChMap" value="SWRM_TX3_CH1"/>
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2"/>
+ <ctl name="ADC3_MIXER Switch" value="1"/>
+ <ctl name="ADC4_MIXER Switch" value="1"/>
+ <ctl name="AMIC5_MIXER Switch" value="1"/>
+ <ctl name="TX_DEC1 Volume" value="84"/>
+ <ctl name="TX_DEC2 Volume" value="84"/>
+ <ctl name="TX_DEC3 Volume" value="84"/>
+ <ctl name="TX_DEC4 Volume" value="84"/>
+ <ctl name="ADC3 Volume" value="0"/>
+ <ctl name="ADC4 Volume" value="16"/>
+ </path>
+
+ <path name="unprocessed-hdr-mic-portrait">
+ <path name="handset-single-amic-quad-adc" />
+ </path>
+
+ <path name="unprocessed-hdr-mic-inverted-portrait">
+ <path name="handset-single-amic-quad-adc" />
+ </path>
+
+ <!-- TTY devices -->
+
+ <path name="tty-headphones">
+ <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="1" />
+ <ctl name="HPHL_COMP Switch" value="1" />
+ <ctl name="HPHL_RDAC Switch" value="1" />
+ </path>
+
+ <path name="voice-tty-full-headphones">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-full-headset">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-vco-headphones">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-vco-headset">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-hco-handset">
+ <path name="handset" />
+ </path>
+
+
+ <path name="voice-tty-hco-handset-hdk">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-tty-full-headset-mic">
+ <path name="amic2" />
+ <ctl name="ADC2 Volume" value="0" />
+ <ctl name="TX_DEC5 Volume" value="84" />
+ </path>
+
+ <path name="voice-tty-hco-headset-mic">
+ <ctl name="TX DEC6 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX6" value="SWR_MIC5" />
+ <ctl name="TX_AIF1_CAP Mixer DEC6" value="1" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="MBHC ChMap" value="SWRM_TX3_CH3" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="BCS Channel" value="CH10" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC2_MIXER Switch" value="1" />
+ </path>
+
+ <path name="voice-tty-vco-handset-mic">
+ <path name="dmic3" />
+ </path>
+
+ <path name="unprocessed-handset-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="unprocessed-mic">
+ <path name="unprocessed-handset-mic" />
+ </path>
+
+ <path name="unprocessed-stereo-mic">
+ <path name="voice-rec-dmic-ef" />
+ </path>
+
+ <path name="unprocessed-three-mic">
+ <path name="three-mic" />
+ </path>
+
+ <path name="unprocessed-headset-mic">
+ <path name="headset-mic" />
+ </path>
+
+ <path name="echo-ref-record">
+ </path>
+
+</mixer>
diff --git a/configs/kalama/mixer_paths_kalama_rb5_gen2_dvt.xml b/configs/kalama/mixer_paths_kalama_rb5_gen2_dvt.xml
new file mode 100644
index 0000000..eb51d55
--- /dev/null
+++ b/configs/kalama/mixer_paths_kalama_rb5_gen2_dvt.xml
@@ -0,0 +1,1332 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
+
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* 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) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted (subject to the limitations in the
+* disclaimer below) provided that the following conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+*
+* * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
+
+<mixer>
+ <!-- These are the initial mixer settings -->
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="0" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="0" />
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_1" value="0" />
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_2" value="0" />
+
+ <!-- WSA controls -->
+ <ctl name="WSA RX0 MUX" value="ZERO" />
+ <ctl name="WSA RX1 MUX" value="ZERO" />
+ <ctl name="WSA_RX0 INP0" value="ZERO" />
+ <ctl name="WSA_RX1 INP0" value="ZERO" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="0" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="0" />
+ <ctl name="WSA PBR Enable" value="0" />
+ <ctl name="Idle Detect" value="0" />
+ <ctl name="WSA SPKRRECV" value="0" />
+ <ctl name="SpkrLeft COMP Switch" value="0" />
+ <ctl name="SpkrRight COMP Switch" value="0" />
+ <ctl name="SpkrLeft VISENSE Switch" value="0" />
+ <ctl name="SpkrRight VISENSE Switch" value="0" />
+ <ctl name="SpkrLeft CPS Switch" value="0" />
+ <ctl name="SpkrRight CPS Switch" value="0" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="0" />
+ <ctl name="SpkrRight SWR DAC_Port Switch" value="0" />
+ <ctl name="SpkrLeft PBR Switch" value="0" />
+ <ctl name="SpkrRight PBR Switch" value="0" />
+ <ctl name="SpkrLeft WSA MODE" value="0" />
+ <ctl name="SpkrRight WSA MODE" value="0" />
+
+ <!-- RX Controls -->
+ <ctl name="RX_MACRO RX0 MUX" value="ZERO" />
+ <ctl name="RX_MACRO RX1 MUX" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT0 DEM MUX" value="NORMAL_DSM_OUT" />
+ <ctl name="RX INT1 DEM MUX" value="NORMAL_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="0" />
+ <ctl name="RX_COMP2 Switch" value="0" />
+ <ctl name="HPHL_COMP Switch" value="0" />
+ <ctl name="HPHR_COMP Switch" value="0" />
+ <ctl name="EAR_RDAC Switch" value="0" />
+ <ctl name="HPHL_RDAC Switch" value="0" />
+ <ctl name="HPHR_RDAC Switch" value="0" />
+ <ctl name="AUX_RDAC Switch" value="0" />
+ <ctl name="RX_FIR Filter" value="OFF" />
+ <ctl name="RX_EAR Mode" value="OFF" />
+
+ <!-- TX Controls -->
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="0" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="0" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="0" />
+ <ctl name="VA_AIF1_CAP Mixer DEC3" value="0" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC1 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC2 MUX" value="SWR_MIC" />
+ <ctl name="VA DEC3 MUX" value="SWR_MIC" />
+ <ctl name="VA DMIC MUX0" value="ZERO" />
+ <ctl name="VA DMIC MUX1" value="ZERO" />
+ <ctl name="VA DMIC MUX2" value="ZERO" />
+ <ctl name="VA DMIC MUX3" value="ZERO" />
+ <ctl name="VA SMIC MUX0" value="ZERO" />
+ <ctl name="VA SMIC MUX1" value="ZERO" />
+ <ctl name="VA SMIC MUX2" value="ZERO" />
+ <ctl name="VA SMIC MUX3" value="ZERO" />
+ <ctl name="VA_DEC0 MODE" value="ADC_DEFAULT" />
+ <ctl name="ADC2_BCS Disable" value="0" />
+ <ctl name="ADC1_MIXER Switch" value="0" />
+ <ctl name="ADC2_MIXER Switch" value="0" />
+ <ctl name="ADC3_MIXER Switch" value="0" />
+ <ctl name="ADC4_MIXER Switch" value="0" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="DEC0_BCS Switch" value="0" />
+ <ctl name="ADC2_BCS Disable" value="0" />
+ <ctl name="ADC3 MUX" value="INP4" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="VA_AMIC1_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC2_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC3_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC4_MIXER Switch" value="0" />
+ <ctl name="VA_AMIC5_MIXER Switch" value="0" />
+ <ctl name="AMIC1_MIXER Switch" value="0" />
+ <ctl name="AMIC2_MIXER Switch" value="0" />
+ <ctl name="AMIC3_MIXER Switch" value="0" />
+ <ctl name="AMIC4_MIXER Switch" value="0" />
+ <ctl name="AMIC5_MIXER Switch" value="0" />
+
+ <ctl name="TX_AIF1_CAP Mixer DEC0" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC5" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC6" value="0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC7" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC0" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC1" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC2" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC3" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC4" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC5" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC6" value="0" />
+ <ctl name="TX_AIF2_CAP Mixer DEC7" value="0" />
+ <ctl name="TX DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX0" value="ZERO" />
+ <ctl name="TX SMIC MUX0" value="ZERO" />
+ <ctl name="TX DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX1" value="ZERO" />
+ <ctl name="TX SMIC MUX1" value="ZERO" />
+ <ctl name="TX DEC2 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX2" value="ZERO" />
+ <ctl name="TX SMIC MUX2" value="ZERO" />
+ <ctl name="TX DEC3 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX3" value="ZERO" />
+ <ctl name="TX SMIC MUX3" value="ZERO" />
+ <ctl name="TX DEC4 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX4" value="ZERO" />
+ <ctl name="TX SMIC MUX4" value="ZERO" />
+ <ctl name="TX DEC5 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX5" value="ZERO" />
+ <ctl name="TX SMIC MUX5" value="ZERO" />
+ <ctl name="TX DEC6 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX6" value="ZERO" />
+ <ctl name="TX SMIC MUX6" value="ZERO" />
+ <ctl name="TX DEC7 MUX" value="MSM_DMIC" />
+ <ctl name="TX DMIC MUX7" value="ZERO" />
+ <ctl name="TX SMIC MUX7" value="ZERO" />
+
+ <!-- Volume controls -->
+ <ctl name="WSA_RX0 Digital Volume" value="84" />
+ <ctl name="WSA_RX1 Digital Volume" value="84" />
+ <ctl name="RX_RX0 Digital Volume" value="84" />
+ <ctl name="RX_RX1 Digital Volume" value="84" />
+ <ctl name="RX_RX2 Digital Volume" value="84" />
+ <ctl name="HPHL Volume" value="20" />
+ <ctl name="HPHR Volume" value="20" />
+
+ <ctl name="TX_DEC0 Volume" value="84" />
+ <ctl name="TX_DEC1 Volume" value="84" />
+ <ctl name="TX_DEC2 Volume" value="84" />
+ <ctl name="TX_DEC3 Volume" value="84" />
+ <ctl name="TX_DEC4 Volume" value="84" />
+ <ctl name="TX_DEC5 Volume" value="84" />
+ <ctl name="TX_DEC6 Volume" value="84" />
+ <ctl name="TX_DEC7 Volume" value="84" />
+
+ <ctl name="ADC1 Volume" value="12" />
+ <ctl name="ADC2 Volume" value="12" />
+ <ctl name="ADC3 Volume" value="12" />
+ <ctl name="ADC4 Volume" value="12" />
+
+ <ctl name="VA_DEC0 Volume" value="84" />
+ <ctl name="VA_DEC1 Volume" value="84" />
+ <ctl name="VA_DEC2 Volume" value="84" />
+ <ctl name="VA_DEC3 Volume" value="84" />
+
+ <!-- Compander controls -->
+ <ctl name="WSA_COMP1 Switch" value="0" />
+ <ctl name="WSA_COMP2 Switch" value="0" />
+
+ <!-- Headphone class-H mode -->
+ <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
+
+ <!-- IIR/voice anc -->
+ <ctl name="IIR0 Band1" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band2" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band3" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band4" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Band5" value="00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" />
+ <ctl name="IIR0 Enable Band1" value="0" />
+ <ctl name="IIR0 Enable Band2" value="0" />
+ <ctl name="IIR0 Enable Band3" value="0" />
+ <ctl name="IIR0 Enable Band4" value="0" />
+ <ctl name="IIR0 Enable Band5" value="0" />
+ <ctl name="IIR0 INP0 Volume" value="40" />
+ <ctl name="IIR0 INP0 MUX" value="ZERO" />
+ <ctl name="IIR0 INP1 MUX" value="ZERO" />
+ <ctl name="IIR0 INP2 MUX" value="ZERO" />
+ <ctl name="IIR0 INP3 MUX" value="ZERO" />
+
+ <!-- vbat related data -->
+ <ctl name="GSM mode Enable" value="OFF" />
+ <ctl name="WSA_Softclip0 Enable" value="0" />
+ <ctl name="WSA_Softclip1 Enable" value="0" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="0" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="0" />
+
+ <!-- Codec controls end -->
+
+ <!-- defaults for mmap record -->
+
+ <!-- HIFI Filter coefficients for headphones path -->
+ <path name="hifi-filter-coefficients">
+ <ctl name="RX0 FIR Coeff Num" value="8" />
+ <ctl name="RX0 FIR Coeff Group0" value="08 00 00 00 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ <ctl name="RX0 FIR Coeff Group1" value="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ <ctl name="RX1 FIR Coeff Num" value="8" />
+ <ctl name="RX1 FIR Coeff Group0" value="08 00 00 00 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ <ctl name="RX1 FIR Coeff Group1" value="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" />
+ </path>
+
+ <!-- These are audio route (FE to BE) specific mixer settings -->
+ <path name="gsm-mode">
+ <ctl name="GSM mode Enable" value="ON" />
+ </path>
+
+
+ <!-- These are actual sound device specific mixer settings -->
+ <path name="amic1">
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ </path>
+
+ <path name="amic2">
+ <ctl name="TX DEC0 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX0" value="SWR_MIC5" />
+ <ctl name="DEC0_BCS Switch" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="MBHC ChMap" value="SWRM_TX1_CH3" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="BCS Channel" value="CH2" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC2_MIXER Switch" value="1" />
+ </path>
+
+
+ <path name="amic3">
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC5" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="ADC2_BCS Disable" value="1" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC3_MIXER Switch" value="1" />
+ </path>
+
+ <path name="amic4">
+ <ctl name="TX DEC5 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX5" value="SWR_MIC8" />
+ <ctl name="TX_AIF1_CAP Mixer DEC5" value="1" />
+ <ctl name="ADC3 MUX" value="INP4" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="ADC3 ChMap" value="SWRM_TX3_CH1" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="AMIC4_MIXER Switch" value="1" />
+ </path>
+
+ <path name="amic5">
+ <ctl name="TX DEC3 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX3" value="SWR_MIC9" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ </path>
+
+ <path name="amic6">
+ <ctl name="TX DEC4 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX4" value="SWR_MIC4" />
+ <ctl name="TX_AIF2_CAP Mixer DEC4" value="1" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ </path>
+
+ <path name="dmic1">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC0" />
+ </path>
+
+ <path name="dmic2">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC1" />
+ </path>
+
+ <path name="dmic3">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC2" />
+ </path>
+
+ <path name="dmic4">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC3" />
+ </path>
+
+ <path name="dmic5">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC4" />
+ </path>
+
+ <path name="dmic6">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC5" />
+ </path>
+
+ <path name="speaker">
+ <ctl name="WSA RX0 MUX" value="AIF1_PB" />
+ <ctl name="WSA RX1 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX0 INP0" value="RX0" />
+ <ctl name="WSA_RX1 INP0" value="RX1" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="WSA_COMP2 Switch" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft CPS Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrRight COMP Switch" value="1" />
+ <ctl name="SpkrRight VISENSE Switch" value="1" />
+ <ctl name="SpkrRight CPS Switch" value="1" />
+ <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrLeft PBR Switch" value="1" />
+ <ctl name="SpkrRight PBR Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ </path>
+
+ <path name="haptics-dev">
+ <ctl name="SWR DAC_Port Switch" value="1" />
+ </path>
+
+ <path name="speaker-mono">
+ <ctl name="WSA RX0 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX0 INP0" value="RX0" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft CPS Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrLeft PBR Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ </path>
+
+ <path name="speaker-mono-2">
+ <ctl name="WSA RX1 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX1 INP0" value="RX1" />
+ <ctl name="WSA_COMP2 Switch" value="1" />
+ <ctl name="SpkrRight COMP Switch" value="1" />
+ <ctl name="SpkrRight VISENSE Switch" value="1" />
+ <ctl name="SpkrRight CPS Switch" value="1" />
+ <ctl name="SpkrRight SWR DAC_Port Switch" value="1" />
+ <ctl name="SpkrRight PBR Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ </path>
+
+ <path name="speaker-mono-vbat">
+ <path name="speaker-mono" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="speaker-mono-2-vbat">
+ <path name="speaker-mono-2" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="speaker-vbat">
+ <path name="speaker" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="speaker-hdk">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="speaker-fluid">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="speaker-liquid">
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-safe">
+ <path name="speaker-mono"/>
+ </path>
+
+ <path name="speaker-hdk-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="speaker-fluid-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="speaker-liquid-vbat">
+ <path name="speaker-vbat" />
+ </path>
+
+ <path name="speaker-safe-vbat">
+ <path name="speaker-mono-vbat"/>
+ </path>
+
+ <path name="sidetone-iir">
+ <ctl name="IIR0 Enable Band1" value="1" />
+ <ctl name="IIR0 Enable Band2" value="1" />
+ <ctl name="IIR0 Enable Band3" value="1" />
+ <ctl name="IIR0 Enable Band4" value="1" />
+ <ctl name="IIR0 Enable Band5" value="1" />
+ </path>
+
+ <path name="sidetone-headphones">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="40" />
+ <ctl name="IIR0 INP0 MUX" value="DEC0" />
+ <ctl name="RX INT0 MIX2 INP" value="SRC0" />
+ <ctl name="RX INT1 MIX2 INP" value="SRC0" />
+ </path>
+
+ <path name="sidetone-handset">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="40" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ <ctl name="RX INT2 MIX2 INP" value="SRC0" />
+ <ctl name="WSA_RX0 INT0 SIDETONE MIX" value="SRC0" />
+ </path>
+
+ <path name="sidetone-heaphone-handset-mic">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="0" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ <ctl name="RX INT0 MIX2 INP" value="SRC0" />
+ <ctl name="RX INT1 MIX2 INP" value="SRC0" />
+ </path>
+
+ <path name="afe-sidetone">
+ <ctl name="Voice Sidetone Enable" value="1" />
+ </path>
+
+ <path name="play-fm">
+ </path>
+
+ <path name="speaker-mic">
+ <path name="dmic3" />
+ </path>
+
+ <path name="speaker-mic-liquid">
+ <path name="amic5" />
+ </path>
+
+ <path name="speaker-mic-sbc">
+ </path>
+
+ <path name="speaker-protected">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ <path name="speaker" />
+ </path>
+
+ <path name="voice-speaker-protected">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="voice-speaker-2-protected">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ <path name="speaker-mono-2" />
+ </path>
+
+ <path name="voice-speaker-stereo-protected">
+ <path name="speaker-protected" />
+ </path>
+
+ <path name="speaker-protected-vbat">
+ <path name="speaker-protected" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="voice-speaker-protected-vbat">
+ <path name="voice-speaker-protected" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="voice-speaker-2-protected-vbat">
+ <path name="voice-speaker-2-protected" />
+ <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="1" />
+ </path>
+
+ <path name="voice-speaker-stereo-protected-vbat">
+ <path name="speaker-protected-vbat" />
+ </path>
+
+ <path name="vi-feedback">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ </path>
+
+ <path name="vi-feedback-mono-1">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="1" />
+ </path>
+
+ <path name="vi-feedback-mono-2">
+ <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="1" />
+ </path>
+
+ <path name="cps-feedback">
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_1" value="1" />
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_2" value="1" />
+ </path>
+
+ <path name="cps-feedback-mono-1">
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_1" value="1" />
+ </path>
+
+ <path name="cps-feedback-mono-2">
+ <ctl name="WSA_AIF_CPS Mixer WSA_SPKR_CPS_2" value="1" />
+ </path>
+
+ <path name="handset">
+ <ctl name="WSA RX0 MUX" value="AIF1_PB" />
+ <ctl name="WSA_RX0 INP0" value="RX0" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft CPS Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="EAR SPKR PA Gain" value="G_6_DB" />
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ </path>
+
+ <path name="handset-vbat">
+ <path name="handset" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="handset-mic">
+ <path name="dmic3" />
+ </path>
+
+ <path name="handset-mic-unprocessed">
+ <path name="amic1" />
+ <ctl name="TX_DEC2 Volume" value="102" />
+ </path>
+
+ <path name="ultrasound-handset">
+ <ctl name="WSA RX_MIX0 MUX" value="AIF_MIX1_PB" />
+ <ctl name="WSA_RX0 MIX INP" value="RX_MIX0" />
+ <ctl name="WSA_COMP1 Switch" value="1" />
+ <ctl name="Idle Detect" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="WSA PBR Enable" value="1" />
+ <ctl name="EAR SPKR PA Gain" value="G_6_DB" />
+ </path>
+
+ <path name="ultrasound-handset-vbat">
+ <path name="ultrasound-handset" />
+ <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="1" />
+ </path>
+
+ <path name="ultrasound-mic">
+ <path name="amic6" />
+ </path>
+
+ <path name="headphones">
+ <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
+ <ctl name="RX_MACRO RX1 MUX" value="AIF1_PB" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="RX1" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="1" />
+ <ctl name="RX_COMP2 Switch" value="1" />
+ <ctl name="HPHL_COMP Switch" value="1" />
+ <ctl name="HPHR_COMP Switch" value="1" />
+ <ctl name="HPHL_RDAC Switch" value="1" />
+ <ctl name="HPHR_RDAC Switch" value="1" />
+ </path>
+
+ <path name="headphones-and-haptics">
+ <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
+ <ctl name="RX_MACRO RX1 MUX" value="AIF1_PB" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="RX1" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="1" />
+ <ctl name="RX_COMP2 Switch" value="1" />
+ <ctl name="HPHL_COMP Switch" value="1" />
+ <ctl name="HPHR_COMP Switch" value="1" />
+ <ctl name="HPHL_RDAC Switch" value="1" />
+ <ctl name="HPHR_RDAC Switch" value="1" />
+ <ctl name="SWR DAC_Port Switch" value="1" />
+ </path>
+
+ <path name="headphones-44.1">
+ <path name="headphones" />
+ </path>
+
+ <path name="headphones-hifi-filter">
+ <ctl name="RX_FIR Filter" value="ON" />
+ <path name="headphones" />
+ </path>
+
+ <path name="hph-highquality-mode">
+ </path>
+
+ <path name="hph-lowpower-mode">
+ </path>
+
+ <path name="true-native-mode">
+ </path>
+
+ <path name="line">
+ <path name="headphones" />
+ </path>
+
+ <path name="headset-mic">
+ <ctl name="TX_DEC0 Volume" value="84" />
+ <path name="amic2" />
+ </path>
+
+ <path name="headset-mic-liquid">
+ <path name="amic2" />
+ </path>
+
+ <path name="voice-handset">
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-tmus">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-hac">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-hdk">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-tmus-hdk">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-speaker">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="voice-speaker-stereo">
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ <path name="speaker" />
+ </path>
+
+ <path name="voice-speaker-2">
+ <path name="speaker-mono-2" />
+ </path>
+
+ <path name="voice-speaker-hdk">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="voice-speaker-fluid">
+ <path name="speaker-fluid" />
+ </path>
+
+ <path name="voice-speaker-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="voice-speaker-stereo-vbat">
+ <ctl name="WSA_RX0 Digital Volume" value="60" />
+ <path name="speaker-vbat" />
+ </path>
+
+ <path name="voice-speaker-2-vbat">
+ <path name="speaker-mono-2-vbat" />
+ </path>
+
+ <path name="voice-speaker-hdk-vbat">
+ <path name="speaker-mono-vbat" />
+ </path>
+
+ <path name="voice-speaker-fluid-vbat">
+ <path name="speaker-fluid-vbat" />
+ </path>
+
+ <path name="voice-speaker-mic">
+ <path name="speaker-mic" />
+ </path>
+
+ <path name="voice-headphones">
+ <path name="headphones" />
+ </path>
+
+ <path name="voice-headset">
+ <path name="headphones" />
+ </path>
+
+ <path name="voice-line">
+ <path name="voice-headphones" />
+ </path>
+
+ <path name="voice-headset-mic">
+ <path name="headset-mic" />
+ </path>
+
+ <path name="speaker-and-headphones">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones-hifi-filter" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-safe-and-headphones">
+ <path name="headphones" />
+ <path name="speaker-safe" />
+ </path>
+
+ <path name="speaker-and-line">
+ <path name="speaker-and-headphones" />
+ </path>
+
+ <path name="speaker-and-headphones-liquid">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-and-line-liquid">
+ <path name="speaker-and-headphones-liquid" />
+ </path>
+
+ <path name="usb-headphones">
+ </path>
+
+ <path name="usb-headset">
+ </path>
+
+ <path name="speaker-and-usb-headphones">
+ <path name="speaker" />
+ <path name="usb-headphones" />
+ </path>
+
+ <path name="speaker-safe-and-usb-headphones">
+ <path name="speaker-safe" />
+ <path name="usb-headphones" />
+ </path>
+
+ <path name="bt-sco">
+ </path>
+
+ <path name="bt-sco-mic">
+ </path>
+
+ <path name="bt-sco-wb">
+ </path>
+
+ <path name="bt-sco-mic-wb">
+ </path>
+
+ <path name="bt-sco-swb">
+ </path>
+
+ <path name="bt-sco-mic-swb">
+ </path>
+
+ <path name="bt-a2dp">
+ </path>
+
+ <path name="bt-a2dp-mic">
+ </path>
+
+ <path name="bt-ble">
+ </path>
+
+ <path name="bt-ble-mic">
+ </path>
+
+ <path name="va-mic-mono">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ </path>
+
+ <path name="va-mic-dmic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX1" value="DMIC3" />
+ </path>
+
+ <path name="va-mic-tmic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX1" value="DMIC3" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA DEC2 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX2" value="DMIC4" />
+ </path>
+
+ <path name="va-mic-qmic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX1" value="DMIC3" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA DEC2 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX2" value="DMIC4" />
+ <ctl name="VA_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="VA DEC3 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX3" value="DMIC5" />
+ </path>
+
+ <path name="va-mic">
+ <path name="va-mic-mono" />
+ </path>
+
+ <path name="va-mic-mono-lpi">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ </path>
+
+ <path name="va-mic-dmic-lpi">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ <ctl name="VA DMIC MUX1" value="DMIC3" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ </path>
+
+ <path name="va-mic-tmic-lpi">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="VA DEC2 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ <ctl name="VA DMIC MUX1" value="DMIC3" />
+ <ctl name="VA DMIC MUX2" value="DMIC4" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC2 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ </path>
+
+ <path name="va-mic-qmic-lpi">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="VA_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
+ <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
+ <ctl name="VA DEC3 MUX" value="MSM_DMIC" />
+ <ctl name="VA DEC2 MUX" value="MSM_DMIC" />
+ <ctl name="VA DMIC MUX0" value="DMIC2" />
+ <ctl name="VA DMIC MUX1" value="DMIC3" />
+ <ctl name="VA DMIC MUX2" value="DMIC4" />
+ <ctl name="VA DMIC MUX3" value="DMIC5" />
+ <ctl name="VA_DEC2 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
+ <ctl name="VA_DEC3 MODE" value="ADC_LOW_PWR" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX3 MODE" value="ADC_LP" />
+ </path>
+
+ <path name="va-mic-lpi">
+ <path name="va-mic-mono-lpi" />
+ </path>
+
+ <path name="headset-va-mic-lpi">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC5" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_BCS Disable" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC2_MIXER Switch" value="1" />
+ </path>
+
+ <path name="headset-va-mic">
+ <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="VA DEC0 MUX" value="SWR_MIC" />
+ <ctl name="VA SMIC MUX0" value="SWR_MIC5" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_BCS Disable" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="VA_AMIC2_MIXER Switch" value="1" />
+ </path>
+
+ <path name="lpi-pcm-logging">
+ <ctl name="LPI PCM Logging Enable" value="1" />
+ </path>
+
+ <!-- Dual MIC devices -->
+ <path name="handset-dmic-endfire">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC2" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DMIC MUX3" value="DMIC3" />
+ </path>
+
+ <path name="speaker-dmic-endfire">
+ <path name="handset-dmic-endfire" />
+ </path>
+
+ <path name="dmic-endfire">
+ <path name="handset-dmic-endfire" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ </path>
+
+ <path name="dmic-endfire-liquid">
+ <path name="handset-dmic-endfire" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ </path>
+
+ <path name="handset-stereo-dmic-ef">
+ <path name="handset-dmic-endfire" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef-tmus">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-speaker-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-rec-dmic-ef">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-fluence">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="hearing-aid-mic">
+ <path name="voice-speaker-mic"/>
+ </path>
+
+ <path name="handset-stereo-dmic-ef-liquid">
+ <path name="handset-dmic-endfire" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef-liquid">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef-liquid-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-speaker-dmic-ef-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-fluence-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="speaker-dmic-broadside">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DEC1 MUX" value="SWR_MIC" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9" />
+ <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
+ <ctl name="ADC4 MUX" value="INP5" />
+ <ctl name="HDR34 MUX" value="NO_HDR34" />
+ <ctl name="TX2 MODE" value="ADC_LP" />
+ <ctl name="TX0 MODE" value="ADC_LP" />
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
+ <ctl name="ADC4_MIXER Switch" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="AMIC5_MIXER Switch" value="1" />
+ <ctl name="AMIC1_MIXER Switch" value="1" />
+ </path>
+
+ <path name="dmic-broadside">
+ <path name="speaker-dmic-broadside" />
+ <ctl name="IIR0 INP0 MUX" value="DEC2" />
+ </path>
+
+ <path name="voice-speaker-dmic-broadside">
+ <path name="dmic-broadside" />
+ </path>
+
+ <!-- Tri MIC devices -->
+ <path name="three-mic">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC2" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DMIC MUX3" value="DMIC3" />
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="1" />
+ <ctl name="TX DMIC MUX4" value="DMIC4" />
+ </path>
+
+ <path name="speaker-tmic">
+ <path name="three-tmic" />
+ </path>
+
+ <path name="voice-speaker-tmic">
+ <path name="speaker-tmic" />
+ </path>
+
+ <!-- Quad MIC devices -->
+ <path name="quad-mic">
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC2" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DMIC MUX3" value="DMIC3" />
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="1" />
+ <ctl name="TX DMIC MUX4" value="DMIC4" />
+ <ctl name="TX_AIF1_CAP Mixer DEC5" value="1" />
+ <ctl name="TX DMIC MUX5" value="DMIC5" />
+ </path>
+
+ <path name="speaker-qmic">
+ <path name="quad-mic" />
+ </path>
+
+ <path name="speaker-qmic-liquid">
+ </path>
+
+ <path name="voice-speaker-qmic">
+ <path name="speaker-qmic" />
+ </path>
+
+ <path name="voice-speaker-qmic-liquid">
+ <path name="speaker-qmic-liquid" />
+ </path>
+
+ <path name="quad-mic-liquid">
+ <path name="speaker-qmic-liquid" />
+ </path>
+
+ <path name="handset-dual-amic-quad-adc-hdr">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="1"/>
+ <ctl name="TX DEC1 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC2 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC3 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC4 MUX" value="SWR_MIC"/>
+ <ctl name="ADC3 MUX" value="INP4"/>
+ <ctl name="HDR12 MUX" value="HDR12"/>
+ <ctl name="HDR34 MUX" value="HDR34"/>
+ <ctl name="ADC4 MUX" value="INP5"/>
+ <ctl name="TX2 MODE" value="ADC_HIFI"/>
+ <ctl name="TX0 MODE" value="ADC_HIFI"/>
+ <ctl name="TX3 MODE" value="ADC_HIFI"/>
+ <ctl name="TX1 MODE" value="ADC_HIFI"/>
+ <ctl name="ADC3 ChMap" value="SWRM_TX3_CH1"/>
+ <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1"/>
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2"/>
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2"/>
+ <ctl name="ADC3_MIXER Switch" value="1"/>
+ <ctl name="ADC1_MIXER Switch" value="1"/>
+ <ctl name="ADC4_MIXER Switch" value="1"/>
+ <ctl name="ADC2_MIXER Switch" value="1"/>
+ <ctl name="AMIC1_MIXER Switch" value="1"/>
+ <ctl name="AMIC5_MIXER Switch" value="1"/>
+ <ctl name="TX_DEC1 Volume" value="84"/>
+ <ctl name="TX_DEC2 Volume" value="84"/>
+ <ctl name="TX_DEC3 Volume" value="84"/>
+ <ctl name="TX_DEC4 Volume" value="84"/>
+ <ctl name="ADC1 Volume" value="16"/>
+ <ctl name="ADC2 Volume" value="0"/>
+ <ctl name="ADC3 Volume" value="0"/>
+ <ctl name="ADC4 Volume" value="16"/>
+ </path>
+
+ <path name="unprocessed-hdr-mic-landscape">
+ <path name="handset-dual-amic-quad-adc-hdr" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX2" value="SWR_MIC8"/>
+ <ctl name="TX SMIC MUX3" value="SWR_MIC4"/>
+ <ctl name="TX SMIC MUX4" value="SWR_MIC5"/>
+ </path>
+
+ <path name="unprocessed-hdr-mic-inverted-landscape">
+ <path name="handset-dual-amic-quad-adc-hdr" />
+ <ctl name="TX SMIC MUX1" value="SWR_MIC4"/>
+ <ctl name="TX SMIC MUX2" value="SWR_MIC5"/>
+ <ctl name="TX SMIC MUX3" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX4" value="SWR_MIC8"/>
+ </path>
+
+ <path name="handset-single-amic-quad-adc">
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1"/>
+ <ctl name="TX_AIF1_CAP Mixer DEC4" value="1"/>
+ <ctl name="TX DEC1 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC2 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC3 MUX" value="SWR_MIC"/>
+ <ctl name="TX DEC4 MUX" value="SWR_MIC"/>
+ <ctl name="TX SMIC MUX1" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX2" value="SWR_MIC8"/>
+ <ctl name="TX SMIC MUX3" value="SWR_MIC9"/>
+ <ctl name="TX SMIC MUX4" value="SWR_MIC8"/>
+ <ctl name="HDR34 MUX" value="HDR34"/>
+ <ctl name="TX2 MODE" value="ADC_HIFI"/>
+ <ctl name="TX3 MODE" value="ADC_HIFI"/>
+ <ctl name="ADC3 ChMap" value="SWRM_TX3_CH1"/>
+ <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2"/>
+ <ctl name="ADC3_MIXER Switch" value="1"/>
+ <ctl name="ADC4_MIXER Switch" value="1"/>
+ <ctl name="AMIC5_MIXER Switch" value="1"/>
+ <ctl name="TX_DEC1 Volume" value="84"/>
+ <ctl name="TX_DEC2 Volume" value="84"/>
+ <ctl name="TX_DEC3 Volume" value="84"/>
+ <ctl name="TX_DEC4 Volume" value="84"/>
+ <ctl name="ADC3 Volume" value="0"/>
+ <ctl name="ADC4 Volume" value="16"/>
+ </path>
+
+ <path name="unprocessed-hdr-mic-portrait">
+ <path name="handset-single-amic-quad-adc" />
+ </path>
+
+ <path name="unprocessed-hdr-mic-inverted-portrait">
+ <path name="handset-single-amic-quad-adc" />
+ </path>
+
+ <!-- TTY devices -->
+
+ <path name="tty-headphones">
+ <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX_COMP1 Switch" value="1" />
+ <ctl name="HPHL_COMP Switch" value="1" />
+ <ctl name="HPHL_RDAC Switch" value="1" />
+ </path>
+
+ <path name="voice-tty-full-headphones">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-full-headset">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-vco-headphones">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-vco-headset">
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-hco-handset">
+ <path name="handset" />
+ </path>
+
+
+ <path name="voice-tty-hco-handset-hdk">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-tty-full-headset-mic">
+ <path name="amic2" />
+ <ctl name="ADC2 Volume" value="0" />
+ <ctl name="TX_DEC5 Volume" value="84" />
+ </path>
+
+ <path name="voice-tty-hco-headset-mic">
+ <ctl name="TX DEC6 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX6" value="SWR_MIC5" />
+ <ctl name="TX_AIF1_CAP Mixer DEC6" value="1" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+ <ctl name="MBHC ChMap" value="SWRM_TX3_CH3" />
+ <ctl name="TX1 MODE" value="ADC_LP" />
+ <ctl name="BCS Channel" value="CH10" />
+ <ctl name="HDR12 MUX" value="NO_HDR12" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="AMIC2_MIXER Switch" value="1" />
+ </path>
+
+ <path name="voice-tty-vco-handset-mic">
+ <path name="dmic3" />
+ </path>
+
+ <path name="unprocessed-handset-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="unprocessed-mic">
+ <path name="unprocessed-handset-mic" />
+ </path>
+
+ <path name="unprocessed-stereo-mic">
+ <path name="voice-rec-dmic-ef" />
+ </path>
+
+ <path name="unprocessed-three-mic">
+ <path name="three-mic" />
+ </path>
+
+ <path name="unprocessed-headset-mic">
+ <path name="headset-mic" />
+ </path>
+
+ <path name="echo-ref-record">
+ </path>
+
+</mixer>
diff --git a/configs/kalama/resourcemanager_kalama_aim.xml b/configs/kalama/resourcemanager_kalama_aim.xml
new file mode 100644
index 0000000..14a0a55
--- /dev/null
+++ b/configs/kalama/resourcemanager_kalama_aim.xml
@@ -0,0 +1,1617 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
+
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* 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) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted (subject to the limitations in the
+* disclaimer below) provided that the following conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+*
+* * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-->
+
+<resource_manager_info>
+ <version>2.0</version>
+ <config_params>
+ <param key="native_audio_mode" value="multiple_mix_dsp"/>
+ <!-- Uncomment HIFI Filter Headphones related sections when set this
+ hifi_filter key to true -->
+ <param key="hifi_filter" value="false"/>
+ <param key="max_sessions" value="128"/>
+ <param key="max_nonTunnel_sessions" value="4"/>
+ <param key="logging_level" value ="3" />
+ <param key="context_manager_enable" value ="true" />
+ <param key="lpi_logging_enable" value ="false" />
+ <param key="upd_dedicated_be" value ="true" />
+ <param key="signal_handler" value ="true" />
+ <param key="device_mux_config" value ="false" />
+ <param key="upd_duty_cycle_enable" value="false" />
+ <param key="upd_virtual_port" value ="false" />
+ <param key="spkr_xmax_tmax_logging_enable" value ="false" />
+ </config_params>
+ <config_volume>
+ <use_volume_set_param>0</use_volume_set_param>
+ <supported_streams>
+ <supported_stream>PAL_STREAM_ULTRA_LOW_LATENCY</supported_stream>
+ <supported_stream>PAL_STREAM_COMPRESSED</supported_stream>
+ </supported_streams>
+ </config_volume>
+ <config_lpm>
+ <use_disable_lpm>1</use_disable_lpm>
+ <lpm_supported_streams>
+ <lpm_supported_stream>PAL_STREAM_LOW_LATENCY</lpm_supported_stream>
+ <lpm_supported_stream>PAL_STREAM_ULTRA_LOW_LATENCY</lpm_supported_stream>
+ </lpm_supported_streams>
+ </config_lpm>
+ <config_gapless key="gapless_supported" value="1"/>
+ <bt_codecs>
+ <codec codec_format="CODEC_TYPE_AAC" codec_type="enc|dec" codec_library="lib_bt_bundle.so" />
+ <codec codec_format="CODEC_TYPE_SBC" codec_type="enc|dec" codec_library="lib_bt_bundle.so" />
+ <codec codec_format="CODEC_TYPE_LDAC" codec_type="enc" codec_library="lib_bt_bundle.so" />
+ <codec codec_format="CODEC_TYPE_APTX" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_HD" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_AD" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_DUAL_MONO" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_AD_SPEECH" codec_type="enc|dec" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_LC3" codec_type="enc|dec" codec_library="lib_bt_ble.so" />
+ <codec codec_format="CODEC_TYPE_APTX_AD_QLEA" codec_type="enc" codec_library="lib_bt_ble.so" />
+ </bt_codecs>
+ <gain_db_to_level_mapping>
+ <gain_level_map db="-59" level="5"/>
+ <gain_level_map db="-17.4" level="4"/>
+ <gain_level_map db="-13.8" level="3"/>
+ <gain_level_map db="-10.2" level="2"/>
+ <gain_level_map db="0" level="1"/>
+ </gain_db_to_level_mapping>
+ <config_voice>
+ <vsid>0xB3000000</vsid>
+ <loopbackDelay>1000</loopbackDelay>
+ <maxVolIndex>5</maxVolIndex>
+ <mode_map>
+ <modepair key="0x11C05000" value="0xB3000001"/>
+ <modepair key="0x11DC5000" value="0xB3000001"/>
+ <modepair key="0x12006000" value="0xB3000001"/>
+ <modepair key="0x121C6000" value="0xB3000001"/>
+ </mode_map>
+ </config_voice>
+ <sleep_monitor_vote_streams>
+ <low_power_stream_type>PAL_STREAM_VOICE_UI</low_power_stream_type>
+ <low_power_stream_type>PAL_STREAM_ACD</low_power_stream_type>
+ <low_power_stream_type>PAL_STREAM_ULTRASOUND</low_power_stream_type>
+ <low_power_stream_type>PAL_STREAM_SENSOR_PCM_DATA</low_power_stream_type>
+ <avoid_vote_stream_type>PAL_STREAM_CONTEXT_PROXY</avoid_vote_stream_type>
+ </sleep_monitor_vote_streams>
+ <group_device_cfg>
+ <upd_rx>
+ <snd_device name="handset" />
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="1" />
+ </upd_rx>
+ <handset>
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="1" />
+ </handset>
+ <speaker>
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="3" />
+ </speaker>
+ <speaker_voice>
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="1" />
+ </speaker_voice>
+ <upd_rx_handset>
+ <snd_device name="speaker" />
+ <devicepp_mfc sample_rate="96000" channels="2" bit_width="16" />
+ <group_dev sample_rate = "96000" channels="2" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="3" />
+ </upd_rx_handset>
+ <upd_rx_speaker>
+ <snd_device name="speaker" />
+ <devicepp_mfc sample_rate="96000" channels="2" bit_width="16" />
+ <group_dev sample_rate = "96000" channels="2" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="3" />
+ </upd_rx_speaker>
+ </group_device_cfg>
+ <!--
+ Usecase Priorities
+ ====================
+
+ Examples of usecases with their corresponding priorities,
+ ranked from 1 (highest priority).
+ 1 for voice
+ 2 for VOIP
+ 3 for playback/recording and (default priority assigned in the streamPriorityLUT map in ResourceManager.cpp)
+ 4 for UPD
+
+ In the event of concurrency on shared backend devices, the stream with the highest priority will determine the final device.
+ Example:
+ ========================================
+ usecase | priority | snd-devicename
+ ========================================
+ VOICE | 1 | voice-handset
+ VOIP | 2 | voip-handset
+ deepbuffer| 3 | speaker-mono
+
+ The final device will be voice-handset.
+ -->
+ <device_profile>
+ <in-device>
+ <id>PAL_DEVICE_IN_HANDSET_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-3</back_end_name>
+ <max_channels>4</max_channels>
+ <channels>1</channels>
+ <samplerate>48000</samplerate>
+ <snd_device_name>handset-mic</snd_device_name>
+ <ec_enable>0</ec_enable>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <priority>2</priority>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <sidetone_mode>HW</sidetone_mode>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ <custom-config key="dual-mic">
+ <channels>2</channels>
+ <snd_device_name>handset-dmic-endfire</snd_device_name>
+ </custom-config>
+ <custom-config key="quad-mic">
+ <channels>4</channels>
+ <snd_device_name>quad-mic</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ <custom-config key="dual-mic">
+ <channels>2</channels>
+ <snd_device_name>handset-dmic-endfire</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_RAW</name>
+ <snd_device_name>handset-mic-unprocessed</snd_device_name>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_HANDSET</id>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ <id>PAL_DEVICE_OUT_WIRED_HEADPHONE</id>
+ <id>PAL_DEVICE_OUT_USB_DEVICE</id>
+ <id>PAL_DEVICE_OUT_USB_HEADSET</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_SPEAKER_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-3</back_end_name>
+ <max_channels>4</max_channels>
+ <samplerate>48000</samplerate>
+ <channels>1</channels>
+ <ec_enable>0</ec_enable>
+ <snd_device_name>speaker-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <priority>2</priority>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <sidetone_mode>OFF</sidetone_mode>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ <custom-config key="dual-mic">
+ <channels>2</channels>
+ <snd_device_name>speaker-dmic-endfire</snd_device_name>
+ </custom-config>
+ <custom-config key="quad-mic">
+ <channels>4</channels>
+ <snd_device_name>quad-mic</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_LOOPBACK</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_WIRED_HEADSET</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-3</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>headset-mic</snd_device_name>
+ <ec_enable>0</ec_enable>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <sidetone_mode>HW</sidetone_mode>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <priority>1</priority>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADSET</id>
+ <id>PAL_DEVICE_OUT_WIRED_HEADPHONE</id>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET</id>
+ <back_end_name>SLIM-DEV1-TX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <samplerate>8000</samplerate>
+ <bit_width>16</bit_width>
+ <snd_device_name>bt-sco-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_SCO</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_HANDSET_VA_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_VA-TX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <snd_device_name>va-mic</snd_device_name>
+ <ec_enable>1</ec_enable>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ <id>PAL_DEVICE_OUT_HANDSET</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_A2DP</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_HEADSET_VA_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_VA-TX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>headset-va-mic</snd_device_name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADSET</id>
+ <id>PAL_DEVICE_OUT_WIRED_HEADPHONE</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_A2DP</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_USB_HEADSET</id>
+ <back_end_name>USB_AUDIO-TX</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <samplerate>48000</samplerate>
+ <ec_enable>0</ec_enable>
+ <snd_device_name>usb-headset-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <sidetone_mode>HW</sidetone_mode>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_USB_HEADSET</id>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_FM_TUNER</id>
+ <back_end_name>MI2S-LPAIF-TX-SECONDARY</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>play-fm</snd_device_name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_LOOPBACK</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_PROXY</id>
+ <back_end_name>PCM_RT_PROXY-TX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_PROXY</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_VI_FEEDBACK</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-TX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>48000</samplerate>
+ <bit_width>32</bit_width>
+ <snd_device_name>vi-feedback</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <channels>1</channels>
+ <snd_device_name>vi-feedback-mono-2</snd_device_name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_CPS_FEEDBACK</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-TX-2</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>24000</samplerate>
+ <bit_width>32</bit_width>
+ <snd_device_name>cps-feedback</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <channels>1</channels>
+ <snd_device_name>cps-feedback-mono-2</snd_device_name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_BLUETOOTH_A2DP</id>
+ <back_end_name>SLIM-DEV1-TX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-a2dp-mic</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_BLUETOOTH_BLE</id>
+ <back_end_name>SLIM-DEV1-TX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-ble-mic</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_TELEPHONY_RX</id>
+ <back_end_name>PCM_RT_PROXY-TX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_PROXY</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_ULTRASOUND_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-4</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <samplerate>96000</samplerate>
+ <bit_width>16</bit_width>
+ <snd_device_name>ultrasound-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_ULTRASOUND</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_EXT_EC_REF</id>
+ <back_end_name>MI2S-LPAIF-TX-TERTIARY</back_end_name>
+ <snd_device_name>ext_ec_ref_tx</snd_device_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_ECHO_REF</id>
+ <back_end_name>PCM_DUMMY-TX-0</back_end_name>
+ <snd_device_name>echo-ref-record</snd_device_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <bit_width>16</bit_width>
+ <samplerate>48000</samplerate>
+ <usecase>
+ <name>PAL_STREAM_RAW</name>
+ </usecase>
+ </in-device>
+ <out-device>
+ <id>PAL_DEVICE_NONE</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>none</snd_device_name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>48000</samplerate>
+ <snd_device_name>speaker</snd_device_name>
+ <speaker_protection_enabled>1</speaker_protection_enabled>
+ <fractional_sr>0</fractional_sr>
+ <!-- To enable external EC reference the flag extec_ref_enabled must be added as 1 -->
+ <ext_ec_ref_enabled>0</ext_ec_ref_enabled>
+ <!-- Flag to specify cps mode which is applicable
+ Values: disable CPS: 0
+ CPS streaming: 1
+ ADSP control mode: 2
+ -->
+ <cps_mode>1</cps_mode>
+ <vbat_enabled>1</vbat_enabled>
+ <wsa2_enable>0</wsa2_enable>
+ <!--wsa registers physical addresses in decimal notation -->
+ <wsa_wr_cmd_reg_phy_addr>112279584</wsa_wr_cmd_reg_phy_addr>
+ <wsa_rd_cmd_reg_phy_addr>112279588</wsa_rd_cmd_reg_phy_addr>
+ <wsa_rd_fifo_reg_phy_addr>112279616</wsa_rd_fifo_reg_phy_addr>
+ <!--wsa2 registers physical addresses in decimal notation and to be updated only if wsa2 is enabled, else should be marked as 0-->
+ <wsa2_wr_cmd_reg_phy_addr>0</wsa2_wr_cmd_reg_phy_addr>
+ <wsa2_rd_cmd_reg_phy_addr>0</wsa2_rd_cmd_reg_phy_addr>
+ <wsa2_rd_fifo_reg_phy_addr>0</wsa2_rd_fifo_reg_phy_addr>
+ <!--specify the supported bit format on speaker end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_LE</supported_bit_format>-->
+ <!--We support 24 bit for speaker as of now, as some module in ADSP does not support Q31 format-->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_LE</supported_bit_format>
+ <!-- RAS should be enabled with speaker protection always -->
+ <ras_enabled>0</ras_enabled>
+ <!-- Flag to specify speaker in case Voice call is switched from
+ handset to speaker with only 1 speaker.
+ Values: Both speaker : 0
+ Right speaker: 1
+ Left speaker : 2
+ -->
+ <speaker_mono_right>0</speaker_mono_right>
+ <!-- Time in seconds for Quick cal. Set 0 to disable -->
+ <quick_cal_time>0</quick_cal_time>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <channels>1</channels>
+ <snd_device_name>speaker-mono-2</snd_device_name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <channels>1</channels>
+ <snd_device_name>speaker-mono-2</snd_device_name>
+ </usecase>
+ <!--
+ Playback/Recording streams have a default priority of 3
+ (default priority assigned in the streamPriorityLUT map in ResourceManager.cpp).
+ Check the comments above "Usecase Priorities" for details.
+ -->
+ <!--
+ While the UPD runs on a shared backend, whenever a speaker usecase arises,
+ UPD must always switch to the speaker; it can only return to handset when
+ the last speaker usecase terminates.
+ Giving UPD the lowest priority is in line with the understanding of
+ priority settings.
+ -->
+ <usecase>
+ <name>PAL_STREAM_ULTRASOUND</name>
+ <priority>4</priority>
+ <samplerate>96000</samplerate>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HANDSET</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <!-- To enable external EC reference the flag extec_ref_enabled must be added as 1 -->
+ <ext_ec_ref_enabled>0</ext_ec_ref_enabled>
+ <samplerate>48000</samplerate>
+ <fractional_sr>0</fractional_sr>
+ <snd_device_name>handset</snd_device_name>
+ <handset_protection_enabled>0</handset_protection_enabled>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <custom-config key="HAC">
+ <snd_device_name>voice-handset-hac</snd_device_name> <!-- override sound device name with HAC handset -->
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <custom-config key="HAC">
+ <snd_device_name>voice-handset-hac</snd_device_name> <!-- override sound device name with HAC handset for voip -->
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRASOUND</name>
+ <priority>4</priority>
+ <samplerate>96000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADPHONE</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <fractional_sr>1</fractional_sr>
+ <snd_device_name>headphones</snd_device_name>
+ <!--HIFI Filter Headphones-Uncomment this when param key hifi_filter is true
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_PCM_OFFLOAD</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADSET</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <fractional_sr>1</fractional_sr>
+ <snd_device_name>headphones</snd_device_name>
+ <!--HIFI Filter Headphones-Uncomment this when param key hifi_filter is true
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_PCM_OFFLOAD</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_A2DP</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-a2dp</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-ble</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-ble</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_SCO</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-sco</snd_device_name>
+ <samplerate>8000</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_AUX_DIGITAL</id>
+ <back_end_name>DISPLAY_PORT-RX</back_end_name>
+ <max_channels>32</max_channels>
+ <channels>2</channels>
+ <snd_device_name>display-port</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HDMI</id>
+ <back_end_name>DISPLAY_PORT-RX</back_end_name>
+ <max_channels>32</max_channels>
+ <channels>2</channels>
+ <fractional_sr>1</fractional_sr>
+ <snd_device_name>display-port</snd_device_name>
+ <!--specify the supported bit format on HDMI end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for HDMI as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_USB_DEVICE</id>
+ <back_end_name>USB_AUDIO-RX</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>usb-headphones</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_USB_HEADSET</id>
+ <back_end_name>USB_AUDIO-RX</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>usb-headphones</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_AUX_DIGITAL_1</id>
+ <back_end_name>DISPLAY_PORT-RX</back_end_name>
+ <max_channels>8</max_channels>
+ <channels>2</channels>
+ <snd_device_name>display-port</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <!--specify the supported bit format on DP end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>-->
+ <!--We support 24 bit for DP as of now, as SPF needs to conform to IEC 60958 packet format -->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_3LE</supported_bit_format>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_PROXY</id>
+ <back_end_name>PCM_RT_PROXY-RX-1</back_end_name>
+ <max_channels>8</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <fractional_sr>0</fractional_sr>
+ <samplerate>48000</samplerate>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HEARING_AID</id>
+ <back_end_name>PCM_RT_PROXY-RX-1</back_end_name>
+ <max_channels>8</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <fractional_sr>0</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HAPTICS_DEVICE</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-RX-6</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>haptics-dev</snd_device_name>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_ULTRASOUND</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>ultrasound-handset</snd_device_name>
+ <samplerate>96000</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_ULTRASOUND_DEDICATED</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>ultrasound-handset</snd_device_name>
+ <samplerate>96000</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ </device_profile>
+ <in_streams>
+ <in_stream>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_VOICE_UI</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_ACD</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_PROXY</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_COMPRESSED</disabled_stream>
+ <disabled_stream>PAL_STREAM_ULTRA_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_RAW</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_COMPRESSED</disabled_stream>
+ <disabled_stream>PAL_STREAM_ULTRA_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_SENSOR_PCM_DATA</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ </in_streams>
+ <sound_trigger_platform_info>
+ <common_config>
+ <!-- Sound trigger streams common params -->
+ <param lpi_enable="true" />
+ <param support_nlpi_switch="true" />
+ <param support_device_switch="true" />
+ <param enable_debug_dumps="false" />
+ <param concurrent_capture="true" />
+ <param concurrent_voice_call="true" />
+ <param concurrent_voip_call="true" />
+ <param low_latency_bargein_enable="false" />
+ </common_config>
+ <capture_profile_list>
+ <!-- Common Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI_AAD">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_RAW_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_RAW_LPI_AAD">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <!-- ACD Specific Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <!-- Sensor PCM Data Specific Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFEC">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_FFEC">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <!-- SVA/Hotword Specific Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_NLPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_RAW_NLPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_RAW_LPI">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_RAW_LPI_AAD">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_RAW_NLPI">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ </capture_profile_list>
+ <acd_platform_info>
+ <config>
+ <param acd_enable="true" />
+ </config>
+ <!-- ACD -->
+ <stream_config>
+ <name>QC_ACD</name>
+ <param vendor_uuid="4e93281b-296e-4d73-9833-2710c3c7c1db" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_LPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_LPI" />
+ <high_performance capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ </operating_modes>
+ <sound_model_info>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_ID_EVENT</name>
+ <bin>event.eai</bin>
+ <uuid>0x0B001007</uuid>
+ <contexts>
+ <context id="0x0800132D" /> <!-- EVENT_ALARM -->
+ <context id="0x0800132E" /> <!-- EVENT_BABYCRYING -->
+ <context id="0x0800132F" /> <!-- EVENT_DOGBARKING -->
+ <context id="0x08001330" /> <!-- EVENT_DOORBELL -->
+ <context id="0x08001331" /> <!-- EVENT_DOOROPENCLOSE -->
+ <context id="0x08001332" /> <!-- EVENT_CRASH -->
+ <context id="0x08001333" /> <!-- EVENT_GLASSBREAKING -->
+ <context id="0x08001334" /> <!-- EVENT_SIREN -->
+ <context id="0x080013CC" /> <!-- EVENT_CARHONK -->
+ <context id="0x080013CD" /> <!-- EVENT_GUNSHOT -->
+ <context id="0x080013CE" /> <!-- EVENT_PHONERING -->
+ <context id="0x080013CF" /> <!-- EVENT_SLEEPAPNEA -->
+ <context id="0x080013D0" /> <!-- EVENT_SNORING -->
+ <context id="0x080013D1" /> <!-- EVENT_CATMEOW -->
+ <context id="0x080013D2" /> <!-- EVENT_DOORKNOCK -->
+ <context id="0x080013D3" /> <!-- EVENT_WATERFLOW -->
+ <context id="0x080013D4" /> <!-- EVENT_FIREALARM -->
+ </contexts>
+ </sound_model>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_ID_SPEECH</name>
+ <bin>speech.eai</bin>
+ <uuid>0x0B001008</uuid>
+ <contexts>
+ <context id="0x08001335" /> <!-- AMBIENCE_SPEECH -->
+ </contexts>
+ </sound_model>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_ID_MUSIC</name>
+ <bin>music.eai</bin>
+ <uuid>0x0B001009</uuid>
+ <contexts>
+ <context id="0x08001336" /> <!-- AMBIENCE_MUSIC -->
+ </contexts>
+ </sound_model>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_AMBIENCE_NOISE_SILENCE</name>
+ <bin></bin> <!-- Following contexts dont have a model, hence empty bin -->
+ <uuid>0xFFFFFFFF</uuid> <!-- Indicates no sound model -->
+ <contexts>
+ <context id="0x08001337" /> <!-- AMBIENCE_NOISY_SPL -->
+ <context id="0x08001338" /> <!-- AMBIENCE_SILENT_SPL -->
+ <context id="0x08001339" /> <!-- AMBIENCE_NOISY_SFLUX -->
+ <context id="0x0800133A" /> <!-- AMBIENCE_SILENT_SFLUX -->
+ </contexts>
+ </sound_model>
+ </sound_model_info>
+ </stream_config>
+ <!-- Sensor PCM Data -->
+ <stream_config>
+ <name>QC_SENSOR_PCM_DATA</name>
+ <param vendor_uuid="c88a2c89-7a55-498c-836f-5d7ec8582990" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_RAW_LPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI" />
+ <low_power_ns capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFNS" />
+ <high_performance capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFEC" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFEC" />
+ <high_performance_ns capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ </operating_modes>
+ </stream_config>
+ </acd_platform_info>
+ <!-- Voice UI -->
+ <vui_platform_info>
+ <config>
+ <!-- Voice UI Params used by apk to indicate the Voice UI version current platform supports -->
+ <param version="0x0103" />
+ <param enable_failure_detection="false" />
+ <param notify_second_stage_failure="false" />
+ <param mmap_enable="true" />
+ <param mmap_buffer_duration="5000" />
+ <!-- 5ms duration of data -->
+ <param mmap_frame_length="5" />
+ <!-- Move this flag to common_config if ACD/Sensor PCM Data support car mode in the future -->
+ <param transit_to_non_lpi_on_charging="false" />
+ </config>
+ <!-- Multiple stream_config tags can be listed, each with unique -->
+ <!-- vendor_uuid. The below tag represents QC Voice UI sound model -->
+ <!-- configuration. ISV must use their own unique vendor_uuid. -->
+ <stream_config>
+ <name>QC_VOICE_UI</name>
+ <param vendor_uuid="68ab2d40-e860-11e3-95ef-0002a5d5c51b" />
+ <param merge_first_stage_sound_models="false" />
+ <!--For now total 3 engines are supported, if more engine instances are needed,-->
+ <!-- do update acdb and usecaseKvManager.xml files by adding more instances -->
+ <param pdk_first_stage_max_engine_count="3"/>
+ <!-- Profile specific data which the algorithm can support -->
+ <param capture_keyword="2000" /> <!-- Default history buffer length -->
+ <param client_capture_read_delay="2000" /> <!-- reserved buffer duration for rt data -->
+ <param pre_roll_duration="500" /> <!-- Default preroll duration -->
+ <!-- durations in us -->
+ <param kw_start_tolerance="360000" />
+ <param kw_end_tolerance="240000" />
+ <param data_before_kw_start="360000" />
+ <param data_after_kw_end="480000" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_RAW_LPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI" />
+ <high_performance capture_profile_handset="DUAL_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ <high_performance_and_charging capture_profile_handset="DUAL_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ </operating_modes>
+ <sound_model_info>
+ <first_stage_module_params>
+ <param module_type="GMM" />
+ <param load_sound_model_ids="0xC0000008, 0x0800104C" />
+ <param wakeup_config_ids="0xC0000008, 0x08001049" />
+ <param buffering_config_ids="0xC0000008, 0x08001044" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ <first_stage_module_params>
+ <param module_type="PDK" />
+ <param load_sound_model_ids="0xC0000008, 0x0800124E" />
+ <param unload_sound_model_ids="0xC0000008, 0x08001250" />
+ <param wakeup_config_ids="0xC0000008, 0x08001049" />
+ <param buffering_config_ids="0xC0000008, 0x0800124F" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ <arm_ss_module_params>
+ <!-- Options are "KEYWORD_DETECTION", "USER_VERIFICATION", "CUSTOM_DETECTION" -->
+ <param sm_detection_type= "KEYWORD_DETECTION" />
+ <param sm_id="0x2" />
+ <param module_lib="libcapiv2svacnnvendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ <arm_ss_module_params>
+ <param sm_detection_type= "USER_VERIFICATION" />
+ <param sm_id="0x4" />
+ <param module_lib="libcapiv2uvvendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ <arm_ss_module_params>
+ <param sm_detection_type= "KEYWORD_DETECTION" />
+ <param sm_id="0x8" />
+ <param module_lib="libcapiv2svarnnvendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ <arm_ss_module_params>
+ <param sm_detection_type= "KEYWORD_DETECTION" />
+ <param sm_id="0x40" />
+ <param module_lib="libcapiv2udk7vendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ </sound_model_info>
+ </stream_config>
+ <!-- Hotword Voice UI-->
+ <stream_config>
+ <name>HOTWORD_VOICE_UI</name>
+ <param vendor_uuid="7038ddc8-30f2-11e6-b0ac-40a8f03d3f15" />
+ <param get_module_version="false" />
+ <param merge_first_stage_sound_models="false" />
+ <param capture_keyword="2000" />
+ <param client_capture_read_delay="2000" />
+ <param kw_start_tolerance="100" />
+ <param kw_end_tolerance="100" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_RAW_LPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI" />
+ <high_performance capture_profile_handset="DUAL_MIC_16KHZ_16BIT_RAW_NLPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_NLPI" />
+ <high_performance_and_charging capture_profile_handset="DUAL_MIC_16KHZ_16BIT_RAW_NLPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_NLPI" />
+ </operating_modes>
+ <sound_model_info>
+ <first_stage_module_params>
+ <param module_type="HOTWORD" />
+ <param load_sound_model_ids="0xC0000008, 0x0800104C" />
+ <param unload_sound_model_ids="0xC0000008, 0x00012C15" />
+ <param buffering_config_ids="0xC0000008, 0x08001044" />
+ <param version_ids="0xC0000008, 0x18000101" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ </sound_model_info>
+ </stream_config>
+ <!-- CUSTOM Voice UI-->
+ <stream_config>
+ <name>CUSTOM_VOICE_UI</name>
+ <!-- NOTE: Customer need to replace with their own uuid and match with sound model -->
+ <param vendor_uuid="c51c508a-ee1b-11ec-8ea0-0242ac120002" />
+ <param merge_first_stage_sound_models="false" />
+ <!-- Profile specific data which the algorithm can support -->
+ <param capture_keyword="2000" /> <!-- Default history buffer length -->
+ <param client_capture_read_delay="2000" /> <!-- reserved buffer duration for rt data -->
+ <param pre_roll_duration="500" /> <!-- Default preroll duration -->
+ <!-- durations in us -->
+ <param kw_start_tolerance="360000" />
+ <param kw_end_tolerance="240000" />
+ <param data_before_kw_start="360000" />
+ <param data_after_kw_end="480000" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="DUAL_MIC_16KHZ_16BIT_CUSTOM_NS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_NS" />
+ <high_performance capture_profile_handset="DUAL_MIC_16KHZ_16BIT_CUSTOM_ECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_ECNS" />
+ <high_performance_and_charging capture_profile_handset="DUAL_MIC_16KHZ_16BIT_CUSTOM_ECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_ECNS" />
+ </operating_modes>
+ <sound_model_info>
+ <first_stage_module_params>
+ <param module_type="CUSTOM1" />
+ <param load_sound_model_ids="0xC0000008, 0x0800104C" />
+ <param custom_config_ids="0xC0000008, 0x08001049" />
+ <param buffering_config_ids="0xC0000008, 0x08001044" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ </sound_model_info>
+ </stream_config>
+ </vui_platform_info>
+ </sound_trigger_platform_info>
+</resource_manager_info>
diff --git a/configs/kalama/resourcemanager_kalama_rb5_gen2_dvt.xml b/configs/kalama/resourcemanager_kalama_rb5_gen2_dvt.xml
new file mode 100644
index 0000000..6ef74c6
--- /dev/null
+++ b/configs/kalama/resourcemanager_kalama_rb5_gen2_dvt.xml
@@ -0,0 +1,1584 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
+
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* 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) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted (subject to the limitations in the
+* disclaimer below) provided that the following conditions are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+*
+* * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+* GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-->
+
+<resource_manager_info>
+ <version>2.0</version>
+ <config_params>
+ <param key="native_audio_mode" value="multiple_mix_dsp"/>
+ <!-- Uncomment HIFI Filter Headphones related sections when set this
+ hifi_filter key to true -->
+ <param key="hifi_filter" value="false"/>
+ <param key="max_sessions" value="128"/>
+ <param key="max_nonTunnel_sessions" value="4"/>
+ <param key="logging_level" value ="3" />
+ <param key="context_manager_enable" value ="false" />
+ <param key="lpi_logging_enable" value ="false" />
+ <param key="upd_dedicated_be" value ="true" />
+ <param key="signal_handler" value ="true" />
+ <param key="device_mux_config" value ="false" />
+ <param key="upd_duty_cycle_enable" value="false" />
+ <param key="upd_virtual_port" value ="false" />
+ </config_params>
+ <config_volume>
+ <use_volume_set_param>0</use_volume_set_param>
+ <supported_streams>
+ <supported_stream>PAL_STREAM_ULTRA_LOW_LATENCY</supported_stream>
+ <supported_stream>PAL_STREAM_COMPRESSED</supported_stream>
+ </supported_streams>
+ </config_volume>
+ <config_lpm>
+ <use_disable_lpm>1</use_disable_lpm>
+ <lpm_supported_streams>
+ <lpm_supported_stream>PAL_STREAM_LOW_LATENCY</lpm_supported_stream>
+ <lpm_supported_stream>PAL_STREAM_ULTRA_LOW_LATENCY</lpm_supported_stream>
+ </lpm_supported_streams>
+ </config_lpm>
+ <config_gapless key="gapless_supported" value="1"/>
+ <bt_codecs>
+ <codec codec_format="CODEC_TYPE_AAC" codec_type="enc|dec" codec_library="lib_bt_bundle.so" />
+ <codec codec_format="CODEC_TYPE_SBC" codec_type="enc|dec" codec_library="lib_bt_bundle.so" />
+ <codec codec_format="CODEC_TYPE_LDAC" codec_type="enc" codec_library="lib_bt_bundle.so" />
+ <codec codec_format="CODEC_TYPE_APTX" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_HD" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_AD" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_DUAL_MONO" codec_type="enc" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_APTX_AD_SPEECH" codec_type="enc|dec" codec_library="lib_bt_aptx.so" />
+ <codec codec_format="CODEC_TYPE_LC3" codec_type="enc|dec" codec_library="lib_bt_ble.so" />
+ <codec codec_format="CODEC_TYPE_APTX_AD_QLEA" codec_type="enc" codec_library="lib_bt_ble.so" />
+ </bt_codecs>
+ <gain_db_to_level_mapping>
+ <gain_level_map db="-59" level="5"/>
+ <gain_level_map db="-17.4" level="4"/>
+ <gain_level_map db="-13.8" level="3"/>
+ <gain_level_map db="-10.2" level="2"/>
+ <gain_level_map db="0" level="1"/>
+ </gain_db_to_level_mapping>
+ <config_voice>
+ <vsid>0xB3000000</vsid>
+ <loopbackDelay>1000</loopbackDelay>
+ <maxVolIndex>5</maxVolIndex>
+ <mode_map>
+ <modepair key="0x11C05000" value="0xB3000001"/>
+ <modepair key="0x11DC5000" value="0xB3000001"/>
+ <modepair key="0x12006000" value="0xB3000001"/>
+ <modepair key="0x121C6000" value="0xB3000001"/>
+ </mode_map>
+ </config_voice>
+ <sleep_monitor_vote_streams>
+ <low_power_stream_type>PAL_STREAM_VOICE_UI</low_power_stream_type>
+ <low_power_stream_type>PAL_STREAM_ACD</low_power_stream_type>
+ <low_power_stream_type>PAL_STREAM_ULTRASOUND</low_power_stream_type>
+ <low_power_stream_type>PAL_STREAM_SENSOR_PCM_DATA</low_power_stream_type>
+ <avoid_vote_stream_type>PAL_STREAM_CONTEXT_PROXY</avoid_vote_stream_type>
+ </sleep_monitor_vote_streams>
+ <group_device_cfg>
+ <upd_rx>
+ <snd_device name="handset" />
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="1" />
+ </upd_rx>
+ <handset>
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="1" />
+ </handset>
+ <speaker>
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="3" />
+ </speaker>
+ <speaker_voice>
+ <group_dev sample_rate = "0" channels="0" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="1" />
+ </speaker_voice>
+ <upd_rx_handset>
+ <snd_device name="speaker" />
+ <devicepp_mfc sample_rate="96000" channels="2" bit_width="16" />
+ <group_dev sample_rate = "96000" channels="2" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="3" />
+ </upd_rx_handset>
+ <upd_rx_speaker>
+ <snd_device name="speaker" />
+ <devicepp_mfc sample_rate="96000" channels="2" bit_width="16" />
+ <group_dev sample_rate = "96000" channels="2" bit_fmt="PAL_AUDIO_FMT_PCM_S16_LE" slot_mask="3" />
+ </upd_rx_speaker>
+ </group_device_cfg>
+ <!--
+ Usecase Priorities
+ ====================
+
+ Examples of usecases with their corresponding priorities,
+ ranked from 1 (highest priority).
+ 1 for voice
+ 2 for VOIP
+ 3 for playback/recording and (default priority assigned in the streamPriorityLUT map in ResourceManager.cpp)
+ 4 for UPD
+
+ In the event of concurrency on shared backend devices, the stream with the highest priority will determine the final device.
+ Example:
+ ========================================
+ usecase | priority | snd-devicename
+ ========================================
+ VOICE | 1 | voice-handset
+ VOIP | 2 | voip-handset
+ deepbuffer| 3 | speaker-mono
+
+ The final device will be voice-handset.
+ -->
+ <device_profile>
+ <in-device>
+ <id>PAL_DEVICE_IN_HANDSET_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-3</back_end_name>
+ <max_channels>4</max_channels>
+ <channels>1</channels>
+ <samplerate>48000</samplerate>
+ <snd_device_name>handset-mic</snd_device_name>
+ <ec_enable>0</ec_enable>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <priority>2</priority>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <sidetone_mode>HW</sidetone_mode>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ <custom-config key="dual-mic">
+ <channels>2</channels>
+ <snd_device_name>handset-dmic-endfire</snd_device_name>
+ </custom-config>
+ <custom-config key="quad-mic">
+ <channels>4</channels>
+ <snd_device_name>quad-mic</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ <custom-config key="dual-mic">
+ <channels>2</channels>
+ <snd_device_name>handset-dmic-endfire</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_RAW</name>
+ <snd_device_name>handset-mic-unprocessed</snd_device_name>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_HANDSET</id>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_SPEAKER_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-3</back_end_name>
+ <max_channels>4</max_channels>
+ <samplerate>48000</samplerate>
+ <channels>1</channels>
+ <ec_enable>0</ec_enable>
+ <snd_device_name>speaker-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ <custom-config key="unprocessed-hdr-mic-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-portrait</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-landscape">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-landscape</snd_device_name>
+ </custom-config>
+ <custom-config key="unprocessed-hdr-mic-inverted-portrait">
+ <channels>4</channels>
+ <snd_device_name>unprocessed-hdr-mic-inverted-portrait</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <priority>2</priority>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <sidetone_mode>OFF</sidetone_mode>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ <custom-config key="dual-mic">
+ <channels>2</channels>
+ <snd_device_name>speaker-dmic-endfire</snd_device_name>
+ </custom-config>
+ <custom-config key="quad-mic">
+ <channels>4</channels>
+ <snd_device_name>quad-mic</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_LOOPBACK</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_WIRED_HEADSET</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-3</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>headset-mic</snd_device_name>
+ <ec_enable>0</ec_enable>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <sidetone_mode>HW</sidetone_mode>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <priority>1</priority>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADSET</id>
+ <id>PAL_DEVICE_OUT_WIRED_HEADPHONE</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET</id>
+ <back_end_name>SLIM-DEV1-TX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <samplerate>8000</samplerate>
+ <bit_width>16</bit_width>
+ <snd_device_name>bt-sco-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_SCO</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_HANDSET_VA_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_VA-TX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <snd_device_name>va-mic</snd_device_name>
+ <ec_enable>1</ec_enable>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ <id>PAL_DEVICE_OUT_HANDSET</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_A2DP</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_HEADSET_VA_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_VA-TX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>headset-va-mic</snd_device_name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <ec_enable>1</ec_enable>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADSET</id>
+ <id>PAL_DEVICE_OUT_WIRED_HEADPHONE</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_A2DP</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_USB_HEADSET</id>
+ <back_end_name>USB_AUDIO-TX</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <samplerate>48000</samplerate>
+ <ec_enable>0</ec_enable>
+ <snd_device_name>usb-headset-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <!--Uncomment these lines instead of above lines if needing to enable EC per custom key
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="vr-mic">
+ <ec_enable>1</ec_enable>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <sidetone_mode>HW</sidetone_mode>
+ <ec_enable>1</ec_enable>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_USB_HEADSET</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_FM_TUNER</id>
+ <back_end_name>MI2S-LPAIF-TX-SECONDARY</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>play-fm</snd_device_name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_LOOPBACK</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_PROXY</id>
+ <back_end_name>PCM_RT_PROXY-TX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_PROXY</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_VI_FEEDBACK</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-TX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>48000</samplerate>
+ <bit_width>32</bit_width>
+ <snd_device_name>vi-feedback</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <channels>1</channels>
+ <snd_device_name>vi-feedback-mono-2</snd_device_name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_CPS_FEEDBACK</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-TX-2</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>24000</samplerate>
+ <bit_width>32</bit_width>
+ <snd_device_name>cps-feedback</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <channels>1</channels>
+ <snd_device_name>cps-feedback-mono-2</snd_device_name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_BLUETOOTH_A2DP</id>
+ <back_end_name>SLIM-DEV1-TX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-a2dp-mic</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_BLUETOOTH_BLE</id>
+ <back_end_name>SLIM-DEV1-TX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-ble-mic</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_LOW_LATENCY</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_TX</name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRA_LOW_LATENCY</name>
+ </usecase>
+ <ec_rx_device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ </ec_rx_device>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_TELEPHONY_RX</id>
+ <back_end_name>PCM_RT_PROXY-TX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_PROXY</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_ULTRASOUND_MIC</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-TX-4</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <samplerate>96000</samplerate>
+ <bit_width>16</bit_width>
+ <snd_device_name>ultrasound-mic</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_ULTRASOUND</name>
+ </usecase>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_EXT_EC_REF</id>
+ <back_end_name>MI2S-LPAIF-TX-TERTIARY</back_end_name>
+ <snd_device_name>ext_ec_ref_tx</snd_device_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </in-device>
+ <in-device>
+ <id>PAL_DEVICE_IN_ECHO_REF</id>
+ <back_end_name>PCM_DUMMY-TX-0</back_end_name>
+ <snd_device_name>echo-ref-record</snd_device_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <bit_width>16</bit_width>
+ <samplerate>48000</samplerate>
+ <usecase>
+ <name>PAL_STREAM_RAW</name>
+ </usecase>
+ </in-device>
+ <out-device>
+ <id>PAL_DEVICE_NONE</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>none</snd_device_name>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_SPEAKER</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <samplerate>48000</samplerate>
+ <snd_device_name>speaker</snd_device_name>
+ <speaker_protection_enabled>1</speaker_protection_enabled>
+ <fractional_sr>0</fractional_sr>
+ <!-- To enable external EC reference the flag extec_ref_enabled must be added as 1 -->
+ <ext_ec_ref_enabled>0</ext_ec_ref_enabled>
+ <!-- Flag to specify cps mode which is applicable
+ Values: disable CPS: 0
+ CPS streaming: 1
+ ADSP control mode: 2
+ -->
+ <cps_mode>1</cps_mode>
+ <vbat_enabled>1</vbat_enabled>
+ <!--specify the supported bit format on speaker end point -->
+ <!--this should be in the form of pal_audio_fmt_id-->
+ <!--e.g <supported_bit_format >PAL_AUDIO_FMT_PCM_S24_LE</supported_bit_format>-->
+ <!--We support 24 bit for speaker as of now, as some module in ADSP does not support Q31 format-->
+ <!--This can be changed to PAL_AUDIO_FMT_PCM_S32_LE if 32 bit e2e support is required-->
+ <supported_bit_format>PAL_AUDIO_FMT_PCM_S24_LE</supported_bit_format>
+ <!-- RAS should be enabled with speaker protection always -->
+ <ras_enabled>0</ras_enabled>
+ <!-- Flag to specify speaker in case Voice call is switched from
+ handset to speaker with only 1 speaker.
+ Values: Both speaker : 0
+ Right speaker: 1
+ Left speaker : 2
+ -->
+ <speaker_mono_right>0</speaker_mono_right>
+ <!-- Time in seconds for Quick cal. Set 0 to disable -->
+ <quick_cal_time>0</quick_cal_time>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <channels>1</channels>
+ <snd_device_name>speaker-mono-2</snd_device_name>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <channels>1</channels>
+ <snd_device_name>speaker-mono-2</snd_device_name>
+ </usecase>
+ <!--
+ Playback/Recording streams have a default priority of 3
+ (default priority assigned in the streamPriorityLUT map in ResourceManager.cpp).
+ Check the comments above "Usecase Priorities" for details.
+ -->
+ <!--
+ While the UPD runs on a shared backend, whenever a speaker usecase arises,
+ UPD must always switch to the speaker; it can only return to handset when
+ the last speaker usecase terminates.
+ Giving UPD the lowest priority is in line with the understanding of
+ priority settings.
+ -->
+ <usecase>
+ <name>PAL_STREAM_ULTRASOUND</name>
+ <priority>4</priority>
+ <samplerate>96000</samplerate>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HANDSET</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <!-- To enable external EC reference the flag extec_ref_enabled must be added as 1 -->
+ <ext_ec_ref_enabled>0</ext_ec_ref_enabled>
+ <samplerate>48000</samplerate>
+ <fractional_sr>0</fractional_sr>
+ <snd_device_name>handset</snd_device_name>
+ <handset_protection_enabled>0</handset_protection_enabled>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <custom-config key="HAC">
+ <snd_device_name>voice-handset-hac</snd_device_name> <!-- override sound device name with HAC handset -->
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <custom-config key="HAC">
+ <snd_device_name>voice-handset-hac</snd_device_name> <!-- override sound device name with HAC handset for voip -->
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_ULTRASOUND</name>
+ <priority>4</priority>
+ <samplerate>96000</samplerate>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADPHONE</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <fractional_sr>1</fractional_sr>
+ <snd_device_name>headphones</snd_device_name>
+ <!--HIFI Filter Headphones-Uncomment this when param key hifi_filter is true
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_PCM_OFFLOAD</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_WIRED_HEADSET</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-RX-0</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <fractional_sr>1</fractional_sr>
+ <snd_device_name>headphones</snd_device_name>
+ <!--HIFI Filter Headphones-Uncomment this when param key hifi_filter is true
+ <usecase>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_PCM_OFFLOAD</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <custom-config key="hifi-filter_custom_key">
+ <snd_device_name>headphones-hifi-filter</snd_device_name>
+ </custom-config>
+ </usecase>
+ -->
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ <usecase>
+ <name>PAL_STREAM_VOIP_RX</name>
+ <priority>2</priority>
+ <samplerate>48000</samplerate>
+ <bit_width>16</bit_width>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_A2DP</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-a2dp</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-ble</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_BLE_BROADCAST</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-ble</snd_device_name>
+ <samplerate>44100</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_BLUETOOTH_SCO</id>
+ <back_end_name>SLIM-DEV1-RX-7</back_end_name>
+ <max_channels>1</max_channels>
+ <channels>1</channels>
+ <snd_device_name>bt-sco</snd_device_name>
+ <samplerate>8000</samplerate>
+ <bit_width>16</bit_width>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_AUX_DIGITAL</id>
+ <back_end_name>DISPLAY_PORT-RX</back_end_name>
+ <max_channels>32</max_channels>
+ <channels>2</channels>
+ <snd_device_name>display-port</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HDMI</id>
+ <back_end_name>DISPLAY_PORT-RX</back_end_name>
+ <max_channels>32</max_channels>
+ <channels>2</channels>
+ <fractional_sr>1</fractional_sr>
+ <snd_device_name>display-port</snd_device_name>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_USB_DEVICE</id>
+ <back_end_name>USB_AUDIO-RX</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>usb-headphones</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_USB_HEADSET</id>
+ <back_end_name>USB_AUDIO-RX</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>2</channels>
+ <snd_device_name>usb-headphones</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_AUX_DIGITAL_1</id>
+ <back_end_name>DISPLAY_PORT-RX</back_end_name>
+ <max_channels>8</max_channels>
+ <channels>2</channels>
+ <snd_device_name>display-port</snd_device_name>
+ <fractional_sr>1</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_PROXY</id>
+ <back_end_name>PCM_RT_PROXY-RX-1</back_end_name>
+ <max_channels>8</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <fractional_sr>0</fractional_sr>
+ <samplerate>48000</samplerate>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HEARING_AID</id>
+ <back_end_name>PCM_RT_PROXY-RX-1</back_end_name>
+ <max_channels>8</max_channels>
+ <channels>2</channels>
+ <snd_device_name>afe-proxy</snd_device_name>
+ <fractional_sr>0</fractional_sr>
+ <usecase>
+ <name>PAL_STREAM_VOICE_CALL</name>
+ <priority>1</priority>
+ </usecase>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_HAPTICS_DEVICE</id>
+ <back_end_name>CODEC_DMA-LPAIF_RXTX-RX-6</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>haptics-dev</snd_device_name>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_ULTRASOUND</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>ultrasound-handset</snd_device_name>
+ <samplerate>96000</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ <out-device>
+ <id>PAL_DEVICE_OUT_ULTRASOUND_DEDICATED</id>
+ <back_end_name>CODEC_DMA-LPAIF_WSA-RX-1</back_end_name>
+ <max_channels>2</max_channels>
+ <channels>1</channels>
+ <snd_device_name>ultrasound-handset</snd_device_name>
+ <samplerate>96000</samplerate>
+ <bit_width>16</bit_width>
+ </out-device>
+ </device_profile>
+ <in_streams>
+ <in_stream>
+ <name>PAL_STREAM_VOIP_TX</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_DEEP_BUFFER</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_COMPRESSED</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_VOICE_UI</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_ACD</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_PROXY</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_COMPRESSED</disabled_stream>
+ <disabled_stream>PAL_STREAM_ULTRA_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_RAW</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_COMPRESSED</disabled_stream>
+ <disabled_stream>PAL_STREAM_ULTRA_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ <in_stream>
+ <name>PAL_STREAM_SENSOR_PCM_DATA</name>
+ <policies>
+ <ec_ref>
+ <disabled_stream>PAL_STREAM_LOW_LATENCY</disabled_stream>
+ <disabled_stream>PAL_STREAM_GENERIC</disabled_stream>
+ </ec_ref>
+ </policies>
+ </in_stream>
+ </in_streams>
+ <sound_trigger_platform_info>
+ <common_config>
+ <!-- Sound trigger streams common params -->
+ <param lpi_enable="true" />
+ <param support_nlpi_switch="true" />
+ <param support_device_switch="true" />
+ <param enable_debug_dumps="false" />
+ <param concurrent_capture="true" />
+ <param concurrent_voice_call="true" />
+ <param concurrent_voip_call="true" />
+ <param low_latency_bargein_enable="false" />
+ </common_config>
+ <capture_profile_list>
+ <!-- Common Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI_AAD">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_RAW_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_RAW_LPI_AAD">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <!-- ACD Specific Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_LPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <!-- Sensor PCM Data Specific Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFEC">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_FFEC">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <!-- SVA/Hotword Specific Profiles -->
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_NLPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_RAW_NLPI">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_RAW_LPI">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_RAW_LPI_AAD">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_RAW_NLPI">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_FFNS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_FFECNS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-mono" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="DUAL_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="2" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-dmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="TRI_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="3" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-tmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="QUAD_MIC_16KHZ_16BIT_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="4" />
+ <param bit_width="16" />
+ <param snd_name="va-mic-qmic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_NS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic-lpi" />
+ <param ec_ref="false" />
+ </capture_profile>
+ <capture_profile name="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_ECNS">
+ <param sample_rate="16000" />
+ <param channels="1" />
+ <param bit_width="16" />
+ <param snd_name="headset-va-mic" />
+ <param ec_ref="true" />
+ </capture_profile>
+ </capture_profile_list>
+ <acd_platform_info>
+ <config>
+ <param acd_enable="true" />
+ </config>
+ <!-- ACD -->
+ <stream_config>
+ <name>QC_ACD</name>
+ <param vendor_uuid="4e93281b-296e-4d73-9833-2710c3c7c1db" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_LPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_LPI" />
+ <high_performance capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ </operating_modes>
+ <sound_model_info>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_ID_EVENT</name>
+ <bin>event.eai</bin>
+ <uuid>0x0B001007</uuid>
+ <contexts>
+ <context id="0x0800132D" /> <!-- EVENT_ALARM -->
+ <context id="0x0800132E" /> <!-- EVENT_BABYCRYING -->
+ <context id="0x0800132F" /> <!-- EVENT_DOGBARKING -->
+ <context id="0x08001330" /> <!-- EVENT_DOORBELL -->
+ <context id="0x08001331" /> <!-- EVENT_DOOROPENCLOSE -->
+ <context id="0x08001332" /> <!-- EVENT_CRASH -->
+ <context id="0x08001333" /> <!-- EVENT_GLASSBREAKING -->
+ <context id="0x08001334" /> <!-- EVENT_SIREN -->
+ <context id="0x080013CC" /> <!-- EVENT_CARHONK -->
+ <context id="0x080013CD" /> <!-- EVENT_GUNSHOT -->
+ <context id="0x080013CE" /> <!-- EVENT_PHONERING -->
+ <context id="0x080013CF" /> <!-- EVENT_SLEEPAPNEA -->
+ <context id="0x080013D0" /> <!-- EVENT_SNORING -->
+ <context id="0x080013D1" /> <!-- EVENT_CATMEOW -->
+ <context id="0x080013D2" /> <!-- EVENT_DOORKNOCK -->
+ <context id="0x080013D3" /> <!-- EVENT_WATERFLOW -->
+ <context id="0x080013D4" /> <!-- EVENT_FIREALARM -->
+ </contexts>
+ </sound_model>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_ID_SPEECH</name>
+ <bin>speech.eai</bin>
+ <uuid>0x0B001008</uuid>
+ <contexts>
+ <context id="0x08001335" /> <!-- AMBIENCE_SPEECH -->
+ </contexts>
+ </sound_model>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_ID_MUSIC</name>
+ <bin>music.eai</bin>
+ <uuid>0x0B001009</uuid>
+ <contexts>
+ <context id="0x08001336" /> <!-- AMBIENCE_MUSIC -->
+ </contexts>
+ </sound_model>
+ <sound_model>
+ <name>ACD_SOUND_MODEL_AMBIENCE_NOISE_SILENCE</name>
+ <bin></bin> <!-- Following contexts dont have a model, hence empty bin -->
+ <uuid>0xFFFFFFFF</uuid> <!-- Indicates no sound model -->
+ <contexts>
+ <context id="0x08001337" /> <!-- AMBIENCE_NOISY_SPL -->
+ <context id="0x08001338" /> <!-- AMBIENCE_SILENT_SPL -->
+ <context id="0x08001339" /> <!-- AMBIENCE_NOISY_SFLUX -->
+ <context id="0x0800133A" /> <!-- AMBIENCE_SILENT_SFLUX -->
+ </contexts>
+ </sound_model>
+ </sound_model_info>
+ </stream_config>
+ <!-- Sensor PCM Data -->
+ <stream_config>
+ <name>QC_SENSOR_PCM_DATA</name>
+ <param vendor_uuid="c88a2c89-7a55-498c-836f-5d7ec8582990" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_RAW_LPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI" />
+ <low_power_ns capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFNS" />
+ <high_performance capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFEC" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFEC" />
+ <high_performance_ns capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ </operating_modes>
+ </stream_config>
+ </acd_platform_info>
+ <!-- Voice UI -->
+ <vui_platform_info>
+ <config>
+ <!-- Voice UI Params used by apk to indicate the Voice UI version current platform supports -->
+ <param version="0x0103" />
+ <param enable_failure_detection="false" />
+ <param notify_second_stage_failure="false" />
+ <param mmap_enable="true" />
+ <param mmap_buffer_duration="5000" />
+ <!-- 5ms duration of data -->
+ <param mmap_frame_length="5" />
+ <!-- Move this flag to common_config if ACD/Sensor PCM Data support car mode in the future -->
+ <param transit_to_non_lpi_on_charging="false" />
+ </config>
+ <!-- Multiple stream_config tags can be listed, each with unique -->
+ <!-- vendor_uuid. The below tag represents QC Voice UI sound model -->
+ <!-- configuration. ISV must use their own unique vendor_uuid. -->
+ <stream_config>
+ <name>QC_VOICE_UI</name>
+ <param vendor_uuid="68ab2d40-e860-11e3-95ef-0002a5d5c51b" />
+ <param merge_first_stage_sound_models="false" />
+ <!--For now total 3 engines are supported, if more engine instances are needed,-->
+ <!-- do update acdb and usecaseKvManager.xml files by adding more instances -->
+ <param pdk_first_stage_max_engine_count="3"/>
+ <!-- Profile specific data which the algorithm can support -->
+ <param capture_keyword="2000" /> <!-- Default history buffer length -->
+ <param client_capture_read_delay="2000" /> <!-- reserved buffer duration for rt data -->
+ <param pre_roll_duration="500" /> <!-- Default preroll duration -->
+ <!-- durations in us -->
+ <param kw_start_tolerance="360000" />
+ <param kw_end_tolerance="240000" />
+ <param data_before_kw_start="360000" />
+ <param data_after_kw_end="480000" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI" />
+ <high_performance capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ <high_performance_and_charging capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_FFECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_FFECNS" />
+ </operating_modes>
+ <sound_model_info>
+ <first_stage_module_params>
+ <param module_type="GMM" />
+ <param load_sound_model_ids="0xC0000008, 0x0800104C" />
+ <param wakeup_config_ids="0xC0000008, 0x08001049" />
+ <param buffering_config_ids="0xC0000008, 0x08001044" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ <first_stage_module_params>
+ <param module_type="PDK" />
+ <param load_sound_model_ids="0xC0000008, 0x0800124E" />
+ <param unload_sound_model_ids="0xC0000008, 0x08001250" />
+ <param wakeup_config_ids="0xC0000008, 0x08001049" />
+ <param buffering_config_ids="0xC0000008, 0x0800124F" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ <arm_ss_module_params>
+ <!-- Options are "KEYWORD_DETECTION", "USER_VERIFICATION", "CUSTOM_DETECTION" -->
+ <param sm_detection_type= "KEYWORD_DETECTION" />
+ <param sm_id="0x2" />
+ <param module_lib="libcapiv2svacnnvendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ <arm_ss_module_params>
+ <param sm_detection_type= "USER_VERIFICATION" />
+ <param sm_id="0x4" />
+ <param module_lib="libcapiv2uvvendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ <arm_ss_module_params>
+ <param sm_detection_type= "KEYWORD_DETECTION" />
+ <param sm_id="0x8" />
+ <param module_lib="libcapiv2svarnnvendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ <arm_ss_module_params>
+ <param sm_detection_type= "KEYWORD_DETECTION" />
+ <param sm_id="0x40" />
+ <param module_lib="libcapiv2udk7vendor.so" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1" />
+ </arm_ss_module_params>
+ </sound_model_info>
+ </stream_config>
+ <!-- Hotword Voice UI-->
+ <stream_config>
+ <name>HOTWORD_VOICE_UI</name>
+ <param vendor_uuid="7038ddc8-30f2-11e6-b0ac-40a8f03d3f15" />
+ <param get_module_version="false" />
+ <param merge_first_stage_sound_models="false" />
+ <param capture_keyword="2000" />
+ <param client_capture_read_delay="2000" />
+ <param kw_start_tolerance="100" />
+ <param kw_end_tolerance="100" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="SINGLE_MIC_16KHZ_16BIT_RAW_LPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_LPI" />
+ <high_performance capture_profile_handset="DUAL_MIC_16KHZ_16BIT_RAW_NLPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_NLPI" />
+ <high_performance_and_charging capture_profile_handset="DUAL_MIC_16KHZ_16BIT_RAW_NLPI" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_RAW_NLPI" />
+ </operating_modes>
+ <sound_model_info>
+ <first_stage_module_params>
+ <param module_type="HOTWORD" />
+ <param load_sound_model_ids="0xC0000008, 0x0800104C" />
+ <param unload_sound_model_ids="0xC0000008, 0x00012C15" />
+ <param buffering_config_ids="0xC0000008, 0x08001044" />
+ <param version_ids="0xC0000008, 0x18000101" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ </sound_model_info>
+ </stream_config>
+ <!-- CUSTOM Voice UI-->
+ <stream_config>
+ <name>CUSTOM_VOICE_UI</name>
+ <!-- NOTE: Customer need to replace with their own uuid and match with sound model -->
+ <param vendor_uuid="c51c508a-ee1b-11ec-8ea0-0242ac120002" />
+ <param merge_first_stage_sound_models="false" />
+ <!-- Profile specific data which the algorithm can support -->
+ <param capture_keyword="2000" /> <!-- Default history buffer length -->
+ <param client_capture_read_delay="2000" /> <!-- reserved buffer duration for rt data -->
+ <param pre_roll_duration="500" /> <!-- Default preroll duration -->
+ <!-- durations in us -->
+ <param kw_start_tolerance="360000" />
+ <param kw_end_tolerance="240000" />
+ <param data_before_kw_start="360000" />
+ <param data_after_kw_end="480000" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <!-- Module output channels -->
+ <param out_channels="1" />
+ <operating_modes>
+ <low_power capture_profile_handset="DUAL_MIC_16KHZ_16BIT_CUSTOM_NS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_NS" />
+ <high_performance capture_profile_handset="DUAL_MIC_16KHZ_16BIT_CUSTOM_ECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_ECNS" />
+ <high_performance_and_charging capture_profile_handset="DUAL_MIC_16KHZ_16BIT_CUSTOM_ECNS" capture_profile_headset="SINGLE_MIC_16KHZ_16BIT_HEADSET_CUSTOM_ECNS" />
+ </operating_modes>
+ <sound_model_info>
+ <first_stage_module_params>
+ <param module_type="CUSTOM1" />
+ <param load_sound_model_ids="0xC0000008, 0x0800104C" />
+ <param custom_config_ids="0xC0000008, 0x08001049" />
+ <param buffering_config_ids="0xC0000008, 0x08001044" />
+ <param engine_reset_ids="0xC0000008, 0x08001051" />
+ </first_stage_module_params>
+ </sound_model_info>
+ </stream_config>
+ </vui_platform_info>
+ </sound_trigger_platform_info>
+</resource_manager_info>
diff --git a/device/inc/Device.h b/device/inc/Device.h
index c14a16a..6a9fc51 100644
--- a/device/inc/Device.h
+++ b/device/inc/Device.h
@@ -127,6 +127,7 @@
virtual int getCodecConfig(struct pal_media_config *config);
static std::shared_ptr<Device> getObject(pal_device_id_t dev_id);
int updateCustomPayload(void *payload, size_t size);
+ int freeCustomPayload(uint8_t **payload, size_t *payloadSize);
void* getCustomPayload();
size_t getCustomPayloadSize();
virtual int32_t setDeviceParameter(uint32_t param_id, void *param);
diff --git a/device/src/Bluetooth.cpp b/device/src/Bluetooth.cpp
index e295850..06a3329 100644
--- a/device/src/Bluetooth.cpp
+++ b/device/src/Bluetooth.cpp
@@ -1737,6 +1737,9 @@
// session will be restarted after suspend completion
PAL_INFO(LOG_TAG, "a2dp start requested during suspend state");
return -ENOSYS;
+ } else if (a2dpState == A2DP_STATE_DISCONNECTED) {
+ PAL_INFO(LOG_TAG, "a2dp start requested when a2dp source stream is failed to open");
+ return -ENOSYS;
}
if (a2dpState != A2DP_STATE_STARTED && !totalActiveSessionRequests) {
@@ -2291,6 +2294,9 @@
((a2dpState != A2DP_STATE_STARTED) && (param_bt_a2dp.a2dp_suspended == true))) {
param_bt_a2dp.is_force_switch = true;
PAL_DBG(LOG_TAG, "a2dp reconfig or a2dp suspended/a2dpState is not started");
+ } else if (totalActiveSessionRequests == 0) {
+ param_bt_a2dp.is_force_switch = true;
+ PAL_DBG(LOG_TAG, "Force BT device switch for no total active BT sessions");
} else {
param_bt_a2dp.is_force_switch = false;
}
diff --git a/device/src/Device.cpp b/device/src/Device.cpp
index 076a8a5..f09bfb2 100644
--- a/device/src/Device.cpp
+++ b/device/src/Device.cpp
@@ -377,6 +377,16 @@
return status;
}
+int Device::freeCustomPayload(uint8_t **payload, size_t *payloadSize)
+{
+ if (*payload) {
+ free(*payload);
+ *payload = NULL;
+ *payloadSize = 0;
+ }
+ return 0;
+}
+
int Device::updateCustomPayload(void *payload, size_t size)
{
if (!customPayloadSize) {
diff --git a/device/src/SpeakerProtection.cpp b/device/src/SpeakerProtection.cpp
index 30b3c92..3e0fd56 100644
--- a/device/src/SpeakerProtection.cpp
+++ b/device/src/SpeakerProtection.cpp
@@ -2843,7 +2843,7 @@
}
stream = static_cast<Stream *>(activeStreams[0]);
stream->getAssociatedSession(&session);
- for (int ch = numberOfChannels; ch != 0; ch == ch >> CHANNELS_2) {
+ for (int ch = numberOfChannels; ch != 0; ch = ch >> CHANNELS_2) {
if (ch == CHANNELS_4)
tagid = MODULE_SP2;
else {
@@ -2999,7 +2999,7 @@
goto exit;
}
- for (int ch = numberOfChannels; ch != 0; ch == ch >> CHANNELS_2) {
+ for (int ch = numberOfChannels; ch != 0; ch = ch >> CHANNELS_2) {
if (ch == CHANNELS_4)
tagid = MODULE_VI2;
diff --git a/device/src/USBAudio.cpp b/device/src/USBAudio.cpp
index 718ceb6..d15cb93 100644
--- a/device/src/USBAudio.cpp
+++ b/device/src/USBAudio.cpp
@@ -192,7 +192,7 @@
builder->payloadUsbAudioConfig(&payload, &payloadSize, miid, &cfg);
if (payloadSize) {
status = updateCustomPayload(payload, payloadSize);
- delete[] payload;
+ freeCustomPayload(&payload, &payloadSize);
if (0 != status) {
PAL_ERR(LOG_TAG,"updateCustomPayload Failed\n");
goto exit;
@@ -508,13 +508,13 @@
check = true;
while (str_start != NULL) {
- str_start = strstr(str_start, "Altset");
+ str_start = strstr(str_start, "Altset ");
if ((str_start == NULL) || (check && (str_start >= str_end))) {
PAL_VERBOSE(LOG_TAG,"done parsing %s\n", str_start);
break;
}
PAL_VERBOSE(LOG_TAG,"remaining string %s\n", str_start);
- str_start += sizeof("Altset");
+ str_start += sizeof("Altset ");
std::shared_ptr<USBDeviceConfig> usb_device_info(new USBDeviceConfig());
if (!usb_device_info) {
PAL_ERR(LOG_TAG, "error unable to create usb device config object");
@@ -524,7 +524,7 @@
usb_device_info->setType(type);
/* Bit bit_width parsing */
bit_width_start = strstr(str_start, "Format: ");
- if (bit_width_start == NULL) {
+ if (bit_width_start == NULL || (check && (bit_width_start >= str_end))) {
PAL_INFO(LOG_TAG, "Could not find bit_width string");
continue;
}
@@ -558,7 +558,7 @@
/* channels parsing */
channel_start = strstr(str_start, CHANNEL_NUMBER_STR);
- if (channel_start == NULL) {
+ if (channel_start == NULL || (check && (channel_start >= str_end))) {
PAL_INFO(LOG_TAG, "could not find Channels string");
continue;
}
@@ -567,7 +567,7 @@
/* Sample rates parsing */
rates_str_start = strstr(str_start, "Rates: ");
- if (rates_str_start == NULL) {
+ if (rates_str_start == NULL || (check && (rates_str_start >= str_end))) {
PAL_INFO(LOG_TAG, "cant find rates string");
continue;
}
@@ -884,7 +884,6 @@
if (!profile_list_ch.empty()) {
/*3. get best Sample Rate */
- int target_sample_rate = media_config.sample_rate;
if (uhqa && is_playback) {
for (auto ch_iter = profile_list_ch.begin(); ch_iter!= profile_list_ch.end(); ++ch_iter) {
if ((*ch_iter)->isRateSupported(SAMPLINGRATE_192K)) {
diff --git a/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp b/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
index 894da97..b0bf840 100644
--- a/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
+++ b/ipc/HwBinders/pal_ipc_client/src/pal_client_wrapper.cpp
@@ -351,12 +351,11 @@
if (pal_client == nullptr)
return ret;
- hidl_vec<PalStreamAttributes> attr_hidl;
+ hidl_vec<PalStreamAttributes> attr_hidl(1);
hidl_vec<PalDevice> devs_hidl;
hidl_vec<ModifierKV> modskv_hidl;
uint16_t in_channels = 0;
uint16_t out_channels = 0;
- uint32_t dev_size = 0;
int cnt = 0;
uint8_t *temp = NULL;
struct pal_stream_info info = attr->info.opt_stream_info;
@@ -367,8 +366,6 @@
info.version, info.size, info.duration_us, info.has_video, info.is_streaming,
info.loopback_type);
- attr_hidl.resize(sizeof(::vendor::qti::hardware::pal::V1_0::PalStreamAttributes) + in_channels +
- out_channels);
attr_hidl.data()->type = (PalStreamType)attr->type;
attr_hidl.data()->info.version = info.version;
attr_hidl.data()->info.size = info.size;
@@ -382,7 +379,8 @@
if (in_channels) {
attr_hidl.data()->in_media_config.ch_info.channels = attr->in_media_config.ch_info.channels;
- attr_hidl.data()->in_media_config.ch_info.ch_map = attr->in_media_config.ch_info.ch_map;
+ memcpy(&attr_hidl.data()->in_media_config.ch_info.ch_map, &attr->in_media_config.ch_info.ch_map,
+ sizeof(uint8_t[64]));
}
attr_hidl.data()->in_media_config.aud_fmt_id = (PalAudioFmt)attr->in_media_config.aud_fmt_id;
@@ -394,26 +392,28 @@
attr_hidl.data()->out_media_config.bit_width = attr->out_media_config.bit_width;
if (out_channels) {
attr_hidl.data()->out_media_config.ch_info.channels = attr->out_media_config.ch_info.channels;
- attr_hidl.data()->out_media_config.ch_info.ch_map = attr->out_media_config.ch_info.ch_map;
+ memcpy(&attr_hidl.data()->out_media_config.ch_info.ch_map, &attr->out_media_config.ch_info.ch_map,
+ sizeof(uint8_t[64]));
}
attr_hidl.data()->out_media_config.aud_fmt_id = (PalAudioFmt)attr->out_media_config.aud_fmt_id;
if (devices) {
- dev_size = no_of_devices * sizeof(struct pal_device);
- devs_hidl.resize(dev_size);
- PalDevice *dev_hidl = devs_hidl.data();
+ devs_hidl.resize(no_of_devices);
for ( cnt = 0; cnt < no_of_devices; cnt++) {
- dev_hidl->id =(PalDeviceId)devices[cnt].id;
- dev_hidl->config.sample_rate = devices[cnt].config.sample_rate;
- dev_hidl->config.bit_width = devices[cnt].config.bit_width;
- dev_hidl->config.ch_info.channels = devices[cnt].config.ch_info.channels;
- dev_hidl->config.ch_info.ch_map = devices[cnt].config.ch_info.ch_map;
- dev_hidl->config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
- dev_hidl = (PalDevice *)(devs_hidl.data() + sizeof(PalDevice));
+ devs_hidl[cnt].id =(PalDeviceId)devices[cnt].id;
+ devs_hidl[cnt].config.sample_rate = devices[cnt].config.sample_rate;
+ devs_hidl[cnt].config.bit_width = devices[cnt].config.bit_width;
+ devs_hidl[cnt].config.ch_info.channels = devices[cnt].config.ch_info.channels;
+ memcpy(&devs_hidl[cnt].config.ch_info.ch_map, &devices[cnt].config.ch_info.ch_map,
+ sizeof(uint8_t [64]));
+ devs_hidl[cnt].config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
}
}
if (modifiers) {
- modskv_hidl.resize(sizeof(struct modifier_kv) * no_of_modifiers);
- memcpy(modskv_hidl.data(), modifiers, sizeof(struct modifier_kv) * no_of_modifiers);
+ modskv_hidl.resize(no_of_modifiers);
+ for ( cnt = 0; cnt < no_of_modifiers; cnt++) {
+ modskv_hidl[cnt].key = modifiers[cnt].key;
+ modskv_hidl[cnt].value = modifiers[cnt].value;
+ }
}
pal_client->ipc_pal_stream_open(attr_hidl, no_of_devices, devs_hidl, no_of_modifiers,
modskv_hidl, ClbkBinder, cookie,
@@ -713,8 +713,7 @@
if (pal_client == nullptr)
return ret;
- hidl_vec<PalParamPayload> paramPayload;
- paramPayload.resize(sizeof(PalParamPayload));
+ hidl_vec<PalParamPayload> paramPayload(1);
paramPayload.data()->payload.resize(param_payload->payload_size);
paramPayload.data()->size = param_payload->payload_size;
memcpy(paramPayload.data()->payload.data(), param_payload->payload,
@@ -778,7 +777,6 @@
{
hidl_vec<PalDevice> devs_hidl;
int32_t cnt = 0;
- uint32_t dev_size = 0;
int32_t ret = -EINVAL;
if (!pal_server_died) {
@@ -789,18 +787,16 @@
if (devices) {
- dev_size = no_of_devices * sizeof(struct pal_device);
- ALOGD("dev_size %d", dev_size);
- devs_hidl.resize(dev_size);
- PalDevice *dev_hidl = devs_hidl.data();
+ ALOGD("no_of_devices %d", no_of_devices);
+ devs_hidl.resize(no_of_devices);
for (cnt = 0; cnt < no_of_devices; cnt++) {
- dev_hidl->id =(PalDeviceId)devices[cnt].id;
- dev_hidl->config.sample_rate = devices[cnt].config.sample_rate;
- dev_hidl->config.bit_width = devices[cnt].config.bit_width;
- dev_hidl->config.ch_info.channels = devices[cnt].config.ch_info.channels;
- dev_hidl->config.ch_info.ch_map = devices[cnt].config.ch_info.ch_map;
- dev_hidl->config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
- dev_hidl = (PalDevice *)(devs_hidl.data() + sizeof(PalDevice));
+ devs_hidl[cnt].id =(PalDeviceId)devices[cnt].id;
+ devs_hidl[cnt].config.sample_rate = devices[cnt].config.sample_rate;
+ devs_hidl[cnt].config.bit_width = devices[cnt].config.bit_width;
+ devs_hidl[cnt].config.ch_info.channels = devices[cnt].config.ch_info.channels;
+ memcpy(&devs_hidl[cnt].config.ch_info.ch_map, &devices[cnt].config.ch_info.ch_map,
+ sizeof(uint8_t [64]));
+ devs_hidl[cnt].config.aud_fmt_id = (PalAudioFmt)devices[cnt].config.aud_fmt_id;
}
ret = pal_client->ipc_pal_stream_set_device((PalStreamHandle)stream_handle,
no_of_devices, devs_hidl);
@@ -820,7 +816,7 @@
int32_t pal_stream_set_volume(pal_stream_handle_t *stream_handle,
struct pal_volume_data *volume)
{
- hidl_vec<PalVolumeData> vol;
+ hidl_vec<PalVolumeData> vol(1);
int32_t ret = -EINVAL;
if (volume == NULL) {
ALOGE("Invalid volume");
@@ -833,8 +829,6 @@
return ret;
uint32_t noOfVolPair = volume->no_of_volpair;
- uint32_t volSize = sizeof(PalVolumeData);
- vol.resize(volSize);
vol.data()->volPair.resize(sizeof(PalChannelVolKv) * noOfVolPair);
vol.data()->noOfVolPairs = noOfVolPair;
memcpy(vol.data()->volPair.data(), volume->volume_pair,
diff --git a/ipc/HwBinders/pal_ipc_server/inc/pal_server_wrapper.h b/ipc/HwBinders/pal_ipc_server/inc/pal_server_wrapper.h
index bf73018..ecab955 100644
--- a/ipc/HwBinders/pal_ipc_server/inc/pal_server_wrapper.h
+++ b/ipc/HwBinders/pal_ipc_server/inc/pal_server_wrapper.h
@@ -27,7 +27,7 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Changes from Qualcomm Innovation Center are provided under the following license:
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022,2024 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
@@ -129,6 +129,7 @@
struct PAL : public IPAL /*, public android::hardware::hidl_death_recipient*/{
public:
+ std::mutex mClientLock;
PAL()
{
sInstance = this;
@@ -220,6 +221,7 @@
static PAL* sInstance;
int find_dup_fd_from_input_fd(const uint64_t streamHandle, int input_fd, int *dup_fd);
void add_input_and_dup_fd(const uint64_t streamHandle, int input_fd, int dup_fd);
+ bool isValidstreamHandle(const uint64_t streamHandle);
};
class PalClientDeathRecipient : public android::hardware::hidl_death_recipient
diff --git a/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp b/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
index 1896d31..276aa01 100644
--- a/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
+++ b/ipc/HwBinders/pal_ipc_server/src/pal_server_wrapper.cpp
@@ -27,7 +27,7 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Changes from Qualcomm Innovation Center are provided under the following license:
- * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
@@ -101,6 +101,7 @@
std::lock_guard<std::mutex> guard(mLock);
ALOGD("%s : client died pid : %d", __func__, cookie);
int pid = (int) cookie;
+ std::lock_guard<std::mutex> lock(mPalInstance->mClientLock);
auto &clients = mPalInstance->mPalClients;
for (auto itr = clients.begin(); itr != clients.end(); itr++) {
auto client = *itr;
@@ -132,6 +133,7 @@
void PAL::add_input_and_dup_fd(const uint64_t streamHandle, int input_fd, int dup_fd)
{
std::vector<std::pair<int, int>>::iterator it;
+ std::lock_guard<std::mutex> guard(mClientLock);
for (auto& s: mPalClients) {
std::lock_guard<std::mutex> lock(s->mActiveSessionsLock);
for (int i = 0; i < s->mActiveSessions.size(); i++) {
@@ -244,6 +246,7 @@
ALOGE("%s: No PAL instance running", __func__);
return false;
}
+ std::lock_guard<std::mutex> guard(PAL::getInstance()->mClientLock);
for (auto& s: PAL::getInstance()->mPalClients) {
std::lock_guard<std::mutex> lock(s->mActiveSessionsLock);
for (int idx = 0; idx < s->mActiveSessions.size(); idx++) {
@@ -277,6 +280,7 @@
* Find the original fd that was passed by client based on what
* input and dup fd list and send that back.
*/
+ PAL::getInstance()->mClientLock.lock();
for (auto& s: PAL::getInstance()->mPalClients) {
std::lock_guard<std::mutex> lock(s->mActiveSessionsLock);
for (int idx = 0; idx < s->mActiveSessions.size(); idx++) {
@@ -300,6 +304,7 @@
}
}
}
+ PAL::getInstance()->mClientLock.unlock();
rwDonePayloadHidl.resize(sizeof(pal_callback_buffer));
rwDonePayload = (PalCallbackBuffer *)rwDonePayloadHidl.data();
@@ -445,6 +450,32 @@
print_media_config(&attr->out_media_config);
}
+bool PAL::isValidstreamHandle(const uint64_t streamHandle) {
+ int pid = ::android::hardware::IPCThreadState::self()->getCallingPid();
+
+ std::lock_guard<std::mutex> guard(mClientLock);
+ for (auto itr = mPalClients.begin(); itr != mPalClients.end(); ) {
+ auto client = *itr;
+ if (client->pid == pid) {
+ std::lock_guard<std::mutex> lock(client->mActiveSessionsLock);
+ auto sItr = client->mActiveSessions.begin();
+ for (; sItr != client->mActiveSessions.end(); sItr++) {
+ if (sItr->session_handle == streamHandle) {
+ return true;
+ }
+ }
+ ALOGE("%s: streamHandle: %pK for pid %d not found",
+ __func__, streamHandle, pid);
+ return false;
+ }
+ itr++;
+ }
+
+ ALOGE("%s: client info for pid %d not found",
+ __func__, pid);
+ return false;
+}
+
Return<void> PAL::ipc_pal_stream_open(const hidl_vec<PalStreamAttributes>& attr_hidl,
uint32_t noOfDevices,
const hidl_vec<PalDevice>& devs_hidl,
@@ -510,24 +541,22 @@
}
if (devs_hidl.size()) {
- PalDevice *dev_hidl = NULL;
devices = (struct pal_device *)calloc (1,
sizeof(struct pal_device) * noOfDevices);
if (!devices) {
ALOGE("Not enough memory for devices");
goto exit;
}
- dev_hidl = (PalDevice *)devs_hidl.data();
+
for ( cnt = 0; cnt < noOfDevices; cnt++) {
- devices[cnt].id = (pal_device_id_t)dev_hidl->id;
- devices[cnt].config.sample_rate = dev_hidl->config.sample_rate;
- devices[cnt].config.bit_width = dev_hidl->config.bit_width;
- devices[cnt].config.ch_info.channels = dev_hidl->config.ch_info.channels;
- memcpy(&devices[cnt].config.ch_info.ch_map, &dev_hidl->config.ch_info.ch_map,
+ devices[cnt].id = (pal_device_id_t)devs_hidl[cnt].id;
+ devices[cnt].config.sample_rate = devs_hidl[cnt].config.sample_rate;
+ devices[cnt].config.bit_width = devs_hidl[cnt].config.bit_width;
+ devices[cnt].config.ch_info.channels = devs_hidl[cnt].config.ch_info.channels;
+ memcpy(&devices[cnt].config.ch_info.ch_map, &devs_hidl[cnt].config.ch_info.ch_map,
sizeof(uint8_t [64]));
devices[cnt].config.aud_fmt_id =
- (pal_audio_fmt_t)dev_hidl->config.aud_fmt_id;
- dev_hidl = (PalDevice *)(dev_hidl + sizeof(PalDevice));
+ (pal_audio_fmt_t)devs_hidl[cnt].config.aud_fmt_id;
}
}
@@ -548,6 +577,7 @@
callback, (uint64_t)sr_clbk_data.get(), &stream_handle);
if (!ret) {
+ std::lock_guard<std::mutex> guard(mClientLock);
for(auto& client: mPalClients) {
if (client->pid == pid) {
/*Another session from the same client*/
@@ -603,8 +633,13 @@
Return<int32_t> PAL::ipc_pal_stream_close(const uint64_t streamHandle)
{
int pid = ::android::hardware::IPCThreadState::self()->getCallingPid();
- Return<int32_t> status = pal_stream_close((pal_stream_handle_t *)streamHandle);
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
+ mClientLock.lock();
for (auto itr = mPalClients.begin(); itr != mPalClients.end(); ) {
auto client = *itr;
if (client->pid == pid) {
@@ -637,38 +672,77 @@
break;
}
}
+ mClientLock.unlock();
+
+ Return<int32_t> status = pal_stream_close((pal_stream_handle_t *)streamHandle);
+
return status;
}
Return<int32_t> PAL::ipc_pal_stream_start(const uint64_t streamHandle) {
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
return pal_stream_start((pal_stream_handle_t *)streamHandle);
}
Return<int32_t> PAL::ipc_pal_stream_stop(const uint64_t streamHandle) {
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_stream_stop((pal_stream_handle_t *)streamHandle);
}
Return<int32_t> PAL::ipc_pal_stream_pause(const uint64_t streamHandle) {
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_stream_pause((pal_stream_handle_t *)streamHandle);
}
Return<int32_t> PAL::ipc_pal_stream_drain(uint64_t streamHandle, PalDrainType type)
{
pal_drain_type_t drain_type = (pal_drain_type_t) type;
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_stream_drain((pal_stream_handle_t *)streamHandle,
drain_type);
}
Return<int32_t> PAL::ipc_pal_stream_flush(const uint64_t streamHandle) {
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_stream_flush((pal_stream_handle_t *)streamHandle);
}
Return<int32_t> PAL::ipc_pal_stream_suspend(const uint64_t streamHandle) {
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_stream_suspend((pal_stream_handle_t *)streamHandle);
}
Return<int32_t> PAL::ipc_pal_stream_resume(const uint64_t streamHandle) {
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_stream_resume((pal_stream_handle_t *)streamHandle);
}
@@ -681,6 +755,11 @@
pal_buffer_config_t out_buf_cfg, in_buf_cfg;
PalBufferConfig in_buff_config_ret, out_buff_config_ret;
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return Void();
+ }
+
in_buf_cfg.buf_count = in_buff_config.buf_count;
in_buf_cfg.buf_size = in_buff_config.buf_size;
if (in_buff_config.max_metadata_size) {
@@ -733,6 +812,11 @@
const hidl_vec<PalBuffer>& buff_hidl) {
struct pal_buffer buf = {0};
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
buf.size = buff_hidl.data()->size;
std::vector<uint8_t> dataBuffer;
if (buff_hidl.data()->buffer.size() == buf.size) {
@@ -751,6 +835,7 @@
std::vector<uint8_t> bufMetadata(buf.metadata_size, 0);
buf.metadata = bufMetadata.data();
auto stream_media_config = std::make_shared<pal_media_config>();
+ mClientLock.lock();
for (auto& s: PAL::getInstance()->mPalClients) {
std::lock_guard<std::mutex> lock(s->mActiveSessionsLock);
for (auto session : s->mActiveSessions) {
@@ -761,6 +846,7 @@
}
}
}
+ mClientLock.unlock();
auto metadataParser = std::make_unique<MetadataParser>();
metadataParser->fillMetaData(buf.metadata, buf.frame_index, buf.size,
stream_media_config.get());
@@ -789,6 +875,11 @@
struct pal_buffer buf = {0};
hidl_vec<PalBuffer> outBuff_hidl;
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return Void();
+ }
+
buf.size = inBuff_hidl.data()->size;
std::vector<uint8_t> dataBuffer(buf.size, 0);
buf.buffer = dataBuffer.data();
@@ -825,6 +916,20 @@
{
int32_t ret = 0;
pal_param_payload *param_payload;
+ if (1 != paramPayload.size()) {
+ ALOGE("Invalid vector size");
+ return -EINVAL;
+ }
+ if (paramPayload.data()->size > paramPayload.data()->payload.size()) {
+ ALOGE("Invalid payload size");
+ return -EINVAL;
+ }
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
param_payload = (pal_param_payload *)calloc (1,
sizeof(pal_param_payload) + paramPayload.data()->size);
if (!param_payload) {
@@ -846,6 +951,12 @@
int32_t ret = 0;
pal_param_payload *param_payload;
hidl_vec<PalParamPayload> paramPayload;
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return Void();
+ }
+
ret = pal_stream_get_param((pal_stream_handle_t *)streamHandle, paramId, ¶m_payload);
if (ret == 0) {
paramPayload.resize(sizeof(PalParamPayload));
@@ -873,25 +984,34 @@
struct pal_device *devices = NULL;
int cnt = 0;
int32_t ret = -ENOMEM;
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
+ if (noOfDevices > devs_hidl.size()) {
+ ALOGE("Invalid noOfDevices");
+ return -EINVAL;
+ }
+
if (devs_hidl.size()) {
- PalDevice *dev_hidl = NULL;
devices = (struct pal_device *)calloc (1,
sizeof(struct pal_device) * noOfDevices);
if (!devices) {
ALOGE("Not enough memory for devices");
goto exit;
}
- dev_hidl = (PalDevice *)devs_hidl.data();
+
for (cnt = 0; cnt < noOfDevices; cnt++) {
- devices[cnt].id = (pal_device_id_t)dev_hidl->id;
- devices[cnt].config.sample_rate = dev_hidl->config.sample_rate;
- devices[cnt].config.bit_width = dev_hidl->config.bit_width;
- devices[cnt].config.ch_info.channels = dev_hidl->config.ch_info.channels;
- memcpy(&devices[cnt].config.ch_info.ch_map, &dev_hidl->config.ch_info.ch_map,
+ devices[cnt].id = (pal_device_id_t)devs_hidl[cnt].id;
+ devices[cnt].config.sample_rate = devs_hidl[cnt].config.sample_rate;
+ devices[cnt].config.bit_width = devs_hidl[cnt].config.bit_width;
+ devices[cnt].config.ch_info.channels = devs_hidl[cnt].config.ch_info.channels;
+ memcpy(&devices[cnt].config.ch_info.ch_map, &devs_hidl[cnt].config.ch_info.ch_map,
sizeof(uint8_t [64]));
devices[cnt].config.aud_fmt_id =
- (pal_audio_fmt_t)dev_hidl->config.aud_fmt_id;
- dev_hidl = (PalDevice *)(dev_hidl + sizeof(PalDevice));
+ (pal_audio_fmt_t)devs_hidl[cnt].config.aud_fmt_id;
}
}
@@ -915,6 +1035,20 @@
struct pal_volume_data *volume = nullptr;
uint32_t noOfVolPairs = vol.data()->noOfVolPairs;
int32_t ret = -ENOMEM;
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
+ if (1 != vol.size()) {
+ ALOGE("Invalid vol pairs");
+ return -EINVAL;
+ }
+ if (noOfVolPairs > vol.data()->volPair.size()) {
+ ALOGE("Invalid vol vector size");
+ return -EINVAL;
+ }
volume = (struct pal_volume_data *) calloc(1,
sizeof(struct pal_volume_data) +
noOfVolPairs * sizeof(pal_channel_vol_kv));
@@ -947,6 +1081,11 @@
Return<int32_t> PAL::ipc_pal_stream_set_mute(const uint64_t streamHandle,
bool state)
{
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_stream_set_mute((pal_stream_handle_t *)streamHandle, state);
}
@@ -965,6 +1104,12 @@
{
struct pal_session_time stime;
int32_t ret = 0;
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return Void();
+ }
+
hidl_vec<PalSessionTime> sessTime_hidl;
sessTime_hidl.resize(sizeof(struct pal_session_time));
ret = pal_get_timestamp((pal_stream_handle_t *)streamHandle, &stime);
@@ -977,6 +1122,11 @@
const PalAudioEffect effect,
bool enable)
{
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return -EINVAL;
+ }
+
return pal_add_remove_effect((pal_stream_handle_t *)streamHandle,
(pal_audio_effect_t) effect, enable);
}
@@ -1036,6 +1186,12 @@
int32_t ret = 0;
struct pal_mmap_buffer info;
hidl_vec<PalMmapBuffer> mMapBuffer_hidl;
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return Void();
+ }
+
mMapBuffer_hidl.resize(sizeof(struct pal_mmap_buffer));
ret = pal_stream_create_mmap_buffer((pal_stream_handle_t *)streamHandle, min_size_frames, &info);
mMapBuffer_hidl.data()->buffer = (uint64_t)info.buffer;
@@ -1053,6 +1209,12 @@
int32_t ret = 0;
struct pal_mmap_position mmap_position;
hidl_vec<PalMmapPosition> mmap_position_hidl;
+
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return Void();
+ }
+
mmap_position_hidl.resize(sizeof(struct pal_mmap_position));
ret = pal_stream_get_mmap_position((pal_stream_handle_t *)streamHandle, &mmap_position);
memcpy(mmap_position_hidl.data(), &mmap_position, sizeof(struct pal_mmap_position));
@@ -1082,6 +1244,11 @@
size_t sz = size;
hidl_vec<uint8_t> payloadRet;
+ if (!isValidstreamHandle(streamHandle)) {
+ ALOGE("%s: Invalid streamHandle: %pK", __func__, streamHandle);
+ return Void();
+ }
+
if (size > 0) {
payload = (uint8_t *)calloc(1, size);
if (!payload) {
diff --git a/resource_manager/inc/ResourceManager.h b/resource_manager/inc/ResourceManager.h
index f5fcfda..39598c4 100644
--- a/resource_manager/inc/ResourceManager.h
+++ b/resource_manager/inc/ResourceManager.h
@@ -45,6 +45,7 @@
#include "PalCommon.h"
#include <array>
#include <map>
+#include <set>
#include <expat.h>
#include <stdio.h>
#include <queue>
@@ -812,6 +813,13 @@
std::vector<std::pair<int32_t, std::string>> &txBackEndNames) const;
bool updateDeviceConfig(std::shared_ptr<Device> *inDev,
struct pal_device *inDevAttr, const pal_stream_attributes* inStrAttr);
+ int findActiveStreamsNotInDisconnectList(
+ std::vector <std::tuple<Stream *, uint32_t>> &streamDevDisconnectList,
+ std::vector <std::tuple<Stream *, uint32_t>> &streamsSkippingSwitch);
+ int restoreDeviceConfigForUPD(
+ std::vector <std::tuple<Stream *, uint32_t>> &streamDevDisconnect,
+ std::vector <std::tuple<Stream *, struct pal_device *>> &StreamDevConnect,
+ std::vector <std::tuple<Stream *, uint32_t>> &streamsSkippingSwitch);
int32_t forceDeviceSwitch(std::shared_ptr<Device> inDev, struct pal_device *newDevAttr);
int32_t forceDeviceSwitch(std::shared_ptr<Device> inDev, struct pal_device *newDevAttr,
std::vector <Stream *> prevActiveStreams);
@@ -920,6 +928,7 @@
static bool isLpiLoggingEnabled();
static void processConfigParams(const XML_Char **attr);
static bool isValidDevId(int deviceId);
+ static bool isValidStreamId(int streamId);
static bool isOutputDevId(int deviceId);
static bool isInputDevId(int deviceId);
static bool matchDevDir(int devId1, int devId2);
@@ -930,6 +939,7 @@
bool isDeviceAvailable(pal_device_id_t id);
bool isDeviceAvailable(std::vector<std::shared_ptr<Device>> devices, pal_device_id_t id);
bool isDeviceAvailable(struct pal_device *devices, uint32_t devCount, pal_device_id_t id);
+ bool isDisconnectedDeviceStillActive(std::set<pal_device_id_t> &curPalDevices, std::set<pal_device_id_t> &activeDevices, pal_device_id_t id);
bool isDeviceReady(pal_device_id_t id);
static bool isBtScoDevice(pal_device_id_t id);
static bool isBtDevice(pal_device_id_t id);
@@ -999,6 +1009,7 @@
struct pal_device *streamDevAttr);
static void sendCrashSignal(int signal, pid_t pid, uid_t uid);
void checkAndSetDutyCycleParam();
+ bool isValidDeviceSwitchForStream(Stream *s, pal_device_id_t newDeviceId);
};
#endif
diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp
index 374d1ff..dbebbe9 100644
--- a/resource_manager/src/ResourceManager.cpp
+++ b/resource_manager/src/ResourceManager.cpp
@@ -3385,6 +3385,7 @@
}
deregisterstream(s, mActiveStreams);
+
mActiveStreamMutex.unlock();
exit:
PAL_DBG(LOG_TAG, "Exit. ret %d", ret);
@@ -7137,6 +7138,252 @@
PAL_DBG(LOG_TAG, "getBackEndNames (TX): %s", txBackEndNames[i].second.c_str());
}
+bool ResourceManager::isValidDeviceSwitchForStream(Stream *s, pal_device_id_t newDeviceId)
+{
+ struct pal_stream_attributes sAttr;
+ int status;
+ bool ret = true;
+
+ if (s == NULL || !isValidDevId(newDeviceId)) {
+ PAL_ERR(LOG_TAG, "Invalid input\n");
+ return false;
+ }
+
+ status = s->getStreamAttributes(&sAttr);
+ if (status) {
+ PAL_ERR(LOG_TAG,"getStreamAttributes Failed \n");
+ return false;
+ }
+
+ switch (sAttr.type) {
+ case PAL_STREAM_ULTRASOUND:
+ switch (newDeviceId) {
+ case PAL_DEVICE_OUT_HANDSET:
+ case PAL_DEVICE_OUT_SPEAKER:
+ ret = true;
+ /*
+ * if upd shares BE with handset, while handset doesn't
+ * share BE with speaker, then during device switch
+ * between handset and speaker, upd should still stay
+ * on handset
+ */
+ if (listAllBackEndIds[PAL_DEVICE_OUT_HANDSET].second !=
+ listAllBackEndIds[PAL_DEVICE_OUT_SPEAKER].second)
+ ret = false;
+ break;
+ default:
+ ret = false;
+ break;
+ }
+ break;
+ default:
+ if (!isValidStreamId(sAttr.type)) {
+ PAL_DBG(LOG_TAG, "Invalid stream type\n");
+ return false;
+ }
+ ret = true;
+ break;
+ }
+
+ if (!ret) {
+ PAL_DBG(LOG_TAG, "Skip switching stream %d (%s) to device %d (%s)\n",
+ sAttr.type, streamNameLUT.at(sAttr.type).c_str(),
+ newDeviceId, deviceNameLUT.at(newDeviceId).c_str());
+ }
+
+ return ret;
+}
+
+/*
+ * Due to compatibility challenges, some streams may not switch to the new device
+ * during device switching.
+ * Example: In the shared backend configuration, the UPD stream prevents switching
+ * to devices other than the handset or speaker.
+ * In this function, we compare the list of streams in streamDevDisconnectList
+ * to the streams that are currently active on that device.
+ * The streamsSkippingSwitch list consists of any stream that is present in the
+ * active streams list but missing from the list of disconnecting streams.
+ */
+int ResourceManager::findActiveStreamsNotInDisconnectList(
+ std::vector <std::tuple<Stream *, uint32_t>> &streamDevDisconnectList,
+ std::vector <std::tuple<Stream *, uint32_t>> &streamsSkippingSwitch)
+{
+ std::set<Stream *> disconnectingStreams;
+ std::vector <std::tuple<Stream *, uint32_t>>::iterator iter;
+ std::shared_ptr<Device> devObj = nullptr;
+ struct pal_device dAttr;
+ std::vector<Stream*> activeStreams;
+ std::vector<Stream*>::iterator sIter;
+ int ret = 0;
+
+ if (streamDevDisconnectList.size() == 0) {
+ PAL_DBG(LOG_TAG, "Empty stream disconnect list");
+ return ret;
+ }
+
+ /*
+ * To facilitate comparisons against the list of active streams simpler,
+ * construct a set of streams that are disconnecting from streamDevDisconnectList
+ */
+ for (iter = streamDevDisconnectList.begin();
+ iter != streamDevDisconnectList.end(); iter++) {
+ disconnectingStreams.insert(std::get<0>(*iter));
+ }
+
+ /*
+ * Instance of a device object from which the active stream list is retrieved.
+ * It's the same device from which streams in 'disconnectingStreams' are
+ * disconnecting.
+ */
+ dAttr.id = (pal_device_id_t)std::get<1>(streamDevDisconnectList[0]);
+ devObj = Device::getInstance(&dAttr, rm);
+ if (devObj == nullptr) {
+ PAL_DBG(LOG_TAG, "Error getting device ( %s ) instance",
+ deviceNameLUT.at(dAttr.id).c_str());
+ return ret;
+ }
+
+ mActiveStreamMutex.lock();
+
+ ret = rm->getActiveStream_l(activeStreams, devObj);
+ if (ret)
+ goto done;
+
+ PAL_DBG(LOG_TAG, "activeStreams size = %d, device: %s", activeStreams.size(),
+ deviceNameLUT.at((pal_device_id_t)devObj->getSndDeviceId()).c_str());
+
+ for (sIter = activeStreams.begin(); sIter != activeStreams.end(); sIter++) {
+ if (disconnectingStreams.find(*sIter) != disconnectingStreams.end())
+ continue;
+
+ /*
+ * Stream that is present in the active streams list but not in the list
+ * of disconnecting streams, contribute to the streamsSkippingSwitch list.
+ */
+ streamsSkippingSwitch.push_back({(*sIter), dAttr.id});
+ }
+
+done:
+ mActiveStreamMutex.unlock();
+ return ret;
+}
+
+/*
+ * For shared backend setup, it's crucial to restore the correct device configuration
+ * for the UPD stream.
+ *
+ * Example 1: As music is being played on the speaker, the UPD stream begins (on
+ * the speaker). The Music stream switches to the new device when a wired headset
+ * or a BT device is connected. In this scenario, the UPD stream will be the only
+ * active stream on Speaker device. Thus, we must ensure to switch it from Speaker
+ * (NLPI) to Handset(LPI).
+ *
+ * Example 2: During a voice call concurrency with the UPD stream, when a wired
+ * headset or a BT device is connected, The voice call stream switches to the new
+ * device and the UPD continues to run on the handset device. In this case, we
+ * configure the handset device to make it compatible to UPD only stream.
+ */
+int ResourceManager::restoreDeviceConfigForUPD(
+ std::vector <std::tuple<Stream *, uint32_t>> &streamDevDisconnect,
+ std::vector <std::tuple<Stream *, struct pal_device *>> &StreamDevConnect,
+ std::vector <std::tuple<Stream *, uint32_t>> &streamsSkippingSwitch)
+{
+ int ret = 0;
+ static struct pal_device dAttr; //struct reference is passed in StreamDevConnect.
+ struct pal_device curDevAttr = {};
+ std::shared_ptr<Device> hs_dev = nullptr;
+ uint32_t devId;
+ Stream *s;
+ struct pal_stream_attributes sAttr;
+
+ if (rm->IsDedicatedBEForUPDEnabled() || rm->IsVirtualPortForUPDEnabled()) {
+ PAL_DBG(LOG_TAG, "This UPD config requires no restoration");
+ return ret;
+ }
+
+ if (streamDevDisconnect.size() == 0) {
+ PAL_DBG(LOG_TAG, "Empty disconnect streams list. UPD backend needs no update");
+ return ret;
+ }
+
+ /*
+ * The streams that are skipping the switch to the new device are obtained
+ * using the findActiveStreamsNotInDisconnectList method if not obtained via
+ * the isValidDevicSwitchForStream path.
+ */
+ if (streamsSkippingSwitch.size() == 0) {
+ ret = findActiveStreamsNotInDisconnectList(streamDevDisconnect,
+ streamsSkippingSwitch);
+ if (ret)
+ goto exit_on_error;
+ }
+
+ /*
+ * The UPD stream is allowed to continue running on the device it is configured
+ * for if the streamsSkippingSwitch size is greater than 1.
+ */
+ if (streamsSkippingSwitch.size() == 0 || streamsSkippingSwitch.size() > 1) {
+ PAL_DBG(LOG_TAG, "UPD backend needs no update");
+ return ret;
+ }
+
+ s = std::get<0>(streamsSkippingSwitch[0]);
+ devId = (pal_device_id_t)std::get<1>(streamsSkippingSwitch[0]);
+
+ ret = s->getStreamAttributes(&sAttr);
+ if (ret)
+ goto exit_on_error;
+
+ if (sAttr.type != PAL_STREAM_ULTRASOUND) {
+ PAL_DBG(LOG_TAG, "Not a UPD stream. No UPD backend to update");
+ return ret;
+ }
+
+ memset(&dAttr, 0, sizeof(struct pal_device));
+
+ dAttr.id = PAL_DEVICE_OUT_HANDSET;
+
+ ret = rm->getDeviceConfig(&dAttr, &sAttr);
+ if (ret) {
+ PAL_ERR(LOG_TAG, "Error getting deviceConfig");
+ goto exit_on_error;
+ }
+
+ hs_dev = Device::getObject(PAL_DEVICE_OUT_HANDSET);
+ if (hs_dev)
+ hs_dev->getDeviceAttributes(&curDevAttr);
+
+ if (!doDevAttrDiffer(&dAttr, &curDevAttr)) {
+ PAL_DBG(LOG_TAG, "No need to update device attr for UPD");
+ return ret;
+ }
+
+ /*
+ * We restore the device configuration appropriately if UPD is the only stream
+ * skipping the switch to the new device and will be the only active stream
+ * still present on the current device.
+ *
+ * If the current device is Speaker, the UPD stream is switched from speaker
+ * (NLPI) to handset (LPI).
+ *
+ * If the current device is handset, the device is configured to limit it's
+ * compatibility to UPD stream only.
+ */
+ PAL_DBG(LOG_TAG, "Skipping UPD stream switch to new device. %s",
+ (devId == PAL_DEVICE_OUT_SPEAKER) ?
+ "Restoring UPD from Speaker to Handset device." :
+ "Restoring UPD updating device config for Handset device.");
+
+ streamDevDisconnect.push_back(streamsSkippingSwitch[0]);
+ StreamDevConnect.push_back({s, &dAttr});
+
+ return ret;
+
+exit_on_error:
+ PAL_ERR(LOG_TAG, "Error updating UPD backend");
+ return ret;
+}
+
int32_t ResourceManager::streamDevDisconnect(std::vector <std::tuple<Stream *, uint32_t>> streamDevDisconnectList){
int status = 0;
std::vector <std::tuple<Stream *, uint32_t>>::iterator sIter;
@@ -7474,7 +7721,7 @@
{
int status = 0;
std::vector <Stream *> activeStreams;
- std::vector <std::tuple<Stream *, uint32_t>> streamDevDisconnect;
+ std::vector <std::tuple<Stream *, uint32_t>> streamDevDisconnect, streamsSkippingSwitch;
std::vector <std::tuple<Stream *, struct pal_device *>> streamDevConnect;
std::vector<Stream*>::iterator sIter;
@@ -7494,10 +7741,24 @@
// create dev switch vectors
for (sIter = activeStreams.begin(); sIter != activeStreams.end(); sIter++) {
+ if (!isValidDeviceSwitchForStream((*sIter), newDevAttr->id)) {
+ streamsSkippingSwitch.push_back({(*sIter), inDev->getSndDeviceId()});
+ continue;
+ }
+
streamDevDisconnect.push_back({(*sIter), inDev->getSndDeviceId()});
streamDevConnect.push_back({(*sIter), newDevAttr});
}
+
mActiveStreamMutex.unlock();
+
+ status = rm->restoreDeviceConfigForUPD(streamDevDisconnect, streamDevConnect,
+ streamsSkippingSwitch);
+ if (status) {
+ PAL_DBG(LOG_TAG, "Error restoring device config for UPD");
+ return status;
+ }
+
status = streamDevSwitch(streamDevDisconnect, streamDevConnect);
if (!status) {
mActiveStreamMutex.lock();
@@ -7523,7 +7784,7 @@
std::vector<Stream*> prevActiveStreams)
{
int status = 0;
- std::vector <std::tuple<Stream *, uint32_t>> streamDevDisconnect;
+ std::vector <std::tuple<Stream *, uint32_t>> streamDevDisconnect, streamsSkippingSwitch;
std::vector <std::tuple<Stream *, struct pal_device *>> streamDevConnect;
std::vector<Stream*>::iterator sIter;
@@ -7536,11 +7797,25 @@
mActiveStreamMutex.lock();
for (sIter = prevActiveStreams.begin(); sIter != prevActiveStreams.end(); sIter++) {
if (((*sIter) != NULL) && isStreamActive((*sIter), mActiveStreams)) {
+ if (!isValidDeviceSwitchForStream((*sIter), newDevAttr->id)) {
+ streamsSkippingSwitch.push_back({(*sIter), inDev->getSndDeviceId()});
+ continue;
+ }
+
streamDevDisconnect.push_back({(*sIter), inDev->getSndDeviceId()});
streamDevConnect.push_back({(*sIter), newDevAttr});
}
}
+
mActiveStreamMutex.unlock();
+
+ status = rm->restoreDeviceConfigForUPD(streamDevDisconnect, streamDevConnect,
+ streamsSkippingSwitch);
+ if (status) {
+ PAL_DBG(LOG_TAG, "Error restoring device config for UPD");
+ return status;
+ }
+
status = streamDevSwitch(streamDevDisconnect, streamDevConnect);
if (!status) {
mActiveStreamMutex.lock();
@@ -7642,6 +7917,14 @@
return false;
}
+bool ResourceManager::isValidStreamId(int streamId)
+{
+ if (streamId < PAL_STREAM_LOW_LATENCY || streamId >= PAL_STREAM_MAX)
+ return false;
+
+ return true;
+}
+
bool ResourceManager::isOutputDevId(int deviceId)
{
if ((deviceId > PAL_DEVICE_NONE) && (deviceId < PAL_DEVICE_OUT_MAX))
@@ -8485,11 +8768,24 @@
if ((device->getSndDeviceId() > PAL_DEVICE_OUT_MIN &&
device->getSndDeviceId() < PAL_DEVICE_OUT_MAX) &&
((*sIter)->suspendedDevIds.size() == 1 /* non combo */)) {
- streamDevDisconnect.push_back({ (*sIter), device->getSndDeviceId() });
+ streamDevDisconnect.push_back({(*sIter), device->getSndDeviceId()});
}
}
}
-
+ restoredStreams.push_back((*sIter));
+ streamDevConnect.push_back({(*sIter), &a2dpDattr});
+ } else if (std::find((*sIter)->suspendedDevIds.begin(), (*sIter)->suspendedDevIds.end(),
+ PAL_DEVICE_OUT_BLUETOOTH_SCO) != (*sIter)->suspendedDevIds.end()) {
+ std::vector<std::shared_ptr<Device>> devices;
+ (*sIter)->getAssociatedDevices(devices);
+ if (devices.size() > 0) {
+ for (auto device: devices) {
+ if (device->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_SCO) {
+ streamDevDisconnect.push_back({(*sIter), PAL_DEVICE_OUT_BLUETOOTH_SCO});
+ break;
+ }
+ }
+ }
restoredStreams.push_back((*sIter));
streamDevConnect.push_back({(*sIter), &a2dpDattr});
}
@@ -8511,6 +8807,7 @@
}
mActiveStreamMutex.lock();
+ SortAndUnique(restoredStreams);
for (sIter = restoredStreams.begin(); sIter != restoredStreams.end(); sIter++) {
if (((*sIter) != NULL) && isStreamActive(*sIter, mActiveStreams)) {
(*sIter)->lockStreamMutex();
@@ -9371,7 +9668,8 @@
dev->setDeviceParameter(param_id, param_payload);
dev->getDeviceParameter(param_id, (void **)¤t_param_bt_a2dp);
- if (current_param_bt_a2dp->reconfig == true) {
+ if ((current_param_bt_a2dp->reconfig == true) &&
+ (current_param_bt_a2dp->a2dp_suspended == false)) {
param_bt_a2dp.a2dp_suspended = true;
mResourceManagerMutex.unlock();
status = dev->setDeviceParameter(PAL_PARAM_ID_BT_A2DP_SUSPENDED,
@@ -9496,7 +9794,7 @@
(streamType == PAL_STREAM_COMPRESSED) ||
(streamType == PAL_STREAM_GENERIC)) {
(*sIter)->suspendedDevIds.clear();
- (*sIter)->suspendedDevIds.push_back(a2dp_dattr.id);
+ (*sIter)->suspendedDevIds.push_back(PAL_DEVICE_OUT_BLUETOOTH_SCO);
PAL_DBG(LOG_TAG, "a2dp resumed, mark sco streams as to route them later");
}
}
@@ -10528,6 +10826,15 @@
return isAvailable;
}
+bool ResourceManager::isDisconnectedDeviceStillActive(
+ std::set<pal_device_id_t> &curPalDevices, std::set<pal_device_id_t> &activeDevices,
+ pal_device_id_t id)
+{
+ return (!isDeviceAvailable(id)) &&
+ (curPalDevices.find(id) != curPalDevices.end()) &&
+ (activeDevices.find(id) != activeDevices.end());
+}
+
bool ResourceManager::isDeviceReady(pal_device_id_t id)
{
struct pal_device dAttr;
@@ -11774,8 +12081,8 @@
PAL_ERR(LOG_TAG, "invalid dev cannot restore device");
goto exit;
}
-
- if (isPluginPlaybackDevice((pal_device_id_t)dev->getSndDeviceId())) {
+ if (isPluginPlaybackDevice((pal_device_id_t)dev->getSndDeviceId()) &&
+ (dev->getDeviceCount() != 0)) {
PAL_ERR(LOG_TAG, "don't restore device for usb/3.5 hs playback");
goto exit;
}
diff --git a/session/inc/PayloadBuilder.h b/session/inc/PayloadBuilder.h
index 183e8df..0228668 100644
--- a/session/inc/PayloadBuilder.h
+++ b/session/inc/PayloadBuilder.h
@@ -200,6 +200,9 @@
void payloadVolumeConfig(uint8_t** payload, size_t* size,
uint32_t miid,
struct pal_volume_data * data);
+ void payloadMultichVolumemConfig(uint8_t** payload, size_t* size,
+ uint32_t miid,
+ struct pal_volume_data * data);
int payloadCustomParam(uint8_t **alsaPayload, size_t *size,
uint32_t *customayload, uint32_t customPayloadSize,
uint32_t moduleInstanceId, uint32_t dspParamId);
diff --git a/session/src/PayloadBuilder.cpp b/session/src/PayloadBuilder.cpp
index 9a8945a..d57ce10 100644
--- a/session/src/PayloadBuilder.cpp
+++ b/session/src/PayloadBuilder.cpp
@@ -441,8 +441,14 @@
uint8_t* payloadInfo = NULL;
size_t payloadSize = 0, padBytes = 0;
- PAL_VERBOSE(LOG_TAG,"volume sent:%f \n",(voldata->volume_pair[0].vol));
- voldB = (voldata->volume_pair[0].vol);
+ if (voldata->no_of_volpair == 1) {
+ voldB = (voldata->volume_pair[0].vol);
+ } else {
+ voldB = (voldata->volume_pair[0].vol + voldata->volume_pair[1].vol)/2;
+ PAL_DBG(LOG_TAG,"volume sent left:%f , right: %f \n",(voldata->volume_pair[0].vol),
+ (voldata->volume_pair[1].vol));
+ }
+ PAL_VERBOSE(LOG_TAG,"volume sent:%f \n",voldB);
vol = (long)(voldB * (PLAYBACK_VOLUME_MAX*1.0));
payloadSize = sizeof(struct apm_module_param_data_t) +
sizeof(struct volume_ctrl_master_gain_t);
@@ -467,6 +473,51 @@
PAL_DBG(LOG_TAG, "payload %pK size %zu", *payload, *size);
}
+void PayloadBuilder::payloadMultichVolumemConfig(uint8_t** payload, size_t* size,
+ uint32_t miid, struct pal_volume_data* voldata)
+{
+ const uint32_t PLAYBACK_MULTI_VOLUME_GAIN = 1 << 28;
+ struct apm_module_param_data_t* header = nullptr;
+ volume_ctrl_multichannel_gain_t *volConf = nullptr;
+ int numChannels;
+ uint8_t* payloadInfo = NULL;
+ size_t payloadSize = 0, padBytes = 0;
+
+ numChannels = voldata->no_of_volpair;
+ payloadSize = sizeof(struct apm_module_param_data_t) +
+ sizeof(struct volume_ctrl_multichannel_gain_t) +
+ numChannels * sizeof(volume_ctrl_channels_gain_config_t);
+ 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;
+ header->param_id = PARAM_ID_VOL_CTRL_MULTICHANNEL_GAIN;
+ header->error_code = 0x0;
+ header->param_size = payloadSize - sizeof(struct apm_module_param_data_t);
+ volConf = (volume_ctrl_multichannel_gain_t *) (payloadInfo + sizeof(struct apm_module_param_data_t));
+ volConf->num_config = numChannels;
+ PAL_DBG(LOG_TAG, "num_config %d", numChannels);
+ /*
+ * Only L/R channel setting is supported. No need to convert channel_mask to channel_map.
+ * If other channel types support, the conversion is needed.
+ */
+ for (uint32_t i = 0; i < numChannels; i++) {
+ volConf->gain_data[i].channel_mask_lsb = (1 << voldata->volume_pair[i].channel_mask);
+ volConf->gain_data[i].channel_mask_msb = 0;
+ volConf->gain_data[i].gain = (uint32_t)((voldata->volume_pair[i].vol) * (PLAYBACK_MULTI_VOLUME_GAIN * 1.0));
+ }
+ PAL_DBG(LOG_TAG, "header params IID:%x param_id:%x error_code:%d param_size:%d",
+ header->module_instance_id, header->param_id,
+ header->error_code, header->param_size);
+ *size = payloadSize + padBytes;
+ *payload = payloadInfo;
+ PAL_DBG(LOG_TAG, "payload %pK size %zu", *payload, *size);
+}
+
void PayloadBuilder::payloadVolumeCtrlRamp(uint8_t** payload, size_t* size,
uint32_t miid, uint32_t ramp_period_ms)
{
@@ -1997,6 +2048,7 @@
} else {
PAL_ERR(LOG_TAG, "invalid bit width %d", data->bit_width);
delete[] payloadInfo;
+ payloadInfo = NULL;
*size = 0;
*payload = NULL;
return;
@@ -3181,6 +3233,7 @@
}
long voldB = 0;
+ float vol = 0;
struct pal_volume_data *voldata = NULL;
voldata = (struct pal_volume_data *)calloc(1, (sizeof(uint32_t) +
(sizeof(struct pal_channel_vol_kv) * (0xFFFF))));
@@ -3195,9 +3248,17 @@
goto error_1;
}
- PAL_VERBOSE(LOG_TAG,"volume sent:%f \n",(voldata->volume_pair[0].vol));
+ if (voldata->no_of_volpair == 1) {
+ vol = (voldata->volume_pair[0].vol);
+ } else {
+ vol = (voldata->volume_pair[0].vol + voldata->volume_pair[1].vol)/2;
+ PAL_VERBOSE(LOG_TAG,"volume sent left:%f , right: %f \n",(voldata->volume_pair[0].vol),
+ (voldata->volume_pair[1].vol));
+ }
+
/*scaling the volume by PLAYBACK_VOLUME_MAX factor*/
- voldB = (long)((voldata->volume_pair[0].vol) * (PLAYBACK_VOLUME_MAX*1.0));
+ voldB = (long)(vol * (PLAYBACK_VOLUME_MAX*1.0));
+ PAL_VERBOSE(LOG_TAG,"volume sent:%f \n",voldB);
switch (static_cast<uint32_t>(tag)) {
case TAG_STREAM_VOLUME:
diff --git a/session/src/SessionAlsaCompress.cpp b/session/src/SessionAlsaCompress.cpp
index 5778888..e6b9e9e 100644
--- a/session/src/SessionAlsaCompress.cpp
+++ b/session/src/SessionAlsaCompress.cpp
@@ -2182,12 +2182,17 @@
goto exit;
}
- builder->payloadVolumeConfig(&alsaParamData, &alsaPayloadSize, miid, vdata);
+ if (vdata->no_of_volpair == 2 && sAttr.out_media_config.ch_info.channels == 2) {
+ builder->payloadMultichVolumemConfig(&alsaParamData, &alsaPayloadSize, miid, vdata);
+ } else {
+ builder->payloadVolumeConfig(&alsaParamData, &alsaPayloadSize, miid, vdata);
+ }
+
if (alsaPayloadSize) {
status = SessionAlsaUtils::setMixerParameter(mixer, device,
alsaParamData, alsaPayloadSize);
PAL_INFO(LOG_TAG, "mixer set volume config status=%d\n", status);
- delete [] alsaParamData;
+ freeCustomPayload(&alsaParamData, &alsaPayloadSize);
alsaPayloadSize = 0;
}
}
diff --git a/session/src/SessionAlsaPcm.cpp b/session/src/SessionAlsaPcm.cpp
index 2adcfcc..efd5284 100644
--- a/session/src/SessionAlsaPcm.cpp
+++ b/session/src/SessionAlsaPcm.cpp
@@ -27,8 +27,39 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Changes from Qualcomm Innovation Center are provided under the following license:
+ *
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define LOG_TAG "PAL: SessionAlsaPcm"
@@ -2519,12 +2550,17 @@
goto exit;
}
- builder->payloadVolumeConfig(¶mData, ¶mSize, miid, vdata);
+ if (vdata->no_of_volpair == 2 && sAttr.out_media_config.ch_info.channels == 2) {
+ builder->payloadMultichVolumemConfig(¶mData, ¶mSize, miid, vdata);
+ } else {
+ builder->payloadVolumeConfig(¶mData, ¶mSize, miid, vdata);
+ }
+
if (paramSize) {
status = SessionAlsaUtils::setMixerParameter(mixer, device,
paramData, paramSize);
PAL_INFO(LOG_TAG, "mixer set volume config status=%d\n", status);
- delete [] paramData;
+ freeCustomPayload(¶mData, ¶mSize);
paramSize = 0;
}
return 0;
diff --git a/session/src/SessionAlsaUtils.cpp b/session/src/SessionAlsaUtils.cpp
index 024117c..d6c7b07 100644
--- a/session/src/SessionAlsaUtils.cpp
+++ b/session/src/SessionAlsaUtils.cpp
@@ -28,7 +28,8 @@
*
* Changes from Qualcomm Innovation Center are provided under the following license:
*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted (subject to the limitations in the
@@ -2321,6 +2322,26 @@
goto exit;
}
}
+
+ if (strcmp(dAttr.custom_config.custom_key, "mspp") &&
+ dAttr.id == PAL_DEVICE_OUT_SPEAKER &&
+ ((sAttr.type == PAL_STREAM_LOW_LATENCY) ||
+ (sAttr.type == PAL_STREAM_ULTRA_LOW_LATENCY) ||
+ (sAttr.type == PAL_STREAM_PCM_OFFLOAD) ||
+ (sAttr.type == PAL_STREAM_DEEP_BUFFER) ||
+ (sAttr.type == PAL_STREAM_COMPRESSED))) {
+ pal_param_device_rotation_t rotation;
+ rotation.rotation_type = rm->mOrientation == ORIENTATION_270 ?
+ PAL_SPEAKER_ROTATION_RL : PAL_SPEAKER_ROTATION_LR;
+ status = sess->handleDeviceRotation(streamHandle, rotation.rotation_type,
+ pcmDevIds.at(0), mixerHandle, builder,
+ aifBackEndsToConnect);
+ if (status != 0) {
+ PAL_ERR(LOG_TAG,"handleDeviceRotation failed");
+ status = 0; //rotaton setting failed is not fatal.
+ }
+ }
+
} else {
PAL_ERR(LOG_TAG, "invalid session audio object");
status = -EINVAL;
diff --git a/session/src/SoundTriggerEngineCapi.cpp b/session/src/SoundTriggerEngineCapi.cpp
index a58de5a..48de4b1 100644
--- a/session/src/SoundTriggerEngineCapi.cpp
+++ b/session/src/SoundTriggerEngineCapi.cpp
@@ -28,7 +28,7 @@
*
* Changes from Qualcomm Innovation Center are provided under the following license:
*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
@@ -250,7 +250,7 @@
}
}
- if (reader_->getUnreadSize() < buffer_size_)
+ if (!reader_->waitForBuffers(buffer_size_))
continue;
read_size = reader_->read((void*)process_input_buff, buffer_size_);
@@ -527,7 +527,7 @@
}
}
- if (reader_->getUnreadSize() < buffer_size_)
+ if (!reader_->waitForBuffers(buffer_size_))
continue;
read_size = reader_->read((void*)process_input_buff, buffer_size_);
diff --git a/stream/inc/Stream.h b/stream/inc/Stream.h
index e7f1b81..c66c13c 100644
--- a/stream/inc/Stream.h
+++ b/stream/inc/Stream.h
@@ -184,6 +184,7 @@
int mGainLevel;
int mOrientation = 0;
std::mutex mStreamMutex;
+ std::mutex mGetParamMutex;
static std::mutex mBaseStreamMutex; //TBD change this. as having a single static mutex for all instances of Stream is incorrect. Replace
static std::shared_ptr<ResourceManager> rm;
struct modifier_kv *mModifiers;
@@ -324,6 +325,8 @@
mStreamMutex.unlock();
};
bool isMutexLockedbyRm() { return mutexLockedbyRm; }
+ void lockGetParamMutex() { mGetParamMutex.lock(); };
+ void unlockGetParamMutex() { mGetParamMutex.unlock(); };
/* GetPalDevice only applies to Sound Trigger streams */
std::shared_ptr<Device> GetPalDevice(Stream *streamHandle, pal_device_id_t dev_id);
void setCachedState(stream_state_t state);
diff --git a/stream/src/Stream.cpp b/stream/src/Stream.cpp
index 2637c53..414711e 100644
--- a/stream/src/Stream.cpp
+++ b/stream/src/Stream.cpp
@@ -371,7 +371,9 @@
}
pal_param_payload *pal_param = (pal_param_payload *)effect_query;
effect_pal_payload_t *effectPayload = (effect_pal_payload_t *)pal_param->payload;
+ mGetParamMutex.lock();
status = session->getEffectParameters(this, effectPayload);
+ mGetParamMutex.unlock();
if (status) {
PAL_ERR(LOG_TAG, "getParameters failed with %d", status);
}
@@ -836,9 +838,9 @@
PAL_ERR(LOG_TAG, "Sound card offline, status %d", status);
goto exit;
}
- rm->lockResourceManagerMutex();
+ mGetParamMutex.lock();
status = session->getTimestamp(stime);
- rm->unlockResourceManagerMutex();
+ mGetParamMutex.unlock();
if (0 != status) {
PAL_ERR(LOG_TAG, "Failed to get session timestamp status %d", status);
if (errno == -ENETRESET &&
@@ -1071,6 +1073,19 @@
goto exit;
}
+ /* Special handling for aaudio usecase on Speaker
+ * Speaker device start needs to be called before graph_open
+ * to start VI feedback graph and send SP payload to AGM.
+ */
+ if (dev->getSndDeviceId() == PAL_DEVICE_OUT_SPEAKER && isMMap) {
+ status = dev->start();
+ if (0 != status) {
+ PAL_ERR(LOG_TAG, "Speaker device start failed with status %d", status);
+ dev->close();
+ mDevices.pop_back();
+ goto exit;
+ }
+ }
status = session->connectSessionDevice(this, mStreamAttr->type, dev);
if (0 != status) {
PAL_ERR(LOG_TAG, "connectSessionDevice failed:%d", status);
@@ -1130,9 +1145,10 @@
*/
if ((currentState != STREAM_INIT && currentState != STREAM_STOPPED) ||
- (currentState == STREAM_INIT &&
+ ((currentState == STREAM_INIT || currentState == STREAM_STOPPED) &&
((mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_A2DP) ||
- (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE)) &&
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE) ||
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_SPEAKER)) &&
isMMap)) {
status = mDevices[i]->stop();
if (0 != status) {
@@ -1245,17 +1261,18 @@
goto dev_close;
}
- /* Special handling for aaudio usecase on A2DP/BLE.
- * For mmap usecase, if device switch happens to A2DP/BLE device
- * before stream_start then start A2DP/BLE dev. since it won't be
+ /* Special handling for aaudio usecase on A2DP/BLE/Speaker.
+ * For mmap usecase, if device switch happens to A2DP/BLE/Speaker device
+ * before stream_start then start A2DP/BLE/speaker dev. since it won't be
* started again as a part of pal_stream_start().
*/
rm->lockGraph();
if ((currentState != STREAM_INIT && currentState != STREAM_STOPPED) ||
- (currentState == STREAM_INIT &&
+ ((currentState == STREAM_INIT || currentState == STREAM_STOPPED) &&
((dev->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_A2DP) ||
- (dev->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE)) &&
+ (dev->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE) ||
+ (dev->getSndDeviceId() == PAL_DEVICE_OUT_SPEAKER)) &&
isMMap)) {
status = dev->start();
if (0 != status) {
@@ -1391,7 +1408,7 @@
bool voice_call_switch = false;
uint32_t force_switch_dev_id = PAL_DEVICE_IN_MAX;
uint32_t curDeviceSlots[PAL_DEVICE_IN_MAX], newDeviceSlots[PAL_DEVICE_IN_MAX];
- std::vector <std::tuple<Stream *, uint32_t>> streamDevDisconnect, sharedBEStreamDev;
+ std::vector <std::tuple<Stream *, uint32_t>> streamDevDisconnect, sharedBEStreamDev, streamsSkippingSwitch;
std::vector <std::tuple<Stream *, struct pal_device *>> StreamDevConnect;
struct pal_device dAttr;
struct pal_device_info deviceInfo;
@@ -1547,6 +1564,10 @@
* for 2 secs causing audioserver to stuck for processing
* disconnection. Thus check for isCurDeviceA2dp and a2dp_suspended
* state to avoid unnecessary sleep over 2 secs.
+ *
+ * Also check for combo devices for the stream and do not retry for
+ * combo streams. This will ensure seamless playback over Speaker
+ * even if BT device is not ready.
*/
if ((newDevices[i].id == PAL_DEVICE_OUT_BLUETOOTH_A2DP) ||
(newDevices[i].id == PAL_DEVICE_OUT_BLUETOOTH_BLE) ||
@@ -1571,8 +1592,9 @@
break;
} else if (isCurDeviceA2dp) {
break;
+ } else if (rm->isDeviceAvailable(newDevices, numDev, PAL_DEVICE_OUT_SPEAKER)) {
+ break;
}
-
usleep(retryPeriodMs * 1000);
}
}
@@ -1755,21 +1777,8 @@
}
if (voice_call_switch) {
for (const auto &elem : sharedBEStreamDev) {
- struct pal_stream_attributes sAttr;
- Stream *strm = std::get<0>(elem);
- pal_device_id_t newDeviceId = newDevices[newDeviceSlots[i]].id;
- int status = strm->getStreamAttributes(&sAttr);
-
- if (status) {
- PAL_ERR(LOG_TAG,"getStreamAttributes Failed \n");
- mStreamMutex.unlock();
- rm->unlockActiveStream();
- return status;
- }
-
- if (sAttr.type == PAL_STREAM_ULTRASOUND &&
- (newDeviceId != PAL_DEVICE_OUT_HANDSET && newDeviceId != PAL_DEVICE_OUT_SPEAKER)) {
- PAL_DBG(LOG_TAG, "Ultrasound stream running on speaker/handset. Not switching to device (%d)", newDeviceId);
+ if (!rm->isValidDeviceSwitchForStream(std::get<0>(elem), newDevices[newDeviceSlots[i]].id)) {
+ streamsSkippingSwitch.push_back(elem);
continue;
}
@@ -1833,9 +1842,17 @@
rm->unlockActiveStream();
goto done;
}
+
mStreamMutex.unlock();
rm->unlockActiveStream();
+ status = rm->restoreDeviceConfigForUPD(streamDevDisconnect, StreamDevConnect,
+ streamsSkippingSwitch);
+ if (status) {
+ PAL_ERR(LOG_TAG, "Error restoring device config for UPD");
+ goto done;
+ }
+
status = rm->streamDevSwitch(streamDevDisconnect, StreamDevConnect);
if (status) {
PAL_ERR(LOG_TAG, "Device switch failed");
diff --git a/stream/src/StreamPCM.cpp b/stream/src/StreamPCM.cpp
index 4bb80b2..6646570 100644
--- a/stream/src/StreamPCM.cpp
+++ b/stream/src/StreamPCM.cpp
@@ -294,14 +294,15 @@
if (0 != status)
PAL_ERR(LOG_TAG, "stream stop failed. status %d", status);
mStreamMutex.lock();
- } else if (currentState == STREAM_INIT) {
- /* Special handling for aaudio usecase on A2DP/BLE.
+ } else if (currentState == STREAM_INIT || currentState == STREAM_STOPPED) {
+ /* Special handling for aaudio usecase on A2DP/BLE/Speaker.
* A2DP/BLE device starts even when stream is still in STREAM_INIT state,
- * hence stop A2DP/BLE device to match device start&stop count.
+ * hence stop A2DP/BLE/Speaker device to match device start&stop count.
*/
for (int32_t i=0; i < mDevices.size(); i++) {
if (((mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_A2DP) ||
- (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE)) && isMMap) {
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE) ||
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_SPEAKER)) && isMMap) {
status = mDevices[i]->stop();
if (0 != status) {
PAL_ERR(LOG_TAG, "BT A2DP/BLE device stop failed with status %d", status);
@@ -408,8 +409,9 @@
for (int32_t i=0; i < mDevices.size(); i++) {
if (((mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_A2DP) ||
- (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE)) && isMMap) {
- PAL_DBG(LOG_TAG, "skip BT A2DP/BLE device start as it's done already");
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE) ||
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_SPEAKER)) && isMMap) {
+ PAL_DBG(LOG_TAG, "skip BT A2DP/BLE/Speaker device start as it's done already");
status = 0;
continue;
}
@@ -678,6 +680,13 @@
PAL_VERBOSE(LOG_TAG, "session stop successful");
for (int32_t i=0; i < mDevices.size(); i++) {
+ if (((mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_A2DP) ||
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE) ||
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_SPEAKER)) && isMMap) {
+ PAL_DBG(LOG_TAG, "skip BT A2DP/BLE/Speaker device stop, to be done in close/disconnect");
+ status = 0;
+ continue;
+ }
status = mDevices[i]->stop();
if (0 != status) {
PAL_ERR(LOG_TAG, "Rx device stop failed with status %d", status);
@@ -685,7 +694,6 @@
goto exit;
}
}
- isMMap = false;
rm->unlockGraph();
PAL_VERBOSE(LOG_TAG, "devices stop successful");
break;
@@ -1657,9 +1665,10 @@
for (int32_t i=0; i < mDevices.size(); i++) {
if ((mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_A2DP) ||
(mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_BLUETOOTH_BLE) ||
+ (mDevices[i]->getSndDeviceId() == PAL_DEVICE_OUT_SPEAKER) ||
(mDevices[i]->getSndDeviceId() == PAL_DEVICE_IN_BLUETOOTH_BLE) ||
(mDevices[i]->getSndDeviceId() == PAL_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) {
- PAL_DBG(LOG_TAG, "start BT devices as to populate the full GKVs");
+ PAL_DBG(LOG_TAG, "start BT/Speaker devices to configure graph properly");
status = mDevices[i]->start();
if ((0 != status) && mDevices.size() == 1) {
PAL_ERR(LOG_TAG, "device start failed: %d", status);
diff --git a/utils/inc/PalRingBuffer.h b/utils/inc/PalRingBuffer.h
index 79a4710..a166d03 100644
--- a/utils/inc/PalRingBuffer.h
+++ b/utils/inc/PalRingBuffer.h
@@ -28,7 +28,7 @@
*
* Changes from Qualcomm Innovation Center are provided under the following license:
*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause-Clear
*/
@@ -59,6 +59,7 @@
: ringBuffer_(buffer),
unreadSize_(0),
readOffset_(0),
+ requestedSize_(0),
state_(READER_DISABLED) {}
~PalRingBufferReader() {};
@@ -70,6 +71,7 @@
size_t getUnreadSize();
void reset();
bool isEnabled() { return state_ == READER_ENABLED; }
+ bool waitForBuffers(uint32_t buffer_size);
friend class PalRingBuffer;
friend class StreamSoundTrigger;
@@ -79,6 +81,9 @@
size_t unreadSize_;
size_t readOffset_;
pal_ring_buffer_reader_state state_;
+ std::mutex mutex_;
+ std::condition_variable cv_;
+ uint32_t requestedSize_;
};
class PalRingBuffer {
diff --git a/utils/src/PalRingBuffer.cpp b/utils/src/PalRingBuffer.cpp
index cfe7432..6bd6937 100644
--- a/utils/src/PalRingBuffer.cpp
+++ b/utils/src/PalRingBuffer.cpp
@@ -25,6 +25,11 @@
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* 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 are provided under the following license:
+ *
+ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
*/
@@ -71,6 +76,11 @@
for (it = readOffsets_.begin(); it != readOffsets_.end(); it++, i++) {
(*(it))->unreadSize_ += writtenSize;
PAL_VERBOSE(LOG_TAG, "Reader (%d), unreadSize(%zu)", i, (*(it))->unreadSize_);
+
+ if ((*(it))->requestedSize_ > 0 &&
+ (*(it))->unreadSize_ >= (*(it))->requestedSize_) {
+ (*(it))->cv_.notify_one();
+ }
}
}
@@ -148,6 +158,21 @@
bufferEnd_ = bufferSize;
}
+bool PalRingBufferReader::waitForBuffers(uint32_t buffer_size)
+{
+ std::unique_lock<std::mutex> lck(mutex_);
+ if (state_ == READER_ENABLED) {
+ if (unreadSize_ >= buffer_size)
+ goto exit;
+ requestedSize_ = buffer_size;
+ cv_.wait_for(lck, std::chrono::milliseconds(3000));
+ }
+
+exit:
+ requestedSize_ = 0;
+ return unreadSize_ >= buffer_size;
+}
+
int32_t PalRingBufferReader::read(void* readBuffer, size_t bufferSize)
{
int32_t readSize = 0;
@@ -283,6 +308,8 @@
unreadSize_ = 0;
state_ = READER_DISABLED;
ringBuffer_->mutex_.unlock();
+ requestedSize_ = 0;
+ cv_.notify_all();
}
PalRingBufferReader* PalRingBuffer::newReader()