Merge "post_proc: Add USB device support for bass boost"
diff --git a/configs/atoll/atoll.mk b/configs/atoll/atoll.mk
index 93d4cc9..6de102b 100644
--- a/configs/atoll/atoll.mk
+++ b/configs/atoll/atoll.mk
@@ -105,6 +105,70 @@
DEVICE_PACKAGE_OVERLAYS += vendor/qcom/opensource/audio-hal/primary-hal/configs/common/overlay
endif
+ifeq ($(AUDIO_FEATURE_ENABLED_DLKM),true)
+BOARD_VENDOR_KERNEL_MODULES := \
+ $(KERNEL_MODULES_OUT)/audio_apr.ko \
+ $(KERNEL_MODULES_OUT)/audio_q6_pdr.ko \
+ $(KERNEL_MODULES_OUT)/audio_q6_notifier.ko \
+ $(KERNEL_MODULES_OUT)/audio_adsp_loader.ko \
+ $(KERNEL_MODULES_OUT)/audio_q6.ko \
+ $(KERNEL_MODULES_OUT)/audio_usf.ko \
+ $(KERNEL_MODULES_OUT)/audio_pinctrl_lpi.ko \
+ $(KERNEL_MODULES_OUT)/audio_swr.ko \
+ $(KERNEL_MODULES_OUT)/audio_wcd_core.ko \
+ $(KERNEL_MODULES_OUT)/audio_swr_ctrl.ko \
+ $(KERNEL_MODULES_OUT)/audio_wsa881x.ko \
+ $(KERNEL_MODULES_OUT)/audio_platform.ko \
+ $(KERNEL_MODULES_OUT)/audio_hdmi.ko \
+ $(KERNEL_MODULES_OUT)/audio_stub.ko \
+ $(KERNEL_MODULES_OUT)/audio_wcd9xxx.ko \
+ $(KERNEL_MODULES_OUT)/audio_mbhc.ko \
+ $(KERNEL_MODULES_OUT)/audio_wcd938x.ko \
+ $(KERNEL_MODULES_OUT)/audio_wcd938x_slave.ko \
+ $(KERNEL_MODULES_OUT)/audio_wcd937x.ko \
+ $(KERNEL_MODULES_OUT)/audio_wcd937x_slave.ko \
+ $(KERNEL_MODULES_OUT)/audio_bolero_cdc.ko \
+ $(KERNEL_MODULES_OUT)/audio_wsa_macro.ko \
+ $(KERNEL_MODULES_OUT)/audio_va_macro.ko \
+ $(KERNEL_MODULES_OUT)/audio_rx_macro.ko \
+ $(KERNEL_MODULES_OUT)/audio_tx_macro.ko \
+ $(KERNEL_MODULES_OUT)/audio_native.ko \
+ $(KERNEL_MODULES_OUT)/audio_machine_atoll.ko \
+ $(KERNEL_MODULES_OUT)/audio_snd_event.ko
+endif
+
+#Audio DLKM
+AUDIO_DLKM := audio_apr.ko
+AUDIO_DLKM += audio_q6_pdr.ko
+AUDIO_DLKM += audio_q6_notifier.ko
+AUDIO_DLKM += audio_adsp_loader.ko
+AUDIO_DLKM += audio_q6.ko
+AUDIO_DLKM += audio_usf.ko
+AUDIO_DLKM += audio_pinctrl_lpi.ko
+AUDIO_DLKM += audio_swr.ko
+AUDIO_DLKM += audio_wcd_core.ko
+AUDIO_DLKM += audio_swr_ctrl.ko
+AUDIO_DLKM += audio_wsa881x.ko
+AUDIO_DLKM += audio_platform.ko
+AUDIO_DLKM += audio_hdmi.ko
+AUDIO_DLKM += audio_stub.ko
+AUDIO_DLKM += audio_wcd9xxx.ko
+AUDIO_DLKM += audio_mbhc.ko
+AUDIO_DLKM += audio_native.ko
+AUDIO_DLKM += audio_wcd938x.ko
+AUDIO_DLKM += audio_wcd938x_slave.ko
+AUDIO_DLKM += audio_wcd937x.ko
+AUDIO_DLKM += audio_wcd937x_slave.ko
+AUDIO_DLKM += audio_bolero_cdc.ko
+AUDIO_DLKM += audio_wsa_macro.ko
+AUDIO_DLKM += audio_va_macro.ko
+AUDIO_DLKM += audio_rx_macro.ko
+AUDIO_DLKM += audio_tx_macro.ko
+AUDIO_DLKM += audio_machine_atoll.ko
+AUDIO_DLKM += audio_snd_event.ko
+
+PRODUCT_PACKAGES += $(AUDIO_DLKM)
+
PRODUCT_COPY_FILES += \
vendor/qcom/opensource/audio-hal/primary-hal/configs/atoll/audio_io_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_io_policy.conf \
vendor/qcom/opensource/audio-hal/primary-hal/configs/atoll/audio_effects.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.conf \
@@ -397,6 +461,10 @@
android.hardware.audio.effect@5.0 \
android.hardware.audio.effect@5.0-impl
+# enable sound trigger hidl hal 2.2
+PRODUCT_PACKAGES += \
+ android.hardware.soundtrigger@2.2-impl \
+
PRODUCT_PACKAGES_ENG += \
VoicePrintTest \
VoicePrintDemo
diff --git a/configs/atoll/audio_platform_info_qrd.xml b/configs/atoll/audio_platform_info_qrd.xml
index 635f321..427647d 100644
--- a/configs/atoll/audio_platform_info_qrd.xml
+++ b/configs/atoll/audio_platform_info_qrd.xml
@@ -113,10 +113,13 @@
<device name="SND_DEVICE_OUT_SPEAKER_AND_LINE" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_VOICE_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_VOICE_HEADSET" backend="headset" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_VOICE_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_VOICE_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_VOICE_TTY_FULL_HEADSET" backend="headset" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_VOICE_TTY_VCO_HEADSET" backend="headset" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HANDSET" backend="handset" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER" interface="WSA_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_EXTERNAL_1" interface="WSA_CDC_DMA_RX_0"/>
diff --git a/configs/atoll/audio_policy_configuration.xml b/configs/atoll/audio_policy_configuration.xml
index 1e4e338..b5621b7 100644
--- a/configs/atoll/audio_policy_configuration.xml
+++ b/configs/atoll/audio_policy_configuration.xml
@@ -356,7 +356,7 @@
<route type="mix" sink="primary input"
sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,USB Device In,USB Headset In,Telephony Rx"/>
<route type="mix" sink="voip_tx"
- sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In"/>
+ sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In,Wired Headset Mic"/>
<route type="mix" sink="usb_surround_sound"
sources="USB Device In,USB Headset In"/>
<route type="mix" sink="record_24"
diff --git a/configs/atoll/mixer_paths.xml b/configs/atoll/mixer_paths.xml
index ebfcd7e..9ad7f83 100644
--- a/configs/atoll/mixer_paths.xml
+++ b/configs/atoll/mixer_paths.xml
@@ -1844,6 +1844,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="audio-record-compress headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -1890,6 +1894,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="low-latency-record headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="low-latency-record bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -3341,6 +3349,10 @@
<ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="hifi-record headset-mic">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="hifi-record usb-headset-mic">
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
diff --git a/configs/atoll/mixer_paths_qrd.xml b/configs/atoll/mixer_paths_qrd.xml
index 1aef816..b1823ef 100644
--- a/configs/atoll/mixer_paths_qrd.xml
+++ b/configs/atoll/mixer_paths_qrd.xml
@@ -561,6 +561,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia1" value="1" />
</path>
+ <path name="deep-buffer-playback headset">
+ <ctl name="deep-buffer-playback headphones" />
+ </path>
+
<path name="deep-buffer-playback speaker-and-headphones">
<path name="deep-buffer-playback headphones" />
<path name="deep-buffer-playback" />
@@ -670,6 +674,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia5" value="1" />
</path>
+ <path name="low-latency-playback headset">
+ <path name="low-latency-playback headphones" />
+ </path>
+
<path name="low-latency-playback speaker-and-headphones">
<path name="low-latency-playback headphones" />
<path name="low-latency-playback" />
@@ -730,6 +738,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia8" value="1" />
</path>
+ <path name="audio-ull-playback headset">
+ <path name="audio-ull-playback headphones" />
+ </path>
+
<path name="audio-ull-playback speaker-and-headphones">
<path name="audio-ull-playback" />
<path name="audio-ull-playback headphones" />
@@ -890,6 +902,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia4" value="1" />
</path>
+ <path name="compress-offload-playback headset">
+ <ctl name="compress-offload-playback headphones" />
+ </path>
+
<path name="compress-offload-playback headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia4" value="1" />
</path>
@@ -995,6 +1011,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia7" value="1" />
</path>
+ <path name="compress-offload-playback2 headset">
+ <ctl name="compress-offload-playback2 headphones" />
+ </path>
+
<path name="compress-offload-playback2 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia7" value="1" />
</path>
@@ -1100,6 +1120,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
</path>
+ <path name="compress-offload-playback3 headset">
+ <path name="compress-offload-playback3 headphones" />
+ </path>
+
<path name="compress-offload-playback3 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
</path>
@@ -1205,6 +1229,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia11" value="1" />
</path>
+ <path name="compress-offload-playback4 headset">
+ <path name="compress-offload-playback4 headphones" />
+ </path>
+
<path name="compress-offload-playback4 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia11" value="1" />
</path>
@@ -1310,6 +1338,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia12" value="1" />
</path>
+ <path name="compress-offload-playback5 headset">
+ <path name="compress-offload-playback5 headphones" />
+ </path>
+
<path name="compress-offload-playback5 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia12" value="1" />
</path>
@@ -1415,6 +1447,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia13" value="1" />
</path>
+ <path name="compress-offload-playback6 headset">
+ <path name="compress-offload-playback6 headphones" />
+ </path>
+
<path name="compress-offload-playback6 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia13" value="1" />
</path>
@@ -1520,6 +1556,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia14" value="1" />
</path>
+ <path name="compress-offload-playback7 headset">
+ <path name="compress-offload-playback7 headphones" />
+ </path>
+
<path name="compress-offload-playback7 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia14" value="1" />
</path>
@@ -1625,6 +1665,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia15" value="1" />
</path>
+ <path name="compress-offload-playback8 headset">
+ <path name="compress-offload-playback8 headphones" />
+ </path>
+
<path name="compress-offload-playback8 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia15" value="1" />
</path>
@@ -1730,6 +1774,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
</path>
+ <path name="compress-offload-playback9 headset">
+ <path name="compress-offload-playback9 headphones" />
+ </path>
+
<path name="compress-offload-playback9 headphones-44.1">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
</path>
@@ -1811,6 +1859,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="audio-record-compress headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -1832,6 +1884,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="low-latency-record headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="low-latency-record bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -2073,6 +2129,11 @@
<ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_3_Voip" value="1" />
</path>
+ <path name="compress-voip-call headset">
+ <ctl name="RX_CDC_DMA_RX_0_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_3_Voip" value="1" />
+ </path>
+
<path name="compress-voip-call bt-sco">
<ctl name="SLIM_7_RX_Voice Mixer Voip" value="1" />
<ctl name="Voip_Tx Mixer SLIM_7_TX_Voip" value="1" />
@@ -2117,6 +2178,11 @@
<ctl name="VoiceMMode1_Tx Mixer TX_CDC_DMA_TX_3_MMode1" value="1" />
</path>
+ <path name="voicemmode1-call headset">
+ <ctl name="RX_CDC_DMA_RX_0_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer TX_CDC_DMA_TX_3_MMode1" value="1" />
+ </path>
+
<path name="voicemmode1-call bt-sco">
<ctl name="SLIM_7_RX_Voice Mixer VoiceMMode1" value="1" />
<ctl name="VoiceMMode1_Tx Mixer SLIM_7_TX_MMode1" value="1" />
@@ -2171,6 +2237,11 @@
<ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
</path>
+ <path name="voicemmode2-call headset">
+ <ctl name="RX_CDC_DMA_RX_0_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
+ </path>
+
<path name="voicemmode2-call bt-sco">
<ctl name="SLIM_7_RX_Voice Mixer VoiceMMode2" value="1" />
<ctl name="VoiceMMode2_Tx Mixer SLIM_7_TX_MMode2" value="1" />
@@ -2223,6 +2294,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
</path>
+ <path name="audio-playback-voip headset">
+ <path name="audio-playback-voip headphones" />
+ </path>
+
<path name="audio-playback-voip bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia10" value="1" />
</path>
@@ -2486,6 +2561,10 @@
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
</path>
+ <path name="mmap-playback headset">
+ <path name="mmap-playback headphones" />
+ </path>
+
<path name="mmap-playback speaker-and-headphones">
<path name="mmap-playback" />
<path name="mmap-playback headphones" />
@@ -2604,6 +2683,14 @@
<ctl name="USB_AUDIO_RX Audio Mixer MultiMedia2" value="1" />
</path>
+ <path name="hifi-record">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="1" />
+ </path>
+
+ <path name="hifi-record headset-mic">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="hifi-record usb-headset-mic">
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
@@ -2672,6 +2759,10 @@
<path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink headset">
+ <path name="incall_music_uplink" />
+ </path>
+
<path name="incall_music_uplink speaker-and-headphones">
<path name="incall_music_uplink" />
</path>
@@ -2964,6 +3055,10 @@
<path name="headphones" />
</path>
+ <path name="voice-headset">
+ <path name="headphones" />
+ </path>
+
<path name="voice-line">
<path name="voice-headphones" />
</path>
@@ -3168,6 +3263,24 @@
<path name="three-mic" />
</path>
+ <path name="three-mic">
+ <ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
+ <ctl name="TX DEC0 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX0" value="ADC0" />
+ <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
+ <ctl name="ADC1_MIXER Switch" value="1" />
+ <ctl name="TX DEC1 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX1" value="ADC1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="ADC2_MIXER Switch" value="1" />
+ <ctl name="ADC2 MUX" value="INP3" />
+ <ctl name="TX DEC2 MUX" value="SWR_MIC" />
+ <ctl name="TX SMIC MUX2" value="ADC2" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="ADC3_MIXER Switch" value="1" />
+ <ctl name="ADC3 MUX" value="INP4" />
+ </path>
+
<path name="speaker-tmic">
<ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
<ctl name="TX DEC0 MUX" value="SWR_MIC" />
diff --git a/configs/atoll/mixer_paths_wcd937x.xml b/configs/atoll/mixer_paths_wcd937x.xml
index d7e837c..44fe585 100644
--- a/configs/atoll/mixer_paths_wcd937x.xml
+++ b/configs/atoll/mixer_paths_wcd937x.xml
@@ -1845,6 +1845,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="audio-record-compress headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -1891,6 +1895,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="low-latency-record headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="low-latency-record bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -3342,6 +3350,10 @@
<ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="hifi-record headset-mic">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="hifi-record usb-headset-mic">
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
diff --git a/configs/atoll/mixer_paths_wcd937xqrd.xml b/configs/atoll/mixer_paths_wcd937xqrd.xml
index ac91923..ecc360d 100644
--- a/configs/atoll/mixer_paths_wcd937xqrd.xml
+++ b/configs/atoll/mixer_paths_wcd937xqrd.xml
@@ -1608,6 +1608,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="audio-record-compress headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -1625,6 +1629,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="low-latency-record headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="low-latency-record bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -2306,6 +2314,14 @@
<ctl name="USB_AUDIO_RX Audio Mixer MultiMedia2" value="1" />
</path>
+ <path name="hifi-record">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="1" />
+ </path>
+
+ <path name="hifi-record headset-mic">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="hifi-record usb-headset-mic">
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
diff --git a/configs/kona/audio_policy_configuration.xml b/configs/kona/audio_policy_configuration.xml
index 1e4e338..b5621b7 100644
--- a/configs/kona/audio_policy_configuration.xml
+++ b/configs/kona/audio_policy_configuration.xml
@@ -356,7 +356,7 @@
<route type="mix" sink="primary input"
sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,USB Device In,USB Headset In,Telephony Rx"/>
<route type="mix" sink="voip_tx"
- sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In"/>
+ sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In,Wired Headset Mic"/>
<route type="mix" sink="usb_surround_sound"
sources="USB Device In,USB Headset In"/>
<route type="mix" sink="record_24"
diff --git a/configs/kona/mixer_paths.xml b/configs/kona/mixer_paths.xml
index afed79a..c074da5 100644
--- a/configs/kona/mixer_paths.xml
+++ b/configs/kona/mixer_paths.xml
@@ -276,7 +276,6 @@
<!-- audio record compress end-->
<!-- split a2dp -->
- <ctl name="BT SampleRate" value="KHZ_8" />
<ctl name="AFE Input Channels" value="Zero" />
<ctl name="SLIM7_RX ADM Channels" value="Zero" />
<!-- split a2dp end-->
@@ -544,7 +543,6 @@
</path>
<path name="deep-buffer-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="deep-buffer-playback bt-sco" />
</path>
@@ -642,7 +640,6 @@
</path>
<path name="low-latency-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="low-latency-playback bt-sco" />
</path>
@@ -772,7 +769,6 @@
</path>
<path name="audio-ull-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-ull-playback bt-sco" />
</path>
@@ -872,7 +868,6 @@
</path>
<path name="compress-offload-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback bt-sco" />
</path>
@@ -980,7 +975,6 @@
</path>
<path name="compress-offload-playback2 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback2 bt-sco" />
</path>
@@ -1089,7 +1083,6 @@
</path>
<path name="compress-offload-playback3 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback3 bt-sco" />
</path>
@@ -1177,7 +1170,6 @@
</path>
<path name="compress-offload-playback4 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback4 bt-sco" />
</path>
@@ -1265,7 +1257,6 @@
</path>
<path name="compress-offload-playback5 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback5 bt-sco" />
</path>
@@ -1353,7 +1344,6 @@
</path>
<path name="compress-offload-playback6 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback6 bt-sco" />
</path>
@@ -1441,7 +1431,6 @@
</path>
<path name="compress-offload-playback7 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback7 bt-sco" />
</path>
@@ -1529,7 +1518,6 @@
</path>
<path name="compress-offload-playback8 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback8 bt-sco" />
</path>
@@ -1617,7 +1605,6 @@
</path>
<path name="compress-offload-playback9 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback9 bt-sco" />
</path>
@@ -1701,7 +1688,6 @@
</path>
<path name="audio-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record bt-sco" />
</path>
@@ -1726,7 +1712,6 @@
</path>
<path name="audio-record-compress bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-compress bt-sco" />
</path>
@@ -1751,7 +1736,6 @@
</path>
<path name="audio-record-compress bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-compress2 bt-sco" />
</path>
@@ -1776,7 +1760,6 @@
</path>
<path name="low-latency-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="low-latency-record bt-sco" />
</path>
@@ -2026,7 +2009,6 @@
</path>
<path name="compress-voip-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-voip-call bt-sco" />
</path>
@@ -2070,7 +2052,6 @@
</path>
<path name="voicemmode1-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="voicemmode1-call bt-sco" />
</path>
@@ -2134,7 +2115,6 @@
</path>
<path name="voicemmode2-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="voicemmode2-call bt-sco" />
</path>
@@ -2195,7 +2175,6 @@
</path>
<path name="audio-playback-voip bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-playback-voip bt-sco" />
</path>
@@ -2251,7 +2230,6 @@
</path>
<path name="audio-record-voip bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-voip bt-sco" />
</path>
@@ -3134,7 +3112,6 @@
</path>
<path name="mmap-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="mmap-playback bt-sco" />
</path>
@@ -3200,7 +3177,6 @@
</path>
<path name="mmap-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="mmap-record bt-sco" />
</path>
diff --git a/configs/kona/mixer_paths_cdp.xml b/configs/kona/mixer_paths_cdp.xml
index eeb6496..ba7b18f 100644
--- a/configs/kona/mixer_paths_cdp.xml
+++ b/configs/kona/mixer_paths_cdp.xml
@@ -261,7 +261,6 @@
<!-- audio record compress end-->
<!-- split a2dp -->
- <ctl name="BT SampleRate" value="KHZ_8" />
<ctl name="AFE Input Channels" value="Zero" />
<ctl name="SLIM7_RX ADM Channels" value="Zero" />
<!-- split a2dp end-->
@@ -521,7 +520,6 @@
</path>
<path name="deep-buffer-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="deep-buffer-playback bt-sco" />
</path>
@@ -615,7 +613,6 @@
</path>
<path name="low-latency-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="low-latency-playback bt-sco" />
</path>
@@ -736,7 +733,6 @@
</path>
<path name="audio-ull-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-ull-playback bt-sco" />
</path>
@@ -819,7 +815,6 @@
</path>
<path name="compress-offload-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback bt-sco" />
</path>
@@ -918,7 +913,6 @@
</path>
<path name="compress-offload-playback2 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback2 bt-sco" />
</path>
@@ -1018,7 +1012,6 @@
</path>
<path name="compress-offload-playback3 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback3 bt-sco" />
</path>
@@ -1097,7 +1090,6 @@
</path>
<path name="compress-offload-playback4 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback4 bt-sco" />
</path>
@@ -1177,7 +1169,6 @@
</path>
<path name="compress-offload-playback5 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback5 bt-sco" />
</path>
@@ -1256,7 +1247,6 @@
</path>
<path name="compress-offload-playback6 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback6 bt-sco" />
</path>
@@ -1335,7 +1325,6 @@
</path>
<path name="compress-offload-playback7 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback7 bt-sco" />
</path>
@@ -1414,7 +1403,6 @@
</path>
<path name="compress-offload-playback8 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback8 bt-sco" />
</path>
@@ -1493,7 +1481,6 @@
</path>
<path name="compress-offload-playback9 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback9 bt-sco" />
</path>
@@ -1572,7 +1559,6 @@
</path>
<path name="audio-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record bt-sco" />
</path>
@@ -1597,7 +1583,6 @@
</path>
<path name="audio-record-compress bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-compress bt-sco" />
</path>
@@ -1622,7 +1607,6 @@
</path>
<path name="audio-record-compress bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-compress2 bt-sco" />
</path>
@@ -1647,7 +1631,6 @@
</path>
<path name="low-latency-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="low-latency-record bt-sco" />
</path>
@@ -1897,7 +1880,6 @@
</path>
<path name="compress-voip-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-voip-call bt-sco" />
</path>
@@ -1941,7 +1923,6 @@
</path>
<path name="voicemmode1-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="voicemmode1-call bt-sco" />
</path>
@@ -1995,7 +1976,6 @@
</path>
<path name="voicemmode2-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="voicemmode2-call bt-sco" />
</path>
@@ -2046,7 +2026,6 @@
</path>
<path name="audio-playback-voip bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-playback-voip bt-sco" />
</path>
@@ -2093,7 +2072,6 @@
</path>
<path name="audio-record-voip bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-voip bt-sco" />
</path>
@@ -2968,7 +2946,6 @@
</path>
<path name="mmap-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="mmap-playback bt-sco" />
</path>
@@ -3025,7 +3002,6 @@
</path>
<path name="mmap-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="mmap-record bt-sco" />
</path>
diff --git a/configs/kona/mixer_paths_qrd.xml b/configs/kona/mixer_paths_qrd.xml
index c36f11f..f3dff2c 100644
--- a/configs/kona/mixer_paths_qrd.xml
+++ b/configs/kona/mixer_paths_qrd.xml
@@ -260,7 +260,6 @@
<!-- audio record compress end-->
<!-- split a2dp -->
- <ctl name="BT SampleRate" value="KHZ_8" />
<ctl name="AFE Input Channels" value="Zero" />
<ctl name="SLIM7_RX ADM Channels" value="Zero" />
<!-- split a2dp end-->
@@ -519,7 +518,6 @@
</path>
<path name="deep-buffer-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="deep-buffer-playback bt-sco" />
</path>
@@ -617,7 +615,6 @@
</path>
<path name="low-latency-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="low-latency-playback bt-sco" />
</path>
@@ -737,7 +734,6 @@
</path>
<path name="audio-ull-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-ull-playback bt-sco" />
</path>
@@ -824,7 +820,6 @@
</path>
<path name="compress-offload-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback bt-sco" />
</path>
@@ -923,7 +918,6 @@
</path>
<path name="compress-offload-playback2 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback2 bt-sco" />
</path>
@@ -1022,7 +1016,6 @@
</path>
<path name="compress-offload-playback3 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback3 bt-sco" />
</path>
@@ -1101,7 +1094,6 @@
</path>
<path name="compress-offload-playback4 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback4 bt-sco" />
</path>
@@ -1181,7 +1173,6 @@
</path>
<path name="compress-offload-playback5 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback5 bt-sco" />
</path>
@@ -1260,7 +1251,6 @@
</path>
<path name="compress-offload-playback6 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback6 bt-sco" />
</path>
@@ -1339,7 +1329,6 @@
</path>
<path name="compress-offload-playback7 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback7 bt-sco" />
</path>
@@ -1418,7 +1407,6 @@
</path>
<path name="compress-offload-playback8 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback8 bt-sco" />
</path>
@@ -1497,7 +1485,6 @@
</path>
<path name="compress-offload-playback9 bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-offload-playback9 bt-sco" />
</path>
@@ -1572,7 +1559,6 @@
</path>
<path name="audio-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record bt-sco" />
</path>
@@ -1597,7 +1583,6 @@
</path>
<path name="audio-record-compress bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-compress bt-sco" />
</path>
@@ -1622,7 +1607,6 @@
</path>
<path name="audio-record-compress bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-compress2 bt-sco" />
</path>
@@ -1647,7 +1631,6 @@
</path>
<path name="low-latency-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="low-latency-record bt-sco" />
</path>
@@ -1902,7 +1885,6 @@
</path>
<path name="compress-voip-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="compress-voip-call bt-sco" />
</path>
@@ -1951,7 +1933,6 @@
</path>
<path name="voicemmode1-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="voicemmode1-call bt-sco" />
</path>
@@ -2010,7 +1991,6 @@
</path>
<path name="voicemmode2-call bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="voicemmode2-call bt-sco" />
</path>
@@ -2065,7 +2045,6 @@
</path>
<path name="audio-playback-voip bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-playback-voip bt-sco" />
</path>
@@ -2112,7 +2091,6 @@
</path>
<path name="audio-record-voip bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="audio-record-voip bt-sco" />
</path>
@@ -2302,7 +2280,6 @@
</path>
<path name="mmap-playback bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="mmap-playback bt-sco" />
</path>
@@ -2359,7 +2336,6 @@
</path>
<path name="mmap-record bt-sco-wb">
- <ctl name="BT SampleRate" value="KHZ_16" />
<path name="mmap-record bt-sco" />
</path>
@@ -3079,6 +3055,16 @@
<path name="three-mic" />
</path>
+ <path name="three-mic">
+ <ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DMIC MUX3" value="DMIC1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="TX DMIC MUX1" value="DMIC3" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC2" />
+ </path>
+
<path name="speaker-tmic">
<ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
<ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
diff --git a/configs/lito/audio_policy_configuration.xml b/configs/lito/audio_policy_configuration.xml
index 1e4e338..b5621b7 100644
--- a/configs/lito/audio_policy_configuration.xml
+++ b/configs/lito/audio_policy_configuration.xml
@@ -356,7 +356,7 @@
<route type="mix" sink="primary input"
sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,USB Device In,USB Headset In,Telephony Rx"/>
<route type="mix" sink="voip_tx"
- sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In"/>
+ sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In,Wired Headset Mic"/>
<route type="mix" sink="usb_surround_sound"
sources="USB Device In,USB Headset In"/>
<route type="mix" sink="record_24"
diff --git a/configs/lito/lito.mk b/configs/lito/lito.mk
index b7f890b..9198090 100644
--- a/configs/lito/lito.mk
+++ b/configs/lito/lito.mk
@@ -457,6 +457,10 @@
android.hardware.audio.effect@5.0 \
android.hardware.audio.effect@5.0-impl
+# enable sound trigger hidl hal 2.2
+PRODUCT_PACKAGES += \
+ android.hardware.soundtrigger@2.2-impl \
+
PRODUCT_PACKAGES_ENG += \
VoicePrintTest \
VoicePrintDemo
diff --git a/configs/lito/mixer_paths.xml b/configs/lito/mixer_paths.xml
index 617b7a8..bbce6f8 100644
--- a/configs/lito/mixer_paths.xml
+++ b/configs/lito/mixer_paths.xml
@@ -1845,6 +1845,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="audio-record-compress headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -1891,6 +1895,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="low-latency-record headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="low-latency-record bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -3344,6 +3352,10 @@
<ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="hifi-record headset-mic">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="hifi-record usb-headset-mic">
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
diff --git a/configs/lito/mixer_paths_cdp.xml b/configs/lito/mixer_paths_cdp.xml
index c15f411..d352674 100644
--- a/configs/lito/mixer_paths_cdp.xml
+++ b/configs/lito/mixer_paths_cdp.xml
@@ -1478,6 +1478,10 @@
<ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="1" />
</path>
+ <path name="audio-record-compress headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="audio-record-compress2">
<ctl name="MultiMedia17 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
@@ -1507,6 +1511,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="low-latency-record headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="low-latency-record bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -2829,6 +2837,10 @@
<ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="hifi-record headset-mic">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="hifi-record usb-headset-mic">
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
diff --git a/configs/lito/mixer_paths_qrd.xml b/configs/lito/mixer_paths_qrd.xml
index e2a6bcd..7870f82 100644
--- a/configs/lito/mixer_paths_qrd.xml
+++ b/configs/lito/mixer_paths_qrd.xml
@@ -1852,6 +1852,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="audio-record-compress headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="audio-record-compress bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -1898,6 +1902,10 @@
<ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
+ <path name="low-latency-record headset-mic">
+ <ctl name="MultiMedia8 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="low-latency-record bt-sco">
<ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
</path>
@@ -2697,6 +2705,14 @@
<ctl name="USB_AUDIO_RX Audio Mixer MultiMedia2" value="1" />
</path>
+ <path name="hifi-record">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="1" />
+ </path>
+
+ <path name="hifi-record headset-mic">
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_4" value="1" />
+ </path>
+
<path name="hifi-record usb-headset-mic">
<ctl name="MultiMedia2 Mixer USB_AUDIO_TX" value="1" />
</path>
@@ -3275,6 +3291,16 @@
<path name="three-mic" />
</path>
+ <path name="three-mic">
+ <ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
+ <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+ <ctl name="TX DMIC MUX3" value="DMIC1" />
+ <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+ <ctl name="TX DMIC MUX1" value="DMIC3" />
+ <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
+ <ctl name="TX DMIC MUX2" value="DMIC2" />
+ </path>
+
<path name="speaker-tmic">
<ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
<ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
diff --git a/configs/msmnile/audio_policy_configuration.xml b/configs/msmnile/audio_policy_configuration.xml
index 1e4e338..b5621b7 100644
--- a/configs/msmnile/audio_policy_configuration.xml
+++ b/configs/msmnile/audio_policy_configuration.xml
@@ -356,7 +356,7 @@
<route type="mix" sink="primary input"
sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,USB Device In,USB Headset In,Telephony Rx"/>
<route type="mix" sink="voip_tx"
- sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In"/>
+ sources="Built-In Mic,Built-In Back Mic,BT SCO Headset Mic,USB Device In,USB Headset In,Wired Headset Mic"/>
<route type="mix" sink="usb_surround_sound"
sources="USB Device In,USB Headset In"/>
<route type="mix" sink="record_24"
diff --git a/configs/msmnile_au/audio_platform_info.xml b/configs/msmnile_au/audio_platform_info.xml
index 55f0d66..4fdf786 100644
--- a/configs/msmnile_au/audio_platform_info.xml
+++ b/configs/msmnile_au/audio_platform_info.xml
@@ -35,8 +35,8 @@
<device name="SND_DEVICE_OUT_BUS_NAV" acdb_id="14"/>
<device name="SND_DEVICE_OUT_BUS_PHN" acdb_id="94"/>
<device name="SND_DEVICE_OUT_BUS_RSE" acdb_id="60"/>
- <device name="SND_DEVICE_OUT_BT_SCO" acdb_id="94"/>
- <device name="SND_DEVICE_OUT_BT_SCO_WB" acdb_id="94"/>
+ <device name="SND_DEVICE_OUT_BT_SCO" acdb_id="21"/>
+ <device name="SND_DEVICE_OUT_BT_SCO_WB" acdb_id="39"/>
<device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="60"/>
<device name="SND_DEVICE_OUT_VOICE_HANDSET" acdb_id="94"/>
<device name="SND_DEVICE_OUT_VOICE_SPEAKER" acdb_id="94"/>
@@ -49,8 +49,8 @@
<device name="SND_DEVICE_IN_VOICE_HEADSET_MIC" acdb_id="95"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC" acdb_id="95"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP" acdb_id="95"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC" acdb_id="95"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" acdb_id="95"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC" acdb_id="20"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" acdb_id="38"/>
<device name="SND_DEVICE_IN_HANDSET_DMIC" acdb_id="80"/>
<device name="SND_DEVICE_IN_SPEAKER_DMIC" acdb_id="80"/>
<device name="SND_DEVICE_IN_QUAD_MIC" acdb_id="47"/>
@@ -111,10 +111,14 @@
<usecase name="USECASE_AUDIO_PLAYBACK_MMAP" type="out" id="28" />
<usecase name="USECASE_AUDIO_RECORD_MMAP" type="in" id="28" />
<usecase name="USECASE_AUDIO_RECORD" type="in" id="0" />
- <usecase name="USECASE_AUDIO_HFP_SCO" type="in" id="36" />
- <usecase name="USECASE_AUDIO_HFP_SCO" type="out" id="36" />
- <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="in" id="36" />
- <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="out" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO" type="in" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO" type="out" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="in" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="out" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_DOWNLINK" type="in" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_DOWNLINK" type="out" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB_DOWNLINK" type="in" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB_DOWNLINK" type="out" id="36" />
</pcm_ids>
<config_params>
@@ -131,6 +135,7 @@
<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"/>
+ <param key="hfp_pcm_dev_id" value="36"/>
</config_params>
<gain_db_to_level_mapping>
@@ -145,8 +150,8 @@
<device name="SND_DEVICE_OUT_HANDSET" interface="TERT_TDM_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER" interface="TERT_TDM_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES" interface="TERT_TDM_RX_0"/>
- <device name="SND_DEVICE_OUT_BT_SCO" interface="TERT_TDM_RX_2"/>
- <device name="SND_DEVICE_OUT_BT_SCO_WB" interface="TERT_TDM_RX_2"/>
+ <device name="SND_DEVICE_OUT_BT_SCO" interface="AUX_PCM_RX"/>
+ <device name="SND_DEVICE_OUT_BT_SCO_WB" interface="AUX_PCM_RX"/>
<device name="SND_DEVICE_OUT_BT_A2DP" interface="TERT_TDM_RX_0"/>
<device name="SND_DEVICE_OUT_VOICE_HANDSET" interface="TERT_TDM_RX_2"/>
<device name="SND_DEVICE_OUT_VOICE_SPEAKER" interface="TERT_TDM_RX_2"/>
@@ -163,8 +168,8 @@
<device name="SND_DEVICE_IN_VOICE_HEADSET_MIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP" interface="TERT_TDM_TX_0"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC" interface="TERT_TDM_TX_0"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" interface="TERT_TDM_TX_0"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC" interface="AUX_PCM_TX"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" interface="AUX_PCM_TX"/>
<device name="SND_DEVICE_IN_HANDSET_DMIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_SPEAKER_DMIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_QUAD_MIC" interface="TERT_TDM_TX_0"/>
diff --git a/configs/msmnile_au/mixer_paths_adp.xml b/configs/msmnile_au/mixer_paths_adp.xml
index 02dd367..566f1e9 100644
--- a/configs/msmnile_au/mixer_paths_adp.xml
+++ b/configs/msmnile_au/mixer_paths_adp.xml
@@ -1601,8 +1601,6 @@
</path>
<path name="hfp-sco">
- <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
- <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
<ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
<ctl name="TERT_TDM_TX_0 Channels" value="One" />
<ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
@@ -1630,20 +1628,38 @@
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco bt-sco">
+ <path name="hfp-sco" />
+ </path>
+
<path name="hfp-sco-wb">
- <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
<ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
<path name="hfp-sco" />
</path>
+ <path name="hfp-sco-wb bt-sco-wb">
+ <path name="hfp-sco-wb" />
+ </path>
+
<path name="hfp-sco-wb headphones">
<path name="hfp-sco headphones" />
</path>
+
<path name="hfp-sco-wb headset">
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco-downlink">
+ <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
+ <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
+ </path>
+
+ <path name="hfp-sco-wb-downlink">
+ <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+ <path name="hfp-sco-downlink" />
+ </path>
+
<path name="compress-voip-call">
<ctl name="SLIM_0_RX_Voice Mixer Voip" value="1" />
<ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
@@ -2105,6 +2121,10 @@
<path name="speaker-mono" />
</path>
+ <path name="voice-speaker-hfp">
+ <path name="speaker-mono" />
+ </path>
+
<path name="voice-speaker-2">
<path name="speaker-mono-2" />
</path>
@@ -2121,6 +2141,10 @@
<path name="speaker-mic-qrd" />
</path>
+ <path name="voice-speaker-mic-hfp">
+ <path name="speaker-mic" />
+ </path>
+
<path name="voice-headphones">
<path name="headphones" />
</path>
diff --git a/configs/msmnile_au/mixer_paths_custom.xml b/configs/msmnile_au/mixer_paths_custom.xml
index 8ededba..2136c79 100644
--- a/configs/msmnile_au/mixer_paths_custom.xml
+++ b/configs/msmnile_au/mixer_paths_custom.xml
@@ -1589,8 +1589,6 @@
</path>
<path name="hfp-sco">
- <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
- <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
<ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
<ctl name="TERT_TDM_TX_0 Channels" value="One" />
<ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
@@ -1618,20 +1616,38 @@
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco bt-sco">
+ <path name="hfp-sco" />
+ </path>
+
<path name="hfp-sco-wb">
- <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
<ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
<path name="hfp-sco" />
</path>
+ <path name="hfp-sco-wb bt-sco-wb">
+ <path name="hfp-sco-wb" />
+ </path>
+
<path name="hfp-sco-wb headphones">
<path name="hfp-sco headphones" />
</path>
+
<path name="hfp-sco-wb headset">
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco-downlink">
+ <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
+ <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
+ </path>
+
+ <path name="hfp-sco-wb-downlink">
+ <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+ <path name="hfp-sco-downlink" />
+ </path>
+
<path name="compress-voip-call">
<ctl name="SLIM_0_RX_Voice Mixer Voip" value="1" />
<ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
@@ -2093,6 +2109,10 @@
<path name="speaker-mono" />
</path>
+ <path name="voice-speaker-hfp">
+ <path name="speaker-mono" />
+ </path>
+
<path name="voice-speaker-2">
<path name="speaker-mono-2" />
</path>
@@ -2109,6 +2129,10 @@
<path name="speaker-mic-qrd" />
</path>
+ <path name="voice-speaker-mic-hfp">
+ <path name="speaker-mic" />
+ </path>
+
<path name="voice-headphones">
<path name="headphones" />
</path>
diff --git a/configs/msmsteppe_au/audio_platform_info.xml b/configs/msmsteppe_au/audio_platform_info.xml
index 55f0d66..4fdf786 100644
--- a/configs/msmsteppe_au/audio_platform_info.xml
+++ b/configs/msmsteppe_au/audio_platform_info.xml
@@ -35,8 +35,8 @@
<device name="SND_DEVICE_OUT_BUS_NAV" acdb_id="14"/>
<device name="SND_DEVICE_OUT_BUS_PHN" acdb_id="94"/>
<device name="SND_DEVICE_OUT_BUS_RSE" acdb_id="60"/>
- <device name="SND_DEVICE_OUT_BT_SCO" acdb_id="94"/>
- <device name="SND_DEVICE_OUT_BT_SCO_WB" acdb_id="94"/>
+ <device name="SND_DEVICE_OUT_BT_SCO" acdb_id="21"/>
+ <device name="SND_DEVICE_OUT_BT_SCO_WB" acdb_id="39"/>
<device name="SND_DEVICE_OUT_BT_A2DP" acdb_id="60"/>
<device name="SND_DEVICE_OUT_VOICE_HANDSET" acdb_id="94"/>
<device name="SND_DEVICE_OUT_VOICE_SPEAKER" acdb_id="94"/>
@@ -49,8 +49,8 @@
<device name="SND_DEVICE_IN_VOICE_HEADSET_MIC" acdb_id="95"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC" acdb_id="95"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP" acdb_id="95"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC" acdb_id="95"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" acdb_id="95"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC" acdb_id="20"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" acdb_id="38"/>
<device name="SND_DEVICE_IN_HANDSET_DMIC" acdb_id="80"/>
<device name="SND_DEVICE_IN_SPEAKER_DMIC" acdb_id="80"/>
<device name="SND_DEVICE_IN_QUAD_MIC" acdb_id="47"/>
@@ -111,10 +111,14 @@
<usecase name="USECASE_AUDIO_PLAYBACK_MMAP" type="out" id="28" />
<usecase name="USECASE_AUDIO_RECORD_MMAP" type="in" id="28" />
<usecase name="USECASE_AUDIO_RECORD" type="in" id="0" />
- <usecase name="USECASE_AUDIO_HFP_SCO" type="in" id="36" />
- <usecase name="USECASE_AUDIO_HFP_SCO" type="out" id="36" />
- <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="in" id="36" />
- <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="out" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO" type="in" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO" type="out" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="in" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB" type="out" id="29" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_DOWNLINK" type="in" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_DOWNLINK" type="out" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB_DOWNLINK" type="in" id="36" />
+ <usecase name="USECASE_AUDIO_HFP_SCO_WB_DOWNLINK" type="out" id="36" />
</pcm_ids>
<config_params>
@@ -131,6 +135,7 @@
<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"/>
+ <param key="hfp_pcm_dev_id" value="36"/>
</config_params>
<gain_db_to_level_mapping>
@@ -145,8 +150,8 @@
<device name="SND_DEVICE_OUT_HANDSET" interface="TERT_TDM_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER" interface="TERT_TDM_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES" interface="TERT_TDM_RX_0"/>
- <device name="SND_DEVICE_OUT_BT_SCO" interface="TERT_TDM_RX_2"/>
- <device name="SND_DEVICE_OUT_BT_SCO_WB" interface="TERT_TDM_RX_2"/>
+ <device name="SND_DEVICE_OUT_BT_SCO" interface="AUX_PCM_RX"/>
+ <device name="SND_DEVICE_OUT_BT_SCO_WB" interface="AUX_PCM_RX"/>
<device name="SND_DEVICE_OUT_BT_A2DP" interface="TERT_TDM_RX_0"/>
<device name="SND_DEVICE_OUT_VOICE_HANDSET" interface="TERT_TDM_RX_2"/>
<device name="SND_DEVICE_OUT_VOICE_SPEAKER" interface="TERT_TDM_RX_2"/>
@@ -163,8 +168,8 @@
<device name="SND_DEVICE_IN_VOICE_HEADSET_MIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP" interface="TERT_TDM_TX_0"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC" interface="TERT_TDM_TX_0"/>
- <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" interface="TERT_TDM_TX_0"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC" interface="AUX_PCM_TX"/>
+ <device name="SND_DEVICE_IN_BT_SCO_MIC_WB" interface="AUX_PCM_TX"/>
<device name="SND_DEVICE_IN_HANDSET_DMIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_SPEAKER_DMIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_QUAD_MIC" interface="TERT_TDM_TX_0"/>
diff --git a/configs/msmsteppe_au/mixer_paths_adp.xml b/configs/msmsteppe_au/mixer_paths_adp.xml
index 6cebd13..7622dd8 100644
--- a/configs/msmsteppe_au/mixer_paths_adp.xml
+++ b/configs/msmsteppe_au/mixer_paths_adp.xml
@@ -1372,8 +1372,6 @@
</path>
<path name="hfp-sco">
- <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
- <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
<ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
<ctl name="TERT_TDM_TX_0 Channels" value="One" />
<ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
@@ -1397,16 +1395,33 @@
<path name="hfp-sco headphones">
</path>
+ <path name="hfp-sco bt-sco">
+ <path name="hfp-sco" />
+ </path>
+
<path name="hfp-sco-wb">
- <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
<ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
<path name="hfp-sco" />
</path>
+ <path name="hfp-sco-wb bt-sco-wb">
+ <path name="hfp-sco-wb" />
+ </path>
+
<path name="hfp-sco-wb headphones">
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco-downlink">
+ <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
+ <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
+ </path>
+
+ <path name="hfp-sco-wb-downlink">
+ <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+ <path name="hfp-sco-downlink" />
+ </path>
+
<path name="compress-voip-call">
<ctl name="SLIM_0_RX_Voice Mixer Voip" value="1" />
<ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
@@ -1831,6 +1846,10 @@
<path name="speaker-mono" />
</path>
+ <path name="voice-speaker-hfp">
+ <path name="speaker-mono" />
+ </path>
+
<path name="voice-speaker-2">
<path name="speaker-mono-2" />
</path>
@@ -1847,6 +1866,10 @@
<path name="speaker-mic-qrd" />
</path>
+ <path name="voice-speaker-mic-hfp">
+ <path name="speaker-mic" />
+ </path>
+
<path name="voice-headphones">
<path name="headphones" />
</path>
diff --git a/configs/msmsteppe_au/mixer_paths_custom.xml b/configs/msmsteppe_au/mixer_paths_custom.xml
index 8620565..dd0da54 100644
--- a/configs/msmsteppe_au/mixer_paths_custom.xml
+++ b/configs/msmsteppe_au/mixer_paths_custom.xml
@@ -1361,8 +1361,6 @@
</path>
<path name="hfp-sco">
- <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
- <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
<ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
<ctl name="TERT_TDM_TX_0 Channels" value="One" />
<ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
@@ -1386,16 +1384,33 @@
<path name="hfp-sco headphones">
</path>
+ <path name="hfp-sco bt-sco">
+ <path name="hfp-sco" />
+ </path>
+
<path name="hfp-sco-wb">
- <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
<ctl name="PRIM_AUX_PCM_RX SampleRate" value="KHZ_16" />
<path name="hfp-sco" />
</path>
+ <path name="hfp-sco-wb bt-sco-wb">
+ <path name="hfp-sco-wb" />
+ </path>
+
<path name="hfp-sco-wb headphones">
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco-downlink">
+ <ctl name="TERT_TDM_RX_2 Audio Mixer MultiMedia21" value="1" />
+ <ctl name="MultiMedia21 Mixer AUX_PCM_UL_TX" value="1" />
+ </path>
+
+ <path name="hfp-sco-wb-downlink">
+ <ctl name="PRIM_AUX_PCM_TX SampleRate" value="KHZ_16" />
+ <path name="hfp-sco-downlink" />
+ </path>
+
<path name="compress-voip-call">
<ctl name="SLIM_0_RX_Voice Mixer Voip" value="1" />
<ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
@@ -1820,6 +1835,10 @@
<path name="speaker-mono" />
</path>
+ <path name="voice-speaker-hfp">
+ <path name="speaker-mono" />
+ </path>
+
<path name="voice-speaker-2">
<path name="speaker-mono-2" />
</path>
@@ -1836,6 +1855,10 @@
<path name="speaker-mic-qrd" />
</path>
+ <path name="voice-speaker-mic-hfp">
+ <path name="speaker-mic" />
+ </path>
+
<path name="voice-headphones">
<path name="headphones" />
</path>
diff --git a/hal/audio_extn/Android.mk b/hal/audio_extn/Android.mk
index 7601124..3508015 100644
--- a/hal/audio_extn/Android.mk
+++ b/hal/audio_extn/Android.mk
@@ -114,6 +114,7 @@
#-------------------------------------------
# Build SSREC LIB
#-------------------------------------------
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_SSR)),true)
include $(CLEAR_VARS)
LOCAL_MODULE := libssrec
@@ -170,7 +171,7 @@
LOCAL_HEADER_LIBRARIES += libhardware_headers
LOCAL_HEADER_LIBRARIES += libsystem_headers
include $(BUILD_SHARED_LIBRARY)
-
+endif
#--------------------------------------------
# Build HDMI_EDID LIB
#--------------------------------------------
@@ -476,6 +477,10 @@
MULTIPLE_HW_VARIANTS_ENABLED := true
endif
+ifeq ($(TARGET_BOARD_AUTO),true)
+ LOCAL_CFLAGS += -DPLATFORM_AUTO
+endif
+
LOCAL_SRC_FILES:= \
hfp.c
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index f487511..8cb1054 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -49,7 +49,6 @@
#include <log_utils.h>
#endif
-#define AUDIO_PARAMETER_A2DP_STARTED "A2dpStarted"
#define BT_IPC_SOURCE_LIB_NAME "btaudio_offload_if.so"
#define BT_IPC_SINK_LIB_NAME "libbthost_if_sink.so"
#define MEDIA_FMT_NONE 0
@@ -91,13 +90,7 @@
#define MIXER_SET_FEEDBACK_CHANNEL "BT set feedback channel"
#define MIXER_SINK_SAMPLE_RATE "BT_TX SampleRate"
#define MIXER_AFE_SINK_CHANNELS "AFE Output Channels"
-#define MIXER_ENC_FMT_SBC "SBC"
-#define MIXER_ENC_FMT_AAC "AAC"
-#define MIXER_ENC_FMT_APTX "APTX"
#define MIXER_FMT_TWS_CHANNEL_MODE "TWS Channel Mode"
-#define MIXER_ENC_FMT_APTXHD "APTXHD"
-#define MIXER_END_FMT_LDAC "LDAC"
-#define MIXER_ENC_FMT_NONE "NONE"
#define ENCODER_LATENCY_SBC 10
#define ENCODER_LATENCY_APTX 40
#define ENCODER_LATENCY_APTX_HD 20
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index f324ee1..9ec1ecb 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -68,7 +68,7 @@
#define MAX_NUM_CHANNELS 8
#define Q14_GAIN_UNITY 0x4000
-static int is_running_vendor_enhanced_fwk = 0;
+static int vendor_enhanced_info = 0;
static bool is_compress_meta_data_enabled = false;
struct snd_card_split cur_snd_card_split = {
@@ -192,6 +192,7 @@
static bool audio_extn_battery_listener_enabled = false;
static bool audio_extn_maxx_audio_enabled = false;
static bool audio_extn_audiozoom_enabled = false;
+static bool audio_extn_hifi_filter_enabled = false;
#define AUDIO_PARAMETER_KEY_AANC_NOISE_LEVEL "aanc_noise_level"
#define AUDIO_PARAMETER_KEY_ANC "anc_enabled"
@@ -1774,10 +1775,10 @@
//START: SPEAKER_PROTECTION ==========================================================
#ifdef __LP64__
-#define SPKR_PROT_LIB_PATH "/vendor/lib64/libspkrprot.so"
+#define SPKR_PROT_LIB_PATH "/vendor/lib64/libspkrprot.so"
#define CIRRUS_SPKR_PROT_LIB_PATH "/vendor/lib64/libcirrusspkrprot.so"
#else
-#define SPKR_PROT_LIB_PATH "/vendor/lib/libspkrprot.so"
+#define SPKR_PROT_LIB_PATH "/vendor/lib/libspkrprot.so"
#define CIRRUS_SPKR_PROT_LIB_PATH "/vendor/lib/libcirrusspkrprot.so"
#endif
@@ -1817,22 +1818,22 @@
void spkr_prot_feature_init(bool is_feature_enabled)
{
- ALOGD("%s: Called with feature %s, is_running_with_enhanced_fwk %d", __func__,
- is_feature_enabled?"Enabled":"NOT Enabled", is_running_vendor_enhanced_fwk);
+ ALOGD("%s: Called with feature %s, vendor_enhanced_info 0x%x", __func__,
+ is_feature_enabled ? "Enabled" : "NOT Enabled", vendor_enhanced_info);
if (is_feature_enabled) {
- //dlopen lib
- if (is_running_vendor_enhanced_fwk)
- spkr_prot_lib_handle = dlopen(SPKR_PROT_LIB_PATH, RTLD_NOW);
- else
+ // dlopen lib
+ if ((vendor_enhanced_info & 0x3) == 0x0) // Pure AOSP
spkr_prot_lib_handle = dlopen(CIRRUS_SPKR_PROT_LIB_PATH, RTLD_NOW);
+ else
+ spkr_prot_lib_handle = dlopen(SPKR_PROT_LIB_PATH, RTLD_NOW);
if (spkr_prot_lib_handle == NULL) {
ALOGE("%s: dlopen failed", __func__);
goto feature_disabled;
}
- //map each function
- //if mandatoy functions are not found, disble feature
+ // map each function
+ // if mandatoy functions are not found, disble feature
// Mandatory functions
if (((spkr_prot_init =
(spkr_prot_init_t)dlsym(spkr_prot_lib_handle, "spkr_prot_init")) == NULL) ||
@@ -1853,7 +1854,6 @@
}
// optional functions, can be NULL
-
spkr_prot_set_parameters = NULL;
fbsp_set_parameters = NULL;
fbsp_get_parameters = NULL;
@@ -4511,6 +4511,10 @@
init_config.fp_disable_audio_route = disable_audio_route;
init_config.fp_disable_snd_device = disable_snd_device;
init_config.fp_voice_get_mic_mute = voice_get_mic_mute;
+ init_config.fp_audio_extn_auto_hal_start_hfp_downlink =
+ audio_extn_auto_hal_start_hfp_downlink;
+ init_config.fp_audio_extn_auto_hal_stop_hfp_downlink =
+ audio_extn_auto_hal_stop_hfp_downlink;
hfp_init(init_config);
ALOGD("%s:: ---- Feature HFP is Enabled ----", __func__);
@@ -5200,6 +5204,87 @@
}
// END: BATTERY_LISTENER ================================================================
+// START: HiFi Filter Feature ============================================================
+void audio_extn_enable_hifi_filter(struct audio_device *adev, bool value)
+{
+ const char *mixer_ctl_name = "HiFi Filter";
+ struct mixer_ctl *ctl = NULL;
+ ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+ if (!ctl) {
+ ALOGE("%s: Could not get ctl for mixer cmd - %s, using default control",
+ __func__, mixer_ctl_name);
+ return;
+ } else {
+ mixer_ctl_set_value(ctl, 0, value);
+ ALOGD("%s: mixer_value set %d", __func__, value);
+ }
+ return;
+}
+
+void audio_extn_hifi_filter_set_params(struct str_parms *parms,
+ char *value, int len)
+{
+ int ret = 0;
+ ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_HIFI_AUDIO_FILTER, value,len);
+ if (ret >= 0) {
+ if (value && !strncmp(value, "true", sizeof("true")))
+ audio_extn_hifi_filter_enabled = true;
+ else
+ audio_extn_hifi_filter_enabled = false;
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_HIFI_AUDIO_FILTER);
+ }
+}
+
+bool audio_extn_hifi_check_usecase_params(int sample_rate, int usecase)
+{
+ if (sample_rate != 48000 && sample_rate != 44100)
+ return false;
+ if (usecase == USECASE_AUDIO_PLAYBACK_LOW_LATENCY || usecase == USECASE_AUDIO_PLAYBACK_ULL)
+ return false;
+ return true;
+}
+
+bool audio_extn_is_hifi_filter_enabled(struct audio_device* adev, struct stream_out *out,
+ snd_device_t snd_device, char *codec_variant,
+ int channels, int usecase_init)
+{
+ int na_mode = platform_get_native_support();
+ struct audio_usecase *uc = NULL;
+ struct listnode *node = NULL;
+ bool hifi_active = false;
+
+ if (audio_extn_hifi_filter_enabled) {
+ /*Restricting the feature for Tavil and WCD9375 codecs only*/
+ if ((strstr(codec_variant, "WCD9385") || strstr(codec_variant, "WCD9375"))
+ && (na_mode == NATIVE_AUDIO_MODE_MULTIPLE_MIX_IN_DSP) && channels <=2) {
+ /*Upsampling 8 time should be restricited to headphones playback only */
+ if (snd_device == SND_DEVICE_OUT_HEADPHONES
+ || snd_device == SND_DEVICE_OUT_HEADPHONES_44_1
+ || snd_device == SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER
+ || usecase_init) {
+ if (audio_extn_hifi_check_usecase_params(out->sample_rate,
+ out->usecase) && !usecase_init)
+ return true;
+
+ list_for_each(node, &adev->usecase_list) {
+ /* checking if hifi_filter is already active to set */
+ /* concurrent playback sessions with hifi_filter enabled*/
+ uc = node_to_item(node, struct audio_usecase, list);
+ struct stream_out *curr_out = (struct stream_out*) uc->stream.out;
+ if (uc->type == PCM_PLAYBACK && curr_out
+ && audio_extn_hifi_check_usecase_params(
+ curr_out->sample_rate, curr_out->usecase) &&
+ (curr_out->channel_mask == AUDIO_CHANNEL_OUT_STEREO ||
+ curr_out->channel_mask == AUDIO_CHANNEL_OUT_MONO))
+ hifi_active = true;
+ }
+ }
+ }
+ }
+ return hifi_active;
+}
+// END: HiFi Filter Feature ==============================================================
+
// START: AUDIOZOOM_FEATURE =====================================================================
#ifdef __LP64__
#define AUDIOZOOM_LIB_PATH "/vendor/lib64/libaudiozoom.so"
@@ -5463,10 +5548,6 @@
typedef bool (*auto_hal_is_bus_device_usecase_t)(audio_usecase_t);
static auto_hal_is_bus_device_usecase_t auto_hal_is_bus_device_usecase;
-typedef snd_device_t (*auto_hal_get_snd_device_for_car_audio_stream_t)(
- struct stream_out*);
-static auto_hal_get_snd_device_for_car_audio_stream_t auto_hal_get_snd_device_for_car_audio_stream;
-
typedef int (*auto_hal_get_audio_port_t)(struct audio_hw_device*,
struct audio_port*);
static auto_hal_get_audio_port_t auto_hal_get_audio_port;
@@ -5479,6 +5560,22 @@
struct str_parms*);
static auto_hal_set_parameters_t auto_hal_set_parameters;
+typedef int (*auto_hal_start_hfp_downlink_t)(struct audio_device*,
+ struct audio_usecase*);
+static auto_hal_start_hfp_downlink_t auto_hal_start_hfp_downlink;
+
+typedef int (*auto_hal_stop_hfp_downlink_t)(struct audio_device*,
+ struct audio_usecase*);
+static auto_hal_stop_hfp_downlink_t auto_hal_stop_hfp_downlink;
+
+typedef snd_device_t (*auto_hal_get_input_snd_device_t)(struct audio_device*,
+ audio_usecase_t);
+static auto_hal_get_input_snd_device_t auto_hal_get_input_snd_device;
+
+typedef snd_device_t (*auto_hal_get_output_snd_device_t)(struct audio_device*,
+ audio_usecase_t);
+static auto_hal_get_output_snd_device_t auto_hal_get_output_snd_device;
+
int auto_hal_feature_init(bool is_feature_enabled)
{
ALOGD("%s: Called with feature %s", __func__,
@@ -5511,9 +5608,6 @@
!(auto_hal_is_bus_device_usecase =
(auto_hal_is_bus_device_usecase_t)dlsym(
auto_hal_lib_handle, "auto_hal_is_bus_device_usecase")) ||
- !(auto_hal_get_snd_device_for_car_audio_stream =
- (auto_hal_get_snd_device_for_car_audio_stream_t)dlsym(
- auto_hal_lib_handle, "auto_hal_get_snd_device_for_car_audio_stream")) ||
!(auto_hal_get_audio_port =
(auto_hal_get_audio_port_t)dlsym(
auto_hal_lib_handle, "auto_hal_get_audio_port")) ||
@@ -5522,7 +5616,19 @@
auto_hal_lib_handle, "auto_hal_set_audio_port_config")) ||
!(auto_hal_set_parameters =
(auto_hal_set_parameters_t)dlsym(
- auto_hal_lib_handle, "auto_hal_set_parameters"))) {
+ auto_hal_lib_handle, "auto_hal_set_parameters")) ||
+ !(auto_hal_start_hfp_downlink =
+ (auto_hal_start_hfp_downlink_t)dlsym(
+ auto_hal_lib_handle, "auto_hal_start_hfp_downlink")) ||
+ !(auto_hal_stop_hfp_downlink =
+ (auto_hal_stop_hfp_downlink_t)dlsym(
+ auto_hal_lib_handle, "auto_hal_stop_hfp_downlink")) ||
+ !(auto_hal_get_input_snd_device =
+ (auto_hal_get_input_snd_device_t)dlsym(
+ auto_hal_lib_handle, "auto_hal_get_input_snd_device")) ||
+ !(auto_hal_get_output_snd_device =
+ (auto_hal_get_output_snd_device_t)dlsym(
+ auto_hal_lib_handle, "auto_hal_get_output_snd_device"))) {
ALOGE("%s: dlsym failed", __func__);
goto feature_disabled;
}
@@ -5543,10 +5649,13 @@
auto_hal_get_car_audio_stream_from_address = NULL;
auto_hal_open_output_stream = NULL;
auto_hal_is_bus_device_usecase = NULL;
- auto_hal_get_snd_device_for_car_audio_stream = NULL;
auto_hal_get_audio_port = NULL;
auto_hal_set_audio_port_config = NULL;
auto_hal_set_parameters = NULL;
+ auto_hal_start_hfp_downlink = NULL;
+ auto_hal_stop_hfp_downlink = NULL;
+ auto_hal_get_input_snd_device = NULL;
+ auto_hal_get_output_snd_device = NULL;
ALOGW(":: %s: ---- Feature AUTO_HAL is disabled ----", __func__);
return -ENOSYS;
@@ -5563,6 +5672,11 @@
auto_hal_init_config.fp_get_usecase_from_list = get_usecase_from_list;
auto_hal_init_config.fp_get_output_period_size = get_output_period_size;
auto_hal_init_config.fp_audio_extn_ext_hw_plugin_set_audio_gain = audio_extn_ext_hw_plugin_set_audio_gain;
+ auto_hal_init_config.fp_select_devices = select_devices;
+ auto_hal_init_config.fp_disable_audio_route = disable_audio_route;
+ auto_hal_init_config.fp_disable_snd_device = disable_snd_device;
+ auto_hal_init_config.fp_adev_get_active_input = adev_get_active_input;
+ auto_hal_init_config.fp_platform_set_echo_reference = platform_set_echo_reference;
return auto_hal_init(adev, auto_hal_init_config);
}
else
@@ -5601,25 +5715,19 @@
int audio_extn_auto_hal_get_car_audio_stream_from_address(const char *address)
{
return ((auto_hal_get_car_audio_stream_from_address) ?
- auto_hal_get_car_audio_stream_from_address(address): 0);
+ auto_hal_get_car_audio_stream_from_address(address): -ENOSYS);
}
int audio_extn_auto_hal_open_output_stream(struct stream_out *out)
{
return ((auto_hal_open_output_stream) ?
- auto_hal_open_output_stream(out): 0);
+ auto_hal_open_output_stream(out): -ENOSYS);
}
bool audio_extn_auto_hal_is_bus_device_usecase(audio_usecase_t uc_id)
{
return ((auto_hal_is_bus_device_usecase) ?
- auto_hal_is_bus_device_usecase(uc_id): 0);
-}
-
-snd_device_t audio_extn_auto_hal_get_snd_device_for_car_audio_stream(struct stream_out *out)
-{
- return ((auto_hal_get_snd_device_for_car_audio_stream) ?
- auto_hal_get_snd_device_for_car_audio_stream(out): 0);
+ auto_hal_is_bus_device_usecase(uc_id): false);
}
int audio_extn_auto_hal_get_audio_port(struct audio_hw_device *dev,
@@ -5642,11 +5750,39 @@
if (auto_hal_set_parameters)
auto_hal_set_parameters(adev, parms);
}
+
+int audio_extn_auto_hal_start_hfp_downlink(struct audio_device *adev,
+ struct audio_usecase *uc_info)
+{
+ return ((auto_hal_start_hfp_downlink) ?
+ auto_hal_start_hfp_downlink(adev, uc_info): 0);
+}
+
+int audio_extn_auto_hal_stop_hfp_downlink(struct audio_device *adev,
+ struct audio_usecase *uc_info)
+{
+ return ((auto_hal_stop_hfp_downlink) ?
+ auto_hal_stop_hfp_downlink(adev, uc_info): 0);
+}
+
+snd_device_t audio_extn_auto_hal_get_input_snd_device(struct audio_device *adev,
+ audio_usecase_t uc_id)
+{
+ return ((auto_hal_get_input_snd_device) ?
+ auto_hal_get_input_snd_device(adev, uc_id): SND_DEVICE_NONE);
+}
+
+snd_device_t audio_extn_auto_hal_get_output_snd_device(struct audio_device *adev,
+ audio_usecase_t uc_id)
+{
+ return ((auto_hal_get_output_snd_device) ?
+ auto_hal_get_output_snd_device(adev, uc_id): SND_DEVICE_NONE);
+}
// END: AUTO_HAL ===================================================================
void audio_extn_feature_init()
{
- is_running_vendor_enhanced_fwk = audio_extn_utils_is_vendor_enhanced_fwk();
+ vendor_enhanced_info = audio_extn_utils_get_vendor_enhanced_info();
// register feature init functions here
// each feature needs a vendor property
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 91204a7..d282f45 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -117,6 +117,8 @@
#define MAX_LENGTH_MIXER_CONTROL_IN_INT (128)
#define HW_INFO_ARRAY_MAX_SIZE 32
+#define AUDIO_PARAMETER_KEY_HIFI_AUDIO_FILTER "hifi_filter"
+
struct snd_card_split {
char device[HW_INFO_ARRAY_MAX_SIZE];
char snd_card[HW_INFO_ARRAY_MAX_SIZE];
@@ -262,6 +264,14 @@
int32_t audio_extn_get_afe_proxy_channel_count();
//END: AFE_PROXY_FEATURE
+//START: HIFI FILTER
+void audio_extn_enable_hifi_filter(struct audio_device *adev, bool value);
+void audio_extn_hifi_filter_set_params(struct str_parms *parms, char *value, int len);
+bool audio_extn_is_hifi_filter_enabled(struct audio_device* adev,struct stream_out *out,
+ snd_device_t snd_device, char *codec_variant,
+ int channels, int usecase_init);
+//END: HIFI FILTER
+
/// ---- USB feature ---------------------------------------------------------------
void audio_extn_usb_init(void *adev);
void audio_extn_usb_deinit();
@@ -682,6 +692,10 @@
struct audio_usecase *);
typedef int (*fp_disable_snd_device_t)(struct audio_device *, snd_device_t);
typedef bool (*fp_voice_get_mic_mute_t)(struct audio_device *);
+typedef int (*fp_audio_extn_auto_hal_start_hfp_downlink_t)(struct audio_device *,
+ struct audio_usecase *);
+typedef int (*fp_audio_extn_auto_hal_stop_hfp_downlink_t)(struct audio_device *,
+ struct audio_usecase *);
typedef struct hfp_init_config {
fp_platform_set_mic_mute_t fp_platform_set_mic_mute;
@@ -694,6 +708,8 @@
fp_disable_audio_route_t fp_disable_audio_route;
fp_disable_snd_device_t fp_disable_snd_device;
fp_voice_get_mic_mute_t fp_voice_get_mic_mute;
+ fp_audio_extn_auto_hal_start_hfp_downlink_t fp_audio_extn_auto_hal_start_hfp_downlink;
+ fp_audio_extn_auto_hal_stop_hfp_downlink_t fp_audio_extn_auto_hal_stop_hfp_downlink;
} hfp_init_config_t;
@@ -814,7 +830,8 @@
int audio_extn_utils_get_sample_rate_from_string(const char *);
int audio_extn_utils_get_channels_from_string(const char *);
void audio_extn_utils_release_snd_device(snd_device_t snd_device);
-int audio_extn_utils_is_vendor_enhanced_fwk();
+bool audio_extn_utils_is_vendor_enhanced_fwk();
+int audio_extn_utils_get_vendor_enhanced_info();
int audio_extn_utils_get_app_sample_rate_for_device(struct audio_device *adev,
struct audio_usecase *usecase, int snd_device);
@@ -1309,18 +1326,26 @@
int audio_extn_auto_hal_get_car_audio_stream_from_address(const char *address);
int audio_extn_auto_hal_open_output_stream(struct stream_out *out);
bool audio_extn_auto_hal_is_bus_device_usecase(audio_usecase_t uc_id);
-snd_device_t audio_extn_auto_hal_get_snd_device_for_car_audio_stream(struct stream_out *out);
int audio_extn_auto_hal_get_audio_port(struct audio_hw_device *dev,
struct audio_port *config);
int audio_extn_auto_hal_set_audio_port_config(struct audio_hw_device *dev,
const struct audio_port_config *config);
void audio_extn_auto_hal_set_parameters(struct audio_device *adev,
struct str_parms *parms);
+int audio_extn_auto_hal_start_hfp_downlink(struct audio_device *adev,
+ struct audio_usecase *uc_info);
+int audio_extn_auto_hal_stop_hfp_downlink(struct audio_device *adev,
+ struct audio_usecase *uc_info);
+snd_device_t audio_extn_auto_hal_get_input_snd_device(struct audio_device *adev,
+ audio_usecase_t uc_id);
+snd_device_t audio_extn_auto_hal_get_output_snd_device(struct audio_device *adev,
+ audio_usecase_t uc_id);
typedef streams_input_ctxt_t* (*fp_in_get_stream_t)(struct audio_device*, audio_io_handle_t);
typedef streams_output_ctxt_t* (*fp_out_get_stream_t)(struct audio_device*, audio_io_handle_t);
typedef size_t (*fp_get_output_period_size_t)(uint32_t, audio_format_t, int, int);
typedef int (*fp_audio_extn_ext_hw_plugin_set_audio_gain_t)(void*, struct audio_usecase*, uint32_t);
+typedef struct stream_in* (*fp_adev_get_active_input_t)(const struct audio_device*);
typedef struct auto_hal_init_config {
fp_in_get_stream_t fp_in_get_stream;
@@ -1330,6 +1355,11 @@
fp_get_usecase_from_list_t fp_get_usecase_from_list;
fp_get_output_period_size_t fp_get_output_period_size;
fp_audio_extn_ext_hw_plugin_set_audio_gain_t fp_audio_extn_ext_hw_plugin_set_audio_gain;
+ fp_select_devices_t fp_select_devices;
+ fp_disable_audio_route_t fp_disable_audio_route;
+ fp_disable_snd_device_t fp_disable_snd_device;
+ fp_adev_get_active_input_t fp_adev_get_active_input;
+ fp_platform_set_echo_reference_t fp_platform_set_echo_reference;
} auto_hal_init_config_t;
// END: AUTO_HAL FEATURE ==================================================
diff --git a/hal/audio_extn/auto_hal.c b/hal/audio_extn/auto_hal.c
index c18b55f..0269e81 100644
--- a/hal/audio_extn/auto_hal.c
+++ b/hal/audio_extn/auto_hal.c
@@ -54,12 +54,19 @@
static fp_get_usecase_from_list_t fp_get_usecase_from_list;
static fp_get_output_period_size_t fp_get_output_period_size;
static fp_audio_extn_ext_hw_plugin_set_audio_gain_t fp_audio_extn_ext_hw_plugin_set_audio_gain;
+static fp_select_devices_t fp_select_devices;
+static fp_disable_audio_route_t fp_disable_audio_route;
+static fp_disable_snd_device_t fp_disable_snd_device;
+static fp_adev_get_active_input_t fp_adev_get_active_input;
+static fp_platform_set_echo_reference_t fp_platform_set_echo_reference;
/* Auto hal module struct */
static struct auto_hal_module *auto_hal = NULL;
int auto_hal_release_audio_patch(struct audio_hw_device *dev,
audio_patch_handle_t handle);
+int auto_hal_stop_hfp_downlink(struct audio_device *adev,
+ struct audio_usecase *uc_info);
static struct audio_patch_record *get_patch_from_list(struct audio_device *adev,
audio_patch_handle_t patch_id)
@@ -151,6 +158,11 @@
sources->ext.device.address);
} else {
address = (char *)calloc(1, 1);
+ if (address == NULL) {
+ ALOGE("%s: failed to get address",__func__);
+ ret = -EFAULT;
+ goto error;
+ }
}
parms = str_parms_create_str(address);
if (!parms) {
@@ -185,6 +197,11 @@
sinks->ext.device.address);
} else {
address = (char *)calloc(1, 1);
+ if (address == NULL) {
+ ALOGE("%s: failed to get address",__func__);
+ ret = -EFAULT;
+ goto error;
+ }
}
parms = str_parms_create_str(address);
if (!parms) {
@@ -677,6 +694,251 @@
ALOGV("%s: exit", __func__);
}
+int auto_hal_start_hfp_downlink(struct audio_device *adev,
+ struct audio_usecase *uc_info)
+{
+ int32_t ret = 0;
+ struct audio_usecase *uc_downlink_info;
+
+ ALOGD("%s: enter", __func__);
+
+ uc_downlink_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
+
+ if (!uc_downlink_info)
+ return -ENOMEM;
+
+ uc_downlink_info->type = PCM_HFP_CALL;
+ uc_downlink_info->stream.out = adev->primary_output;
+ uc_downlink_info->devices = adev->primary_output->devices;
+ uc_downlink_info->in_snd_device = SND_DEVICE_NONE;
+ uc_downlink_info->out_snd_device = SND_DEVICE_NONE;
+
+ switch (uc_info->id) {
+ case USECASE_AUDIO_HFP_SCO:
+ uc_downlink_info->id = USECASE_AUDIO_HFP_SCO_DOWNLINK;
+ break;
+ case USECASE_AUDIO_HFP_SCO_WB:
+ uc_downlink_info->id = USECASE_AUDIO_HFP_SCO_WB_DOWNLINK;
+ break;
+ default:
+ ALOGE("%s: Invalid usecase %d", __func__, uc_info->id);
+ free(uc_downlink_info);
+ return -EINVAL;
+ }
+
+ list_add_tail(&adev->usecase_list, &uc_downlink_info->list);
+
+ ret = fp_select_devices(adev, uc_downlink_info->id);
+ if (ret) {
+ ALOGE("%s: Select devices failed %d", __func__, ret);
+ goto exit;
+ }
+
+ ALOGD("%s: exit: status(%d)", __func__, ret);
+ return 0;
+
+exit:
+ auto_hal_stop_hfp_downlink(adev, uc_info);
+ ALOGE("%s: Problem in start hfp downlink: status(%d)", __func__, ret);
+ return ret;
+}
+
+int auto_hal_stop_hfp_downlink(struct audio_device *adev,
+ struct audio_usecase *uc_info)
+{
+ int32_t ret = 0;
+ struct audio_usecase *uc_downlink_info;
+ audio_usecase_t ucid;
+
+ ALOGD("%s: enter", __func__);
+
+ switch (uc_info->id) {
+ case USECASE_AUDIO_HFP_SCO:
+ ucid = USECASE_AUDIO_HFP_SCO_DOWNLINK;
+ break;
+ case USECASE_AUDIO_HFP_SCO_WB:
+ ucid = USECASE_AUDIO_HFP_SCO_WB_DOWNLINK;
+ break;
+ default:
+ ALOGE("%s: Invalid usecase %d", __func__, uc_info->id);
+ return -EINVAL;
+ }
+
+ uc_downlink_info = fp_get_usecase_from_list(adev, ucid);
+ if (uc_downlink_info == NULL) {
+ ALOGE("%s: Could not find the usecase (%d) in the list",
+ __func__, ucid);
+ return -EINVAL;
+ }
+
+ /* Get and set stream specific mixer controls */
+ fp_disable_audio_route(adev, uc_downlink_info);
+
+ /* Disable the rx and tx devices */
+ fp_disable_snd_device(adev, uc_downlink_info->out_snd_device);
+ fp_disable_snd_device(adev, uc_downlink_info->in_snd_device);
+
+ list_remove(&uc_downlink_info->list);
+ free(uc_downlink_info);
+
+ ALOGD("%s: exit: status(%d)", __func__, ret);
+ return ret;
+}
+
+snd_device_t auto_hal_get_input_snd_device(struct audio_device *adev,
+ audio_usecase_t uc_id)
+{
+ snd_device_t snd_device = SND_DEVICE_NONE;
+ audio_devices_t out_device = AUDIO_DEVICE_NONE;
+ struct audio_usecase *usecase = NULL;
+ struct stream_in *in = fp_adev_get_active_input(adev);
+ audio_devices_t in_device = ((in == NULL) ?
+ AUDIO_DEVICE_NONE : in->device)
+ & ~AUDIO_DEVICE_BIT_IN;
+
+ if (uc_id == USECASE_INVALID) {
+ ALOGE("%s: Invalid usecase (%d)", __func__, uc_id);
+ return -EINVAL;
+ }
+
+ usecase = fp_get_usecase_from_list(adev, uc_id);
+ if (usecase == NULL) {
+ ALOGE("%s: Could not find the usecase (%d)", __func__, uc_id);
+ return -EINVAL;
+ }
+
+ if (usecase->stream.out == NULL) {
+ ALOGE("%s: stream.out is NULL", __func__);
+ return -EINVAL;
+ }
+
+ out_device = usecase->stream.out->devices;
+ if (out_device == AUDIO_DEVICE_NONE ||
+ out_device & AUDIO_DEVICE_BIT_IN) {
+ ALOGE("%s: Invalid output devices (%#x)", __func__, out_device);
+ return -EINVAL;
+ }
+
+ ALOGV("%s: output device(%#x), input device(%#x), usecase(%d)",
+ __func__, out_device, in_device, uc_id);
+
+ if (out_device & AUDIO_DEVICE_OUT_BUS) {
+ /* usecase->id is token as judgement for HFP calls */
+ switch (usecase->id) {
+ case USECASE_AUDIO_HFP_SCO:
+ case USECASE_AUDIO_HFP_SCO_WB:
+ snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP;
+ if (adev->enable_hfp)
+ fp_platform_set_echo_reference(adev, true, out_device);
+ break;
+ case USECASE_AUDIO_HFP_SCO_DOWNLINK:
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ break;
+ case USECASE_AUDIO_HFP_SCO_WB_DOWNLINK:
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
+ break;
+ case USECASE_VOICE_CALL:
+ snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
+ break;
+ default:
+ ALOGE("%s: Usecase (%d) not supported", __func__, uc_id);
+ return -EINVAL;
+ }
+ } else {
+ ALOGE("%s: Output devices (%#x) not supported", __func__, out_device);
+ return -EINVAL;
+ }
+
+ return snd_device;
+}
+
+snd_device_t auto_hal_get_output_snd_device(struct audio_device *adev,
+ audio_usecase_t uc_id)
+{
+ snd_device_t snd_device = SND_DEVICE_NONE;
+ audio_devices_t devices = AUDIO_DEVICE_NONE;
+ struct audio_usecase *usecase = NULL;
+
+ if (uc_id == USECASE_INVALID) {
+ ALOGE("%s: Invalid usecase (%d)", __func__, uc_id);
+ return -EINVAL;
+ }
+
+ usecase = fp_get_usecase_from_list(adev, uc_id);
+ if (usecase == NULL) {
+ ALOGE("%s: Could not find the usecase (%d)", __func__, uc_id);
+ return -EINVAL;
+ }
+
+ if (usecase->stream.out == NULL) {
+ ALOGE("%s: stream.out is NULL", __func__);
+ return -EINVAL;
+ }
+
+ devices = usecase->stream.out->devices;
+ if (devices == AUDIO_DEVICE_NONE ||
+ devices & AUDIO_DEVICE_BIT_IN) {
+ ALOGE("%s: Invalid output devices (%#x)", __func__, devices);
+ return -EINVAL;
+ }
+
+ ALOGV("%s: output devices(%#x), usecase(%d)", __func__, devices, uc_id);
+
+ if (devices & AUDIO_DEVICE_OUT_BUS) {
+ /* usecase->id is token as judgement for HFP calls */
+ switch (usecase->id) {
+ case USECASE_AUDIO_HFP_SCO:
+ snd_device = SND_DEVICE_OUT_BT_SCO;
+ break;
+ case USECASE_AUDIO_HFP_SCO_WB:
+ snd_device = SND_DEVICE_OUT_BT_SCO_WB;
+ break;
+ case USECASE_AUDIO_HFP_SCO_DOWNLINK:
+ case USECASE_AUDIO_HFP_SCO_WB_DOWNLINK:
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_HFP;
+ break;
+ case USECASE_VOICE_CALL:
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ break;
+ case USECASE_AUDIO_PLAYBACK_MEDIA:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD3:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD4:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD5:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD6:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD7:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD8:
+ case USECASE_AUDIO_PLAYBACK_OFFLOAD9:
+ case USECASE_AUDIO_PLAYBACK_ULL:
+ case USECASE_AUDIO_PLAYBACK_MMAP:
+ case USECASE_AUDIO_PLAYBACK_VOIP:
+ snd_device = SND_DEVICE_OUT_BUS_MEDIA;
+ break;
+ case USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION:
+ snd_device = SND_DEVICE_OUT_BUS_SYS;
+ break;
+ case USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE:
+ snd_device = SND_DEVICE_OUT_BUS_NAV;
+ break;
+ case USECASE_AUDIO_PLAYBACK_PHONE:
+ snd_device = SND_DEVICE_OUT_BUS_PHN;
+ break;
+ case USECASE_AUDIO_PLAYBACK_REAR_SEAT:
+ snd_device = SND_DEVICE_OUT_BUS_RSE;
+ break;
+ default:
+ ALOGE("%s: Usecase (%d) not supported", __func__, uc_id);
+ return -EINVAL;
+ }
+ } else {
+ ALOGE("%s: Output devices (%#x) not supported", __func__, devices);
+ return -EINVAL;
+ }
+
+ return snd_device;
+}
+
int auto_hal_init(struct audio_device *adev, auto_hal_init_config_t init_config)
{
int ret = 0;
@@ -704,6 +966,11 @@
fp_get_usecase_from_list = init_config.fp_get_usecase_from_list;
fp_get_output_period_size = init_config.fp_get_output_period_size;
fp_audio_extn_ext_hw_plugin_set_audio_gain = init_config.fp_audio_extn_ext_hw_plugin_set_audio_gain;
+ fp_select_devices = init_config.fp_select_devices;
+ fp_disable_audio_route = init_config.fp_disable_audio_route;
+ fp_disable_snd_device = init_config.fp_disable_snd_device;
+ fp_adev_get_active_input = init_config.fp_adev_get_active_input;
+ fp_platform_set_echo_reference = init_config.fp_platform_set_echo_reference;
return ret;
}
diff --git a/hal/audio_extn/ext_hw_plugin.c b/hal/audio_extn/ext_hw_plugin.c
index 7460caa..6e784cb 100644
--- a/hal/audio_extn/ext_hw_plugin.c
+++ b/hal/audio_extn/ext_hw_plugin.c
@@ -182,6 +182,8 @@
break;
case USECASE_AUDIO_HFP_SCO:
case USECASE_AUDIO_HFP_SCO_WB:
+ case USECASE_AUDIO_HFP_SCO_DOWNLINK:
+ case USECASE_AUDIO_HFP_SCO_WB_DOWNLINK:
*plugin_usecase = AUDIO_HAL_PLUGIN_USECASE_HFP_VOICE_CALL;
break;
case USECASE_VOICE_CALL:
diff --git a/hal/audio_extn/hfp.c b/hal/audio_extn/hfp.c
index 1088a0c..9b60083 100644
--- a/hal/audio_extn/hfp.c
+++ b/hal/audio_extn/hfp.c
@@ -125,6 +125,8 @@
static fp_disable_audio_route_t fp_disable_audio_route;
static fp_disable_snd_device_t fp_disable_snd_device;
static fp_voice_get_mic_mute_t fp_voice_get_mic_mute;
+static fp_audio_extn_auto_hal_start_hfp_downlink_t fp_audio_extn_auto_hal_start_hfp_downlink;
+static fp_audio_extn_auto_hal_stop_hfp_downlink_t fp_audio_extn_auto_hal_stop_hfp_downlink;
static int32_t hfp_set_volume(struct audio_device *adev, float value)
{
@@ -332,15 +334,6 @@
ALOGD("%s: HFP PCM devices (rx: %d tx: %d pcm dev id: %d) usecase(%d)",
__func__, pcm_dev_rx_id, pcm_dev_tx_id, hfpmod.hfp_pcm_dev_id, uc_info->id);
- hfpmod.hfp_sco_rx = pcm_open(adev->snd_card,
- pcm_dev_asm_rx_id,
- PCM_OUT, &pcm_config_hfp);
- if (hfpmod.hfp_sco_rx && !pcm_is_ready(hfpmod.hfp_sco_rx)) {
- ALOGE("%s: %s", __func__, pcm_get_error(hfpmod.hfp_sco_rx));
- ret = -EIO;
- goto exit;
- }
-
hfpmod.hfp_pcm_rx = pcm_open(adev->snd_card,
pcm_dev_rx_id,
PCM_OUT, &pcm_config_hfp);
@@ -350,15 +343,6 @@
goto exit;
}
- hfpmod.hfp_sco_tx = pcm_open(adev->snd_card,
- pcm_dev_asm_tx_id,
- PCM_IN, &pcm_config_hfp);
- if (hfpmod.hfp_sco_tx && !pcm_is_ready(hfpmod.hfp_sco_tx)) {
- ALOGE("%s: %s", __func__, pcm_get_error(hfpmod.hfp_sco_tx));
- ret = -EIO;
- goto exit;
- }
-
hfpmod.hfp_pcm_tx = pcm_open(adev->snd_card,
pcm_dev_tx_id,
PCM_IN, &pcm_config_hfp);
@@ -368,17 +352,6 @@
goto exit;
}
- if (pcm_start(hfpmod.hfp_sco_rx) < 0) {
- ALOGE("%s: pcm start for hfp sco rx failed", __func__);
- ret = -EINVAL;
- goto exit;
- }
- if (pcm_start(hfpmod.hfp_sco_tx) < 0) {
- ALOGE("%s: pcm start for hfp sco tx failed", __func__);
- ret = -EINVAL;
- goto exit;
- }
-
if (pcm_start(hfpmod.hfp_pcm_rx) < 0) {
ALOGE("%s: pcm start for hfp pcm rx failed", __func__);
ret = -EINVAL;
@@ -390,6 +363,38 @@
goto exit;
}
+ if (fp_audio_extn_auto_hal_start_hfp_downlink(adev, uc_info))
+ ALOGE("%s: start hfp downlink failed", __func__);
+
+ hfpmod.hfp_sco_rx = pcm_open(adev->snd_card,
+ pcm_dev_asm_rx_id,
+ PCM_OUT, &pcm_config_hfp);
+ if (hfpmod.hfp_sco_rx && !pcm_is_ready(hfpmod.hfp_sco_rx)) {
+ ALOGE("%s: %s", __func__, pcm_get_error(hfpmod.hfp_sco_rx));
+ ret = -EIO;
+ goto exit;
+ }
+
+ hfpmod.hfp_sco_tx = pcm_open(adev->snd_card,
+ pcm_dev_asm_tx_id,
+ PCM_IN, &pcm_config_hfp);
+ if (hfpmod.hfp_sco_tx && !pcm_is_ready(hfpmod.hfp_sco_tx)) {
+ ALOGE("%s: %s", __func__, pcm_get_error(hfpmod.hfp_sco_tx));
+ ret = -EIO;
+ goto exit;
+ }
+
+ if (pcm_start(hfpmod.hfp_sco_rx) < 0) {
+ ALOGE("%s: pcm start for hfp sco rx failed", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+ if (pcm_start(hfpmod.hfp_sco_tx) < 0) {
+ ALOGE("%s: pcm start for hfp sco tx failed", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
hfpmod.is_hfp_running = true;
hfp_set_volume(adev, hfpmod.hfp_volume);
@@ -455,6 +460,9 @@
fp_disable_snd_device(adev, uc_info->out_snd_device);
fp_disable_snd_device(adev, uc_info->in_snd_device);
+ if (fp_audio_extn_auto_hal_stop_hfp_downlink(adev, uc_info))
+ ALOGE("%s: stop hfp downlink failed", __func__);
+
/* Set the unmute Tx mixer control */
if (fp_voice_get_mic_mute(adev)) {
fp_platform_set_mic_mute(adev->platform, false);
@@ -483,6 +491,10 @@
fp_disable_audio_route = init_config.fp_disable_audio_route;
fp_disable_snd_device = init_config.fp_disable_snd_device;
fp_voice_get_mic_mute = init_config.fp_voice_get_mic_mute;
+ fp_audio_extn_auto_hal_start_hfp_downlink =
+ init_config.fp_audio_extn_auto_hal_start_hfp_downlink;
+ fp_audio_extn_auto_hal_stop_hfp_downlink =
+ init_config.fp_audio_extn_auto_hal_stop_hfp_downlink;
}
bool hfp_is_active(struct audio_device *adev)
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index a29b6e5..5bdc881 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -117,9 +117,15 @@
#define VNDK_FWK_LIB_PATH "/vendor/lib/libqti_vndfwk_detect.so"
#endif
-static void *vndk_fwk_lib_handle = NULL;
-typedef int (*vndk_fwk_isVendorEnhancedFwk_t)();
-static vndk_fwk_isVendorEnhancedFwk_t vndk_fwk_isVendorEnhancedFwk;
+typedef struct vndkfwk_s {
+ void *lib_handle;
+ int (*isVendorEnhancedFwk)(void);
+ int (*getVendorEnhancedInfo)(void);
+ const char *lib_name;
+} vndkfwk_t;
+
+static vndkfwk_t mVndkFwk = {
+ NULL, NULL, NULL, VNDK_FWK_LIB_PATH};
typedef struct {
const char *id_string;
@@ -832,6 +838,25 @@
return adev->vr_audio_mode_enabled;
}
+static void audio_extn_btsco_get_sample_rate(int snd_device, int *sample_rate)
+{
+ switch (snd_device) {
+ case SND_DEVICE_OUT_BT_SCO:
+ case SND_DEVICE_IN_BT_SCO_MIC:
+ case SND_DEVICE_IN_BT_SCO_MIC_NREC:
+ *sample_rate = 8000;
+ break;
+ case SND_DEVICE_OUT_BT_SCO_WB:
+ case SND_DEVICE_IN_BT_SCO_MIC_WB:
+ case SND_DEVICE_IN_BT_SCO_MIC_WB_NREC:
+ *sample_rate = 16000;
+ break;
+ default:
+ ALOGD("%s:Not a BT SCO device, need not update sampling rate\n", __func__);
+ break;
+ }
+}
+
void audio_extn_utils_update_stream_app_type_cfg_for_usecase(
struct audio_device *adev,
struct audio_usecase *usecase)
@@ -880,31 +905,46 @@
&usecase->stream.inout->out_app_type_cfg);
ALOGV("%s Selected apptype: %d", __func__, usecase->stream.inout->out_app_type_cfg.app_type);
break;
+ case PCM_HFP_CALL:
+ switch (usecase->id) {
+ case USECASE_AUDIO_HFP_SCO:
+ case USECASE_AUDIO_HFP_SCO_WB:
+ audio_extn_btsco_get_sample_rate(usecase->out_snd_device,
+ &usecase->out_app_type_cfg.sample_rate);
+ usecase->in_app_type_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ break;
+ case USECASE_AUDIO_HFP_SCO_DOWNLINK:
+ case USECASE_AUDIO_HFP_SCO_WB_DOWNLINK:
+ audio_extn_btsco_get_sample_rate(usecase->in_snd_device,
+ &usecase->in_app_type_cfg.sample_rate);
+ usecase->out_app_type_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ break;
+ default:
+ ALOGE("%s: usecase id (%d) not supported, use default sample rate",
+ __func__, usecase->id);
+ usecase->in_app_type_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ usecase->out_app_type_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ break;
+ }
+ /* update out_app_type_cfg */
+ usecase->out_app_type_cfg.bit_width =
+ platform_get_snd_device_bit_width(usecase->out_snd_device);
+ usecase->out_app_type_cfg.app_type =
+ platform_get_default_app_type_v2(adev->platform, PCM_PLAYBACK);
+ /* update in_app_type_cfg */
+ usecase->in_app_type_cfg.bit_width =
+ platform_get_snd_device_bit_width(usecase->in_snd_device);
+ usecase->in_app_type_cfg.app_type =
+ platform_get_default_app_type_v2(adev->platform, PCM_CAPTURE);
+ ALOGV("%s Selected apptype: playback %d capture %d",
+ __func__, usecase->out_app_type_cfg.app_type, usecase->in_app_type_cfg.app_type);
+ break;
default:
ALOGE("%s: app type cfg not supported for usecase type (%d)",
__func__, usecase->type);
}
}
-void audio_extn_btsco_get_sample_rate(int snd_device, int *sample_rate)
-{
- switch (snd_device) {
- case SND_DEVICE_OUT_BT_SCO:
- case SND_DEVICE_IN_BT_SCO_MIC:
- case SND_DEVICE_IN_BT_SCO_MIC_NREC:
- *sample_rate = 8000;
- break;
- case SND_DEVICE_OUT_BT_SCO_WB:
- case SND_DEVICE_IN_BT_SCO_MIC_WB:
- case SND_DEVICE_IN_BT_SCO_MIC_WB_NREC:
- *sample_rate = 16000;
- break;
- default:
- ALOGD("%s:Not a BT SCO device, need not update sampling rate\n", __func__);
- break;
- }
-}
-
static int set_stream_app_type_mixer_ctrl(struct audio_device *adev,
int pcm_device_id, int app_type,
int acdb_dev_id, int sample_rate,
@@ -955,21 +995,27 @@
int pcm_device_id, acdb_dev_id = 0, snd_device = usecase->out_snd_device;
int32_t sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
int app_type = 0, rc = 0;
+ bool is_bus_dev_usecase = false;
ALOGV("%s", __func__);
if (usecase->type != PCM_HFP_CALL) {
- ALOGV("%s: not a playback or HFP path, no need to cfg app type", __func__);
+ ALOGV("%s: not a HFP path, no need to cfg app type", __func__);
rc = 0;
goto exit_send_app_type_cfg;
}
if ((usecase->id != USECASE_AUDIO_HFP_SCO) &&
- (usecase->id != USECASE_AUDIO_HFP_SCO_WB)) {
- ALOGV("%s: a playback path where app type cfg is not required", __func__);
+ (usecase->id != USECASE_AUDIO_HFP_SCO_WB) &&
+ (usecase->id != USECASE_AUDIO_HFP_SCO_DOWNLINK) &&
+ (usecase->id != USECASE_AUDIO_HFP_SCO_WB_DOWNLINK)) {
+ ALOGV("%s: a usecase where app type cfg is not required", __func__);
rc = 0;
goto exit_send_app_type_cfg;
}
+ if (usecase->devices & AUDIO_DEVICE_OUT_BUS)
+ is_bus_dev_usecase = true;
+
snd_device = usecase->out_snd_device;
pcm_device_id = platform_get_pcm_device_id(usecase->id, PCM_PLAYBACK);
@@ -983,24 +1029,47 @@
if (usecase->type == PCM_HFP_CALL) {
/* config HFP session:1 playback path */
- app_type = platform_get_default_app_type_v2(adev->platform, PCM_PLAYBACK);
- sample_rate= CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ if (is_bus_dev_usecase) {
+ app_type = usecase->out_app_type_cfg.app_type;
+ sample_rate= usecase->out_app_type_cfg.sample_rate;
+ } else {
+ snd_device = SND_DEVICE_NONE; // use legacy behavior
+ app_type = platform_get_default_app_type_v2(adev->platform, PCM_PLAYBACK);
+ sample_rate= CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ }
rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
acdb_dev_id, sample_rate,
PCM_PLAYBACK,
- SND_DEVICE_NONE); // use legacy behavior
+ snd_device);
if (rc < 0)
goto exit_send_app_type_cfg;
/* config HFP session:1 capture path */
- app_type = platform_get_default_app_type_v2(adev->platform, PCM_CAPTURE);
+ if (is_bus_dev_usecase) {
+ snd_device = usecase->in_snd_device;
+ pcm_device_id = platform_get_pcm_device_id(usecase->id, PCM_CAPTURE);
+ acdb_dev_id = platform_get_snd_device_acdb_id(snd_device);
+ if (acdb_dev_id < 0) {
+ ALOGE("%s: Couldn't get the acdb dev id", __func__);
+ rc = -EINVAL;
+ goto exit_send_app_type_cfg;
+ }
+ app_type = usecase->in_app_type_cfg.app_type;
+ sample_rate= usecase->in_app_type_cfg.sample_rate;
+ } else {
+ snd_device = SND_DEVICE_NONE; // use legacy behavior
+ app_type = platform_get_default_app_type_v2(adev->platform, PCM_CAPTURE);
+ }
rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
acdb_dev_id, sample_rate,
PCM_CAPTURE,
- SND_DEVICE_NONE);
+ snd_device);
if (rc < 0)
goto exit_send_app_type_cfg;
+ if (is_bus_dev_usecase)
+ goto exit_send_app_type_cfg;
+
/* config HFP session:2 capture path */
pcm_device_id = HFP_ASM_RX_TX;
snd_device = usecase->in_snd_device;
@@ -2915,15 +2984,15 @@
LISTEN_EVENT_SND_DEVICE_FREE);
}
-int audio_extn_utils_get_license_params
-(
-const struct audio_device *adev,
-struct audio_license_params *license_params
-)
+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);
+
+ return platform_get_license_by_product(adev->platform,
+ (const char*)license_params->product, &license_params->key, license_params->license);
}
int audio_extn_utils_send_app_type_gain(struct audio_device *adev,
@@ -2948,32 +3017,78 @@
sizeof(gain_cfg)/sizeof(gain_cfg[0]));
}
-int audio_extn_utils_is_vendor_enhanced_fwk()
+static void vndk_fwk_init()
{
- static int is_running_with_enhanced_fwk = -EINVAL;
+ if (mVndkFwk.lib_handle != NULL)
+ return;
- if (is_running_with_enhanced_fwk == -EINVAL) {
- vndk_fwk_lib_handle = dlopen(VNDK_FWK_LIB_PATH, RTLD_NOW);
- if (vndk_fwk_lib_handle != NULL) {
- vndk_fwk_isVendorEnhancedFwk = (vndk_fwk_isVendorEnhancedFwk_t)
- dlsym(vndk_fwk_lib_handle, "isRunningWithVendorEnhancedFramework");
- if (vndk_fwk_isVendorEnhancedFwk == NULL) {
- ALOGW("%s: dlsym failed, defaulting to enhanced_fwk configuration",
- __func__);
- is_running_with_enhanced_fwk = 1;
- } else {
- is_running_with_enhanced_fwk = vndk_fwk_isVendorEnhancedFwk();
- }
- dlclose(vndk_fwk_lib_handle);
- vndk_fwk_lib_handle = NULL;
- } else {
- ALOGW("%s: VNDK_FWK_LIB not found, setting stock configuration", __func__);
- is_running_with_enhanced_fwk = 0;
- }
- ALOGV("%s: vndk_fwk_isVendorEnhancedFwk=%d", __func__, is_running_with_enhanced_fwk);
+ mVndkFwk.lib_handle = dlopen(VNDK_FWK_LIB_PATH, RTLD_NOW);
+ if (mVndkFwk.lib_handle == NULL) {
+ ALOGW("%s: failed to dlopen VNDK_FWK_LIB %s", __func__, strerror(errno));
+ return;
}
- return is_running_with_enhanced_fwk;
+ *(void **)(&mVndkFwk.isVendorEnhancedFwk) =
+ dlsym(mVndkFwk.lib_handle, "isRunningWithVendorEnhancedFramework");
+ if (mVndkFwk.isVendorEnhancedFwk == NULL) {
+ ALOGW("%s: dlsym failed %s", __func__, strerror(errno));
+ if (mVndkFwk.lib_handle) {
+ dlclose(mVndkFwk.lib_handle);
+ mVndkFwk.lib_handle = NULL;
+ }
+ return;
+ }
+
+
+ *(void **)(&mVndkFwk.getVendorEnhancedInfo) =
+ dlsym(mVndkFwk.lib_handle, "getVendorEnhancedInfo");
+ if (mVndkFwk.getVendorEnhancedInfo == NULL) {
+ ALOGW("%s: dlsym failed %s", __func__, strerror(errno));
+ if (mVndkFwk.lib_handle) {
+ dlclose(mVndkFwk.lib_handle);
+ mVndkFwk.lib_handle = NULL;
+ }
+ }
+
+ return;
+}
+
+bool audio_extn_utils_is_vendor_enhanced_fwk()
+{
+ static int is_vendor_enhanced_fwk = -EINVAL;
+ if (is_vendor_enhanced_fwk != -EINVAL)
+ return (bool)is_vendor_enhanced_fwk;
+
+ vndk_fwk_init();
+
+ if (mVndkFwk.isVendorEnhancedFwk != NULL) {
+ is_vendor_enhanced_fwk = mVndkFwk.isVendorEnhancedFwk();
+ ALOGW("%s: is_vendor_enhanced_fwk %d", __func__, is_vendor_enhanced_fwk);
+ } else {
+ is_vendor_enhanced_fwk = 0;
+ ALOGW("%s: default to non enhanced_fwk config", __func__);
+ }
+
+ return (bool)is_vendor_enhanced_fwk;
+}
+
+int audio_extn_utils_get_vendor_enhanced_info()
+{
+ static int vendor_enhanced_info = -EINVAL;
+ if (vendor_enhanced_info != -EINVAL)
+ return vendor_enhanced_info;
+
+ vndk_fwk_init();
+
+ if (mVndkFwk.getVendorEnhancedInfo != NULL) {
+ vendor_enhanced_info = mVndkFwk.getVendorEnhancedInfo();
+ ALOGW("%s: vendor_enhanced_info 0x%x", __func__, vendor_enhanced_info);
+ } else {
+ vendor_enhanced_info = 0x0;
+ ALOGW("%s: default to vendor_enhanced_info 0x0", __func__);
+ }
+
+ return vendor_enhanced_info;
}
int audio_extn_utils_get_perf_mode_flag(void)
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index b0a43b2..0580353 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -357,8 +357,10 @@
[USECASE_AUDIO_HFP_SCO] = "hfp-sco",
[USECASE_AUDIO_HFP_SCO_WB] = "hfp-sco-wb",
- [USECASE_VOICE_CALL] = "voice-call",
+ [USECASE_AUDIO_HFP_SCO_DOWNLINK] = "hfp-sco-downlink",
+ [USECASE_AUDIO_HFP_SCO_WB_DOWNLINK] = "hfp-sco-wb-downlink",
+ [USECASE_VOICE_CALL] = "voice-call",
[USECASE_VOICE2_CALL] = "voice2-call",
[USECASE_VOLTE_CALL] = "volte-call",
[USECASE_QCHAT_CALL] = "qchat-call",
@@ -511,6 +513,8 @@
static void in_snd_mon_cb(void * stream, struct str_parms * parms);
static void out_snd_mon_cb(void * stream, struct str_parms * parms);
+static int configure_btsco_sample_rate(snd_device_t snd_device);
+
#ifdef AUDIO_FEATURE_ENABLED_GCOV
extern void __gcov_flush();
static void enable_gcov()
@@ -1303,6 +1307,7 @@
goto err;
}
+ configure_btsco_sample_rate(snd_device);
/* due to the possibility of calibration overwrite between listen
and audio, notify listen hal before audio calibration is sent */
audio_extn_sound_trigger_update_device_status(snd_device,
@@ -2310,6 +2315,50 @@
return bt_soc_status;
}
+static int configure_btsco_sample_rate(snd_device_t snd_device)
+{
+ struct mixer_ctl *ctl = NULL;
+ struct mixer_ctl *ctl_sr_rx = NULL, *ctl_sr_tx = NULL, *ctl_sr = NULL;
+ char *rate_str = NULL;
+ bool is_rx_dev = true;
+
+ if (is_btsco_device(snd_device, snd_device)) {
+ ctl_sr_tx = mixer_get_ctl_by_name(adev->mixer, "BT SampleRate TX");
+ ctl_sr_rx = mixer_get_ctl_by_name(adev->mixer, "BT SampleRate RX");
+ if (!ctl_sr_tx || !ctl_sr_rx) {
+ ctl_sr = mixer_get_ctl_by_name(adev->mixer, "BT SampleRate");
+ if (!ctl_sr)
+ return -ENOSYS;
+ }
+
+ switch (snd_device) {
+ case SND_DEVICE_OUT_BT_SCO:
+ rate_str = "KHZ_8";
+ break;
+ case SND_DEVICE_IN_BT_SCO_MIC_NREC:
+ case SND_DEVICE_IN_BT_SCO_MIC:
+ rate_str = "KHZ_8";
+ is_rx_dev = false;
+ break;
+ case SND_DEVICE_OUT_BT_SCO_WB:
+ rate_str = "KHZ_16";
+ break;
+ case SND_DEVICE_IN_BT_SCO_MIC_WB_NREC:
+ case SND_DEVICE_IN_BT_SCO_MIC_WB:
+ rate_str = "KHZ_16";
+ is_rx_dev = false;
+ break;
+ default:
+ return 0;
+ }
+
+ ctl = (ctl_sr == NULL) ? (is_rx_dev ? ctl_sr_rx : ctl_sr_tx) : ctl_sr;
+ if (mixer_ctl_set_enum_by_string(ctl, rate_str) != 0)
+ return -ENOSYS;
+ }
+ return 0;
+}
+
int out_standby_l(struct audio_stream *stream);
struct stream_in *adev_get_active_input(const struct audio_device *adev)
@@ -2430,11 +2479,18 @@
ALOGE("%s: stream.out is NULL", __func__);
return -EINVAL;
}
- out_snd_device = platform_get_output_snd_device(adev->platform,
- usecase->stream.out);
- in_snd_device = platform_get_input_snd_device(adev->platform,
- NULL,
- usecase->stream.out->devices);
+ if (usecase->devices & AUDIO_DEVICE_OUT_BUS) {
+ out_snd_device = audio_extn_auto_hal_get_output_snd_device(adev,
+ uc_id);
+ in_snd_device = audio_extn_auto_hal_get_input_snd_device(adev,
+ uc_id);
+ } else {
+ out_snd_device = platform_get_output_snd_device(adev->platform,
+ usecase->stream.out);
+ in_snd_device = platform_get_input_snd_device(adev->platform,
+ NULL,
+ usecase->stream.out->devices);
+ }
usecase->devices = usecase->stream.out->devices;
} else if (usecase->type == TRANSCODE_LOOPBACK_RX) {
if (usecase->stream.inout == NULL) {
@@ -2515,8 +2571,11 @@
if (out_snd_device == SND_DEVICE_NONE) {
struct stream_out *voip_out = adev->primary_output;
struct stream_in *voip_in = get_voice_communication_input(adev);
- out_snd_device = platform_get_output_snd_device(adev->platform,
- usecase->stream.out);
+ if (usecase->devices & AUDIO_DEVICE_OUT_BUS)
+ out_snd_device = audio_extn_auto_hal_get_output_snd_device(adev, uc_id);
+ else
+ out_snd_device = platform_get_output_snd_device(adev->platform,
+ usecase->stream.out);
voip_usecase = get_usecase_from_list(adev, USECASE_AUDIO_PLAYBACK_VOIP);
if (voip_usecase)
@@ -2578,10 +2637,11 @@
return 0;
}
- if ((is_btsco_device(out_snd_device,in_snd_device) && !adev->bt_sco_on) ||
- (is_a2dp_device(out_snd_device) && !audio_extn_a2dp_source_is_ready())) {
- ALOGD("SCO/A2DP is selected but they are not connected/ready hence dont route");
- return 0;
+ if (!(usecase->devices & AUDIO_DEVICE_OUT_BUS) &&
+ ((is_btsco_device(out_snd_device,in_snd_device) && !adev->bt_sco_on) ||
+ (is_a2dp_device(out_snd_device) && !audio_extn_a2dp_source_is_ready()))) {
+ ALOGD("SCO/A2DP is selected but they are not connected/ready hence dont route");
+ return 0;
}
if (out_snd_device != SND_DEVICE_NONE &&
@@ -5872,25 +5932,24 @@
size_t kernel_buffer_size = out->config.period_size * out->config.period_count;
uint64_t signed_frames = 0;
+ uint64_t frames_temp = 0;
- if (avail > kernel_buffer_size)
- avail = kernel_buffer_size;
-
- if (out->written >= (kernel_buffer_size - avail))
- signed_frames = out->written - kernel_buffer_size + avail;
+ frames_temp = (kernel_buffer_size > avail) ? (kernel_buffer_size - avail) : 0;
+ if (out->written >= frames_temp)
+ signed_frames = out->written - frames_temp;
// This adjustment accounts for buffering after app processor.
// It is based on estimated DSP latency per use case, rather than exact.
- if (signed_frames >= (platform_render_latency(out->usecase) * out->sample_rate / 1000000LL))
- signed_frames -=
- (platform_render_latency(out->usecase) * out->sample_rate / 1000000LL);
+ frames_temp = platform_render_latency(out->usecase) * out->sample_rate / 1000000LL;
+ if (signed_frames >= frames_temp)
+ signed_frames -= frames_temp;
// Adjustment accounts for A2dp encoder latency with non offload usecases
// Note: Encoder latency is returned in ms, while platform_render_latency in us.
if (AUDIO_DEVICE_OUT_ALL_A2DP & out->devices) {
- if (signed_frames >= (audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000))
- signed_frames -=
- (audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000);
+ frames_temp = audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000;
+ if (signed_frames >= frames_temp)
+ signed_frames -= frames_temp;
}
// It would be unusual for this value to be negative, but check just in case ...
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index b1e61ad..5e9627b 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -159,6 +159,8 @@
/* HFP Use case*/
USECASE_AUDIO_HFP_SCO,
USECASE_AUDIO_HFP_SCO_WB,
+ USECASE_AUDIO_HFP_SCO_DOWNLINK,
+ USECASE_AUDIO_HFP_SCO_WB_DOWNLINK,
/* Capture usecases */
USECASE_AUDIO_RECORD,
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 3094183..73369ea 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -6115,7 +6115,8 @@
if (rate_str == NULL) {
switch (sample_rate) {
case 32000:
- if (passthrough_enabled || (backend_idx == HDMI_TX_BACKEND )) {
+ if (passthrough_enabled || (backend_idx == HDMI_TX_BACKEND) ||
+ (backend_idx == DISP_PORT_RX_BACKEND)) {
rate_str = "KHZ_32";
break;
}
@@ -7569,37 +7570,47 @@
struct platform_data *my_data = (struct platform_data *)platform;
struct audio_device *adev = my_data->adev;
edid_audio_info *info = NULL;
- int channel_count = 2;
- int i, ret;
+ int ret;
char default_channelMap[MAX_CHANNELS_SUPPORTED] = {0};
struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
+ int channel_alloc = 0;
+ int max_supported_channels = 0;
ret = platform_get_edid_info(platform);
info = (edid_audio_info *)my_data->edid_info;
adev_device_cfg_ptr += HDMI_RX_BACKEND;
if(ret == 0 && info != NULL) {
- if (channels > 2) {
-
+ if ((channels > 2) && (channels <= MAX_HDMI_CHANNEL_CNT)) {
ALOGV("%s:able to get HDMI sink capabilities multi channel playback",
__func__);
- for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
- if (info->audio_blocks_array[i].format_id == LPCM &&
- info->audio_blocks_array[i].channels > channel_count &&
- info->audio_blocks_array[i].channels <= MAX_HDMI_CHANNEL_CNT) {
- channel_count = info->audio_blocks_array[i].channels;
- }
+ max_supported_channels = platform_edid_get_max_channels(my_data);
+ if (channels > max_supported_channels)
+ channels = max_supported_channels;
+ // refer to HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4
+ switch (channels) {
+ case 3:
+ channel_alloc = 0x02; break;
+ case 4:
+ channel_alloc = 0x06; break;
+ case 5:
+ channel_alloc = 0x0A; break;
+ case 6:
+ channel_alloc = 0x0B; break;
+ case 7:
+ channel_alloc = 0x12; break;
+ case 8:
+ channel_alloc = 0x13; break;
+ default:
+ ALOGE("%s: invalid channel %d", __func__, channels);
+ return -EINVAL;
}
- ALOGV("%s:channel_count:%d", __func__, channel_count);
- /*
- * Channel map is set for supported hdmi max channel count even
- * though the input channel count set on adm is less than or equal to
- * max supported channel count
- */
+ ALOGVV("%s:channels:%d", __func__, channels);
+
if (adev_device_cfg_ptr->use_client_dev_cfg) {
platform_set_channel_map(platform, adev_device_cfg_ptr->dev_cfg_params.channels,
(char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1, -1);
} else {
- platform_set_channel_map(platform, channel_count, info->channel_map, -1, -1);
+ platform_set_channel_map(platform, channels, info->channel_map, -1, -1);
}
if (adev_device_cfg_ptr->use_client_dev_cfg) {
@@ -7608,8 +7619,8 @@
platform_set_channel_allocation(platform,
adev_device_cfg_ptr->dev_cfg_params.channel_allocation);
} else {
- platform_set_channel_allocation(platform, info->channel_allocation);
- }
+ platform_set_channel_allocation(platform, channel_alloc);
+ }
} else {
if (adev_device_cfg_ptr->use_client_dev_cfg) {
default_channelMap[0] = adev_device_cfg_ptr->dev_cfg_params.channel_map[0];
@@ -7619,7 +7630,7 @@
default_channelMap[1] = PCM_CHANNEL_FR;
}
platform_set_channel_map(platform, 2, default_channelMap, -1, -1);
- platform_set_channel_allocation(platform,0);
+ platform_set_channel_allocation(platform, 0);
}
}
diff --git a/hal/msm8974/hw_info.c b/hal/msm8974/hw_info.c
index 8c000ba..fbdb262 100644
--- a/hal/msm8974/hw_info.c
+++ b/hal/msm8974/hw_info.c
@@ -64,7 +64,8 @@
SND_DEVICE_OUT_SPEAKER_AND_LINE,
SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1,
SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2,
- SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET
+ SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET,
+ SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER
};
static const snd_device_t taiko_fluid_variant_devices[] = {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 3383c4f..17cade6 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -417,6 +417,8 @@
[USECASE_AUDIO_PLAYBACK_FM] = {FM_PLAYBACK_PCM_DEVICE, FM_CAPTURE_PCM_DEVICE},
[USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
[USECASE_AUDIO_HFP_SCO_WB] = {HFP_PCM_RX, HFP_SCO_RX},
+ [USECASE_AUDIO_HFP_SCO_DOWNLINK] = {HFP_ASM_RX_TX, HFP_ASM_RX_TX},
+ [USECASE_AUDIO_HFP_SCO_WB_DOWNLINK] = {HFP_ASM_RX_TX, HFP_ASM_RX_TX},
[USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, VOICE_CALL_PCM_DEVICE},
[USECASE_AUDIO_PLAYBACK_MMAP] = {MMAP_PLAYBACK_PCM_DEVICE,
MMAP_PLAYBACK_PCM_DEVICE},
@@ -505,6 +507,8 @@
[SND_DEVICE_OUT_SPEAKER_SAFE] = "speaker-safe",
[SND_DEVICE_OUT_HEADPHONES] = "headphones",
[SND_DEVICE_OUT_HEADPHONES_DSD] = "headphones-dsd",
+ [SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER] = "headphones-hifi-filter",
+ [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER] = "speaker-and-headphones-hifi-filter",
[SND_DEVICE_OUT_HEADPHONES_44_1] = "headphones-44.1",
[SND_DEVICE_OUT_LINE] = "line",
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
@@ -842,6 +846,8 @@
[SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
[SND_DEVICE_OUT_ANC_HEADSET] = 26,
[SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
+ [SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER] = 188,
+ [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER] = 188,
[SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
[SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
@@ -1012,6 +1018,8 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE)},
{TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_DSD)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER)},
{TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES_44_1)},
{TO_NAME_INDEX(SND_DEVICE_OUT_LINE)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)},
@@ -1276,6 +1284,8 @@
{TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
{TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
{TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_WB)},
+ {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_DOWNLINK)},
+ {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_WB_DOWNLINK)},
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_FM)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_FM_VIRTUAL)},
{TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_RX)},
@@ -2156,6 +2166,9 @@
backend_tag_table[SND_DEVICE_IN_CAPTURE_FM] = strdup("capture-fm");
backend_tag_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("headphones-dsd");
+ backend_tag_table[SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER] = strdup("headphones-hifi-filter");
+ backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER] =
+ strdup("speaker-and-headphones-hifi-filter");
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("voice-speaker-vbat");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("voice-speaker-2-vbat");
@@ -4931,6 +4944,9 @@
if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
sizeof("headphones-44.1")) == 0)
port = HEADPHONE_44_1_BACKEND;
+ else if (strncmp(backend_tag_table[snd_device], "headphones-hifi-filter",
+ sizeof("headphones-hifi-filter")) == 0)
+ port = HEADPHONE_BACKEND;
else if (strncmp(backend_tag_table[snd_device], "headphones-dsd",
sizeof("headphones-dsd")) == 0)
port = DSD_NATIVE_BACKEND;
@@ -4986,10 +5002,14 @@
snd_device_t incall_rec_device;
int sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
struct audio_backend_cfg backend_cfg = {0};
+ bool is_bus_dev_usecase = false;
if (voice_is_in_call(my_data->adev))
is_incall_rec_usecase = voice_is_in_call_rec_stream(usecase->stream.in);
+ if (usecase->devices & AUDIO_DEVICE_OUT_BUS)
+ is_bus_dev_usecase = true;
+
if (usecase->type == PCM_PLAYBACK)
snd_device = usecase->out_snd_device;
else if ((usecase->type == PCM_CAPTURE) && is_incall_rec_usecase)
@@ -5018,6 +5038,11 @@
new_snd_device[0] = snd_device;
}
}
+ if ((usecase->type == PCM_HFP_CALL) && is_bus_dev_usecase) {
+ num_devices = 2;
+ new_snd_device[0] = usecase->in_snd_device;
+ new_snd_device[1] = usecase->out_snd_device;
+ }
for (i = 0; i < num_devices; i++) {
if (!is_incall_rec_usecase) {
@@ -5037,6 +5062,17 @@
if ((usecase->type == PCM_CAPTURE) && (app_type == DEFAULT_APP_TYPE_RX_PATH)) {
ALOGD("Resetting app type for Tx path to default");
app_type = DEFAULT_APP_TYPE_TX_PATH;
+ } else if ((usecase->type == PCM_HFP_CALL) && is_bus_dev_usecase) {
+ if (new_snd_device[i] >= SND_DEVICE_OUT_BEGIN &&
+ new_snd_device[i] < SND_DEVICE_OUT_END) {
+ app_type = usecase->out_app_type_cfg.app_type;
+ sample_rate = usecase->out_app_type_cfg.sample_rate;
+ } else {
+ app_type = usecase->in_app_type_cfg.app_type;
+ sample_rate = usecase->in_app_type_cfg.sample_rate;
+ }
+ ALOGD("%s: Updating to app type (%d) and sample rate (%d)",
+ __func__, app_type, sample_rate);
}
/* Override backend cfg sample rate in calibration for vi feedback usecase */
@@ -5583,6 +5619,12 @@
new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_USB_HEADSET;
ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER &&
+ !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
+ new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER;
+ ret = 0;
} else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO &&
!platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_BT_SCO)) {
*num_devices = 2;
@@ -5881,6 +5923,9 @@
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
else if (is_active_voice_call)
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
+ else if (audio_extn_is_hifi_filter_enabled(adev, out, snd_device,
+ my_data->codec_variant, channel_count, 1))
+ snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER;
else
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
} else if (devices == (AUDIO_DEVICE_OUT_LINE |
@@ -5904,6 +5949,9 @@
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1;
else if (my_data->external_spk_2)
snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2;
+ else if (audio_extn_is_hifi_filter_enabled(adev, out, snd_device,
+ my_data->codec_variant, channel_count, 1))
+ snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER;
else {
if (is_active_voice_call)
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES;
@@ -6078,8 +6126,7 @@
snd_device = SND_DEVICE_OUT_BT_SCO_WB;
else
snd_device = SND_DEVICE_OUT_BT_SCO;
- } else if ((devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) ||
- (devices & AUDIO_DEVICE_OUT_BUS)) {
+ } else if (devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
if (my_data->is_vbat_speaker || my_data->is_bcl_speaker) {
if (hw_info_is_stereo_spkr(my_data->hw_info)) {
if (my_data->mono_speaker == SPKR_1)
@@ -6173,6 +6220,11 @@
snd_device = SND_DEVICE_OUT_HEADPHONES_44_1;
} else if (out->format == AUDIO_FORMAT_DSD) {
snd_device = SND_DEVICE_OUT_HEADPHONES_DSD;
+ } else if (audio_extn_is_hifi_filter_enabled(adev, out, snd_device,
+ my_data->codec_variant, channel_count, 1)) {
+ snd_device = SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER;
+ } else if (devices & SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER) {
+ snd_device = SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER;
} else if (devices & AUDIO_DEVICE_OUT_LINE) {
snd_device = SND_DEVICE_OUT_LINE;
} else
@@ -6255,7 +6307,7 @@
snd_device = SND_DEVICE_OUT_AFE_PROXY;
audio_extn_set_afe_proxy_channel_mixer(adev, channel_count, snd_device);
} else if (devices & AUDIO_DEVICE_OUT_BUS) {
- snd_device = audio_extn_auto_hal_get_snd_device_for_car_audio_stream(out);
+ snd_device = audio_extn_auto_hal_get_output_snd_device(adev, out->usecase);
} else {
ALOGE("%s: Unknown device(s) %#x", __func__, devices);
}
@@ -6634,8 +6686,7 @@
} else if (out_device & AUDIO_DEVICE_OUT_SPEAKER ||
out_device & AUDIO_DEVICE_OUT_SPEAKER_SAFE ||
out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
- out_device & AUDIO_DEVICE_OUT_LINE ||
- out_device & AUDIO_DEVICE_OUT_BUS) {
+ out_device & AUDIO_DEVICE_OUT_LINE) {
if (my_data->fluence_type != FLUENCE_NONE &&
(my_data->fluence_in_voice_call ||
my_data->fluence_in_hfp_call) &&
@@ -7407,7 +7458,7 @@
ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TRUE_32_BIT,
value,len);
if (ret >= 0) {
- if (value && !strncmp(value, "true", sizeof("src")))
+ if (value && !strncmp(value, "true", sizeof("true")))
supports_true_32_bit = true;
else
supports_true_32_bit = false;
@@ -7757,6 +7808,7 @@
audio_extn_hfp_set_parameters(my_data->adev, parms);
perf_lock_set_params(platform, parms, value, len);
true_32_bit_set_params(parms, value, len);
+ audio_extn_hifi_filter_set_params(parms, value, len);
platform_spkr_device_set_params(platform, parms, value, len);
done:
ALOGV("%s: exit with code(%d)", __func__, ret);
@@ -8479,9 +8531,10 @@
if (rate_str == NULL) {
switch (sample_rate) {
case 32000:
- if (passthrough_enabled || (backend_idx == SPDIF_TX_BACKEND ) ||
- (backend_idx == HDMI_TX_BACKEND ) ||
- (backend_idx == HDMI_ARC_TX_BACKEND )) {
+ if (passthrough_enabled || (backend_idx == SPDIF_TX_BACKEND) ||
+ (backend_idx == HDMI_TX_BACKEND) ||
+ (backend_idx == HDMI_ARC_TX_BACKEND) ||
+ (backend_idx == DISP_PORT_RX_BACKEND)) {
rate_str = "KHZ_32";
break;
}
@@ -8921,6 +8974,12 @@
if (channels < out_channels)
channels = out_channels;
}
+ if ((snd_device == SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER) &&
+ (usecase->id==USECASE_AUDIO_PLAYBACK_LOW_LATENCY ||
+ usecase->id == USECASE_AUDIO_PLAYBACK_ULL)) {
+ sample_rate = my_data->current_backend_cfg[backend_idx].sample_rate;
+ bit_width = my_data->current_backend_cfg[backend_idx].bit_width;
+ }
}
}
}
@@ -9020,6 +9079,37 @@
}
}
+ if (backend_idx != platform_get_voice_call_backend(adev)
+ && usecase->type == PCM_PLAYBACK) {
+ struct stream_out *out = (struct stream_out*) usecase->stream.out;
+ if(audio_extn_is_hifi_filter_enabled(adev, out, snd_device,
+ my_data->codec_variant, channels, 0)) {
+ switch (sample_rate) {
+ case 48000:
+ audio_extn_enable_hifi_filter(adev, true);
+ if (audio_is_true_native_stream_active(adev))
+ sample_rate = 352800;
+ else
+ sample_rate = 384000;
+ bit_width = 32;
+ break;
+ case 44100:
+ audio_extn_enable_hifi_filter(adev, true);
+ sample_rate = 352800;
+ bit_width = 32;
+ break;
+ default:
+ audio_extn_enable_hifi_filter(adev, false);
+ }
+ }
+ if (snd_device != SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER)
+ audio_extn_enable_hifi_filter(adev, false);
+ ALOGD("%s:becf: updated afe: bitwidth %d, samplerate %d channels %d,"
+ "backend_idx %d usecase = %d device (%s)", __func__, bit_width,
+ sample_rate, channels, backend_idx, usecase->id,
+ platform_get_snd_device_name(snd_device));
+ }
+
/*
* Handset and speaker may have diffrent backend. Check if the device is speaker or handset,
* and these devices are restricited to 48kHz.
@@ -9142,7 +9232,7 @@
}
if (snd_device == SND_DEVICE_OUT_HEADPHONES || snd_device ==
- SND_DEVICE_OUT_HEADPHONES_44_1) {
+ SND_DEVICE_OUT_HEADPHONES_44_1 || snd_device == SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER) {
if (sample_rate > 48000 ||
(bit_width >= 24 && (sample_rate == 48000 || sample_rate == 44100))) {
ALOGI("%s: apply HPH HQ mode\n", __func__);
@@ -10310,11 +10400,12 @@
struct platform_data *my_data = (struct platform_data *)platform;
struct audio_device *adev = my_data->adev;
edid_audio_info *info = NULL;
- int channel_count = 2;
- int i, ret;
+ int ret;
char default_channelMap[MAX_CHANNELS_SUPPORTED] = {0};
struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
int be_idx = -1;
+ int channel_alloc = 0;
+ int max_supported_channels = 0;
if ((backend_idx != HDMI_RX_BACKEND) &&
(backend_idx != DISP_PORT_RX_BACKEND) &&
@@ -10337,28 +10428,37 @@
info = (edid_audio_info *)my_data->ext_disp[controller][stream].edid_info;
adev_device_cfg_ptr += backend_idx;
if(ret == 0 && info != NULL) {
- if (channels > 2) {
-
+ if ((channels > 2) && (channels <= MAX_HDMI_CHANNEL_CNT)) {
ALOGV("%s:able to get HDMI/DP sink capabilities multi channel playback",
__func__);
- for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
- if (info->audio_blocks_array[i].format_id == LPCM &&
- info->audio_blocks_array[i].channels > channel_count &&
- info->audio_blocks_array[i].channels <= MAX_HDMI_CHANNEL_CNT) {
- channel_count = info->audio_blocks_array[i].channels;
- }
+ max_supported_channels = platform_edid_get_max_channels(my_data);
+ if (channels > max_supported_channels)
+ channels = max_supported_channels;
+ // refer to HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4
+ switch (channels) {
+ case 3:
+ channel_alloc = 0x02; break;
+ case 4:
+ channel_alloc = 0x06; break;
+ case 5:
+ channel_alloc = 0x0A; break;
+ case 6:
+ channel_alloc = 0x0B; break;
+ case 7:
+ channel_alloc = 0x12; break;
+ case 8:
+ channel_alloc = 0x13; break;
+ default:
+ ALOGE("%s: invalid channel %d", __func__, channels);
+ return -EINVAL;
}
- ALOGVV("%s:channel_count:%d", __func__, channel_count);
- /*
- * Channel map is set for supported hdmi max channel count even
- * though the input channel count set on adm is less than or equal to
- * max supported channel count
- */
+ ALOGVV("%s:channels:%d", __func__, channels);
+
if (adev_device_cfg_ptr->use_client_dev_cfg) {
platform_set_channel_map(platform, adev_device_cfg_ptr->dev_cfg_params.channels,
(char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1, be_idx);
} else {
- platform_set_channel_map(platform, channel_count, info->channel_map, -1, be_idx);
+ platform_set_channel_map(platform, channels, info->channel_map, -1, be_idx);
}
if (adev_device_cfg_ptr->use_client_dev_cfg) {
@@ -10368,9 +10468,9 @@
adev_device_cfg_ptr->dev_cfg_params.channel_allocation,
controller, stream);
} else {
- platform_set_channel_allocation_v2(platform, info->channel_allocation,
+ platform_set_channel_allocation_v2(platform, channel_alloc,
controller, stream);
- }
+ }
} else {
if (adev_device_cfg_ptr->use_client_dev_cfg) {
default_channelMap[0] = adev_device_cfg_ptr->dev_cfg_params.channel_map[0];
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index 2a570ce..d320a15 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -92,8 +92,10 @@
SND_DEVICE_OUT_LINE,
SND_DEVICE_OUT_HEADPHONES,
SND_DEVICE_OUT_HEADPHONES_DSD,
+ SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER,
SND_DEVICE_OUT_HEADPHONES_44_1,
SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
+ SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER,
SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES,
SND_DEVICE_OUT_SPEAKER_AND_LINE,
SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE,
@@ -451,7 +453,7 @@
#define FM_CAPTURE_PCM_DEVICE 6
#ifdef PLATFORM_AUTO
-#define HFP_PCM_RX 36
+#define HFP_PCM_RX 29
#else
#define HFP_PCM_RX 5
#endif
@@ -638,8 +640,8 @@
#define HFP_SCO_RX 17
#define HFP_ASM_RX_TX 18
#elif PLATFORM_AUTO
-#define HFP_SCO_RX 36
-#define HFP_ASM_RX_TX 29
+#define HFP_SCO_RX 29
+#define HFP_ASM_RX_TX 36
#elif defined (PLATFORM_MSMFALCON) || defined (PLATFORM_MSM8937)
#define HFP_SCO_RX 17
#define HFP_ASM_RX_TX 18
diff --git a/hal/platform_info.c b/hal/platform_info.c
index d73792c..1969f52 100644
--- a/hal/platform_info.c
+++ b/hal/platform_info.c
@@ -135,6 +135,7 @@
};
static struct platform_info my_data;
+static pthread_mutex_t parser_lock = PTHREAD_MUTEX_INITIALIZER;
struct audio_string_to_enum {
@@ -1447,6 +1448,7 @@
void *buf;
char platform_info_file_name[MIXER_PATH_MAX_LENGTH]= {0};
+ pthread_mutex_lock(&parser_lock);
if (filename == NULL)
strlcpy(platform_info_file_name, PLATFORM_INFO_XML_PATH,
MIXER_PATH_MAX_LENGTH);
@@ -1511,5 +1513,6 @@
err_close_file:
fclose(file);
done:
+ pthread_mutex_unlock(&parser_lock);
return ret;
}
diff --git a/qahw/Android.mk b/qahw/Android.mk
index a64b913..84645b8 100644
--- a/qahw/Android.mk
+++ b/qahw/Android.mk
@@ -11,6 +11,10 @@
LOCAL_MODULE_TAGS := optional
LOCAL_C_INCLUDES := $(libqahw-inc)
+LOCAL_HEADER_LIBRARIES := libutils_headers \
+ libsystem_headers \
+ libhardware_headers
+
LOCAL_SRC_FILES := \
src/qahw.c \
src/qahw_effect.c
@@ -27,15 +31,10 @@
LOCAL_COPY_HEADERS := inc/qahw.h
LOCAL_COPY_HEADERS += inc/qahw_effect_api.h
-LOCAL_PRELINK_MODULE := false
+LOCAL_PROPRIETARY_MODULE := true
LOCAL_VENDOR_MODULE := true
include $(BUILD_SHARED_LIBRARY)
-include $(CLEAR_VARS)
-LOCAL_COPY_HEADERS_TO := mm-audio/qahw_api/inc
-LOCAL_COPY_HEADERS := inc/qahw_defs.h
-
-include $(BUILD_COPY_HEADERS)
endif
endif
diff --git a/qahw/src/qahw.c b/qahw/src/qahw.c
index 545152c..ceec657 100644
--- a/qahw/src/qahw.c
+++ b/qahw/src/qahw.c
@@ -35,7 +35,7 @@
#include <utils/Log.h>
#include <stdlib.h>
#include <cutils/list.h>
-
+#include <pthread.h>
#include <hardware/audio.h>
#include <hardware/sound_trigger.h>
#include "qahw.h"
diff --git a/qahw/src/qahw_effect.c b/qahw/src/qahw_effect.c
index 9bee2a1..ff92f73 100644
--- a/qahw/src/qahw_effect.c
+++ b/qahw/src/qahw_effect.c
@@ -37,7 +37,7 @@
#include <hardware/audio.h>
#include <hardware/audio_effect.h>
#include <stdlib.h>
-
+#include <pthread.h>
#include "qahw.h"
// The current effect API version.
diff --git a/qahw_api/Android.mk b/qahw_api/Android.mk
index 1cad75d..a873a7d 100644
--- a/qahw_api/Android.mk
+++ b/qahw_api/Android.mk
@@ -25,12 +25,14 @@
libcutils \
libhardware \
libdl \
+ libutils \
libqahwwrapper
LOCAL_CFLAGS += -Wall -Werror
LOCAL_COPY_HEADERS_TO := mm-audio/qahw_api/inc
-LOCAL_COPY_HEADERS := inc/qahw_api.h
+LOCAL_COPY_HEADERS := inc/qahw_defs.h
+LOCAL_COPY_HEADERS += inc/qahw_api.h
LOCAL_COPY_HEADERS += inc/qahw_effect_audiosphere.h
LOCAL_COPY_HEADERS += inc/qahw_effect_bassboost.h
LOCAL_COPY_HEADERS += inc/qahw_effect_environmentalreverb.h
@@ -39,7 +41,6 @@
LOCAL_COPY_HEADERS += inc/qahw_effect_virtualizer.h
LOCAL_COPY_HEADERS += inc/qahw_effect_visualizer.h
-LOCAL_PRELINK_MODULE := false
LOCAL_VENDOR_MODULE := true
include $(BUILD_SHARED_LIBRARY)