Merge "hal: Check NULL pointer" into audio-hal.lnx.4.0
diff --git a/configs/msm8937/mixer_paths_sdm439_pm8953.xml b/configs/msm8937/mixer_paths_sdm439_pm8953.xml
new file mode 100644
index 0000000..5b8f268
--- /dev/null
+++ b/configs/msm8937/mixer_paths_sdm439_pm8953.xml
@@ -0,0 +1,1353 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ Copyright (c) 2018, 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.
+-->
+
+<mixer>
+ <!-- These are the initial mixer settings -->
+ <ctl name="Voice Rx Device Mute" id="0" value="0" />
+ <ctl name="Voice Rx Device Mute" id="1" value="-1" />
+ <ctl name="Voice Rx Device Mute" id="2" value="20" />
+ <ctl name="Voice Tx Mute" id="0" value="0" />
+ <ctl name="Voice Tx Mute" id="1" value="-1" />
+ <ctl name="Voice Tx Mute" id="2" value="500" />
+ <ctl name="Voice Rx Gain" id="0" value="0" />
+ <ctl name="Voice Rx Gain" id="1" value="-1" />
+ <ctl name="Voice Rx Gain" id="2" value="20" />
+ <ctl name="Voip Tx Mute" id="0" value="0" />
+ <ctl name="Voip Tx Mute" id="1" value="500" />
+ <ctl name="Voip Rx Gain" id="0" value="0" />
+ <ctl name="Voip Rx Gain" id="1" value="20" />
+ <ctl name="Voip Mode Config" value="12" />
+ <ctl name="Voip Rate Config" value="0" />
+ <ctl name="Voip Evrc Min Max Rate Config" id="0" value="1" />
+ <ctl name="Voip Evrc Min Max Rate Config" id="1" value="4" />
+ <ctl name="Voip Dtx Mode" value="0" />
+ <ctl name="TTY Mode" value="OFF" />
+ <ctl name="HPHL Volume" value="9" />
+ <ctl name="HPHR Volume" value="9" />
+ <ctl name="RX1 Digital Volume" value="84" />
+ <ctl name="RX2 Digital Volume" value="84" />
+ <ctl name="RX3 Digital Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="84" />
+ <ctl name="IIR1 INP2 Volume" value="84" />
+ <ctl name="IIR1 INP3 Volume" value="84" />
+ <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="ADC1 Volume" value="4" />
+ <ctl name="ADC2 Volume" value="4" />
+ <ctl name="ADC3 Volume" value="4" />
+ <ctl name="DEC1 Volume" value="84" />
+ <ctl name="DEC2 Volume" value="84" />
+ <ctl name="DEC2 MUX" value="ZERO" />
+ <ctl name="DEC1 MUX" value="ZERO" />
+ <ctl name="ADC2 MUX" value="ZERO" />
+ <ctl name="RDAC2 MUX" value="ZERO" />
+ <ctl name="RX2 MIX2 INP2" value="ZERO" />
+ <ctl name="RX2 MIX2 INP1" value="ZERO" />
+ <ctl name="RX1 MIX2 INP2" value="ZERO" />
+ <ctl name="RX1 MIX2 INP1" value="ZERO" />
+ <ctl name="RX3 MIX1 INP2" value="ZERO" />
+ <ctl name="RX3 MIX1 INP1" value="ZERO" />
+ <ctl name="RX2 MIX1 INP2" value="ZERO" />
+ <ctl name="RX2 MIX1 INP1" value="ZERO" />
+ <ctl name="RX1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX1 MIX1 INP1" value="ZERO" />
+ <ctl name="EAR_S" value="ZERO" />
+ <ctl name="HPHL" value="ZERO" />
+ <ctl name="HPHR" value="ZERO" />
+ <ctl name="SPK" value="ZERO" />
+ <ctl name="WSA Spk Switch" value="ZERO" />
+ <ctl name="LINE_OUT" value="ZERO" />
+ <ctl name="SpkrMono WSA_RDAC" value="ZERO" />
+ <ctl name="SpkrMono BOOST Switch" value="1" />
+ <ctl name="EAR PA Gain" value="POS_6_DB" />
+ <ctl name="EAR PA Gain" value="POS_1P5_DB" />
+ <ctl name="EAR PA Boost" value="ENABLE" />
+ <ctl name="MI2S_RX Channels" value="One" />
+ <ctl name="MI2S_TX Channels" value="One" />
+ <ctl name="PRI_MI2S_RX_DL_HL Switch" value="0" />
+ <ctl name="PRI_MI2S_RX_VI_FB_MUX" value="ZERO" />
+ <ctl name="DEC3 MUX" value="ZERO" />
+ <ctl name="DEC4 MUX" value="ZERO" />
+ <ctl name="SpkrMono VISENSE Switch" value="0" />
+ <ctl name="ADC1_INP1 Switch" value="0" />
+
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia3" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia3" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia3" value="0" />
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="0" />
+ <ctl name="MultiMedia5 Mixer TERT_MI2S_TX" value="0" />
+ <ctl name="MultiMedia1 Mixer INTERNAL_BT_SCO_TX" value="0" />
+ <ctl name="PRI_MI2S_RX_Voice Mixer CSVoice" value="0" />
+ <ctl name="Voice_Tx Mixer TERT_MI2S_TX_Voice" value="0" />
+ <ctl name="PRI_MI2S_RX Port Mixer INT_BT_SCO_TX" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia2" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia3" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia14" value="0" />
+ <!-- Voice BTSCO -->
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_8KHZ" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer CSVoice" value="0" />
+ <ctl name="Voice_Tx Mixer INTERNAL_BT_SCO_TX_Voice" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer Multimedia6" value="0" />
+ <ctl name="MultiMedia6 Mixer TERT_MI2S_TX" value="0" />
+
+ <!-- Voice2 -->
+ <ctl name="PRI_MI2S_RX_Voice Mixer Voice2" value="0" />
+ <ctl name="Voice2_Tx Mixer TERT_MI2S_TX_Voice2" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer Voice2" value="0" />
+ <ctl name="Voice2_Tx Mixer INTERNAL_BT_SCO_TX_Voice2" value="0" />
+ <ctl name="AFE_PCM_RX_Voice Mixer Voice2" value="0" />
+ <ctl name="Voice2_Tx Mixer AFE_PCM_TX_Voice2" value="0" />
+ <!-- Voice2 end -->
+
+ <!-- VoLTE -->
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoLTE" value="0" />
+ <ctl name="VoLTE_Tx Mixer TERT_MI2S_TX_VoLTE" value="0" />
+ <ctl name="HDMI_RX_Voice Mixer VoLTE" value="0" />
+ <ctl name="VoLTE_Tx Mixer SLIM_0_TX_VoLTE" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoLTE" value="0" />
+ <ctl name="VoLTE_Tx Mixer INTERNAL_BT_SCO_TX_VoLTE" value="0" />
+ <ctl name="AFE_PCM_RX_Voice Mixer VoLTE" value="0" />
+ <ctl name="VoLTE_Tx Mixer AFE_PCM_TX_VoLTE" value="0" />
+ <!-- VoLTE end -->
+
+ <!-- VoWLAN -->
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoWLAN" value="0" />
+ <ctl name="VoWLAN_Tx Mixer TERT_MI2S_TX_VoWLAN" value="0" />
+ <ctl name="HDMI_RX_Voice Mixer VoWLAN" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoWLAN" value="0" />
+ <ctl name="VoWLAN_Tx Mixer INTERNAL_BT_SCO_TX_VoWLAN" value="0" />
+ <ctl name="AFE_PCM_RX_Voice Mixer VoWLAN" value="0" />
+ <ctl name="VoWLAN_Tx Mixer AFE_PCM_TX_VoWLAN" value="0" />
+ <!-- VoWLAN -->
+
+ <!-- Multimode Voice1 -->
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="VoiceMMode1_Tx Mixer TERT_MI2S_TX_MMode1" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="VoiceMMode1_Tx Mixer INT_BT_SCO_TX_MMode1" value="0" />
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="VoiceMMode1_Tx Mixer AFE_PCM_TX_MMode1" value="0" />
+ <!-- Multimode Voice1 end -->
+
+ <!-- Multimode Voice2 -->
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="VoiceMMode2_Tx Mixer TERT_MI2S_TX_MMode2" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="VoiceMMode2_Tx Mixer INT_BT_SCO_TX_MMode2" value="0" />
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="VoiceMMode2_Tx Mixer AFE_PCM_TX_MMode2" value="0" />
+ <!-- Multimode Voice2 end -->
+
+ <!-- Voip -->
+ <ctl name="PRI_MI2S_RX_Voice Mixer Voip" value="0" />
+ <ctl name="Voip_Tx Mixer TERT_MI2S_TX_Voip" value="0" />
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_8KHZ" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer Voip" value="0" />
+ <ctl name="Voip_Tx Mixer INTERNAL_BT_SCO_TX_Voip" value="0" />
+ <!-- Voip end -->
+
+ <!-- fm -->
+ <ctl name="Internal FM RX Volume" value="0" />
+ <ctl name="PRI_MI2S_RX Port Mixer INTERNAL_FM_TX" value="0" />
+ <ctl name="MI2S_DL_HL Switch" value="1" />
+ <ctl name="MultiMedia1 Mixer INTERNAL_FM_TX" value="0" />
+ <ctl name="MultiMedia2 Mixer INTERNAL_FM_TX" value="0" />
+ <ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia5" value="0" />
+ <!-- fm end -->
+
+ <!-- RT Proxy Cal -->
+ <ctl name="RT_PROXY_1_RX SetCalMode" value="CAL_MODE_NONE" />
+ <ctl name="RT_PROXY_1_TX SetCalMode" value="CAL_MODE_NONE" />
+ <!-- RT Proxy Cal end -->
+
+ <!-- Incall Recording -->
+ <ctl name="MultiMedia1 Mixer VOC_REC_UL" value="0" />
+ <ctl name="MultiMedia1 Mixer VOC_REC_DL" value="0" />
+ <!-- Incall Recording end -->
+
+ <!-- Incall Music -->
+ <ctl name="Incall_Music Audio Mixer MultiMedia2" value="0" />
+ <ctl name="Incall_Music_2 Audio Mixer MultiMedia9" value="0" />
+ <!-- Incall Music End -->
+
+ <!-- QCHAT -->
+ <ctl name="PRI_MI2S_RX_Voice Mixer QCHAT" value="0" />
+ <ctl name="QCHAT_Tx Mixer TERT_MI2S_TX_QCHAT" value="0" />
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer QCHAT" value="0" />
+ <ctl name="QCHAT_Tx Mixer INTERNAL_BT_SCO_TX_QCHAT" value="0" />
+ <!-- QCHAT End -->
+
+ <!-- EC_REF -->
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="None" />
+
+ <!-- IIR -->
+ <ctl name="IIR1 Band1" id ="0" value="268435456" />
+ <ctl name="IIR1 Band1" id ="1" value="0" />
+ <ctl name="IIR1 Band1" id ="2" value="0" />
+ <ctl name="IIR1 Band1" id ="3" value="0" />
+ <ctl name="IIR1 Band1" id ="4" value="0" />
+ <ctl name="IIR1 Band2" id ="0" value="268435456" />
+ <ctl name="IIR1 Band2" id ="1" value="0" />
+ <ctl name="IIR1 Band2" id ="2" value="0" />
+ <ctl name="IIR1 Band2" id ="3" value="0" />
+ <ctl name="IIR1 Band2" id ="4" value="0" />
+ <ctl name="IIR1 Band3" id ="0" value="268435456" />
+ <ctl name="IIR1 Band3" id ="1" value="0" />
+ <ctl name="IIR1 Band3" id ="2" value="0" />
+ <ctl name="IIR1 Band3" id ="3" value="0" />
+ <ctl name="IIR1 Band3" id ="4" value="0" />
+ <ctl name="IIR1 Band4" id ="0" value="268435456" />
+ <ctl name="IIR1 Band4" id ="1" value="0" />
+ <ctl name="IIR1 Band4" id ="2" value="0" />
+ <ctl name="IIR1 Band4" id ="3" value="0" />
+ <ctl name="IIR1 Band4" id ="4" value="0" />
+ <ctl name="IIR1 Band5" id ="0" value="268435456" />
+ <ctl name="IIR1 Band5" id ="1" value="0" />
+ <ctl name="IIR1 Band5" id ="2" value="0" />
+ <ctl name="IIR1 Band5" id ="3" value="0" />
+ <ctl name="IIR1 Band5" id ="4" value="0" />
+ <ctl name="IIR1 Enable Band1" value="0" />
+ <ctl name="IIR1 Enable Band2" value="0" />
+ <ctl name="IIR1 Enable Band3" value="0" />
+ <ctl name="IIR1 Enable Band4" value="0" />
+ <ctl name="IIR1 Enable Band5" value="0" />
+ <!-- IIR -->
+
+ <!-- ADSP testfwk -->
+ <ctl name="MI2S_DL_HL Switch" value="0" />
+ <!-- ADSP testfwk end-->
+
+ <path name="bt-sco-wb-samplerate">
+ <ctl name="Internal BTSCO SampleRate" value="16000" />
+ </path>
+
+ <!-- These are audio route (FE to BE) specific mixer settings -->
+ <path name="deep-buffer-playback">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="deep-buffer-playback bt-sco" />
+ </path>
+
+ <path name="deep-buffer-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-hdmi">
+ <path name="deep-buffer-playback hdmi" />
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback usb-headphones">
+ <path name="deep-buffer-playback afe-proxy" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-usb-headphones">
+ <path name="deep-buffer-playback usb-headphones" />
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-headphones">
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback transmission-fm">
+ <ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="low-latency-playback">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback speaker-protected">
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="low-latency-playback bt-sco" />
+ </path>
+
+ <path name="low-latency-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-hdmi">
+ <path name="low-latency-playback hdmi" />
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback usb-headphones">
+ <path name="low-latency-playback afe-proxy" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-usb-headphones">
+ <path name="low-latency-playback usb-headphones" />
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-headphones">
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback transmission-fm">
+ <ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="audio-ull-playback">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia3" value="1" />
+ </path>
+
+ <path name="audio-ull-playback speaker-protected">
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback headphones">
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia3" value="1" />
+ </path>
+
+ <path name="audio-ull-playback bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="audio-ull-playback bt-sco" />
+ </path>
+
+ <path name="audio-ull-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia3" value="1" />
+ </path>
+
+ <path name="audio-ull-playback hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia3" value="1" />
+ </path>
+
+ <path name="audio-ull-playback speaker-and-hdmi">
+ <path name="audio-ull-playback hdmi" />
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback usb-headphones">
+ <path name="audio-ull-playback afe-proxy" />
+ </path>
+
+ <path name="audio-ull-playback speaker-and-usb-headphones">
+ <path name="audio-ull-playback usb-headphones" />
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback speaker-and-headphones">
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="compress-offload-playback">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback speaker-protected">
+ <path name="compress-offload-playback" />
+ </path>
+ <path name="compress-offload-playback bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="compress-offload-playback bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-hdmi">
+ <path name="compress-offload-playback hdmi" />
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback usb-headphones">
+ <path name="compress-offload-playback afe-proxy" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-usb-headphones">
+ <path name="compress-offload-playback usb-headphones" />
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-headphones">
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback2">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 usb-headphones">
+ <path name="compress-offload-playback2 afe-proxy" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-hdmi">
+ <path name="compress-offload-playback2 hdmi" />
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-usb-headphones">
+ <path name="compress-offload-playback2 usb-headphones" />
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback2 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-headphones">
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback transmission-fm">
+ <ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 speaker-and-hdmi">
+ <path name="compress-offload-playback3 hdmi" />
+ <path name="compress-offload-playback3" />
+ </path>
+
+ <path name="compress-offload-playback3 speaker-and-headphones">
+ <path name="compress-offload-playback3" />
+ </path>
+
+ <path name="compress-offload-playback4">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 speaker-and-hdmi">
+ <path name="compress-offload-playback4 hdmi" />
+ <path name="compress-offload-playback4" />
+ </path>
+
+ <path name="compress-offload-playback4 speaker-and-headphones">
+ <path name="compress-offload-playback4" />
+ </path>
+
+ <path name="compress-offload-playback5">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 speaker-and-hdmi">
+ <path name="compress-offload-playback5 hdmi" />
+ <path name="compress-offload-playback5" />
+ </path>
+
+ <path name="compress-offload-playback5 speaker-and-headphones">
+ <path name="compress-offload-playback5" />
+ </path>
+
+ <path name="compress-offload-playback6">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 speaker-and-hdmi">
+ <path name="compress-offload-playback6 hdmi" />
+ <path name="compress-offload-playback6" />
+ </path>
+
+ <path name="compress-offload-playback6 speaker-and-headphones">
+ <path name="compress-offload-playback6" />
+ </path>
+
+ <path name="compress-offload-playback7">
+ <ctl name="PRI_MI2S_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 speaker-and-hdmi">
+ <path name="compress-offload-playback7 hdmi" />
+ <path name="compress-offload-playback7" />
+ </path>
+
+ <path name="compress-offload-playback7 speaker-and-headphones">
+ <path name="compress-offload-playback7" />
+ </path>
+
+ <path name="audio-record">
+ <ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="1" />
+ </path>
+
+ <path name="audio-record bt-sco">
+ <ctl name="MultiMedia1 Mixer INTERNAL_BT_SCO_TX" value="1" />
+ </path>
+
+ <path name="audio-record bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="audio-record bt-sco" />
+ </path>
+
+ <path name="audio-record usb-headset-mic">
+ <ctl name="MultiMedia1 Mixer AFE_PCM_TX" value="1" />
+ </path>
+
+ <path name="audio-record capture-fm">
+ <ctl name="MultiMedia1 Mixer INTERNAL_FM_TX" value="1" />
+ </path>
+ <path name="audio-record-compress">
+ <ctl name="MultiMedia8 Mixer TERT_MI2S_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress bt-sco">
+ <ctl name="MultiMedia8 Mixer INTERNAL_BT_SCO_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="16000" />
+ <path name="audio-record-compress bt-sco" />
+ </path>
+
+ <path name="audio-record-compress usb-headset-mic">
+ <ctl name="MultiMedia8 Mixer AFE_PCM_TX" value="1" />
+ </path>
+
+ <path name="low-latency-record">
+ <ctl name="MultiMedia5 Mixer TERT_MI2S_TX" value="1" />
+ </path>
+
+ <path name="low-latency-record bt-sco">
+ <ctl name="MultiMedia5 Mixer INTERNAL_BT_SCO_TX" value="1" />
+ </path>
+
+ <path name="low-latency-record bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="16000" />
+ <path name="low-latency-record bt-sco" />
+ </path>
+
+ <path name="low-latency-record capture-fm">
+ <ctl name="MultiMedia5 Mixer INTERNAL_FM_TX" value="1" />
+ </path>
+
+ <path name="fm-virtual-record capture-fm">
+ <ctl name="MultiMedia2 Mixer INTERNAL_FM_TX" value="1" />
+ </path>
+
+ <path name="voice-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer CSVoice" value="1" />
+ <ctl name="Voice_Tx Mixer TERT_MI2S_TX_Voice" value="1" />
+ </path>
+
+ <path name="voice-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer CSVoice" value="1" />
+ <ctl name="Voice_Tx Mixer INTERNAL_BT_SCO_TX_Voice" value="1" />
+ </path>
+
+ <path name="voice-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="voice-call bt-sco" />
+ </path>
+
+ <path name="voice-call usb-headphones">
+ <ctl name="AFE_PCM_RX_Voice Mixer CSVoice" value="1" />
+ <ctl name="Voice_Tx Mixer AFE_PCM_TX_Voice" value="1" />
+ </path>
+
+ <path name="voice-call afe-proxy">
+ <path name="voice-call usb-headphones" />
+ </path>
+
+ <path name="voice2-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer Voice2" value="1" />
+ <ctl name="Voice2_Tx Mixer TERT_MI2S_TX_Voice2" value="1" />
+ </path>
+
+ <path name="voice2-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer Voice2" value="1" />
+ <ctl name="Voice2_Tx Mixer INTERNAL_BT_SCO_TX_Voice2" value="1" />
+ </path>
+
+ <path name="voice2-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="voice2-call bt-sco" />
+ </path>
+
+ <path name="voice2-call usb-headphones">
+ <ctl name="AFE_PCM_RX_Voice Mixer Voice2" value="1" />
+ <ctl name="Voice2_Tx Mixer AFE_PCM_TX_Voice2" value="1" />
+ </path>
+
+ <path name="voice2-call afe-proxy">
+ <path name="voice2-call usb-headphones" />
+ </path>
+
+ <path name="play-fm">
+ <ctl name="Internal FM RX Volume" value="1" />
+ <ctl name="PRI_MI2S_RX Port Mixer INTERNAL_FM_TX" value="1" />
+ <ctl name="MI2S_DL_HL Switch" value="1" />
+ </path>
+
+ <path name="vowlan-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoWLAN" value="1" />
+ <ctl name="VoWLAN_Tx Mixer TERT_MI2S_TX_VoWLAN" value="1" />
+ </path>
+
+ <path name="vowlan-call hdmi">
+ <ctl name="HDMI_RX_Voice Mixer VoWLAN" value="1" />
+ <ctl name="VoWLAN_Tx Mixer TERT_MI2S_TX_VoWLAN" value="1" />
+ </path>
+
+ <path name="vowlan-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoWLAN" value="1" />
+ <ctl name="VoWLAN_Tx Mixer INTERNAL_BT_SCO_TX_VoWLAN" value="1" />
+ </path>
+
+ <path name="vowlan-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="16000" />
+ <path name="vowlan-call bt-sco" />
+ </path>
+
+ <path name="vowlan-call usb-headphones">
+ <ctl name="AFE_PCM_RX_Voice Mixer VoWLAN" value="1" />
+ <ctl name="VoWLAN_Tx Mixer AFE_PCM_TX_VoWLAN" value="1" />
+ </path>
+
+ <path name="vowlan-call speaker-and-headphones">
+ <path name="vowlan-call" />
+ </path>
+
+ <path name="voicemmode1-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer TERT_MI2S_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer INT_BT_SCO_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="voicemmode1-call bt-sco" />
+ </path>
+
+ <path name="voicemmode1-call usb-headphones">
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer AFE_PCM_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call afe-proxy">
+ <path name="voicemmode1-call usb-headphones" />
+ </path>
+
+ <path name="voicemmode1-call speaker-and-headphones">
+ <path name="voicemmode1-call" />
+ </path>
+
+ <path name="voicemmode2-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer TERT_MI2S_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer INT_BT_SCO_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="voicemmode2-call bt-sco" />
+ </path>
+
+ <path name="voicemmode2-call usb-headphones">
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer AFE_PCM_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call afe-proxy">
+ <path name="voicemmode2-call usb-headphones" />
+ </path>
+
+ <path name="voicemmode2-call speaker-and-headphones">
+ <path name="voicemmode2-call" />
+ </path>
+
+ <path name="hfp-sco">
+ <ctl name="PRI_MI2S_RX Port Mixer INTERNAL_BT_SCO_TX" value="1" />
+ <ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia6" value="1" />
+ <ctl name="MultiMedia6 Mixer TERT_MI2S_TX" value="1" />
+ <ctl name="HFP_INT_UL_HL Switch" value="1" />
+ </path>
+
+ <path name="hfp-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="16000" />
+ <path name="hfp-sco" />
+ </path>
+
+ <path name="incall-rec-uplink">
+ <ctl name="MultiMedia1 Mixer VOC_REC_UL" value="1" />
+ </path>
+
+ <path name="incall-rec-uplink bt-sco">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink bt-sco-wb">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink afe-proxy">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink usb-headset-mic">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink-compress">
+ <ctl name="MultiMedia8 Mixer VOC_REC_UL" value="1" />
+ </path>
+
+ <path name="incall-rec-uplink-compress bt-sco">
+ <path name="incall-rec-uplink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-compress bt-sco-wb">
+ <path name="incall-rec-uplink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-compress usb-headset-mic">
+ <path name="incall-rec-uplink-compress" />
+ </path>
+
+ <path name="incall-rec-downlink">
+ <ctl name="MultiMedia1 Mixer VOC_REC_DL" value="1" />
+ </path>
+
+ <path name="incall-rec-downlink bt-sco">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink bt-sco-wb">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink afe-proxy">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink usb-headset-mic">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink-compress">
+ <ctl name="MultiMedia8 Mixer VOC_REC_DL" value="1" />
+ </path>
+
+ <path name="incall-rec-downlink-compress bt-sco">
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-downlink-compress bt-sco-wb">
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-downlink-compress usb-headset-mic">
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink">
+ <path name="incall-rec-uplink" />
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink bt-sco">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink bt-sco-wb">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink afe-proxy">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress">
+ <path name="incall-rec-uplink-compress" />
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress bt-sco">
+ <path name="incall-rec-uplink-and-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress bt-sco-wb">
+ <path name="incall-rec-uplink-and-downlink-compress" />
+ </path>
+ <path name="incall-rec-uplink-and-downlink usb-headset-mic">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress usb-headset-mic">
+ <path name="incall-rec-uplink-and-downlink-compress" />
+ </path>
+
+ <path name="incall_music_uplink">
+ <ctl name="Incall_Music Audio Mixer MultiMedia2" value="1" />
+ </path>
+
+ <path name="incall_music_uplink bt-sco">
+ <path name="incall_music_uplink" />
+ </path>
+
+ <path name="incall_music_uplink bt-sco-wb">
+ <path name="incall_music_uplink" />
+ </path>
+
+ <path name="incall_music_uplink afe-proxy">
+ <path name="incall_music_uplink" />
+ </path>
+
+ <path name="incall_music_uplink usb-headphones">
+ <path name="incall_music_uplink" />
+ </path>
+ <path name="incall_music_uplink2">
+ <ctl name="Incall_Music_2 Audio Mixer MultiMedia9" value="1" />
+ </path>
+
+ <path name="incall_music_uplink2 bt-sco">
+ <path name="incall_music_uplink2" />
+ </path>
+
+ <path name="incall_music_uplink2 bt-sco-wb">
+ <path name="incall_music_uplink2" />
+ </path>
+
+ <path name="incall_music_uplink2 afe-proxy">
+ <path name="incall_music_uplink2" />
+ </path>
+
+ <path name="incall_music_uplink2 usb-headphones">
+ <path name="incall_music_uplink2" />
+ </path>
+ <path name="volte-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer VoLTE" value="1" />
+ <ctl name="VoLTE_Tx Mixer TERT_MI2S_TX_VoLTE" value="1" />
+ </path>
+
+ <path name="volte-call hdmi">
+ <ctl name="HDMI_RX_Voice Mixer VoLTE" value="1" />
+ <ctl name="VoLTE_Tx Mixer SLIM_0_TX_VoLTE" value="1" />
+ </path>
+
+ <path name="volte-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer VoLTE" value="1" />
+ <ctl name="VoLTE_Tx Mixer INTERNAL_BT_SCO_TX_VoLTE" value="1" />
+ </path>
+
+ <path name="volte-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="volte-call bt-sco" />
+ </path>
+
+ <path name="volte-call usb-headphones">
+ <ctl name="AFE_PCM_RX_Voice Mixer VoLTE" value="1" />
+ <ctl name="VoLTE_Tx Mixer AFE_PCM_TX_VoLTE" value="1" />
+ </path>
+
+ <path name="volte-call afe-proxy">
+ <path name="volte-call usb-headphones" />
+ </path>
+
+ <path name="compress-voip-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer TERT_MI2S_TX_Voip" value="1" />
+ </path>
+
+ <path name="compress-voip-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer INTERNAL_BT_SCO_TX_Voip" value="1" />
+ </path>
+
+ <path name="compress-voip-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="compress-voip-call bt-sco" />
+ </path>
+
+ <path name="afe-proxy-playback afe-proxy">
+ </path>
+
+ <path name="afe-proxy-record afe-proxy">
+ </path>
+
+ <path name="compress-voip-call afe-proxy">
+ <ctl name="AFE_PCM_RX_Voice Mixer Voip" value='1' />
+ <ctl name="Voip_Tx Mixer AFE_PCM_TX_Voip" value='1' />
+ </path>
+
+ <path name="compress-voip-call speaker-and-headphones">
+ <path name="compress-voip-call" />
+ </path>
+
+ <path name="qchat-call">
+ <ctl name="PRI_MI2S_RX_Voice Mixer QCHAT" value="1" />
+ <ctl name="QCHAT_Tx Mixer TERT_MI2S_TX_QCHAT" value="1" />
+ </path>
+
+ <path name="qchat-call bt-sco">
+ <ctl name="INTERNAL_BT_SCO_RX_Voice Mixer QCHAT" value="1" />
+ <ctl name="QCHAT_Tx Mixer INTERNAL_BT_SCO_TX_QCHAT" value="1" />
+ </path>
+
+ <path name="qchat-call bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="qchat-call bt-sco" />
+ </path>
+
+ <path name="multi-channel-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="1" />
+ </path>
+
+ <path name="multi-channel-playback hdmi">
+ <ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia2" value="1" />
+ </path>
+
+ <!-- These are actual sound device specific mixer settings -->
+ <path name="adc1">
+ <ctl name="ADC1 Volume" value="6" />
+ <ctl name="DEC1 MUX" value="ADC1" />
+ <ctl name="ADC1_INP1 Switch" value="1" />
+ </path>
+
+ <path name="adc2">
+ <ctl name="ADC2 Volume" value="6" />
+ <ctl name="DEC1 MUX" value="ADC2" />
+ </path>
+
+ <path name="adc3">
+ <ctl name="ADC3 Volume" value="6" />
+ <ctl name="DEC1 MUX" value="ADC2" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ </path>
+
+ <path name="hdmi">
+ </path>
+
+ <path name="speaker">
+ <ctl name="RX3 MIX1 INP1" value="RX1" />
+ <ctl name="SPK" value="Switch" />
+ </path>
+
+ <path name="speaker-and-hdmi">
+ <path name="speaker" />
+ <path name="hdmi" />
+ </path>
+
+ <path name="wsa-speaker">
+ <ctl name="RX3 MIX1 INP1" value="RX1" />
+ <ctl name="RX3 Digital Volume" value="84" />
+ <ctl name="LINE_OUT" value="Switch" />
+ <ctl name="SpkrMono WSA_RDAC" value="Switch" />
+ </path>
+
+ <path name="spkr-rx-calib">
+ <ctl name="PRI_MI2S_RX_DL_HL Switch" value="1" />
+ </path>
+
+ <path name="vi-feedback">
+ </path>
+
+ <path name="spkr-vi-record">
+ <ctl name="PRI_MI2S_RX_VI_FB_MUX" value="SENARY_TX" />
+ </path>
+
+ <path name="speaker-protected">
+ <ctl name="DEC3 MUX" value="DMIC3" />
+ <ctl name="DEC4 MUX" value="DMIC4" />
+ <path name="wsa-speaker" />
+ <ctl name="PRI_MI2S_RX_VI_FB_MUX" value="SENARY_TX" />
+ <ctl name="SpkrMono VISENSE Switch" value="1" />
+ </path>
+
+ <path name="voice-speaker-protected">
+ <path name="speaker-protected" />
+ </path>
+
+ <path name="speaker-mic">
+ <path name="adc1" />
+ <ctl name="IIR1 INP1 MUX" value="DEC1" />
+ </path>
+
+ <path name="handset">
+ <ctl name="RX1 MIX1 INP1" value="RX1" />
+ <ctl name="RDAC2 MUX" value="RX1" />
+ <ctl name="RX1 Digital Volume" value="84" />
+ <ctl name="EAR PA Gain" value="POS_6_DB" />
+ <ctl name="EAR_S" value="Switch" />
+ </path>
+
+ <path name="handset-mic">
+ <path name="adc1" />
+ <ctl name="IIR1 INP1 MUX" value="DEC1" />
+ </path>
+
+ <path name="headphones">
+ <ctl name="MI2S_RX Channels" value="Two" />
+ <ctl name="RX1 MIX1 INP1" value="RX1" />
+ <ctl name="RX2 MIX1 INP1" value="RX2" />
+ <ctl name="RDAC2 MUX" value="RX2" />
+ <ctl name="HPHL" value="Switch" />
+ <ctl name="HPHR" value="Switch" />
+ </path>
+
+ <path name="headset-mic">
+ <path name="adc2" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ <ctl name="IIR1 INP1 MUX" value="DEC1" />
+ </path>
+
+ <path name="sidetone-iir">
+ <ctl name="IIR1 Enable Band1" value="1" />
+ <ctl name="IIR1 Enable Band2" value="1" />
+ <ctl name="IIR1 Enable Band3" value="1" />
+ <ctl name="IIR1 Enable Band4" value="1" />
+ <ctl name="IIR1 Enable Band5" value="1" />
+ </path>
+
+ <path name="sidetone-handset">
+ <path name="sidetone-iir" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="RX1 MIX2 INP1" value="IIR1" />
+ </path>
+
+ <path name="sidetone-headphones">
+ <path name="sidetone-iir" />
+ <ctl name="RX1 MIX2 INP1" value="IIR1" />
+ <ctl name="RX2 MIX2 INP1" value="IIR1" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ </path>
+
+
+ <path name="voice-handset">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-speaker">
+ <path name="speaker" />
+ </path>
+
+ <path name="wsa-voice-speaker">
+ <path name="wsa-speaker" />
+ </path>
+
+ <path name="voice-speaker-mic">
+ <path name="speaker-mic" />
+ </path>
+
+ <path name="voice-headphones">
+ <path name="headphones" />
+ </path>
+
+ <path name="voice-headset-mic">
+ <path name="headset-mic" />
+ </path>
+
+ <path name="speaker-and-headphones">
+ <path name="speaker" />
+ <path name="headphones" />
+ </path>
+
+ <path name="wsa-speaker-and-headphones">
+ <path name="wsa-speaker" />
+ <path name="headphones" />
+ </path>
+
+ <path name="usb-headphones">
+ </path>
+
+ <path name="afe-proxy">
+ </path>
+
+ <path name="transmission-fm">
+ </path>
+
+ <path name="speaker-and-usb-headphones">
+ <path name="speaker" />
+ <path name="usb-headphones" />
+ </path>
+
+ <path name="wsa-speaker-and-usb-headphones">
+ <path name="wsa-speaker" />
+ <path name="usb-headphones" />
+ </path>
+
+ <path name="voice-rec-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="camcorder-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="bt-sco-headset">
+ </path>
+
+ <path name="bt-sco-mic">
+ </path>
+
+ <path name="bt-sco-headset-wb">
+ </path>
+
+ <path name="bt-sco-mic-wb">
+ </path>
+ <path name="usb-headset-mic">
+ </path>
+
+ <path name="capture-fm">
+ </path>
+
+ <!-- Dual MIC devices -->
+ <path name="speaker-dmic-endfire">
+ <path name="adc1" />
+ <ctl name="ADC3 Volume" value="6" />
+ <ctl name="DEC2 MUX" value="ADC2" />
+ <ctl name="MI2S_TX Channels" value="Two" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ </path>
+
+ <path name="dmic-endfire">
+ <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="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="handset-stereo-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="speaker-dmic-broadside">
+ <path name="adc1" />
+ <ctl name="ADC3 Volume" value="6" />
+ <ctl name="DEC2 MUX" value="ADC2" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="MI2S_TX Channels" value="Two" />
+ </path>
+
+ <path name="dmic-broadside">
+ <path name="speaker-dmic-broadside" />
+ </path>
+
+ <path name="voice-speaker-dmic-broadside">
+ <path name="dmic-broadside"/>
+ </path>
+
+ <path name="echo-reference">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="I2S_RX" />
+ </path>
+
+ <!-- TTY devices -->
+
+ <path name="tty-headphones">
+ <ctl name="RX1 MIX1 INP1" value="RX1" />
+ <ctl name="HPHL" value="Switch" />
+ </path>
+
+ <path name="voice-tty-full-headphones">
+ <ctl name="TTY Mode" value="FULL" />
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-vco-headphones">
+ <ctl name="TTY Mode" value="VCO" />
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-hco-handset">
+ <ctl name="TTY Mode" value="HCO" />
+ <path name="handset" />
+ </path>
+
+ <path name="voice-tty-full-headset-mic">
+ <path name="adc2" />
+ <ctl name="ADC2 MUX" value="INP2" />
+ </path>
+
+ <path name="voice-tty-hco-headset-mic">
+ <path name="voice-tty-full-headset-mic" />
+ </path>
+
+ <path name="voice-tty-vco-handset-mic">
+ <path name="adc1" />
+ </path>
+
+ <path name="unprocessed-handset-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="unprocessed-mic">
+ <path name="unprocessed-handset-mic" />
+ </path>
+
+ <path name="ADSP testfwk">
+ <ctl name="MI2S_DL_HL Switch" value="1" />
+ </path>
+
+ <path name="voice-rx">
+ </path>
+
+ <path name="voice-tx">
+ </path>
+
+ <path name="line">
+ <path name="headphones" />
+ </path>
+
+ <path name="voice-line">
+ <path name="voice-headphones" />
+ </path>
+
+ <path name="speaker-and-line">
+ <path name="speaker-and-headphones" />
+ </path>
+
+ <path name="wsa-speaker-and-line">
+ <path name="wsa-speaker-and-headphones" />
+ </path>
+
+</mixer>
diff --git a/configs/msm8937/msm8937.mk b/configs/msm8937/msm8937.mk
index 7e71e79..d2a0a15 100644
--- a/configs/msm8937/msm8937.mk
+++ b/configs/msm8937/msm8937.mk
@@ -80,6 +80,7 @@
hardware/qcom/audio/configs/msm8937/audio_output_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_output_policy.conf\
hardware/qcom/audio/configs/msm8937/audio_effects.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.conf\
hardware/qcom/audio/configs/msm8937/mixer_paths_mtp.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_mtp.xml \
+hardware/qcom/audio/configs/msm8937/mixer_paths_sdm439_pm8953.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_sdm439_pm8953.xml \
hardware/qcom/audio/configs/msm8937/mixer_paths_qrd_skuh.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_qrd_skuh.xml \
hardware/qcom/audio/configs/msm8937/mixer_paths_qrd_skui.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_qrd_skui.xml \
hardware/qcom/audio/configs/msm8937/mixer_paths_qrd_skuhf.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_qrd_skuhf.xml \
diff --git a/configs/msm8937/sound_trigger_platform_info.xml b/configs/msm8937/sound_trigger_platform_info.xml
index 28026f7..0d722fb 100644
--- a/configs/msm8937/sound_trigger_platform_info.xml
+++ b/configs/msm8937/sound_trigger_platform_info.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. -->
+<!--- Copyright (c) 2013-2016, 2018 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 -->
@@ -29,7 +29,6 @@
<param version="0x0101" /> <!-- this must be the first param -->
<common_config>
- <param execution_type="APE" /> <!-- value: "CPE" "APE" -->
<param max_cpe_sessions="1" />
<param max_ape_sessions="5" />
<param enable_failure_detection="false" />
@@ -48,6 +47,7 @@
<!-- configuration. ISV must use their own unique vendor_uuid. -->
<sound_model_config>
<param vendor_uuid="68ab2d40-e860-11e3-95ef-0002a5d5c51b" />
+ <param execution_type="ADSP" /> <!-- value: "WDSP" "ADSP" "DYNAMIC" -->
<param app_type="2" /> <!-- app type used in ACDB -->
<param library="libsmwrapper.so" />
<param max_cpe_phrases="6" />
@@ -57,10 +57,13 @@
<param sample_rate="16000" />
<!-- Module and param ids with which the algorithm is integrated in firmware -->
- <param load_sound_model_ids="0x00012C0D, 0x00012C14" />
- <param unload_sound_model_ids="0x00012C0D, 0x00012C15" />
- <param confidence_levels_ids="0x00012C0D, 0x00012C07" />
- <param operation_mode_ids="0x00012C0D, 0x00012C02" />
+ <lsm_usecase>
+ <param execution_mode="ADSP" />
+ <param load_sound_model_ids="0x00012C0D, 0x00012C14" />
+ <param unload_sound_model_ids="0x00012C0D, 0x00012C15" />
+ <param confidence_levels_ids="0x00012C0D, 0x00012C07" />
+ <param operation_mode_ids="0x00012C0D, 0x00012C02" />
+ </lsm_usecase>
<!-- format: "ADPCM_packet" or "PCM_packet" !-->
<!-- transfer_mode: "FTRT" or "RT" -->
diff --git a/configs/msm8953/audio_platform_info_extcodec.xml b/configs/msm8953/audio_platform_info_extcodec.xml
index ac0eabc..ba2dfe6 100644
--- a/configs/msm8953/audio_platform_info_extcodec.xml
+++ b/configs/msm8953/audio_platform_info_extcodec.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- Copyright (c) 2015-2016 The Linux Foundation. All rights reserved. -->
+<!-- Copyright (c) 2015-2016, 2018, 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 -->
@@ -25,6 +25,13 @@
<!-- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -->
<!-- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
<audio_platform_info>
+ <acdb_ids>
+ <device name="SND_DEVICE_IN_HANDSET_QMIC" acdb_id="140"/>
+ <device name="SND_DEVICE_IN_HANDSET_6MIC" acdb_id="140"/>
+ <device name="SND_DEVICE_IN_HANDSET_8MIC" acdb_id="140"/>
+ <device name="SND_DEVICE_IN_EC_REF_LOOPBACK_MONO" acdb_id="140"/>
+ <device name="SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO" acdb_id="140"/>
+ </acdb_ids>
<bit_width_configs>
<device name="SND_DEVICE_OUT_SPEAKER" bit_width="24"/>
</bit_width_configs>
@@ -50,12 +57,16 @@
<usecase name="USECASE_AUDIO_SPKR_CALIB_TX" type="in" id="37"/>
<usecase name="USECASE_QCHAT_CALL" type="in" id="42"/>
<usecase name="USECASE_QCHAT_CALL" type="out" id="42"/>
+ <usecase name="USECASE_AUDIO_EC_REF_LOOPBACK" type="in" id="14"/>
+ <usecase name="USECASE_AUDIO_PLAYBACK_SILENCE" type="out" id="14"/>
</pcm_ids>
<config_params>
<param key="spkr_1_tz_name" value="wsatz.11"/>
<param key="spkr_2_tz_name" value="wsatz.12"/>
<param key="native_audio_mode" value="src"/>
- <param key="input_mic_max_count" value="4"/>
+ <param key="input_mic_max_count" value="6"/>
+ <param key="ffv_split_ec_ref_data" value="false"/>
+ <param key="ffv_ec_ref_channel_count" value="1"/>
</config_params>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="SLIMBUS_6_RX"/>
diff --git a/configs/msm8953/mixer_paths_mtp.xml b/configs/msm8953/mixer_paths_mtp.xml
index d20dda4..a7f4e21 100644
--- a/configs/msm8953/mixer_paths_mtp.xml
+++ b/configs/msm8953/mixer_paths_mtp.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
- Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
+ Copyright (c) 2015-2016, 2018, 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
@@ -1172,6 +1172,11 @@
<path name="headphones" />
</path>
+ <path name="voice-speaker-and-voice-headphones">
+ <path name="wsa-voice-speaker" />
+ <path name="voice-headphones" />
+ </path>
+
<path name="voice-headset-mic">
<path name="headset-mic" />
</path>
diff --git a/configs/msm8953/mixer_paths_wcd9335.xml b/configs/msm8953/mixer_paths_wcd9335.xml
index 1eb65b9..db68041 100644
--- a/configs/msm8953/mixer_paths_wcd9335.xml
+++ b/configs/msm8953/mixer_paths_wcd9335.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- Copyright (c) 2015-16, The Linux Foundation. All rights reserved. -->
+<!-- Copyright (c) 2015-16, 2018, 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 -->
@@ -569,6 +569,11 @@
<ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia1" value="1" />
</path>
+ <path name="silence-playback">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia9" value="1" />
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+ </path>
+
<path name="deep-buffer-playback speaker-protected">
<path name="deep-buffer-playback" />
</path>
@@ -2483,4 +2488,96 @@
<path name="speaker-and-headphones" />
</path>
+ <path name="ec-ref-audio-capture">
+ <ctl name="MultiMedia9 Mixer AFE_LOOPBACK_TX" value="1" />
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+ </path>
+
+ <path name="handset-6mic">
+ <ctl name="AIF1_CAP Mixer SLIM TX1" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX2" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX3" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX4" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Six" />
+ <ctl name="SLIM TX1 MUX" value="DEC1" />
+ <ctl name="ADC MUX1" value="DMIC" />
+ <ctl name="DMIC MUX1" value="DMIC2" />
+ <ctl name="DEC1 Volume" value="96" />
+ <ctl name="SLIM TX2 MUX" value="DEC2" />
+ <ctl name="ADC MUX2" value="DMIC" />
+ <ctl name="DMIC MUX2" value="DMIC1" />
+ <ctl name="DEC2 Volume" value="96" />
+ <ctl name="SLIM TX3 MUX" value="DEC3" />
+ <ctl name="ADC MUX3" value="DMIC" />
+ <ctl name="DMIC MUX3" value="DMIC5" />
+ <ctl name="DEC3 Volume" value="96" />
+ <ctl name="SLIM TX4 MUX" value="DEC4" />
+ <ctl name="ADC MUX4" value="DMIC" />
+ <ctl name="DMIC MUX4" value="DMIC0" />
+ <ctl name="DEC4 Volume" value="96" />
+ <ctl name="SLIM TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC4" />
+ <ctl name="DEC5 Volume" value="96" />
+ <ctl name="SLIM TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC3" />
+ <ctl name="DEC6 Volume" value="96" />
+ </path>
+
+ <path name="handset-8mic">
+ <ctl name="AIF1_CAP Mixer SLIM TX1" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX2" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX3" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX4" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Eight" />
+ <ctl name="SLIM TX1 MUX" value="DEC1" />
+ <ctl name="ADC MUX1" value="DMIC" />
+ <ctl name="DMIC MUX1" value="DMIC2" />
+ <ctl name="DEC1 Volume" value="96" />
+ <ctl name="SLIM TX2 MUX" value="DEC2" />
+ <ctl name="ADC MUX2" value="DMIC" />
+ <ctl name="DMIC MUX2" value="DMIC1" />
+ <ctl name="DEC2 Volume" value="96" />
+ <ctl name="SLIM TX3 MUX" value="DEC3" />
+ <ctl name="ADC MUX3" value="DMIC" />
+ <ctl name="DMIC MUX3" value="DMIC5" />
+ <ctl name="DEC3 Volume" value="96" />
+ <ctl name="SLIM TX4 MUX" value="DEC4" />
+ <ctl name="ADC MUX4" value="DMIC" />
+ <ctl name="DMIC MUX4" value="DMIC0" />
+ <ctl name="DEC4 Volume" value="96" />
+ <ctl name="SLIM TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC4" />
+ <ctl name="DEC5 Volume" value="96" />
+ <ctl name="SLIM TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC3" />
+ <ctl name="DEC6 Volume" value="96" />
+
+ <ctl name="SLIM TX7 MUX" value="RX_MIX_TX7"/>
+ <ctl name="RX MIX TX7 MUX" value="RX_MIX7"/>
+ <ctl name="SLIM TX8 MUX" value="RX_MIX_TX8"/>
+ <ctl name="RX MIX TX8 MUX" value="RX_MIX8"/>
+ </path>
+
+ <path name="ec-ref-loopback-mono">
+ </path>
+
+ <path name="ec-ref-loopback-stereo">
+ </path>
+
+ <path name="ec-ref-loopback-mono lineout">
+ </path>
+
+ <path name="ec-ref-loopback-stereo lineout">
+ </path>
+
</mixer>
diff --git a/configs/msm8953/msm8953.mk b/configs/msm8953/msm8953.mk
index d586808..c9a9746 100644
--- a/configs/msm8953/msm8953.mk
+++ b/configs/msm8953/msm8953.mk
@@ -34,6 +34,10 @@
USE_XML_AUDIO_POLICY_CONF := 1
BOARD_SUPPORTS_SOUND_TRIGGER := true
+BOARD_SUPPORTS_SOUND_TRIGGER_ARM := true
+AUDIO_FEATURE_ENABLED_FFV := true
+AUDIO_FEATURE_ENABLED_KEEP_ALIVE_ARM_FFV := true
+AUDIO_FEATURE_ENABLED_KEEP_ALIVE := true
AUDIO_USE_LL_AS_PRIMARY_OUTPUT := true
AUDIO_FEATURE_ENABLED_HIFI_AUDIO := true
AUDIO_FEATURE_ENABLED_VBAT_MONITOR := true
@@ -124,7 +128,10 @@
PRODUCT_PROPERTY_OVERRIDES += \
vendor.audio_hal.period_size=192
-##fluencetype can be "fluence" or "fluencepro" or "none"
+PRODUCT_PROPERTY_OVERRIDES += \
+ro.vendor.audio.sdk.ffv=false
+
+##fluencetype can be "fluence" or "fluencepro" or "fluenceffv" or "none"
PRODUCT_PROPERTY_OVERRIDES += \
ro.vendor.audio.sdk.fluencetype=none\
persist.vendor.audio.fluence.voicecall=true\
diff --git a/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml b/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
index c1b6097..5fad947 100644
--- a/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+<!--- Copyright (c) 2015-2018, 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
@@ -53,23 +53,54 @@
<ctl name="AIF4_MAD Mixer SLIM TX12" value="0" />
<ctl name="AIF4_MAD Mixer SLIM TX13" value="0" />
<ctl name="CPE AFE MAD Enable" value="0"/>
+ <ctl name="SLIM TX8 MUX" value="ZERO" />
+ <ctl name="SLIM TX7 MUX" value="ZERO" />
+ <ctl name="SLIM TX6 MUX" value="ZERO" />
+ <ctl name="SLIM TX5 MUX" value="ZERO" />
+ <ctl name="SLIM TX4 MUX" value="ZERO" />
+ <ctl name="SLIM TX3 MUX" value="ZERO" />
+ <ctl name="SLIM TX2 MUX" value="ZERO" />
+ <ctl name="SLIM TX1 MUX" value="ZERO" />
<ctl name="CLK MODE" value="EXTERNAL" />
<ctl name="EC BUF MUX INP" value="ZERO" />
<ctl name="ADC MUX1" value="DMIC" />
<ctl name="DMIC MUX1" value="ZERO" />
+ <ctl name="ADC MUX1" value="AMIC" />
+ <ctl name="ADC MUX2" value="AMIC" />
+ <ctl name="ADC MUX3" value="AMIC" />
+ <ctl name="ADC MUX4" value="AMIC" />
<ctl name="ADC MUX5" value="AMIC" />
<ctl name="ADC MUX6" value="AMIC" />
<ctl name="ADC MUX7" value="AMIC" />
<ctl name="ADC MUX8" value="AMIC" />
+ <ctl name="DMIC MUX1" value="ZERO" />
+ <ctl name="DMIC MUX2" value="ZERO" />
+ <ctl name="DMIC MUX3" value="ZERO" />
+ <ctl name="DMIC MUX4" value="ZERO" />
<ctl name="DMIC MUX5" value="ZERO" />
<ctl name="DMIC MUX6" value="ZERO" />
<ctl name="DMIC MUX7" value="ZERO" />
<ctl name="DMIC MUX8" value="ZERO" />
+ <ctl name="RX MIX TX7 MUX" value="ZERO" />
+ <ctl name="RX MIX TX8 MUX" value="ZERO" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="SLIM_2_TX Channels" value="One" />
<ctl name="IIR0 INP0 MUX" value="ZERO" />
+ <ctl name="AIF1_CAP Mixer SLIM TX1" value="0" />
+ <ctl name="AIF1_CAP Mixer SLIM TX2" value="0" />
+ <ctl name="AIF1_CAP Mixer SLIM TX3" value="0" />
+ <ctl name="AIF1_CAP Mixer SLIM TX4" value="0" />
<ctl name="AIF1_CAP Mixer SLIM TX5" value="0" />
<ctl name="AIF1_CAP Mixer SLIM TX6" value="0" />
<ctl name="AIF1_CAP Mixer SLIM TX7" value="0" />
<ctl name="AIF1_CAP Mixer SLIM TX8" value="0" />
+ <ctl name="AIF4_CAP Mixer SLIM TX8" value="0" />
+ <ctl name="AIF4_CAP Mixer SLIM TX7" value="0" />
+ <ctl name="MultiMedia9 Mixer AFE_LOOPBACK_TX" value="0" />
+
+ <ctl name="MultiMedia2 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia9 Mixer SLIM_2_TX" value="0" />
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="None"/>
<path name="listen-voice-wakeup-1">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
@@ -161,6 +192,15 @@
<ctl name="LSM8 Mixer SLIMBUS_0_TX" value="1" />
</path>
+ <path name="audio-capture">
+ <ctl name="MultiMedia2 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="ec-ref-audio-capture">
+ <ctl name="MultiMedia9 Mixer AFE_LOOPBACK_TX" value="1" />
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+ </path>
+
<path name="listen-cpe-handset-mic">
<ctl name="MADONOFF Switch" value="1" />
<ctl name="TX13 INP MUX" value="CPE_TX_PP" />
@@ -248,6 +288,117 @@
<ctl name="DMIC MUX7" value="DMIC4" />
</path>
+ <path name="listen-handset-qmic">
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Four" />
+ <ctl name="SLIM TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC0" />
+ <ctl name="DEC5 Volume" value="96" />
+ <ctl name="SLIM TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC2" />
+ <ctl name="DEC6 Volume" value="96" />
+ <ctl name="SLIM TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC1" />
+ <ctl name="DEC7 Volume" value="96" />
+ <ctl name="SLIM TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC3" />
+ <ctl name="DEC8 Volume" value="96" />
+ </path>
+
+ <path name="listen-handset-6mic">
+ <ctl name="AIF1_CAP Mixer SLIM TX1" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX2" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX3" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX4" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Six" />
+ <ctl name="SLIM TX1 MUX" value="DEC1" />
+ <ctl name="ADC MUX1" value="DMIC" />
+ <ctl name="DMIC MUX1" value="DMIC2" />
+ <ctl name="DEC1 Volume" value="96" />
+ <ctl name="SLIM TX2 MUX" value="DEC2" />
+ <ctl name="ADC MUX2" value="DMIC" />
+ <ctl name="DMIC MUX2" value="DMIC1" />
+ <ctl name="DEC2 Volume" value="96" />
+ <ctl name="SLIM TX3 MUX" value="DEC3" />
+ <ctl name="ADC MUX3" value="DMIC" />
+ <ctl name="DMIC MUX3" value="DMIC5" />
+ <ctl name="DEC3 Volume" value="96" />
+ <ctl name="SLIM TX4 MUX" value="DEC4" />
+ <ctl name="ADC MUX4" value="DMIC" />
+ <ctl name="DMIC MUX4" value="DMIC0" />
+ <ctl name="DEC4 Volume" value="96" />
+ <ctl name="SLIM TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC4" />
+ <ctl name="DEC5 Volume" value="96" />
+ <ctl name="SLIM TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC3" />
+ <ctl name="DEC6 Volume" value="96" />
+ </path>
+
+ <path name="listen-handset-8mic">
+ <ctl name="AIF1_CAP Mixer SLIM TX1" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX2" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX3" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX4" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Eight" />
+ <ctl name="SLIM TX1 MUX" value="DEC1" />
+ <ctl name="ADC MUX1" value="DMIC" />
+ <ctl name="DMIC MUX1" value="DMIC2" />
+ <ctl name="DEC1 Volume" value="96" />
+ <ctl name="SLIM TX2 MUX" value="DEC2" />
+ <ctl name="ADC MUX2" value="DMIC" />
+ <ctl name="DMIC MUX2" value="DMIC1" />
+ <ctl name="DEC2 Volume" value="96" />
+ <ctl name="SLIM TX3 MUX" value="DEC3" />
+ <ctl name="ADC MUX3" value="DMIC" />
+ <ctl name="DMIC MUX3" value="DMIC5" />
+ <ctl name="DEC3 Volume" value="96" />
+ <ctl name="SLIM TX4 MUX" value="DEC4" />
+ <ctl name="ADC MUX4" value="DMIC" />
+ <ctl name="DMIC MUX4" value="DMIC0" />
+ <ctl name="DEC4 Volume" value="96" />
+ <ctl name="SLIM TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC4" />
+ <ctl name="DEC5 Volume" value="96" />
+ <ctl name="SLIM TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC3" />
+ <ctl name="DEC6 Volume" value="96" />
+
+ <ctl name="SLIM TX7 MUX" value="RX_MIX_TX7"/>
+ <ctl name="RX MIX TX7 MUX" value="RX_MIX7"/>
+ <ctl name="SLIM TX8 MUX" value="RX_MIX_TX8"/>
+ <ctl name="RX MIX TX8 MUX" value="RX_MIX8"/>
+ </path>
+
+ <path name="ec-ref-loopback-mono">
+ </path>
+
+ <path name="ec-ref-loopback-stereo">
+ </path>
+
+ <path name="ec-ref-loopback-mono lineout">
+ </path>
+
+ <path name="ec-ref-loopback-stereo lineout">
+ </path>
+
<path name="echo-reference">
<ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
<ctl name="EC Reference Channels" value="Two"/>
diff --git a/configs/msm8953/sound_trigger_platform_info.xml b/configs/msm8953/sound_trigger_platform_info.xml
index a1f70a0..a9e1387 100644
--- a/configs/msm8953/sound_trigger_platform_info.xml
+++ b/configs/msm8953/sound_trigger_platform_info.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. -->
+<!--- Copyright (c) 2013-2018, 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 -->
@@ -29,7 +29,6 @@
<param version="0x0101" /> <!-- this must be the first param -->
<common_config>
- <param execution_type="APE" /> <!-- value: "CPE" "APE" -->
<param max_cpe_sessions="1" />
<param max_ape_sessions="5" />
<param enable_failure_detection="false" />
@@ -42,6 +41,14 @@
<param backend_dai_name="TERT_MI2S_TX" /-->
<param backend_port_name="SLIM_0_TX" />
<param backend_dai_name="SLIMBUS_0_TX" />
+ <param sw_mad="false"/>
+ <!-- Enable concurrent VA & audio capture excluding voip/voice call -->
+ <!-- using concurrent_capture param. -->
+ <!-- Enable VA & voip/voice call concurrency using concurrent_capture -->
+ <!-- param along with concurrent_voip_call/concurrent_voice_call params -->
+ <param concurrent_capture="false" />
+ <param concurrent_voip_call="false" />
+ <param concurrent_voice_call="false" />
</common_config>
<acdb_ids>
@@ -54,6 +61,8 @@
<param DEVICE_HANDSET_QMIC_APE="150" />
<param DEVICE_HANDSET_DMIC_APE="149" />
<param DEVICE_HANDSET_TMIC_APE="152" />
+ <param DEVICE_HANDSET_6MIC_ARM="140" />
+ <param DEVICE_HANDSET_8MIC_ARM="140" />
</acdb_ids>
<!-- Multiple sound_model_config tags can be listed, each with unique -->
@@ -61,33 +70,58 @@
<!-- configuration. ISV must use their own unique vendor_uuid. -->
<sound_model_config>
<param vendor_uuid="68ab2d40-e860-11e3-95ef-0002a5d5c51b" />
+ <param execution_type="ADSP" /> <!-- value: "WDSP" "ADSP" "DYNAMIC" -->
<param app_type="2" /> <!-- app type used in ACDB -->
<param library="libsmwrapper.so" />
<param max_cpe_phrases="6" />
<param max_cpe_users="3" />
<param max_ape_phrases="10" />
<param max_ape_users="10" />
- <param sample_rate="16000" />
- <param bit_width="16" />
- <param channel_count="1"/>
- <!-- adm_cfg_profile should match with the one defined under adm_config -->
- <!-- Set it to NONE if LSM directly connects to AFE -->
- <param adm_cfg_profile="NONE" />
- <!-- fluence_type: "FLUENCE", "FLUENCE_DMIC", "FLUENCE_TMIC", -->
- <!-- "FLUENCE_QMIC". param value is valid when adm_cfg_profile="FLUENCE"-->
- <param fluence_type="NONE" />
+ <param event_timestamp_mode="false" />
<!-- Module and param ids with which the algorithm is integrated in firmware -->
- <param load_sound_model_ids="0x00012C0D, 0x00012C14" />
- <param unload_sound_model_ids="0x00012C0D, 0x00012C15" />
- <param confidence_levels_ids="0x00012C0D, 0x00012C07" />
- <param operation_mode_ids="0x00012C0D, 0x00012C02" />
+ <lsm_usecase>
+ <param execution_mode="ADSP" />
+ <param load_sound_model_ids="0x00012C0D, 0x00012C14" />
+ <param unload_sound_model_ids="0x00012C0D, 0x00012C15" />
+ <param confidence_levels_ids="0x00012C0D, 0x00012C07" />
+ <param operation_mode_ids="0x00012C0D, 0x00012C02" />
+ </lsm_usecase>
<!-- format: "ADPCM_packet" or "PCM_packet" !-->
<!-- transfer_mode: "FTRT" or "RT" -->
<!-- kw_duration is in milli seconds. It is valid only for FTRT transfer mode -->
<param capture_keyword="PCM_packet, RT, 2000" />
<param client_capture_read_delay="2000" />
+
+ <!-- Profile specific data which the algorithm can support -->
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1"/>
+ <!-- adm_cfg_profile should match with the one defined under adm_config -->
+ <!-- Set it to NONE if LSM directly connects to AFE -->
+ <param adm_cfg_profile="NONE" />
+ <!-- fluence_type: "FLUENCE", FLUENCE_DMIC", FLUENCE_QMIC" -->
+ <!-- param value is valid when profile type is fluence -->
+ <param fluence_type="FLUENCE_QMIC" />
+ </sound_model_config>
+
+ <!-- ARM based SVA sound_model_config -->
+ <sound_model_config>
+ <param vendor_uuid="67fabb70-79e8-4e1c-a202-bcb050243a70" />
+ <param execution_type="ARM" />
+ <!-- ec reference loopback params -->
+ <!-- split_ec_ref_data - true if ec ref is packed with mic captured data -->
+ <param split_ec_ref_data="false"/>
+ <param ec_ref_channel_count="1"/>
+
+ <!-- Profile specific data which the algorithm can support -->
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="6"/>
+ <!-- adm_cfg_profile should match with the one defined under adm_config -->
+ <!-- Set it to NONE if LSM directly connects to AFE -->
+ <param adm_cfg_profile="DEFAULT" />
</sound_model_config>
<!-- Multiple adm_config tags can be listed, each with unique profile name. -->
@@ -105,6 +139,4 @@
<param sample_rate="16000" />
<param bit_width="16" />
</adm_config>
-
</sound_trigger_platform_info>
-
diff --git a/configs/sdm660/audio_policy_configuration.xml b/configs/sdm660/audio_policy_configuration.xml
index f0528c6..5cb77df 100644
--- a/configs/sdm660/audio_policy_configuration.xml
+++ b/configs/sdm660/audio_policy_configuration.xml
@@ -117,15 +117,6 @@
<profile name="" format="AUDIO_FORMAT_AAC_HE_V2"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
- <profile name="" format="AUDIO_FORMAT_AC3"
- samplingRates="32000,44100,48000"
- channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1"/>
- <profile name="" format="AUDIO_FORMAT_E_AC3"
- samplingRates="32000,44100,48000"
- channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
- <profile name="" format="AUDIO_FORMAT_E_AC3_JOC"
- samplingRates="32000,44100,48000"
- channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_DTS"
samplingRates="32000,44100,48000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1"/>
diff --git a/configs/sdm670/audio_output_policy.conf b/configs/sdm670/audio_output_policy.conf
index f3dc620..8de9614 100644
--- a/configs/sdm670/audio_output_policy.conf
+++ b/configs/sdm670/audio_output_policy.conf
@@ -99,19 +99,35 @@
bit_width 24
app_type 69945
}
- record_fluence1 {
- flags AUDIO_INPUT_FLAG_COMPRESS
+ record_fluence {
+ flags AUDIO_INPUT_FLAG_NONE
profile record_fluence
formats AUDIO_FORMAT_PCM_16_BIT
- sampling_rates 48000
+ sampling_rates 16000|48000
bit_width 16
app_type 69944
}
- record_fluence {
+ record_fluence_compress {
+ flags AUDIO_INPUT_FLAG_COMPRESS
+ profile record_fluence
+ formats AUDIO_FORMAT_PCM_16_BIT
+ sampling_rates 16000|48000
+ bit_width 16
+ app_type 69944
+ }
+ record_fluence_timestamp {
flags AUDIO_INPUT_FLAG_TIMESTAMP
profile record_fluence
formats AUDIO_FORMAT_PCM_16_BIT
- sampling_rates 48000
+ sampling_rates 16000|48000
+ bit_width 16
+ app_type 69944
+ }
+ record_fluence_compress_timestamp {
+ flags AUDIO_INPUT_FLAG_COMPRESS|AUDIO_INPUT_FLAG_TIMESTAMP
+ profile record_fluence
+ formats AUDIO_FORMAT_PCM_16_BIT
+ sampling_rates 16000|48000
bit_width 16
app_type 69944
}
@@ -131,4 +147,36 @@
bit_width 24
app_type 69950
}
+ record_ambisonic_compress_16 {
+ profile record_ambisonic
+ flags AUDIO_INPUT_FLAG_COMPRESS
+ formats AUDIO_FORMAT_PCM_16_BIT
+ sampling_rates 48000
+ bit_width 16
+ app_type 69949
+ }
+ record_ambisonic_compress_24 {
+ profile record_ambisonic
+ flags AUDIO_INPUT_FLAG_COMPRESS
+ formats AUDIO_FORMAT_PCM_24_BIT_PACKED
+ sampling_rates 48000
+ bit_width 24
+ app_type 69950
+ }
+ record_ambisonic_compress_timestamp_16 {
+ profile record_ambisonic
+ flags AUDIO_INPUT_FLAG_COMPRESS|AUDIO_INPUT_FLAG_TIMESTAMP
+ formats AUDIO_FORMAT_PCM_16_BIT
+ sampling_rates 48000
+ bit_width 16
+ app_type 69949
+ }
+ record_ambisonic_compress_timestamp_24 {
+ profile record_ambisonic
+ flags AUDIO_INPUT_FLAG_COMPRESS|AUDIO_INPUT_FLAG_TIMESTAMP
+ formats AUDIO_FORMAT_PCM_24_BIT_PACKED
+ sampling_rates 48000
+ bit_width 24
+ app_type 69950
+ }
}
diff --git a/configs/sdm670/audio_platform_info.xml b/configs/sdm670/audio_platform_info.xml
index dceed57..c670695 100755
--- a/configs/sdm670/audio_platform_info.xml
+++ b/configs/sdm670/audio_platform_info.xml
@@ -46,6 +46,7 @@
<device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" acdb_id="145"/>
<device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
<device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
+ <device name="SND_DEVICE_IN_HANDSET_GENERIC_QMIC" acdb_id="148"/>
</acdb_ids>
<module_ids>
<aec>
@@ -87,7 +88,7 @@
<usecase name="USECASE_AUDIO_PLAYBACK_FM" type="out" id="5"/>
<usecase name="USECASE_AUDIO_PLAYBACK_FM" type="in" id="34"/>
<usecase name="USECASE_AUDIO_SPKR_CALIB_RX" type="out" id="5"/>
- <usecase name="USECASE_AUDIO_SPKR_CALIB_TX" type="in" id="37"/>
+ <usecase name="USECASE_AUDIO_SPKR_CALIB_TX" type="in" id="42"/>
<usecase name="USECASE_AUDIO_PLAYBACK_AFE_PROXY" type="out" id="6"/>
<usecase name="USECASE_AUDIO_RECORD_AFE_PROXY" type="in" id="7"/>
<usecase name="USECASE_AUDIO_RECORD_LOW_LATENCY" type="in" id="17" />
@@ -99,6 +100,11 @@
<usecase name="USECASE_AUDIO_HFP_SCO_WB" type="in" id="35" />
<usecase name="USECASE_AUDIO_PLAYBACK_VOIP" type="out" id="16" />
<usecase name="USECASE_AUDIO_RECORD_VOIP" type="in" id="16" />
+ <usecase name="USECASE_AUDIO_RECORD_COMPRESS2" type="in" id="37"/>
+ <usecase name="USECASE_AUDIO_RECORD_COMPRESS3" type="in" id="38"/>
+ <usecase name="USECASE_AUDIO_RECORD_COMPRESS4" type="in" id="39"/>
+ <usecase name="USECASE_AUDIO_RECORD_COMPRESS5" type="in" id="40"/>
+ <usecase name="USECASE_AUDIO_RECORD_COMPRESS6" type="in" id="41"/>
</pcm_ids>
<config_params>
<param key="spkr_1_tz_name" value="wsatz.13"/>
diff --git a/configs/sdm670/audio_platform_info_skuw.xml b/configs/sdm670/audio_platform_info_skuw.xml
index d8d1f78..0d197c5 100755
--- a/configs/sdm670/audio_platform_info_skuw.xml
+++ b/configs/sdm670/audio_platform_info_skuw.xml
@@ -67,8 +67,8 @@
<config_params>
<!-- In the below value string, the value indicates default mono -->
<!-- speaker. It can be set to either left or right -->
- <param key="spkr_1_tz_name" value="wsatz.13"/>
- <param key="spkr_2_tz_name" value="wsatz.14"/>
+ <param key="spkr_1_tz_name" value="wsatz.11"/>
+ <param key="spkr_2_tz_name" value="wsatz.12"/>
<param key="true_32_bit" value="true"/>
<param key="native_audio_mode" value="true"/>
<param key="hfp_pcm_dev_id" value="39"/>
diff --git a/configs/sdm670/mixer_paths_tasha.xml b/configs/sdm670/mixer_paths_tasha.xml
index 4db4271..40bcb74 100644
--- a/configs/sdm670/mixer_paths_tasha.xml
+++ b/configs/sdm670/mixer_paths_tasha.xml
@@ -541,6 +541,11 @@
<!-- vbat related data end-->
<!-- audio record compress-->
<ctl name="MultiMedia8 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia17 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia18 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia19 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia28 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia29 Mixer SLIM_0_TX" value="0" />
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="0" />
<ctl name="MultiMedia8 Mixer AFE_PCM_TX" value="0" />
<!-- audio record compress end-->
@@ -1461,6 +1466,26 @@
<ctl name="MultiMedia8 Mixer SLIM_0_TX" value="1" />
</path>
+ <path name="audio-record-compress2">
+ <ctl name="MultiMedia17 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress3">
+ <ctl name="MultiMedia18 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress4">
+ <ctl name="MultiMedia19 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress5">
+ <ctl name="MultiMedia28 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress6">
+ <ctl name="MultiMedia29 Mixer SLIM_0_TX" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
diff --git a/configs/sdm670/mixer_paths_tavil.xml b/configs/sdm670/mixer_paths_tavil.xml
index 0409cc1..fd34c87 100644
--- a/configs/sdm670/mixer_paths_tavil.xml
+++ b/configs/sdm670/mixer_paths_tavil.xml
@@ -297,6 +297,11 @@
<ctl name="MultiMedia1 Mixer SLIM_7_TX" value="0" />
<!-- audio record compress-->
<ctl name="MultiMedia8 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia17 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia18 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia19 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia28 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia29 Mixer SLIM_0_TX" value="0" />
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="0" />
<ctl name="MultiMedia8 Mixer AFE_PCM_TX" value="0" />
<!-- audio record compress end-->
@@ -1365,6 +1370,26 @@
<ctl name="MultiMedia8 Mixer SLIM_0_TX" value="1" />
</path>
+ <path name="audio-record-compress2">
+ <ctl name="MultiMedia17 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress3">
+ <ctl name="MultiMedia18 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress4">
+ <ctl name="MultiMedia19 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress5">
+ <ctl name="MultiMedia28 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress6">
+ <ctl name="MultiMedia29 Mixer SLIM_0_TX" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
diff --git a/configure.ac b/configure.ac
index a84e2cd..d6775b2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -81,6 +81,11 @@
AC_SUBST([TARGET_PLATFORM], ["msm8974"])
TARGET_CFLAGS="-DPLATFORM_MSM8996"
fi
+if (test x$TARGET_SUPPORT = xqcs605); then
+ AC_SUBST([TARGET_PLATFORM], ["msm8974"])
+ TARGET_CFLAGS=" -DPLATFORM_QCS605"
+fi
+
AC_SUBST([TARGET_CFLAGS])
AM_CONDITIONAL([QTI_AUDIO_SERVER_ENABLED],[test x$BOARD_SUPPORTS_QTI_AUDIO_SERVER = xtrue])
diff --git a/hal/Android.mk b/hal/Android.mk
index 523a593..36bcca9 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -395,6 +395,16 @@
LOCAL_CFLAGS += -DDYNAMIC_ECNS_ENABLED
endif
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_KEEP_ALIVE_ARM_FFV)), true)
+ LOCAL_CFLAGS += -DRUN_KEEP_ALIVE_IN_ARM_FFV
+endif
+
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_FFV)), true)
+ LOCAL_CFLAGS += -DFFV_ENABLED
+ LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/mm-audio-noship/include/ffv
+ LOCAL_SRC_FILES += audio_extn/ffv.c
+endif
+
LOCAL_CFLAGS += -Wall -Werror
LOCAL_COPY_HEADERS_TO := mm-audio
diff --git a/hal/acdb.c b/hal/acdb.c
index ad67d61..4ae03e9 100644
--- a/hal/acdb.c
+++ b/hal/acdb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -32,11 +32,7 @@
{
int result = -1;
- char *cvd_version = NULL;
-
- const char *snd_card_name = NULL;
struct mixer *mixer = NULL;
- struct acdb_platform_data *my_data = NULL;
if(snd_card_num < 0) {
ALOGE("invalid sound card number");
@@ -47,7 +43,25 @@
if (!mixer) {
ALOGE("%s: Unable to open the mixer card: %d", __func__,
snd_card_num);
- goto cleanup;
+ return result;
+ }
+ result = acdb_init_v2(mixer);
+ mixer_close(mixer);
+ return result;
+}
+
+int acdb_init_v2(struct mixer *mixer)
+{
+
+ int result = -1;
+ char *cvd_version = NULL;
+
+ const char *snd_card_name = NULL;
+ struct acdb_platform_data *my_data = NULL;
+
+ if (!mixer) {
+ ALOGE("Invalid mixer handle");
+ return result;
}
my_data = calloc(1, sizeof(struct acdb_platform_data));
@@ -155,9 +169,6 @@
free(my_data);
}
- if (mixer)
- mixer_close(mixer);
-
if (cvd_version)
free(cvd_version);
diff --git a/hal/acdb.h b/hal/acdb.h
index d1f863b..140370a 100644
--- a/hal/acdb.h
+++ b/hal/acdb.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -33,6 +33,7 @@
#define PLATFORM_INFO_XML_PATH "/vendor/etc/audio_platform_info.xml"
#endif
+struct mixer;
/* Audio calibration related functions */
typedef void (*acdb_deallocate_t)();
typedef int (*acdb_init_t)();
@@ -68,6 +69,7 @@
};
int acdb_init(int);
+int acdb_init_v2(struct mixer *);
int acdb_set_metainfo_key(void *platform, char *name, int key);
#endif //ACDB_H
diff --git a/hal/audio_extn/audio_defs.h b/hal/audio_extn/audio_defs.h
index 3921f49..1b34c53 100755
--- a/hal/audio_extn/audio_defs.h
+++ b/hal/audio_extn/audio_defs.h
@@ -117,6 +117,10 @@
/* MAX SECTORS for sourcetracking feature */
#define MAX_SECTORS 8
+/* Max length for license string */
+#define AUDIO_PRODUCT_STR_MAX_LENGTH (64)
+#define AUDIO_LICENSE_STR_MAX_LENGTH (64)
+
struct source_tracking_param {
uint8_t vad[MAX_SECTORS];
uint16_t doa_speech;
@@ -255,6 +259,13 @@
uint32_t mixer_coeffs[AUDIO_CHANNEL_COUNT_MAX][AUDIO_CHANNEL_COUNT_MAX];
} mix_matrix_params_t;
+
+typedef struct audio_license_params {
+ char product[AUDIO_PRODUCT_STR_MAX_LENGTH + 1];
+ int key;
+ char license[AUDIO_LICENSE_STR_MAX_LENGTH + 1];
+} audio_license_params_t;
+
typedef union {
struct source_tracking_param st_params;
struct sound_focus_param sf_params;
@@ -268,6 +279,7 @@
struct audio_out_channel_map_param channel_map_param;
struct audio_device_cfg_param device_cfg;
struct mix_matrix_params mm_params;
+ struct audio_license_params license_params;
} audio_extn_param_payload;
typedef enum {
@@ -288,7 +300,9 @@
/* Pan/scale params to be set on ASM */
AUDIO_EXTN_PARAM_OUT_MIX_MATRIX_PARAMS,
/* Downmix params to be set on ADM */
- AUDIO_EXTN_PARAM_CH_MIX_MATRIX_PARAMS
+ AUDIO_EXTN_PARAM_CH_MIX_MATRIX_PARAMS,
+ /* License information */
+ AUDIO_EXTN_PARAM_LICENSE_PARAMS,
} audio_extn_param_id;
#endif /* AUDIO_DEFS_H */
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 5db3706..c6c0924 100755
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -63,6 +63,8 @@
#define MAX_SLEEP_RETRY 100
#define WIFI_INIT_WAIT_SLEEP 50
+#define MAX_NUM_CHANNELS 8
+#define Q14_GAIN_UNITY 0x4000
struct audio_extn_module {
bool anc_enabled;
@@ -298,6 +300,74 @@
ALOGV("%s: Setting custom stereo state success", __func__);
}
}
+
+void audio_extn_send_dual_mono_mixing_coefficients(struct stream_out *out)
+{
+ struct audio_device *adev = out->dev;
+ struct mixer_ctl *ctl;
+ char mixer_ctl_name[128];
+ int cust_ch_mixer_cfg[128], len = 0;
+ int ip_channel_cnt = audio_channel_count_from_out_mask(out->channel_mask);
+ int pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
+ int op_channel_cnt= 2;
+ int i, j, err;
+
+ ALOGV("%s", __func__);
+ if (!out->started) {
+ out->set_dual_mono = true;
+ goto exit;
+ }
+
+ ALOGD("%s: i/p channel count %d, o/p channel count %d, pcm id %d", __func__,
+ ip_channel_cnt, op_channel_cnt, pcm_device_id);
+
+ snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
+ "Audio Stream %d Channel Mix Cfg", pcm_device_id);
+ ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+ if (!ctl) {
+ ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s",
+ __func__, mixer_ctl_name);
+ goto exit;
+ }
+
+ /* Output channel count corresponds to backend configuration channels.
+ * Input channel count corresponds to ASM session channels.
+ * Set params is called with channels that need to be selected from
+ * input to generate output.
+ * ex: "8,2" to downmix from 8 to 2 i.e. to downmix from 8 to 2,
+ *
+ * This mixer control takes values in the following sequence:
+ * - input channel count(m)
+ * - output channel count(n)
+ * - weight coeff for [out ch#1, in ch#1]
+ * ....
+ * - weight coeff for [out ch#1, in ch#m]
+ *
+ * - weight coeff for [out ch#2, in ch#1]
+ * ....
+ * - weight coeff for [out ch#2, in ch#m]
+ *
+ * - weight coeff for [out ch#n, in ch#1]
+ * ....
+ * - weight coeff for [out ch#n, in ch#m]
+ *
+ * To get dualmono ouptu weightage coeff is calculated as Unity gain
+ * divided by number of input channels.
+ */
+ cust_ch_mixer_cfg[len++] = ip_channel_cnt;
+ cust_ch_mixer_cfg[len++] = op_channel_cnt;
+ for (i = 0; i < op_channel_cnt; i++) {
+ for (j = 0; j < ip_channel_cnt; j++) {
+ cust_ch_mixer_cfg[len++] = Q14_GAIN_UNITY/ip_channel_cnt;
+ }
+ }
+
+ err = mixer_ctl_set_array(ctl, cust_ch_mixer_cfg, len);
+ if (err)
+ ALOGE("%s: ERROR. Mixer ctl set failed", __func__);
+exit:
+ return;
+}
#endif /* CUSTOM_STEREO_ENABLED */
#ifndef DTS_EAGLE
@@ -1259,7 +1329,15 @@
if (ssr_supported) {
return audio_extn_ssr_set_usecase(in, config, update_params);
} else if (audio_extn_ffv_check_usecase(in)) {
- return audio_extn_ffv_set_usecase(in);
+ char ffv_lic[LICENSE_STR_MAX_LEN + 1] = {0};
+ int ffv_key = 0;
+ if(platform_get_license_by_product(adev->platform, PRODUCT_FFV, &ffv_key, ffv_lic))
+ {
+ ALOGD("%s: Valid licence not availble for %s ", __func__, PRODUCT_FFV);
+ return -EINVAL;
+ }
+ ALOGD("%s: KEY: %d LICENSE: %s ", __func__, ffv_key, ffv_lic);
+ return audio_extn_ffv_set_usecase(in, ffv_key, ffv_lic);
} else {
return audio_extn_set_multichannel_mask(adev, in, config,
update_params);
@@ -1485,3 +1563,5 @@
return 0;
}
+
+
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index f1f45c0..0092e87 100755
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -42,6 +42,8 @@
#include "adsp_hdlr.h"
#include "ip_hdlr_intf.h"
+#define AUDIO_PARAMETER_DUAL_MONO "dual_mono"
+
#ifndef AFE_PROXY_ENABLED
#define AUDIO_DEVICE_OUT_PROXY 0x40000
#endif
@@ -222,6 +224,7 @@
#define audio_extn_usb_get_sup_sample_rates(t, s, l) (0)
#define audio_extn_usb_is_tunnel_supported() (0)
#define audio_extn_usb_alive(adev) (false)
+#define audio_extn_usb_connected(parms) (0)
#else
void audio_extn_usb_init(void *adev);
void audio_extn_usb_deinit();
@@ -240,6 +243,7 @@
int audio_extn_usb_get_sup_sample_rates(int type, uint32_t *sr, uint32_t l);
bool audio_extn_usb_is_tunnel_supported();
bool audio_extn_usb_alive(int card);
+bool audio_extn_usb_connected(struct str_parms *parms);
#endif
#ifndef SPLIT_A2DP_ENABLED
@@ -634,6 +638,8 @@
struct audio_device *adev,
struct audio_usecase *usecase);
int audio_extn_utils_get_snd_card_num();
+int audio_extn_utils_open_snd_mixer(struct mixer **mixer_handle);
+void audio_extn_utils_close_snd_mixer(struct mixer *mixer);
bool audio_extn_is_dsp_bit_width_enforce_mode_supported(audio_output_flags_t flags);
bool audio_extn_utils_is_dolby_format(audio_format_t format);
int audio_extn_utils_get_bit_width_from_string(const char *);
@@ -996,8 +1002,8 @@
#define audio_extn_ffv_init(adev) (0)
#define audio_extn_ffv_deinit() (0)
#define audio_extn_ffv_check_usecase(in) (0)
-#define audio_extn_ffv_set_usecase(in) (0)
-#define audio_extn_ffv_stream_init(in) (0)
+#define audio_extn_ffv_set_usecase(in, key, lic) (0)
+#define audio_extn_ffv_stream_init(in, key, lic) (0)
#define audio_extn_ffv_stream_deinit() (0)
#define audio_extn_ffv_update_enabled() (0)
#define audio_extn_ffv_get_enabled() (0)
@@ -1014,8 +1020,8 @@
int32_t audio_extn_ffv_init(struct audio_device *adev);
int32_t audio_extn_ffv_deinit();
bool audio_extn_ffv_check_usecase(struct stream_in *in);
-int audio_extn_ffv_set_usecase(struct stream_in *in);
-int32_t audio_extn_ffv_stream_init(struct stream_in *in);
+int audio_extn_ffv_set_usecase( struct stream_in *in, int key, char* lic);
+int32_t audio_extn_ffv_stream_init(struct stream_in *in, int key, char* lic);
int32_t audio_extn_ffv_stream_deinit();
void audio_extn_ffv_update_enabled();
bool audio_extn_ffv_get_enabled();
@@ -1033,4 +1039,11 @@
snd_device_t audio_extn_ffv_get_capture_snd_device();
void audio_extn_ffv_append_ec_ref_dev_name(char *device_name);
#endif
+
+#ifndef CUSTOM_STEREO_ENABLED
+#define audio_extn_send_dual_mono_mixing_coefficients(out) (0)
+#else
+void audio_extn_send_dual_mono_mixing_coefficients(struct stream_out *out);
+#endif
+int audio_extn_utils_get_license_params(const struct audio_device *adev, struct audio_license_params *lic_params);
#endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_extn/ffv.c b/hal/audio_extn/ffv.c
old mode 100644
new mode 100755
index 027849c..e0f3312
--- a/hal/audio_extn/ffv.c
+++ b/hal/audio_extn/ffv.c
@@ -59,14 +59,29 @@
#define AUDIO_PARAMETER_FFV_EC_REF_DEVICE "ffv_ec_ref_dev"
#define AUDIO_PARAMETER_FFV_CHANNEL_INDEX "ffv_channel_index"
-#define FFV_LIB "libffv.so"
+#if LINUX_ENABLED
#define FFV_CONFIG_FILE_PATH "/etc/BF_1out.cfg"
+#ifdef __LP64__
+#define FFV_LIB "/usr/lib64/libffv.so"
+#else
+#define FFV_LIB "/usr/lib/libffv.so"
+#endif
+#else
+#define FFV_CONFIG_FILE_PATH "/vendor/etc/BF_1out.cfg"
+#ifdef __LP64__
+#define FFV_LIB "/vendor/lib64/libffv.so"
+#else
+#define FFV_LIB "/vendor/lib/libffv.so"
+#endif
+#endif
+
#define FFV_SAMPLING_RATE_16000 16000
#define FFV_EC_REF_LOOPBACK_DEVICE_MONO "ec-ref-loopback-mono"
#define FFV_EC_REF_LOOPBACK_DEVICE_STEREO "ec-ref-loopback-stereo"
#define FFV_CHANNEL_MODE_MONO 1
#define FFV_CHANNEL_MODE_STEREO 2
+#define FFV_CHANNEL_MODE_QUAD 6
#define FFV_CHANNEL_MODE_HEX 6
#define FFV_CHANNEL_MODE_OCT 8
@@ -100,7 +115,8 @@
static FfvStatusType (*ffv_init_fn)(void** handle, int num_tx_in_ch,
int num_out_ch, int num_ec_ref_ch, int frame_len, int sample_rate,
const char *config_file_name, char *svaModelBuffer,
- uint32_t svaModelSize, int* totMemSize);
+ uint32_t svaModelSize, int* totMemSize,
+ int product_id, const char* prduct_license);
static void (*ffv_deinit_fn)(void* handle);
static void (*ffv_process_fn)(void *handle, const int16_t *in_pcm,
int16_t *out_pcm, const int16_t *ec_ref_pcm);
@@ -365,12 +381,12 @@
return ret;
}
-int audio_extn_ffv_set_usecase(struct stream_in *in)
+int audio_extn_ffv_set_usecase(struct stream_in *in, int ffv_key, char* ffv_lic)
{
int ret = -EINVAL;
if (audio_extn_ffv_check_usecase(in)) {
- if (!audio_extn_ffv_stream_init(in)) {
+ if (!audio_extn_ffv_stream_init(in, ffv_key, ffv_lic)) {
ALOGD("%s: Created FFV session succesfully", __func__);
ret = 0;
} else {
@@ -392,7 +408,7 @@
config->period_size = ffvmod.capture_config.period_size;
}
-int32_t audio_extn_ffv_init(struct audio_device *adev)
+int32_t audio_extn_ffv_init(struct audio_device *adev __unused)
{
int ret = 0;
@@ -414,7 +430,7 @@
return 0;
}
-int32_t audio_extn_ffv_stream_init(struct stream_in *in)
+int32_t audio_extn_ffv_stream_init(struct stream_in *in, int key, char* lic)
{
uint32_t ret = -EINVAL;
int num_tx_in_ch, num_out_ch, num_ec_ref_ch;
@@ -472,8 +488,8 @@
__func__, num_ec_ref_ch, num_tx_in_ch, num_out_ch, frame_len, sample_rate);
ALOGD("%s: config file path %s", __func__, config_file_path);
status_type = ffv_init_fn(&ffvmod.handle, num_tx_in_ch, num_out_ch, num_ec_ref_ch,
- frame_len, sample_rate, config_file_path, sm_buffer, 0,
- &total_mem_size);
+ frame_len, sample_rate, config_file_path, (char *)sm_buffer, 0,
+ &total_mem_size, key, lic);
if (status_type) {
ALOGE("%s: ERROR. ffv_init returned %d", __func__, status_type);
ret = -EINVAL;
@@ -565,6 +581,8 @@
return SND_DEVICE_IN_HANDSET_8MIC;
} else if (ffvmod.capture_config.channels == FFV_CHANNEL_MODE_HEX) {
return SND_DEVICE_IN_HANDSET_6MIC;
+ } else if (ffvmod.capture_config.channels == FFV_CHANNEL_MODE_QUAD) {
+ return SND_DEVICE_IN_HANDSET_QMIC;
} else {
ALOGE("%s: Invalid channels configured for capture", __func__);
return SND_DEVICE_NONE;
@@ -572,7 +590,7 @@
}
int audio_extn_ffv_init_ec_ref_loopback(struct audio_device *adev,
- snd_device_t snd_device)
+ snd_device_t snd_device __unused)
{
struct audio_usecase *uc_info_tx = NULL;
snd_device_t in_snd_device;
@@ -664,7 +682,7 @@
}
int audio_extn_ffv_deinit_ec_ref_loopback(struct audio_device *adev,
- snd_device_t snd_device)
+ snd_device_t snd_device __unused)
{
struct audio_usecase *uc_info_tx = NULL;
snd_device_t in_snd_device;
@@ -694,7 +712,7 @@
return ret;
}
-int32_t audio_extn_ffv_read(struct audio_stream_in *stream,
+int32_t audio_extn_ffv_read(struct audio_stream_in *stream __unused,
void *buffer, size_t bytes)
{
int status = 0;
@@ -702,7 +720,7 @@
int16_t *process_ec_ref_ptr = NULL;
size_t in_buf_size, out_buf_size, bytes_to_copy;
int retry_num = 0;
- int i, j, ch;
+ int i, ch;
int total_in_ch, in_ch, ec_ref_ch;
if (!ffvmod.ffv_lib_handle) {
@@ -790,7 +808,7 @@
total_in_ch = ffvmod.capture_config.channels;
ec_ref_ch = ffvmod.ec_ref_config.channels;
in_ch = total_in_ch - ec_ref_ch;
- for (i = 0; i < ffvmod.capture_config.period_size; i++) {
+ for (i = 0; i < (int)ffvmod.capture_config.period_size; i++) {
for (ch = 0; ch < in_ch; ch++) {
process_in_ptr[i*in_ch+ch] =
in_ptr[i*total_in_ch+ch];
@@ -810,7 +828,7 @@
bytes_to_copy = (bytes <= out_buf_size) ? bytes : out_buf_size;
memcpy(buffer, process_out_ptr, bytes_to_copy);
if (bytes_to_copy != out_buf_size)
- ALOGD("%s: out buffer data dropped, copied %d bytes",
+ ALOGD("%s: out buffer data dropped, copied %zd bytes",
__func__, bytes_to_copy);
#ifdef FFV_PCM_DUMP
@@ -831,7 +849,6 @@
void audio_extn_ffv_set_parameters(struct audio_device *adev __unused,
struct str_parms *parms)
{
- int err;
int val;
int ret = 0;
char value[128];
@@ -876,18 +893,30 @@
ALOGE("%s: Invalid ec ref", __func__);
}
}
-
- ret = str_parms_get_int(parms, AUDIO_PARAMETER_FFV_EC_REF_DEVICE, &val);
- if (ret >= 0) {
+ ret = -1;
+ if (str_parms_get_int(parms, AUDIO_PARAMETER_FFV_EC_REF_DEVICE, &val) >= 0) {
+ ret = 1;
str_parms_del(parms, AUDIO_PARAMETER_FFV_EC_REF_DEVICE);
+ } else if (str_parms_get_int(parms, AUDIO_PARAMETER_DEVICE_CONNECT, &val) >= 0) {
+ ret = 1;
+ str_parms_del(parms, AUDIO_PARAMETER_DEVICE_CONNECT);
+ }
+ if (ret == 1) {
if (val & AUDIO_DEVICE_OUT_SPEAKER) {
ALOGD("%s: capture ec ref from speaker", __func__);
ffvmod.ec_ref_dev = AUDIO_DEVICE_OUT_SPEAKER;
} else if (val & AUDIO_DEVICE_OUT_LINE) {
ALOGD("%s: capture ec ref from line out", __func__);
ffvmod.ec_ref_dev = AUDIO_DEVICE_OUT_LINE;
- } else {
- ALOGE("%s: Invalid ec ref out device", __func__);
+ }
+ }
+
+ ret = str_parms_get_int(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT, &val);
+ if (ret >= 0) {
+ str_parms_del(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT);
+ if (val & AUDIO_DEVICE_OUT_LINE) {
+ ALOGD("%s: capture ec ref from speaker", __func__);
+ ffvmod.ec_ref_dev = AUDIO_DEVICE_OUT_SPEAKER;
}
}
diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c
index aa541f0..909ef8f 100644
--- a/hal/audio_extn/soundtrigger.c
+++ b/hal/audio_extn/soundtrigger.c
@@ -79,6 +79,7 @@
AUDIO_EVENT_SVA_EXEC_MODE_STATUS,
AUDIO_EVENT_CAPTURE_STREAM_INACTIVE,
AUDIO_EVENT_CAPTURE_STREAM_ACTIVE,
+ AUDIO_EVENT_GET_PARAM
} audio_event_type_t;
typedef enum {
@@ -121,6 +122,12 @@
int device;
};
+struct sound_trigger_get_param_data {
+ char *param;
+ int sm_handle;
+ struct str_parms *reply;
+};
+
struct audio_event_info {
union {
ssr_event_status_t status;
@@ -129,6 +136,7 @@
struct audio_read_samples_info aud_info;
char str_value[ST_EVENT_CONFIG_MAX_STR_VALUE];
struct audio_hal_usecase usecase;
+ struct sound_trigger_get_param_data st_get_param_data;
} u;
struct sound_trigger_device_info device_info;
};
@@ -165,6 +173,8 @@
#define SOUND_TRIGGER_LIBRARY_PATH "/vendor/lib/hw/sound_trigger.primary.%s.so"
#endif
+#define SVA_PARAM_DIRECTION_OF_ARRIVAL "st_direction_of_arrival"
+#define SVA_PARAM_CHANNEL_INDEX "st_channel_index"
/*
* Current proprietary API version used by AHAL. Queried by STHAL
* for compatibility check with AHAL
@@ -513,7 +523,7 @@
ALOGW("%s:invalid event %d, for usecase %d",
__func__, event, uc_info->id);
}
- } else if (uc_info->type == PCM_CAPTURE) {
+ } else if ((uc_info->type == PCM_CAPTURE) || (uc_info->type == VOICE_CALL)) {
if (event == ST_EVENT_STREAM_BUSY)
ev = AUDIO_EVENT_CAPTURE_STREAM_ACTIVE;
else
@@ -575,13 +585,15 @@
}
ret = str_parms_get_int(params, AUDIO_PARAMETER_DEVICE_CONNECT, &val);
- if ((ret >= 0) && audio_is_input_device(val)) {
+ if ((ret >= 0) && (audio_is_input_device(val) ||
+ (val == AUDIO_DEVICE_OUT_LINE))) {
event.u.value = val;
st_dev->st_callback(AUDIO_EVENT_DEVICE_CONNECT, &event);
}
ret = str_parms_get_int(params, AUDIO_PARAMETER_DEVICE_DISCONNECT, &val);
- if ((ret >= 0) && audio_is_input_device(val)) {
+ if ((ret >= 0) && (audio_is_input_device(val) ||
+ (val == AUDIO_DEVICE_OUT_LINE))) {
event.u.value = val;
st_dev->st_callback(AUDIO_EVENT_DEVICE_DISCONNECT, &event);
}
@@ -597,7 +609,7 @@
struct str_parms *query, struct str_parms *reply)
{
audio_event_info_t event;
- int ret;
+ int ret, val;
char value[32];
ret = str_parms_get_str(query, "SVA_EXEC_MODE_STATUS", value,
@@ -606,6 +618,22 @@
st_dev->st_callback(AUDIO_EVENT_SVA_EXEC_MODE_STATUS, &event);
str_parms_add_int(reply, "SVA_EXEC_MODE_STATUS", event.u.value);
}
+
+ ret = str_parms_get_int(query, SVA_PARAM_DIRECTION_OF_ARRIVAL, &val);
+ if (ret >= 0) {
+ event.u.st_get_param_data.sm_handle = val;
+ event.u.st_get_param_data.param = SVA_PARAM_DIRECTION_OF_ARRIVAL;
+ event.u.st_get_param_data.reply = reply;
+ st_dev->st_callback(AUDIO_EVENT_GET_PARAM, &event);
+ }
+
+ ret = str_parms_get_int(query, SVA_PARAM_CHANNEL_INDEX, &val);
+ if (ret >= 0) {
+ event.u.st_get_param_data.sm_handle = val;
+ event.u.st_get_param_data.param = SVA_PARAM_CHANNEL_INDEX;
+ event.u.st_get_param_data.reply = reply;
+ st_dev->st_callback(AUDIO_EVENT_GET_PARAM, &event);
+ }
}
int audio_extn_sound_trigger_init(struct audio_device *adev)
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index abbdc8e..e7c3661 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -1007,6 +1007,7 @@
int ret;
bool spv3_enable = false;
unsigned int afe_api_version = 0;
+ struct mixer_ctl *ctl;
memset(&protCfg, 0, sizeof(protCfg));
/* If the value of this persist.vendor.audio.spkr.cal.duration is 0
@@ -1114,9 +1115,18 @@
}
if (goahead) {
if (spk_1_tzn >= 0) {
+ const char *mixer_ctl_name = "SpkrLeft WSA T0 Init";
snprintf(wsa_path, MAX_PATH, TZ_WSA, spk_1_tzn);
ALOGV("%s: wsa_path: %s\n", __func__, wsa_path);
thermal_fd = -1;
+
+ ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+ if (ctl) {
+ ALOGD("%s: Got ctl for mixer cmd %s",
+ __func__, mixer_ctl_name);
+ mixer_ctl_set_value(ctl, 0, 1);
+ }
+
thermal_fd = open(wsa_path, O_RDONLY);
if (thermal_fd > 0) {
if ((ret = read(thermal_fd, buf, sizeof(buf))) >= 0)
@@ -1127,6 +1137,9 @@
} else {
ALOGE("%s: fd for %s is NULL\n", __func__, wsa_path);
}
+ if (ctl) {
+ mixer_ctl_set_value(ctl, 0, 0);
+ }
if (t0_spk_1 < TZ_TEMP_MIN_THRESHOLD ||
t0_spk_1 > TZ_TEMP_MAX_THRESHOLD) {
pthread_mutex_unlock(&adev->lock);
@@ -1138,8 +1151,15 @@
t0_spk_1 = (t0_spk_1 * (1 << 6));
}
if (spk_2_tzn >= 0) {
+ const char *mixer_ctl_name = "SpkrRight WSA T0 Init";
snprintf(wsa_path, MAX_PATH, TZ_WSA, spk_2_tzn);
ALOGV("%s: wsa_path: %s\n", __func__, wsa_path);
+ ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+ if (ctl) {
+ ALOGD("%s: Got ctl for mixer cmd %s",
+ __func__, mixer_ctl_name);
+ mixer_ctl_set_value(ctl, 0, 1);
+ }
thermal_fd = open(wsa_path, O_RDONLY);
if (thermal_fd > 0) {
if ((ret = read(thermal_fd, buf, sizeof(buf))) >= 0)
@@ -1150,6 +1170,9 @@
} else {
ALOGE("%s: fd for %s is NULL\n", __func__, wsa_path);
}
+ if (ctl) {
+ mixer_ctl_set_value(ctl, 0, 0);
+ }
if (t0_spk_2 < TZ_TEMP_MIN_THRESHOLD ||
t0_spk_2 > TZ_TEMP_MAX_THRESHOLD) {
pthread_mutex_unlock(&adev->lock);
diff --git a/hal/audio_extn/usb.c b/hal/audio_extn/usb.c
index 8766c0e..2af255b 100644
--- a/hal/audio_extn/usb.c
+++ b/hal/audio_extn/usb.c
@@ -1151,6 +1151,26 @@
return access(path, F_OK) == 0;
}
+bool audio_extn_usb_connected(struct str_parms *parms) {
+ int card;
+ struct listnode *node_i;
+ struct usb_card_config *usb_card_info;
+ bool usb_connected = false;
+
+ if (str_parms_get_int(parms, "card", &card) >= 0) {
+ usb_connected = audio_extn_usb_alive(card);
+ } else {
+ list_for_each(node_i, &usbmod->usb_card_conf_list) {
+ usb_card_info = node_to_item(node_i, struct usb_card_config, list);
+ if (audio_extn_usb_alive(usb_card_info->usb_card)) {
+ usb_connected = true;
+ break;
+ }
+ }
+ }
+ return usb_connected;
+}
+
void audio_extn_usb_init(void *adev)
{
if (usbmod == NULL) {
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
old mode 100644
new mode 100755
index d4c6351..8a585df
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -2111,6 +2111,17 @@
int audio_extn_utils_get_snd_card_num()
{
+ int snd_card_num = 0;
+ struct mixer *mixer = NULL;
+
+ snd_card_num = audio_extn_utils_open_snd_mixer(&mixer);
+ if (mixer)
+ mixer_close(mixer);
+ return snd_card_num;
+}
+
+int audio_extn_utils_open_snd_mixer(struct mixer **mixer_handle)
+{
void *hw_info = NULL;
struct mixer *mixer = NULL;
@@ -2118,6 +2129,11 @@
int snd_card_num = 0, min_snd_card_num = 0;
char* snd_card_name = NULL;
+ if (!mixer_handle) {
+ ALOGE("invalid mixer handle");
+ return -1;
+ }
+ *mixer_handle = NULL;
/*
* Try with all the sound cards ( 0 to 8 ) and if none of them were detected
* sleep for 1 sec and try detections with sound card 0 again.
@@ -2171,9 +2187,6 @@
if (snd_card_name)
free(snd_card_name);
- if (mixer)
- mixer_close(mixer);
-
if (hw_info)
hw_info_deinit(hw_info);
@@ -2182,9 +2195,18 @@
return -1;
}
+ if (mixer)
+ *mixer_handle = mixer;
+
return snd_card_num;
}
+void audio_extn_utils_close_snd_mixer(struct mixer *mixer)
+{
+ if (mixer)
+ mixer_close(mixer);
+}
+
#ifdef SNDRV_COMPRESS_ENABLE_ADJUST_SESSION_CLOCK
int audio_extn_utils_compress_enable_drift_correction(
struct stream_out *out,
@@ -2486,3 +2508,15 @@
return -EINVAL;
}
+
+int audio_extn_utils_get_license_params
+(
+const struct audio_device *adev,
+struct audio_license_params *license_params
+)
+{
+ if(!license_params)
+ return -EINVAL;
+ return platform_get_license_by_product(adev->platform, (const char*)license_params->product, &license_params->key, license_params->license);
+}
+
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 6fea8c9..9993c33 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1099,7 +1099,8 @@
"true-native-mode");
adev->native_playback_enabled = true;
}
- if ((snd_device == SND_DEVICE_IN_HANDSET_6MIC) &&
+ if (((snd_device == SND_DEVICE_IN_HANDSET_6MIC) ||
+ (snd_device == SND_DEVICE_IN_HANDSET_QMIC)) &&
(audio_extn_ffv_get_stream() == adev->active_input)) {
ALOGD("%s: init ec ref loopback", __func__);
audio_extn_ffv_init_ec_ref_loopback(adev, snd_device);
@@ -1361,7 +1362,9 @@
platform_get_snd_device_name(snd_device),
platform_get_snd_device_name(usecase->out_snd_device),
platform_check_backends_match(snd_device, usecase->out_snd_device));
- if ((usecase->type != PCM_CAPTURE) && (usecase != uc_info)) {
+ if ((usecase->type != PCM_CAPTURE) &&
+ (usecase->type != VOICE_CALL) &&
+ (usecase != uc_info)) {
uc_derive_snd_device = derive_playback_snd_device(adev->platform,
usecase, uc_info, snd_device);
if (((uc_derive_snd_device != usecase->out_snd_device) || force_routing) &&
@@ -2018,6 +2021,10 @@
struct stream_out stream_out;
audio_usecase_t hfp_ucid;
int status = 0;
+ audio_devices_t audio_device;
+ audio_channel_mask_t channel_mask;
+ int sample_rate;
+ int acdb_id;
ALOGD("%s for use case (%s)", __func__, use_case_table[uc_id]);
@@ -2258,14 +2265,11 @@
usecase->stream.out->app_type_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
}
- /* Notify device change info to effect clients registered */
- pthread_mutex_unlock(&adev->lock);
- audio_extn_gef_notify_device_config(
- usecase->stream.out->devices,
- usecase->stream.out->channel_mask,
- usecase->stream.out->app_type_cfg.sample_rate,
- platform_get_snd_device_acdb_id(usecase->out_snd_device));
- pthread_mutex_lock(&adev->lock);
+ /* Cache stream information to be notified to gef clients */
+ audio_device = usecase->stream.out->devices;
+ channel_mask = usecase->stream.out->channel_mask;
+ sample_rate = usecase->stream.out->app_type_cfg.sample_rate;
+ acdb_id = platform_get_snd_device_acdb_id(usecase->out_snd_device);
}
enable_audio_route(adev, usecase);
@@ -2322,6 +2326,16 @@
}
}
+ /* Notify device change info to effect clients registered
+ * NOTE: device lock has to be unlock temporarily here.
+ * To the worst case, we notify stale info to clients.
+ */
+ if (usecase->type == PCM_PLAYBACK) {
+ pthread_mutex_unlock(&adev->lock);
+ audio_extn_gef_notify_device_config(audio_device, channel_mask, sample_rate, acdb_id);
+ pthread_mutex_lock(&adev->lock);
+ }
+
ALOGD("%s: done",__func__);
return status;
@@ -2484,6 +2498,14 @@
in->pcm = pcm_open(adev->snd_card, in->pcm_device_id,
flags, &config);
ATRACE_END();
+ if (errno == ENETRESET) {
+ ALOGE("%s: pcm_open failed errno:%d\n", __func__, errno);
+ adev->card_status = CARD_STATUS_OFFLINE;
+ in->card_status = CARD_STATUS_OFFLINE;
+ ret = -EIO;
+ goto error_open;
+ }
+
if (in->pcm == NULL || !pcm_is_ready(in->pcm)) {
ALOGE("%s: %s", __func__, pcm_get_error(in->pcm));
if (in->pcm != NULL) {
@@ -3066,6 +3088,14 @@
out->pcm = pcm_open(adev->snd_card, out->pcm_device_id,
flags, &out->config);
ATRACE_END();
+ if (errno == ENETRESET) {
+ ALOGE("%s: pcm_open failed errno:%d\n", __func__, errno);
+ out->card_status = CARD_STATUS_OFFLINE;
+ adev->card_status = CARD_STATUS_OFFLINE;
+ ret = -EIO;
+ goto error_open;
+ }
+
if (out->pcm == NULL || !pcm_is_ready(out->pcm)) {
ALOGE("%s: %s", __func__, pcm_get_error(out->pcm));
if (out->pcm != NULL) {
@@ -3081,6 +3111,8 @@
}
break;
}
+ platform_set_stream_channel_map(adev->platform, out->channel_mask,
+ out->pcm_device_id, &out->channel_map_param.channel_map[0]);
ALOGV("%s: pcm_prepare", __func__);
if (pcm_is_ready(out->pcm)) {
@@ -3094,8 +3126,6 @@
goto error_open;
}
}
- platform_set_stream_channel_map(adev->platform, out->channel_mask,
- out->pcm_device_id, &out->channel_map_param.channel_map[0]);
// apply volume for voip playback after path is set up
if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP)
out_set_voip_volume(&out->stream, out->volume_l, out->volume_r);
@@ -3111,6 +3141,14 @@
out->pcm_device_id,
COMPRESS_IN, &out->compr_config);
ATRACE_END();
+ if (errno == ENETRESET) {
+ ALOGE("%s: compress_open failed errno:%d\n", __func__, errno);
+ adev->card_status = CARD_STATUS_OFFLINE;
+ out->card_status = CARD_STATUS_OFFLINE;
+ ret = -EIO;
+ goto error_open;
+ }
+
if (out->compr && !is_compress_ready(out->compr)) {
ALOGE("%s: failed /w error %s", __func__, compress_get_error(out->compr));
compress_close(out->compr);
@@ -3648,6 +3686,18 @@
!audio_extn_a2dp_is_ready()) {
val = AUDIO_DEVICE_OUT_SPEAKER;
}
+ /*
+ * When USB headset is disconnected the music platback paused
+ * and the policy manager send routing=0. But if the USB is connected
+ * back before the standby time, AFE is not closed and opened
+ * when USB is connected back. So routing to speker will guarantee
+ * AFE reconfiguration and AFE will be opend once USB is connected again
+ */
+ if ((out->devices & AUDIO_DEVICE_OUT_ALL_USB) &&
+ (val == AUDIO_DEVICE_NONE) &&
+ !audio_extn_usb_connected(parms)) {
+ val = AUDIO_DEVICE_OUT_SPEAKER;
+ }
/* To avoid a2dp to sco overlapping / BT device improper state
* check with BT lib about a2dp streaming support before routing
*/
@@ -3780,6 +3830,13 @@
pthread_mutex_unlock(&out->lock);
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_DUAL_MONO, value,
+ sizeof(value));
+ if (err >= 0) {
+ if (!strncmp("true", value, sizeof("true")) || atoi(value))
+ audio_extn_send_dual_mono_mixing_coefficients(out);
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_PROFILE, value, sizeof(value));
if (err >= 0) {
strlcpy(out->profile, value, sizeof(out->profile));
@@ -4347,6 +4404,8 @@
ret = -EINVAL;
goto exit;
}
+ if (out->set_dual_mono)
+ audio_extn_send_dual_mono_mixing_coefficients(out);
}
if (adev->is_channel_status_set == false && (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)){
@@ -4871,8 +4930,15 @@
uint32_t mmap_size;
ALOGV("%s", __func__);
+ lock_output_stream(out);
pthread_mutex_lock(&adev->lock);
+ if (CARD_STATUS_OFFLINE == out->card_status ||
+ CARD_STATUS_OFFLINE == adev->card_status) {
+ ALOGW("out->card_status or adev->card_status offline, try again");
+ ret = -EIO;
+ goto exit;
+ }
if (info == NULL || min_size_frames == 0) {
ALOGE("%s: info = %p, min_size_frames = %d", __func__, info, min_size_frames);
ret = -EINVAL;
@@ -4897,6 +4963,14 @@
__func__, adev->snd_card, out->pcm_device_id, out->config.channels);
out->pcm = pcm_open(adev->snd_card, out->pcm_device_id,
(PCM_OUT | PCM_MMAP | PCM_NOIRQ | PCM_MONOTONIC), &out->config);
+ if (errno == ENETRESET) {
+ ALOGE("%s: pcm_open failed errno:%d\n", __func__, errno);
+ out->card_status = CARD_STATUS_OFFLINE;
+ adev->card_status = CARD_STATUS_OFFLINE;
+ ret = -EIO;
+ goto exit;
+ }
+
if (out->pcm == NULL || !pcm_is_ready(out->pcm)) {
step = "open";
ret = -ENODEV;
@@ -4943,6 +5017,7 @@
}
}
pthread_mutex_unlock(&adev->lock);
+ pthread_mutex_unlock(&out->lock);
return ret;
}
@@ -5382,7 +5457,8 @@
lock_input_stream(in);
pthread_mutex_lock(&in->dev->lock);
- if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) &&
+ if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
+ in->dev->mode == AUDIO_MODE_IN_COMMUNICATION) &&
in->enable_aec != enable &&
(memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0)) {
in->enable_aec = enable;
@@ -5396,7 +5472,8 @@
(memcmp(&desc.type, FX_IID_NS, sizeof(effect_uuid_t)) == 0)) {
in->enable_ns = enable;
if (!in->standby) {
- if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
+ if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
+ in->dev->mode == AUDIO_MODE_IN_COMMUNICATION) {
if (enable_disable_effect(in->dev, EFFECT_NS, enable) == ENOSYS)
select_devices(in->dev, in->usecase);
} else
@@ -5476,6 +5553,13 @@
pthread_mutex_lock(&adev->lock);
ALOGV("%s in %p", __func__, in);
+ if (CARD_STATUS_OFFLINE == in->card_status||
+ CARD_STATUS_OFFLINE == adev->card_status) {
+ ALOGW("in->card_status or adev->card_status offline, try again");
+ ret = -EIO;
+ goto exit;
+ }
+
if (info == NULL || min_size_frames == 0) {
ALOGE("%s invalid argument info %p min_size_frames %d", __func__, info, min_size_frames);
ret = -EINVAL;
@@ -5501,6 +5585,14 @@
__func__, adev->snd_card, in->pcm_device_id, in->config.channels);
in->pcm = pcm_open(adev->snd_card, in->pcm_device_id,
(PCM_IN | PCM_MMAP | PCM_NOIRQ | PCM_MONOTONIC), &in->config);
+ if (errno == ENETRESET) {
+ ALOGE("%s: pcm_open failed errno:%d\n", __func__, errno);
+ in->card_status = CARD_STATUS_OFFLINE;
+ adev->card_status = CARD_STATUS_OFFLINE;
+ ret = -EIO;
+ goto exit;
+ }
+
if (in->pcm == NULL || !pcm_is_ready(in->pcm)) {
step = "open";
ret = -ENODEV;
@@ -5628,6 +5720,7 @@
out->a2dp_compress_mute = false;
out->hal_output_suspend_supported = 0;
out->dynamic_pm_qos_config_supported = 0;
+ out->set_dual_mono = false;
if ((flags & AUDIO_OUTPUT_FLAG_BD) &&
(property_get_bool("vendor.audio.matrix.limiter.enable", false)))
@@ -6635,16 +6728,17 @@
bool valid_ch = audio_channel_count_from_in_mask(in->channel_mask) == 1;
#ifndef COMPRESS_VOIP_ENABLED
- if (valid_rate && valid_ch) {
+ if (valid_rate && valid_ch &&
+ in->dev->mode == AUDIO_MODE_IN_COMMUNICATION) {
in->usecase = USECASE_AUDIO_RECORD_VOIP;
in->config = default_pcm_config_voip_copp;
in->config.period_size = VOIP_IO_BUF_SIZE(in->sample_rate,
DEFAULT_VOIP_BUF_DURATION_MS,
DEFAULT_VOIP_BIT_DEPTH_BYTE)/2;
} else {
- if (!valid_ch) config->channel_mask = 1;
- if (!valid_rate) config->sample_rate = 48000;
- return -EINVAL;
+ ALOGW("%s No valid input in voip, use defaults"
+ "sample rate %u, channel mask 0x%X",
+ __func__, config->sample_rate, in->channel_mask);
}
in->config.rate = config->sample_rate;
in->sample_rate = config->sample_rate;
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index b70f66f..8cb395f 100755
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -357,6 +357,7 @@
bool stream_config_changed;
mix_matrix_params_t pan_scale_params;
mix_matrix_params_t downmix_params;
+ bool set_dual_mono;
};
struct stream_in {
diff --git a/hal/audio_hw_extn_api.c b/hal/audio_hw_extn_api.c
old mode 100644
new mode 100755
index 4e49a83..550a06b
--- a/hal/audio_hw_extn_api.c
+++ b/hal/audio_hw_extn_api.c
@@ -140,6 +140,10 @@
ret = audio_extn_get_sourcetrack_data(dev,
(struct source_tracking_param*)payload);
break;
+ case AUDIO_EXTN_PARAM_LICENSE_PARAMS:
+ ret = audio_extn_utils_get_license_params(dev,
+ (struct audio_license_params *)(payload));
+ break;
default:
ALOGE("%s::INVALID PARAM ID:%d\n",__func__,param_id);
ret = -EINVAL;
diff --git a/hal/msm8916/hw_info.c b/hal/msm8916/hw_info.c
index 26c6eaa..40e39a2 100644
--- a/hal/msm8916/hw_info.c
+++ b/hal/msm8916/hw_info.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2018, 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
@@ -118,6 +118,11 @@
strlcpy(hw_info->name, "msm8952", sizeof(hw_info->name));
} else if (!strcmp(snd_card_name, "msm8952-snd-card-mtp")) {
strlcpy(hw_info->name, "msm8952", sizeof(hw_info->name));
+ } else if (!strcmp(snd_card_name, "sdm439-sku1-snd-card")) {
+ hw_info->is_stereo_spkr = false;
+ strlcpy(hw_info->name, "msm8952", sizeof(hw_info->name));
+ } else if (!strcmp(snd_card_name, "sdm439-snd-card-mtp")) {
+ strlcpy(hw_info->name, "msm8952", sizeof(hw_info->name));
} else if (!strcmp(snd_card_name, "msm8952-tomtom-snd-card")) {
strlcpy(hw_info->name, "msm8952", sizeof(hw_info->name));
} else if (!strcmp(snd_card_name, "msm8952-tasha-snd-card")) {
@@ -212,7 +217,8 @@
strstr(snd_card_name, "msm8937") || strstr(snd_card_name, "msm8917") ||
strstr(snd_card_name, "msm8940") || strstr(snd_card_name, "msm8920") ||
strstr(snd_card_name, "sdm660") || strstr(snd_card_name, "apq8009") ||
- strstr(snd_card_name, "mdm9607") || strstr(snd_card_name, "mdm-tasha")) {
+ strstr(snd_card_name, "mdm9607") || strstr(snd_card_name, "mdm-tasha") ||
+ strstr(snd_card_name, "sdm439")) {
ALOGV("8x16 - variant soundcard");
update_hardware_info_8x16(hw_info, snd_card_name);
} else {
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
old mode 100644
new mode 100755
index 2e824b0..f32e283
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -78,6 +78,7 @@
#define MIXER_XML_PATH "/etc/mixer_paths.xml"
#define MIXER_XML_PATH_MSM8909_PM8916 "/etc/mixer_paths_msm8909_pm8916.xml"
#define MIXER_XML_PATH_MTP "/etc/mixer_paths_mtp.xml"
+#define MIXER_XML_PATH_SDM439_PM8953 "/etc/mixer_paths_sdm439_pm8953.xml"
#define MIXER_XML_PATH_SKU2 "/etc/mixer_paths_qrd_sku2.xml"
#define MIXER_XML_PATH_WCD9326 "/etc/mixer_paths_wcd9326.xml"
#define MIXER_XML_PATH_WCD9335 "/etc/mixer_paths_wcd9335.xml"
@@ -93,6 +94,7 @@
#define MIXER_XML_PATH "/vendor/etc/mixer_paths.xml"
#define MIXER_XML_PATH_MSM8909_PM8916 "/vendor/etc/mixer_paths_msm8909_pm8916.xml"
#define MIXER_XML_PATH_MTP "/vendor/etc/mixer_paths_mtp.xml"
+#define MIXER_XML_PATH_SDM439_PM8953 "/vendor/etc/mixer_paths_sdm439_pm8953.xml"
#define MIXER_XML_PATH_SKU2 "/vendor/etc/mixer_paths_qrd_sku2.xml"
#define PLATFORM_INFO_XML_PATH_EXTCODEC "/vendor/etc/audio_platform_info_extcodec.xml"
#define PLATFORM_INFO_XML_PATH_SKUSH "/vendor/etc/audio_platform_info_skush.xml"
@@ -792,6 +794,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES)},
#ifdef RECORD_PLAY_CONCURRENCY
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)},
@@ -1229,6 +1232,20 @@
msm_device_to_be_id = msm_device_to_be_id_internal_codec;
msm_be_id_array_len =
sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
+ } else if (!strncmp(snd_card_name, "sdm439-snd-card-mtp",
+ sizeof("sdm439-snd-card-mtp"))) {
+ strlcpy(mixer_xml_path, MIXER_XML_PATH_SDM439_PM8953,
+ sizeof(MIXER_XML_PATH_SDM439_PM8953));
+ msm_device_to_be_id = msm_device_to_be_id_internal_codec;
+ msm_be_id_array_len =
+ sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
+ } else if (!strncmp(snd_card_name, "sdm439-sku1-snd-card",
+ sizeof("sdm439-sku1-snd-card"))) {
+ strlcpy(mixer_xml_path, MIXER_XML_PATH_SDM439_PM8953,
+ sizeof(MIXER_XML_PATH_SDM439_PM8953));
+ msm_device_to_be_id = msm_device_to_be_id_internal_codec;
+ msm_be_id_array_len =
+ sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
} else if (!strncmp(snd_card_name, "msm8952-tomtom-snd-card",
sizeof("msm8952-tomtom-snd-card"))) {
strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9330,
@@ -2050,6 +2067,10 @@
sizeof("msm8953-snd-card-mtp")) ||
(!strncmp(snd_card_name, "msm8953-sku4-snd-card",
sizeof("msm8953-sku4-snd-card"))) ||
+ (!strncmp(snd_card_name, "sdm439-sku1-snd-card",
+ sizeof("sdm439-sku1-snd-card"))) ||
+ (!strncmp(snd_card_name, "sdm439-snd-card-mtp",
+ sizeof("sdm439-snd-card-mtp"))) ||
(!strncmp(snd_card_name, "msm8952-skum-snd-card",
sizeof("msm8952-skum-snd-card"))))) {
*is_wsa_combo_supported = true;
@@ -2194,7 +2215,7 @@
const char *id_string = NULL;
int cfg_value = -1;
- snd_card_num = audio_extn_utils_get_snd_card_num();
+ snd_card_num = audio_extn_utils_open_snd_mixer(&adev->mixer);
if(snd_card_num < 0) {
ALOGE("%s: Unable to find correct sound card", __func__);
return NULL;
@@ -2203,13 +2224,6 @@
adev->snd_card = snd_card_num;
ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
- adev->mixer = mixer_open(snd_card_num);
- if (!adev->mixer) {
- ALOGE("%s: Unable to open the mixer card: %d", __func__,
- snd_card_num);
- return NULL;
- }
-
snd_card_name = mixer_get_name(adev->mixer);
ALOGD("%s: snd_card_name: %s", __func__, snd_card_name);
@@ -2239,7 +2253,7 @@
ALOGE("%s: Failed to init audio route controls, aborting.",
__func__);
free(my_data);
- mixer_close(adev->mixer);
+ audio_extn_utils_close_snd_mixer(adev->mixer);
return NULL;
}
update_codec_type(snd_card_name);
@@ -2461,7 +2475,7 @@
goto acdb_init_fail;
}
- int result = acdb_init(adev->snd_card);
+ int result = acdb_init_v2(adev->mixer);
if (!result) {
my_data->is_acdb_initialized = true;
ALOGD("ACDB initialized");
@@ -2712,6 +2726,17 @@
return my_data;
}
+void platform_release_acdb_metainfo_key(void *platform)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ struct listnode *node, *tempnode;
+
+ list_for_each_safe(node, tempnode, &my_data->acdb_meta_key_list) {
+ list_remove(node);
+ free(node_to_item(node, struct meta_key_list, list));
+ }
+}
+
void platform_deinit(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
@@ -2756,10 +2781,32 @@
}
if (my_data->adev->mixer) {
- mixer_close(my_data->adev->mixer);
+ audio_extn_utils_close_snd_mixer(my_data->adev->mixer);
my_data->adev->mixer = NULL;
}
+ int32_t idx;
+
+ for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
+ if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
+ my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
+ my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].channels_mixer_ctl);
+ my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
+ }
+ }
+
+ /* free acdb_meta_key_list */
+ platform_release_acdb_metainfo_key(platform);
+
free(platform);
/* deinit usb */
audio_extn_usb_deinit();
@@ -3081,6 +3128,60 @@
return 0;
}
+int platform_get_license_by_product
+(
+ void *platform,
+ const char* product_name,
+ int* product_id,
+ char* product_license
+)
+{
+ int ret = 0;
+ int id = 0;
+ acdb_audio_cal_cfg_t cal;
+ uint32_t param_len = LICENSE_STR_MAX_LEN;
+ struct platform_data *my_data = (struct platform_data *)platform;
+
+ if ((NULL == platform) || (NULL == product_name) || (NULL == product_id)) {
+ ALOGE("[%s] Invalid input parameters",__func__);
+ ret = -EINVAL;
+ goto on_error;
+ }
+
+ id = platform_get_meta_info_key_from_list(platform, (char*)product_name);
+ if(0 == id)
+ {
+ ALOGE("%s:Id not found for %s", __func__, product_name);
+ ret = -EINVAL;
+ goto on_error;
+ }
+
+ ALOGD("%s: Found Id[%d] for %s", __func__, id, product_name);
+ if(NULL == my_data->acdb_get_audio_cal){
+ ALOGE("[%s] acdb_get_audio_cal is NULL.",__func__);
+ ret = -ENOSYS;
+ goto on_error;
+ }
+
+ memset(&cal, 0, sizeof(cal));
+ cal.persist = 1;
+ cal.cal_type = AUDIO_CORE_METAINFO_CAL_TYPE;
+ cal.acdb_dev_id = (uint32_t) id;
+ ret = my_data->acdb_get_audio_cal((void*)&cal, (void*)product_license, ¶m_len);
+
+ if (0 == ret) {
+ ALOGD("%s: Got Length[%d] License[%s]", __func__, param_len, product_license );
+ *product_id = id;
+ return 0;
+ }
+ ALOGD("%s: License not found for %s", __func__, product_name);
+
+on_error:
+ if (product_id)
+ *product_id = 0;
+ return ret;
+}
+
int platform_get_meta_info_key_from_list(void *platform, char *mod_name)
{
struct listnode *node;
@@ -4016,8 +4117,6 @@
snd_device = SND_DEVICE_OUT_BT_SCO_WB;
else
snd_device = SND_DEVICE_OUT_BT_SCO;
- } else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
- snd_device = SND_DEVICE_OUT_BT_A2DP;
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
if (my_data->is_vbat_speaker) {
if (my_data->mono_speaker == SPKR_1)
@@ -6105,7 +6204,9 @@
* Check if the device is speaker or handset,assumption handset shares
* backend with speaker, and these devices are restricited to 48kHz.
*/
- if (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device)) {
+ if (platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device) &&
+ !(codec_device_supports_native_playback(usecase->devices) &&
+ my_data->hifi_audio && !check_hdset_combo_device(snd_device))) {
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
if (bit_width >= 24) {
@@ -7365,7 +7466,8 @@
(!strcmp(snd_card_name, "msm8952-snd-card-mtp")) ||
(!strcmp(snd_card_name, "msm8976-skun-snd-card")) ||
(!strcmp(snd_card_name, "msm8953-snd-card-mtp")) ||
- (!strcmp(snd_card_name, "msm8953-sku4-snd-card")))
+ (!strcmp(snd_card_name, "msm8953-sku4-snd-card")) ||
+ (!strcmp(snd_card_name, "sdm439-snd-card-mtp")))
return 1;
else
return 0;
@@ -7891,6 +7993,18 @@
struct audio_usecase *usecase;
struct listnode *node;
+ //swap channels only for stereo spkr
+ struct platform_data *my_data = (struct platform_data *)adev->platform;
+ if (my_data) {
+ if (!hw_info_is_stereo_spkr(my_data->hw_info)) {
+ ALOGV("%s: will not swap due to it is not stereo spkr", __func__);
+ return 0;
+ }
+ } else {
+ ALOGE("%s: failed to allocate platform data", __func__);
+ return -EINVAL;
+ }
+
// do not swap channels in audio modes with concurrent capture and playback
// as this may break the echo reference
if ((adev->mode == AUDIO_MODE_IN_COMMUNICATION) || (adev->mode == AUDIO_MODE_IN_CALL)) {
@@ -7907,8 +8021,9 @@
* to perform device switch to disable the current backend to
* enable it with new acdb data.
*/
- if (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
- acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE]) {
+ if (my_data->speaker_lr_swap &&
+ (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
+ acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE])) {
const int initial_skpr_gain = ramp_speaker_gain(adev, false /*ramp_up*/, -1);
select_devices(adev, usecase->id);
if (initial_skpr_gain != -EINVAL)
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
old mode 100644
new mode 100755
index 43aeaed..f4132c2
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1374,3 +1374,8 @@
{
return -ENOSYS;
}
+
+int platform_get_license_by_product(void *platform, const char* product_name, int *product_id, char* product_license)
+{
+ return -ENOSYS;
+}
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
old mode 100644
new mode 100755
index 3924a17..8795950
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -1947,24 +1947,17 @@
const char *id_string = NULL;
int cfg_value = -1;
- adev->snd_card = audio_extn_utils_get_snd_card_num();
+ adev->snd_card = audio_extn_utils_open_snd_mixer(&adev->mixer);
if (adev->snd_card < 0) {
ALOGE("%s: Unable to find correct sound card", __func__);
return NULL;
}
ALOGD("%s: Opened sound card:%d", __func__, adev->snd_card);
- adev->mixer = mixer_open(adev->snd_card);
- if (!adev->mixer) {
- ALOGE("%s: Unable to open the mixer card: %d", __func__,
- adev->snd_card);
- return NULL;
- }
-
snd_card_name = strdup(mixer_get_name(adev->mixer));
if (!snd_card_name) {
ALOGE("failed to allocate memory for snd_card_name\n");
- mixer_close(adev->mixer);
+ audio_extn_utils_close_snd_mixer(adev->mixer);
return NULL;
}
@@ -1973,7 +1966,7 @@
ALOGE("failed to allocate platform data");
if (snd_card_name)
free(snd_card_name);
- mixer_close(adev->mixer);
+ audio_extn_utils_close_snd_mixer(adev->mixer);
return NULL;
}
@@ -1983,7 +1976,7 @@
my_data->hw_info = hw_info_init(snd_card_name);
if (!my_data->hw_info) {
ALOGE("failed to init hw_info");
- mixer_close(adev->mixer);
+ audio_extn_utils_close_snd_mixer(adev->mixer);
if (my_data)
free(my_data);
@@ -2055,7 +2048,7 @@
free(snd_card_name);
if (snd_card_name_t)
free(snd_card_name_t);
- mixer_close(adev->mixer);
+ audio_extn_utils_close_snd_mixer(adev->mixer);
return NULL;
}
@@ -2267,7 +2260,7 @@
goto acdb_init_fail;
}
- int result = acdb_init(adev->snd_card);
+ int result = acdb_init_v2(adev->mixer);
if (!result) {
my_data->is_acdb_initialized = true;
ALOGD("ACDB initialized");
@@ -2531,6 +2524,17 @@
return my_data;
}
+void platform_release_acdb_metainfo_key(void *platform)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ struct listnode *node, *tempnode;
+
+ list_for_each_safe(node, tempnode, &my_data->acdb_meta_key_list) {
+ list_remove(node);
+ free(node_to_item(node, struct meta_key_list, list));
+ }
+}
+
void platform_deinit(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
@@ -2574,10 +2578,32 @@
}
if (my_data->adev->mixer) {
- mixer_close(my_data->adev->mixer);
+ audio_extn_utils_close_snd_mixer(my_data->adev->mixer);
my_data->adev->mixer = NULL;
}
+ int32_t idx;
+
+ for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
+ if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
+ my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
+ my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
+ }
+
+ if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
+ free(my_data->current_backend_cfg[idx].channels_mixer_ctl);
+ my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
+ }
+ }
+
+ /* free acdb_meta_key_list */
+ platform_release_acdb_metainfo_key(platform);
+
free(platform);
/* deinit usb */
audio_extn_usb_deinit();
@@ -3861,8 +3887,6 @@
} else
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
}
- } else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
- snd_device = SND_DEVICE_OUT_BT_A2DP;
} else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
snd_device = SND_DEVICE_OUT_USB_HEADSET;
@@ -6218,6 +6242,13 @@
/*this is populated by check_codec_backend_cfg hence set default value to false*/
backend_cfg.passthrough_enabled = false;
+ /*check if the stream sample 44.1Khz rate is supported of configured device sample rate. If not
+ open afe at default sample rate.
+ */
+ if (backend_idx != HEADPHONE_44_1_BACKEND &&
+ usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100)
+ backend_cfg.sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+
/* Set Backend sampling rate to 176.4 for DSD64 and
* 352.8Khz for DSD128.
* Set Bit Width to 16
@@ -6241,7 +6272,8 @@
for (i = 0; i < num_devices; i++) {
ALOGI("%s: new_snd_devices[%d] is %d", __func__, i, new_snd_devices[i]);
if ((platform_check_codec_backend_cfg(adev, usecase, new_snd_devices[i],
- &backend_cfg))) {
+ &backend_cfg)) ||
+ (!platform_check_backends_match(usecase->out_snd_device, snd_device))) {
ret = platform_set_codec_backend_cfg(adev, new_snd_devices[i],
backend_cfg);
if (!ret) {
@@ -7739,6 +7771,18 @@
struct audio_usecase *usecase;
struct listnode *node;
+ //swap channels only for stereo spkr
+ struct platform_data *my_data = (struct platform_data *)adev->platform;
+ if (my_data) {
+ if (!hw_info_is_stereo_spkr(my_data->hw_info)) {
+ ALOGV("%s: will not swap due to it is not stereo spkr", __func__);
+ return 0;
+ }
+ } else {
+ ALOGE("%s: failed to allocate platform data", __func__);
+ return -EINVAL;
+ }
+
// do not swap channels in audio modes with concurrent capture and playback
// as this may break the echo reference
if ((adev->mode == AUDIO_MODE_IN_COMMUNICATION) || (adev->mode == AUDIO_MODE_IN_CALL)) {
@@ -7755,8 +7799,9 @@
* to perform device switch to disable the current backend to
* enable it with new acdb data.
*/
- if (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
- acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE]) {
+ if (my_data->speaker_lr_swap &&
+ (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
+ acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE])) {
const int initial_skpr_gain = ramp_speaker_gain(adev, false /*ramp_up*/, -1);
select_devices(adev, usecase->id);
if (initial_skpr_gain != -EINVAL)
@@ -7921,3 +7966,8 @@
return id_string;
}
+
+int platform_get_license_by_product(void *platform, const char* product_name, int *product_id, char* product_license)
+{
+ return -ENOSYS;
+}
diff --git a/hal/platform_api.h b/hal/platform_api.h
old mode 100644
new mode 100755
index 0fec452..2bacf6d
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -31,6 +31,9 @@
#define SAMPLE_RATE_11025 11025
#define sample_rate_multiple(sr, base) ((sr % base)== 0?true:false)
#define MAX_VOLUME_CAL_STEPS 15
+#define LICENSE_STR_MAX_LEN (64)
+#define PRODUCT_FFV "ffv"
+#define PRODUCT_ALLPLAY "allplay"
typedef enum {
PLATFORM,
@@ -108,6 +111,7 @@
effect_type_t effect_type);
int platform_get_snd_device_bit_width(snd_device_t snd_device);
int platform_set_acdb_metainfo_key(void *platform, char *name, int key);
+void platform_release_acdb_metainfo_key(void *platform);
int platform_get_meta_info_key_from_list(void *platform, char *mod_name);
int platform_set_native_support(int na_mode);
int platform_get_native_support();
@@ -261,4 +265,5 @@
int *fd, uint32_t *size);
int platform_get_ec_ref_loopback_snd_device(int channel_count);
const char * platform_get_snd_card_name_for_acdb_loader(const char *snd_card_name);
+int platform_get_license_by_product(void *platform, const char* product_name, int *product_id, char* product_license);
#endif // AUDIO_PLATFORM_API_H
diff --git a/hal/voice.c b/hal/voice.c
index 0a48a05..70bb7e1 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -226,16 +226,17 @@
goto error_start_voice;
}
- uc_info->in_snd_device = SND_DEVICE_NONE;
- uc_info->out_snd_device = SND_DEVICE_NONE;
-
- if (audio_is_bluetooth_sco_device(uc_info->devices) && !adev->bt_sco_on) {
- ALOGE("start_call: couldn't find BT SCO, SCO is not ready");
+ if ((audio_is_bluetooth_sco_device(uc_info->devices) && !adev->bt_sco_on) ||
+ audio_is_a2dp_out_device(uc_info->devices)) {
+ ALOGE("start_call: BT SCO is chosen but SCO is not ready, or A2DP is selected");
adev->voice.in_call = false;
ret = -EIO;
goto error_start_voice;
}
+ uc_info->in_snd_device = SND_DEVICE_NONE;
+ uc_info->out_snd_device = SND_DEVICE_NONE;
+
list_add_tail(&adev->usecase_list, &uc_info->list);
select_devices(adev, usecase_id);
diff --git a/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c b/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c
index 97b7617..967a7e3 100644
--- a/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c
+++ b/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c
@@ -278,12 +278,6 @@
status = -1;
goto exit;
}
- ptr = (char *)malloc(strlen(input) + 1);
- if (ptr == NULL) {
- DEBUG_PRINT("Low memory\n");
- status = -1;
- goto exit;
- }
/* Check for negative input */
if (*input == '-') {
DEBUG_PRINT("Negative Number is not allowed\n");
@@ -322,8 +316,6 @@
break;
}
exit:
- if (ptr != NULL)
- free(ptr);
if (status != 0)
exit(0);
return value;
diff --git a/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c b/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c
index 8c89e61..d1b4837 100644
--- a/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c
+++ b/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c
@@ -291,12 +291,6 @@
status = -1;
goto exit;
}
- ptr = (char *)malloc(strlen(input) + 1);
- if (ptr == NULL) {
- DEBUG_PRINT("Low memory\n");
- status = -1;
- goto exit;
- }
/* Check for negative input */
if (*input == '-') {
DEBUG_PRINT("Negative Number is not allowed\n");
@@ -335,8 +329,6 @@
break;
}
exit:
- if (ptr != NULL)
- free(ptr);
if (status != 0)
exit(0);
return value;
diff --git a/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c b/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c
index d5ec4c7..f35af33 100644
--- a/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c
+++ b/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c
@@ -290,12 +290,6 @@
status = -1;
goto exit;
}
- ptr = (char *)malloc(strlen(input) + 1);
- if (ptr == NULL) {
- DEBUG_PRINT("Low memory\n");
- status = -1;
- goto exit;
- }
/* Check for negative input */
if (*input == '-') {
DEBUG_PRINT("Negative Number is not allowed\n");
@@ -334,8 +328,6 @@
break;
}
exit:
- if (ptr != NULL)
- free(ptr);
if (status != 0)
exit(0);
return value;
diff --git a/qahw/inc/qahw_defs.h b/qahw/inc/qahw_defs.h
old mode 100644
new mode 100755
index c13a1a4..e67c91e
--- a/qahw/inc/qahw_defs.h
+++ b/qahw/inc/qahw_defs.h
@@ -354,6 +354,14 @@
float mixer_coeffs[AUDIO_CHANNEL_COUNT_MAX][AUDIO_CHANNEL_COUNT_MAX];
} qahw_mix_matrix_params_t;
+#define QAHW_LICENCE_STR_MAX_LENGTH (64)
+#define QAHW_PRODUCT_STR_MAX_LENGTH (64)
+typedef struct qahw_license_params {
+ char product[QAHW_PRODUCT_STR_MAX_LENGTH + 1];
+ int key;
+ char license[QAHW_LICENCE_STR_MAX_LENGTH + 1];
+} qahw_license_params_t;
+
typedef union {
struct qahw_source_tracking_param st_params;
struct qahw_sound_focus_param sf_params;
@@ -367,6 +375,7 @@
struct qahw_out_channel_map_param channel_map_params;
struct qahw_device_cfg_param device_cfg_params;
struct qahw_mix_matrix_params mix_matrix_params;
+ struct qahw_license_params license_params;
} qahw_param_payload;
typedef enum {
@@ -385,6 +394,7 @@
QAHW_PARAM_DEVICE_CONFIG, /* PARAM to set device config */
QAHW_PARAM_OUT_MIX_MATRIX_PARAMS,
QAHW_PARAM_CH_MIX_MATRIX_PARAMS,
+ QAHW_PARAM_LICENSE_PARAMS,
} qahw_param_id;
__END_DECLS
diff --git a/qahw_api/inc/qahw_defs.h b/qahw_api/inc/qahw_defs.h
old mode 100644
new mode 100755
index a33caf6..c708ce0
--- a/qahw_api/inc/qahw_defs.h
+++ b/qahw_api/inc/qahw_defs.h
@@ -354,6 +354,15 @@
float mixer_coeffs[AUDIO_CHANNEL_COUNT_MAX][AUDIO_CHANNEL_COUNT_MAX];
} qahw_mix_matrix_params_t;
+
+#define QAHW_LICENCE_STR_MAX_LENGTH (64)
+#define QAHW_PRODUCT_STR_MAX_LENGTH (64)
+typedef struct qahw_license_params {
+ char product[QAHW_PRODUCT_STR_MAX_LENGTH + 1];
+ int key;
+ char license[QAHW_LICENCE_STR_MAX_LENGTH + 1];
+} qahw_license_params_t;
+
typedef union {
struct qahw_source_tracking_param st_params;
struct qahw_sound_focus_param sf_params;
@@ -367,6 +376,7 @@
struct qahw_out_channel_map_param channel_map_params;
struct qahw_device_cfg_param device_cfg_params;
struct qahw_mix_matrix_params mix_matrix_params;
+ struct qahw_license_params license_params;
} qahw_param_payload;
typedef enum {
@@ -385,6 +395,7 @@
QAHW_PARAM_DEVICE_CONFIG, /* PARAM to set device config */
QAHW_PARAM_OUT_MIX_MATRIX_PARAMS,
QAHW_PARAM_CH_MIX_MATRIX_PARAMS,
+ QAHW_PARAM_LICENSE_PARAMS,
} qahw_param_id;
__END_DECLS
diff --git a/qahw_api/src/qahw_api.cpp b/qahw_api/src/qahw_api.cpp
index 8967e79..cbd9041 100644
--- a/qahw_api/src/qahw_api.cpp
+++ b/qahw_api/src/qahw_api.cpp
@@ -1113,6 +1113,7 @@
int qahw_unload_module(qahw_module_handle_t *hw_module)
{
+ int rc = -EINVAL;
ALOGV("%d:%s",__LINE__, __func__);
if (g_binder_enabled) {
if (!g_qas_died && ((g_qas_load_count > 0) && (--g_qas_load_count == 0))) {
@@ -1120,7 +1121,13 @@
if (qas_status(qas) == -1)
return -ENODEV;
pthread_mutex_destroy(&list_lock);
- return qas->qahw_unload_module(hw_module);
+ rc = qas->qahw_unload_module(hw_module);
+ if (g_death_notifier != NULL) {
+ IInterface::asBinder(qas)->unlinkToDeath(g_death_notifier);
+ g_death_notifier.clear();
+ }
+ g_qas = NULL;
+ return rc;
} else {
return -ENODEV;
}
diff --git a/qahw_api/test/qahw_playback_test.c b/qahw_api/test/qahw_playback_test.c
index bbad92c..3ce01ef 100644
--- a/qahw_api/test/qahw_playback_test.c
+++ b/qahw_api/test/qahw_playback_test.c
@@ -251,6 +251,7 @@
stream_param[i].ethread_data = nullptr;
stream_param[i].device_url = "stream";
stream_param[i].play_later = false;
+ stream_param[i].set_params = nullptr;
pthread_mutex_init(&stream_param[i].write_lock, (const pthread_mutexattr_t *)NULL);
pthread_cond_init(&stream_param[i].write_cond, (const pthread_condattr_t *) NULL);
@@ -797,6 +798,14 @@
if (bytes_to_read <= 0)
read_complete_file = true;
+ if (params->set_params) {
+ rc = qahw_out_set_parameters(params->out_handle, params->set_params);
+ if (rc) {
+ fprintf(log_file, "stream %s: failed to set kvpairs\n", params->set_params);
+ fprintf(stderr, "stream %s: failed to set kvpairs\n", params->set_params);
+ }
+ }
+
while (!exit && !stop_playback) {
if (!bytes_remaining) {
fprintf(log_file, "\nstream %d: reading bytes %zd\n", params->stream_index, bytes_wanted);
@@ -2095,7 +2104,7 @@
while ((opt = getopt_long(argc,
argv,
- "-f:r:c:b:d:s:v:V:l:t:a:w:k:PD:KF:Ee:A:u:m:S:C:p::x:y:qQh:i:h:g:",
+ "-f:r:c:b:d:s:v:V:l:t:a:w:k:PD:KF:Ee:A:u:m:S:C:p::x:y:qQh:i:h:g:O:",
long_options,
&option_index)) != -1) {
@@ -2233,6 +2242,9 @@
case 'K':
kpi_mode = true;
break;
+ case 'O':
+ stream_param[i].set_params = optarg;
+ break;
case 'F':
stream_param[i].flags = atoll(optarg);
stream_param[i].flags_set = true;
@@ -2533,6 +2545,7 @@
fprintf(log_file, "stream %d: Bitwidth:%d\n", stream->stream_index, stream->config.offload_info.bit_width);
fprintf(log_file, "stream %d: AAC Format Type:%d\n", stream->stream_index, stream->aac_fmt_type);
fprintf(log_file, "stream %d: Kvpair Values:%s\n", stream->stream_index, stream->kvpair_values);
+ fprintf(log_file, "stream %d: set params Values:%s\n", stream->stream_index, stream->set_params);
fprintf(log_file, "Log file:%s\n", log_filename);
fprintf(log_file, "Volume level:%f\n", vol_level);
diff --git a/qahw_api/test/qahw_playback_test.h b/qahw_api/test/qahw_playback_test.h
index 66229f5..b8bddbc 100644
--- a/qahw_api/test/qahw_playback_test.h
+++ b/qahw_api/test/qahw_playback_test.h
@@ -143,6 +143,7 @@
pthread_cond_t input_buffer_available_cond;
pthread_mutex_t input_buffer_available_lock;
uint32_t input_buffer_available_size;
+ char *set_params;
}stream_config;
qahw_module_handle_t * load_hal(audio_devices_t dev);
diff --git a/qahw_api/test/qap_wrapper_extn.c b/qahw_api/test/qap_wrapper_extn.c
index a084277..9cd9fd6 100644
--- a/qahw_api/test/qap_wrapper_extn.c
+++ b/qahw_api/test/qap_wrapper_extn.c
@@ -814,6 +814,22 @@
break;
}
+ case QAP_MODULE_CALLBACK_EVENT_INPUT_CFG_CHANGE:
+ {
+ if (size < sizeof(qap_input_config_t)) {
+ ALOGE("%s %d event id %d, wrong payload size %d\n",
+ __func__, __LINE__, event_id, size);
+ break;
+ }
+ qap_input_config_t *p_stream_format = (qap_input_config_t*)data;
+
+ ALOGV(" %s %d Input format updated; sample_rate %lu, channels %lu, bitwidth %lu",
+ __func__, __LINE__,
+ p_stream_format->sample_rate,
+ p_stream_format->channels,
+ p_stream_format->bit_width);
+ break;
+ }
default:
break;
}