Merge "hal: Fix fragment size calculation for compress offload"
diff --git a/configs/atoll/audio_platform_info_intcodec.xml b/configs/atoll/audio_platform_info_intcodec.xml
index e72a83a..b479cfc 100644
--- a/configs/atoll/audio_platform_info_intcodec.xml
+++ b/configs/atoll/audio_platform_info_intcodec.xml
@@ -75,6 +75,7 @@
<param key="spkr_1_tz_name" value="wsatz.13"/>
<param key="spkr_2_tz_name" value="wsatz.14"/>
<param key="true_32_bit" value="true"/>
+ <param key="hifi_filter" value="false"/>
<param key="native_audio_mode" value="multiple_mix_dsp"/>
<param key="hfp_pcm_dev_id" value="39"/>
<param key="input_mic_max_count" value="4"/>
@@ -105,6 +106,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -112,6 +114,7 @@
<device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<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"/>
diff --git a/configs/atoll/audio_platform_info_qrd.xml b/configs/atoll/audio_platform_info_qrd.xml
index f272aee..a47a3ac 100644
--- a/configs/atoll/audio_platform_info_qrd.xml
+++ b/configs/atoll/audio_platform_info_qrd.xml
@@ -73,6 +73,7 @@
<param key="mono_speaker" value="left"/>
<param key="spkr_2_tz_name" value="wsatz.13"/>
<param key="true_32_bit" value="true"/>
+ <param key="hifi_filter" value="false"/>
<param key="native_audio_mode" value="multiple_mix_dsp"/>
<param key="hfp_pcm_dev_id" value="39"/>
<param key="input_mic_max_count" value="2"/>
@@ -103,6 +104,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -110,6 +112,7 @@
<device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<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"/>
diff --git a/configs/atoll/mixer_paths.xml b/configs/atoll/mixer_paths.xml
index d04fc1e..9d7487f 100644
--- a/configs/atoll/mixer_paths.xml
+++ b/configs/atoll/mixer_paths.xml
@@ -2763,6 +2763,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
</path>
@@ -2852,6 +2856,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/atoll/mixer_paths_qrd.xml b/configs/atoll/mixer_paths_qrd.xml
index 7bd3a90..7ace581 100644
--- a/configs/atoll/mixer_paths_qrd.xml
+++ b/configs/atoll/mixer_paths_qrd.xml
@@ -3009,6 +3009,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
<ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
<ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -3075,6 +3079,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/atoll/mixer_paths_wcd937x.xml b/configs/atoll/mixer_paths_wcd937x.xml
index 44a5161..4195193 100644
--- a/configs/atoll/mixer_paths_wcd937x.xml
+++ b/configs/atoll/mixer_paths_wcd937x.xml
@@ -2764,6 +2764,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
</path>
@@ -2853,6 +2857,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/kona/audio_platform_info_intcodec.xml b/configs/kona/audio_platform_info_intcodec.xml
index 4c0c9c3..d1c45b9 100644
--- a/configs/kona/audio_platform_info_intcodec.xml
+++ b/configs/kona/audio_platform_info_intcodec.xml
@@ -103,6 +103,7 @@
<param key="spkr_1_tz_name" value="wsatz.13"/>
<param key="spkr_2_tz_name" value="wsatz.14"/>
<param key="true_32_bit" value="true"/>
+ <param key="hifi_filter" value="false"/>
<param key="native_audio_mode" value="multiple_mix_dsp"/>
<param key="hfp_pcm_dev_id" value="39"/>
<param key="input_mic_max_count" value="4"/>
@@ -140,6 +141,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -147,6 +149,7 @@
<device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<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"/>
diff --git a/configs/kona/audio_platform_info_qrd.xml b/configs/kona/audio_platform_info_qrd.xml
index bd5ebdc..a8f765a 100644
--- a/configs/kona/audio_platform_info_qrd.xml
+++ b/configs/kona/audio_platform_info_qrd.xml
@@ -100,6 +100,7 @@
<param key="mono_speaker" value="right"/>
<param key="spkr_2_tz_name" value="wsatz.14"/>
<param key="true_32_bit" value="true"/>
+ <param key="hifi_filter" value="false"/>
<param key="native_audio_mode" value="multiple_mix_dsp"/>
<param key="hfp_pcm_dev_id" value="39"/>
<param key="input_mic_max_count" value="4"/>
@@ -151,6 +152,7 @@
</module_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -158,6 +160,7 @@
<device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<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"/>
diff --git a/configs/kona/mixer_paths.xml b/configs/kona/mixer_paths.xml
index 0178dfc..bbbe8e2 100644
--- a/configs/kona/mixer_paths.xml
+++ b/configs/kona/mixer_paths.xml
@@ -2497,6 +2497,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
</path>
@@ -2586,6 +2590,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/kona/mixer_paths_cdp.xml b/configs/kona/mixer_paths_cdp.xml
index daac27a..8df2b66 100644
--- a/configs/kona/mixer_paths_cdp.xml
+++ b/configs/kona/mixer_paths_cdp.xml
@@ -2371,6 +2371,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
</path>
@@ -2460,6 +2464,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/kona/mixer_paths_qrd.xml b/configs/kona/mixer_paths_qrd.xml
index a8a90b4..229c46d 100644
--- a/configs/kona/mixer_paths_qrd.xml
+++ b/configs/kona/mixer_paths_qrd.xml
@@ -2797,6 +2797,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
<ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
<ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -2864,6 +2868,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/kona/sound_trigger_mixer_paths.xml b/configs/kona/sound_trigger_mixer_paths.xml
index 8cb6622..385bed9 100644
--- a/configs/kona/sound_trigger_mixer_paths.xml
+++ b/configs/kona/sound_trigger_mixer_paths.xml
@@ -81,6 +81,7 @@
<ctl name="EC Reference Channels" value="Zero"/>
<ctl name="EC Reference Bit Format" value="0"/>
<ctl name="EC Reference SampleRate" value="0"/>
+ <ctl name="ADC2_MIXER Switch" value="0" />
<path name="listen-voice-wakeup-1">
<ctl name="LSM1 Mixer VA_CDC_DMA_TX_0" value="1" />
diff --git a/configs/kona/sound_trigger_mixer_paths_qrd.xml b/configs/kona/sound_trigger_mixer_paths_qrd.xml
index a8180e4..9a51ec6 100644
--- a/configs/kona/sound_trigger_mixer_paths_qrd.xml
+++ b/configs/kona/sound_trigger_mixer_paths_qrd.xml
@@ -81,6 +81,7 @@
<ctl name="EC Reference Channels" value="Zero"/>
<ctl name="EC Reference Bit Format" value="0"/>
<ctl name="EC Reference SampleRate" value="0"/>
+ <ctl name="ADC2_MIXER Switch" value="0" />
<path name="listen-voice-wakeup-1">
<ctl name="LSM1 Mixer VA_CDC_DMA_TX_0" value="1" />
diff --git a/configs/kona/sound_trigger_platform_info.xml b/configs/kona/sound_trigger_platform_info.xml
index 17a937c..479d7dc 100644
--- a/configs/kona/sound_trigger_platform_info.xml
+++ b/configs/kona/sound_trigger_platform_info.xml
@@ -269,14 +269,45 @@
<!-- is FFECNS -->
<param fluence_type="NONE" />
<param execution_mode="ADSP" />
+ <!-- lpi_mode: "NON_LPI_BARGE_IN", "NON_LPI", "LPI" -->
+ <!-- NON_LPI_BARGE_IN: Default non-LPI mode type. lsm_usecase -->
+ <!-- must be present with this mode type to handle barge-in. -->
+ <!-- NON_LPI: If another lsm_usecase is present with this mode -->
+ <!-- type, it will be used for non-LPI non-barge-in usecases. -->
+ <!-- If not present, NON_LPI_BARGE_IN mode type will be used. -->
+ <!-- LPI: This mode type will be used for LPI usecases. -->
+ <param lpi_mode="NON_LPI_BARGE_IN" />
<param app_type="3" /> <!-- app type used in ACDB -->
<param in_channels="1"/> <!-- Module input channels -->
<param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
<param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
- <param confidence_levels_ids="0x18000001, 0x0, 0x00012C07" />
- <param operation_mode_ids="0x18000001, 0x0, 0x00012C02" />
- <param polling_enable_ids="0x18000001, 0x0, 0x00012C1B" />
<param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+ <param lab_dam_cfg_ids="0x00012C08, 0x0, 0x000102C4" />
+ </lsm_usecase>
+ <lsm_usecase>
+ <param capture_device="HANDSET" />
+ <!-- adm_cfg_profile should match with the one defined under adm_config -->
+ <!-- Set it to NONE if LSM directly connects to AFE -->
+ <param adm_cfg_profile="NONE" />
+ <!-- fluence_type: "FLUENCE_MIC", "FLUENCE_DMIC", "FLUENCE_TMIC" -->
+ <!-- "FLUENCE_QMIC". Param value is valid when adm_cfg_profile -->
+ <!-- is FFECNS -->
+ <param fluence_type="NONE" />
+ <param execution_mode="ADSP" />
+ <!-- lpi_mode: "NON_LPI_BARGE_IN", "NON_LPI", "LPI" -->
+ <!-- NON_LPI_BARGE_IN: Default non-LPI mode type. lsm_usecase -->
+ <!-- must be present with this mode type to handle barge-in. -->
+ <!-- NON_LPI: If another lsm_usecase is present with this mode -->
+ <!-- type, it will be used for non-LPI non-barge-in usecases. -->
+ <!-- If not present, NON_LPI_BARGE_IN mode type will be used. -->
+ <!-- LPI: This mode type will be used for LPI usecases. -->
+ <param lpi_mode="LPI" />
+ <param app_type="3" /> <!-- app type used in ACDB -->
+ <param in_channels="1"/> <!-- Module input channels -->
+ <param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
+ <param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
+ <param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+ <param lab_dam_cfg_ids="0x00012C08, 0x0, 0x000102C4" />
</lsm_usecase>
<lsm_usecase>
<param capture_device="HEADSET" />
@@ -287,10 +318,8 @@
<param in_channels="1"/> <!-- Module input channels -->
<param load_sound_model_ids="0x18000001, 0x0, 0x00012C14" />
<param unload_sound_model_ids="0x18000001, 0x0, 0x00012C15" />
- <param confidence_levels_ids="0x18000001, 0x0, 0x00012C07" />
- <param operation_mode_ids="0x18000001, 0x0, 0x00012C02" />
- <param polling_enable_ids="0x18000001, 0x0, 0x00012C1B" />
<param custom_config_ids="0x18000001, 0x0, 0x00012C20" />
+ <param lab_dam_cfg_ids="0x00012C08, 0x0, 0x000102C4" />
</lsm_usecase>
<!-- format: "ADPCM_packet" or "PCM_packet" !-->
diff --git a/configs/lito/audio_platform_info_qrd.xml b/configs/lito/audio_platform_info_qrd.xml
index ec51297..7bd014f 100644
--- a/configs/lito/audio_platform_info_qrd.xml
+++ b/configs/lito/audio_platform_info_qrd.xml
@@ -74,6 +74,7 @@
<param key="mono_speaker" value="right"/>
<param key="spkr_2_tz_name" value="wsatz.14"/>
<param key="true_32_bit" value="true"/>
+ <param key="hifi_filter" value="false"/>
<param key="native_audio_mode" value="multiple_mix_dsp"/>
<param key="hfp_pcm_dev_id" value="39"/>
<param key="input_mic_max_count" value="4"/>
@@ -104,6 +105,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -111,6 +113,7 @@
<device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<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"/>
diff --git a/configs/lito/mixer_paths_cdp.xml b/configs/lito/mixer_paths_cdp.xml
index ab7a0aa..0b2b992 100644
--- a/configs/lito/mixer_paths_cdp.xml
+++ b/configs/lito/mixer_paths_cdp.xml
@@ -88,6 +88,22 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia14" value="0" />
<ctl name="DISPLAY_PORT Mixer MultiMedia15" value="0" />
<ctl name="DISPLAY_PORT Mixer MultiMedia16" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia1" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia2" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia3" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia4" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia5" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia6" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia7" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia8" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia9" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia10" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia11" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia12" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia13" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia14" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia15" value="0" />
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia16" value="0" />
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia1" value="0" />
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia2" value="0" />
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia3" value="0" />
@@ -153,6 +169,8 @@
<!-- HFP end -->
<!-- echo reference -->
<ctl name="AUDIO_REF_EC_UL1 MUX" value="None" />
+ <ctl name="AUDIO_REF_EC_UL10 MUX" value="None" />
+ <ctl name="EC Reference Channels" value="Zero"/>
<!-- usb headset -->
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia1" value="0" />
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="0" />
@@ -169,7 +187,7 @@
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="0" />
<!-- usb headset end -->
<!-- fm -->
- <ctl name="Tert MI2S LOOPBACK Volume" value="0" />
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="0" />
<ctl name="WSA_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="0" />
<ctl name="WSA_CDC_DMA_RX_0_DL_HL Switch" value="0" />
<ctl name="RX_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="0" />
@@ -237,6 +255,7 @@
<ctl name="WSA_CDC_DMA_RX_0_Voice Mixer Voip" value="0" />
<ctl name="RX_CDC_DMA_RX_0_Voice Mixer Voip" value="0" />
<ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_3_Voip" value="0" />
+ <ctl name="Voip_Tx Mixer TX_CDC_DMA_TX_4_Voip" value="0" />
<ctl name="SLIM_7_RX_Voice Mixer Voip" value="0" />
<ctl name="Voip_Tx Mixer SLIM_7_TX_Voip" value="0" />
<ctl name="AFE_PCM_RX_Voice Mixer Voip" value="0" />
@@ -450,10 +469,17 @@
<path name="echo-reference">
<ctl name="AUDIO_REF_EC_UL1 MUX" value="WSA_CDC_DMA_RX_0" />
+ <ctl name="EC Reference Channels" value="Two"/>
+ </path>
+
+ <path name="echo-reference handset">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="WSA_CDC_DMA_RX_0" />
+ <ctl name="EC Reference Channels" value="One"/>
</path>
<path name="echo-reference headphones">
<ctl name="AUDIO_REF_EC_UL1 MUX" value="RX_CDC_DMA_RX_0" />
+ <ctl name="EC Reference Channels" value="Two"/>
</path>
<path name="echo-reference headset">
@@ -462,18 +488,31 @@
<path name="echo-reference display-port">
<ctl name="AUDIO_REF_EC_UL1 MUX" value="DISPLAY_PORT" />
+ <ctl name="EC Reference Channels" value="Two"/>
+ </path>
+
+ <path name="echo-reference display-port1">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="DISPLAY_PORT1" />
</path>
<path name="echo-reference headphones-44.1">
<ctl name="AUDIO_REF_EC_UL1 MUX" value="RX_CDC_DMA_RX_0" />
+ <ctl name="EC Reference Channels" value="Two"/>
</path>
<path name="echo-reference-voip">
<ctl name="AUDIO_REF_EC_UL10 MUX" value="WSA_CDC_DMA_RX_0" />
+ <ctl name="EC Reference Channels" value="Two"/>
+ </path>
+
+ <path name="echo-reference-voip handset">
+ <ctl name="AUDIO_REF_EC_UL10 MUX" value="WSA_CDC_DMA_RX_0" />
+ <ctl name="EC Reference Channels" value="One"/>
</path>
<path name="echo-reference-voip headphones">
<ctl name="AUDIO_REF_EC_UL10 MUX" value="RX_CDC_DMA_RX_0" />
+ <ctl name="EC Reference Channels" value="Two"/>
</path>
<path name="deep-buffer-playback">
@@ -484,15 +523,33 @@
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe">
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="deep-buffer-playback display-port">
<ctl name="DISPLAY_PORT Mixer MultiMedia1" value="1" />
</path>
+ <path name="deep-buffer-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia1" value="1" />
+ </path>
+
<path name="deep-buffer-playback speaker-and-display-port">
<path name="deep-buffer-playback display-port" />
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe-and-display-port">
+ <path name="deep-buffer-playback display-port" />
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-display-port1">
+ <path name="deep-buffer-playback display-port1" />
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="deep-buffer-playback bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="1" />
</path>
@@ -523,6 +580,11 @@
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe-and-usb-headphones">
+ <path name="deep-buffer-playback usb-headphones" />
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="deep-buffer-playback headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia1" value="1" />
</path>
@@ -536,21 +598,41 @@
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe-and-headphones">
+ <path name="deep-buffer-playback headphones" />
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="deep-buffer-playback speaker-and-bt-sco">
<path name="deep-buffer-playback bt-sco" />
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe-and-bt-sco">
+ <path name="deep-buffer-playback bt-sco" />
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="deep-buffer-playback speaker-and-bt-sco-wb">
<path name="deep-buffer-playback bt-sco-wb" />
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe-and-bt-sco-wb">
+ <path name="deep-buffer-playback bt-sco-wb" />
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="deep-buffer-playback speaker-and-bt-sco-swb">
<path name="deep-buffer-playback bt-sco-swb" />
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe-and-bt-sco-swb">
+ <path name="deep-buffer-playback bt-sco-swb" />
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="low-latency-playback">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia5" value="1" />
</path>
@@ -559,10 +641,18 @@
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe">
+ <path name="low-latency-playback" />
+ </path>
+
<path name="low-latency-playback display-port">
<ctl name="DISPLAY_PORT Mixer MultiMedia5" value="1" />
</path>
+ <path name="low-latency-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia5" value="1" />
+ </path>
+
<path name="low-latency-playback bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia5" value="1" />
</path>
@@ -581,6 +671,16 @@
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe-and-display-port">
+ <path name="low-latency-playback display-port" />
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-display-port1">
+ <path name="low-latency-playback display-port1" />
+ <path name="low-latency-playback" />
+ </path>
+
<path name="low-latency-playback afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="1" />
</path>
@@ -598,6 +698,11 @@
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe-and-usb-headphones">
+ <path name="low-latency-playback usb-headphones" />
+ <path name="low-latency-playback" />
+ </path>
+
<path name="low-latency-playback headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia5" value="1" />
</path>
@@ -610,6 +715,11 @@
<path name="low-latency-playback headphones" />
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe-and-headphones">
+ <path name="low-latency-playback headphones" />
+ <path name="low-latency-playback" />
+ </path>
+
<path name="low-latency-playback resume">
<ctl name="MultiMedia5_RX QOS Vote" value="Enable" />
</path>
@@ -619,16 +729,31 @@
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe-and-bt-sco">
+ <path name="low-latency-playback bt-sco" />
+ <path name="low-latency-playback" />
+ </path>
+
<path name="low-latency-playback speaker-and-bt-sco-wb">
<path name="low-latency-playback bt-sco-wb" />
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe-and-bt-sco-wb">
+ <path name="low-latency-playback bt-sco-wb" />
+ <path name="low-latency-playback" />
+ </path>
+
<path name="low-latency-playback speaker-and-bt-sco-swb">
<path name="low-latency-playback bt-sco-swb" />
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe-and-bt-sco-swb">
+ <path name="low-latency-playback bt-sco-swb" />
+ <path name="low-latency-playback" />
+ </path>
+
<path name="audio-ull-playback">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia8" value="1" />
</path>
@@ -637,6 +762,10 @@
<path name="audio-ull-playback" />
</path>
+ <path name="audio-ull-playback speaker-safe">
+ <path name="audio-ull-playback" />
+ </path>
+
<path name="audio-ull-playback headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia8" value="1" />
</path>
@@ -650,10 +779,19 @@
<path name="audio-ull-playback headphones" />
</path>
+ <path name="audio-ull-playback speaker-safe-and-headphones">
+ <path name="audio-ull-playback" />
+ <path name="audio-ull-playback headphones" />
+ </path>
+
<path name="audio-ull-playback display-port">
<ctl name="DISPLAY_PORT Mixer MultiMedia8" value="1" />
</path>
+ <path name="audio-ull-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia8" value="1" />
+ </path>
+
<path name="audio-ull-playback bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia8" value="1" />
</path>
@@ -672,6 +810,16 @@
<path name="audio-ull-playback" />
</path>
+ <path name="audio-ull-playback speaker-safe-and-display-port">
+ <path name="audio-ull-playback display-port" />
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback speaker-and-display-port1">
+ <path name="audio-ull-playback display-port1" />
+ <path name="audio-ull-playback" />
+ </path>
+
<path name="audio-ull-playback afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia8" value="1" />
</path>
@@ -689,20 +837,39 @@
<path name="audio-ull-playback" />
</path>
+ <path name="audio-ull-playback speaker-safe-and-bt-sco">
+ <path name="audio-ull-playback bt-sco" />
+ <path name="audio-ull-playback" />
+ </path>
+
<path name="audio-ull-playback speaker-and-bt-sco-wb">
<path name="audio-ull-playback bt-sco-wb" />
<path name="audio-ull-playback" />
</path>
+ <path name="audio-ull-playback speaker-safe-and-bt-sco-wb">
+ <path name="audio-ull-playback bt-sco-wb" />
+ <path name="audio-ull-playback" />
+ </path>
+
<path name="audio-ull-playback speaker-and-bt-sco-swb">
<path name="audio-ull-playback bt-sco-swb" />
<path name="audio-ull-playback" />
</path>
+ <path name="audio-ull-playback speaker-safe-and-bt-sco-swb">
+ <path name="audio-ull-playback bt-sco-swb" />
+ <path name="audio-ull-playback" />
+ </path>
+
<path name="multi-channel-playback display-port">
<ctl name="DISPLAY_PORT Mixer MultiMedia2" value="1" />
</path>
+ <path name="multi-channel-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia2" value="1" />
+ </path>
+
<path name="multi-channel-playback afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="1" />
</path>
@@ -715,14 +882,26 @@
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe">
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="compress-offload-playback display-port">
<ctl name="DISPLAY_PORT Mixer MultiMedia4" value="1" />
</path>
+ <path name="compress-offload-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia4" value="1" />
+ </path>
+
<path name="silence-playback display-port">
<ctl name="DISPLAY_PORT Mixer MultiMedia9" value="1" />
</path>
+ <path name="silence-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia9" value="1" />
+ </path>
+
<path name="compress-offload-playback bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia4" value="1" />
</path>
@@ -741,6 +920,16 @@
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe-and-display-port">
+ <path name="compress-offload-playback display-port" />
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-display-port1">
+ <path name="compress-offload-playback display-port1" />
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="compress-offload-playback afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia4" value="1" />
</path>
@@ -758,6 +947,11 @@
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback usb-headphones" />
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="compress-offload-playback headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia4" value="1" />
</path>
@@ -779,21 +973,41 @@
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe-and-headphones">
+ <path name="compress-offload-playback headphones" />
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="compress-offload-playback speaker-and-bt-sco">
<path name="compress-offload-playback bt-sco" />
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback bt-sco" />
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="compress-offload-playback speaker-and-bt-sco-wb">
<path name="compress-offload-playback bt-sco-wb" />
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback bt-sco-wb" />
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="compress-offload-playback speaker-and-bt-sco-swb">
<path name="compress-offload-playback bt-sco-swb" />
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback bt-sco-swb" />
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="compress-offload-playback2">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia7" value="1" />
</path>
@@ -802,6 +1016,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia7" value="1" />
</path>
+ <path name="compress-offload-playback2 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia7" value="1" />
+ </path>
+
<path name="compress-offload-playback2 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia7" value="1" />
</path>
@@ -820,6 +1038,16 @@
<path name="compress-offload-playback2" />
</path>
+ <path name="compress-offload-playback2 speaker-safe-and-display-port">
+ <path name="compress-offload-playback2 display-port" />
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-display-port1">
+ <path name="compress-offload-playback2 display-port1" />
+ <path name="compress-offload-playback2" />
+ </path>
+
<path name="compress-offload-playback2 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia7" value="1" />
</path>
@@ -837,6 +1065,11 @@
<path name="compress-offload-playback2" />
</path>
+ <path name="compress-offload-playback2 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback2 usb-headphones" />
+ <path name="compress-offload-playback2" />
+ </path>
+
<path name="compress-offload-playback2 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia7" value="1" />
</path>
@@ -859,21 +1092,41 @@
<path name="compress-offload-playback2" />
</path>
+ <path name="compress-offload-playback2 speaker-safe-and-headphones">
+ <path name="compress-offload-playback2 headphones" />
+ <path name="compress-offload-playback2" />
+ </path>
+
<path name="compress-offload-playback2 speaker-and-bt-sco">
<path name="compress-offload-playback2 bt-sco" />
<path name="compress-offload-playback2" />
</path>
+ <path name="compress-offload-playback2 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback2 bt-sco" />
+ <path name="compress-offload-playback2" />
+ </path>
+
<path name="compress-offload-playback2 speaker-and-bt-sco-wb">
<path name="compress-offload-playback2 bt-sco-wb" />
<path name="compress-offload-playback2" />
</path>
+ <path name="compress-offload-playback2 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback2 bt-sco-wb" />
+ <path name="compress-offload-playback2" />
+ </path>
+
<path name="compress-offload-playback2 speaker-and-bt-sco-swb">
<path name="compress-offload-playback2 bt-sco-swb" />
<path name="compress-offload-playback2" />
</path>
+ <path name="compress-offload-playback2 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback2 bt-sco-swb" />
+ <path name="compress-offload-playback2" />
+ </path>
+
<path name="compress-offload-playback3">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
</path>
@@ -882,6 +1135,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia10" value="1" />
</path>
+ <path name="compress-offload-playback3 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia10" value="1" />
+ </path>
+
<path name="compress-offload-playback3 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia10" value="1" />
</path>
@@ -900,6 +1157,16 @@
<path name="compress-offload-playback3" />
</path>
+ <path name="compress-offload-playback3 speaker-safe-and-display-port">
+ <path name="compress-offload-playback3 display-port" />
+ <path name="compress-offload-playback3" />
+ </path>
+
+ <path name="compress-offload-playback3 speaker-and-display-port1">
+ <path name="compress-offload-playback3 display-port1" />
+ <path name="compress-offload-playback3" />
+ </path>
+
<path name="compress-offload-playback3 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia10" value="1" />
</path>
@@ -917,6 +1184,11 @@
<path name="compress-offload-playback3" />
</path>
+ <path name="compress-offload-playback3 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback3 usb-headphones" />
+ <path name="compress-offload-playback3" />
+ </path>
+
<path name="compress-offload-playback3 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia10" value="1" />
</path>
@@ -938,21 +1210,41 @@
<path name="compress-offload-playback3" />
</path>
+ <path name="compress-offload-playback3 speaker-safe-and-headphones">
+ <path name="compress-offload-playback3 headphones" />
+ <path name="compress-offload-playback3" />
+ </path>
+
<path name="compress-offload-playback3 speaker-and-bt-sco">
<path name="compress-offload-playback3 bt-sco" />
<path name="compress-offload-playback3" />
</path>
+ <path name="compress-offload-playback3 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback3 bt-sco" />
+ <path name="compress-offload-playback3" />
+ </path>
+
<path name="compress-offload-playback3 speaker-and-bt-sco-wb">
<path name="compress-offload-playback3 bt-sco-wb" />
<path name="compress-offload-playback3" />
</path>
+ <path name="compress-offload-playback3 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback3 bt-sco-wb" />
+ <path name="compress-offload-playback3" />
+ </path>
+
<path name="compress-offload-playback3 speaker-and-bt-sco-swb">
<path name="compress-offload-playback3 bt-sco-swb" />
<path name="compress-offload-playback3" />
</path>
+ <path name="compress-offload-playback3 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback3 bt-sco-swb" />
+ <path name="compress-offload-playback3" />
+ </path>
+
<path name="compress-offload-playback4">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia11" value="1" />
</path>
@@ -961,6 +1253,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia11" value="1" />
</path>
+ <path name="compress-offload-playback4 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia11" value="1" />
+ </path>
+
<path name="compress-offload-playback4 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia11" value="1" />
</path>
@@ -979,6 +1275,15 @@
<path name="compress-offload-playback4" />
</path>
+ <path name="compress-offload-playback4 speaker-safe-and-display-port">
+ <path name="compress-offload-playback4 display-port" />
+ <path name="compress-offload-playback4" />
+ </path>
+
+ <path name="compress-offload-playback4 speaker-and-display-port1">
+ <path name="compress-offload-playback4 display-port1" />
+ <path name="compress-offload-playback4" />
+ </path>
<path name="compress-offload-playback4 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia11" value="1" />
@@ -997,6 +1302,11 @@
<path name="compress-offload-playback4" />
</path>
+ <path name="compress-offload-playback4 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback4 usb-headphones" />
+ <path name="compress-offload-playback4" />
+ </path>
+
<path name="compress-offload-playback4 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia11" value="1" />
</path>
@@ -1018,21 +1328,41 @@
<path name="compress-offload-playback4" />
</path>
+ <path name="compress-offload-playback4 speaker-safe-and-headphones">
+ <path name="compress-offload-playback4 headphones" />
+ <path name="compress-offload-playback4" />
+ </path>
+
<path name="compress-offload-playback4 speaker-and-bt-sco">
<path name="compress-offload-playback4 bt-sco" />
<path name="compress-offload-playback4" />
</path>
+ <path name="compress-offload-playback4 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback4 bt-sco" />
+ <path name="compress-offload-playback4" />
+ </path>
+
<path name="compress-offload-playback4 speaker-and-bt-sco-wb">
<path name="compress-offload-playback4 bt-sco-wb" />
<path name="compress-offload-playback4" />
</path>
+ <path name="compress-offload-playback4 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback4 bt-sco-wb" />
+ <path name="compress-offload-playback4" />
+ </path>
+
<path name="compress-offload-playback4 speaker-and-bt-sco-swb">
<path name="compress-offload-playback4 bt-sco-swb" />
<path name="compress-offload-playback4" />
</path>
+ <path name="compress-offload-playback4 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback4 bt-sco-swb" />
+ <path name="compress-offload-playback4" />
+ </path>
+
<path name="compress-offload-playback5">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia12" value="1" />
</path>
@@ -1041,6 +1371,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia12" value="1" />
</path>
+ <path name="compress-offload-playback5 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia12" value="1" />
+ </path>
+
<path name="compress-offload-playback5 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia12" value="1" />
</path>
@@ -1059,6 +1393,16 @@
<path name="compress-offload-playback5" />
</path>
+ <path name="compress-offload-playback5 speaker-safe-and-display-port">
+ <path name="compress-offload-playback5 display-port" />
+ <path name="compress-offload-playback5" />
+ </path>
+
+ <path name="compress-offload-playback5 speaker-and-display-port1">
+ <path name="compress-offload-playback5 display-port1" />
+ <path name="compress-offload-playback5" />
+ </path>
+
<path name="compress-offload-playback5 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia12" value="1" />
</path>
@@ -1076,6 +1420,11 @@
<path name="compress-offload-playback5" />
</path>
+ <path name="compress-offload-playback5 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback5 usb-headphones" />
+ <path name="compress-offload-playback5" />
+ </path>
+
<path name="compress-offload-playback5 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia12" value="1" />
</path>
@@ -1097,21 +1446,41 @@
<path name="compress-offload-playback5" />
</path>
+ <path name="compress-offload-playback5 speaker-safe-and-headphones">
+ <path name="compress-offload-playback5 headphones" />
+ <path name="compress-offload-playback5" />
+ </path>
+
<path name="compress-offload-playback5 speaker-and-bt-sco">
<path name="compress-offload-playback5 bt-sco" />
<path name="compress-offload-playback5" />
</path>
+ <path name="compress-offload-playback5 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback5 bt-sco" />
+ <path name="compress-offload-playback5" />
+ </path>
+
<path name="compress-offload-playback5 speaker-and-bt-sco-wb">
<path name="compress-offload-playback5 bt-sco-wb" />
<path name="compress-offload-playback5" />
</path>
+ <path name="compress-offload-playback5 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback5 bt-sco-wb" />
+ <path name="compress-offload-playback5" />
+ </path>
+
<path name="compress-offload-playback5 speaker-and-bt-sco-swb">
<path name="compress-offload-playback5 bt-sco-swb" />
<path name="compress-offload-playback5" />
</path>
+ <path name="compress-offload-playback5 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback5 bt-sco-swb" />
+ <path name="compress-offload-playback5" />
+ </path>
+
<path name="compress-offload-playback6">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia13" value="1" />
</path>
@@ -1120,6 +1489,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia13" value="1" />
</path>
+ <path name="compress-offload-playback6 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia13" value="1" />
+ </path>
+
<path name="compress-offload-playback6 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia13" value="1" />
</path>
@@ -1138,6 +1511,16 @@
<path name="compress-offload-playback6" />
</path>
+ <path name="compress-offload-playback6 speaker-safe-and-display-port">
+ <path name="compress-offload-playback6 display-port" />
+ <path name="compress-offload-playback6" />
+ </path>
+
+ <path name="compress-offload-playback6 speaker-and-display-port1">
+ <path name="compress-offload-playback6 display-port1" />
+ <path name="compress-offload-playback6" />
+ </path>
+
<path name="compress-offload-playback6 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia13" value="1" />
</path>
@@ -1155,6 +1538,11 @@
<path name="compress-offload-playback6" />
</path>
+ <path name="compress-offload-playback6 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback6 usb-headphones" />
+ <path name="compress-offload-playback6" />
+ </path>
+
<path name="compress-offload-playback6 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia13" value="1" />
</path>
@@ -1176,21 +1564,42 @@
<path name="compress-offload-playback6" />
</path>
+ <path name="compress-offload-playback6 speaker-safe-and-headphones">
+ <path name="compress-offload-playback6 headphones" />
+ <path name="compress-offload-playback6" />
+ </path>
+
<path name="compress-offload-playback6 speaker-and-bt-sco">
<path name="compress-offload-playback6 bt-sco" />
<path name="compress-offload-playback6" />
</path>
+ <path name="compress-offload-playback6 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback6 bt-sco" />
+ <path name="compress-offload-playback6" />
+ </path>
+
<path name="compress-offload-playback6 speaker-and-bt-sco-wb">
<path name="compress-offload-playback6 bt-sco-wb" />
<path name="compress-offload-playback6" />
</path>
+ <path name="compress-offload-playback6 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback6 bt-sco-wb" />
+ <path name="compress-offload-playback6" />
+ </path>
+
<path name="compress-offload-playback6 speaker-and-bt-sco-swb">
<path name="compress-offload-playback6 bt-sco-swb" />
<path name="compress-offload-playback6" />
</path>
+ <path name="compress-offload-playback6 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback6 bt-sco-swb" />
+ <path name="compress-offload-playback6" />
+ </path>
+
+
<path name="compress-offload-playback7">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia14" value="1" />
</path>
@@ -1199,6 +1608,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia14" value="1" />
</path>
+ <path name="compress-offload-playback7 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia14" value="1" />
+ </path>
+
<path name="compress-offload-playback7 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia14" value="1" />
</path>
@@ -1217,6 +1630,16 @@
<path name="compress-offload-playback7" />
</path>
+ <path name="compress-offload-playback7 speaker-safe-and-display-port">
+ <path name="compress-offload-playback7 display-port" />
+ <path name="compress-offload-playback7" />
+ </path>
+
+ <path name="compress-offload-playback7 speaker-and-display-port1">
+ <path name="compress-offload-playback7 display-port1" />
+ <path name="compress-offload-playback7" />
+ </path>
+
<path name="compress-offload-playback7 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia14" value="1" />
</path>
@@ -1234,6 +1657,11 @@
<path name="compress-offload-playback7" />
</path>
+ <path name="compress-offload-playback7 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback7 usb-headphones" />
+ <path name="compress-offload-playback7" />
+ </path>
+
<path name="compress-offload-playback7 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia14" value="1" />
</path>
@@ -1255,21 +1683,41 @@
<path name="compress-offload-playback7" />
</path>
+ <path name="compress-offload-playback7 speaker-safe-and-headphones">
+ <path name="compress-offload-playback7 headphones" />
+ <path name="compress-offload-playback7" />
+ </path>
+
<path name="compress-offload-playback7 speaker-and-bt-sco">
<path name="compress-offload-playback7 bt-sco" />
<path name="compress-offload-playback7" />
</path>
+ <path name="compress-offload-playback7 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback7 bt-sco" />
+ <path name="compress-offload-playback7" />
+ </path>
+
<path name="compress-offload-playback7 speaker-and-bt-sco-wb">
<path name="compress-offload-playback7 bt-sco-wb" />
<path name="compress-offload-playback7" />
</path>
+ <path name="compress-offload-playback7 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback7 bt-sco-wb" />
+ <path name="compress-offload-playback7" />
+ </path>
+
<path name="compress-offload-playback7 speaker-and-bt-sco-swb">
<path name="compress-offload-playback7 bt-sco-swb" />
<path name="compress-offload-playback7" />
</path>
+ <path name="compress-offload-playback7 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback7 bt-sco-swb" />
+ <path name="compress-offload-playback7" />
+ </path>
+
<path name="compress-offload-playback8">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia15" value="1" />
</path>
@@ -1278,6 +1726,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia15" value="1" />
</path>
+ <path name="compress-offload-playback8 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia15" value="1" />
+ </path>
+
<path name="compress-offload-playback8 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia15" value="1" />
</path>
@@ -1296,6 +1748,16 @@
<path name="compress-offload-playback8" />
</path>
+ <path name="compress-offload-playback8 speaker-safe-and-display-port">
+ <path name="compress-offload-playback8 display-port" />
+ <path name="compress-offload-playback8" />
+ </path>
+
+ <path name="compress-offload-playback8 speaker-and-display-port1">
+ <path name="compress-offload-playback8 display-port1" />
+ <path name="compress-offload-playback8" />
+ </path>
+
<path name="compress-offload-playback8 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia15" value="1" />
</path>
@@ -1313,6 +1775,11 @@
<path name="compress-offload-playback8" />
</path>
+ <path name="compress-offload-playback8 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback8 usb-headphones" />
+ <path name="compress-offload-playback8" />
+ </path>
+
<path name="compress-offload-playback8 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia15" value="1" />
</path>
@@ -1334,21 +1801,41 @@
<path name="compress-offload-playback8" />
</path>
+ <path name="compress-offload-playback8 speaker-safe-and-headphones">
+ <path name="compress-offload-playback8 headphones" />
+ <path name="compress-offload-playback8" />
+ </path>
+
<path name="compress-offload-playback8 speaker-and-bt-sco">
<path name="compress-offload-playback8 bt-sco" />
<path name="compress-offload-playback8" />
</path>
+ <path name="compress-offload-playback8 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback8 bt-sco" />
+ <path name="compress-offload-playback8" />
+ </path>
+
<path name="compress-offload-playback8 speaker-and-bt-sco-wb">
<path name="compress-offload-playback8 bt-sco-wb" />
<path name="compress-offload-playback8" />
</path>
+ <path name="compress-offload-playback8 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback8 bt-sco-wb" />
+ <path name="compress-offload-playback8" />
+ </path>
+
<path name="compress-offload-playback8 speaker-and-bt-sco-swb">
<path name="compress-offload-playback8 bt-sco-swb" />
<path name="compress-offload-playback8" />
</path>
+ <path name="compress-offload-playback8 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback8 bt-sco-swb" />
+ <path name="compress-offload-playback8" />
+ </path>
+
<path name="compress-offload-playback9">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
</path>
@@ -1357,6 +1844,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia16" value="1" />
</path>
+ <path name="compress-offload-playback9 display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia16" value="1" />
+ </path>
+
<path name="compress-offload-playback9 bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="1" />
</path>
@@ -1375,6 +1866,16 @@
<path name="compress-offload-playback9" />
</path>
+ <path name="compress-offload-playback9 speaker-safe-and-display-port">
+ <path name="compress-offload-playback9 display-port" />
+ <path name="compress-offload-playback9" />
+ </path>
+
+ <path name="compress-offload-playback9 speaker-and-display-port1">
+ <path name="compress-offload-playback9 display-port1" />
+ <path name="compress-offload-playback9" />
+ </path>
+
<path name="compress-offload-playback9 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia16" value="1" />
</path>
@@ -1392,6 +1893,11 @@
<path name="compress-offload-playback9" />
</path>
+ <path name="compress-offload-playback9 speaker-safe-and-usb-headphones">
+ <path name="compress-offload-playback9 usb-headphones" />
+ <path name="compress-offload-playback9" />
+ </path>
+
<path name="compress-offload-playback9 headphones">
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
</path>
@@ -1413,21 +1919,41 @@
<path name="compress-offload-playback9" />
</path>
+ <path name="compress-offload-playback9 speaker-safe-and-headphones">
+ <path name="compress-offload-playback9 headphones" />
+ <path name="compress-offload-playback9" />
+ </path>
+
<path name="compress-offload-playback9 speaker-and-bt-sco">
<path name="compress-offload-playback9 bt-sco" />
<path name="compress-offload-playback9" />
</path>
+ <path name="compress-offload-playback9 speaker-safe-and-bt-sco">
+ <path name="compress-offload-playback9 bt-sco" />
+ <path name="compress-offload-playback9" />
+ </path>
+
<path name="compress-offload-playback9 speaker-and-bt-sco-wb">
<path name="compress-offload-playback9 bt-sco-wb" />
<path name="compress-offload-playback9" />
</path>
+ <path name="compress-offload-playback9 speaker-safe-and-bt-sco-wb">
+ <path name="compress-offload-playback9 bt-sco-wb" />
+ <path name="compress-offload-playback9" />
+ </path>
+
<path name="compress-offload-playback9 speaker-and-bt-sco-swb">
<path name="compress-offload-playback9 bt-sco-swb" />
<path name="compress-offload-playback9" />
</path>
+ <path name="compress-offload-playback9 speaker-safe-and-bt-sco-swb">
+ <path name="compress-offload-playback9 bt-sco-swb" />
+ <path name="compress-offload-playback9" />
+ </path>
+
<path name="audio-record">
<ctl name="MultiMedia1 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
@@ -1461,6 +1987,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>
@@ -1541,13 +2071,13 @@
</path>
<path name="play-fm">
- <ctl name="Tert MI2S LOOPBACK Volume" value="1" />
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
<ctl name="WSA_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="1" />
<ctl name="WSA_CDC_DMA_RX_0_DL_HL Switch" value="1" />
</path>
<path name="play-fm headphones">
- <ctl name="Tert MI2S LOOPBACK Volume" value="1" />
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
<ctl name="RX_CDC_DMA_RX_0 Port Mixer SLIM_8_TX" value="1" />
<ctl name="RX_CDC_DMA_RX_0_DL_HL Switch" value="1" />
</path>
@@ -1755,6 +2285,10 @@
<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_4_Voip" value="1" />
+ </path>
<path name="compress-voip-call bt-sco">
<ctl name="SLIM_7_RX_Voice Mixer Voip" value="1" />
@@ -1834,11 +2368,21 @@
<ctl name="VoiceMMode1_Tx Mixer USB_AUDIO_TX_MMode1" value="1" />
</path>
+ <path name="voicemmode1-call display-port1-and-usb-headset-mic">
+ <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer USB_AUDIO_TX_MMode1" value="1" />
+ </path>
+
<path name="voicemmode1-call display-port">
<ctl name="DISPLAY_PORT_RX_Voice Mixer VoiceMMode1" value="1" />
<ctl name="VoiceMMode1_Tx Mixer TX_CDC_DMA_TX_3_MMode1" value="1" />
</path>
+ <path name="voicemmode1-call display-port1">
+ <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer TX_CDC_DMA_TX_3_MMode1" value="1" />
+ </path>
+
<path name="voicemmode2-call">
<ctl name="WSA_CDC_DMA_RX_0_Voice Mixer VoiceMMode2" value="1" />
<ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
@@ -1888,6 +2432,16 @@
<ctl name="VoiceMMode2_Tx Mixer USB_AUDIO_TX_MMode2" value="1" />
</path>
+ <path name="voicemmode2-call display-port1-and-usb-headset-mic">
+ <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call display-port1">
+ <ctl name="DISPLAY_PORT1_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer USB_AUDIO_TX_MMode2" value="1" />
+ </path>
+
<path name="voicemmode2-call display-port">
<ctl name="DISPLAY_PORT_RX_Voice Mixer VoiceMMode2" value="1" />
<ctl name="VoiceMMode2_Tx Mixer TX_CDC_DMA_TX_3_MMode2" value="1" />
@@ -1902,6 +2456,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>
@@ -1935,11 +2493,25 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia10" value="1" />
</path>
+ <path name="audio-playback-voip display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia10" value="1" />
+ </path>
+
<path name="audio-playback-voip speaker-and-display-port">
<path name="audio-playback-voip display-port" />
<path name="audio-playback-voip" />
</path>
+ <path name="audio-playback-voip speaker-safe-and-display-port">
+ <path name="audio-playback-voip display-port" />
+ <path name="audio-playback-voip" />
+ </path>
+
+ <path name="audio-playback-voip speaker-and-display-port1">
+ <path name="audio-playback-voip display-port1" />
+ <path name="audio-playback-voip" />
+ </path>
+
<!-- VoIP Tx settings -->
<path name="audio-record-voip">
<ctl name="MultiMedia10 Mixer TX_CDC_DMA_TX_3" value="1" />
@@ -2104,6 +2676,10 @@
<path name="speaker" />
</path>
+ <path name="speaker-safe">
+ <path name="speaker-mono" />
+ </path>
+
<path name="sidetone-iir">
<ctl name="IIR0 Enable Band1" value="1" />
<ctl name="IIR0 Enable Band2" value="1" />
@@ -2219,6 +2795,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
</path>
@@ -2308,19 +2888,43 @@
<path name="speaker" />
</path>
+ <path name="speaker-safe-and-headphones">
+ <path name="headphones" />
+ <path name="speaker-safe" />
+ </path>
+
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-and-line">
<path name="speaker-and-headphones" />
</path>
+ <path name="speaker-safe-and-line">
+ <path name="speaker-safe-and-headphones" />
+ </path>
+
<path name="speaker-and-headphones-liquid">
<path name="headphones" />
<path name="speaker" />
</path>
+ <path name="speaker-safe-and-headphones-liquid">
+ <path name="headphones" />
+ <path name="speaker-safe" />
+ </path>
+
<path name="speaker-and-line-liquid">
<path name="speaker-and-headphones-liquid" />
</path>
+ <path name="speaker-safe-and-headphones-liquid">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="usb-headphones">
</path>
@@ -2333,16 +2937,34 @@
<path name="display-port">
</path>
+ <path name="display-port1">
+ </path>
+
<path name="speaker-and-usb-headphones">
<path name="speaker" />
<path name="usb-headphones" />
</path>
+ <path name="speaker-safe-and-usb-headphones">
+ <path name="speaker-safe" />
+ <path name="usb-headphones" />
+ </path>
+
<path name="speaker-and-display-port">
<path name="speaker" />
<path name="display-port" />
</path>
+ <path name="speaker-safe-and-display-port">
+ <path name="speaker-safe" />
+ <path name="display-port" />
+ </path>
+
+ <path name="speaker-and-display-port1">
+ <path name="speaker" />
+ <path name="display-port1" />
+ </path>
+
<path name="voice-rec-mic">
<path name="handset-mic" />
</path>
@@ -2524,11 +3146,21 @@
<path name="tty-headphones" />
</path>
+ <path name="voice-tty-full-headset">
+ <ctl name="TTY Mode" value="FULL" />
+ <path name="tty-headphones" />
+ </path>
+
<path name="voice-tty-vco-headphones">
<ctl name="TTY Mode" value="VCO" />
<path name="tty-headphones" />
</path>
+ <path name="voice-tty-vco-headset">
+ <ctl name="TTY Mode" value="VCO" />
+ <path name="tty-headphones" />
+ </path>
+
<path name="voice-tty-hco-handset">
<ctl name="TTY Mode" value="HCO" />
<path name="handset" />
@@ -2617,6 +3249,11 @@
<path name="bt-a2dp" />
</path>
+ <path name="speaker-safe-and-bt-a2dp">
+ <path name="speaker-safe" />
+ <path name="bt-a2dp" />
+ </path>
+
<path name="deep-buffer-playback bt-a2dp">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="1" />
</path>
@@ -2670,61 +3307,121 @@
<path name="deep-buffer-playback" />
</path>
+ <path name="deep-buffer-playback speaker-safe-and-bt-a2dp">
+ <path name="deep-buffer-playback bt-a2dp" />
+ <path name="deep-buffer-playback" />
+ </path>
+
<path name="compress-offload-playback speaker-and-bt-a2dp">
<path name="compress-offload-playback bt-a2dp" />
<path name="compress-offload-playback" />
</path>
+ <path name="compress-offload-playback speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback bt-a2dp" />
+ <path name="compress-offload-playback" />
+ </path>
+
<path name="low-latency-playback speaker-and-bt-a2dp">
<path name="low-latency-playback bt-a2dp" />
<path name="low-latency-playback" />
</path>
+ <path name="low-latency-playback speaker-safe-and-bt-a2dp">
+ <path name="low-latency-playback bt-a2dp" />
+ <path name="low-latency-playback" />
+ </path>
+
<path name="compress-offload-playback2 speaker-and-bt-a2dp">
<path name="compress-offload-playback2 bt-a2dp" />
<path name="compress-offload-playback2" />
</path>
+ <path name="compress-offload-playback2 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback2 bt-a2dp" />
+ <path name="compress-offload-playback2" />
+ </path>
+
<path name="compress-offload-playback3 speaker-and-bt-a2dp">
<path name="compress-offload-playback3 bt-a2dp" />
<path name="compress-offload-playback3" />
</path>
+ <path name="compress-offload-playback3 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback3 bt-a2dp" />
+ <path name="compress-offload-playback3" />
+ </path>
+
<path name="compress-offload-playback4 speaker-and-bt-a2dp">
<path name="compress-offload-playback4 bt-a2dp" />
<path name="compress-offload-playback4" />
</path>
+ <path name="compress-offload-playback4 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback4 bt-a2dp" />
+ <path name="compress-offload-playback4" />
+ </path>
+
<path name="compress-offload-playback5 speaker-and-bt-a2dp">
<path name="compress-offload-playback5 bt-a2dp" />
<path name="compress-offload-playback5" />
</path>
+ <path name="compress-offload-playback5 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback5 bt-a2dp" />
+ <path name="compress-offload-playback5" />
+ </path>
+
<path name="compress-offload-playback6 speaker-and-bt-a2dp">
<path name="compress-offload-playback6 bt-a2dp" />
<path name="compress-offload-playback6" />
</path>
+ <path name="compress-offload-playback6 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback6 bt-a2dp" />
+ <path name="compress-offload-playback6" />
+ </path>
+
<path name="compress-offload-playback7 speaker-and-bt-a2dp">
<path name="compress-offload-playback7 bt-a2dp" />
<path name="compress-offload-playback7" />
</path>
+ <path name="compress-offload-playback7 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback7 bt-a2dp" />
+ <path name="compress-offload-playback7" />
+ </path>
+
<path name="compress-offload-playback8 speaker-and-bt-a2dp">
<path name="compress-offload-playback8 bt-a2dp" />
<path name="compress-offload-playback8" />
</path>
+ <path name="compress-offload-playback8 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback8 bt-a2dp" />
+ <path name="compress-offload-playback8" />
+ </path>
+
<path name="compress-offload-playback9 speaker-and-bt-a2dp">
<path name="compress-offload-playback9 bt-a2dp" />
<path name="compress-offload-playback9" />
</path>
+ <path name="compress-offload-playback9 speaker-safe-and-bt-a2dp">
+ <path name="compress-offload-playback9 bt-a2dp" />
+ <path name="compress-offload-playback9" />
+ </path>
+
<path name="audio-ull-playback speaker-and-bt-a2dp">
<path name="audio-ull-playback bt-a2dp" />
<path name="audio-ull-playback" />
</path>
+ <path name="audio-ull-playback speaker-safe-and-bt-a2dp">
+ <path name="audio-ull-playback bt-a2dp" />
+ <path name="audio-ull-playback" />
+ </path>
+
<path name="mmap-playback">
<ctl name="WSA_CDC_DMA_RX_0 Audio Mixer MultiMedia16" value="1" />
</path>
@@ -2733,11 +3430,20 @@
<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" />
</path>
+ <path name="mmap-playback speaker-safe-and-headphones">
+ <path name="mmap-playback" />
+ <path name="mmap-playback headphones" />
+ </path>
+
<path name="mmap-playback bt-sco">
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="1" />
</path>
@@ -2767,6 +3473,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia16" value="1" />
</path>
+ <path name="mmap-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia16" value="1" />
+ </path>
+
<path name="mmap-playback hdmi">
<ctl name="HDMI Mixer MultiMedia16" value="1" />
</path>
@@ -2781,11 +3491,26 @@
<path name="mmap-playback" />
</path>
+ <path name="mmap-playback speaker-safe-and-display-port">
+ <path name="mmap-playback display-port" />
+ <path name="mmap-playback" />
+ </path>
+
+ <path name="mmap-playback speaker-and-display-port1">
+ <path name="mmap-playback display-port1" />
+ <path name="mmap-playback" />
+ </path>
+
<path name="mmap-playback speaker-and-usb-headphones">
<path name="mmap-playback usb-headphones" />
<path name="mmap-playback" />
</path>
+ <path name="mmap-playback speaker-safe-and-usb-headphones">
+ <path name="mmap-playback usb-headphones" />
+ <path name="mmap-playback" />
+ </path>
+
<path name="mmap-record">
<ctl name="MultiMedia16 Mixer TX_CDC_DMA_TX_3" value="1" />
</path>
@@ -2819,6 +3544,10 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia2" value="1" />
</path>
+ <path name="hifi-playback display-port1">
+ <ctl name="DISPLAY_PORT1 Mixer MultiMedia2" value="1" />
+ </path>
+
<path name="hifi-playback afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="1" />
</path>
@@ -2863,6 +3592,10 @@
<path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink display-port1">
+ <path name="incall_music_uplink" />
+ </path>
+
<path name="incall_music_uplink bt-sco">
<path name="incall_music_uplink" />
</path>
@@ -2879,6 +3612,14 @@
<path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink speaker-safe-and-display-port">
+ <path name="incall_music_uplink" />
+ </path>
+
+ <path name="incall_music_uplink speaker-and-display-port1">
+ <path name="incall_music_uplink" />
+ </path>
+
<path name="incall_music_uplink afe-proxy">
<path name="incall_music_uplink" />
</path>
@@ -2895,6 +3636,10 @@
<path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink speaker-safe-and-usb-headphones">
+ <path name="incall_music_uplink" />
+ </path>
+
<path name="incall_music_uplink headphones">
<path name="incall_music_uplink" />
</path>
@@ -2907,10 +3652,18 @@
<path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink speaker-safe-and-headphones">
+ <path name="incall_music_uplink" />
+ </path>
+
<path name="incall_music_uplink speaker-and-bt-sco">
<path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink speaker-safe-and-bt-sco">
+ <path name="incall_music_uplink" />
+ </path>
+
<path name="incall_music_uplink voice-tty-hco-handset">
<path name="incall_music_uplink" />
</path>
@@ -2919,6 +3672,10 @@
<path name="incall_music_uplink" />
</path>
+ <path name="incall_music_uplink speaker-safe-and-bt-a2dp">
+ <path name="incall_music_uplink" />
+ </path>
+
<path name="incall_music_uplink bt-a2dp">
<path name="incall_music_uplink" />
</path>
diff --git a/configs/lito/mixer_paths_qrd.xml b/configs/lito/mixer_paths_qrd.xml
index 4bf2ff2..a7149ca 100644
--- a/configs/lito/mixer_paths_qrd.xml
+++ b/configs/lito/mixer_paths_qrd.xml
@@ -3024,6 +3024,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
<ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
<ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -3091,6 +3095,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/msm8998/msm8998.mk b/configs/msm8998/msm8998.mk
index eba94f0..18b2bf6 100644
--- a/configs/msm8998/msm8998.mk
+++ b/configs/msm8998/msm8998.mk
@@ -272,7 +272,7 @@
vendor.audio.feature.compr_cap.enable=false \
vendor.audio.feature.compress_in.enable=false \
vendor.audio.feature.compress_meta_data.enable=true \
-vendor.audio.feature.compr_voip.enable=false \
+vendor.audio.feature.compr_voip.enable=true \
vendor.audio.feature.concurrent_capture.enable=false \
vendor.audio.feature.custom_stereo.enable=true \
vendor.audio.feature.display_port.enable=true \
diff --git a/configs/msmnile_au/audio_platform_info.xml b/configs/msmnile_au/audio_platform_info.xml
index 4fdf786..f39a804 100644
--- a/configs/msmnile_au/audio_platform_info.xml
+++ b/configs/msmnile_au/audio_platform_info.xml
@@ -49,6 +49,7 @@
<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_VOICE_SPEAKER_MIC_HFP_MMSECNS" acdb_id="131"/>
<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"/>
@@ -74,6 +75,10 @@
<device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
<device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
</ns>
+ <mmsecns>
+ <!-- multi-mic surround ECNS zone control -->
+ <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" topology_id="0x1FFF0002" module_id="0x10F3B" instance_id="0x8000" param_id="0x109F0"/>
+ </mmsecns>
</module_ids>
<bit_width_configs>
@@ -174,6 +179,8 @@
<device name="SND_DEVICE_IN_SPEAKER_DMIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_QUAD_MIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_HANDSET_QMIC" interface="TERT_TDM_TX_0"/>
+ <!-- multi-mic surround ECNS mixer path definition -->
+ <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" backend="bt-sco-mmsecns" interface="TERT_TDM_TX_0"/>
</backend_names>
<!-- below values are for ref purpose to OEM, doesn't contain actual hardware info on MTP -->
<microphone_characteristics>
diff --git a/configs/msmnile_au/mixer_paths_adp.xml b/configs/msmnile_au/mixer_paths_adp.xml
index 566f1e9..6d1e667 100644
--- a/configs/msmnile_au/mixer_paths_adp.xml
+++ b/configs/msmnile_au/mixer_paths_adp.xml
@@ -1600,12 +1600,6 @@
<path name="incall-rec-uplink-and-downlink-compress" />
</path>
- <path name="hfp-sco">
- <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" />
- </path>
-
<path name="icc-call">
<ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
<ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1624,11 +1618,26 @@
<path name="hfp-sco headphones">
</path>
+ <path name="hfp-sco-wb headphones">
+ <path name="hfp-sco headphones" />
+ </path>
+
<path name="hfp-sco headset">
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco">
+ <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+ <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+ </path>
+
<path name="hfp-sco bt-sco">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+ <path name="hfp-sco" />
+ </path>
+
+ <path name="hfp-sco bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
<path name="hfp-sco" />
</path>
@@ -1638,11 +1647,13 @@
</path>
<path name="hfp-sco-wb bt-sco-wb">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
<path name="hfp-sco-wb" />
</path>
- <path name="hfp-sco-wb headphones">
- <path name="hfp-sco headphones" />
+ <path name="hfp-sco-wb bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <path name="hfp-sco-wb" />
</path>
@@ -2145,6 +2156,10 @@
<path name="speaker-mic" />
</path>
+ <path name="voice-speaker-mic-hfp-mmsecns">
+ <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 2136c79..28a0224 100644
--- a/configs/msmnile_au/mixer_paths_custom.xml
+++ b/configs/msmnile_au/mixer_paths_custom.xml
@@ -1588,12 +1588,6 @@
<path name="incall-rec-uplink-and-downlink-compress" />
</path>
- <path name="hfp-sco">
- <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" />
- </path>
-
<path name="icc-call">
<ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
<ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1612,11 +1606,26 @@
<path name="hfp-sco headphones">
</path>
+ <path name="hfp-sco-wb headphones">
+ <path name="hfp-sco headphones" />
+ </path>
+
<path name="hfp-sco headset">
<path name="hfp-sco headphones" />
</path>
+ <path name="hfp-sco">
+ <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+ <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+ </path>
+
<path name="hfp-sco bt-sco">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+ <path name="hfp-sco" />
+ </path>
+
+ <path name="hfp-sco bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
<path name="hfp-sco" />
</path>
@@ -1626,11 +1635,13 @@
</path>
<path name="hfp-sco-wb bt-sco-wb">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
<path name="hfp-sco-wb" />
</path>
- <path name="hfp-sco-wb headphones">
- <path name="hfp-sco headphones" />
+ <path name="hfp-sco-wb bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <path name="hfp-sco-wb" />
</path>
@@ -2133,6 +2144,10 @@
<path name="speaker-mic" />
</path>
+ <path name="voice-speaker-mic-hfp-mmsecns">
+ <path name="speaker-mic" />
+ </path>
+
<path name="voice-headphones">
<path name="headphones" />
</path>
diff --git a/configs/msmsteppe/audio_platform_info_intcodec.xml b/configs/msmsteppe/audio_platform_info_intcodec.xml
index 6273fb8..94ea850 100644
--- a/configs/msmsteppe/audio_platform_info_intcodec.xml
+++ b/configs/msmsteppe/audio_platform_info_intcodec.xml
@@ -73,6 +73,7 @@
<param key="spkr_1_tz_name" value="wsatz.13"/>
<param key="spkr_2_tz_name" value="wsatz.14"/>
<param key="true_32_bit" value="true"/>
+ <param key="hifi_filter" value="false"/>
<param key="native_audio_mode" value="true"/>
<param key="hfp_pcm_dev_id" value="39"/>
<param key="input_mic_max_count" value="4"/>
@@ -108,6 +109,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -115,6 +117,7 @@
<device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<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"/>
diff --git a/configs/msmsteppe/audio_platform_info_qrd.xml b/configs/msmsteppe/audio_platform_info_qrd.xml
index c49fcb5..1070291 100644
--- a/configs/msmsteppe/audio_platform_info_qrd.xml
+++ b/configs/msmsteppe/audio_platform_info_qrd.xml
@@ -72,6 +72,7 @@
<param key="mono_speaker" value="right"/>
<param key="spkr_1_tz_name" value="wsatz.11"/>
<param key="true_32_bit" value="true"/>
+ <param key="hifi_filter" value="false"/>
<param key="native_audio_mode" value="true"/>
<param key="hfp_pcm_dev_id" value="39"/>
<param key="input_mic_max_count" value="2"/>
@@ -103,6 +104,7 @@
</acdb_ids>
<backend_names>
<device name="SND_DEVICE_OUT_HEADPHONES" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_HEADPHONES_HIFI_FILTER" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_HEADPHONES_44_1" backend="headphones-44.1" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_BT_SCO_WB" backend="bt-sco-wb" interface="SLIMBUS_7_RX"/>
<device name="SND_DEVICE_OUT_BT_SCO" backend="bt-sco" interface="SLIMBUS_7_RX"/>
@@ -110,6 +112,7 @@
<device name="SND_DEVICE_OUT_LINE" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_ANC_HEADSET" backend="headphones" interface="RX_CDC_DMA_RX_0"/>
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
+ <device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_HIFI_FILTER" backend="speaker-and-headphones" interface="WSA_CDC_DMA_RX_0-and-RX_CDC_DMA_RX_0"/>
<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"/>
diff --git a/configs/msmsteppe/mixer_paths_idp.xml b/configs/msmsteppe/mixer_paths_idp.xml
index 0ae0e65..143b0b7 100644
--- a/configs/msmsteppe/mixer_paths_idp.xml
+++ b/configs/msmsteppe/mixer_paths_idp.xml
@@ -2565,6 +2565,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
</path>
@@ -2639,6 +2643,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/msmsteppe/mixer_paths_qrd.xml b/configs/msmsteppe/mixer_paths_qrd.xml
index 2cd498d..32e8e4b 100644
--- a/configs/msmsteppe/mixer_paths_qrd.xml
+++ b/configs/msmsteppe/mixer_paths_qrd.xml
@@ -2586,6 +2586,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
</path>
@@ -2652,6 +2656,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/msmsteppe/mixer_paths_wcd9375.xml b/configs/msmsteppe/mixer_paths_wcd9375.xml
index 9a1288f..89f6191 100644
--- a/configs/msmsteppe/mixer_paths_wcd9375.xml
+++ b/configs/msmsteppe/mixer_paths_wcd9375.xml
@@ -2578,6 +2578,10 @@
<path name="headphones" />
</path>
+ <path name="headphones-hifi-filter">
+ <path name="headphones" />
+ </path>
+
<path name="hph-highquality-mode">
<ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
<ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
@@ -2656,6 +2660,11 @@
<path name="speaker" />
</path>
+ <path name="speaker-and-headphones-hifi-filter">
+ <path name="headphones" />
+ <path name="speaker-safe" />
+ </path>
+
<path name="speaker-safe-and-headphones">
<path name="headphones" />
<path name="speaker-safe" />
diff --git a/configs/msmsteppe_au/audio_platform_info.xml b/configs/msmsteppe_au/audio_platform_info.xml
index 4fdf786..f39a804 100644
--- a/configs/msmsteppe_au/audio_platform_info.xml
+++ b/configs/msmsteppe_au/audio_platform_info.xml
@@ -49,6 +49,7 @@
<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_VOICE_SPEAKER_MIC_HFP_MMSECNS" acdb_id="131"/>
<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"/>
@@ -74,6 +75,10 @@
<device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" module_id="0x10F0A" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
<device name="SND_DEVICE_IN_HANDSET_MIC_AEC_NS" module_id="0x10F09" instance_id="0x0" param_id="0x10EAF" param_value="0x02"/>
</ns>
+ <mmsecns>
+ <!-- multi-mic surround ECNS zone control -->
+ <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" topology_id="0x1FFF0002" module_id="0x10F3B" instance_id="0x8000" param_id="0x109F0"/>
+ </mmsecns>
</module_ids>
<bit_width_configs>
@@ -174,6 +179,8 @@
<device name="SND_DEVICE_IN_SPEAKER_DMIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_QUAD_MIC" interface="TERT_TDM_TX_0"/>
<device name="SND_DEVICE_IN_HANDSET_QMIC" interface="TERT_TDM_TX_0"/>
+ <!-- multi-mic surround ECNS mixer path definition -->
+ <device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS" backend="bt-sco-mmsecns" interface="TERT_TDM_TX_0"/>
</backend_names>
<!-- below values are for ref purpose to OEM, doesn't contain actual hardware info on MTP -->
<microphone_characteristics>
diff --git a/configs/msmsteppe_au/mixer_paths_adp.xml b/configs/msmsteppe_au/mixer_paths_adp.xml
index 7622dd8..71eb87e 100644
--- a/configs/msmsteppe_au/mixer_paths_adp.xml
+++ b/configs/msmsteppe_au/mixer_paths_adp.xml
@@ -1371,12 +1371,6 @@
<path name="incall-rec-uplink-and-downlink-compress" />
</path>
- <path name="hfp-sco">
- <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" />
- </path>
-
<path name="icc-call">
<ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
<ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1395,7 +1389,22 @@
<path name="hfp-sco headphones">
</path>
+ <path name="hfp-sco-wb headphones">
+ <path name="hfp-sco headphones" />
+ </path>
+
+ <path name="hfp-sco">
+ <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+ <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+ </path>
+
<path name="hfp-sco bt-sco">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+ <path name="hfp-sco" />
+ </path>
+
+ <path name="hfp-sco bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
<path name="hfp-sco" />
</path>
@@ -1405,11 +1414,13 @@
</path>
<path name="hfp-sco-wb bt-sco-wb">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
<path name="hfp-sco-wb" />
</path>
- <path name="hfp-sco-wb headphones">
- <path name="hfp-sco headphones" />
+ <path name="hfp-sco-wb bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <path name="hfp-sco-wb" />
</path>
<path name="hfp-sco-downlink">
@@ -1870,6 +1881,10 @@
<path name="speaker-mic" />
</path>
+ <path name="voice-speaker-mic-hfp-mmsecns">
+ <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 dd0da54..fdfb282 100644
--- a/configs/msmsteppe_au/mixer_paths_custom.xml
+++ b/configs/msmsteppe_au/mixer_paths_custom.xml
@@ -1360,12 +1360,6 @@
<path name="incall-rec-uplink-and-downlink-compress" />
</path>
- <path name="hfp-sco">
- <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" />
- </path>
-
<path name="icc-call">
<ctl name="SEC_TDM_RX_0 SampleRate" value="KHZ_16" />
<ctl name="SEC_TDM_RX_0 Channels" value="Four" />
@@ -1384,7 +1378,22 @@
<path name="hfp-sco headphones">
</path>
+ <path name="hfp-sco-wb headphones">
+ <path name="hfp-sco headphones" />
+ </path>
+
+ <path name="hfp-sco">
+ <ctl name="AUX_PCM_RX Audio Mixer MultiMedia6" value="1" />
+ <ctl name="MultiMedia6 Mixer TERT_TDM_TX_0" value="1" />
+ </path>
+
<path name="hfp-sco bt-sco">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
+ <path name="hfp-sco" />
+ </path>
+
+ <path name="hfp-sco bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
<path name="hfp-sco" />
</path>
@@ -1394,11 +1403,13 @@
</path>
<path name="hfp-sco-wb bt-sco-wb">
+ <ctl name="TERT_TDM_TX_0 Channels" value="One" />
<path name="hfp-sco-wb" />
</path>
- <path name="hfp-sco-wb headphones">
- <path name="hfp-sco headphones" />
+ <path name="hfp-sco-wb bt-sco-mmsecns">
+ <ctl name="TERT_TDM_TX_0 Channels" value="Four" />
+ <path name="hfp-sco-wb" />
</path>
<path name="hfp-sco-downlink">
@@ -1859,6 +1870,10 @@
<path name="speaker-mic" />
</path>
+ <path name="voice-speaker-mic-hfp-mmsecns">
+ <path name="speaker-mic" />
+ </path>
+
<path name="voice-headphones">
<path name="headphones" />
</path>
diff --git a/configure.ac b/configure.ac
index 572e07d..89326c0 100755
--- a/configure.ac
+++ b/configure.ac
@@ -141,6 +141,7 @@
AM_CONDITIONAL([RUN_KEEP_ALIVE_IN_ARM_FFV], [test x$AUDIO_FEATURE_ENABLED_KEEP_ALIVE_ARM_FFV = xtrue])
AM_CONDITIONAL([INSTANCE_ID], [test x$AUDIO_FEATURE_ENABLED_INSTANCE_ID = xtrue])
AM_CONDITIONAL([LL_AS_PRIMARY_OUTPUT], [test x$AUDIO_USE_LL_AS_PRIMARY_OUTPUT = xtrue])
+AM_CONDITIONAL([QAHW_V1], [test x$AUDIO_FEATURE_ENABLED_QAHW_1_0 = xtrue])
AC_CONFIG_FILES([ \
Makefile \
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 9057016..2d31509 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -5677,6 +5677,7 @@
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;
+ auto_hal_init_config.fp_platform_get_eccarstate = platform_get_eccarstate;
return auto_hal_init(adev, auto_hal_init_config);
}
else
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index d282f45..c0e8cf4 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -696,6 +696,7 @@
struct audio_usecase *);
typedef int (*fp_audio_extn_auto_hal_stop_hfp_downlink_t)(struct audio_device *,
struct audio_usecase *);
+typedef bool (*fp_platform_get_eccarstate_t)(void *);
typedef struct hfp_init_config {
fp_platform_set_mic_mute_t fp_platform_set_mic_mute;
@@ -1360,6 +1361,7 @@
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;
+ fp_platform_get_eccarstate_t fp_platform_get_eccarstate;
} 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 b09a9d0..41b3762 100644
--- a/hal/audio_extn/auto_hal.c
+++ b/hal/audio_extn/auto_hal.c
@@ -59,6 +59,7 @@
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;
+static fp_platform_get_eccarstate_t fp_platform_get_eccarstate;
/* Auto hal module struct */
static struct auto_hal_module *auto_hal = NULL;
@@ -827,7 +828,11 @@
switch (usecase->id) {
case USECASE_AUDIO_HFP_SCO:
case USECASE_AUDIO_HFP_SCO_WB:
- snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP;
+ if (fp_platform_get_eccarstate((void *) adev->platform)) {
+ snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS;
+ } else {
+ snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP;
+ }
if (adev->enable_hfp)
fp_platform_set_echo_reference(adev, true, out_device);
break;
@@ -971,6 +976,7 @@
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;
+ fp_platform_get_eccarstate = init_config.fp_platform_get_eccarstate;
return ret;
}
diff --git a/hal/audio_extn/ext_hw_plugin.c b/hal/audio_extn/ext_hw_plugin.c
index 6e784cb..92f3f30 100644
--- a/hal/audio_extn/ext_hw_plugin.c
+++ b/hal/audio_extn/ext_hw_plugin.c
@@ -286,9 +286,12 @@
}
}
- if ((usecase->type == PCM_CAPTURE) &&
- (usecase->id == USECASE_AUDIO_RECORD) &&
- (usecase->in_snd_device == SND_DEVICE_IN_SPEAKER_QMIC_AEC)) {
+ if (((usecase->type == PCM_CAPTURE) &&
+ (usecase->id == USECASE_AUDIO_RECORD) &&
+ (usecase->in_snd_device == SND_DEVICE_IN_SPEAKER_QMIC_AEC)) ||
+ ((usecase->type == PCM_HFP_CALL) &&
+ ((usecase->id == USECASE_AUDIO_HFP_SCO) || (usecase->id == USECASE_AUDIO_HFP_SCO_WB)) &&
+ (usecase->in_snd_device == SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS))) {
audio_hal_plugin_codec_enable_t codec_enable_ec = {0,};
codec_enable_ec.snd_dev = usecase->in_snd_device;
// TODO - below should be related with in_snd_dev
diff --git a/hal/audio_extn/hfp.c b/hal/audio_extn/hfp.c
index 62eb9e6..e646bc1 100644
--- a/hal/audio_extn/hfp.c
+++ b/hal/audio_extn/hfp.c
@@ -83,6 +83,7 @@
struct pcm *hfp_sco_tx;
struct pcm *hfp_pcm_rx;
struct pcm *hfp_pcm_tx;
+ struct pcm *hfp_ext_ec_tx;
bool is_hfp_running;
float hfp_volume;
int32_t hfp_pcm_dev_id;
@@ -96,6 +97,7 @@
.hfp_sco_tx = NULL,
.hfp_pcm_rx = NULL,
.hfp_pcm_tx = NULL,
+ .hfp_ext_ec_tx = NULL,
.is_hfp_running = 0,
.hfp_volume = 0,
.hfp_pcm_dev_id = HFP_ASM_RX_TX,
@@ -288,6 +290,7 @@
int32_t ret = 0;
struct audio_usecase *uc_info;
int32_t pcm_dev_rx_id, pcm_dev_tx_id, pcm_dev_asm_rx_id, pcm_dev_asm_tx_id;
+ int32_t pcm_ext_ec_ref_id;
ALOGD("%s: enter", __func__);
@@ -396,6 +399,27 @@
goto exit;
}
+#ifdef PLATFORM_AUTO
+ /* echo reference path for single-mic/multi-mic surround ECNS hfp calls */
+ pcm_ext_ec_ref_id = HFP_EXT_EC_REF_TX;
+ ALOGD("%s: Opening PCM capture device card_id(%d) device_id(%d)",
+ __func__, adev->snd_card, pcm_ext_ec_ref_id);
+ hfpmod.hfp_ext_ec_tx = pcm_open(adev->snd_card,
+ pcm_ext_ec_ref_id,
+ PCM_IN, &pcm_config_hfp);
+ if (hfpmod.hfp_ext_ec_tx && !pcm_is_ready(hfpmod.hfp_ext_ec_tx)) {
+ ALOGE("%s: %s", __func__, pcm_get_error(hfpmod.hfp_ext_ec_tx));
+ ret = -EIO;
+ goto exit;
+ }
+
+ if (pcm_start(hfpmod.hfp_ext_ec_tx) < 0) {
+ ALOGE("%s: pcm start for hfp ext ec tx failed", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+#endif
+
hfpmod.is_hfp_running = true;
hfp_set_volume(adev, hfpmod.hfp_volume);
@@ -438,6 +462,14 @@
hfpmod.hfp_pcm_tx = NULL;
}
+#ifdef PLATFORM_AUTO
+ /* echo reference path for single-mic/multi-mic surround ECNS hfp calls */
+ if (hfpmod.hfp_ext_ec_tx) {
+ pcm_close(hfpmod.hfp_ext_ec_tx);
+ hfpmod.hfp_ext_ec_tx = NULL;
+ }
+#endif
+
uc_info = fp_get_usecase_from_list(adev, hfpmod.ucid);
if (uc_info == NULL) {
ALOGE("%s: Could not find the usecase (%d) in the list",
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 0807fb2..0df1981 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1128,7 +1128,9 @@
in->ec_opened = true;
}
}
- } else if (usecase->type == TRANSCODE_LOOPBACK_TX) {
+ } else if ((usecase->type == TRANSCODE_LOOPBACK_TX) || ((usecase->type == PCM_HFP_CALL) &&
+ ((usecase->id == USECASE_AUDIO_HFP_SCO) || (usecase->id == USECASE_AUDIO_HFP_SCO_WB)) &&
+ (usecase->in_snd_device == SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS))) {
snd_device = usecase->in_snd_device;
} else {
snd_device = usecase->out_snd_device;
@@ -8401,21 +8403,6 @@
adev->allow_afe_proxy_usage = true;
}
}
- if (audio_is_a2dp_out_device(device)) {
- struct audio_usecase *usecase;
- struct listnode *node;
- list_for_each(node, &adev->usecase_list) {
- usecase = node_to_item(node, struct audio_usecase, list);
- if (PCM_PLAYBACK == usecase->type && usecase->stream.out &&
- (usecase->stream.out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
- usecase->stream.out->a2dp_compress_mute) {
- struct stream_out *out = usecase->stream.out;
- ALOGD("Unmuting the stream when Bt-A2dp disconnected and stream is mute");
- out->a2dp_compress_mute = false;
- out_set_compr_volume(&out->stream, out->volume_l, out->volume_r);
- }
- }
- }
}
audio_extn_hfp_set_parameters(adev, parms);
@@ -9595,10 +9582,10 @@
if (restore) {
// restore A2DP device for active usecases and unmute if required
- if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
- (uc_info->out_snd_device != SND_DEVICE_OUT_BT_A2DP)) {
+ if (out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
ALOGD("%s: restoring A2dp and unmuting stream", __func__);
- select_devices(adev, uc_info->id);
+ if (uc_info->out_snd_device != SND_DEVICE_OUT_BT_A2DP)
+ select_devices(adev, uc_info->id);
pthread_mutex_lock(&out->compr_mute_lock);
if ((out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
(out->a2dp_compress_mute) && (uc_info->out_snd_device == SND_DEVICE_OUT_BT_A2DP)) {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 7420d07..6685b74 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -149,6 +149,7 @@
#define AUDIO_PARAMETER_KEY_VOLUME_BOOST "volume_boost"
#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
+#define AUDIO_PARAMETER_KEY_EC_CAR_STATE "ec_car_state"
#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
@@ -302,6 +303,7 @@
bool hifi_audio;
bool is_i2s_ext_modem;
bool is_acdb_initialized;
+ bool ec_car_state;
/* Vbat monitor related flags */
bool is_vbat_speaker;
bool is_bcl_speaker;
@@ -656,6 +658,7 @@
[SND_DEVICE_IN_VOICE_SPEAKER_TMIC] = "voice-speaker-tmic",
[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = "voice-speaker-mic-hfp",
+ [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = "voice-speaker-mic-hfp-mmsecns",
[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
[SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
[SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
@@ -906,6 +909,7 @@
[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
[SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB] = 171,
[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = 11,
+ [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = 131,
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
[SND_DEVICE_IN_SPDIF] = 143,
[SND_DEVICE_IN_HDMI_MIC] = 143,
@@ -1142,6 +1146,7 @@
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPDIF)},
{TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
@@ -1893,6 +1898,9 @@
else if (out_device & AUDIO_DEVICE_OUT_USB_HEADSET)
strlcat(ec_ref_mixer_path, " usb-headphones",
MIXER_PATH_MAX_LENGTH);
+ else if (out_device & AUDIO_DEVICE_OUT_BUS)
+ strlcpy(ec_ref_mixer_path, "multi-mic-echo-reference",
+ MIXER_PATH_MAX_LENGTH);
if (audio_route_apply_and_update_path(adev->audio_route,
ec_ref_mixer_path) == 0)
@@ -2184,6 +2192,7 @@
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_HEARING_AID] = strdup("hearing-aid");
+ backend_tag_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = strdup("bt-sco-mmsecns");
hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
@@ -2341,6 +2350,7 @@
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_SB] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = strdup("SLIMBUS_0_TX");
+ hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_TMIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
@@ -3103,6 +3113,7 @@
my_data->spkr_ch_map = NULL;
my_data->use_sprk_default_sample_rate = true;
my_data->fluence_in_voice_comm = false;
+ my_data->ec_car_state = false;
platform_reset_edid_info(my_data);
//set max volume step for voice call
@@ -7280,6 +7291,21 @@
return ret;
}
+bool platform_get_eccarstate(void *platform)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ return my_data->ec_car_state;
+}
+
+static int platform_set_eccarstate(struct platform_data *my_data, bool state)
+{
+ int ret = 0;
+ ALOGD("Setting EC Car state: %d", state);
+ my_data->ec_car_state = state;
+
+ return ret;
+}
+
static int update_external_device_status(struct platform_data *my_data,
char* event_name, bool status)
{
@@ -7713,6 +7739,18 @@
}
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+ value, len);
+ if (err >= 0) {
+ bool state = false;
+ if (!strncmp("true", value, sizeof("true"))) {
+ state = true;
+ ALOGD("%s: Value of EC CAR STATE set to true!", __func__);
+ }
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_EC_CAR_STATE);
+ platform_set_eccarstate(my_data, state);
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB,
value, len);
if (err >= 0) {
@@ -8081,6 +8119,13 @@
str_parms_add_str(reply, AUDIO_PARAMETER_KEY_VOLUME_BOOST, value);
}
+ ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+ value, sizeof(value));
+ if (ret >= 0) {
+ str_parms_add_str(reply, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+ my_data->ec_car_state? "true" : "false");
+ }
+
ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_DP_FOR_VOICE_USECASE,
value, sizeof(value));
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index f9d4198..1777ec3 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -231,6 +231,7 @@
SND_DEVICE_IN_VOICE_SPEAKER_MIC,
SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB,
SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP,
+ SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS,
SND_DEVICE_IN_VOICE_HEADSET_MIC,
SND_DEVICE_IN_SPDIF,
SND_DEVICE_IN_HDMI_MIC,
@@ -643,6 +644,7 @@
#elif PLATFORM_AUTO
#define HFP_SCO_RX 29
#define HFP_ASM_RX_TX 36
+#define HFP_EXT_EC_REF_TX 1
#elif defined (PLATFORM_MSMFALCON) || defined (PLATFORM_MSM8937)
#define HFP_SCO_RX 17
#define HFP_ASM_RX_TX 18
diff --git a/hal/platform_api.h b/hal/platform_api.h
index bb8c558..2ffead8 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -374,6 +374,7 @@
size_t *mic_count);
int platform_get_license_by_product(void *platform, const char* product_name, int *product_id, char* product_license);
+bool platform_get_eccarstate(void *platform);
int platform_get_haptics_pcm_device_id();
int platform_set_qtime(void *platform, int audio_pcm_device_id,
int haptic_pcm_device_id);
diff --git a/post_proc/effect_api.c b/post_proc/effect_api.c
index 4101647..a07de20 100644
--- a/post_proc/effect_api.c
+++ b/post_proc/effect_api.c
@@ -515,11 +515,11 @@
eq->per_band_cfg[i].freq_millihertz = band_freq_list[i] * 1000;
eq->per_band_cfg[i].gain_millibels = band_gain_list[i] * 100;
eq->per_band_cfg[i].quality_factor = Q8_UNITY;
- }
-
#ifdef DTS_EAGLE
update_effects_node(PCM_DEV_ID, EFFECT_TYPE_EQ, EFFECT_SET_PARAM, EFFECT_NO_OP, EFFECT_NO_OP, i, band_gain_list[i] * 100);
#endif
+ }
+
}
static int eq_send_params(eff_mode_t mode, void *ctl, struct eq_params *eq,
diff --git a/post_proc/equalizer.c b/post_proc/equalizer.c
index ed16f12..a2e69b0 100644
--- a/post_proc/equalizer.c
+++ b/post_proc/equalizer.c
@@ -517,6 +517,8 @@
set_config(context, &context->config);
eq_ctxt->hw_acc_fd = -1;
+ for (int i = 0; i < NUM_EQ_BANDS; i++)
+ eq_ctxt->band_levels[i] = 0;
memset(&(eq_ctxt->offload_eq), 0, sizeof(struct eq_params));
offload_eq_set_preset(&(eq_ctxt->offload_eq), INVALID_PRESET);
enable_gcov();
diff --git a/qahw/Makefile.am b/qahw/Makefile.am
index b78c9b7..fccf003 100644
--- a/qahw/Makefile.am
+++ b/qahw/Makefile.am
@@ -17,6 +17,10 @@
AM_CFLAGS += -DSVA_AUDIO_CONC
endif
+if QAHW_V1
+AM_CFLAGS += -DQAHW_V1
+endif
+
libqahwwrapper_la_CFLAGS = $(AM_CFLAGS)
libqahwwrapper_la_CFLAGS += -include stddef.h
libqahwwrapper_la_CFLAGS += -Dstrlcpy=g_strlcpy $(GLIB_CFLAGS) -include glib.h
diff --git a/qahw/configure.ac b/qahw/configure.ac
index 5bd3a22..94ca645 100644
--- a/qahw/configure.ac
+++ b/qahw/configure.ac
@@ -30,6 +30,7 @@
PKG_PROG_PKG_CONFIG
AM_CONDITIONAL([SVA_AUDIO_CONCURRENCY],[test x$BOARD_SUPPORTS_SVA_AUDIO_CONCURRENCY = xtrue])
+AM_CONDITIONAL([QAHW_V1], [test x$AUDIO_FEATURE_ENABLED_QAHW_1_0 = xtrue])
AC_ARG_WITH([glib],
AC_HELP_STRING([--with-glib],
[enable glib, Build against glib. Use this when building for HLOS systems which use glib]))
diff --git a/qahw/inc/qahw.h b/qahw/inc/qahw.h
index 5020c8f..dd920e2 100644
--- a/qahw/inc/qahw.h
+++ b/qahw/inc/qahw.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2011 The Android Open Source Project *
@@ -45,6 +45,9 @@
/* First generation of audio devices had version hardcoded to 0. all devices with
* versions < 1.0 will be considered of first generation API.
*/
+#if QAHW_V1
+#define QAHW_MODULE_API_VERSION_1_0 QAHW_MAKE_API_VERSION(1, 0)
+#endif
#define QAHW_MODULE_API_VERSION_0_0 QAHW_MAKE_API_VERSION(0, 0)
/* Minimal QTI audio HAL version supported by the audio framework */
diff --git a/qahw/inc/qahw_defs.h b/qahw/inc/qahw_defs.h
index 7d136d2..b0eb332 100644
--- a/qahw/inc/qahw_defs.h
+++ b/qahw/inc/qahw_defs.h
@@ -18,6 +18,7 @@
#include <sys/cdefs.h>
#include <stdint.h>
+#include <system/audio.h>
#ifndef QTI_AUDIO_HAL_DEFS_H
#define QTI_AUDIO_HAL_DEFS_H
@@ -171,6 +172,9 @@
#define QAHW_INPUT_FLAG_TIMESTAMP 0x80000000
#define QAHW_INPUT_FLAG_COMPRESS 0x40000000
#define QAHW_INPUT_FLAG_PASSTHROUGH 0x20000000
+#define QAHW_OUTPUT_FLAG_INCALL_MUSIC 0x80000000
+#define QAHW_AUDIO_FLAG_HPCM_TX 0x00020000
+#define QAHW_AUDIO_FLAG_HPCM_RX 0x00040000
/* Query fm volume */
#define QAHW_PARAMETER_KEY_FM_VOLUME "fm_volume"
@@ -267,6 +271,14 @@
uint32_t reserved[64]; /*reserved for future */
} qahw_in_buffer_t;
+typedef struct {
+ void *buffer; /* write buffer pointer */
+ size_t size; /* size of buffer */
+ size_t offset; /* offset in buffer from where valid byte starts */
+ int64_t *timestamp; /* timestmap */
+ qahw_meta_data_flags_t flags; /* meta data flags */
+} qahw_buffer_t;
+
#define MAX_SECTORS 8
struct qahw_source_tracking_param {
@@ -391,6 +403,42 @@
char license[QAHW_LICENCE_STR_MAX_LENGTH + 1];
} qahw_license_params_t;
+typedef struct qahw_dtmf_gen_params {
+ bool enable;
+ uint16_t low_freq;
+ uint16_t high_freq;
+ uint16_t gain;
+} qahw_dtmf_gen_params_t;
+
+enum {
+ QAHW_TTY_MODE_OFF,
+ QAHW_TTY_MODE_FULL,
+ QAHW_TTY_MODE_VCO,
+ QAHW_TTY_MODE_HCO,
+ QAHW_TTY_MODE_MAX,
+};
+
+typedef struct qahw_tty_params {
+ uint32_t mode;
+} qahw_tty_params_t;
+
+typedef enum {
+ QAHW_HPCM_TAP_POINT_RX = 1,
+ QAHW_HPCM_TAP_POINT_TX = 2,
+ QAHW_HPCM_TAP_POINT_RX_TX = 3,
+} qahw_hpcm_tap_point;
+
+typedef enum {
+ QAHW_HPCM_DIRECTION_OUT,
+ QAHW_HPCM_DIRECTION_IN,
+ QAHW_HPCM_DIRECTION_OUT_IN,
+} qahw_hpcm_direction;
+
+typedef struct qahw_hpcm_params {
+ qahw_hpcm_tap_point tap_point;
+ qahw_hpcm_direction direction;
+} qahw_hpcm_params_t;
+
typedef union {
struct qahw_source_tracking_param st_params;
struct qahw_sound_focus_param sf_params;
@@ -406,6 +454,9 @@
struct qahw_mix_matrix_params mix_matrix_params;
struct qahw_license_params license_params;
struct qahw_out_presentation_position_param pos_param;
+ struct qahw_dtmf_gen_params dtmf_gen_params;
+ struct qahw_tty_params tty_mode_params;
+ struct qahw_hpcm_params hpcm_params;
} qahw_param_payload;
typedef enum {
@@ -426,6 +477,9 @@
QAHW_PARAM_CH_MIX_MATRIX_PARAMS,
QAHW_PARAM_LICENSE_PARAMS,
QAHW_PARAM_OUT_PRESENTATION_POSITION,
+ QAHW_PARAM_DTMF_GEN,
+ QAHW_PARAM_TTY_MODE,
+ QAHW_PARAM_HPCM,
} qahw_param_id;
typedef union {
@@ -436,6 +490,94 @@
QAHW_PARAM_LOOPBACK_RENDER_WINDOW /* PARAM to set render window */
} qahw_loopback_param_id;
+/** stream direction enumeration */
+typedef enum {
+ QAHW_STREAM_INPUT,
+ QAHW_STREAM_OUTPUT,
+ QAHW_STREAM_INPUT_OUTPUT,
+} qahw_stream_direction;
+
+/** stream types */
+typedef enum {
+ QAHW_STREAM_TYPE_INVALID,
+ QAHW_AUDIO_PLAYBACK_LOW_LATENCY, /**< low latency, higher power*/
+ QAHW_AUDIO_PLAYBACK_DEEP_BUFFER, /**< low power, higher latency*/
+ QAHW_AUDIO_PLAYBACK_COMPRESSED, /**< compresssed audio*/
+ QAHW_AUDIO_PLAYBACK_VOIP, /**< pcm voip audio*/
+ QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC, /**< pcm voip audio*/
+
+ QAHW_AUDIO_CAPTURE_LOW_LATENCY, /**< low latency, higher power*/
+ QAHW_AUDIO_CAPTURE_DEEP_BUFFER, /**< low power, higher latency*/
+ QAHW_AUDIO_CAPTURE_COMPRESSED, /**< compresssed audio*/
+ QAHW_AUDIO_CAPTURE_RAW, /**< pcm no post processing*/
+ QAHW_AUDIO_CAPTURE_VOIP, /**< pcm voip audio*/
+ QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION, /**< voice activation*/
+ QAHW_AUDIO_CAPTURE_VOICE_CALL_RX, /**< incall record, downlink */
+ QAHW_AUDIO_CAPTURE_VOICE_CALL_TX, /**< incall record, uplink */
+ QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX, /**< incall record, uplink & Downlink */
+
+ QAHW_VOICE_CALL, /**< voice call */
+
+ QAHW_AUDIO_TRANSCODE, /**< audio transcode */
+ QAHW_AUDIO_HOST_PCM_TX,
+ QAHW_AUDIO_HOST_PCM_RX,
+ QAHW_AUDIO_HOST_PCM_TX_RX,
+ QAHW_AUDIO_STREAM_TYPE_MAX,
+} qahw_audio_stream_type;
+
+typedef uint32_t qahw_device_t;
+
+/**< Key value pair to identify the topology of a usecase from default */
+struct qahw_modifier_kv {
+ uint32_t key;
+ uint32_t value;
+};
+
+struct qahw_shared_attributes{
+ audio_config_t config;
+};
+struct qahw_voice_attributes{
+ audio_config_t config;
+ const char *vsid;
+};
+
+struct qahw_audio_attributes{
+ audio_config_t config;
+};
+
+typedef union {
+ struct qahw_shared_attributes shared;
+ struct qahw_voice_attributes voice;
+ struct qahw_audio_attributes audio;
+} qahw_stream_attributes_config;
+
+struct qahw_stream_attributes {
+ qahw_audio_stream_type type;
+ qahw_stream_direction direction;
+ qahw_stream_attributes_config attr;
+};
+
+typedef enum {
+ QAHW_CHANNEL_L = 0, /*left channel*/
+ QAHW_CHANNEL_R = 1, /*right channel*/
+ QAHW_CHANNELS_MAX = 2, /*max number of supported streams*/
+} qahw_channel_map;
+
+struct qahw_channel_vol {
+ qahw_channel_map channel;
+ float vol;
+};
+
+struct qahw_volume_data {
+ uint32_t num_of_channels;
+ struct qahw_channel_vol *vol_pair;
+};
+
+struct qahw_mute_data {
+ bool enable;
+ qahw_stream_direction direction;
+};
+
__END_DECLS
#endif // QTI_AUDIO_HAL_DEFS_H
diff --git a/qahw/src/qahw.c b/qahw/src/qahw.c
index ceec657..2ae6906 100644
--- a/qahw/src/qahw.c
+++ b/qahw/src/qahw.c
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -45,8 +45,13 @@
/*
* The current HAL API version.
+ * version 1.0 has support for voice only in new stream based APIS
*/
+#ifdef QAHW_MODULE_API_VERSION_1_0
+#define QAHW_MODULE_API_VERSION_CURRENT QAHW_MODULE_API_VERSION_1_0
+#else
#define QAHW_MODULE_API_VERSION_CURRENT QAHW_MODULE_API_VERSION_0_0
+#endif
typedef uint64_t (*qahwi_out_write_v2_t)(audio_stream_out_t *out, const void* buffer,
diff --git a/qahw_api/Makefile.am b/qahw_api/Makefile.am
index 38506b8..e4cbdb5 100644
--- a/qahw_api/Makefile.am
+++ b/qahw_api/Makefile.am
@@ -22,8 +22,13 @@
libqahw_la_CPPFLAGS += -std=c++11 -DHAVE_PTHREADS -DHAVE_ANDROID_OS
libqahw_la_CPPFLAGS += -DDEBUG_REFS_CALLSTACK_ENABLED=0
libqahw_la_CPPFLAGS += -DNDEBUG
-libqahw_la_LDFLAGS = -ltinyalsa -lhardware -lexpat -lcutils -llog -ldl -shared -avoid-version -lpthread -lutils
+libqahw_la_CPPFLAGS += $(GLIB_CFLAGS) -include glib.h
+libqahw_la_LDFLAGS = -ltinyalsa -lhardware -lexpat -lcutils -llog -ldl -shared -avoid-version -lpthread -lutils $(GLIB_LIBS)
if QTI_AUDIO_SERVER_ENABLED
AM_CPPFLAGS += -DQTI_AUDIO_SERVER_ENABLED
libqahw_la_LDFLAGS += -lqtiaudioserver -lbinder
endif
+if QAHW_V1
+AM_CPPFLAGS += -DQAHW_V1
+endif
+
diff --git a/qahw_api/inc/qahw_api.h b/qahw_api/inc/qahw_api.h
index b37757d..80d9c64 100644
--- a/qahw_api/inc/qahw_api.h
+++ b/qahw_api/inc/qahw_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2011 The Android Open Source Project *
@@ -485,6 +485,75 @@
void qahw_register_qas_death_notify_cb(audio_error_callback cb, void* context);
+/* updated new stream APIs to support voice and Audio use cases */
+
+int qahw_stream_open(qahw_module_handle_t *hw_module,
+ struct qahw_stream_attributes attr,
+ uint32_t num_of_devices,
+ qahw_device_t *devices,
+ uint32_t no_of_modifiers,
+ struct qahw_modifier_kv *modifiers,
+ qahw_stream_callback_t cb,
+ void *cookie,
+ qahw_stream_handle_t **stream_handle);
+
+int qahw_stream_close(qahw_stream_handle_t *stream_handle);
+
+int qahw_stream_start(qahw_stream_handle_t *stream_handle);
+
+int qahw_stream_stop(qahw_stream_handle_t *stream_handle);
+
+int qahw_stream_set_device(qahw_stream_handle_t *stream_handle,
+ uint32_t num_of_dev,
+ qahw_device_t *devices);
+
+int qahw_stream_get_device(qahw_stream_handle_t *stream_handle,
+ uint32_t *num_of_dev,
+ qahw_device_t **devices);
+
+int qahw_stream_set_volume(qahw_stream_handle_t *stream_handle,
+ struct qahw_volume_data vol_data);
+
+int qahw_stream_get_volume(qahw_stream_handle_t *stream_handle,
+ struct qahw_volume_data **vol_data);
+
+int qahw_stream_set_mute(qahw_stream_handle_t *stream_handle,
+ struct qahw_mute_data mute_data);
+
+int qahw_stream_get_mute(qahw_stream_handle_t *stream_handle,
+ struct qahw_mute_data *mute_data);
+
+ssize_t qahw_stream_read(qahw_stream_handle_t *stream_handle,
+ qahw_buffer_t *in_buf);
+
+ssize_t qahw_stream_write(qahw_stream_handle_t *stream_handle,
+ qahw_buffer_t *out_buf);
+
+int32_t qahw_stream_pause(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_standby(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_resume(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_flush(qahw_stream_handle_t *stream_handle);
+
+int32_t qahw_stream_drain(qahw_stream_handle_t *stream_handle,
+ qahw_drain_type_t type);
+
+int32_t qahw_stream_get_buffer_size(const qahw_stream_handle_t *stream_handle,
+ size_t *in_buffer, size_t *out_buffer);
+
+int32_t qahw_stream_set_buffer_size(const qahw_stream_handle_t *stream_handle,
+ size_t in_buffer, size_t out_buffer);
+
+int32_t qahw_stream_set_parameters(qahw_stream_handle_t *stream_handle,
+ uint32_t param_id,
+ qahw_param_payload *param_payload);
+
+int32_t qahw_stream_get_parameters(qahw_stream_handle_t *stream_handle,
+ uint32_t param_id,
+ qahw_param_payload *param_payload);
+
__END_DECLS
#endif // QTI_AUDIO_QAHW_API_H
diff --git a/qahw_api/inc/qahw_defs.h b/qahw_api/inc/qahw_defs.h
index 7bd5118..f979013 100644
--- a/qahw_api/inc/qahw_defs.h
+++ b/qahw_api/inc/qahw_defs.h
@@ -18,6 +18,7 @@
#include <sys/cdefs.h>
#include <stdint.h>
+#include <system/audio.h>
#ifndef QTI_AUDIO_HAL_DEFS_H
#define QTI_AUDIO_HAL_DEFS_H
@@ -171,6 +172,9 @@
#define QAHW_INPUT_FLAG_TIMESTAMP 0x80000000
#define QAHW_INPUT_FLAG_COMPRESS 0x40000000
#define QAHW_INPUT_FLAG_PASSTHROUGH 0x20000000
+#define QAHW_OUTPUT_FLAG_INCALL_MUSIC 0x80000000
+#define QAHW_AUDIO_FLAG_HPCM_TX 0x00020000
+#define QAHW_AUDIO_FLAG_HPCM_RX 0x00040000
/* Query fm volume */
#define QAHW_PARAMETER_KEY_FM_VOLUME "fm_volume"
@@ -245,6 +249,14 @@
uint32_t reserved[64]; /*reserved for future */
} qahw_in_buffer_t;
+typedef struct {
+ void *buffer; /* write buffer pointer */
+ size_t size; /* size of buffer */
+ size_t offset; /* offset in buffer from where valid byte starts */
+ int64_t *timestamp; /* timestmap */
+ qahw_meta_data_flags_t flags; /* meta data flags */
+} qahw_buffer_t;
+
#define MAX_SECTORS 8
struct qahw_source_tracking_param {
@@ -370,6 +382,42 @@
char license[QAHW_LICENCE_STR_MAX_LENGTH + 1];
} qahw_license_params_t;
+typedef struct qahw_dtmf_gen_params {
+ bool enable;
+ uint16_t low_freq;
+ uint16_t high_freq;
+ uint16_t gain;
+} qahw_dtmf_gen_params_t;
+
+enum {
+ QAHW_TTY_MODE_OFF,
+ QAHW_TTY_MODE_FULL,
+ QAHW_TTY_MODE_VCO,
+ QAHW_TTY_MODE_HCO,
+ QAHW_TTY_MODE_MAX,
+};
+
+typedef struct qahw_tty_params {
+ uint32_t mode;
+} qahw_tty_params_t;
+
+typedef enum {
+ QAHW_HPCM_TAP_POINT_RX = 1,
+ QAHW_HPCM_TAP_POINT_TX = 2,
+ QAHW_HPCM_TAP_POINT_RX_TX = 3,
+} qahw_hpcm_tap_point;
+
+typedef enum {
+ QAHW_HPCM_DIRECTION_OUT,
+ QAHW_HPCM_DIRECTION_IN,
+ QAHW_HPCM_DIRECTION_OUT_IN,
+} qahw_hpcm_direction;
+
+typedef struct qahw_hpcm_params {
+ qahw_hpcm_tap_point tap_point;
+ qahw_hpcm_direction direction;
+} qahw_hpcm_params_t;
+
typedef union {
struct qahw_source_tracking_param st_params;
struct qahw_sound_focus_param sf_params;
@@ -385,6 +433,9 @@
struct qahw_mix_matrix_params mix_matrix_params;
struct qahw_license_params license_params;
struct qahw_out_presentation_position_param pos_param;
+ struct qahw_dtmf_gen_params dtmf_gen_params;
+ struct qahw_tty_params tty_mode_params;
+ struct qahw_hpcm_params hpcm_params;
} qahw_param_payload;
typedef enum {
@@ -405,6 +456,9 @@
QAHW_PARAM_CH_MIX_MATRIX_PARAMS,
QAHW_PARAM_LICENSE_PARAMS,
QAHW_PARAM_OUT_PRESENTATION_POSITION,
+ QAHW_PARAM_DTMF_GEN,
+ QAHW_PARAM_TTY_MODE,
+ QAHW_PARAM_HPCM,
} qahw_param_id;
@@ -416,6 +470,94 @@
QAHW_PARAM_LOOPBACK_RENDER_WINDOW /* PARAM to set render window */
} qahw_loopback_param_id;
+/** stream direction enumeration */
+typedef enum {
+ QAHW_STREAM_INPUT,
+ QAHW_STREAM_OUTPUT,
+ QAHW_STREAM_INPUT_OUTPUT,
+} qahw_stream_direction;
+
+/** stream types */
+typedef enum {
+ QAHW_STREAM_TYPE_INVALID,
+ QAHW_AUDIO_PLAYBACK_LOW_LATENCY, /**< low latency, higher power*/
+ QAHW_AUDIO_PLAYBACK_DEEP_BUFFER, /**< low power, higher latency*/
+ QAHW_AUDIO_PLAYBACK_COMPRESSED, /**< compresssed audio*/
+ QAHW_AUDIO_PLAYBACK_VOIP, /**< pcm voip audio*/
+ QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC, /**< pcm voip audio*/
+
+ QAHW_AUDIO_CAPTURE_LOW_LATENCY, /**< low latency, higher power*/
+ QAHW_AUDIO_CAPTURE_DEEP_BUFFER, /**< low power, higher latency*/
+ QAHW_AUDIO_CAPTURE_COMPRESSED, /**< compresssed audio*/
+ QAHW_AUDIO_CAPTURE_RAW, /**< pcm no post processing*/
+ QAHW_AUDIO_CAPTURE_VOIP, /**< pcm voip audio*/
+ QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION, /**< voice activation*/
+ QAHW_AUDIO_CAPTURE_VOICE_CALL_RX, /**< incall record, downlink */
+ QAHW_AUDIO_CAPTURE_VOICE_CALL_TX, /**< incall record, uplink */
+ QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX, /**< incall record, uplink & Downlink */
+
+ QAHW_VOICE_CALL, /**< voice call */
+
+ QAHW_AUDIO_TRANSCODE, /**< audio transcode */
+ QAHW_AUDIO_HOST_PCM_TX,
+ QAHW_AUDIO_HOST_PCM_RX,
+ QAHW_AUDIO_HOST_PCM_TX_RX,
+ QAHW_AUDIO_STREAM_TYPE_MAX,
+} qahw_audio_stream_type;
+
+typedef uint32_t qahw_device_t;
+
+/**< Key value pair to identify the topology of a usecase from default */
+struct qahw_modifier_kv {
+ uint32_t key;
+ uint32_t value;
+};
+
+struct qahw_shared_attributes{
+ audio_config_t config;
+};
+struct qahw_voice_attributes{
+ audio_config_t config;
+ const char *vsid;
+};
+
+struct qahw_audio_attributes{
+ audio_config_t config;
+};
+
+typedef union {
+ struct qahw_shared_attributes shared;
+ struct qahw_voice_attributes voice;
+ struct qahw_audio_attributes audio;
+} qahw_stream_attributes_config;
+
+struct qahw_stream_attributes {
+ qahw_audio_stream_type type;
+ qahw_stream_direction direction;
+ qahw_stream_attributes_config attr;
+};
+
+typedef enum {
+ QAHW_CHANNEL_L = 0, /*left channel*/
+ QAHW_CHANNEL_R = 1, /*right channel*/
+ QAHW_CHANNELS_MAX = 2, /*max number of supported streams*/
+} qahw_channel_map;
+
+struct qahw_channel_vol {
+ qahw_channel_map channel;
+ float vol;
+};
+
+struct qahw_volume_data {
+ uint32_t num_of_channels;
+ struct qahw_channel_vol *vol_pair;
+};
+
+struct qahw_mute_data {
+ bool enable;
+ qahw_stream_direction direction;
+};
+
__END_DECLS
#endif // QTI_AUDIO_HAL_DEFS_H
diff --git a/qahw_api/src/qahw_api.cpp b/qahw_api/src/qahw_api.cpp
index 0810ede..07d2678 100644
--- a/qahw_api/src/qahw_api.cpp
+++ b/qahw_api/src/qahw_api.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -37,11 +37,99 @@
#include <stdlib.h>
#include <cutils/list.h>
#include <assert.h>
+#include <string.h>
#include <hardware/audio.h>
#include <cutils/properties.h>
#include "qahw_api.h"
#include "qahw.h"
+#include <errno.h>
+
+#ifndef ANDROID
+#define strlcpy g_strlcpy
+#define strlcat g_strlcat
+#endif
+
+#if QAHW_V1
+#define QAHW_DEV_ROUTE_LENGTH 15
+#define QAHW_KV_PAIR_LENGTH 255
+#define QAHW_NUM_OF_ROUTINGS 4
+#define QAHW_NUM_OF_SESSIONS 4
+#define QAHW_NAMES_PER_SESSION 2
+#define QAHW_SESSION_NAME_MAX_LEN 255
+#define QAHW_MAX_INT_STRING 12
+#define QAHW_NUM_OF_MUTE_TYPES 4
+
+#define MAX_NUM_DEVICES 10
+
+typedef struct {
+ qahw_stream_handle_t *out_stream;
+ qahw_stream_handle_t *in_stream;
+ qahw_module_handle_t *hw_module;
+ uint32_t num_of_devices;
+ audio_devices_t devices[MAX_NUM_DEVICES];
+ qahw_stream_direction dir;
+ qahw_audio_stream_type type;
+ struct qahw_volume_data vol;
+ struct qahw_mute_data out_mute;
+ struct qahw_mute_data in_mute;
+} qahw_api_stream_t;
+
+/* Array to store sound devices */
+static const char * const stream_name_map[QAHW_AUDIO_STREAM_TYPE_MAX] = {
+ [QAHW_STREAM_TYPE_INVALID] = "",
+ [QAHW_AUDIO_PLAYBACK_LOW_LATENCY]= "playback-low-latency",
+ [QAHW_AUDIO_PLAYBACK_DEEP_BUFFER]= "playback-deep-buffer",
+ [QAHW_AUDIO_PLAYBACK_COMPRESSED]= "playback-compressed",
+ [QAHW_AUDIO_PLAYBACK_VOIP]= "playback-voip",
+ [QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC]= "playback-in-call-music",
+ [QAHW_AUDIO_CAPTURE_LOW_LATENCY]= "capture-low-latency",
+ [QAHW_AUDIO_CAPTURE_DEEP_BUFFER]= "capture-deep-buffer",
+ [QAHW_AUDIO_CAPTURE_COMPRESSED]= "capture-compressed",
+ [QAHW_AUDIO_CAPTURE_RAW]= "capture-raw",
+ [QAHW_AUDIO_CAPTURE_VOIP]= "capture-voip",
+ [QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION]= "capture-voice-activation",
+ [QAHW_AUDIO_CAPTURE_VOICE_CALL_RX]= "capture-voice-rx",
+ [QAHW_AUDIO_CAPTURE_VOICE_CALL_TX]= "capture-voice-tx",
+ [QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX]= "capture-voice-rx-tx",
+ [QAHW_VOICE_CALL]= "voice-call",
+ [QAHW_AUDIO_TRANSCODE]= "audio-transcode",
+ [QAHW_AUDIO_HOST_PCM_TX]= "host-pcm-tx",
+ [QAHW_AUDIO_HOST_PCM_RX]= "host-pcm-rx",
+ [QAHW_AUDIO_HOST_PCM_TX_RX]= "host-pcm-tx-rx",
+};
+
+static const char * const tty_mode_map[QAHW_TTY_MODE_MAX] = {
+ [QAHW_TTY_MODE_OFF] = "tty_mode=tty_off",
+ [QAHW_TTY_MODE_FULL] = "tty_mode=tty_full",
+ [QAHW_TTY_MODE_VCO] = "tty_mode=tty_vco",
+ [QAHW_TTY_MODE_HCO] = "tty_mode=tty_hco",
+};
+
+typedef struct {
+ char sess_id[QAHW_NAMES_PER_SESSION][QAHW_SESSION_NAME_MAX_LEN + 1];
+ char sess_id_call_state[QAHW_KV_PAIR_LENGTH];
+} session_info_t;
+
+static session_info_t session_info[QAHW_NUM_OF_SESSIONS] = {
+ {{"default mmodevoice1", "11C05000"}, "vsid=297816064;call_state=2"},
+ {{"default mmodevoice2", "11DC5000"}, "vsid=299651072;call_state=2"},
+ {{"default modem voice", "10C01000"}, "vsid=281022464;call_state=2"},
+ {{"default volte voice", "10C02000"}, "vsid=281026560;call_state=2"}
+};
+
+typedef struct {
+ struct qahw_mute_data mute;
+ char mute_state[QAHW_KV_PAIR_LENGTH];
+} qahw_mute_info_t;
+
+static qahw_mute_info_t mute_info[QAHW_NUM_OF_MUTE_TYPES] = {
+ {{1, QAHW_STREAM_INPUT}, "device_mute=true;direction=tx" },
+ {{0, QAHW_STREAM_INPUT}, "device_mute=false;direction=tx" },
+ {{1, QAHW_STREAM_OUTPUT}, "device_mute=true;direction=rx" },
+ {{0, QAHW_STREAM_OUTPUT}, "device_mute=false;direction=rx" },
+};
+#endif
#if QTI_AUDIO_SERVER_ENABLED
#include <mm-audio/qti-audio-server/qti_audio_server.h>
@@ -1580,8 +1668,10 @@
int qahw_init_check(const qahw_module_handle_t *hw_module)
{
- ALOGV("%d:%s",__LINE__, __func__);
- return qahw_init_check_l(hw_module);
+ ALOGV("%d:%s start",__LINE__, __func__);
+ int rc = qahw_init_check_l(hw_module);
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
}
int qahw_set_voice_volume(qahw_module_handle_t *hw_module, float volume)
@@ -1814,7 +1904,1104 @@
qahw_module_handle_t *qahw_load_module(const char *hw_module_id)
{
- ALOGV("%d:%s",__LINE__, __func__);
- return qahw_load_module_l(hw_module_id);
+ ALOGV("%d:%s start",__LINE__, __func__);
+ qahw_module_handle_t *module = qahw_load_module_l(hw_module_id);
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return module;
}
+
+#if QAHW_V1
+char * qahw_get_session_id(const char* vsid)
+{
+ int i = 0;
+ int j = 0;
+ char *ret = "vsid=281022464;call_state=2";
+
+ for(i = 0; i < QAHW_NUM_OF_SESSIONS; i++) {
+ for(j = 0; j < QAHW_NAMES_PER_SESSION; j++) {
+ if(!strcmp(vsid,session_info[i].sess_id[j])) {
+ ret = session_info[i].sess_id_call_state;
+ ALOGV("%s: vsid %s\n", __func__, vsid);
+ break;
+ }
+ }
+ }
+ ALOGV("%s: sess_id_call_state %s\n", __func__, ret);
+ return ret;
+}
+
+int qahw_add_flags_source(struct qahw_stream_attributes attr,
+ int *flags, audio_source_t *source) {
+ int rc = 0;
+ /*default source */
+ if (source && flags) {
+ *source = AUDIO_SOURCE_MIC;
+ /*default flag*/
+ *flags = 0;
+ } else
+ return -EINVAL;
+
+ switch (attr.type) {
+ case QAHW_AUDIO_PLAYBACK_LOW_LATENCY:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_PLAYBACK_DEEP_BUFFER:
+ *flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
+ break;
+ case QAHW_AUDIO_PLAYBACK_COMPRESSED:
+ *flags = AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
+ break;
+ case QAHW_AUDIO_PLAYBACK_VOIP:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC:
+ *flags = QAHW_OUTPUT_FLAG_INCALL_MUSIC;
+ break;
+ case QAHW_AUDIO_CAPTURE_LOW_LATENCY:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_CAPTURE_DEEP_BUFFER:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_CAPTURE_COMPRESSED:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_CAPTURE_RAW:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_CAPTURE_VOIP:
+ break;
+ case QAHW_AUDIO_CAPTURE_VOICE_ACTIVATION:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_CAPTURE_VOICE_CALL_RX:
+ *source = AUDIO_SOURCE_VOICE_DOWNLINK;
+ break;
+ case QAHW_AUDIO_CAPTURE_VOICE_CALL_TX:
+ *source = AUDIO_SOURCE_VOICE_UPLINK;
+ break;
+ case QAHW_AUDIO_CAPTURE_VOICE_CALL_RX_TX:
+ /*unsupported */
+ break;
+ case QAHW_VOICE_CALL:
+ *flags = AUDIO_OUTPUT_FLAG_PRIMARY;
+ break;
+ case QAHW_AUDIO_TRANSCODE:
+ /*TODO*/
+ break;
+ case QAHW_AUDIO_HOST_PCM_TX:
+ *flags = QAHW_AUDIO_FLAG_HPCM_TX;
+ break;
+ case QAHW_AUDIO_HOST_PCM_RX:
+ *flags = QAHW_AUDIO_FLAG_HPCM_RX;
+ break;
+ case QAHW_AUDIO_HOST_PCM_TX_RX:
+ /*TODO*/
+ break;
+ default:
+ rc = -EINVAL;
+ break;
+ }
+
+ return rc;
+}
+
+int qahw_stream_open(qahw_module_handle_t *hw_module,
+ struct qahw_stream_attributes attr,
+ uint32_t num_of_devices,
+ qahw_device_t *devices,
+ uint32_t no_of_modifiers,
+ struct qahw_modifier_kv *modifiers,
+ qahw_stream_callback_t cb,
+ void *cookie,
+ qahw_stream_handle_t **stream_handle) {
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ audio_io_handle_t handle = 0x999;
+ int rc = -EINVAL;
+ const char *address = stream_name_map[attr.type];
+ const char *session_id;
+ int flags = 0;
+ audio_source_t source = AUDIO_SOURCE_MIC;
+ qahw_api_stream_t *stream;
+ struct qahw_channel_vol *vols;
+
+ /* validate number of devices */
+ if (num_of_devices > MAX_NUM_DEVICES)
+ {
+ ALOGE("%s: invalid number of devices for stream", __func__);
+ return rc;
+ }
+ /* validate direction for voice stream */
+ if (attr.type == QAHW_VOICE_CALL &&
+ attr.direction != QAHW_STREAM_INPUT_OUTPUT) {
+ ALOGE("%s: invalid direction for a voice stream", __func__);
+ return rc;
+ }
+ /* add flag*/
+ rc = qahw_add_flags_source(attr, &flags, &source);
+
+ if (rc) {
+ ALOGE("%s: invalid type %d", __func__, attr.type);
+ return rc;
+ }
+
+ stream = (qahw_api_stream_t *)calloc(1, sizeof(qahw_api_stream_t));
+ if (!stream) {
+ ALOGE("%s: stream allocation failed ", __func__);
+ return -ENOMEM;
+ }
+ vols = (struct qahw_channel_vol *)
+ calloc(1, sizeof(struct qahw_channel_vol)*QAHW_CHANNELS_MAX);
+ if (!vols) {
+ ALOGE("%s: vol allocation failed ", __func__);
+ return -ENOMEM;
+ }
+
+ memset(stream, 0, sizeof(qahw_api_stream_t));
+ memset(vols, 0, sizeof(struct qahw_channel_vol)*QAHW_CHANNELS_MAX);
+ stream->dir = attr.direction;
+ stream->hw_module = hw_module;
+ stream->num_of_devices = num_of_devices;
+ memset(&stream->devices[0], 0, sizeof(stream->devices));
+ memcpy(&stream->devices[0], devices, num_of_devices);
+ stream->type = attr.type;
+ stream->vol.vol_pair = vols;
+ /* if voice call stream, num_of_channels set to 1 */
+ if (attr.type == QAHW_VOICE_CALL)
+ stream->vol.num_of_channels = 1;
+ else
+ stream->vol.num_of_channels = QAHW_CHANNELS_MAX;
+
+ switch (attr.direction) {
+ case QAHW_STREAM_INPUT_OUTPUT:
+ /*for now only support one stream to one device*/
+ if (num_of_devices != 2 && attr.type != QAHW_VOICE_CALL) {
+ ALOGE("%s: invalid num of streams %d for dir %d",
+ __func__, num_of_devices, attr.direction);
+ return rc;
+ }
+ rc = qahw_open_output_stream(hw_module, handle, devices[0],
+ (audio_output_flags_t)flags,
+ &(attr.attr.shared.config),
+ &stream->out_stream,
+ address);
+ /*set cb function */
+ if (rc)
+ rc = qahw_out_set_callback(stream->out_stream, cb, cookie);
+ if (rc)
+ ALOGE("%s: setting callback failed %d \n", __func__, rc);
+
+ if (attr.type != QAHW_VOICE_CALL) {
+ rc = qahw_open_input_stream(hw_module, handle, devices[1],
+ &(attr.attr.shared.config),
+ &stream->in_stream,
+ (audio_input_flags_t)flags,
+ address,
+ source);
+ }
+ break;
+ case QAHW_STREAM_OUTPUT:
+ if (num_of_devices != 1) {
+ ALOGE("%s: invalid num of streams %d for dir %d",
+ __func__, num_of_devices, attr.direction);
+ return rc;
+ }
+ rc = qahw_open_output_stream(hw_module, handle, devices[0],
+ (audio_output_flags_t)flags,
+ &(attr.attr.shared.config),
+ &stream->out_stream,
+ address);
+ /*set cb function */
+ if (rc)
+ rc = qahw_out_set_callback(stream->out_stream, cb, cookie);
+ if (rc)
+ ALOGE("%s: setting callback failed %d \n", __func__, rc);
+ break;
+ case QAHW_STREAM_INPUT:
+ if (num_of_devices != 1) {
+ ALOGE("%s: invalid num of streams %d for dir %d",
+ __func__, num_of_devices, attr.direction);
+ return rc;
+ }
+ rc = qahw_open_input_stream(hw_module, handle, devices[0],
+ &(attr.attr.shared.config),
+ &stream->in_stream,
+ (audio_input_flags_t)flags,
+ address,
+ source);
+ break;
+ default:
+ ALOGE("%s: invalid stream direction %d ", __func__, attr.direction);
+ return rc;
+ }
+ /*set the stream type as the handle add to list*/
+ *stream_handle = (qahw_stream_handle_t *)stream;
+
+ /*if voice call set vsid and call state/mode*/
+ if (attr.type == QAHW_VOICE_CALL) {
+ session_id = qahw_get_session_id(attr.attr.voice.vsid);
+
+ rc = qahw_set_parameters(hw_module, session_id);
+ if (rc) {
+ ALOGE("%s: setting vsid failed %d \n", __func__, rc);
+ }
+ }
+
+ if(no_of_modifiers){
+ ALOGE("%s: modifiers not currently supported\n", __func__);
+ }
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_close(qahw_stream_handle_t *stream_handle) {
+ int rc = -EINVAL;
+ qahw_stream_direction dir;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ if (stream) {
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ ALOGV("%s: closing output stream\n", __func__);
+ rc = qahw_close_output_stream(stream->out_stream);
+ break;
+ case QAHW_STREAM_INPUT:
+ ALOGV("%s: closing input stream\n", __func__);
+ rc = qahw_close_input_stream(stream->in_stream);
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ rc = qahw_close_output_stream(stream->out_stream);
+ if (rc)
+ ALOGE("%s: closing output stream failed\n", __func__);
+ /*if not voice call close input stream*/
+ if (stream->type != QAHW_VOICE_CALL) {
+ rc = qahw_close_input_stream(stream->in_stream);
+ if (rc)
+ ALOGE("%s: closing output stream failed\n", __func__);
+ }
+ break;
+ default:
+ ALOGE("%s: invalid dir close failed\n", __func__);
+ }
+ } else
+ ALOGE("%s: null stream handle\n", __func__);
+
+ free(stream->vol.vol_pair);
+ free(stream);
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_start(qahw_stream_handle_t *stream_handle) {
+ int rc = -EINVAL;
+ qahw_audio_stream_type type;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ if (!stream) {
+ ALOGE("%d:%s invalid stream handle", __LINE__, __func__);
+ return rc;
+ }
+ /*set call state and call mode for voice */
+ if (stream->type == QAHW_VOICE_CALL) {
+ rc = qahw_set_mode(stream->hw_module, AUDIO_MODE_IN_CALL);
+ }
+
+ qahw_stream_set_device(stream, stream->num_of_devices, stream->devices);
+ memset(&devices[0], 0, sizeof(devices));
+ memcpy(&devices[0], &stream->devices[0], stream->num_of_devices);
+ qahw_stream_set_device(stream, stream->num_of_devices, &devices[0]);
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_stop(qahw_stream_handle_t *stream_handle) {
+ int rc = -EINVAL;
+ qahw_audio_stream_type type;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ /*reset call state and call mode for voice */
+ if (stream->type == QAHW_VOICE_CALL) {
+ rc = qahw_set_parameters(stream->hw_module, "call_state=1");
+ rc = qahw_set_mode(stream->hw_module, AUDIO_MODE_NORMAL);
+ }
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_set_device(qahw_stream_handle_t *stream_handle,
+ uint32_t num_of_devices,
+ qahw_device_t *devices) {
+ int rc = -EINVAL;
+ char dev_s[QAHW_MAX_INT_STRING];
+ char device_route[QAHW_MAX_INT_STRING];
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ bool is_voice = false;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ strlcpy(device_route, "routing=", QAHW_MAX_INT_STRING);
+
+ if (stream && num_of_devices && devices) {
+ if (stream->type == QAHW_VOICE_CALL)
+ is_voice = true;
+
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ if (num_of_devices != 1 || !devices) {
+ ALOGE("%s: invalid device params\n", __func__);
+ return rc;
+ }
+
+ snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[0]);
+ strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+ rc = qahw_out_set_parameters(stream->out_stream,
+ device_route);
+ break;
+ case QAHW_STREAM_INPUT:
+ if (num_of_devices != 1 || !devices) {
+ ALOGE("%s: invalid device params\n", __func__);
+ return rc;
+ }
+
+ snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[0]);
+ strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+ rc = qahw_in_set_parameters(stream->in_stream,
+ device_route);
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ if (!devices) {
+ ALOGE("%s: invalid device params\n", __func__);
+ return rc;
+ }
+ snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[0]);
+ strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+ rc = qahw_out_set_parameters(stream->out_stream,
+ device_route);
+ if (rc)
+ ALOGE("%s: failed to set out device\n", __func__);
+ /*if not voice set input stream*/
+ if (!is_voice) {
+ strlcpy(device_route, "routing=", QAHW_MAX_INT_STRING);
+ snprintf(dev_s, QAHW_MAX_INT_STRING, "%d", devices[1]);
+ strlcat(device_route, dev_s, QAHW_MAX_INT_STRING);
+ rc = qahw_in_set_parameters(stream->in_stream,
+ device_route);
+ if (rc)
+ ALOGE("%s: failed to set in device\n", __func__);
+ }
+ break;
+ default:
+ ALOGE("%s: invalid dir close failed\n", __func__);
+ }
+ }
+
+ if (!rc)
+ {
+ stream->num_of_devices = num_of_devices;
+ memset(&stream->devices[0], 0, sizeof(stream->devices));
+ memcpy(&stream->devices[0], devices, num_of_devices);
+ }
+
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_get_device(qahw_stream_handle_t *stream_handle, uint32_t *num_of_dev,
+ qahw_device_t **devices) {
+ int rc = 0;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ if (stream && num_of_dev && devices) {
+ *num_of_dev = stream->num_of_devices;
+ *devices = stream->devices;
+ } else {
+ ALOGE("%s: invalid params\n", __func__);
+ rc = -EINVAL;
+ }
+
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_set_volume(qahw_stream_handle_t *stream_handle,
+ struct qahw_volume_data vol_data) {
+ int rc = -EINVAL;
+ qahw_audio_stream_type type;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ float left;
+ float right;
+ bool l_found = false;
+ bool r_found = false;
+ int i;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ if(stream) {
+ /*currently max 2 channels is supported */
+ if ( vol_data.num_of_channels > QAHW_CHANNELS_MAX) {
+ return -ENOTSUP;
+ }
+
+ /*set voice call vol*/
+ if (stream->type == QAHW_VOICE_CALL &&
+ (vol_data.vol_pair && (vol_data.num_of_channels == 1))) {
+ ALOGV("%s: calling voice set volume with vol value %f\n",
+ __func__, vol_data.vol_pair[0].vol);
+ rc = qahw_set_voice_volume(stream->hw_module,
+ vol_data.vol_pair[0].vol);
+ /* Voice Stream picks up only single channel */
+ stream->vol.num_of_channels = vol_data.num_of_channels;
+ stream->vol.vol_pair[0] = vol_data.vol_pair[0];
+ } /*currently HAL requires 2 channels only */
+ else if (vol_data.num_of_channels == QAHW_CHANNELS_MAX &&
+ vol_data.vol_pair) {
+ for(i=0; i < vol_data.num_of_channels; i++) {
+ if(vol_data.vol_pair[i].channel == QAHW_CHANNEL_L) {
+ left = vol_data.vol_pair[i].vol;
+ l_found = true;
+ }
+ if(vol_data.vol_pair[i].channel == QAHW_CHANNEL_R) {
+ right = vol_data.vol_pair[i].vol;
+ r_found = true;
+ }
+ }
+ if(l_found && r_found) {
+ rc = qahw_out_set_volume(stream->out_stream,
+ left, right);
+ /* Cache volume if applied successfully */
+ if (!rc) {
+ for(i=0; i < vol_data.num_of_channels; i++) {
+ stream->vol.vol_pair[i] = vol_data.vol_pair[i];
+ }
+ }
+ } else
+ ALOGE("%s: setting vol requires left and right channel vol\n",
+ __func__);
+ } else {
+ ALOGE("%s: invalid input \n", __func__);
+ }
+ } else
+ ALOGE("%s: null stream handle\n", __func__);
+
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_get_volume(qahw_stream_handle_t *stream_handle,
+ struct qahw_volume_data **vol_data) {
+ int rc = 0;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ ALOGV("%d:%s start",__LINE__, __func__);
+ if (stream)
+ *vol_data = &stream->vol;
+ else
+ rc = -EINVAL;
+
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+char *qahw_get_device_mute_info(struct qahw_mute_data mute) {
+ int i = 0;
+ char *ret = NULL;
+
+ for (i=0; i < QAHW_NUM_OF_MUTE_TYPES; i++) {
+ if ((mute.enable == mute_info[i].mute.enable) &&
+ (mute.direction == mute_info[i].mute.direction)) {
+ ret = mute_info[i].mute_state;
+ break;
+ }
+ }
+ ALOGV("%s mute_state %s \n", __func__, ret == NULL ? "null" : ret);
+
+ return ret;
+}
+
+int qahw_stream_set_mute(qahw_stream_handle_t *stream_handle,
+ struct qahw_mute_data mute_data) {
+ int rc = -EINVAL;
+ qahw_module_handle_t *hw_module;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ char *mute_param;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ if(stream) {
+ mute_param = qahw_get_device_mute_info(mute_data);
+
+ if (mute_param == NULL)
+ return rc;
+
+ rc = qahw_set_parameters(stream->hw_module, mute_param);
+
+ if(!rc){
+ switch(mute_data.direction) {
+ case QAHW_STREAM_INPUT_OUTPUT:
+ stream->out_mute.enable = mute_data.enable;
+ stream->in_mute.enable = mute_data.enable;
+ break;
+ case QAHW_STREAM_OUTPUT:
+ stream->out_mute.enable = mute_data.enable;
+ break;
+ case QAHW_STREAM_INPUT:
+ stream->in_mute.enable = mute_data.enable;
+ break;
+ default:
+ ALOGE("%s: invalid dir mute failed\n", __func__);
+ break;
+ }
+ }
+ }
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_get_mute(qahw_stream_handle_t *stream_handle,
+ struct qahw_mute_data *mute_data) {
+ int rc = 0;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+ ALOGV("%d:%s start",__LINE__, __func__);
+ if(stream && mute_data){
+ switch(mute_data->direction) {
+ case QAHW_STREAM_OUTPUT:
+ mute_data->enable = stream->out_mute.enable;
+ break;
+ case QAHW_STREAM_INPUT:
+ mute_data->enable = stream->in_mute.enable;
+ break;
+ default:
+ ALOGE("%s: invalid mute dir get failed\n", __func__);
+ rc = -EINVAL;
+ break;
+ }
+ }
+
+ ALOGV("%d:%s end",__LINE__, __func__);
+ return rc;
+}
+
+ssize_t qahw_stream_read(qahw_stream_handle_t *stream_handle,
+ qahw_buffer_t *in_buf) {
+ ssize_t rc = 0;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ qahw_in_buffer_t buff;
+
+ if(in_buf) {
+ buff.buffer = in_buf->buffer;
+ buff.bytes = in_buf->size;
+ buff.offset = in_buf->offset;
+ buff.timestamp = in_buf->timestamp;
+ }
+
+ if (stream && stream->in_stream) {
+ rc = qahw_in_read(stream->in_stream, &buff);
+ } else {
+ ALOGE("%d:%s input stream invalid, read failed", __LINE__, __func__);
+ rc = -ENODEV;
+ }
+ return rc;
+}
+
+ssize_t qahw_stream_write(qahw_stream_handle_t *stream_handle,
+ qahw_buffer_t *out_buf) {
+ ssize_t rc = 0;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ qahw_out_buffer_t buff;
+
+ if(out_buf) {
+ buff.buffer = out_buf->buffer;
+ buff.bytes = out_buf->size;
+ buff.offset = out_buf->offset;
+ buff.timestamp = out_buf->timestamp;
+ buff.flags = out_buf->flags;
+ }
+
+ if (stream && stream->out_stream) {
+ rc = qahw_out_write(stream->out_stream, &buff);
+ } else {
+ ALOGE("%d:%s out stream invalid, write failed", __LINE__, __func__);
+ rc = -ENODEV;
+ }
+ return rc;
+}
+
+int qahw_stream_standby(qahw_stream_handle_t *stream_handle) {
+ int rc = -EINVAL;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ if (stream) {
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_standby(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot put in standby"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT:
+ if (stream->in_stream)
+ rc = qahw_in_standby(stream->in_stream);
+ else
+ ALOGE("%d:%s in stream invalid, cannot put in standby"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ if (stream->in_stream)
+ rc = qahw_in_standby(stream->in_stream);
+ else
+ ALOGE("%d:%s in stream invalid, cannot put in standby"
+ , __LINE__, __func__);
+ if (stream->out_stream)
+ rc = qahw_out_standby(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot put in standby"
+ , __LINE__, __func__);
+ break;
+ }
+ } else
+ ALOGE("%d:%s invalid stream handle, standby failed"
+ , __LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_pause(qahw_stream_handle_t *stream_handle) {
+ int rc = -EINVAL;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ if (stream) {
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_pause(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot put in pause"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT:
+ ALOGE("%d:%s cannot pause input stream"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_pause(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot put in pause"
+ , __LINE__, __func__);
+ break;
+ }
+ } else
+ ALOGE("%d:%s invalid stream handle, pause failed"
+ , __LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_resume(qahw_stream_handle_t *stream_handle) {
+ int rc = -EINVAL;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ if (stream) {
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_resume(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot put in resume"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT:
+ ALOGE("%d:%s cannot resume input stream"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_resume(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot put in resume"
+ , __LINE__, __func__);
+ break;
+ }
+ } else
+ ALOGE("%d:%s invalid stream handle, resume failed"
+ , __LINE__, __func__);
+ return rc;
+}
+
+int qahw_stream_flush(qahw_stream_handle_t *stream_handle) {
+ int rc = -EINVAL;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ if (stream) {
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_flush(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot flush"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT:
+ ALOGE("%d:%s cannot flush input stream"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_flush(stream->out_stream);
+ else
+ ALOGE("%d:%s out stream invalid, cannot flush"
+ , __LINE__, __func__);
+ break;
+ }
+ } else
+ ALOGE("%d:%s invalid stream handle, flush failed"
+ , __LINE__, __func__);
+ return rc;
+}
+
+int32_t qahw_stream_drain(qahw_stream_handle_t *stream_handle,
+ qahw_drain_type_t type) {
+ int rc = -EINVAL;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ if (stream) {
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_drain(stream->out_stream, type);
+ else
+ ALOGE("%d:%s out stream invalid, cannot drain"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT:
+ ALOGE("%d:%s cannot drain input stream"
+ , __LINE__, __func__);
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ if (stream->out_stream)
+ rc = qahw_out_drain(stream->out_stream, type);
+ else
+ ALOGE("%d:%s out stream invalid, cannot drain"
+ , __LINE__, __func__);
+ break;
+ }
+ } else
+ ALOGE("%d:%s invalid stream handle, drain failed"
+ , __LINE__, __func__);
+ return rc;
+}
+
+int32_t qahw_stream_get_buffer_size(const qahw_stream_handle_t *stream_handle,
+ size_t *in_buffer, size_t *out_buffer) {
+ int32_t rc = 0;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+ if (stream) {
+ switch (stream->dir) {
+ case QAHW_STREAM_OUTPUT:
+ if (stream->out_stream)
+ *out_buffer = qahw_out_get_buffer_size(stream->out_stream);
+ else {
+ ALOGE("%d:%s out stream invalid, cannot get size"
+ , __LINE__, __func__);
+ rc = -EINVAL;
+ }
+ break;
+ case QAHW_STREAM_INPUT:
+ if (stream->in_stream)
+ *in_buffer = qahw_in_get_buffer_size(stream->in_stream);
+ else {
+ ALOGE("%d:%s in stream invalid, cannot get size"
+ , __LINE__, __func__);
+ rc = -EINVAL;
+ }
+ break;
+ case QAHW_STREAM_INPUT_OUTPUT:
+ if (stream->out_stream)
+ *out_buffer = qahw_out_get_buffer_size(stream->out_stream);
+ else {
+ ALOGE("%d:%s out stream invalid, cannot get size"
+ , __LINE__, __func__);
+ rc = -EINVAL;
+ }
+ if (stream->in_stream)
+ *in_buffer = qahw_in_get_buffer_size(stream->in_stream);
+ else {
+ ALOGE("%d:%s in stream invalid, cannot get size"
+ , __LINE__, __func__);
+ rc = -EINVAL;
+ }
+ break;
+ default:
+ ALOGE("%d:%s invalid stream direction, cannot get size", __LINE__, __func__);
+ rc = -EINVAL;
+ break;
+ }
+ } else {
+ ALOGE("%d:%s invalid stream handle, get size failed failed"
+ , __LINE__, __func__);
+ rc = -EINVAL;
+ }
+ ALOGV("%d:%s inSz %d outSz %d ret 0x%8x", __LINE__, __func__, *in_buffer, *out_buffer, rc);
+ return rc;
+}
+
+int32_t qahw_stream_set_buffer_size(const qahw_stream_handle_t *stream_handle,
+ size_t in_buffer, size_t out_buffer){
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_set_dtmf_gen_params(qahw_api_stream_t *stream,
+ struct qahw_dtmf_gen_params *dtmf_params){
+ int32_t rc = -EINVAL;
+ char kv[QAHW_KV_PAIR_LENGTH];
+
+ if(stream->type == QAHW_VOICE_CALL) {
+ if(dtmf_params->enable) {
+ snprintf(kv, QAHW_KV_PAIR_LENGTH,
+ "dtmf_low_freq=%d;dtmf_high_freq=%d;dtmf_tone_gain=%d",
+ dtmf_params->low_freq,
+ dtmf_params->high_freq,
+ dtmf_params->gain);
+ ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+ } else
+ snprintf(kv, QAHW_KV_PAIR_LENGTH, "dtmf_tone_off");
+ rc = qahw_out_set_parameters(stream->out_stream,kv);
+ } else
+ ALOGE("%d:%s cannot set dtmf on non voice stream", __LINE__, __func__);
+ return rc;
+}
+
+int32_t qahw_stream_set_tty_mode_params(qahw_api_stream_t *stream,
+ struct qahw_tty_params *tty_params){
+ int32_t rc = -EINVAL;
+
+ if(stream->type == QAHW_VOICE_CALL) {
+ if(tty_params->mode >= QAHW_TTY_MODE_MAX) {
+ ALOGE("%d:%s invalid tty mode", __LINE__, __func__);
+ return rc;
+ }
+
+ ALOGV("%d:%s kv set is %s", __LINE__, __func__,
+ tty_mode_map[tty_params->mode]);
+ /*currently tty is set on the dev */
+ rc = qahw_set_parameters(stream->hw_module,
+ tty_mode_map[tty_params->mode]);
+ } else
+ ALOGE("%d:%s cannot set tty mode on non voice stream", __LINE__,
+ __func__);
+ return rc;
+}
+
+int32_t qahw_stream_set_hpcm_params(qahw_api_stream_t *stream,
+ struct qahw_hpcm_params *hpcm_params){
+ int32_t rc = -EINVAL;
+ char kv[QAHW_KV_PAIR_LENGTH];
+ int32_t tp;
+
+ if(stream->type == QAHW_VOICE_CALL) {
+ /*if rx and tx call both mixer commands */
+ if(hpcm_params->tap_point == QAHW_HPCM_TAP_POINT_RX_TX) {
+ snprintf(kv, QAHW_KV_PAIR_LENGTH,
+ "hpcm_tp=%d;hpcm_dir=%d",
+ QAHW_HPCM_TAP_POINT_RX,
+ hpcm_params->direction);
+ ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+ rc = qahw_out_set_parameters(stream->out_stream, kv);
+ if(rc) {
+ ALOGE("%d:%s failed to set hpcm on RX Path", __LINE__,
+ __func__);
+ }
+ snprintf(kv, QAHW_KV_PAIR_LENGTH,
+ "hpcm_tp=%d;hpcm_dir=%d",
+ QAHW_HPCM_TAP_POINT_TX,
+ hpcm_params->direction);
+ ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+ rc = qahw_out_set_parameters(stream->out_stream, kv);
+ if(rc) {
+ ALOGE("%d:%s failed to set hpcm on TX Path", __LINE__,
+ __func__);
+ }
+ } else {
+ snprintf(kv, QAHW_KV_PAIR_LENGTH,
+ "hpcm_tp=%d;hpcm_dir=%d",
+ hpcm_params->tap_point,
+ hpcm_params->direction);
+ ALOGV("%d:%s kv set is %s", __LINE__, __func__, kv);
+ rc = qahw_out_set_parameters(stream->out_stream, kv);
+ if(rc) {
+ ALOGE("%d:%s failed to set hpcm params", __LINE__,
+ __func__);
+ }
+ }
+ } else
+ ALOGE("%d:%s cannot set hpcm params on non voice stream",
+ __LINE__, __func__);
+ return rc;
+}
+
+int32_t qahw_stream_set_parameters(qahw_stream_handle_t *stream_handle,
+ uint32_t param_id,
+ qahw_param_payload *param_payload) {
+ int32_t rc = -EINVAL;
+ qahw_api_stream_t *stream = (qahw_api_stream_t *)stream_handle;
+
+ if(stream && param_payload) {
+ switch(param_id){
+ case QAHW_PARAM_DTMF_GEN:
+ rc = qahw_stream_set_dtmf_gen_params(stream,
+ ¶m_payload->dtmf_gen_params);
+ break;
+ case QAHW_PARAM_TTY_MODE:
+ rc = qahw_stream_set_tty_mode_params(stream,
+ ¶m_payload->tty_mode_params);
+ break;
+ case QAHW_PARAM_HPCM:
+ rc = qahw_stream_set_hpcm_params(stream,
+ ¶m_payload->hpcm_params);
+ break;
+ default:
+ ALOGE("%d:%s unsupported param id %d"
+ ,__LINE__, __func__, param_id);
+ break;
+ }
+ } else
+ ALOGE("%d:%s invalid stream handle, cannot set param"
+ , __LINE__, __func__);
+ return rc;
+}
+
+int32_t qahw_stream_get_parameters(qahw_stream_handle_t *stream_handle,
+ uint32_t param_id,
+ qahw_param_payload *param_payload) {
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+#else
+int qahw_stream_open(qahw_module_handle_t *hw_module,
+ struct qahw_stream_attributes attr,
+ uint32_t num_of_devices,
+ qahw_device_t *devices,
+ uint32_t no_of_modifiers,
+ struct qahw_modifier_kv *modifiers,
+ qahw_stream_callback_t cb,
+ void *cookie,
+ qahw_stream_handle_t **stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_close(qahw_stream_handle_t *stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_start(qahw_stream_handle_t *stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_stop(qahw_stream_handle_t *stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_set_device(qahw_stream_handle_t *stream_handle,
+ uint32_t num_of_dev,
+ qahw_device_t *devices){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_get_device(qahw_stream_handle_t *stream_handle,
+ uint32_t *num_of_dev,
+ qahw_device_t **devices){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_set_volume(qahw_stream_handle_t *stream_handle,
+ struct qahw_volume_data vol_data){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_get_volume(qahw_stream_handle_t *stream_handle,
+ struct qahw_volume_data **vol_data){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_set_mute(qahw_stream_handle_t *stream_handle,
+ struct qahw_mute_data mute_data){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int qahw_stream_get_mute(qahw_stream_handle_t *stream_handle,
+ struct qahw_mute_data *mute_data){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+ssize_t qahw_stream_read(qahw_stream_handle_t *stream_handle,
+ qahw_buffer_t *in_buf){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+ssize_t qahw_stream_write(qahw_stream_handle_t *stream_handle,
+ qahw_buffer_t *out_buf){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_pause(qahw_stream_handle_t *stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_standby(qahw_stream_handle_t *stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_resume(qahw_stream_handle_t *stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_flush(qahw_stream_handle_t *stream_handle){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_drain(qahw_stream_handle_t *stream_handle,
+ qahw_drain_type_t type){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_get_buffer_size(const qahw_stream_handle_t *stream_handle,
+ size_t *in_buffer, size_t *out_buffer){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_set_buffer_size(const qahw_stream_handle_t *stream_handle,
+ size_t in_buffer, size_t out_buffer){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_set_parameters(qahw_stream_handle_t *stream_handle,
+ uint32_t param_id,
+ qahw_param_payload *param_payload){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+
+int32_t qahw_stream_get_parameters(qahw_stream_handle_t *stream_handle,
+ uint32_t param_id,
+ qahw_param_payload *param_payload){
+ ALOGE("%s is an unsupported api", __func__);
+ return -ENOTSUP;
+}
+#endif
+
#endif
diff --git a/qahw_api/test/Makefile.am b/qahw_api/test/Makefile.am
index 40cc24a..97e7438 100644
--- a/qahw_api/test/Makefile.am
+++ b/qahw_api/test/Makefile.am
@@ -41,3 +41,27 @@
trans_loopback_test_CFLAGS = $(AM_CFLAGS) -Wno-sign-compare -Werror
trans_loopback_test_CFLAGS += $(trans_loopback_test_INCLUDES)
trans_loopback_test_LDADD = -llog -lutils ../libqahw.la -lcutils -lm
+
+if QAHW_V1
+bin_PROGRAMS += hal_voice_test
+
+VOICE_CFLAGS = -Wno-sign-compare -Werror
+VOICE_CFLAGS += -D__unused=__attribute__\(\(__unused__\)\)
+VOICE_INCLUDES = -I $(top_srcdir)/qahw_api/inc
+VOICE_INCLUDES += -I $(top_srcdir)/qahw/inc
+
+hal_voice_test_SOURCES = qahw_voice_test.c
+
+hal_voice_test_LDADD = -lutils ../libqahw.la
+AM_CFLAGS = -I $(PKG_CONFIG_SYSROOT_DIR)/usr/include/mm-audio/qahw/inc
+
+if QAP
+AM_CFLAGS += -DQAP
+AM_CFLAGS += -I ${WORKSPACE}/audio/mm-audio/qap_wrapper/inc/
+hal_voice_test_SOURCES += qap_wrapper_extn.c
+hal_voice_test_LDADD += -lqap_wrapper
+endif
+
+hal_voice_test_CFLAGS = $(VOICE_CFLAGS) $(VOICE_INCLUDES)
+hal_voice_test_CFLAGS += $(AM_CFLAGS) -DLINUX_ENABLED
+endif
diff --git a/qahw_api/test/qahw_voice_test.c b/qahw_api/test/qahw_voice_test.c
new file mode 100644
index 0000000..96da2c6
--- /dev/null
+++ b/qahw_api/test/qahw_voice_test.c
@@ -0,0 +1,675 @@
+/*
+* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* Test app for voice call */
+
+#include "qahw_voice_test.h"
+
+#define ID_RIFF 0x46464952
+#define ID_WAVE 0x45564157
+#define ID_FMT 0x20746d66
+#define ID_DATA 0x61746164
+
+#define FORMAT_PCM 1
+#define WAV_HEADER_LENGTH_MAX 128
+#define FORMAT_DESCRIPTOR_SIZE 12
+#define SUBCHUNK1_SIZE(x) ((8) + (x))
+#define SUBCHUNK2_SIZE 8
+
+voice_stream_config stream_params;
+volatile bool stop = false;
+void *context = NULL;
+
+struct wav_header {
+ uint32_t riff_id;
+ uint32_t riff_sz;
+ uint32_t riff_fmt;
+ uint32_t fmt_id;
+ uint32_t fmt_sz;
+ uint16_t audio_format;
+ uint16_t num_channels;
+ uint32_t sample_rate;
+ uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */
+ uint16_t block_align; /* num_channels * bps / 8 */
+ uint16_t bits_per_sample;
+ uint32_t data_id;
+ uint32_t data_sz;
+};
+
+static void init_stream(void) {
+ stream_params.vsid = "11C05000";
+ stream_params.qahw_mod_handle = NULL;
+ stream_params.call_length = -1; /*infinite*/
+ stream_params.multi_call = 1;
+ stream_params.output_device[0] = AUDIO_DEVICE_OUT_WIRED_HEADSET;
+ stream_params.output_device[1] = AUDIO_DEVICE_IN_BUILTIN_MIC;
+ stream_params.in_call_rec = false;
+ stream_params.in_call_playback = false;
+ stream_params.hpcm = false;
+ stream_params.hpcm_tp = 2;
+ stream_params.tp_dir = 0;
+ stream_params.rec_file = "/data/default_rec.wav";
+ stream_params.playback_file = NULL;
+ stream_params.vol = .75;
+ stream_params.mute = false;
+ stream_params.mute_dir = 0;
+ stream_params.tty_mode = 0;
+ stream_params.dtmf_gen_enable = 0;
+ stream_params.dtmf_freq_low = 697;
+ stream_params.dtmf_freq_high = 1209;
+ stream_params.dtmf_gain = 100;
+}
+
+void usage() {
+ printf(" \n Command \n");
+ printf(" \n hal_voice_test <options> - starts voice call\n");
+ printf(" \n Options\n");
+ printf(" -i --vsid <vsid> - vsid to use sim1<297816064> sim2<29965107>.\n");
+ printf(" -d --device <decimal value> - see system/media/audio/include/system/audio.h for device values\n");
+ printf(" -l --length <call length> - call length in sec.\n");
+ printf(" -m --multi_call <number of calls> - number of calls to make.\n");
+ printf(" -r --in_call_rec <filename to record to> -t - tp_dir <0 = DL, 1 = UL, 2 = BOTH >\n");
+ printf(" -p --in_call_playback <filename to play from> play audio to voice call\n");
+ printf(" -v --vol <val> - volume.\n");
+ printf(" -u --mute <dir> - <dir 0= tx, 1 = rx> .\n");
+ printf(" -c --dtmf_gen .\n");
+ printf(" -y --tty_mode - <MODE_OFF = 0, MODE_FULL = 1, MODE_VCO = 2, MODE_HCO = 3\n");
+}
+
+void stop_signal_handler(int signal __unused) {
+ stop = true;
+}
+
+static void qti_audio_server_death_notify_cb(void *ctxt __unused) {
+ fprintf(stderr, "qas died\n");
+ stop = true;
+}
+
+void *rec_start(void *thread_param) {
+ uint32_t rc = 0;
+ voice_stream_config *params = (voice_stream_config *)thread_param;
+ qahw_module_handle_t *qahw_mod_handle = params->qahw_mod_handle;
+ qahw_stream_handle_t *in_handle = NULL;
+ uint32_t num_dev = 1;
+ audio_devices_t in_device[1] = { AUDIO_DEVICE_IN_BUILTIN_MIC };
+ struct qahw_stream_attributes attr;
+ qahw_buffer_t in_buf;
+ int data_sz = 0;
+ ssize_t bytes_read = -1;
+
+ fprintf(stderr, "%s starting rec thread\n", __func__);
+ if (qahw_mod_handle == NULL) {
+ fprintf(stderr, " qahw_load_module failed\n");
+ pthread_exit(0);
+ }
+ if(params->in_call_rec) {
+ fprintf(stderr, " setting in call record params\n");
+ switch (params->tp_dir) {
+ case 0:
+ attr.type = QAHW_AUDIO_CAPTURE_VOICE_CALL_RX;
+ break;
+ case 1:
+ attr.type = QAHW_AUDIO_CAPTURE_VOICE_CALL_TX;
+ break;
+ default:
+ fprintf(stderr, " invalid tp direction");
+ pthread_exit(0);
+ break;
+ }
+ attr.attr.audio.config.sample_rate = 48000;
+ }
+ if(params->hpcm) {
+ fprintf(stderr, "setting host pcm params\n");
+ switch(params->hpcm_tp) {
+ case QAHW_HPCM_TAP_POINT_RX:
+ attr.type = QAHW_AUDIO_HOST_PCM_RX;
+ break;
+ case QAHW_HPCM_TAP_POINT_TX:
+ attr.type = QAHW_AUDIO_HOST_PCM_TX;
+ break;
+ default:
+ fprintf(stderr, "unsupported tp %d\n", params->hpcm_tp);
+ pthread_exit(0);
+ break;
+ }
+ attr.attr.audio.config.sample_rate = 8000;
+ }
+ attr.direction = QAHW_STREAM_INPUT;
+ attr.attr.audio.config.format = AUDIO_FORMAT_PCM_16_BIT;
+
+ rc = qahw_stream_open(qahw_mod_handle,
+ attr,
+ num_dev,
+ in_device,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ &(in_handle));
+ if (rc) {
+ fprintf(stderr, " open input device failed!\n");
+ pthread_exit(0);
+ }
+
+ /* Get buffer size to get upper bound on data to read from the HAL */
+ size_t buffer_size;
+ rc = qahw_stream_get_buffer_size(in_handle, &buffer_size, NULL);
+ char *buffer = (char *)calloc(1, buffer_size);
+ size_t written_size;
+ int bps = 16;
+
+ if (buffer == NULL) {
+ fprintf(stderr, "calloc failed!!, handle(%d)\n", in_handle);
+ pthread_exit(0);
+ }
+ if (params->rec_file == NULL) {
+ fprintf(stderr, "no record stream provided\n", in_handle);
+ pthread_exit(0);
+ return NULL;
+ }
+ FILE *fd = fopen(params->rec_file, "w");
+ if (fd == NULL) {
+ fprintf(stderr, "File open failed \n");
+ free(buffer);
+ pthread_exit(0);
+ }
+ struct wav_header hdr;
+ hdr.riff_id = ID_RIFF;
+ hdr.riff_sz = 0;
+ hdr.riff_fmt = ID_WAVE;
+ hdr.fmt_id = ID_FMT;
+ hdr.fmt_sz = 16;
+ hdr.audio_format = FORMAT_PCM;
+ hdr.num_channels = 1;
+ hdr.sample_rate = attr.attr.audio.config.sample_rate;
+ hdr.byte_rate = hdr.sample_rate * hdr.num_channels * (bps / 8);
+ hdr.block_align = hdr.num_channels * (bps / 8);
+ hdr.bits_per_sample = bps;
+ hdr.data_id = ID_DATA;
+ hdr.data_sz = 0;
+ fwrite(&hdr, 1, sizeof(hdr), fd);
+
+ memset(&in_buf, 0, sizeof(qahw_buffer_t));
+ fprintf(stderr, "file %s opened for write", params->rec_file);
+ while (true && !stop) {
+ in_buf.buffer = buffer;
+ in_buf.size = buffer_size;
+
+ bytes_read = qahw_stream_read(in_handle, &in_buf);
+
+ written_size = fwrite(in_buf.buffer, 1, buffer_size, fd);
+ if (written_size < buffer_size) {
+ fprintf(stderr, "Error in fwrite\n");
+ break;
+ }
+ data_sz += buffer_size;
+ }
+ fprintf(stderr, "rec ended\n");
+ /* update lengths in header */
+ hdr.data_sz = data_sz;
+ hdr.riff_sz = data_sz + 44 - 8;
+ fseek(fd, 0, SEEK_SET);
+ fwrite(&hdr, 1, sizeof(hdr), fd);
+ free(buffer);
+ fclose(fd);
+ fd = NULL;
+ fprintf(stderr, " closing input, handle(%d)", in_handle);
+
+ /* Close input stream and device. */
+ rc = qahw_stream_standby(in_handle);
+ if (rc) {
+ fprintf(stderr, "out standby failed %d, handle(%d)\n", rc, in_handle);
+ }
+
+ rc = qahw_stream_close(in_handle);
+ if (rc) {
+ fprintf(stderr, "could not close input stream %d, handle(%d)\n", rc, in_handle);
+ }
+
+ /* Print instructions to access the file.
+ * Caution: Below ADL log shouldnt be altered without notifying automation APT since it used for
+ * automation testing
+ */
+ fprintf(stderr, "\n\n ADL: The audio recording has been saved to %s. Please use adb pull to get "
+ "the file and play it using audacity. The audio data has the "
+ "following characteristics:\n Sample rate: %i\n Format: %d\n "
+ "Num channels: %i\n\n",
+ params->rec_file, attr.attr.audio.config.sample_rate, attr.attr.audio.config.format, 1);
+ pthread_exit(0);
+
+ return NULL;
+}
+
+int get_wav_header_length(FILE *file_stream) {
+ int subchunk_size = 0;
+ int wav_header_len = 0;
+
+ fseek(file_stream, 16, SEEK_SET);
+ if (fread(&subchunk_size, 4, 1, file_stream) != 1) {
+ fprintf(stderr, "Unable to read subchunk:\n");
+ exit(1);
+ }
+ if (subchunk_size < 16) {
+ fprintf(stderr, "This is not a valid wav file \n");
+ } else {
+ wav_header_len = FORMAT_DESCRIPTOR_SIZE + SUBCHUNK1_SIZE(subchunk_size) + SUBCHUNK2_SIZE;
+ }
+ return wav_header_len;
+}
+
+void *playback_start(void *thread_param) {
+ uint32_t rc = 0;
+ voice_stream_config *params = (voice_stream_config *)thread_param;
+ qahw_module_handle_t *qahw_mod_handle = params->qahw_mod_handle;
+ qahw_stream_handle_t *out_handle = NULL;
+ uint32_t num_dev = 1;
+ audio_devices_t out_device[1] = { AUDIO_DEVICE_OUT_WIRED_HEADSET };
+ struct qahw_stream_attributes attr;
+ size_t bytes_wanted = 0;
+ size_t write_length = 0;
+ size_t bytes_remaining = 0;
+ ssize_t bytes_written = 0;
+ FILE *fp = NULL;
+ size_t bytes_read = 0;
+ qahw_buffer_t out_buf;
+ char *data_ptr = NULL;
+ bool exit = false;
+ bool read_complete_file = true;
+ int wav_header_len;
+ char header[WAV_HEADER_LENGTH_MAX] = { 0 };
+
+ if (qahw_mod_handle == NULL) {
+ fprintf(stderr, " qahw_load_module failed");
+ pthread_exit(0);
+ }
+
+ attr.direction = QAHW_STREAM_OUTPUT;
+ if(params->in_call_playback) {
+ attr.type = QAHW_AUDIO_PLAYBACK_VOICE_CALL_MUSIC;
+ attr.attr.audio.config.sample_rate = 48000;
+ attr.attr.audio.config.format = AUDIO_FORMAT_PCM_16_BIT;
+ }
+ if(params->hpcm) {
+ switch(params->hpcm_tp) {
+ case QAHW_HPCM_TAP_POINT_RX:
+ attr.type = QAHW_AUDIO_HOST_PCM_RX;
+ break;
+ case QAHW_HPCM_TAP_POINT_TX:
+ attr.type = QAHW_AUDIO_HOST_PCM_TX;
+ break;
+ default:
+ fprintf(stderr, "unsupported tp %d\n", params->hpcm_tp);
+ pthread_exit(0);
+ break;
+ }
+ attr.attr.audio.config.sample_rate = 8000;
+ attr.attr.audio.config.format = AUDIO_FORMAT_PCM_16_BIT;
+ }
+
+
+ if (params->playback_file != NULL)
+ fp = fopen(params->playback_file, "r");
+ if (fp == NULL) {
+ fprintf(stderr, "failed to open file %s\n", params->playback_file);
+ pthread_exit(0);
+ }
+ /*
+ * Read the wave header
+ */
+ if ((wav_header_len = get_wav_header_length(fp)) <= 0) {
+ fprintf(stderr, "wav header length is invalid:%d\n", wav_header_len);
+ pthread_exit(0);
+ }
+ fseek(fp, 0, SEEK_SET);
+ rc = fread(header, wav_header_len, 1, fp);
+ if (rc != 1) {
+ fprintf(stderr, "Error fread failed\n");
+ pthread_exit(0);
+ }
+ if (strncmp(header, "RIFF", 4) && strncmp(header + 8, "WAVE", 4)) {;
+ fprintf(stderr, "Not a wave format\n");
+ pthread_exit(0);
+ }
+ //memcpy (&stream_info->channels, &header[22], 2);
+ memcpy(&attr.attr.audio.config.offload_info.sample_rate, &header[24], 4);
+ memcpy(&attr.attr.audio.config.offload_info.bit_width, &header[34], 2);
+ if (attr.attr.audio.config.offload_info.bit_width == 32)
+ attr.attr.audio.config.offload_info.format = AUDIO_FORMAT_PCM_32_BIT;
+ else if (attr.attr.audio.config.offload_info.bit_width == 24)
+ attr.attr.audio.config.offload_info.format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
+ else
+ attr.attr.audio.config.offload_info.format = AUDIO_FORMAT_PCM_16_BIT;
+
+ attr.attr.audio.config.sample_rate = attr.attr.audio.config.offload_info.sample_rate;
+ attr.attr.audio.config.format = attr.attr.audio.config.offload_info.format;
+
+ rc = qahw_stream_open(qahw_mod_handle,
+ attr,
+ num_dev,
+ out_device,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ &(out_handle));
+
+ if (rc) {
+ fprintf(stderr, " open output device failed!\n");
+ pthread_exit(0);
+ }
+ rc = qahw_stream_get_buffer_size(out_handle ,NULL, &bytes_wanted);
+ data_ptr = (char *)malloc(bytes_wanted);
+ if (data_ptr == NULL) {
+ fprintf(stderr, "failed to allocate data buffer\n");
+ pthread_exit(0);
+ }
+
+ while (!exit && !stop) {
+ if (!bytes_remaining) {
+ bytes_read = fread(data_ptr, 1, bytes_wanted, fp);
+ fprintf(stderr, "read bytes %zd\n", bytes_read);
+ bytes_remaining = write_length = bytes_read;
+ }
+
+ bytes_written = bytes_remaining;
+ memset(&out_buf, 0, sizeof(qahw_buffer_t));
+ out_buf.buffer = data_ptr;
+ out_buf.size = bytes_remaining;
+ bytes_written = qahw_stream_write(out_handle, &out_buf);
+ if (bytes_written <= 0) {
+ fprintf(stderr, "write end %d", bytes_written);
+ exit = true;
+ continue;
+ }
+ bytes_remaining -= bytes_written;
+ }
+
+ fclose(fp);
+ if (data_ptr)
+ free(data_ptr);
+
+ qahw_stream_close(out_handle);
+
+ return NULL;
+}
+
+int main(int argc, char *argv[]) {
+
+ uint32_t rc = 0;
+ int opt = 0;
+ int option_index = 0;
+ qahw_stream_direction dir;
+ int call_count = 0;
+ int call_lenght = 0;
+ pthread_t tid_rec;
+ pthread_t tid_pb;
+
+ init_stream();
+
+ struct option long_options[] = {
+ /* These options set a flag. */
+ { "vsid", required_argument, 0, 'i' },
+ { "device", required_argument, 0, 'd' },
+ { "call_length", required_argument, 0, 'l' },
+ { "help", no_argument, 0, 'h' },
+ { "in_call_playback", required_argument, 0, 'p' },
+ { "in_call_rec", required_argument, 0, 'r' },
+ { "host_pcm", no_argument, 0, 'b' },
+ { "tp_dir", required_argument, 0, 't' },
+ { "file", required_argument, 0, 'f' },
+ { "hpcm_tp", required_argument, 0, 'a' },
+ { "vol", required_argument, 0, 'v' },
+ { "mute", required_argument, 0, 'u' },
+ { "tty_mode", required_argument, 0, 'y' },
+ { "dtmf_gen", no_argument, 0, 'c' },
+ { 0, 0, 0, 0 }
+ };
+
+ while ((opt = getopt_long(argc,
+ argv,
+ "-v:d:l:m:p:r:t:f:a:b:h:i:u:y:c:",
+ long_options,
+ &option_index)) != -1) {
+
+ fprintf(stderr, "for argument %c, value is %s\n", opt, optarg);
+
+ switch (opt) {
+ case 'i':
+ stream_params.vsid = optarg;
+ break;
+ case 'd':
+ stream_params.output_device[0] = atoll(optarg);
+ break;
+ case 'l':
+ stream_params.call_length = atoll(optarg);
+ break;
+ case 'm':
+ stream_params.multi_call = atoll(optarg);
+ break;
+ case 'p':
+ stream_params.in_call_playback = true;
+ stream_params.playback_file = optarg;
+ break;
+ case 'r':
+ stream_params.in_call_rec = true;
+ stream_params.rec_file = optarg;
+ break;
+ case 'b':
+ stream_params.hpcm = true;
+ break;
+ case 'f':
+ stream_params.playback_file = optarg;
+ break;
+ case 't':
+ stream_params.tp_dir = atoll(optarg);
+ break;
+ case 'a':
+ stream_params.hpcm_tp = atoll(optarg);
+ break;
+ case 'v':
+ stream_params.vol = atof(optarg);
+ break;
+ case 'u':
+ stream_params.mute_dir = atoll(optarg);
+ stream_params.mute = true;
+ break;
+ case 'y':
+ stream_params.tty_mode = atoll(optarg);
+ break;
+ case 'c':
+ stream_params.dtmf_gen_enable = true;
+ break;
+ case 'h':
+ default:
+ usage();
+ return 0;
+ }
+ }
+
+ /* Register the SIGINT to close the App properly */
+ if (signal(SIGINT, stop_signal_handler) == SIG_ERR)
+ fprintf(stderr, "Failed to register SIGINT:%d\n", errno);
+
+ /* Register the SIGTERM to close the App properly */
+ if (signal(SIGTERM, stop_signal_handler) == SIG_ERR)
+ fprintf(stderr, "Failed to register SIGTERM:%d\n", errno);
+
+ qahw_register_qas_death_notify_cb((audio_error_callback)qti_audio_server_death_notify_cb, context);
+
+ fprintf(stderr, "starting voice call\n");
+ if ((stream_params.qahw_mod_handle = qahw_load_module(QAHW_MODULE_ID_PRIMARY)) == NULL) {
+ fprintf(stderr, "failure in Loading primary HAL\n");
+ goto exit;
+ }
+
+ struct qahw_stream_attributes attr;
+
+ attr.type = QAHW_VOICE_CALL;
+ attr.direction = QAHW_STREAM_INPUT_OUTPUT;
+ attr.attr.voice.vsid = stream_params.vsid;
+ stream_params.out_voice_handle = NULL;
+
+ fprintf(stderr, "vsid is %s device is %d \n", attr.attr.voice.vsid, stream_params.output_device[0]);
+ rc = qahw_stream_open(stream_params.qahw_mod_handle,
+ attr,
+ 1,
+ stream_params.output_device,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ &(stream_params.out_voice_handle));
+ if (rc) {
+ fprintf(stderr, "Could not open output stream.\n");
+ goto unload;
+ }
+ /*set tty mode if needed*/
+ if(stream_params.tty_mode) {
+ qahw_param_payload tty;
+ tty.tty_mode_params.mode = stream_params.tty_mode;
+ rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+ QAHW_PARAM_TTY_MODE, &tty);
+ }
+ while (stream_params.multi_call) {
+ call_count++;
+ rc = qahw_stream_start(stream_params.out_voice_handle);
+
+ if (rc) {
+ fprintf(stderr, "Could not start voice stream.\n");
+ goto close_stream;
+ }
+ fprintf(stderr, "started voice call %d\n", call_count);
+ /*set volume */
+ struct qahw_volume_data vol;
+ struct qahw_channel_vol vol_pair;
+
+ vol_pair.channel = QAHW_CHANNEL_L;
+ vol_pair.vol = stream_params.vol;
+ vol.num_of_channels = 1;
+ vol.vol_pair = &vol_pair;
+
+ rc = qahw_stream_set_volume(stream_params.out_voice_handle, vol);
+ if(rc){
+ fprintf(stderr, "set vol failed rc %d!\n", rc);
+ }
+ call_lenght = stream_params.call_length;
+ if (stream_params.in_call_rec) {
+ fprintf(stderr, "\n Create %s in call record thread \n");
+ rc = pthread_create(&tid_rec, NULL, rec_start, (void *)&stream_params);
+ if (rc) {
+ fprintf(stderr, "in call rec thread creation failed %d\n");
+ }
+ }
+ if (stream_params.in_call_playback) {
+ fprintf(stderr, "\n Create %s incall playback thread \n");
+ rc = pthread_create(&tid_pb, NULL, playback_start, (void *)&stream_params);
+ if (rc) {
+ fprintf(stderr, "in call playback thread creation failed %d\n");
+ }
+ }
+ if(stream_params.mute) {
+ struct qahw_mute_data mute;
+ mute.enable = true;
+ mute.direction = stream_params.mute_dir;
+ rc = qahw_stream_set_mute(stream_params.out_voice_handle, mute);
+ }
+ if(stream_params.dtmf_gen_enable) {
+ qahw_param_payload dtmf;
+ dtmf.dtmf_gen_params.low_freq = stream_params.dtmf_freq_low;
+ dtmf.dtmf_gen_params.high_freq = stream_params.dtmf_freq_high;
+ dtmf.dtmf_gen_params.gain = stream_params.dtmf_gain;
+ dtmf.dtmf_gen_params.enable = true;
+ rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+ QAHW_PARAM_DTMF_GEN, &dtmf);
+ /*let play for 50 ms*/
+ usleep(50000000);
+ dtmf.dtmf_gen_params.enable = false;
+ rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+ QAHW_PARAM_DTMF_GEN, &dtmf);
+
+ }
+ /*setup hpcm if needed*/
+ if(stream_params.hpcm) {
+ fprintf(stderr, "calling hpcm set param.\n");
+ qahw_param_payload hpcm;
+ hpcm.hpcm_params.tap_point = stream_params.hpcm_tp;
+ hpcm.hpcm_params.direction = stream_params.tp_dir;
+ rc = qahw_stream_set_parameters(stream_params.out_voice_handle,
+ QAHW_PARAM_HPCM, &hpcm);
+
+ switch(stream_params.tp_dir) {
+ case QAHW_HPCM_DIRECTION_OUT:
+ fprintf(stderr, "\n Create %s hpcm playback thread \n");
+ rc = pthread_create(&tid_pb, NULL, playback_start,
+ (void *)&stream_params);
+ break;
+ case QAHW_HPCM_DIRECTION_IN:
+ fprintf(stderr, "\n Create %s hpcm record thread \n");
+ rc = pthread_create(&tid_rec, NULL, rec_start,
+ (void *)&stream_params);
+ break;
+ case QAHW_HPCM_DIRECTION_OUT_IN:
+ fprintf(stderr, "\n Create %s hpcm record thread \n");
+ rc = pthread_create(&tid_rec, NULL, rec_start,
+ (void *)&stream_params);
+ fprintf(stderr, "\n Create %s hpcm playback thread \n");
+ rc = pthread_create(&tid_pb, NULL, playback_start,
+ (void *)&stream_params);
+ break;
+ default:
+ fprintf(stderr, "\n invalid HPCM direction \n");
+ break;
+ }
+ }
+ while (call_lenght) {
+ usleep(1000000);
+ call_lenght--;
+ }
+ stop = true;
+ fprintf(stderr, "stoping call %d\n", call_count);
+ rc = qahw_stream_stop(stream_params.out_voice_handle);
+ stream_params.multi_call--;
+ /*let session stop*/
+ usleep(100000);
+ }
+
+ close_stream:
+ fprintf(stderr, "closing voice stream\n");
+ rc = qahw_stream_close(stream_params.out_voice_handle);
+
+ unload:
+ fprintf(stderr, "unloading hal\n");
+ if (qahw_unload_module(stream_params.qahw_mod_handle) < 0) {
+ fprintf(stderr, "failure in Un Loading primary HAL\n");
+ return -1;
+ }
+ fprintf(stderr, "voice test ended\n");
+ exit:
+ return 0;
+}
diff --git a/qahw_api/test/qahw_voice_test.h b/qahw_api/test/qahw_voice_test.h
new file mode 100644
index 0000000..bb14094
--- /dev/null
+++ b/qahw_api/test/qahw_voice_test.h
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* Test app for voice call */
+
+#ifndef QAHW_VOICE_TEST_H
+#define QAHW_VOICE_TEST_H
+
+#include <getopt.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <signal.h>
+#include <cutils/str_parms.h>
+#include <tinyalsa/asoundlib.h>
+#include "qahw_api.h"
+#include "qahw_defs.h"
+
+#define MAX_VOICE_TEST_DEVICES 2
+
+typedef struct {
+ qahw_module_handle_t *qahw_mod_handle;
+ qahw_stream_handle_t *out_voice_handle;
+ char* vsid;
+ audio_devices_t output_device[MAX_VOICE_TEST_DEVICES];
+ uint32_t call_length; /*sec*/
+ int multi_call; /*number of calls to make */
+ qahw_module_handle_t *out_handle;
+ bool in_call_rec;
+ bool in_call_playback;
+ bool hpcm;
+ int hpcm_tp;
+ int tp_dir;
+ char* rec_file;
+ char* playback_file;
+ float vol;
+ bool mute;
+ int mute_dir;
+ int tty_mode;
+ int dtmf_gen_enable;
+ int dtmf_freq_low;
+ int dtmf_freq_high;
+ int dtmf_gain;
+}voice_stream_config;
+
+#endif /* QAHW_VOICE_TEST_H */