Merge "configs: support 5.1 channel over USB on sdm845/sdm710"
diff --git a/configs/msm8953/mixer_paths.xml b/configs/msm8953/mixer_paths.xml
index a20c6cf..2e3f46d 100644
--- a/configs/msm8953/mixer_paths.xml
+++ b/configs/msm8953/mixer_paths.xml
@@ -376,6 +376,11 @@
<ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia7" value="1" />
</path>
+ <path name="compress-offload-playback2 bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="compress-offload-playback2 bt-sco" />
+ </path>
+
<path name="compress-offload-playback transmission-fm">
<ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia4" value="1" />
</path>
diff --git a/configs/msm8953/mixer_paths_mtp.xml b/configs/msm8953/mixer_paths_mtp.xml
index 616b31a..7fd1fc5 100644
--- a/configs/msm8953/mixer_paths_mtp.xml
+++ b/configs/msm8953/mixer_paths_mtp.xml
@@ -439,6 +439,11 @@
<ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia7" value="1" />
</path>
+ <path name="compress-offload-playback2 bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="compress-offload-playback2 bt-sco" />
+ </path>
+
<path name="compress-offload-playback2 hdmi">
<ctl name="QUIN_MI2S_RX Audio Mixer MultiMedia7" value="1" />
</path>
diff --git a/configs/msm8953/mixer_paths_qrd_skum.xml b/configs/msm8953/mixer_paths_qrd_skum.xml
index d504456..536debc 100644
--- a/configs/msm8953/mixer_paths_qrd_skum.xml
+++ b/configs/msm8953/mixer_paths_qrd_skum.xml
@@ -362,6 +362,11 @@
<ctl name="INTERNAL_BT_SCO_RX Audio Mixer MultiMedia7" value="1" />
</path>
+ <path name="compress-offload-playback2 bt-sco-wb">
+ <ctl name="Internal BTSCO SampleRate" value="BTSCO_RATE_16KHZ" />
+ <path name="compress-offload-playback2 bt-sco" />
+ </path>
+
<path name="compress-offload-playback transmission-fm">
<ctl name="INTERNAL_FM_RX Audio Mixer MultiMedia4" value="1" />
</path>
diff --git a/configs/msmnile/audio_effects.conf b/configs/msmnile/audio_effects.conf
index ddf578f..8b9189a 100644
--- a/configs/msmnile/audio_effects.conf
+++ b/configs/msmnile/audio_effects.conf
@@ -33,6 +33,9 @@
loudness_enhancer {
path /vendor/lib/soundfx/libldnhncr.so
}
+ dynamics_processing {
+ path /vendor/lib/soundfx/libdynproc.so
+ }
proxy {
path /vendor/lib/soundfx/libeffectproxy.so
}
@@ -226,6 +229,10 @@
library loudness_enhancer
uuid fa415329-2034-4bea-b5dc-5b381c8d1e2c
}
+ dynamics_processing {
+ library dynamics_processing
+ uuid e0e6539b-1781-7261-676f-6d7573696340
+ }
aec {
library audio_pre_processing
uuid 0f8d0d2a-59e5-45fe-b6e4-248c8a799109
diff --git a/configs/msmnile/audio_effects.xml b/configs/msmnile/audio_effects.xml
new file mode 100644
index 0000000..7c0cd22
--- /dev/null
+++ b/configs/msmnile/audio_effects.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--- 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. -->
+
+<audio_effects_conf version="2.0" xmlns="http://schemas.android.com/audio/audio_effects_conf/v2_0">
+ <libraries>
+ <library name="bundle" path="libbundlewrapper.so"/>
+ <library name="reverb" path="libreverbwrapper.so"/>
+ <library name="qcbassboost" path="libqcbassboost.so"/>
+ <library name="qcvirt" path="libqcvirt.so"/>
+ <library name="qcreverb" path="libqcreverb.so"/>
+ <library name="visualizer_sw" path="libvisualizer.so"/>
+ <library name="visualizer_hw" path="libqcomvisualizer.so"/>
+ <library name="downmix" path="libdownmix.so"/>
+ <library name="loudness_enhancer" path="libldnhncr.so"/>
+ <library name="dynamics_processing" path="libdynproc.so"/>
+ <library name="proxy" path="libeffectproxy.so"/>
+ <library name="offload_bundle" path="libqcompostprocbundle.so"/>
+ <library name="audio_pre_processing" path="libqcomvoiceprocessing.so"/>
+ <library name="volume_listener" path="libvolumelistener.so"/>
+ <library name="audiosphere" path="libasphere.so"/>
+ <library name="shoebox" path="libshoebox.so"/>
+ </libraries>
+ <effects>
+ <effectProxy name="bassboost" library="proxy" uuid="14804144-a5ee-4d24-aa88-0002a5d5c51b">
+ <libsw library="qcbassboost" uuid="23aca180-44bd-11e2-bcfd-0800200c9a66"/>
+ <libhw library="offload_bundle" uuid="2c4a8c24-1581-487f-94f6-0002a5d5c51b"/>
+ </effectProxy>
+ <effectProxy name="virtualizer" library="proxy" uuid="d3467faa-acc7-4d34-acaf-0002a5d5c51b">
+ <libsw library="qcvirt" uuid="e6c98a16-22a3-11e2-b87b-f23c91aec05e"/>
+ <libhw library="offload_bundle" uuid="509a4498-561a-4bea-b3b1-0002a5d5c51b"/>
+ </effectProxy>
+ <effectProxy name="equalizer" library="proxy" uuid="c8e70ecd-48ca-456e-8a4f-0002a5d5c51b">
+ <libsw library="bundle" uuid="ce772f20-847d-11df-bb17-0002a5d5c51b"/>
+ <libhw library="offload_bundle" uuid="a0dac280-401c-11e3-9379-0002a5d5c51b"/>
+ </effectProxy>
+ <effect name="volume" library="bundle" uuid="119341a0-8469-11df-81f9-0002a5d5c51b"/>
+ <effectProxy name="reverb_env_aux" library="proxy" uuid="48404ac9-d202-4ccc-bf84-0002a5d5c51b">
+ <libsw library="qcreverb" uuid="a8c1e5f3-293d-43cd-95ec-d5e26c02e217"/>
+ <libhw library="offload_bundle" uuid="79a18026-18fd-4185-8233-0002a5d5c51b"/>
+ </effectProxy>
+ <effectProxy name="reverb_env_ins" library="proxy" uuid="b707403a-a1c1-4291-9573-0002a5d5c51b">
+ <libsw library="qcreverb" uuid="791fff8b-8129-4655-83a4-59bc61034c3a"/>
+ <libhw library="offload_bundle" uuid="eb64ea04-973b-43d2-8f5e-0002a5d5c51b"/>
+ </effectProxy>
+ <effectProxy name="reverb_pre_aux" library="proxy" uuid="1b78f587-6d1c-422e-8b84-0002a5d5c51b">
+ <libsw library="qcreverb" uuid="53ef1db5-c0c0-445b-b060-e34d20ebb70a"/>
+ <libhw library="offload_bundle" uuid="6987be09-b142-4b41-9056-0002a5d5c51b"/>
+ </effectProxy>
+ <effectProxy name="reverb_pre_ins" library="proxy" uuid="f3e178d2-ebcb-408e-8357-0002a5d5c51b">
+ <libsw library="qcreverb" uuid="b08a0e38-22a5-11e2-b87b-f23c91aec05e"/>
+ <libhw library="offload_bundle" uuid="aa2bebf6-47cf-4613-9bca-0002a5d5c51b"/>
+ </effectProxy>
+ <effectProxy name="visualizer" library="proxy" uuid="1d0a1a53-7d5d-48f2-8e71-27fbd10d842c">
+ <libsw library="visualizer_sw" uuid="d069d9e0-8329-11df-9168-0002a5d5c51b"/>
+ <libhw library="visualizer_hw" uuid="7a8044a0-1a71-11e3-a184-0002a5d5c51b"/>
+ </effectProxy>
+ <effect name="downmix" library="downmix" uuid="93f04452-e4fe-41cc-91f9-e475b6d1d69f"/>
+ <effect name="hw_acc" library="offload_bundle" uuid="7d1580bd-297f-4683-9239-e475b6d1d69f"/>
+ <effect name="loudness_enhancer" library="loudness_enhancer" uuid="fa415329-2034-4bea-b5dc-5b381c8d1e2c"/>
+ <effect name="dynamics_processing" library="dynamics_processing" uuid="e0e6539b-1781-7261-676f-6d7573696340"/>
+ <effect name="aec" library="audio_pre_processing" uuid="0f8d0d2a-59e5-45fe-b6e4-248c8a799109"/>
+ <effect name="ns" library="audio_pre_processing" uuid="1d97bb0b-9e2f-4403-9ae3-58c2554306f8"/>
+ <effect name="music_helper" library="volume_listener" uuid="08b8b058-0590-11e5-ac71-0025b32654a0"/>
+ <effect name="ring_helper" library="volume_listener" uuid="0956df94-0590-11e5-bdbe-0025b32654a0"/>
+ <effect name="alarm_helper" library="volume_listener" uuid="09f303e2-0590-11e5-8fdb-0025b32654a0"/>
+ <effect name="voice_helper" library="volume_listener" uuid="0ace5c08-0590-11e5-ae9e-0025b32654a0"/>
+ <effect name="notification_helper" library="volume_listener" uuid="0b776dde-0590-11e5-81ba-0025b32654a0"/>
+ <effect name="audiosphere" library="audiosphere" uuid="184e62ab-2d19-4364-9d1b-c0a40733866c"/>
+ <effect name="shoebox" library="shoebox" uuid="1eab784c-1a36-4b2a-b7fc-e34c44cab89e"/>
+ </effects>
+ <postprocess>
+ <stream type="music">
+ <apply effect="music_helper"/>
+ </stream>
+ <stream type="ring">
+ <apply effect="ring_helper"/>
+ </stream>
+ <stream type="alarm">
+ <apply effect="alarm_helper"/>
+ </stream>
+ <stream type="voice_call">
+ <apply effect="voice_helper"/>
+ </stream>
+ <stream type="notification">
+ <apply effect="notification_helper"/>
+ </stream>
+ </postprocess>
+ <preprocess>
+ <stream type="voice_communication">
+ <apply effect="aec"/>
+ <apply effect="ns"/>
+ </stream>
+ </preprocess>
+</audio_effects_conf>
diff --git a/configs/msmnile/audio_platform_info.xml b/configs/msmnile/audio_platform_info.xml
index baf1455..5ecec70 100644
--- a/configs/msmnile/audio_platform_info.xml
+++ b/configs/msmnile/audio_platform_info.xml
@@ -46,20 +46,20 @@
<module_ids>
<aec>
- <device name="SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS" module_id="0x10F17" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
- <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE" module_id="0x10F18" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
- <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
- <device name="SND_DEVICE_IN_SPEAKER_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
- <device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
- <device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
+ <device name="SND_DEVICE_IN_SPEAKER_TMIC_AEC_NS" module_id="0x10F35" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
+ <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE" module_id="0x10F34" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
+ <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS" module_id="0x10F33" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
+ <device name="SND_DEVICE_IN_SPEAKER_MIC_AEC_NS" module_id="0x10F31" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
+ <device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F33" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
+ <device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F31" instance_id="0x0" param_id="0x10EAF" param_value="0x01"/>
</aec>
<ns>
- <device name="SND_DEVICE_IN_SPEAKER_QMIC_AEC_NS" module_id="0x10F17" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
- <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE" module_id="0x10F18" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
- <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
- <device name="SND_DEVICE_IN_SPEAKER_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
- <device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
- <device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
+ <device name="SND_DEVICE_IN_SPEAKER_TMIC_AEC_NS" module_id="0x10F35" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
+ <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE" module_id="0x10F34" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
+ <device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS" module_id="0x10F33" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
+ <device name="SND_DEVICE_IN_SPEAKER_MIC_AEC_NS" module_id="0x10F31" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
+ <device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F33" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
+ <device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F31" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
</ns>
</module_ids>
@@ -107,7 +107,7 @@
<!-- followed by perf lock options -->
<param key="perf_lock_opts" value="4, 0x40400000, 0x1, 0x40C00000, 0x1"/>
<param key="native_audio_mode" value="src"/>
- <param key="input_mic_max_count" value="4"/>
+ <param key="input_mic_max_count" value="3"/>
<param key="true_32_bit" value="true"/>
<!-- In the below value string, the value indicates sidetone gain in dB -->
<param key="usb_sidetone_gain" value="35"/>
diff --git a/configs/msmnile/audio_policy_configuration.xml b/configs/msmnile/audio_policy_configuration.xml
index 25ac786..b7c7ef3 100644
--- a/configs/msmnile/audio_policy_configuration.xml
+++ b/configs/msmnile/audio_policy_configuration.xml
@@ -272,11 +272,11 @@
</devicePort>
<devicePort tagName="USB Device Out" type="AUDIO_DEVICE_OUT_USB_DEVICE" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="dynamic"/>
</devicePort>
<devicePort tagName="USB Headset Out" type="AUDIO_DEVICE_OUT_USB_HEADSET" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="dynamic"/>
</devicePort>
<!-- Input devices declaration, i.e. Source DEVICE PORT -->
diff --git a/configs/msmnile/mixer_paths_tavil.xml b/configs/msmnile/mixer_paths_tavil.xml
old mode 100644
new mode 100755
index 45f4046..2e0f9c5
--- a/configs/msmnile/mixer_paths_tavil.xml
+++ b/configs/msmnile/mixer_paths_tavil.xml
@@ -340,15 +340,15 @@
<ctl name="ADC2 Volume" value="12" />
<ctl name="ADC3 Volume" value="0" />
<ctl name="ADC4 Volume" value="0" />
- <ctl name="DEC0 Volume" value="84" />
- <ctl name="DEC1 Volume" value="84" />
- <ctl name="DEC2 Volume" value="84" />
- <ctl name="DEC3 Volume" value="84" />
- <ctl name="DEC4 Volume" value="84" />
- <ctl name="DEC5 Volume" value="84" />
- <ctl name="DEC6 Volume" value="84" />
- <ctl name="DEC7 Volume" value="84" />
- <ctl name="DEC8 Volume" value="84" />
+ <ctl name="DEC0 Volume" value="102" />
+ <ctl name="DEC1 Volume" value="102" />
+ <ctl name="DEC2 Volume" value="102" />
+ <ctl name="DEC3 Volume" value="102" />
+ <ctl name="DEC4 Volume" value="102" />
+ <ctl name="DEC5 Volume" value="102" />
+ <ctl name="DEC6 Volume" value="102" />
+ <ctl name="DEC7 Volume" value="102" />
+ <ctl name="DEC8 Volume" value="102" />
<!-- Compander controls -->
<ctl name="COMP1 Switch" value="1" />
@@ -1913,11 +1913,11 @@
</path>
<path name="speaker-mic">
- <path name="dmic2" />
+ <path name="dmic3" />
</path>
<path name="speaker-mic-liquid">
- <path name="dmic2" />
+ <path name="dmic3" />
</path>
<path name="speaker-mic-sbc">
@@ -2007,10 +2007,26 @@
<ctl name="SLIM_0_TX Channels" value="Three" />
<ctl name="CDC_IF TX5 MUX" value="DEC5" />
<ctl name="ADC MUX5" value="DMIC" />
- <ctl name="DMIC MUX5" value="DMIC0" />
+ <ctl name="DMIC MUX5" value="DMIC2" />
<ctl name="CDC_IF TX6 MUX" value="DEC6" />
<ctl name="ADC MUX6" value="DMIC" />
- <ctl name="DMIC MUX6" value="DMIC2" />
+ <ctl name="DMIC MUX6" value="DMIC0" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC5" />
+ </path>
+
+ <path name="three-mic-qrd">
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Three" />
+ <ctl name="CDC_IF TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC2" />
+ <ctl name="CDC_IF TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC3" />
<ctl name="CDC_IF TX8 MUX" value="DEC8" />
<ctl name="ADC MUX8" value="DMIC" />
<ctl name="DMIC MUX8" value="DMIC5" />
@@ -2145,6 +2161,10 @@
<path name="speaker-mic" />
</path>
+ <path name="voice-speaker-mic-qrd">
+ <path name="speaker-mic-qrd" />
+ </path>
+
<path name="voice-headphones">
<path name="headphones" />
</path>
@@ -2298,6 +2318,24 @@
<ctl name="IIR0 INP0 MUX" value="DEC6" />
</path>
+ <path name="aanc-handset-mic-qrd">
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX9" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Three" />
+ <ctl name="AANC_SLIM_0_RX MUX" value="SLIMBUS_0_TX" />
+ <ctl name="CDC_IF TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC2" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC0" />
+ <ctl name="CDC_IF TX9 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC5" />
+ <ctl name="IIR0 INP0 MUX" value="DEC6" />
+ </path>
+
<!-- Dual MIC devices -->
<path name="handset-dmic-endfire">
<ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
@@ -2316,13 +2354,37 @@
<ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
<ctl name="CDC_IF TX7 MUX" value="DEC7" />
<ctl name="ADC MUX7" value="DMIC" />
- <ctl name="DMIC MUX7" value="DMIC0" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
<ctl name="CDC_IF TX8 MUX" value="DEC8" />
<ctl name="ADC MUX8" value="DMIC" />
<ctl name="DMIC MUX8" value="DMIC5" />
<ctl name="SLIM_0_TX Channels" value="Two" />
</path>
+ <path name="handset-dmic-endfire-qrd">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC5" />
+ <ctl name="SLIM_0_TX Channels" value="Two" />
+ </path>
+
+ <path name="speaker-dmic-endfire-qrd">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC0" />
+ <ctl name="SLIM_0_TX Channels" value="Two" />
+ </path>
+
<path name="dmic-endfire">
<path name="handset-dmic-endfire" />
<ctl name="IIR0 INP0 MUX" value="DEC7" />
@@ -2333,6 +2395,10 @@
<ctl name="IIR0 INP0 MUX" value="DEC7" />
</path>
+ <path name="dmic-endfire-qrd">
+ <path name="handset-dmic-endfire-qrd" />
+ </path>
+
<path name="handset-stereo-dmic-ef">
<path name="handset-dmic-endfire" />
</path>
@@ -2385,16 +2451,32 @@
<path name="dmic-endfire-liquid" />
</path>
+ <path name="handset-stereo-dmic-ef-qrd">
+ <path name="handset-dmic-endfire-qrd" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef-qrd">
+ <path name="speaker-dmic-endfire-qrd" />
+ </path>
+
+ <path name="voice-dmic-ef-qrd">
+ <path name="dmic-endfire-qrd" />
+ </path>
+
+ <path name="voice-speaker-dmic-ef-qrd">
+ <path name="speaker-dmic-endfire-qrd" />
+ </path>
+
<path name="speaker-dmic-broadside">
<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="Two" />
<ctl name="CDC_IF TX7 MUX" value="DEC7" />
<ctl name="ADC MUX7" value="DMIC" />
- <ctl name="DMIC MUX7" value="DMIC0" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
<ctl name="CDC_IF TX8 MUX" value="DEC8" />
<ctl name="ADC MUX8" value="DMIC" />
- <ctl name="DMIC MUX8" value="DMIC2" />
+ <ctl name="DMIC MUX8" value="DMIC0" />
</path>
<path name="dmic-broadside">
@@ -2414,10 +2496,26 @@
<ctl name="SLIM_0_TX Channels" value="Three" />
<ctl name="CDC_IF TX5 MUX" value="DEC5" />
<ctl name="ADC MUX5" value="DMIC" />
- <ctl name="DMIC MUX5" value="DMIC0" />
+ <ctl name="DMIC MUX5" value="DMIC2" />
<ctl name="CDC_IF TX6 MUX" value="DEC6" />
<ctl name="ADC MUX6" value="DMIC" />
- <ctl name="DMIC MUX6" value="DMIC2" />
+ <ctl name="DMIC MUX6" value="DMIC0" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC5" />
+ </path>
+
+ <path name="speaker-tmic-qrd">
+ <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="SLIM_0_TX Channels" value="Three" />
+ <ctl name="CDC_IF TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC2" />
+ <ctl name="CDC_IF TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC0" />
<ctl name="CDC_IF TX7 MUX" value="DEC7" />
<ctl name="ADC MUX7" value="DMIC" />
<ctl name="DMIC MUX7" value="DMIC5" />
@@ -2427,6 +2525,10 @@
<path name="speaker-tmic" />
</path>
+ <path name="voice-speaker-tmic-qrd">
+ <path name="speaker-tmic-qrd" />
+ </path>
+
<!-- Quad MIC devices -->
<path name="speaker-qmic">
<ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
@@ -2436,13 +2538,33 @@
<ctl name="SLIM_0_TX Channels" value="Four" />
<ctl name="CDC_IF TX5 MUX" value="DEC5" />
<ctl name="ADC MUX5" value="DMIC" />
- <ctl name="DMIC MUX5" value="DMIC1" />
+ <ctl name="DMIC MUX5" value="DMIC2" />
<ctl name="CDC_IF TX6 MUX" value="DEC6" />
<ctl name="ADC MUX6" value="DMIC" />
<ctl name="DMIC MUX6" value="DMIC0" />
<ctl name="CDC_IF TX7 MUX" value="DEC7" />
<ctl name="ADC MUX7" value="DMIC" />
- <ctl name="DMIC MUX7" value="DMIC2" />
+ <ctl name="DMIC MUX7" value="DMIC5" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC4" />
+ </path>
+
+ <path name="speaker-qmic-qrd">
+ <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="CDC_IF TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC2" />
+ <ctl name="CDC_IF TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC3" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC0" />
<ctl name="CDC_IF TX8 MUX" value="DEC8" />
<ctl name="ADC MUX8" value="DMIC" />
<ctl name="DMIC MUX8" value="DMIC5" />
@@ -2467,6 +2589,14 @@
<path name="speaker-qmic-liquid" />
</path>
+ <path name="quad-mic-qrd">
+ <path name="speaker-qmic-qrd" />
+ </path>
+
+ <path name="voice-speaker-qmic-qrd">
+ <path name="speaker-qmic-qrd" />
+ </path>
+
<!-- TTY devices -->
<path name="tty-headphones">
diff --git a/configs/msmnile/msmnile.mk b/configs/msmnile/msmnile.mk
index 6c12107..f06954e 100644
--- a/configs/msmnile/msmnile.mk
+++ b/configs/msmnile/msmnile.mk
@@ -8,7 +8,7 @@
USE_CUSTOM_AUDIO_POLICY := 1
AUDIO_FEATURE_ENABLED_COMPRESS_CAPTURE := false
AUDIO_FEATURE_ENABLED_COMPRESS_VOIP := false
-AUDIO_FEATURE_ENABLED_DYNAMIC_ECNS := false
+AUDIO_FEATURE_ENABLED_DYNAMIC_ECNS := true
AUDIO_FEATURE_ENABLED_EXTN_FORMATS := true
AUDIO_FEATURE_ENABLED_EXTN_FLAC_DECODER := true
AUDIO_FEATURE_ENABLED_EXTN_RESAMPLER := true
@@ -66,6 +66,7 @@
AUDIO_FEATURE_ENABLED_SND_MONITOR := true
AUDIO_FEATURE_ENABLED_DLKM := true
AUDIO_FEATURE_ENABLED_USB_BURST_MODE := true
+AUDIO_FEATURE_ENABLED_SVA_MULTI_STAGE := true
##AUDIO_FEATURE_FLAGS
ifneq ($(strip $(TARGET_USES_QSSI)), true)
@@ -76,6 +77,7 @@
PRODUCT_COPY_FILES += \
hardware/qcom/audio/configs/msmnile/audio_output_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_output_policy.conf \
hardware/qcom/audio/configs/msmnile/audio_effects.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.conf \
+ hardware/qcom/audio/configs/msmnile/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
hardware/qcom/audio/configs/msmnile/mixer_paths_tavil.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_tavil.xml \
hardware/qcom/audio/configs/msmnile/audio_tuning_mixer_tavil.txt:$(TARGET_COPY_OUT_VENDOR)/etc/audio_tuning_mixer_tavil.txt \
hardware/qcom/audio/configs/msmnile/audio_tuning_mixer.txt:$(TARGET_COPY_OUT_VENDOR)/etc/audio_tuning_mixer.txt \
diff --git a/configs/msmnile/sound_trigger_platform_info.xml b/configs/msmnile/sound_trigger_platform_info.xml
index 3f14715..27a6c04 100644
--- a/configs/msmnile/sound_trigger_platform_info.xml
+++ b/configs/msmnile/sound_trigger_platform_info.xml
@@ -26,11 +26,14 @@
<!--- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -->
<!--- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
<sound_trigger_platform_info>
- <param version="0x0102" /> <!-- this must be the first param -->
+ <param version="0x0103" /> <!-- this must be the first param -->
<!--- Version History: -->
<!--- 0x0101: Legacy version. -->
<!--- 0x0102: Includes acdb_ids param with the gcs_usecase tag. This matches -->
<!--- the gcs_usecase with the acdb device that uses it. -->
+<!--- 0x0103: app_type and in_channels added to <lsm usecase> and out_channels -->
+<!--- added to <adm_config> -->
+
<common_config>
<param max_cpe_sessions="1" />
<param max_wdsp_sessions="2" />
@@ -65,8 +68,7 @@
<!-- QTI SVA -->
<sound_model_config>
<param vendor_uuid="68ab2d40-e860-11e3-95ef-0002a5d5c51b" />
- <param execution_type="WDSP" /> <!-- value: "WDSP" "ADSP" "DYNAMIC" -->
- <param app_type="2" /> <!-- app type used in ACDB -->
+ <param execution_type="DYNAMIC" /> <!-- value: "WDSP" "ADSP" "DYNAMIC" -->
<param library="libsmwrapper.so" />
<param max_cpe_phrases="6" />
<param max_cpe_users="3" />
@@ -75,13 +77,15 @@
<!-- Profile specific data which the algorithm can support -->
<param sample_rate="16000" />
<param bit_width="16" />
- <param channel_count="1"/>
+ <param out_channels="1"/> <!-- Module output channels -->
+
<!-- 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="FLUENCE_DMIC" />
+ <param adm_cfg_profile="FFECNS" />
+ <!-- fluence_type: "FLUENCE", "FLUENCE_DMIC", "FLUENCE_TMIC" -->
+ <!-- "FLUENCE_QMIC". Param value is valid when adm_cfg_profile -->
+ <!-- is one of FLUENCE, FLUENCE_STEREO, FFECNS values -->
+ <param fluence_type="FLUENCE_TMIC" />
<!-- wdsp_fluence_type: fluence disabled: "NONE" -->
<!-- fluence enabled: "FLUENCE_DMIC", "FLUENCE_TMIC", "FLUENCE_QMIC" -->
<param wdsp_fluence_type="NONE" />
@@ -153,6 +157,8 @@
valid execution_type values: "WDSP" "ADSP" -->
<lsm_usecase>
<param execution_mode="ADSP" />
+ <param app_type="2" /> <!-- app type used in ACDB -->
+ <param in_channels="5"/> <!-- Module input channels -->
<param load_sound_model_ids="0x00012C1C, 0x00012C14" />
<param unload_sound_model_ids="0x00012C1C, 0x00012C15" />
<param confidence_levels_ids="0x00012C1C, 0x00012C07" />
@@ -161,15 +167,6 @@
<param custom_config_ids="0x00012C1C, 0x00012C20" />
</lsm_usecase>
- <lsm_usecase>
- <param execution_mode="WDSP" />
- <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" />
- <param custom_config_ids="0x00012C0D, 0x00012C20" />
- </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
@@ -182,7 +179,6 @@
<sound_model_config>
<param vendor_uuid="876c1b46-9d4d-40cc-a4fd-4d5ec7a80e47" />
<param execution_type="WDSP" /> <!-- value: "WDSP" "ADSP" "DYNAMIC" -->
- <param app_type="4" /> <!-- app type for MD used in ACDB -->
<param library="libsmwrapper.so" />
<param max_cpe_phrases="1" />
<param max_cpe_users="1" />
@@ -191,12 +187,13 @@
<!-- Profile specific data which the algorithm can support -->
<param sample_rate="16000" />
<param bit_width="16" />
- <param channel_count="1"/>
+ <param out_channels="1"/> <!-- Module output channels -->
<!-- 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"-->
+ <!-- fluence_type: "FLUENCE", "FLUENCE_DMIC", "FLUENCE_TMIC" -->
+ <!-- "FLUENCE_QMIC". Param value is valid when adm_cfg_profile -->
+ <!-- is one of FLUENCE, FLUENCE_STEREO, FFECNS values -->
<param fluence_type="FLUENCE_DMIC" />
<!-- wdsp_fluence_type: fluence disabled: "NONE" -->
<!-- fluence enabled: "FLUENCE_DMIC", "FLUENCE_TMIC", "FLUENCE_QMIC" -->
@@ -219,6 +216,8 @@
valid execution_type values: only "ADSP" -->
<lsm_usecase>
<param execution_mode="ADSP" />
+ <param app_type="4" /> <!-- app type for MD used in ACDB -->
+ <param in_channels="1"/> <!-- Module input channels -->
<param load_sound_model_ids="0x00012C22, 0x00012C14" />
<param unload_sound_model_ids="0x00012C22, 0x00012C15" />
<param confidence_levels_ids="0x00012C22, 0x00012C07" />
@@ -238,7 +237,6 @@
<sound_model_config>
<param vendor_uuid="7038ddc8-30f2-11e6-b0ac-40a8f03d3f15" />
<param execution_type="WDSP" /> <!-- value: "WDSP" "ADSP" "DYNAMIC" -->
- <param app_type="3" /> <!-- app type used in ACDB -->
<param library="none" />
<param max_cpe_phrases="1" />
<param max_cpe_users="1" />
@@ -247,12 +245,13 @@
<!-- Profile specific data which the algorithm can support -->
<param sample_rate="16000" />
<param bit_width="16" />
- <param channel_count="1"/>
+ <param out_channels="1"/> <!-- Module output channels -->
<!-- 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 adm_cfg_profile="FLUENCE"-->
+ <!-- fluence_type: "FLUENCE", "FLUENCE_DMIC", "FLUENCE_TMIC" -->
+ <!-- "FLUENCE_QMIC". Param value is valid when adm_cfg_profile -->
+ <!-- is one of FLUENCE, FLUENCE_STEREO, FFECNS values -->
<param fluence_type="FLUENCE_DMIC" />
<!-- wdsp_fluence_type: fluence disabled: "NONE" -->
<!-- fluence enabled: "FLUENCE_DMIC", "FLUENCE_QMIC" -->
@@ -282,6 +281,8 @@
<lsm_usecase>
<param execution_mode="ADSP" />
+ <param app_type="3" /> <!-- app type used in ACDB -->
+ <param in_channels="1"/> <!-- Module input channels -->
<param load_sound_model_ids="0x18000001, 0x00012C14" />
<param unload_sound_model_ids="0x18000001, 0x00012C15" />
<param confidence_levels_ids="0x18000001, 0x00012C07" />
@@ -290,15 +291,6 @@
<param custom_config_ids="0x18000001, 0x00012C20" />
</lsm_usecase>
- <lsm_usecase>
- <param execution_mode="WDSP" />
- <param load_sound_model_ids="0x18000001, 0x00012C14" />
- <param unload_sound_model_ids="0x18000001, 0x00012C15" />
- <param confidence_levels_ids="0x18000001, 0x00012C07" />
- <param operation_mode_ids="0x18000001, 0x00012C02" />
- <param custom_config_ids="0x18000001, 0x00012C20" />
- </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
@@ -354,6 +346,14 @@
<param bit_width="16" />
</adm_config>
+ <adm_config>
+ <param adm_cfg_profile="FFECNS" />
+ <param app_type="69947" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param out_channels="5"/>
+ </adm_config>
+
<!-- backend_type tag defines backend type for each device -->
<!-- Default value is assumed for devices that are not listed here -->
<backend_type>
diff --git a/configs/sdm845/sdm845.mk b/configs/sdm845/sdm845.mk
index 1b6383c..de2974d 100644
--- a/configs/sdm845/sdm845.mk
+++ b/configs/sdm845/sdm845.mk
@@ -62,6 +62,7 @@
BOARD_SUPPORTS_QAHW := false
AUDIO_FEATURE_ENABLED_RAS := true
AUDIO_FEATURE_ENABLED_SND_MONITOR := true
+AUDIO_FEATURE_ENABLED_SVA_MULTI_STAGE := true
##AUDIO_FEATURE_FLAGS
ifneq ($(strip $(TARGET_USES_QSSI)), true)
@@ -247,4 +248,10 @@
android.hardware.audio@2.0-service \
android.hardware.audio@2.0-impl \
android.hardware.audio.effect@2.0-impl \
- android.hardware.soundtrigger@2.1-impl
+ android.hardware.soundtrigger@2.1-impl \
+ android.hardware.audio@4.0 \
+ android.hardware.audio.common@4.0 \
+ android.hardware.audio.common@4.0-util \
+ android.hardware.audio@4.0-impl \
+ android.hardware.audio.effect@4.0 \
+ android.hardware.audio.effect@4.0-impl
diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c
index b7f5af7..0fa30d0 100644
--- a/hal/audio_extn/soundtrigger.c
+++ b/hal/audio_extn/soundtrigger.c
@@ -436,9 +436,6 @@
if (!st_dev)
return;
- if (st_dev->sthal_prop_api_version >= STHAL_PROP_API_VERSION_1_0)
- return;
-
if (snd_device >= SND_DEVICE_OUT_BEGIN &&
snd_device < SND_DEVICE_OUT_END)
device_type = PCM_PLAYBACK;
@@ -481,14 +478,15 @@
if (!st_dev)
return;
- if (st_dev->sthal_prop_api_version < STHAL_PROP_API_VERSION_1_0)
- return;
-
if (uc_info == NULL) {
ALOGE("%s: usecase is NULL!!!", __func__);
return;
}
+ if ((st_dev->sthal_prop_api_version < STHAL_PROP_API_VERSION_1_0) &&
+ (uc_info->type != PCM_PLAYBACK))
+ return;
+
if ((uc_info->in_snd_device >= SND_DEVICE_IN_BEGIN &&
uc_info->in_snd_device < SND_DEVICE_IN_END)) {
if (is_same_as_st_device(uc_info->in_snd_device))
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 4a7b85c..8e1bc94 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -256,6 +256,7 @@
bool is_vbat_speaker;
bool gsm_mode_enabled;
int mono_speaker;
+ bool voice_speaker_stereo;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -421,6 +422,7 @@
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = "speaker-and-headphones-ext-2",
[SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = "voice-speaker-stereo",
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = "wsa-voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "vbat-voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
@@ -453,10 +455,13 @@
[SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = "voice-speaker-and-voice-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = "voice-speaker-and-voice-anc-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = "voice-speaker-stereo-and-voice-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = "voice-speaker-stereo-and-voice-anc-headphones",
[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = "voice-speaker-stereo-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
@@ -593,6 +598,7 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_LINE] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = 15,
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = 135,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = 135,
@@ -601,6 +607,8 @@
[SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
[SND_DEVICE_OUT_DISPLAY_PORT] = 18,
@@ -632,6 +640,7 @@
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = 124,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
#ifdef RECORD_PLAY_CONCURRENCY
@@ -783,6 +792,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
@@ -1557,6 +1567,8 @@
backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
@@ -1571,6 +1583,8 @@
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
@@ -1609,6 +1623,7 @@
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = strdup("SLIMBUS_0_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
@@ -2259,6 +2274,7 @@
my_data->is_wsa_speaker = false;
my_data->hw_dep_fd = -1;
my_data->mono_speaker = SPKR_1;
+ my_data->voice_speaker_stereo = false;
be_dai_name_table = NULL;
@@ -2319,6 +2335,8 @@
hw_info_enable_wsa_combo_usecase_support(my_data->hw_info);
}
+ my_data->voice_speaker_stereo =
+ property_get_bool("persist.vendor.audio.voicecall.speaker.stereo", false);
property_get("persist.vendor.audio.FFSP.enable", ffspEnable, "");
if (!strncmp("true", ffspEnable, sizeof("true"))) {
@@ -3509,6 +3527,8 @@
if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
@@ -3758,6 +3778,18 @@
new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_HEADPHONES)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_HEADPHONES;
+ ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_ANC_HEADSET)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
+ ret = 0;
} else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI &&
!platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HDMI)) {
*num_devices = 2;
@@ -4029,10 +4061,14 @@
else
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA;
} else {
- if (my_data->mono_speaker == SPKR_1)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ if (my_data->voice_speaker_stereo)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
}
} else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
@@ -7511,6 +7547,9 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
@@ -7542,6 +7581,8 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_2:
case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
@@ -7558,6 +7599,7 @@
switch(snd_device) {
case SND_DEVICE_OUT_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED:
return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
@@ -7915,6 +7957,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)) {
@@ -7931,8 +7985,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/msm8916/platform.h b/hal/msm8916/platform.h
index 1cf7a62..8d87a9f 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -99,6 +99,7 @@
SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2,
SND_DEVICE_OUT_VOICE_HANDSET,
SND_DEVICE_OUT_VOICE_SPEAKER,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO,
SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2,
@@ -136,6 +137,7 @@
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
@@ -148,6 +150,8 @@
#endif
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET,
SND_DEVICE_OUT_END,
/*
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index a48d5b0..53e0519 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -235,6 +235,7 @@
bool is_slimbus_interface;
bool is_internal_codec;
int mono_speaker;
+ bool voice_speaker_stereo;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -402,6 +403,7 @@
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = "speaker-and-headphones-ext-2",
[SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = "voice-speaker-stereo",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "voice-speaker-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "voice-speaker-2-vbat",
@@ -435,11 +437,15 @@
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = "voice-speaker-and-voice-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = "voice-speaker-and-voice-anc-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = "voice-speaker-and-voice-anc-fb-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = "voice-speaker-stereo-and-voice-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = "voice-speaker-stereo-and-voice-anc-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = "voice-speaker-stereo-and-voice-anc-fb-headphones",
[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
[SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = "speaker-and-anc-fb-headphones",
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = "voice-speaker-stereo-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
@@ -573,6 +579,7 @@
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = 130,
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = 15,
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 14,
@@ -581,6 +588,9 @@
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
[SND_DEVICE_OUT_DISPLAY_PORT] = 18,
@@ -615,6 +625,7 @@
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = 124,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
[SND_DEVICE_IN_HANDSET_MIC] = 4,
@@ -764,6 +775,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
@@ -1404,6 +1416,9 @@
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
@@ -1419,6 +1434,9 @@
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
@@ -1460,6 +1478,7 @@
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = strdup("SLIMBUS_0_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
@@ -2072,6 +2091,7 @@
my_data->hw_dep_fd = -1;
my_data->mono_speaker = SPKR_1;
my_data->speaker_lr_swap = false;
+ my_data->voice_speaker_stereo = false;
be_dai_name_table = NULL;
@@ -2124,6 +2144,9 @@
}
}
+ my_data->voice_speaker_stereo =
+ property_get_bool("persist.vendor.audio.voicecall.speaker.stereo", false);
+
/* Check if Vbat speaker enabled property is set, this should be done before acdb init */
bool ret = false;
ret = audio_extn_can_use_vbat();
@@ -3308,6 +3331,8 @@
if (audio_extn_spkr_prot_is_enabled()) {
if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2)
@@ -3570,6 +3595,24 @@
new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_HEADPHONES)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_HEADPHONES;
+ ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_ANC_HEADSET)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
+ ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
+ ret = 0;
} else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI &&
!platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HDMI)) {
*num_devices = 2;
@@ -3839,10 +3882,14 @@
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
} else {
if (hw_info_is_stereo_spkr(my_data->hw_info)) {
- if (my_data->mono_speaker == SPKR_1)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ if (my_data->voice_speaker_stereo)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
} else
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
}
@@ -7317,6 +7364,9 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_2:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
@@ -7345,6 +7395,8 @@
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
case SND_DEVICE_OUT_VOICE_SPEAKER_2:
return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
@@ -7360,6 +7412,7 @@
switch(snd_device) {
case SND_DEVICE_OUT_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED:
return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
@@ -7761,6 +7814,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)) {
@@ -7777,8 +7842,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/msm8974/platform.h b/hal/msm8974/platform.h
index f4c8ab6..ccbc413 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -96,6 +96,7 @@
SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2,
SND_DEVICE_OUT_VOICE_HANDSET,
SND_DEVICE_OUT_VOICE_SPEAKER,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2,
SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT,
@@ -134,6 +135,7 @@
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
@@ -145,6 +147,9 @@
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET,
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET,
SND_DEVICE_OUT_END,
/*