Merge "mm-audio: add amrwb component"
diff --git a/Android.mk b/Android.mk
index 273c9cb..42f202b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -16,6 +16,7 @@
include $(MY_LOCAL_PATH)/visualizer/Android.mk
include $(MY_LOCAL_PATH)/audiod/Android.mk
include $(MY_LOCAL_PATH)/post_proc/Android.mk
+include $(MY_LOCAL_PATH)/qahw_api/Android.mk
endif
endif
diff --git a/configs/msm8937/audio_policy_configuration.xml b/configs/msm8937/audio_policy_configuration.xml
index 2443d13..44abe28 100644
--- a/configs/msm8937/audio_policy_configuration.xml
+++ b/configs/msm8937/audio_policy_configuration.xml
@@ -81,13 +81,13 @@
<mixPort name="direct_pcm" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
</mixPort>
<mixPort name="compressed_offload" role="source"
diff --git a/configs/msm8937/msm8937.mk b/configs/msm8937/msm8937.mk
index 735aa35..b7a7a39 100644
--- a/configs/msm8937/msm8937.mk
+++ b/configs/msm8937/msm8937.mk
@@ -41,12 +41,12 @@
AUDIO_FEATURE_ENABLED_DTS_EAGLE := false
BOARD_USES_SRS_TRUEMEDIA := true
DTS_CODEC_M_ := true
-AUDIO_FEATURE_ENABLED_DEV_ARBI := true
+AUDIO_FEATURE_ENABLED_DEV_ARBI := false
MM_AUDIO_ENABLED_FTM := true
MM_AUDIO_ENABLED_SAFX := true
TARGET_USES_QCOM_MM_AUDIO := true
AUDIO_FEATURE_ENABLED_HW_ACCELERATED_EFFECTS := false
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
AUDIO_FEATURE_ENABLED_SOURCE_TRACKING := true
AUDIO_FEATURE_ENABLED_AUDIOSPHERE := true
##AUDIO_FEATURE_FLAGS
diff --git a/configs/msm8937/sound_trigger_mixer_paths.xml b/configs/msm8937/sound_trigger_mixer_paths.xml
index bbec875..a2ea69e 100644
--- a/configs/msm8937/sound_trigger_mixer_paths.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved. -->
+<!--- Copyright (c) 2014, 2016, 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 -->
@@ -28,48 +28,70 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="TERT_MI2S_TX LSM Function" value="None" />
<path name="listen-voice-wakeup-1">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM1 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM1 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM1 Mixer TERT_MI2S_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM2 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM2 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM2 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-3">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM3 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM3 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM3 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-4">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM4 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM4 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM4 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-5">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM5 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM5 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM5 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-6">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM6 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM6 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM6 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-7">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM7 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM7 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM7 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-8">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM8 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM8 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM8 Mixer TERT_MI2S_TX" value="1" />
</path>
<path name="listen-ape-handset-mic">
diff --git a/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml b/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml
index f2e4cb1..bd54837 100644
--- a/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths_wcd9306.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved. -->
+<!--- Copyright (c) 2014, 2016, 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 -->
@@ -28,14 +28,22 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="AIF1_CAP Mixer SLIM TX1" value="0"/>
<ctl name="LOOPBACK Mode" value="DISABLE" />
@@ -46,51 +54,59 @@
<path name="listen-voice-wakeup-1">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-handset-mic">
diff --git a/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml b/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml
index 15f0e06..e4dee50 100644
--- a/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths_wcd9330.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2015, The Linux Foundation. All rights reserved.
+<!--- Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -29,14 +29,22 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="MADONOFF Switch" value="0" />
<ctl name="MAD Input" value="DMIC1" />
@@ -44,42 +52,50 @@
<path name="listen-voice-wakeup-1">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-cpe-handset-mic">
<ctl name="MADONOFF Switch" value="1" />
<ctl name="MAD Input" value="DMIC1" />
- <ctl name="CPE AFE MAD Enable" value="1"/>
+ <ctl name="CPE AFE MAD Enable" value="1"/>
</path>
<path name="listen-ape-handset-mic">
diff --git a/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml b/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml
index 94d00c5..af630d0 100644
--- a/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml
+++ b/configs/msm8937/sound_trigger_mixer_paths_wcd9335.xml
@@ -29,14 +29,22 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="MADONOFF Switch" value="0" />
<ctl name="MAD Input" value="DMIC1" />
@@ -52,36 +60,44 @@
<path name="listen-voice-wakeup-1">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-cpe-handset-mic">
diff --git a/configs/msm8953/audio_policy_configuration.xml b/configs/msm8953/audio_policy_configuration.xml
index 2443d13..44abe28 100644
--- a/configs/msm8953/audio_policy_configuration.xml
+++ b/configs/msm8953/audio_policy_configuration.xml
@@ -81,13 +81,13 @@
<mixPort name="direct_pcm" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
</mixPort>
<mixPort name="compressed_offload" role="source"
diff --git a/configs/msm8953/mixer_paths.xml b/configs/msm8953/mixer_paths.xml
index 91544a1..a20c6cf 100644
--- a/configs/msm8953/mixer_paths.xml
+++ b/configs/msm8953/mixer_paths.xml
@@ -54,10 +54,10 @@
<ctl name="RX1 Digital Volume" value="84" />
<ctl name="RX2 Digital Volume" value="84" />
<ctl name="RX3 Digital Volume" value="84" />
- <ctl name="IIR1 INP1 Volume" value="84" />
- <ctl name="IIR1 INP2 Volume" value="84" />
- <ctl name="IIR1 INP3 Volume" value="84" />
- <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="IIR1 INP2 Volume" value="53" />
+ <ctl name="IIR1 INP3 Volume" value="53" />
+ <ctl name="IIR1 INP4 Volume" value="53" />
<ctl name="ADC1 Volume" value="4" />
<ctl name="ADC2 Volume" value="4" />
<ctl name="ADC3 Volume" value="4" />
diff --git a/configs/msm8953/mixer_paths_mtp.xml b/configs/msm8953/mixer_paths_mtp.xml
index b9fc59a..d618169 100644
--- a/configs/msm8953/mixer_paths_mtp.xml
+++ b/configs/msm8953/mixer_paths_mtp.xml
@@ -57,10 +57,10 @@
<ctl name="RX1 Digital Volume" value="84" />
<ctl name="RX2 Digital Volume" value="84" />
<ctl name="RX3 Digital Volume" value="84" />
- <ctl name="IIR1 INP1 Volume" value="84" />
- <ctl name="IIR1 INP2 Volume" value="84" />
- <ctl name="IIR1 INP3 Volume" value="84" />
- <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="IIR1 INP2 Volume" value="53" />
+ <ctl name="IIR1 INP3 Volume" value="53" />
+ <ctl name="IIR1 INP4 Volume" value="53" />
<ctl name="ADC1 Volume" value="4" />
<ctl name="ADC2 Volume" value="4" />
<ctl name="ADC3 Volume" value="4" />
diff --git a/configs/msm8953/mixer_paths_qrd_skuh.xml b/configs/msm8953/mixer_paths_qrd_skuh.xml
index aa70a90..ebf9331 100644
--- a/configs/msm8953/mixer_paths_qrd_skuh.xml
+++ b/configs/msm8953/mixer_paths_qrd_skuh.xml
@@ -57,10 +57,10 @@
<ctl name="RX1 Digital Volume" value="84" />
<ctl name="RX2 Digital Volume" value="84" />
<ctl name="RX3 Digital Volume" value="84" />
- <ctl name="IIR1 INP1 Volume" value="84" />
- <ctl name="IIR1 INP2 Volume" value="84" />
- <ctl name="IIR1 INP3 Volume" value="84" />
- <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="IIR1 INP2 Volume" value="53" />
+ <ctl name="IIR1 INP3 Volume" value="53" />
+ <ctl name="IIR1 INP4 Volume" value="53" />
<ctl name="ADC1 Volume" value="6" />
<ctl name="ADC2 Volume" value="6" />
<ctl name="ADC3 Volume" value="6" />
diff --git a/configs/msm8953/mixer_paths_qrd_skuhf.xml b/configs/msm8953/mixer_paths_qrd_skuhf.xml
index 84b95bd..1ece99d 100644
--- a/configs/msm8953/mixer_paths_qrd_skuhf.xml
+++ b/configs/msm8953/mixer_paths_qrd_skuhf.xml
@@ -57,10 +57,10 @@
<ctl name="RX1 Digital Volume" value="84" />
<ctl name="RX2 Digital Volume" value="84" />
<ctl name="RX3 Digital Volume" value="84" />
- <ctl name="IIR1 INP1 Volume" value="84" />
- <ctl name="IIR1 INP2 Volume" value="84" />
- <ctl name="IIR1 INP3 Volume" value="84" />
- <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="IIR1 INP2 Volume" value="53" />
+ <ctl name="IIR1 INP3 Volume" value="53" />
+ <ctl name="IIR1 INP4 Volume" value="53" />
<ctl name="ADC1 Volume" value="6" />
<ctl name="ADC2 Volume" value="6" />
<ctl name="ADC3 Volume" value="6" />
diff --git a/configs/msm8953/mixer_paths_qrd_skui.xml b/configs/msm8953/mixer_paths_qrd_skui.xml
index aa70a90..ebf9331 100644
--- a/configs/msm8953/mixer_paths_qrd_skui.xml
+++ b/configs/msm8953/mixer_paths_qrd_skui.xml
@@ -57,10 +57,10 @@
<ctl name="RX1 Digital Volume" value="84" />
<ctl name="RX2 Digital Volume" value="84" />
<ctl name="RX3 Digital Volume" value="84" />
- <ctl name="IIR1 INP1 Volume" value="84" />
- <ctl name="IIR1 INP2 Volume" value="84" />
- <ctl name="IIR1 INP3 Volume" value="84" />
- <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="IIR1 INP2 Volume" value="53" />
+ <ctl name="IIR1 INP3 Volume" value="53" />
+ <ctl name="IIR1 INP4 Volume" value="53" />
<ctl name="ADC1 Volume" value="6" />
<ctl name="ADC2 Volume" value="6" />
<ctl name="ADC3 Volume" value="6" />
diff --git a/configs/msm8953/mixer_paths_qrd_skum.xml b/configs/msm8953/mixer_paths_qrd_skum.xml
index 6aa8e1e..d504456 100644
--- a/configs/msm8953/mixer_paths_qrd_skum.xml
+++ b/configs/msm8953/mixer_paths_qrd_skum.xml
@@ -57,10 +57,10 @@
<ctl name="RX1 Digital Volume" value="84" />
<ctl name="RX2 Digital Volume" value="84" />
<ctl name="RX3 Digital Volume" value="84" />
- <ctl name="IIR1 INP1 Volume" value="84" />
- <ctl name="IIR1 INP2 Volume" value="84" />
- <ctl name="IIR1 INP3 Volume" value="84" />
- <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="IIR1 INP2 Volume" value="53" />
+ <ctl name="IIR1 INP3 Volume" value="53" />
+ <ctl name="IIR1 INP4 Volume" value="53" />
<ctl name="ADC1 Volume" value="6" />
<ctl name="ADC2 Volume" value="6" />
<ctl name="ADC3 Volume" value="6" />
diff --git a/configs/msm8953/mixer_paths_skuk.xml b/configs/msm8953/mixer_paths_skuk.xml
index 98a1bab..1538275 100644
--- a/configs/msm8953/mixer_paths_skuk.xml
+++ b/configs/msm8953/mixer_paths_skuk.xml
@@ -57,10 +57,10 @@
<ctl name="RX1 Digital Volume" value="84" />
<ctl name="RX2 Digital Volume" value="84" />
<ctl name="RX3 Digital Volume" value="84" />
- <ctl name="IIR1 INP1 Volume" value="84" />
- <ctl name="IIR1 INP2 Volume" value="84" />
- <ctl name="IIR1 INP3 Volume" value="84" />
- <ctl name="IIR1 INP4 Volume" value="84" />
+ <ctl name="IIR1 INP1 Volume" value="53" />
+ <ctl name="IIR1 INP2 Volume" value="53" />
+ <ctl name="IIR1 INP3 Volume" value="53" />
+ <ctl name="IIR1 INP4 Volume" value="53" />
<ctl name="ADC1 Volume" value="6" />
<ctl name="ADC2 Volume" value="6" />
<ctl name="ADC3 Volume" value="6" />
diff --git a/configs/msm8953/msm8953.mk b/configs/msm8953/msm8953.mk
index 7da4800..3106942 100644
--- a/configs/msm8953/msm8953.mk
+++ b/configs/msm8953/msm8953.mk
@@ -41,12 +41,13 @@
BOARD_USES_SRS_TRUEMEDIA := true
DTS_CODEC_M_ := true
#AUDIO_FEATURE_ENABLED_MULTIPLE_TUNNEL := true
-AUDIO_FEATURE_ENABLED_DEV_ARBI := true
+AUDIO_FEATURE_ENABLED_DEV_ARBI := false
MM_AUDIO_ENABLED_FTM := true
MM_AUDIO_ENABLED_SAFX := true
TARGET_USES_QCOM_MM_AUDIO := true
AUDIO_FEATURE_ENABLED_HW_ACCELERATED_EFFECTS := false
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+
AUDIO_FEATURE_ENABLED_SOURCE_TRACKING := true
AUDIO_FEATURE_ENABLED_AUDIOSPHERE := true
diff --git a/configs/msm8953/sound_trigger_mixer_paths.xml b/configs/msm8953/sound_trigger_mixer_paths.xml
index bbec875..a2ea69e 100644
--- a/configs/msm8953/sound_trigger_mixer_paths.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved. -->
+<!--- Copyright (c) 2014, 2016, 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 -->
@@ -28,48 +28,70 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="TERT_MI2S_TX LSM Function" value="None" />
<path name="listen-voice-wakeup-1">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM1 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM1 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM1 Mixer TERT_MI2S_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM2 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM2 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM2 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-3">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM3 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM3 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM3 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-4">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM4 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM4 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM4 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-5">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM5 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM5 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM5 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-6">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM6 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM6 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM6 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-7">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM7 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM7 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM7 Mixer TERT_MI2S_TX" value="1" />
</path>
+
<path name="listen-voice-wakeup-8">
<ctl name="TERT_MI2S_TX LSM Function" value="SWAUDIO" />
- <ctl name="LSM8 MUX" value="TERT_MI2S_TX" />
+ <ctl name="LSM8 Port" value="TERT_MI2S_TX" />
+ <ctl name="LSM8 Mixer TERT_MI2S_TX" value="1" />
</path>
<path name="listen-ape-handset-mic">
diff --git a/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml b/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml
index f2e4cb1..bd54837 100644
--- a/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths_wcd9306.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2014, The Linux Foundation. All rights reserved. -->
+<!--- Copyright (c) 2014, 2016, 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 -->
@@ -28,14 +28,22 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="AIF1_CAP Mixer SLIM TX1" value="0"/>
<ctl name="LOOPBACK Mode" value="DISABLE" />
@@ -46,51 +54,59 @@
<path name="listen-voice-wakeup-1">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
<ctl name="AIF1_CAP Mixer SLIM TX1" value="1"/>
<ctl name="SLIM_0_TX Channels" value="One" />
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="SWAUDIO" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-handset-mic">
diff --git a/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml b/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml
index b64c4ca..e4dee50 100644
--- a/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths_wcd9330.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--- Copyright (c) 2015, The Linux Foundation. All rights reserved.
+<!--- Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -29,14 +29,22 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="MADONOFF Switch" value="0" />
<ctl name="MAD Input" value="DMIC1" />
@@ -44,36 +52,44 @@
<path name="listen-voice-wakeup-1">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-cpe-handset-mic">
diff --git a/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml b/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
index 94d00c5..af630d0 100644
--- a/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
+++ b/configs/msm8953/sound_trigger_mixer_paths_wcd9335.xml
@@ -29,14 +29,22 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="MADONOFF Switch" value="0" />
<ctl name="MAD Input" value="DMIC1" />
@@ -52,36 +60,44 @@
<path name="listen-voice-wakeup-1">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-cpe-handset-mic">
diff --git a/configs/msm8996/audio_policy_configuration.xml b/configs/msm8996/audio_policy_configuration.xml
index 6f36be5..e8d4cd0 100644
--- a/configs/msm8996/audio_policy_configuration.xml
+++ b/configs/msm8996/audio_policy_configuration.xml
@@ -81,13 +81,13 @@
<mixPort name="direct_pcm" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
</mixPort>
<mixPort name="compressed_offload" role="source"
diff --git a/configs/msm8996/mixer_paths_tasha.xml b/configs/msm8996/mixer_paths_tasha.xml
index 9f63413..64d6bfb 100644
--- a/configs/msm8996/mixer_paths_tasha.xml
+++ b/configs/msm8996/mixer_paths_tasha.xml
@@ -2278,6 +2278,9 @@
<path name="capture-fm">
</path>
+ <path name="aanc-path">
+ </path>
+
<path name="aanc-handset-mic">
<ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
<ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
diff --git a/configs/msm8996/msm8996.mk b/configs/msm8996/msm8996.mk
index 4f29b53..5b240e9 100644
--- a/configs/msm8996/msm8996.mk
+++ b/configs/msm8996/msm8996.mk
@@ -41,13 +41,13 @@
AUDIO_FEATURE_ENABLED_DTS_EAGLE := false
BOARD_USES_SRS_TRUEMEDIA := true
DTS_CODEC_M_ := true
-AUDIO_FEATURE_ENABLED_DEV_ARBI := true
+AUDIO_FEATURE_ENABLED_DEV_ARBI := false
MM_AUDIO_ENABLED_FTM := true
MM_AUDIO_ENABLED_SAFX := true
TARGET_USES_QCOM_MM_AUDIO := true
AUDIO_FEATURE_ENABLED_HW_ACCELERATED_EFFECTS := false
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
-#DOLBY_DDP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
+
AUDIO_FEATURE_ENABLED_SOURCE_TRACKING := true
AUDIO_FEATURE_ENABLED_AUDIOSPHERE := true
AUDIO_FEATURE_ENABLED_GEF_SUPPORT := true
diff --git a/configs/msm8996/sound_trigger_mixer_paths.xml b/configs/msm8996/sound_trigger_mixer_paths.xml
index 0125371..f6c99d3 100644
--- a/configs/msm8996/sound_trigger_mixer_paths.xml
+++ b/configs/msm8996/sound_trigger_mixer_paths.xml
@@ -28,14 +28,22 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="MADONOFF Switch" value="0" />
<ctl name="MAD Input" value="DMIC1" />
@@ -51,36 +59,44 @@
<path name="listen-voice-wakeup-1">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-cpe-handset-mic">
diff --git a/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml b/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml
index 4f8557d..2ad8750 100644
--- a/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml
+++ b/configs/msm8996/sound_trigger_mixer_paths_wcd9330.xml
@@ -28,51 +28,67 @@
<mixer>
<!-- These are the initial mixer settings -->
- <ctl name="LSM1 MUX" value="None" />
- <ctl name="LSM2 MUX" value="None" />
- <ctl name="LSM3 MUX" value="None" />
- <ctl name="LSM4 MUX" value="None" />
- <ctl name="LSM5 MUX" value="None" />
- <ctl name="LSM6 MUX" value="None" />
- <ctl name="LSM7 MUX" value="None" />
- <ctl name="LSM8 MUX" value="None" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="0" />
+ <ctl name="LSM1 Port" value="None" />
+ <ctl name="LSM2 Port" value="None" />
+ <ctl name="LSM3 Port" value="None" />
+ <ctl name="LSM4 Port" value="None" />
+ <ctl name="LSM5 Port" value="None" />
+ <ctl name="LSM6 Port" value="None" />
+ <ctl name="LSM7 Port" value="None" />
+ <ctl name="LSM8 Port" value="None" />
<ctl name="SLIMBUS_5_TX LSM Function" value="None" />
<ctl name="MADONOFF Switch" value="0" />
<ctl name="MAD Input" value="DMIC1" />
<ctl name="CPE AFE MAD Enable" value="0"/>
<path name="listen-voice-wakeup-1">
- <ctl name="LSM1 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM1 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM1 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-2">
- <ctl name="LSM2 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM2 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM2 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-3">
- <ctl name="LSM3 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM3 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM3 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-4">
- <ctl name="LSM4 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM4 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM4 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-5">
- <ctl name="LSM5 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM5 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM5 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-6">
- <ctl name="LSM6 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM6 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM6 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-7">
- <ctl name="LSM7 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM7 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM7 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-voice-wakeup-8">
- <ctl name="LSM8 MUX" value="SLIMBUS_5_TX" />
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
+ <ctl name="LSM8 Port" value="SLIMBUS_5_TX" />
+ <ctl name="LSM8 Mixer SLIMBUS_5_TX" value="1" />
</path>
<path name="listen-cpe-handset-mic">
diff --git a/configs/msmcobalt/audio_output_policy.conf b/configs/msmcobalt/audio_output_policy.conf
index e60c664..8213f92 100644
--- a/configs/msmcobalt/audio_output_policy.conf
+++ b/configs/msmcobalt/audio_output_policy.conf
@@ -34,18 +34,25 @@
}
direct_pcm_16 {
flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
- formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT
+ formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
sampling_rates 44100|48000|96000|192000
bit_width 16
app_type 69936
}
direct_pcm_24 {
flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
- formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT
- sampling_rates 44100|48000|96000|176400|192000|352800
+ formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
+ sampling_rates 44100|48000|96000|176400|192000|352800|384000
bit_width 24
app_type 69940
}
+ direct_pcm_32 {
+ flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
+ formats AUDIO_FORMAT_PCM_32_BIT
+ sampling_rates 44100|48000|96000|176400|192000|352800|384000
+ bit_width 32
+ app_type 69942
+ }
compress_passthrough_16 {
flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING|AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH
formats AUDIO_FORMAT_AC3|AUDIO_FORMAT_E_AC3|AUDIO_FORMAT_E_AC3_JOC|AUDIO_FORMAT_DTS|AUDIO_FORMAT_DTS_HD|AUDIO_FORMAT_DSD
diff --git a/configs/msmcobalt/audio_platform_info.xml b/configs/msmcobalt/audio_platform_info.xml
index 07839fd..a1bd9a1 100644
--- a/configs/msmcobalt/audio_platform_info.xml
+++ b/configs/msmcobalt/audio_platform_info.xml
@@ -67,6 +67,7 @@
<param key="perf_lock_opts" value="4, 0x101, 0x704, 0x20F, 0x1E01"/>
<param key="native_audio_mode" value="src"/>
<param key="input_mic_max_count" value="4"/>
+ <param key="true_32_bit" value="true"/>
<!-- In the below value string, the value indicates sidetone gain in dB -->
<param key="usb_sidetone_gain" value="35"/>
</config_params>
diff --git a/configs/msmcobalt/audio_policy.conf b/configs/msmcobalt/audio_policy.conf
index 70ab311..8fb5676 100644
--- a/configs/msmcobalt/audio_policy.conf
+++ b/configs/msmcobalt/audio_policy.conf
@@ -58,9 +58,9 @@
flags AUDIO_OUTPUT_FLAG_DIRECT
}
direct_pcm {
- sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000|64000|88200|96000|176400|192000|352800
+ sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000|64000|88200|96000|176400|192000|352800|384000
channel_masks AUDIO_CHANNEL_OUT_MONO|AUDIO_CHANNEL_OUT_STEREO|AUDIO_CHANNEL_OUT_2POINT1|AUDIO_CHANNEL_OUT_QUAD|AUDIO_CHANNEL_OUT_PENTA|AUDIO_CHANNEL_OUT_5POINT1|AUDIO_CHANNEL_OUT_6POINT1|AUDIO_CHANNEL_OUT_7POINT1
- formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT
+ formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_8_24_BIT|AUDIO_FORMAT_PCM_32_BIT
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_LINE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_PROXY|AUDIO_DEVICE_OUT_USB_DEVICE|AUDIO_DEVICE_OUT_BLUETOOTH_A2DP|AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES|AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER
flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM
}
@@ -102,7 +102,7 @@
}
surround_sound {
sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000
- channel_masks AUDIO_CHANNEL_IN_5POINT1|AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO|AUDIO_CHANNEL_IN_FRONT_BACK|AUDIO_CHANNEL_INDEX_MASK_3|AUDIO_CHANNEL_INDEX_MASK_4
+ channel_masks AUDIO_CHANNEL_IN_5POINT1|AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO|AUDIO_CHANNEL_IN_FRONT_BACK|AUDIO_CHANNEL_INDEX_MASK_3|AUDIO_CHANNEL_INDEX_MASK_4|AUDIO_CHANNEL_INDEX_MASK_6
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BACK_MIC
}
diff --git a/configs/msmcobalt/audio_policy_configuration.xml b/configs/msmcobalt/audio_policy_configuration.xml
index 2503bd2..b6d2490 100644
--- a/configs/msmcobalt/audio_policy_configuration.xml
+++ b/configs/msmcobalt/audio_policy_configuration.xml
@@ -86,13 +86,16 @@
<mixPort name="direct_pcm" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
+ channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
+ <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
</mixPort>
<mixPort name="compressed_offload" role="source"
@@ -176,7 +179,7 @@
<mixPort name="surround_sound" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
- channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_IN_5POINT1"/>
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6"/>
</mixPort>
<mixPort name="record_24" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
diff --git a/configs/msmcobalt/mixer_paths_skuk.xml b/configs/msmcobalt/mixer_paths_skuk.xml
new file mode 100644
index 0000000..24499b9
--- /dev/null
+++ b/configs/msmcobalt/mixer_paths_skuk.xml
@@ -0,0 +1,2415 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. -->
+<!-- -->
+<!-- Redistribution and use in source and binary forms, with or without -->
+<!-- modification, are permitted provided that the following conditions are -->
+<!-- met: -->
+<!-- * Redistributions of source code must retain the above copyright -->
+<!-- notice, this list of conditions and the following disclaimer. -->
+<!-- * Redistributions in binary form must reproduce the above -->
+<!-- copyright notice, this list of conditions and the following -->
+<!-- disclaimer in the documentation and/or other materials provided -->
+<!-- with the distribution. -->
+<!-- * Neither the name of The Linux Foundation nor the names of its -->
+<!-- contributors may be used to endorse or promote products derived -->
+<!-- from this software without specific prior written permission. -->
+<!-- -->
+<!-- THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -->
+<!-- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -->
+<!-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -->
+<!-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -->
+<!-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -->
+<!-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -->
+<!-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -->
+<!-- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -->
+<!-- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -->
+<!-- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -->
+<!-- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
+<mixer>
+ <!-- These are the initial mixer settings -->
+ <ctl name="Voice Rx Device Mute" id="0" value="0" />
+ <ctl name="Voice Rx Device Mute" id="1" value="-1" />
+ <ctl name="Voice Rx Device Mute" id="2" value="20" />
+ <ctl name="Voice Tx Mute" id="0" value="0" />
+ <ctl name="Voice Tx Mute" id="1" value="-1" />
+ <ctl name="Voice Tx Mute" id="2" value="500" />
+ <ctl name="Voice Rx Gain" id="0" value="0" />
+ <ctl name="Voice Rx Gain" id="1" value="-1" />
+ <ctl name="Voice Rx Gain" id="2" value="20" />
+ <ctl name="Voip Tx Mute" id="0" value="0" />
+ <ctl name="Voip Tx Mute" id="1" value="500" />
+ <ctl name="Voip Rx Gain" id="0" value="0" />
+ <ctl name="Voip Rx Gain" id="1" value="20" />
+ <ctl name="Voip Mode Config" value="12" />
+ <ctl name="Voip Rate Config" value="0" />
+ <ctl name="Voip Evrc Min Max Rate Config" id="0" value="1" />
+ <ctl name="Voip Evrc Min Max Rate Config" id="1" value="4" />
+ <ctl name="Voip Dtx Mode" value="0" />
+ <ctl name="TTY Mode" value="OFF" />
+ <ctl name="SLIMBUS_0_RX Port Mixer SLIM_0_TX" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia8" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia14" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia15" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="SLIMBUS_6_RX Port Mixer SLIM_0_TX" value="0" />
+ <ctl name="SLIMBUS_4_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="SLIMBUS_4_RX Audio Mixer MultiMedia2" value="0" />
+ <ctl name="MultiMedia5 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia5 Mixer AFE_PCM_TX" value="0" />
+ <ctl name="MultiMedia5 Mixer SLIM_8_TX" value="0" />
+ <ctl name="MultiMedia5 Mixer SLIM_7_TX" value="0" />
+ <ctl name="MultiMedia1 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia1 Mixer SLIM_4_TX" value="0" />
+ <ctl name="MultiMedia1 Mixer SLIM_7_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer SLIM_4_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer SLIM_7_TX" value="0" />
+ <ctl name="HDMI Mixer MultiMedia1" value="0" />
+ <ctl name="HDMI Mixer MultiMedia2" value="0" />
+ <ctl name="HDMI Mixer MultiMedia3" value="0" />
+ <ctl name="HDMI Mixer MultiMedia4" value="0" />
+ <ctl name="HDMI Mixer MultiMedia5" value="0" />
+ <ctl name="HDMI Mixer MultiMedia7" value="0" />
+ <ctl name="HDMI Mixer MultiMedia9" value="0" />
+ <ctl name="HDMI Mixer MultiMedia10" value="0" />
+ <ctl name="HDMI Mixer MultiMedia11" value="0" />
+ <ctl name="HDMI Mixer MultiMedia12" value="0" />
+ <ctl name="HDMI Mixer MultiMedia13" value="0" />
+ <ctl name="HDMI Mixer MultiMedia14" value="0" />
+ <ctl name="HDMI Mixer MultiMedia15" value="0" />
+ <ctl name="HDMI Mixer MultiMedia16" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia1" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia2" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia3" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia4" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia5" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia6" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia7" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia8" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia9" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia10" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia11" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia12" value="0" />
+ <ctl name="DISPLAY_PORT Mixer MultiMedia13" value="0" />
+ <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="SLIMBUS_0_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia2" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia2" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia3" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia3" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia8" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia8" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia8" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia14" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia14" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia14" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia14" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia15" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia15" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia15" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia15" value="0" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia2" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia3" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia8" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia14" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia15" value="0" />
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="MultiMedia1 Mixer USB_AUDIO_TX" value="0" />
+ <ctl name="MultiMedia5 Mixer USB_AUDIO_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="0" />
+ <ctl name="USB_AUDIO_RX Channels" value="One" />
+ <ctl name="USB_AUDIO_RX SampleRate" value="KHZ_48" />
+ <ctl name="USB_AUDIO_RX Format" value="S16_LE" />
+ <ctl name="USB_AUDIO_TX Channels" value="One" />
+ <ctl name="USB_AUDIO_TX SampleRate" value="KHZ_48" />
+ <ctl name="USB_AUDIO_TX Format" value="S16_LE" />
+ <ctl name="MultiMedia6 Mixer SLIM_0_TX" value="0" />
+ <ctl name="SLIM_2_RX Format" value="UNPACKED" />
+ <ctl name="SLIM_2_RX SampleRate" value="KHZ_48" />
+ <ctl name="SLIM_5_RX SampleRate" value="KHZ_44P1" />
+ <ctl name="SLIM_0_RX Channels" value="One" />
+ <ctl name="SLIM_5_RX Channels" value="One" />
+ <ctl name="SLIM_6_RX Channels" value="One" />
+ <ctl name="SLIM_2_RX Channels" value="One" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="SLIM_1_TX Channels" value="One" />
+ <ctl name="AIF1_CAP Mixer SLIM TX9" value="0"/>
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="0"/>
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="0" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="0" />
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="0"/>
+ <ctl name="AIF1_CAP Mixer SLIM TX4" value="0" />
+ <ctl name="AIF1_CAP Mixer SLIM TX3" value="0"/>
+ <ctl name="AIF1_CAP Mixer SLIM TX2" value="0" />
+ <ctl name="AIF1_CAP Mixer SLIM TX1" value="0"/>
+ <ctl name="AIF1_CAP Mixer SLIM TX0" value="0"/>
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="HDMI Mixer MultiMedia4" value="0" />
+ <ctl name="SLIM0_RX_VI_FB_LCH_MUX" value="ZERO" />
+ <ctl name="SLIM0_RX_VI_FB_RCH_MUX" value="ZERO" />
+ <ctl name="VI_FEED_TX Channels" value="Two" />
+ <ctl name="AIF4_VI Mixer SPKR_VI_1" value="0" />
+ <ctl name="AIF4_VI Mixer SPKR_VI_2" value="0" />
+ <ctl name="SLIM_4_TX Format" value="UNPACKED" />
+ <ctl name="AANC_SLIM_0_RX MUX" value="ZERO" />
+ <!-- HFP start -->
+ <ctl name="HFP_PRI_AUX_UL_HL Switch" value="0" />
+ <ctl name="SLIMBUS_0_RX Port Mixer SLIM_7_TX" value="0" />
+ <!-- HFP end -->
+ <!-- echo reference -->
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="None" />
+ <!-- usb headset -->
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia10" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia11" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia12" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia13" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia14" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia15" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="MultiMedia1 Mixer AFE_PCM_TX" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="0" />
+ <!-- usb headset end -->
+ <!-- fm -->
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="0" />
+ <ctl name="SLIMBUS_0_RX Port Mixer SLIM_8_TX" value="0" />
+ <ctl name="SLIMBUS_DL_HL Switch" value="0" />
+ <ctl name="SLIMBUS_6_RX Port Mixer SLIM_8_TX" value="0" />
+ <ctl name="SLIMBUS6_DL_HL Switch" value="0" />
+ <ctl name="MultiMedia1 Mixer SLIM_8_TX" value="0" />
+ <ctl name="MultiMedia2 Mixer SLIM_8_TX" value="0" />
+ <!-- fm end -->
+
+ <!-- Multimode Voice1 -->
+ <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="SLIM_6_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="VoiceMMode1_Tx Mixer SLIM_0_TX_MMode1" value="0" />
+ <!-- Multimode Voice1 HDMI -->
+ <ctl name="HDMI_RX_Voice Mixer VoiceMMode1" value="0" />
+ <!-- Multimode Voice1 BTSCO -->
+ <ctl name="SLIM_7_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="VoiceMMode1_Tx Mixer SLIM_7_TX_MMode1" value="0" />
+ <!-- Multimode Voice1 USB headset -->
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="VoiceMMode1_Tx Mixer AFE_PCM_TX_MMode1" value="0" />
+ <ctl name="USB_AUDIO_RX_Voice Mixer VoiceMMode1" value="0" />
+ <ctl name="VoiceMMode1_Tx Mixer USB_AUDIO_TX_MMode1" value="0" />
+ <!-- Miltimode Voice1 end-->
+
+ <!-- Multimode Voice2 -->
+ <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="SLIM_6_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="VoiceMMode2_Tx Mixer SLIM_0_TX_MMode2" value="0" />
+ <!-- Multimode Voice2 HDMI -->
+ <ctl name="HDMI_RX_Voice Mixer VoiceMMode2" value="0" />
+ <!-- Multimode Voice2 BTSCO -->
+ <ctl name="SLIM_7_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="VoiceMMode2_Tx Mixer SLIM_7_TX_MMode2" value="0" />
+ <!-- Multimode Voice2 USB headset -->
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="VoiceMMode2_Tx Mixer AFE_PCM_TX_MMode2" value="0" />
+ <ctl name="USB_AUDIO_RX_Voice Mixer VoiceMMode2" value="0" />
+ <ctl name="VoiceMMode2_Tx Mixer USB_AUDIO_TX_MMode2" value="0" />
+ <!-- Multimode Voice2 end-->
+
+ <!-- Voice external ec. reference -->
+ <ctl name="VOC_EXT_EC MUX" value="NONE" />
+ <ctl name="AIF3_CAP Mixer SLIM TX1" value="0" />
+ <ctl name="AIF3_CAP Mixer SLIM TX2" value="0" />
+ <!-- Voice external ec. reference end -->
+
+ <!-- RT Proxy Cal -->
+ <ctl name="RT_PROXY_1_RX SetCalMode" value="CAL_MODE_NONE" />
+ <ctl name="RT_PROXY_1_TX SetCalMode" value="CAL_MODE_NONE" />
+ <!-- RT Proxy Cal end -->
+
+ <!-- Incall Recording -->
+ <ctl name="MultiMedia1 Mixer VOC_REC_UL" value="0" />
+ <ctl name="MultiMedia1 Mixer VOC_REC_DL" value="0" />
+ <ctl name="MultiMedia8 Mixer VOC_REC_UL" value="0" />
+ <ctl name="MultiMedia8 Mixer VOC_REC_DL" value="0" />
+ <!-- Incall Recording End -->
+
+ <!-- Incall Music -->
+ <ctl name="Incall_Music Audio Mixer MultiMedia2" value="0" />
+ <!-- Incall Music End -->
+
+ <!-- compress-voip-call start -->
+ <ctl name="SLIM_0_RX_Voice Mixer Voip" value="0" />
+ <ctl name="SLIM_6_RX_Voice Mixer Voip" value="0" />
+ <ctl name="Voip_Tx Mixer SLIM_0_TX_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" />
+ <ctl name="Voip_Tx Mixer AFE_PCM_TX_Voip" value="0" />
+ <ctl name="USB_AUDIO_RX_Voice Mixer Voip" value="0" />
+ <ctl name="Voip_Tx Mixer USB_AUDIO_TX_Voip" value="0" />
+ <!-- compress-voip-call end-->
+
+ <!-- Audio BTSCO -->
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia4" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia5" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia6" value="0" />
+ <ctl name="MultiMedia1 Mixer SLIM_7_TX" value="0" />
+ <!-- audio record compress-->
+ <ctl name="MultiMedia8 Mixer SLIM_0_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer SLIM_7_TX" value="0" />
+ <ctl name="MultiMedia8 Mixer AFE_PCM_TX" value="0" />
+ <!-- audio record compress end-->
+
+ <!-- split a2dp -->
+ <ctl name="BT SampleRate" value="KHZ_8" />
+ <ctl name="AFE Input Channels" value="Zero" />
+ <ctl name="SLIM7_RX ADM Channels" value="Zero" />
+ <!-- split a2dp end-->
+
+ <!-- ADSP testfwk -->
+ <ctl name="SLIMBUS_DL_HL Switch" value="0" />
+ <ctl name="SLIMBUS6_DL_HL Switch" value="0" />
+ <!-- ADSP testfwk end-->
+
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia3" value="0" />
+
+ <!-- Codec controls -->
+ <!-- WSA controls -->
+ <ctl name="SpkrLeft COMP Switch" value="0" />
+ <ctl name="SpkrRight COMP Switch" value="0" />
+ <ctl name="SpkrLeft BOOST Switch" value="0" />
+ <ctl name="SpkrRight BOOST Switch" value="0" />
+ <ctl name="SpkrLeft VISENSE Switch" value="0" />
+ <ctl name="SpkrRight VISENSE Switch" value="0" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="0" />
+ <ctl name="SpkrRight SWR DAC_Port Switch" value="0" />
+ <ctl name="SpkrLeft WSA PA Gain" value="G_0_DB" />
+
+ <!-- Volume controls -->
+ <ctl name="LINEOUT1 Volume" value="13" />
+ <ctl name="LINEOUT2 Volume" value="13" />
+ <ctl name="HPHL Volume" value="20" />
+ <ctl name="HPHR Volume" value="20" />
+ <ctl name="EAR PA Gain" value="G_6_DB" />
+ <ctl name="EAR SPKR PA Gain" value="G_DEFAULT" />
+
+ <ctl name="RX0 Digital Volume" value="84" />
+ <ctl name="RX1 Digital Volume" value="84" />
+ <ctl name="RX2 Digital Volume" value="84" />
+ <ctl name="RX3 Digital Volume" value="84" />
+ <ctl name="RX4 Digital Volume" value="84" />
+ <ctl name="RX5 Digital Volume" value="84" />
+ <ctl name="RX6 Digital Volume" value="84" />
+ <ctl name="RX7 Digital Volume" value="84" />
+ <ctl name="ADC1 Volume" value="12" />
+ <ctl name="ADC2 Volume" value="12" />
+ <ctl name="ADC3 Volume" value="12" />
+ <ctl name="ADC4 Volume" value="12" />
+ <ctl name="DEC0 Volume" value="84" />
+ <ctl name="DEC1 Volume" value="84" />
+ <ctl name="DEC2 Volume" value="84" />
+ <ctl name="DEC3 Volume" value="84" />
+ <ctl name="DEC4 Volume" value="84" />
+ <ctl name="DEC5 Volume" value="84" />
+ <ctl name="DEC6 Volume" value="84" />
+ <ctl name="DEC7 Volume" value="84" />
+ <ctl name="DEC8 Volume" value="84" />
+
+ <!-- Compander controls -->
+ <ctl name="COMP1 Switch" value="1" />
+ <ctl name="COMP2 Switch" value="1" />
+ <ctl name="COMP7 Switch" value="0" />
+ <ctl name="COMP8 Switch" value="0" />
+
+ <!-- ADC, DMIC and AMIC controls -->
+ <ctl name="ADC MUX0" value="AMIC" />
+ <ctl name="ADC MUX1" value="AMIC" />
+ <ctl name="ADC MUX2" value="AMIC" />
+ <ctl name="ADC MUX3" value="AMIC" />
+ <ctl name="ADC MUX4" value="AMIC" />
+ <ctl name="ADC MUX5" value="AMIC" />
+ <ctl name="ADC MUX6" value="AMIC" />
+ <ctl name="ADC MUX7" value="AMIC" />
+ <ctl name="ADC MUX8" value="AMIC" />
+ <ctl name="ADC MUX10" value="AMIC" />
+ <ctl name="ADC MUX11" value="AMIC" />
+ <ctl name="ADC MUX12" value="AMIC" />
+ <ctl name="ADC MUX13" value="AMIC" />
+ <ctl name="DMIC MUX0" value="ZERO" />
+ <ctl name="DMIC MUX1" value="ZERO" />
+ <ctl name="DMIC MUX2" value="ZERO" />
+ <ctl name="DMIC MUX3" value="ZERO" />
+ <ctl name="DMIC MUX4" value="ZERO" />
+ <ctl name="DMIC MUX5" value="ZERO" />
+ <ctl name="DMIC MUX6" value="ZERO" />
+ <ctl name="DMIC MUX7" value="ZERO" />
+ <ctl name="DMIC MUX8" value="ZERO" />
+ <ctl name="DMIC MUX10" value="ZERO" />
+ <ctl name="DMIC MUX11" value="ZERO" />
+ <ctl name="DMIC MUX12" value="ZERO" />
+ <ctl name="DMIC MUX13" value="ZERO" />
+ <ctl name="AMIC MUX0" value="ZERO" />
+ <ctl name="AMIC MUX1" value="ZERO" />
+ <ctl name="AMIC MUX2" value="ZERO" />
+ <ctl name="AMIC MUX3" value="ZERO" />
+ <ctl name="AMIC MUX4" value="ZERO" />
+ <ctl name="AMIC MUX5" value="ZERO" />
+ <ctl name="AMIC MUX6" value="ZERO" />
+ <ctl name="AMIC MUX7" value="ZERO" />
+ <ctl name="AMIC MUX8" value="ZERO" />
+ <ctl name="AMIC MUX10" value="ZERO" />
+ <ctl name="AMIC MUX11" value="ZERO" />
+ <ctl name="AMIC MUX12" value="ZERO" />
+ <ctl name="AMIC MUX13" value="ZERO" />
+
+ <!-- CDC_IF and SLIM controls -->
+ <ctl name="SLIM RX0 MUX" value="ZERO" />
+ <ctl name="SLIM RX1 MUX" value="ZERO" />
+ <ctl name="SLIM RX2 MUX" value="ZERO" />
+ <ctl name="SLIM RX3 MUX" value="ZERO" />
+ <ctl name="SLIM RX4 MUX" value="ZERO" />
+ <ctl name="SLIM RX5 MUX" value="ZERO" />
+ <ctl name="SLIM RX6 MUX" value="ZERO" />
+ <ctl name="SLIM RX7 MUX" value="ZERO" />
+ <ctl name="CDC_IF RX0 MUX" value="SLIM RX0" />
+ <ctl name="CDC_IF RX1 MUX" value="SLIM RX1" />
+ <ctl name="CDC_IF RX2 MUX" value="SLIM RX2" />
+ <ctl name="CDC_IF RX3 MUX" value="SLIM RX3" />
+ <ctl name="CDC_IF RX4 MUX" value="SLIM RX4" />
+ <ctl name="CDC_IF RX5 MUX" value="SLIM RX5" />
+ <ctl name="CDC_IF RX6 MUX" value="SLIM RX6" />
+ <ctl name="CDC_IF RX7 MUX" value="SLIM RX7" />
+ <ctl name="CDC_IF TX0 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX1 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX2 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX3 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX4 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX5 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX6 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX7 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX8 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX9 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX10 MUX" value="ZERO" />
+ <ctl name="CDC_IF TX13 MUX" value="ZERO" />
+
+ <!-- Interpolator chain controls -->
+ <ctl name="RX INT0_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT0_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT1_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT2_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT2_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT2_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT7_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT7_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT7_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT8_1 MIX1 INP0" value="ZERO" />
+ <ctl name="RX INT8_1 MIX1 INP1" value="ZERO" />
+ <ctl name="RX INT8_1 MIX1 INP2" value="ZERO" />
+ <ctl name="RX INT0_2 MUX" value="ZERO" />
+ <ctl name="RX INT1_2 MUX" value="ZERO" />
+ <ctl name="RX INT2_2 MUX" value="ZERO" />
+ <ctl name="RX INT7_2 MUX" value="ZERO" />
+ <ctl name="RX INT8_2 MUX" value="ZERO" />
+ <ctl name="RX INT1_1 NATIVE MUX" value="OFF" />
+ <ctl name="RX INT2_1 NATIVE MUX" value="OFF" />
+ <ctl name="RX INT1_2 NATIVE MUX" value="OFF" />
+ <ctl name="RX INT2_2 NATIVE MUX" value="OFF" />
+ <ctl name="ASRC0 MUX" value="ZERO" />
+ <ctl name="ASRC1 MUX" value="ZERO" />
+ <ctl name="RX INT1 SEC MIX HPHL Switch" value="0" />
+ <ctl name="RX INT2 SEC MIX HPHR Switch" value="0" />
+ <ctl name="DSD_L IF MUX" value="ZERO" />
+ <ctl name="DSD_R IF MUX" value="ZERO" />
+ <ctl name="RX INT1 MIX3 DSD HPHL Switch" value="0" />
+ <ctl name="RX INT2 MIX3 DSD HPHR Switch" value="0" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT2 DEM MUX" value="CLSH_DSM_OUT" />
+
+ <!-- Headphone Default mode - uLP -->
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
+
+ <!-- IIR/voice anc -->
+ <ctl name="IIR0 Band1" id ="0" value="268435456" />
+ <ctl name="IIR0 Band1" id ="1" value="0" />
+ <ctl name="IIR0 Band1" id ="2" value="0" />
+ <ctl name="IIR0 Band1" id ="3" value="0" />
+ <ctl name="IIR0 Band1" id ="4" value="0" />
+ <ctl name="IIR0 Band2" id ="0" value="268435456" />
+ <ctl name="IIR0 Band2" id ="1" value="0" />
+ <ctl name="IIR0 Band2" id ="2" value="0" />
+ <ctl name="IIR0 Band2" id ="3" value="0" />
+ <ctl name="IIR0 Band2" id ="4" value="0" />
+ <ctl name="IIR0 Band3" id ="0" value="268435456" />
+ <ctl name="IIR0 Band3" id ="1" value="0" />
+ <ctl name="IIR0 Band3" id ="2" value="0" />
+ <ctl name="IIR0 Band3" id ="3" value="0" />
+ <ctl name="IIR0 Band3" id ="4" value="0" />
+ <ctl name="IIR0 Band4" id ="0" value="268435456" />
+ <ctl name="IIR0 Band4" id ="1" value="0" />
+ <ctl name="IIR0 Band4" id ="2" value="0" />
+ <ctl name="IIR0 Band4" id ="3" value="0" />
+ <ctl name="IIR0 Band4" id ="4" value="0" />
+ <ctl name="IIR0 Band5" id ="0" value="268435456" />
+ <ctl name="IIR0 Band5" id ="1" value="0" />
+ <ctl name="IIR0 Band5" id ="2" value="0" />
+ <ctl name="IIR0 Band5" id ="3" value="0" />
+ <ctl name="IIR0 Band5" id ="4" value="0" />
+ <ctl name="IIR0 Enable Band1" value="0" />
+ <ctl name="IIR0 Enable Band2" value="0" />
+ <ctl name="IIR0 Enable Band3" value="0" />
+ <ctl name="IIR0 Enable Band4" value="0" />
+ <ctl name="IIR0 Enable Band5" value="0" />
+ <ctl name="IIR0 INP0 Volume" value="54" />
+ <ctl name="IIR0 INP0 MUX" value="ZERO" />
+ <ctl name="IIR0 INP1 MUX" value="ZERO" />
+ <ctl name="IIR0 INP2 MUX" value="ZERO" />
+ <ctl name="IIR1 INP0 MUX" value="ZERO" />
+ <ctl name="IIR1 INP1 MUX" value="ZERO" />
+ <ctl name="IIR1 INP2 MUX" value="ZERO" />
+
+ <!-- anc related -->
+ <ctl name="ANC Slot" value="0" />
+ <ctl name="ANC Function" value="OFF" />
+ <ctl name="ANC0 FB MUX" value="ZERO" />
+ <ctl name="ANC1 FB MUX" value="ZERO" />
+ <ctl name="ANC OUT EAR Enable Switch" value="0" />
+ <ctl name="ANC OUT EAR SPKR Enable Switch" value="0" />
+ <ctl name="ANC SPKR PA Enable Switch" value="0" />
+
+ <!-- vbat related data -->
+ <!-- vbat related data end -->
+
+ <!-- Codec controls end -->
+
+ <!-- These are audio route (FE to BE) specific mixer settings -->
+ <path name="gsm-mode">
+ <ctl name="GSM mode Enable" value="ON" />
+ </path>
+
+ <path name="echo-reference speaker-vbat-mono">
+ </path>
+
+ <path name="echo-reference speaker-vbat">
+ </path>
+
+ <path name="echo-reference">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+ </path>
+
+ <path name="echo-reference headphones">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_6_RX" />
+ </path>
+
+ <path name="echo-reference headphones-44.1">
+ </path>
+
+ <path name="deep-buffer-playback">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-protected">
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback hdmi">
+ <ctl name="HDMI Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-hdmi">
+ <path name="deep-buffer-playback hdmi" />
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-display-port">
+ <path name="deep-buffer-playback display-port" />
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="deep-buffer-playback bt-sco" />
+ </path>
+
+ <path name="deep-buffer-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-usb-headphones">
+ <path name="deep-buffer-playback usb-headphones" />
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="deep-buffer-playback headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-and-headphones">
+ <path name="deep-buffer-playback headphones" />
+ <path name="deep-buffer-playback" />
+ </path>
+
+ <path name="low-latency-playback">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback speaker-protected">
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback hdmi">
+ <ctl name="HDMI Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="low-latency-playback bt-sco" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-hdmi">
+ <path name="low-latency-playback hdmi" />
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-display-port">
+ <path name="low-latency-playback display-port" />
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-usb-headphones">
+ <path name="low-latency-playback usb-headphones" />
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="low-latency-playback headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="low-latency-playback speaker-and-headphones">
+ <path name="low-latency-playback headphones" />
+ <path name="low-latency-playback" />
+ </path>
+
+ <path name="audio-ull-playback">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia8" value="1" />
+ </path>
+
+ <path name="audio-ull-playback speaker-protected">
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia8" value="1" />
+ </path>
+
+ <path name="audio-ull-playback speaker-and-headphones">
+ <path name="audio-ull-playback" />
+ <path name="audio-ull-playback headphones" />
+ </path>
+
+ <path name="audio-ull-playback hdmi">
+ <ctl name="HDMI Mixer MultiMedia8" value="1" />
+ </path>
+
+ <path name="audio-ull-playback display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia3" value="1" />
+ </path>
+
+ <path name="audio-ull-playback bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia8" value="1" />
+ </path>
+
+ <path name="audio-ull-playback bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="audio-ull-playback bt-sco" />
+ </path>
+
+ <path name="audio-ull-playback speaker-and-hdmi">
+ <path name="audio-ull-playback hdmi" />
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback speaker-and-display-port">
+ <path name="audio-ull-playback display-port" />
+ <path name="audio-ull-playback" />
+ </path>
+
+ <path name="audio-ull-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia8" value="1" />
+ </path>
+
+ <path name="audio-ull-playback usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia8" value="1" />
+ </path>
+
+ <path name="multi-channel-playback hdmi">
+ <ctl name="HDMI Mixer MultiMedia2" value="1" />
+ </path>
+
+ <path name="multi-channel-playback display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia2" value="1" />
+ </path>
+
+ <path name="multi-channel-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="1" />
+ </path>
+
+ <path name="compress-offload-playback">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback speaker-protected">
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback hdmi">
+ <ctl name="HDMI Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="silence-playback hdmi">
+ <ctl name="HDMI Mixer MultiMedia9" value="1" />
+ </path>
+
+ <path name="compress-offload-playback display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="silence-playback display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia9" value="1" />
+ </path>
+
+ <path name="compress-offload-playback bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-hdmi">
+ <path name="compress-offload-playback hdmi" />
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-display-port">
+ <path name="compress-offload-playback display-port" />
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-usb-headphones">
+ <path name="compress-offload-playback usb-headphones" />
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback speaker-and-headphones">
+ <path name="compress-offload-playback headphones" />
+ <path name="compress-offload-playback" />
+ </path>
+
+ <path name="compress-offload-playback2">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 hdmi">
+ <ctl name="HDMI Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback2 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-hdmi">
+ <path name="compress-offload-playback2 hdmi" />
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-display-port">
+ <path name="compress-offload-playback2 display-port" />
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback2 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-usb-headphones">
+ <path name="compress-offload-playback2 usb-headphones" />
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback2 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 speaker-and-headphones">
+ <path name="compress-offload-playback2 headphones" />
+ <path name="compress-offload-playback2" />
+ </path>
+
+ <path name="compress-offload-playback3">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 hdmi">
+ <ctl name="HDMI Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback3 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback3 speaker-and-hdmi">
+ <path name="compress-offload-playback3 hdmi" />
+ <path name="compress-offload-playback3" />
+ </path>
+
+ <path name="compress-offload-playback3 speaker-and-display-port">
+ <path name="compress-offload-playback3 display-port" />
+ <path name="compress-offload-playback3" />
+ </path>
+
+ <path name="compress-offload-playback3 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 speaker-and-usb-headphones">
+ <path name="compress-offload-playback3 usb-headphones" />
+ <path name="compress-offload-playback3" />
+ </path>
+
+ <path name="compress-offload-playback3 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 speaker-and-headphones">
+ <path name="compress-offload-playback3 headphones" />
+ <path name="compress-offload-playback3" />
+ </path>
+
+ <path name="compress-offload-playback4">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 hdmi">
+ <ctl name="HDMI Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback4 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback4 speaker-and-hdmi">
+ <path name="compress-offload-playback4 hdmi" />
+ <path name="compress-offload-playback4" />
+ </path>
+
+ <path name="compress-offload-playback4 speaker-and-display-port">
+ <path name="compress-offload-playback4 display-port" />
+ <path name="compress-offload-playback4" />
+ </path>
+
+
+ <path name="compress-offload-playback4 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 speaker-and-usb-headphones">
+ <path name="compress-offload-playback4 usb-headphones" />
+ <path name="compress-offload-playback4" />
+ </path>
+
+ <path name="compress-offload-playback4 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 speaker-and-headphones">
+ <path name="compress-offload-playback4 headphones" />
+ <path name="compress-offload-playback4" />
+ </path>
+
+ <path name="compress-offload-playback5">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 hdmi">
+ <ctl name="HDMI Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback5 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback5 speaker-and-hdmi">
+ <path name="compress-offload-playback5 hdmi" />
+ <path name="compress-offload-playback5" />
+ </path>
+
+ <path name="compress-offload-playback5 speaker-and-display-port">
+ <path name="compress-offload-playback5 display-port" />
+ <path name="compress-offload-playback5" />
+ </path>
+
+ <path name="compress-offload-playback5 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 speaker-and-usb-headphones">
+ <path name="compress-offload-playback5 usb-headphones" />
+ <path name="compress-offload-playback5" />
+ </path>
+
+ <path name="compress-offload-playback5 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 speaker-and-headphones">
+ <path name="compress-offload-playback5 headphones" />
+ <path name="compress-offload-playback5" />
+ </path>
+
+ <path name="compress-offload-playback6">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 hdmi">
+ <ctl name="HDMI Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback6 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback6 speaker-and-hdmi">
+ <path name="compress-offload-playback6 hdmi" />
+ <path name="compress-offload-playback6" />
+ </path>
+
+ <path name="compress-offload-playback6 speaker-and-display-port">
+ <path name="compress-offload-playback6 display-port" />
+ <path name="compress-offload-playback6" />
+ </path>
+
+ <path name="compress-offload-playback6 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 speaker-and-usb-headphones">
+ <path name="compress-offload-playback6 usb-headphones" />
+ <path name="compress-offload-playback6" />
+ </path>
+
+ <path name="compress-offload-playback6 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 speaker-and-headphones">
+ <path name="compress-offload-playback6 headphones" />
+ <path name="compress-offload-playback6" />
+ </path>
+
+ <path name="compress-offload-playback7">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 hdmi">
+ <ctl name="HDMI Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback7 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback7 speaker-and-hdmi">
+ <path name="compress-offload-playback7 hdmi" />
+ <path name="compress-offload-playback7" />
+ </path>
+
+ <path name="compress-offload-playback7 speaker-and-display-port">
+ <path name="compress-offload-playback7 display-port" />
+ <path name="compress-offload-playback7" />
+ </path>
+
+ <path name="compress-offload-playback7 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 speaker-and-usb-headphones">
+ <path name="compress-offload-playback7 usb-headphones" />
+ <path name="compress-offload-playback7" />
+ </path>
+
+ <path name="compress-offload-playback7 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 speaker-and-headphones">
+ <path name="compress-offload-playback7 headphones" />
+ <path name="compress-offload-playback7" />
+ </path>
+
+ <path name="compress-offload-playback8">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 hdmi">
+ <ctl name="HDMI Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback8 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback8 speaker-and-hdmi">
+ <path name="compress-offload-playback8 hdmi" />
+ <path name="compress-offload-playback8" />
+ </path>
+
+ <path name="compress-offload-playback8 speaker-and-display-port">
+ <path name="compress-offload-playback8 display-port" />
+ <path name="compress-offload-playback8" />
+ </path>
+
+ <path name="compress-offload-playback8 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 speaker-and-usb-headphones">
+ <path name="compress-offload-playback8 usb-headphones" />
+ <path name="compress-offload-playback8" />
+ </path>
+
+ <path name="compress-offload-playback8 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 speaker-and-headphones">
+ <path name="compress-offload-playback8 headphones" />
+ <path name="compress-offload-playback8" />
+ </path>
+
+ <path name="compress-offload-playback9">
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 hdmi">
+ <ctl name="HDMI Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 display-port">
+ <ctl name="DISPLAY_PORT Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 bt-sco">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-offload-playback9 bt-sco" />
+ </path>
+
+ <path name="compress-offload-playback9 speaker-and-hdmi">
+ <path name="compress-offload-playback9 hdmi" />
+ <path name="compress-offload-playback9" />
+ </path>
+
+ <path name="compress-offload-playback9 speaker-and-display-port">
+ <path name="compress-offload-playback9 display-port" />
+ <path name="compress-offload-playback9" />
+ </path>
+
+ <path name="compress-offload-playback9 afe-proxy">
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 usb-headphones">
+ <ctl name="USB_AUDIO_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 speaker-and-usb-headphones">
+ <path name="compress-offload-playback9 usb-headphones" />
+ <path name="compress-offload-playback9" />
+ </path>
+
+ <path name="compress-offload-playback9 headphones">
+ <ctl name="SLIMBUS_6_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 headphones-44.1">
+ <ctl name="SLIMBUS_5_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 headphones-dsd">
+ <ctl name="SLIMBUS_2_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 speaker-and-headphones">
+ <path name="compress-offload-playback9 headphones" />
+ <path name="compress-offload-playback9" />
+ </path>
+
+ <path name="audio-record">
+ <ctl name="MultiMedia1 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record usb-headset-mic">
+ <ctl name="MultiMedia1 Mixer USB_AUDIO_TX" value="1" />
+ </path>
+
+ <path name="audio-record bt-sco">
+ <ctl name="MultiMedia1 Mixer SLIM_7_TX" value="1" />
+ </path>
+
+ <path name="audio-record bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="audio-record bt-sco" />
+ </path>
+
+ <path name="audio-record capture-fm">
+ <ctl name="MultiMedia1 Mixer SLIM_8_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress">
+ <ctl name="MultiMedia8 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress bt-sco">
+ <ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
+ </path>
+
+ <path name="audio-record-compress bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="audio-record-compress bt-sco" />
+ </path>
+
+ <path name="audio-record-compress usb-headset-mic">
+ <ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="1" />
+ </path>
+
+ <path name="low-latency-record">
+ <ctl name="MultiMedia8 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="low-latency-record bt-sco">
+ <ctl name="MultiMedia8 Mixer SLIM_7_TX" value="1" />
+ </path>
+
+ <path name="low-latency-record bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="low-latency-record bt-sco" />
+ </path>
+
+ <path name="low-latency-record usb-headset-mic">
+ <ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="1" />
+ </path>
+
+ <path name="low-latency-record capture-fm">
+ <ctl name="MultiMedia8 Mixer SLIM_8_TX" value="1" />
+ </path>
+
+ <path name="fm-virtual-record capture-fm">
+ <ctl name="MultiMedia2 Mixer SLIM_8_TX" value="1" />
+ </path>
+
+ <path name="play-fm">
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
+ <ctl name="SLIMBUS_0_RX Port Mixer SLIM_8_TX" value="1" />
+ <ctl name="SLIMBUS_DL_HL Switch" value="1" />
+ </path>
+
+ <path name="play-fm headphones">
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
+ <ctl name="SLIMBUS_6_RX Port Mixer SLIM_8_TX" value="1" />
+ <ctl name="SLIMBUS6_DL_HL Switch" value="1" />
+ </path>
+
+ <path name="incall-rec-uplink">
+ <ctl name="MultiMedia1 Mixer VOC_REC_UL" value="1" />
+ </path>
+
+ <path name="incall-rec-uplink bt-sco">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink bt-sco-wb">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink usb-headset-mic">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink afe-proxy">
+ <path name="incall-rec-uplink" />
+ </path>
+
+ <path name="incall-rec-uplink-compress">
+ <ctl name="MultiMedia8 Mixer VOC_REC_UL" value="1" />
+ </path>
+
+ <path name="incall-rec-uplink-compress bt-sco">
+ <path name="incall-rec-uplink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-compress bt-sco-wb">
+ <path name="incall-rec-uplink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-compress usb-headset-mic">
+ <path name="incall-rec-uplink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-compress afe-proxy">
+ <path name="incall-rec-uplink-compress" />
+ </path>
+
+ <path name="incall-rec-downlink">
+ <ctl name="MultiMedia1 Mixer VOC_REC_DL" value="1" />
+ </path>
+
+ <path name="incall-rec-downlink bt-sco">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink bt-sco-wb">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink usb-headset-mic">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink afe-proxy">
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-downlink-compress">
+ <ctl name="MultiMedia8 Mixer VOC_REC_DL" value="1" />
+ </path>
+
+ <path name="incall-rec-downlink-compress bt-sco">
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-downlink-compress bt-sco-wb">
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-downlink-compress usb-headset-mic">
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-downlink-compress afe-proxy">
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink">
+ <path name="incall-rec-uplink" />
+ <path name="incall-rec-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink bt-sco">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink bt-sco-wb">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink usb-headset-mic">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink afe-proxy">
+ <path name="incall-rec-uplink-and-downlink" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress">
+ <path name="incall-rec-uplink-compress" />
+ <path name="incall-rec-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress bt-sco">
+ <path name="incall-rec-uplink-and-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress bt-sco-wb">
+ <path name="incall-rec-uplink-and-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress usb-headset-mic">
+ <path name="incall-rec-uplink-and-downlink-compress" />
+ </path>
+
+ <path name="incall-rec-uplink-and-downlink-compress afe-proxy">
+ <path name="incall-rec-uplink-and-downlink-compress" />
+ </path>
+
+ <path name="hfp-sco">
+ </path>
+
+ <path name="hfp-sco headphones">
+ </path>
+
+ <path name="hfp-sco-wb">
+ <path name="hfp-sco" />
+ </path>
+
+ <path name="hfp-sco-wb headphones">
+ <path name="hfp-sco headphones" />
+ </path>
+
+ <path name="compress-voip-call">
+ <ctl name="SLIM_0_RX_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
+ </path>
+
+ <path name="compress-voip-call headphones">
+ <ctl name="SLIM_6_RX_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer SLIM_0_TX_Voip" value="1" />
+ </path>
+
+
+ <path name="compress-voip-call bt-sco">
+ <ctl name="SLIM_7_RX_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer SLIM_7_TX_Voip" value="1" />
+ </path>
+
+ <path name="compress-voip-call bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="compress-voip-call bt-sco" />
+ </path>
+
+ <path name="compress-voip-call afe-proxy">
+ <ctl name="AFE_PCM_RX_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer AFE_PCM_TX_Voip" value="1" />
+ </path>
+
+ <path name="compress-voip-call usb-headphones">
+ <ctl name="USB_AUDIO_RX_Voice Mixer Voip" value="1" />
+ <ctl name="Voip_Tx Mixer USB_AUDIO_TX_Voip" value="1" />
+ </path>
+
+ <path name="compress-voip-call voice-speaker-vbat">
+ <path name="echo-reference speaker-vbat-mono" />
+ <path name="compress-voip-call"/>
+ </path>
+
+ <path name="voicemmode1-call">
+ <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer SLIM_0_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call headphones">
+ <ctl name="SLIM_6_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer SLIM_0_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call hdmi">
+ <ctl name="HDMI_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer SLIM_0_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call bt-sco">
+ <ctl name="SLIM_7_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer SLIM_7_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="voicemmode1-call bt-sco" />
+ </path>
+
+ <path name="voicemmode1-call afe-proxy">
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer AFE_PCM_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call usb-headphones">
+ <ctl name="USB_AUDIO_RX_Voice Mixer VoiceMMode1" value="1" />
+ <ctl name="VoiceMMode1_Tx Mixer USB_AUDIO_TX_MMode1" value="1" />
+ </path>
+
+ <path name="voicemmode1-call voice-speaker-vbat">
+ <path name="echo-reference speaker-vbat-mono" />
+ <path name="voicemmode1-call"/>
+ </path>
+
+ <path name="voicemmode2-call">
+ <ctl name="SLIM_0_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer SLIM_0_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call headphones">
+ <ctl name="SLIM_6_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer SLIM_0_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call hdmi">
+ <ctl name="HDMI_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer SLIM_0_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call bt-sco">
+ <ctl name="SLIM_7_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer SLIM_7_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call bt-sco-wb">
+ <ctl name="BT SampleRate" value="KHZ_16" />
+ <path name="voicemmode2-call bt-sco" />
+ </path>
+
+ <path name="voicemmode2-call afe-proxy">
+ <ctl name="AFE_PCM_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer AFE_PCM_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call usb-headphones">
+ <ctl name="USB_AUDIO_RX_Voice Mixer VoiceMMode2" value="1" />
+ <ctl name="VoiceMMode2_Tx Mixer USB_AUDIO_TX_MMode2" value="1" />
+ </path>
+
+ <path name="voicemmode2-call voice-speaker-vbat">
+ <path name="echo-reference speaker-vbat-mono" />
+ <path name="voicemmode2-call"/>
+ </path>
+
+ <path name="spkr-rx-calib">
+ <ctl name="SLIMBUS_DL_HL Switch" value="1" />
+ </path>
+
+ <path name="spkr-vi-record">
+ </path>
+
+ <!-- These are actual sound device specific mixer settings -->
+ <path name="amic1">
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1"/>
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="CDC_IF TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="AMIC" />
+ <ctl name="AMIC MUX6" value="ADC1" />
+ <ctl name="IIR0 INP0 MUX" value="DEC6" />
+ </path>
+
+ <path name="amic2">
+ <ctl name="AIF1_CAP Mixer SLIM TX0" value="1"/>
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="CDC_IF TX0 MUX" value="DEC0" />
+ <ctl name="ADC MUX0" value="AMIC" />
+ <ctl name="AMIC MUX0" value="ADC2" />
+ <ctl name="IIR0 INP0 MUX" value="DEC0" />
+ </path>
+
+ <!-- For Tavil, DMIC numbered from 0 to 5 -->
+ <path name="dmic1">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC0" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="dmic2">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1"/>
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC1" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="dmic3">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="dmic4">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC3" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="dmic5">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC4" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="dmic6">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC5" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="speaker">
+ <ctl name="SLIM RX0 MUX" value="AIF1_PB" />
+ <ctl name="CDC_IF RX0 MUX" value="SLIM RX0" />
+ <ctl name="SLIM_0_RX Channels" value="One" />
+ <ctl name="RX INT7_1 MIX1 INP0" value="RX0" />
+ <ctl name="COMP7 Switch" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft BOOST Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ </path>
+
+ <path name="speaker-mono">
+ <ctl name="SLIM RX0 MUX" value="AIF1_PB" />
+ <ctl name="CDC_IF RX0 MUX" value="SLIM RX0" />
+ <ctl name="SLIM_0_RX Channels" value="One" />
+ <ctl name="RX INT7_1 MIX1 INP0" value="RX0" />
+ <ctl name="COMP7 Switch" value="1" />
+ <ctl name="SpkrLeft COMP Switch" value="1" />
+ <ctl name="SpkrLeft BOOST Switch" value="1" />
+ <ctl name="SpkrLeft VISENSE Switch" value="1" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ </path>
+
+ <path name="speaker-fluid">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="speaker-liquid">
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-vbat-mono">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="speaker-vbat">
+ <path name="speaker" />
+ </path>
+
+ <path name="sidetone-iir">
+ <ctl name="IIR0 Enable Band1" value="1" />
+ <ctl name="IIR0 Enable Band2" value="1" />
+ <ctl name="IIR0 Enable Band3" value="1" />
+ <ctl name="IIR0 Enable Band4" value="1" />
+ <ctl name="IIR0 Enable Band5" value="1" />
+ </path>
+
+ <path name="sidetone-headphones">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="54" />
+ <ctl name="RX INT1 MIX2 INP" value="SRC0" />
+ <ctl name="RX INT2 MIX2 INP" value="SRC0" />
+ </path>
+
+ <path name="sidetone-handset">
+ <path name="sidetone-iir" />
+ <ctl name="IIR0 INP0 Volume" value="54" />
+ <ctl name="RX INT7 MIX2 INP" value="SRC0" />
+ </path>
+
+ <path name="speaker-mic">
+ <path name="dmic3" />
+ </path>
+
+ <path name="speaker-mic-liquid">
+ <path name="dmic3" />
+ </path>
+
+ <path name="speaker-mic-sbc">
+ </path>
+
+ <path name="speaker-protected">
+ <ctl name="AIF4_VI Mixer SPKR_VI_1" value="1" />
+ <ctl name="SLIM_4_TX Format" value="PACKED_16B" />
+ <path name="speaker" />
+ <ctl name="VI_FEED_TX Channels" value="One" />
+ <ctl name="SLIM0_RX_VI_FB_LCH_MUX" value="SLIM4_TX" />
+ </path>
+
+ <path name="voice-speaker-protected">
+ <ctl name="AIF4_VI Mixer SPKR_VI_1" value="1" />
+ <ctl name="SLIM_4_TX Format" value="PACKED_16B" />
+ <path name="speaker-mono" />
+ <ctl name="VI_FEED_TX Channels" value="One" />
+ <ctl name="SLIM0_RX_VI_FB_LCH_MUX" value="SLIM4_TX" />
+ </path>
+
+ <path name="vi-feedback">
+ </path>
+
+ <path name="speaker-protected-vbat">
+ <path name="speaker-protected" />
+ </path>
+
+ <path name="voice-speaker-protected-vbat">
+ <path name="voice-speaker-protected" />
+ </path>
+
+ <path name="handset">
+ <ctl name="SLIM RX0 MUX" value="AIF1_PB" />
+ <ctl name="CDC_IF RX0 MUX" value="SLIM RX0" />
+ <ctl name="SLIM_0_RX Channels" value="One" />
+ <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
+ <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="EAR PA Gain" value="G_6_DB" />
+ </path>
+
+ <path name="handset-mic">
+ <path name="dmic1" />
+ </path>
+
+ <path name="handset-mic-db">
+ </path>
+
+ <path name="handset-mic-cdp">
+ <path name="amic1" />
+ </path>
+
+ <path name="handset-mic-sbc">
+ </path>
+
+ <path name="three-mic">
+ <ctl name="AIF1_CAP Mixer SLIM TX0" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX1" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX2" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Three" />
+ <ctl name="CDC_IF TX0 MUX" value="DEC0" />
+ <ctl name="ADC MUX0" value="DMIC" />
+ <ctl name="DMIC MUX" value="DMIC0" />
+ <ctl name="CDC_IF TX1 MUX" value="DEC1" />
+ <ctl name="ADC MUX1" value="DMIC" />
+ <ctl name="DMIC MUX1" value="DMIC1" />
+ <ctl name="CDC_IF TX2 MUX" value="DEC2" />
+ <ctl name="ADC MUX2" value="DMIC" />
+ <ctl name="DMIC MUX2" value="DMIC2" />
+ </path>
+
+ <path name="anc-handset">
+ <ctl name="ANC Function" value="ON" />
+ <ctl name="ANC Slot" value="6" />
+ <ctl name="SLIM RX0 MUX" value="AIF1_PB" />
+ <ctl name="CDC_IF RX0 MUX" value="SLIM RX0" />
+ <ctl name="SLIM_0_RX Channels" value="One" />
+ <ctl name="RX INT7_1 MIX1 INP0" value="RX0" />
+ <ctl name="SpkrLeft SWR DAC_Port Switch" value="1" />
+ <ctl name="ANC OUT EAR SPKR Enable Switch" value="1" />
+ <ctl name="ANC SPKR PA Enable Switch" value="1" />
+ <ctl name="SpkrLeft WSA PA Gain" value="G_6_DB" />
+ </path>
+
+ <path name="headphones">
+ <ctl name="SLIM RX2 MUX" value="AIF4_PB" />
+ <ctl name="SLIM RX3 MUX" value="AIF4_PB" />
+ <ctl name="SLIM_6_RX Channels" value="Two" />
+ <ctl name="RX INT1_2 MUX" value="RX2" />
+ <ctl name="RX INT2_2 MUX" value="RX3" />
+ </path>
+
+ <path name="headphones-44.1">
+ <ctl name="SLIM RX4 MUX" value="AIF3_PB" />
+ <ctl name="SLIM RX5 MUX" value="AIF3_PB" />
+ <ctl name="SLIM_5_RX Channels" value="Two" />
+ <ctl name="CDC_IF RX4 MUX" value="SLIM RX4" />
+ <ctl name="CDC_IF RX5 MUX" value="SLIM RX5" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="RX4" />
+ <ctl name="RX INT2_1 MIX1 INP0" value="RX5" />
+ <ctl name="RX INT1_1 NATIVE MUX" value="ON" />
+ <ctl name="RX INT2_1 NATIVE MUX" value="ON" />
+ <ctl name="SLIM_5_RX SampleRate" value="KHZ_44P1" />
+ <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT2 DEM MUX" value="CLSH_DSM_OUT" />
+ </path>
+
+ <path name="asrc-mode">
+ <ctl name="RX INT1_2 NATIVE MUX" value="ON" />
+ <ctl name="RX INT2_2 NATIVE MUX" value="ON" />
+ <ctl name="ASRC0 MUX" value="ASRC_IN_HPHL" />
+ <ctl name="RX INT1 SEC MIX HPHL Switch" value="1" />
+ <ctl name="ASRC1 MUX" value="ASRC_IN_HPHR" />
+ <ctl name="RX INT2 SEC MIX HPHR Switch" value="1" />
+ </path>
+
+ <path name="headphones-dsd">
+ <ctl name="SLIM RX6 MUX" value="AIF2_PB" />
+ <ctl name="SLIM RX7 MUX" value="AIF2_PB" />
+ <ctl name="SLIM_2_RX Channels" value="Two" />
+ <ctl name="DSD_L IF MUX" value="RX6" />
+ <ctl name="DSD_R IF MUX" value="RX7" />
+ <ctl name="RX INT1 MIX3 DSD HPHL Switch" value="1" />
+ <ctl name="RX INT2 MIX3 DSD HPHR Switch" value="1" />
+ <ctl name="SLIM_2_RX Format" value="DSD_DOP" />
+ </path>
+
+ <path name="hph-highquality-mode">
+ <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
+ </path>
+
+ <path name="hph-lowpower-mode">
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
+ </path>
+
+ <path name="true-native-mode">
+ <ctl name="SLIM RX2 MUX" value="AIF3_PB" />
+ <ctl name="SLIM RX3 MUX" value="AIF3_PB" />
+ <ctl name="CDC_IF RX2 MUX" value="SLIM RX2" />
+ <ctl name="CDC_IF RX3 MUX" value="SLIM RX3" />
+ <ctl name="RX INT1 NATIVE MUX" value="ON" />
+ <ctl name="RX INT2 NATIVE MUX" value="ON" />
+ <ctl name="SLIM_5_RX Channels" value="Two" />
+ <ctl name="RX INT1_1 MIX1 INP0" value="RX2" />
+ <ctl name="RX INT2_1 MIX1 INP1" value="RX3" />
+ <ctl name="SLIM_5_RX SampleRate" value="KHZ_44P1" />
+ <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="RX INT2 DEM MUX" value="CLSH_DSM_OUT" />
+ <ctl name="COMP1" value="1" />
+ <ctl name="COMP2" value="1" />
+ </path>
+
+ <path name="line">
+ <path name="headphones" />
+ </path>
+
+ <path name="headset-mic">
+ <path name="amic2" />
+ </path>
+
+ <path name="headset-mic-liquid">
+ <path name="amic2" />
+ </path>
+
+ <path name="voice-handset">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-handset-tmus">
+ <path name="handset" />
+ </path>
+
+ <path name="voice-speaker">
+ <path name="speaker-mono" />
+ </path>
+
+ <path name="voice-speaker-fluid">
+ <path name="speaker-fluid" />
+ </path>
+
+ <path name="voice-speaker-mic">
+ <path name="speaker-mic" />
+ </path>
+
+ <path name="voice-speaker-vbat">
+ <path name="speaker-vbat-mono" />
+ </path>
+
+ <path name="voice-headphones">
+ <path name="headphones" />
+ </path>
+
+ <path name="voice-line">
+ <path name="voice-headphones" />
+ </path>
+
+ <path name="voice-headset-mic">
+ <path name="headset-mic" />
+ </path>
+
+ <path name="speaker-and-headphones">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-and-line">
+ <path name="speaker-and-headphones" />
+ </path>
+
+ <path name="speaker-and-headphones-liquid">
+ <path name="headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="speaker-and-line-liquid">
+ <path name="speaker-and-headphones-liquid" />
+ </path>
+
+ <path name="usb-headphones">
+ </path>
+
+ <path name="afe-proxy">
+ </path>
+
+ <path name="anc-headphones">
+ <path name="headphones" />
+ </path>
+
+ <path name="speaker-and-anc-headphones">
+ <path name="anc-headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="anc-fb-headphones">
+ <path name="anc-headphones" />
+ </path>
+
+ <path name="speaker-and-anc-fb-headphones">
+ <path name="anc-fb-headphones" />
+ <path name="speaker" />
+ </path>
+
+ <path name="voice-anc-headphones">
+ <path name="voice-headphones" />
+ </path>
+
+ <path name="voice-anc-fb-headphones">
+ <path name="voice-headphones" />
+ </path>
+
+ <path name="speaker-and-anc-headphones-liquid">
+ <path name="anc-headphones" />
+ </path>
+
+ <path name="hdmi">
+ </path>
+
+ <path name="display-port">
+ </path>
+
+ <path name="speaker-and-usb-headphones">
+ <path name="speaker" />
+ <path name="usb-headphones" />
+ </path>
+
+ <path name="speaker-and-hdmi">
+ <path name="speaker" />
+ <path name="hdmi" />
+ </path>
+
+ <path name="speaker-and-display-port">
+ <path name="speaker" />
+ <path name="display-port" />
+ </path>
+
+ <path name="voice-rec-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="camcorder-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="hdmi-tx">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="bt-sco-headset">
+ </path>
+
+ <path name="bt-sco-mic">
+ </path>
+
+ <path name="bt-sco-headset-wb">
+ </path>
+
+ <path name="bt-sco-mic-wb">
+ </path>
+
+ <path name="usb-headset-mic">
+ </path>
+
+ <path name="capture-fm">
+ </path>
+
+ <path name="aanc-handset-mic">
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX9" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Three" />
+ <ctl name="AANC_SLIM_0_RX MUX" value="SLIMBUS_0_TX" />
+ <ctl name="CDC_IF TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC2" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC4" />
+ <ctl name="CDC_IF TX9 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC0" />
+ <ctl name="IIR0 INP0 MUX" value="DEC6" />
+ <ctl name="ADC MUX10" value="DMIC" />
+ <ctl name="DMIC MUX10" value="DMIC4" />
+ <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
+ </path>
+
+ <!-- Dual MIC devices -->
+ <path name="handset-dmic-endfire">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC4" />
+ <ctl name="SLIM_0_TX Channels" value="Two" />
+ </path>
+
+ <path name="speaker-dmic-endfire">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC1" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC4" />
+ <ctl name="SLIM_0_TX Channels" value="Two" />
+ </path>
+
+ <path name="dmic-endfire">
+ <path name="handset-dmic-endfire" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="dmic-endfire-liquid">
+ <path name="handset-dmic-endfire" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="handset-stereo-dmic-ef">
+ <path name="handset-dmic-endfire" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef-tmus">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-speaker-dmic-ef">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-rec-dmic-ef">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-fluence">
+ <path name="dmic-endfire" />
+ </path>
+
+ <path name="handset-stereo-dmic-ef-liquid">
+ <path name="handset-dmic-endfire" />
+ </path>
+
+ <path name="speaker-stereo-dmic-ef-liquid">
+ <path name="speaker-dmic-endfire" />
+ </path>
+
+ <path name="voice-dmic-ef-liquid-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-speaker-dmic-ef-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="voice-rec-dmic-ef-fluence-liquid">
+ <path name="dmic-endfire-liquid" />
+ </path>
+
+ <path name="speaker-dmic-broadside">
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Two" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC1" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC2" />
+ </path>
+
+ <path name="dmic-broadside">
+ <path name="speaker-dmic-broadside" />
+ <ctl name="IIR0 INP0 MUX" value="DEC7" />
+ </path>
+
+ <path name="voice-speaker-dmic-broadside">
+ <path name="dmic-broadside" />
+ </path>
+
+ <!-- Quad MIC devices -->
+ <path name="speaker-qmic">
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Four" />
+ <ctl name="CDC_IF TX5 MUX" value="DEC5" />
+ <ctl name="ADC MUX5" value="DMIC" />
+ <ctl name="DMIC MUX5" value="DMIC1" />
+ <ctl name="CDC_IF TX6 MUX" value="DEC6" />
+ <ctl name="ADC MUX6" value="DMIC" />
+ <ctl name="DMIC MUX6" value="DMIC0" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC4" />
+ </path>
+
+ <path name="speaker-qmic-liquid">
+ </path>
+
+ <path name="voice-speaker-qmic">
+ <path name="speaker-qmic" />
+ </path>
+
+ <path name="quad-mic">
+ <path name="speaker-qmic" />
+ </path>
+
+ <path name="voice-speaker-qmic-liquid">
+ <path name="speaker-qmic-liquid" />
+ </path>
+
+ <path name="quad-mic-liquid">
+ <path name="speaker-qmic-liquid" />
+ </path>
+
+ <!-- TTY devices -->
+
+ <path name="tty-headphones">
+ <ctl name="SLIM RX2 MUX" value="AIF4_PB" />
+ <ctl name="SLIM_6_RX Channels" value="One" />
+ <ctl name="RX INT1_2 MUX" value="RX2" />
+ </path>
+
+ <path name="voice-tty-full-headphones">
+ <ctl name="TTY Mode" value="FULL" />
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-vco-headphones">
+ <ctl name="TTY Mode" value="VCO" />
+ <path name="tty-headphones" />
+ </path>
+
+ <path name="voice-tty-hco-handset">
+ <ctl name="TTY Mode" value="HCO" />
+ <path name="handset" />
+ </path>
+
+ <path name="voice-tty-full-headset-mic">
+ <path name="amic2" />
+ </path>
+
+ <path name="voice-tty-hco-headset-mic">
+ <path name="voice-tty-full-headset-mic" />
+ </path>
+
+ <path name="voice-tty-vco-handset-mic">
+ <path name="dmic1" />
+ </path>
+
+ <path name="unprocessed-handset-mic">
+ <path name="handset-mic" />
+ </path>
+
+ <path name="unprocessed-mic">
+ <path name="unprocessed-handset-mic" />
+ </path>
+
+ <!-- Added for ADSP testfwk -->
+ <path name="ADSP testfwk">
+ <ctl name="SLIMBUS_DL_HL Switch" value="1" />
+ </path>
+
+ <path name="bt-a2dp">
+ <ctl name="BT SampleRate" value="KHZ_48" />
+ <ctl name="AFE Input Channels" value="Two" />
+ <ctl name="SLIM7_RX ADM Channels" value="Two" />
+ </path>
+
+ <path name="speaker-and-bt-a2dp">
+ <path name="speaker" />
+ <path name="bt-a2dp" />
+ </path>
+
+ <path name="deep-buffer-playback bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="1" />
+ </path>
+
+ <path name="low-latency-playback bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia5" value="1" />
+ </path>
+
+ <path name="compress-offload-playback bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia4" value="1" />
+ </path>
+
+ <path name="compress-offload-playback2 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia7" value="1" />
+ </path>
+
+ <path name="compress-offload-playback3 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia10" value="1" />
+ </path>
+
+ <path name="compress-offload-playback4 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia11" value="1" />
+ </path>
+
+ <path name="compress-offload-playback5 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia12" value="1" />
+ </path>
+
+ <path name="compress-offload-playback6 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia13" value="1" />
+ </path>
+
+ <path name="compress-offload-playback7 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia14" value="1" />
+ </path>
+
+ <path name="compress-offload-playback8 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia15" value="1" />
+ </path>
+
+ <path name="compress-offload-playback9 bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="1" />
+ </path>
+
+ <path name="audio-ull-playback bt-a2dp">
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia3" value="1" />
+ </path>
+
+ <path name="deep-buffer-playback speaker-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="low-latency-playback speaker-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-playback3 speaker-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-playback5 speaker-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-playback7 speaker-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-playback9 speaker-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>
+</mixer>
diff --git a/configs/msmcobalt/mixer_paths_tasha.xml b/configs/msmcobalt/mixer_paths_tasha.xml
index 038408c..23c0f06 100644
--- a/configs/msmcobalt/mixer_paths_tasha.xml
+++ b/configs/msmcobalt/mixer_paths_tasha.xml
@@ -205,12 +205,6 @@
<ctl name="MultiMedia1 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia5 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="0" />
- <ctl name="USB_AUDIO_RX Channels" value="One" />
- <ctl name="USB_AUDIO_RX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_RX Format" value="S16_LE" />
- <ctl name="USB_AUDIO_TX Channels" value="One" />
- <ctl name="USB_AUDIO_TX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_TX Format" value="S16_LE" />
<ctl name="MultiMedia6 Mixer SLIM_0_TX" value="0" />
<ctl name="IIR0 INP0 MUX" value="ZERO" />
<ctl name="IIR0 INP1 MUX" value="ZERO" />
@@ -399,7 +393,7 @@
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="0" />
<!-- usb headset end -->
<!-- fm -->
- <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="0" />
<ctl name="SLIMBUS_0_RX Port Mixer SLIM_8_TX" value="0" />
<ctl name="SLIMBUS_DL_HL Switch" value="0" />
<ctl name="SLIMBUS_6_RX Port Mixer SLIM_8_TX" value="0" />
@@ -2299,6 +2293,12 @@
<path name="capture-fm">
</path>
+ <path name="aanc-path">
+ <ctl name="ADC MUX10" value="DMIC" />
+ <ctl name="DMIC MUX10" value="DMIC4" />
+ <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
+ </path>
+
<path name="aanc-handset-mic">
<ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
<ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
@@ -2315,9 +2315,6 @@
<ctl name="ADC MUX7" value="DMIC" />
<ctl name="DMIC MUX7" value="DMIC0" />
<ctl name="IIR0 INP0 MUX" value="DEC6" />
- <ctl name="ADC MUX10" value="DMIC" />
- <ctl name="DMIC MUX10" value="DMIC4" />
- <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
</path>
<!-- Dual MIC devices -->
diff --git a/configs/msmcobalt/mixer_paths_tavil.xml b/configs/msmcobalt/mixer_paths_tavil.xml
index 4baaa52..555555d 100644
--- a/configs/msmcobalt/mixer_paths_tavil.xml
+++ b/configs/msmcobalt/mixer_paths_tavil.xml
@@ -166,12 +166,6 @@
<ctl name="MultiMedia1 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia5 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="0" />
- <ctl name="USB_AUDIO_RX Channels" value="One" />
- <ctl name="USB_AUDIO_RX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_RX Format" value="S16_LE" />
- <ctl name="USB_AUDIO_TX Channels" value="One" />
- <ctl name="USB_AUDIO_TX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_TX Format" value="S16_LE" />
<ctl name="MultiMedia6 Mixer SLIM_0_TX" value="0" />
<ctl name="SLIM_2_RX Format" value="UNPACKED" />
<ctl name="SLIM_2_RX SampleRate" value="KHZ_48" />
@@ -222,7 +216,7 @@
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia5" value="0" />
<!-- usb headset end -->
<!-- fm -->
- <ctl name="SLIMBUS_8 LOOPBACK Volume" value="1" />
+ <ctl name="SLIMBUS_8 LOOPBACK Volume" value="0" />
<ctl name="SLIMBUS_0_RX Port Mixer SLIM_8_TX" value="0" />
<ctl name="SLIMBUS_DL_HL Switch" value="0" />
<ctl name="SLIMBUS_6_RX Port Mixer SLIM_8_TX" value="0" />
@@ -480,6 +474,8 @@
<!-- Headphone Default mode - uLP -->
<ctl name="RX HPH Mode" value="CLS_H_ULP" />
+ <ctl name="ASRC0 Output Mode" value="INT" />
+ <ctl name="ASRC1 Output Mode" value="INT" />
<!-- IIR/voice anc -->
<ctl name="IIR0 Band1" id ="0" value="268435456" />
@@ -1887,6 +1883,8 @@
</path>
<path name="asrc-mode">
+ <ctl name="ASRC0 Output Mode" value="FRAC" />
+ <ctl name="ASRC1 Output Mode" value="FRAC" />
<ctl name="RX INT1_2 NATIVE MUX" value="ON" />
<ctl name="RX INT2_2 NATIVE MUX" value="ON" />
<ctl name="ASRC0 MUX" value="ASRC_IN_HPHL" />
@@ -2070,6 +2068,12 @@
<path name="capture-fm">
</path>
+ <path name="aanc-path">
+ <ctl name="ADC MUX10" value="DMIC" />
+ <ctl name="DMIC MUX10" value="DMIC4" />
+ <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
+ </path>
+
<path name="aanc-handset-mic">
<ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
<ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
@@ -2086,9 +2090,6 @@
<ctl name="ADC MUX7" value="DMIC" />
<ctl name="DMIC MUX7" value="DMIC0" />
<ctl name="IIR0 INP0 MUX" value="DEC6" />
- <ctl name="ADC MUX10" value="DMIC" />
- <ctl name="DMIC MUX10" value="DMIC4" />
- <ctl name="ANC0 FB MUX" value="ANC_IN_EAR_SPKR" />
</path>
<!-- Dual MIC devices -->
diff --git a/configs/msmcobalt/msmcobalt.mk b/configs/msmcobalt/msmcobalt.mk
index e3b05ef..12a922c 100644
--- a/configs/msmcobalt/msmcobalt.mk
+++ b/configs/msmcobalt/msmcobalt.mk
@@ -22,8 +22,7 @@
AUDIO_FEATURE_ENABLED_HDMI_PASSTHROUGH := true
#AUDIO_FEATURE_ENABLED_KEEP_ALIVE := true
AUDIO_FEATURE_ENABLED_DISPLAY_PORT := true
-#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
-#DOLBY_DDP := true
+AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true
AUDIO_FEATURE_ENABLED_HFP := true
AUDIO_FEATURE_ENABLED_INCALL_MUSIC := false
AUDIO_FEATURE_ENABLED_MULTI_VOICE_SESSIONS := true
@@ -44,7 +43,7 @@
AUDIO_FEATURE_ENABLED_DTS_EAGLE := false
BOARD_USES_SRS_TRUEMEDIA := false
DTS_CODEC_M_ := false
-AUDIO_FEATURE_ENABLED_DEV_ARBI := true
+AUDIO_FEATURE_ENABLED_DEV_ARBI := false
MM_AUDIO_ENABLED_FTM := true
MM_AUDIO_ENABLED_SAFX := true
TARGET_USES_QCOM_MM_AUDIO := true
@@ -75,6 +74,8 @@
hardware/qcom/audio/configs/msmcobalt/mixer_paths.xml:system/etc/mixer_paths.xml \
hardware/qcom/audio/configs/msmcobalt/mixer_paths_tasha.xml:system/etc/mixer_paths_tasha.xml \
hardware/qcom/audio/configs/msmcobalt/mixer_paths_tavil.xml:system/etc/mixer_paths_tavil.xml \
+ hardware/qcom/audio/configs/msmcobalt/mixer_paths_skuk.xml:system/etc/mixer_paths_skuk.xml \
+ hardware/qcom/audio/configs/msmcobalt/mixer_paths_skuk.xml:system/etc/mixer_paths_qvr.xml \
hardware/qcom/audio/configs/msmcobalt/mixer_paths_dtp.xml:system/etc/mixer_paths_dtp.xml \
hardware/qcom/audio/configs/msmcobalt/mixer_paths_i2s.xml:system/etc/mixer_paths_i2s.xml \
hardware/qcom/audio/configs/msmcobalt/aanc_tuning_mixer.txt:system/etc/aanc_tuning_mixer.txt \
@@ -210,3 +211,6 @@
PRODUCT_PROPERTY_OVERRIDES += \
qcom.hw.aac.encoder=true
+#Disable FM a2dp concurrency
+PRODUCT_PROPERTY_OVERRIDES += \
+fm.a2dp.conc.disabled=true
diff --git a/configs/msmcobalt/sound_trigger_mixer_paths_wcd9340.xml b/configs/msmcobalt/sound_trigger_mixer_paths_wcd9340.xml
index d12b62f..be77fee 100755
--- a/configs/msmcobalt/sound_trigger_mixer_paths_wcd9340.xml
+++ b/configs/msmcobalt/sound_trigger_mixer_paths_wcd9340.xml
@@ -106,10 +106,12 @@
</path>
<path name="listen-ape-handset-mic">
- <ctl name="MAD_BROADCAST Switch" value="1" />
- <ctl name="TX13 INP MUX" value="MAD_BRDCST" />
- <ctl name="AIF4_MAD Mixer SLIM TX13" value="1" />
<ctl name="MAD Input" value="DMIC0" />
+ <ctl name="MAD_SEL MUX" value="MSM" />
+ <ctl name="MAD_INP MUX" value="MAD" />
+ <ctl name="MAD_BROADCAST Switch" value="1" />
+ <ctl name="CDC_IF TX13 MUX" value="MAD_BRDCST" />
+ <ctl name="AIF4_MAD Mixer SLIM TX13" value="1" />
</path>
</mixer>
diff --git a/configs/msmcobalt/sound_trigger_platform_info.xml b/configs/msmcobalt/sound_trigger_platform_info.xml
index 6c9f55e..15c8ef6 100644
--- a/configs/msmcobalt/sound_trigger_platform_info.xml
+++ b/configs/msmcobalt/sound_trigger_platform_info.xml
@@ -50,7 +50,13 @@
<param max_cpe_users="3" />
<param max_ape_phrases="10" />
<param max_ape_users="10" />
+ <!-- Profile specific data which the algorithm can support -->
<param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="1"/>
+ <!-- adm_cfg_profile should match with the one defined under adm_config -->
+ <!-- Set it to NONE if LSM directly connects to AFE -->
+ <param adm_cfg_profile="NONE" />
<gcs_usecase>
<param uid="0x1" />
<!-- module_id, instance_id, param_id -->
@@ -82,4 +88,13 @@
<param capture_keyword="PCM_packet, RT, 2000" />
<param client_capture_read_delay="2000" />
</sound_model_config>
+
+ <!-- Multiple adm_config tags can be listed, each with unique profile name. -->
+ <!-- app_type to match corresponding value from ACDB -->
+ <adm_config>
+ <param adm_cfg_profile="DEFAULT" />
+ <param app_type="69938" />
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ </adm_config>
</sound_trigger_platform_info>
diff --git a/configs/msmfalcon/audio_policy_configuration.xml b/configs/msmfalcon/audio_policy_configuration.xml
index ea4b140..b1ea1b9 100644
--- a/configs/msmfalcon/audio_policy_configuration.xml
+++ b/configs/msmfalcon/audio_policy_configuration.xml
@@ -81,13 +81,13 @@
<mixPort name="direct_pcm" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
- samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
</mixPort>
<mixPort name="compressed_offload" role="source"
diff --git a/configs/msmfalcon/msmfalcon.mk b/configs/msmfalcon/msmfalcon.mk
index 2e29d7a..554f32b 100644
--- a/configs/msmfalcon/msmfalcon.mk
+++ b/configs/msmfalcon/msmfalcon.mk
@@ -39,7 +39,7 @@
AUDIO_FEATURE_ENABLED_DTS_EAGLE := false
BOARD_USES_SRS_TRUEMEDIA := false
DTS_CODEC_M_ := false
-AUDIO_FEATURE_ENABLED_DEV_ARBI := true
+AUDIO_FEATURE_ENABLED_DEV_ARBI := false
MM_AUDIO_ENABLED_FTM := true
MM_AUDIO_ENABLED_SAFX := true
TARGET_USES_QCOM_MM_AUDIO := true
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index ea1092a..d0959e8 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -62,6 +62,7 @@
#define MEDIA_FMT_SBC_ALLOCATION_METHOD_LOUDNESS 0
#define MEDIA_FMT_SBC_ALLOCATION_METHOD_SNR 1
#define MIXER_ENC_CONFIG_BLOCK "SLIM_7_RX Encoder Config"
+#define MIXER_ENC_BIT_FORMAT "AFE Input Bit Format"
#define MIXER_ENC_FMT_SBC "SBC"
#define MIXER_ENC_FMT_AAC "AAC"
#define MIXER_ENC_FMT_APTX "APTX"
@@ -103,7 +104,7 @@
audio_get_codec_config_t audio_get_codec_config;
enum A2DP_STATE bt_state;
audio_format_t bt_encoder_format;
- void *enc_config_data;
+ uint32_t enc_sampling_rate;
bool a2dp_started;
bool a2dp_suspended;
int a2dp_total_active_session_request;
@@ -280,7 +281,7 @@
a2dp.a2dp_total_active_session_request = 0;
a2dp.a2dp_suspended = false;
a2dp.bt_encoder_format = AUDIO_FORMAT_INVALID;
- a2dp.enc_config_data = NULL;
+ a2dp.enc_sampling_rate = 48000;
a2dp.bt_state = A2DP_STATE_DISCONNECTED;
} else {
ALOGD("close a2dp called in improper state");
@@ -288,7 +289,7 @@
a2dp.a2dp_total_active_session_request = 0;
a2dp.a2dp_suspended = false;
a2dp.bt_encoder_format = AUDIO_FORMAT_INVALID;
- a2dp.enc_config_data = NULL;
+ a2dp.enc_sampling_rate = 48000;
a2dp.bt_state = A2DP_STATE_DISCONNECTED;
}
@@ -298,7 +299,7 @@
/* API to configure SBC DSP encoder */
bool configure_sbc_enc_format(audio_sbc_encoder_config *sbc_bt_cfg)
{
- struct mixer_ctl *ctl_enc_data;
+ struct mixer_ctl *ctl_enc_data = NULL, *ctrl_bit_format = NULL;
struct sbc_enc_cfg_t sbc_dsp_cfg;
bool is_configured = false;
int ret = 0;
@@ -343,8 +344,25 @@
if (ret != 0) {
ALOGE("%s: failed to set SBC encoder config", __func__);
is_configured = false;
- } else
- is_configured = true;
+ goto fail;
+ }
+ ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
+ MIXER_ENC_BIT_FORMAT);
+ if (!ctrl_bit_format) {
+ ALOGE(" ERROR bit format CONFIG data mixer control not identifed");
+ is_configured = false;
+ goto fail;
+ }
+ ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
+ if (ret != 0) {
+ ALOGE("%s: Failed to set bit format to encoder", __func__);
+ is_configured = false;
+ goto fail;
+ }
+ is_configured = true;
+ a2dp.enc_sampling_rate = sbc_bt_cfg->sampling_rate;
+ ALOGV("Successfully updated SBC enc format with samplingrate: %d channelmode:%d",
+ sbc_dsp_cfg.sample_rate, sbc_dsp_cfg.channel_mode);
fail:
return is_configured;
}
@@ -352,7 +370,7 @@
/* API to configure APTX DSP encoder */
bool configure_aptx_enc_format(audio_aptx_encoder_config *aptx_bt_cfg)
{
- struct mixer_ctl *ctl_enc_data;
+ struct mixer_ctl *ctl_enc_data = NULL, *ctrl_bit_format = NULL;
struct custom_enc_cfg_aptx_t aptx_dsp_cfg;
bool is_configured = false;
int ret = 0;
@@ -388,17 +406,33 @@
is_configured = false;
goto fail;
}
+ ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
+ MIXER_ENC_BIT_FORMAT);
+ if (!ctrl_bit_format) {
+ ALOGE("ERROR bit format CONFIG data mixer control not identifed");
+ is_configured = false;
+ goto fail;
+ } else {
+ ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
+ if (ret != 0) {
+ ALOGE("%s: Failed to set bit format to encoder", __func__);
+ is_configured = false;
+ goto fail;
+ }
+ }
is_configured = true;
+ a2dp.enc_sampling_rate = aptx_bt_cfg->sampling_rate;
+ ALOGV("Successfully updated APTX enc format with samplingrate: %d channels:%d",
+ aptx_dsp_cfg.sample_rate, aptx_dsp_cfg.num_channels);
fail:
return is_configured;
}
/* API to configure APTX HD DSP encoder
- * TODO: ADD 24 bit configuration support
*/
bool configure_aptx_hd_enc_format(audio_aptx_encoder_config *aptx_bt_cfg)
{
- struct mixer_ctl *ctl_enc_data;
+ struct mixer_ctl *ctl_enc_data = NULL, *ctrl_bit_format = NULL;
struct custom_enc_cfg_aptx_t aptx_dsp_cfg;
bool is_configured = false;
int ret = 0;
@@ -412,6 +446,7 @@
is_configured = false;
goto fail;
}
+
a2dp.bt_encoder_format = AUDIO_FORMAT_APTX_HD;
memset(&aptx_dsp_cfg, 0x0, sizeof(struct custom_enc_cfg_aptx_t));
aptx_dsp_cfg.enc_format = ENC_MEDIA_FMT_APTX_HD;
@@ -434,7 +469,22 @@
is_configured = false;
goto fail;
}
+ ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer, MIXER_ENC_BIT_FORMAT);
+ if (!ctrl_bit_format) {
+ ALOGE(" ERROR bit format CONFIG data mixer control not identifed");
+ is_configured = false;
+ goto fail;
+ }
+ ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S24_LE");
+ if (ret != 0) {
+ ALOGE("%s: Failed to set APTX HD encoder config", __func__);
+ is_configured = false;
+ goto fail;
+ }
is_configured = true;
+ a2dp.enc_sampling_rate = aptx_bt_cfg->sampling_rate;
+ ALOGV("Successfully updated APTX HD encformat with samplingrate: %d channels:%d",
+ aptx_dsp_cfg.sample_rate, aptx_dsp_cfg.num_channels);
fail:
return is_configured;
}
@@ -442,7 +492,7 @@
/* API to configure AAC DSP encoder */
bool configure_aac_enc_format(audio_aac_encoder_config *aac_bt_cfg)
{
- struct mixer_ctl *ctl_enc_data;
+ struct mixer_ctl *ctl_enc_data = NULL, *ctrl_bit_format = NULL;
struct aac_enc_cfg_t aac_dsp_cfg;
bool is_configured = false;
int ret = 0;
@@ -480,8 +530,25 @@
if (ret != 0) {
ALOGE("%s: failed to set SBC encoder config", __func__);
is_configured = false;
- } else
- is_configured = true;
+ goto fail;
+ }
+ ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
+ MIXER_ENC_BIT_FORMAT);
+ if (!ctrl_bit_format) {
+ is_configured = false;
+ ALOGE(" ERROR bit format CONFIG data mixer control not identifed");
+ goto fail;
+ }
+ ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
+ if (ret != 0) {
+ ALOGE("%s: Failed to set bit format to encoder", __func__);
+ is_configured = false;
+ goto fail;
+ }
+ is_configured = true;
+ a2dp.enc_sampling_rate = aac_bt_cfg->sampling_rate;
+ ALOGV("Successfully updated AAC enc format with samplingrate: %d channels:%d",
+ aac_dsp_cfg.sample_rate, aac_dsp_cfg.channel_cfg);
fail:
return is_configured;
}
@@ -578,6 +645,35 @@
return ret;
}
+static void reset_a2dp_enc_config_params()
+{
+ int ret =0;
+
+ struct mixer_ctl *ctl_enc_config, *ctrl_bit_format;
+ struct sbc_enc_cfg_t dummy_reset_config;
+
+ memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
+ ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
+ MIXER_ENC_CONFIG_BLOCK);
+ if (!ctl_enc_config) {
+ ALOGE(" ERROR a2dp encoder format mixer control not identifed");
+ } else {
+ ret = mixer_ctl_set_array(ctl_enc_config, (void *)&dummy_reset_config,
+ sizeof(struct sbc_enc_cfg_t));
+ a2dp.bt_encoder_format = ENC_MEDIA_FMT_NONE;
+ }
+ ctrl_bit_format = mixer_get_ctl_by_name(a2dp.adev->mixer,
+ MIXER_ENC_BIT_FORMAT);
+ if (!ctrl_bit_format) {
+ ALOGE(" ERROR bit format CONFIG data mixer control not identifed");
+ } else {
+ ret = mixer_ctl_set_enum_by_string(ctrl_bit_format, "S16_LE");
+ if (ret != 0) {
+ ALOGE("%s: Failed to set bit format to encoder", __func__);
+ }
+ }
+}
+
int audio_extn_a2dp_stop_playback()
{
int ret =0;
@@ -592,25 +688,13 @@
a2dp.a2dp_total_active_session_request--;
if ( a2dp.a2dp_started && !a2dp.a2dp_total_active_session_request) {
- struct mixer_ctl *ctl_enc_config;
- struct sbc_enc_cfg_t dummy_reset_config;
-
ALOGV("calling BT module stream stop");
ret = a2dp.audio_stop_stream();
if (ret < 0)
ALOGE("stop stream to BT IPC lib failed");
else
ALOGV("stop steam to BT IPC lib successful");
- memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
- ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
- MIXER_ENC_CONFIG_BLOCK);
- if (!ctl_enc_config) {
- ALOGE(" ERROR a2dp encoder format mixer control not identifed");
- } else {
- ret = mixer_ctl_set_array(ctl_enc_config, (void *)&dummy_reset_config,
- sizeof(struct sbc_enc_cfg_t));
- a2dp.bt_encoder_format = ENC_MEDIA_FMT_NONE;
- }
+ reset_a2dp_enc_config_params();
}
if(!a2dp.a2dp_total_active_session_request)
a2dp.a2dp_started = false;
@@ -647,6 +731,7 @@
val = atoi(value);
if (val & AUDIO_DEVICE_OUT_ALL_A2DP) {
ALOGV("Received device dis- connect request");
+ reset_a2dp_enc_config_params();
close_a2dp_output();
}
goto param_handled;
@@ -658,6 +743,7 @@
if ((!strncmp(value,"true",sizeof(value)))) {
ALOGD("Setting a2dp to suspend state");
a2dp.a2dp_suspended = true;
+ reset_a2dp_enc_config_params();
if(a2dp.audio_suspend_stream)
a2dp.audio_suspend_stream();
} else if (a2dp.a2dp_suspended == true) {
@@ -665,6 +751,27 @@
if(a2dp.clear_a2dpsuspend_flag)
a2dp.clear_a2dpsuspend_flag();
a2dp.a2dp_suspended = false;
+ /*
+ * It is possible that before suspend,a2dp sessions can be active
+ * for example during music + voice activation concurrency
+ * a2dp suspend will be called & BT will change to sco mode
+ * though music is paused as a part of voice activation
+ * compress session close happens only after pause timeout(10secs)
+ * so if resume request comes before pause timeout as a2dp session
+ * is already active IPC start will not be called from APM/audio_hw
+ * Fix is to call a2dp start for IPC library post suspend
+ * based on number of active session count
+ */
+ if (a2dp.a2dp_total_active_session_request > 0) {
+ ALOGD(" Calling IPC lib start post suspend state");
+ if(a2dp.audio_start_stream) {
+ ret = a2dp.audio_start_stream();
+ if (ret != 0) {
+ ALOGE("BT controller start failed");
+ a2dp.a2dp_started = false;
+ }
+ }
+ }
}
}
goto param_handled;
@@ -684,6 +791,15 @@
return a2dp.is_handoff_in_progress;
}
+void audio_extn_a2dp_get_apptype_params(uint32_t *sample_rate,
+ uint32_t *bit_width)
+{
+ if(a2dp.bt_encoder_format == AUDIO_FORMAT_APTX_HD)
+ *bit_width = 24;
+ else
+ *bit_width = 16;
+ *sample_rate = a2dp.enc_sampling_rate;
+}
void audio_extn_a2dp_init (void *adev)
{
a2dp.adev = (struct audio_device*)adev;
@@ -693,7 +809,7 @@
a2dp.a2dp_total_active_session_request = 0;
a2dp.a2dp_suspended = false;
a2dp.bt_encoder_format = AUDIO_FORMAT_INVALID;
- a2dp.enc_config_data = NULL;
+ a2dp.enc_sampling_rate = 48000;
a2dp.is_a2dp_offload_supported = false;
a2dp.is_handoff_in_progress = false;
update_offload_codec_capabilities();
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 65f516c..0f38b82 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -129,7 +129,7 @@
int i = 0;
FILE *ext_disp_fd = NULL;
- for(i = 0; i < 3; i++) {
+ while (1) {
snprintf(fbpath, sizeof(fbpath),
"/sys/class/graphics/fb%d/msm_fb_type", i);
ext_disp_fd = fopen(fbpath, "r");
@@ -146,8 +146,10 @@
}
}
fclose(ext_disp_fd);
+ i++;
} else {
- ALOGE("%s: Failed to open fb node %d", __func__, i);
+ ALOGE("%s: Scanned till end of fbs or Failed to open fb node %d", __func__, i);
+ break;
}
}
@@ -183,7 +185,7 @@
return ret;
}
-static void check_and_set_ext_disp_connection_status(const struct audio_device *adev,
+static void audio_extn_ext_disp_set_parameters(const struct audio_device *adev,
struct str_parms *parms)
{
char value[32] = {0};
@@ -202,13 +204,14 @@
&& (atoi(value) & AUDIO_DEVICE_OUT_AUX_DIGITAL)){
//params = "disconnect=1024" for external display disconnection.
update_ext_disp_sysfs_node(adev, 0);
+ ALOGV("invalidate cached edid");
+ platform_invalidate_hdmi_config(adev->platform);
} else {
// handle ext disp devices only
return;
}
}
-
#ifndef FM_POWER_OPT
#define audio_extn_fm_set_parameters(adev, parms) (0)
#else
@@ -770,7 +773,7 @@
audio_extn_source_track_set_parameters(adev, parms);
audio_extn_fbsp_set_parameters(parms);
audio_extn_keep_alive_set_parameters(adev, parms);
- check_and_set_ext_disp_connection_status(adev, parms);
+ audio_extn_ext_disp_set_parameters(adev, parms);
if (adev->offload_effects_set_parameters != NULL)
adev->offload_effects_set_parameters(parms);
}
@@ -1142,3 +1145,52 @@
}
}
#endif /* KPI_OPTIMIZE_ENABLED */
+
+static int audio_extn_set_multichannel_mask(struct audio_device *adev,
+ struct stream_in *in,
+ struct audio_config *config,
+ bool *channel_mask_updated)
+{
+ int ret = -EINVAL;
+ int channel_count = audio_channel_count_from_in_mask(in->channel_mask);
+ *channel_mask_updated = false;
+
+ int max_mic_count = platform_get_max_mic_count(adev->platform);
+ /* validate input params*/
+ if ((channel_count == 6) &&
+ (in->format == AUDIO_FORMAT_PCM_16_BIT)) {
+
+ switch (max_mic_count) {
+ case 4:
+ config->channel_mask = AUDIO_CHANNEL_INDEX_MASK_4;
+ break;
+ case 3:
+ config->channel_mask = AUDIO_CHANNEL_INDEX_MASK_3;
+ break;
+ case 2:
+ config->channel_mask = AUDIO_CHANNEL_IN_STEREO;
+ break;
+ default:
+ config->channel_mask = AUDIO_CHANNEL_IN_STEREO;
+ break;
+ }
+ ret = 0;
+ *channel_mask_updated = true;
+ }
+ return ret;
+}
+
+int audio_extn_check_and_set_multichannel_usecase(struct audio_device *adev,
+ struct stream_in *in,
+ struct audio_config *config,
+ bool *update_params)
+{
+ bool ssr_supported = false;
+ ssr_supported = audio_extn_ssr_check_usecase(in);
+ if (ssr_supported) {
+ return audio_extn_ssr_set_usecase(in, config, update_params);
+ } else {
+ return audio_extn_set_multichannel_mask(adev, in, config,
+ update_params);
+ }
+}
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 069feda..07714f6 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -179,6 +179,8 @@
#define audio_extn_a2dp_set_parameters(parms) (0)
#define audio_extn_a2dp_is_force_device_switch() (0)
#define audio_extn_a2dp_set_handoff_mode(is_on) (0)
+#define audio_extn_a2dp_get_apptype_params(sample_rate,bit_width) (0)
+
#else
void audio_extn_a2dp_init(void *adev);
int audio_extn_a2dp_start_playback();
@@ -186,20 +188,27 @@
void audio_extn_a2dp_set_parameters(struct str_parms *parms);
bool audio_extn_a2dp_is_force_device_switch();
void audio_extn_a2dp_set_handoff_mode(bool is_on);
+void audio_extn_a2dp_get_apptype_params(uint32_t *sample_rate,
+ uint32_t *bit_width);
+
#endif
#ifndef SSR_ENABLED
-#define audio_extn_ssr_check_and_set_usecase(in) (-1)
-#define audio_extn_ssr_init(in, num_out_chan) (0)
-#define audio_extn_ssr_deinit() (0)
-#define audio_extn_ssr_update_enabled() (0)
-#define audio_extn_ssr_get_enabled() (0)
-#define audio_extn_ssr_read(stream, buffer, bytes) (0)
-#define audio_extn_ssr_set_parameters(adev, parms) (0)
-#define audio_extn_ssr_get_parameters(adev, parms, reply) (0)
-#define audio_extn_ssr_get_stream() (0)
+#define audio_extn_ssr_check_usecase(in) (0)
+#define audio_extn_ssr_set_usecase(in, config, channel_mask_updated) (0)
+#define audio_extn_ssr_init(in, num_out_chan) (0)
+#define audio_extn_ssr_deinit() (0)
+#define audio_extn_ssr_update_enabled() (0)
+#define audio_extn_ssr_get_enabled() (0)
+#define audio_extn_ssr_read(stream, buffer, bytes) (0)
+#define audio_extn_ssr_set_parameters(adev, parms) (0)
+#define audio_extn_ssr_get_parameters(adev, parms, reply) (0)
+#define audio_extn_ssr_get_stream() (0)
#else
-int audio_extn_ssr_check_and_set_usecase(struct stream_in *in);
+bool audio_extn_ssr_check_usecase(struct stream_in *in);
+int audio_extn_ssr_set_usecase(struct stream_in *in,
+ struct audio_config *config,
+ bool *channel_mask_updated);
int32_t audio_extn_ssr_init(struct stream_in *in,
int num_out_chan);
int32_t audio_extn_ssr_deinit();
@@ -214,6 +223,10 @@
struct str_parms *reply);
struct stream_in *audio_extn_ssr_get_stream();
#endif
+int audio_extn_check_and_set_multichannel_usecase(struct audio_device *adev,
+ struct stream_in *in,
+ struct audio_config *config,
+ bool *update_params);
#ifndef HW_VARIANTS_ENABLED
#define hw_info_init(snd_card_name) (0)
@@ -459,9 +472,11 @@
#ifndef HFP_ENABLED
#define audio_extn_hfp_is_active(adev) (0)
#define audio_extn_hfp_get_usecase() (-1)
+#define hfp_set_mic_mute(dev, state) (0)
#else
bool audio_extn_hfp_is_active(struct audio_device *adev);
audio_usecase_t audio_extn_hfp_get_usecase();
+int hfp_set_mic_mute(struct audio_device *dev, bool state);
#endif
#ifndef DEV_ARBI_ENABLED
diff --git a/hal/audio_extn/dev_arbi.c b/hal/audio_extn/dev_arbi.c
index d7ab5ff..69d8568 100644
--- a/hal/audio_extn/dev_arbi.c
+++ b/hal/audio_extn/dev_arbi.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2016 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
@@ -131,6 +131,7 @@
{SND_DEVICE_OUT_VOICE_HANDSET, AUDIO_DEVICE_OUT_EARPIECE},
{SND_DEVICE_OUT_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
{SND_DEVICE_OUT_VOICE_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
+ {SND_DEVICE_OUT_VOICE_SPEAKER_2, AUDIO_DEVICE_OUT_SPEAKER},
{SND_DEVICE_OUT_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
{SND_DEVICE_OUT_VOICE_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
{SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
diff --git a/hal/audio_extn/dolby.c b/hal/audio_extn/dolby.c
index f07c66a..b958bf6 100644
--- a/hal/audio_extn/dolby.c
+++ b/hal/audio_extn/dolby.c
@@ -484,9 +484,7 @@
};
int audio_extn_dap_hal_init(int snd_card) {
- char c_dmid[128] = {0};
- void *handle = NULL;
- int i_dmid, ret = -EINVAL;
+ int ret = -EINVAL;
dap_hal_device_be_id_map_t device_be_id_map;
ALOGV("%s: opening DAP HAL lib\n", __func__);
@@ -532,9 +530,7 @@
void audio_extn_dolby_ds2_set_endpoint(struct audio_device *adev) {
struct listnode *node;
struct audio_usecase *usecase;
- struct mixer_ctl *ctl;
- const char *mixer_ctl_name = "DS1 DAP Endpoint";
- int endpoint = 0, ret;
+ int endpoint = 0;
bool send = false;
list_for_each(node, &adev->usecase_list) {
@@ -587,7 +583,7 @@
return 0;
}
-int audio_extn_dolby_set_dap_bypass(struct audio_device *adev, int state) {
+int audio_extn_dolby_set_dap_bypass(struct audio_device *adev __unused, int state) {
ALOGV("%s: state %d", __func__, state);
if (ds2extnmod.dap_hal_set_hw_info) {
@@ -599,12 +595,12 @@
return 0;
}
-void audio_extn_dolby_set_license(struct audio_device *adev)
+void audio_extn_dolby_set_license(struct audio_device *adev __unused)
{
int i_key=0;
char c_key[128] = {0};
char c_dmid[128] = {0};
- int i_dmid, ret = -EINVAL;
+ int i_dmid;
struct dolby_param_license dolby_license;
#ifdef DOLBY_ACDB_LICENSE
@@ -631,7 +627,7 @@
void audio_extn_ds2_set_parameters(struct audio_device *adev,
struct str_parms *parms)
{
- int val, ret;
+ int ret;
char value[32]={0};
ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SND_CARD_STATUS, value,
diff --git a/hal/audio_extn/hfp.c b/hal/audio_extn/hfp.c
index 5a45b80..243d48d 100644
--- a/hal/audio_extn/hfp.c
+++ b/hal/audio_extn/hfp.c
@@ -302,6 +302,26 @@
return false;
}
+int hfp_set_mic_mute(struct audio_device *adev, bool state)
+{
+ struct mixer_ctl *ctl;
+ const char *mixer_ctl_name = "HFP TX Mute";
+ uint32_t set_values[ ] = {0};
+
+ ALOGI("%s: enter, state=%d", __func__, state);
+
+ set_values[0] = state;
+ ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+ if (!ctl) {
+ ALOGE("%s: Could not get ctl for mixer cmd - %s",
+ __func__, mixer_ctl_name);
+ return -EINVAL;
+ }
+ mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
+ ALOGV("%s: exit", __func__);
+ return 0;
+}
+
audio_usecase_t audio_extn_hfp_get_usecase()
{
return hfpmod.ucid;
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index 1f88c71..008130f 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -117,6 +117,11 @@
SPKR_PROTECTION_MODE_CALIBRATE = 1,
};
+struct spkr_prot_r0t0 {
+ int r0[SP_V2_NUM_MAX_SPKRS];
+ int t0[SP_V2_NUM_MAX_SPKRS];
+};
+
struct speaker_prot_session {
int spkr_prot_mode;
int spkr_processing_state;
@@ -142,6 +147,7 @@
bool spkr_prot_enable;
bool spkr_in_use;
struct timespec spkr_last_time_used;
+ struct spkr_prot_r0t0 sp_r0t0_cal;
bool wsa_found;
int spkr_1_tzn;
int spkr_2_tzn;
@@ -340,6 +346,7 @@
int ret = 0;
struct audio_cal_fb_spk_prot_cfg cal_data;
char value[PROPERTY_VALUE_MAX];
+ static int cal_done = 0;
if (cal_fd < 0) {
ALOGE("%s: Error: cal_fd = %d", __func__, cal_fd);
@@ -382,6 +389,13 @@
ret = -ENODEV;
goto done;
}
+ if (protCfg->mode == MSM_SPKR_PROT_CALIBRATED && !cal_done) {
+ handle.sp_r0t0_cal.r0[SP_V2_SPKR_1] = protCfg->r0[SP_V2_SPKR_1];
+ handle.sp_r0t0_cal.r0[SP_V2_SPKR_2] = protCfg->r0[SP_V2_SPKR_2];
+ handle.sp_r0t0_cal.t0[SP_V2_SPKR_1] = protCfg->t0[SP_V2_SPKR_1];
+ handle.sp_r0t0_cal.t0[SP_V2_SPKR_2] = protCfg->t0[SP_V2_SPKR_2];
+ cal_done = 1;
+ }
done:
return ret;
}
@@ -1347,12 +1361,48 @@
}
}
+int audio_extn_select_spkr_prot_cal_data(snd_device_t snd_device)
+{
+ struct audio_cal_info_spk_prot_cfg protCfg;
+ int acdb_fd = -1;
+ int ret = 0;
+
+ acdb_fd = open("/dev/msm_audio_cal", O_RDWR | O_NONBLOCK);
+ if (acdb_fd < 0) {
+ ALOGE("%s: open msm_acdb failed", __func__);
+ return -ENODEV;
+ }
+ switch(snd_device) {
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
+ protCfg.r0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_2];
+ protCfg.r0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_1];
+ protCfg.t0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_2];
+ protCfg.t0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_1];
+ break;
+ default:
+ protCfg.r0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_1];
+ protCfg.r0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_2];
+ protCfg.t0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_1];
+ protCfg.t0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_2];
+ break;
+ }
+ protCfg.mode = MSM_SPKR_PROT_CALIBRATED;
+ ret = set_spkr_prot_cal(acdb_fd, &protCfg);
+ if (ret)
+ ALOGE("%s: speaker protection cal data swap failed", __func__);
+
+ close(acdb_fd);
+ return ret;
+}
+
int audio_extn_spkr_prot_start_processing(snd_device_t snd_device)
{
struct audio_usecase *uc_info_tx;
struct audio_device *adev = handle.adev_handle;
int32_t pcm_dev_tx_id = -1, ret = 0;
bool disable_tx = false;
+ snd_device_t in_snd_device;
ALOGV("%s: Entry", __func__);
/* cancel speaker calibration */
@@ -1361,6 +1411,15 @@
return -EINVAL;
}
snd_device = platform_get_spkr_prot_snd_device(snd_device);
+ if (handle.spkr_prot_mode == MSM_SPKR_PROT_CALIBRATED) {
+ ret = audio_extn_select_spkr_prot_cal_data(snd_device);
+ if (ret) {
+ ALOGE("%s: Setting speaker protection cal data failed", __func__);
+ return ret;
+ }
+ }
+
+ in_snd_device = platform_get_vi_feedback_snd_device(snd_device);
spkr_prot_set_spkrstatus(true);
uc_info_tx = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
if (!uc_info_tx) {
@@ -1375,12 +1434,12 @@
if (handle.spkr_processing_state == SPKR_PROCESSING_IN_IDLE) {
uc_info_tx->id = USECASE_AUDIO_SPKR_CALIB_TX;
uc_info_tx->type = PCM_CAPTURE;
- uc_info_tx->in_snd_device = SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ uc_info_tx->in_snd_device = in_snd_device;
uc_info_tx->out_snd_device = SND_DEVICE_NONE;
handle.pcm_tx = NULL;
list_add_tail(&adev->usecase_list, &uc_info_tx->list);
disable_tx = true;
- enable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
+ enable_snd_device(adev, in_snd_device);
enable_audio_route(adev, uc_info_tx);
pcm_dev_tx_id = platform_get_pcm_device_id(uc_info_tx->id, PCM_CAPTURE);
@@ -1420,9 +1479,9 @@
list_remove(&uc_info_tx->list);
uc_info_tx->id = USECASE_AUDIO_SPKR_CALIB_TX;
uc_info_tx->type = PCM_CAPTURE;
- uc_info_tx->in_snd_device = SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ uc_info_tx->in_snd_device = in_snd_device;
uc_info_tx->out_snd_device = SND_DEVICE_NONE;
- disable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
+ disable_snd_device(adev, in_snd_device);
disable_audio_route(adev, uc_info_tx);
free(uc_info_tx);
} else
@@ -1436,17 +1495,20 @@
{
struct audio_usecase *uc_info_tx;
struct audio_device *adev = handle.adev_handle;
+ snd_device_t in_snd_device;
ALOGV("%s: Entry", __func__);
snd_device = platform_get_spkr_prot_snd_device(snd_device);
spkr_prot_set_spkrstatus(false);
+ in_snd_device = platform_get_vi_feedback_snd_device(snd_device);
+
pthread_mutex_lock(&handle.mutex_spkr_prot);
if (adev && handle.spkr_processing_state == SPKR_PROCESSING_IN_PROGRESS) {
uc_info_tx = get_usecase_from_list(adev, USECASE_AUDIO_SPKR_CALIB_TX);
if (handle.pcm_tx)
pcm_close(handle.pcm_tx);
handle.pcm_tx = NULL;
- disable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
+ disable_snd_device(adev, in_snd_device);
if (uc_info_tx) {
list_remove(&uc_info_tx->list);
disable_audio_route(adev, uc_info_tx);
diff --git a/hal/audio_extn/ssr.c b/hal/audio_extn/ssr.c
index f55f3ce..51a6a26 100644
--- a/hal/audio_extn/ssr.c
+++ b/hal/audio_extn/ssr.c
@@ -331,33 +331,55 @@
return false;
}
-int audio_extn_ssr_check_and_set_usecase(struct stream_in *in)
-{
- int ret = -1;
+bool audio_extn_ssr_check_usecase(struct stream_in *in) {
+ int ret = false;
int channel_count = audio_channel_count_from_in_mask(in->channel_mask);
audio_devices_t devices = in->device;
audio_source_t source = in->source;
- /* validate input params
- * only stereo and 5:1 channel config is supported
- * only AUDIO_DEVICE_IN_BUILTIN_MIC, AUDIO_DEVICE_IN_BACK_MIC supports 3 mics */
- if (audio_extn_ssr_get_enabled() &&
- ((channel_count == 2) || (channel_count == 6)) &&
- ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source)) &&
- ((AUDIO_DEVICE_IN_BUILTIN_MIC == devices) || (AUDIO_DEVICE_IN_BACK_MIC == devices)) &&
- (in->format == AUDIO_FORMAT_PCM_16_BIT)) {
-
- ALOGD("%s: Found SSR use case starting SSR lib with channel_count :%d",
+ if ((audio_extn_ssr_get_enabled()) &&
+ ((channel_count == 2) || (channel_count == 6)) &&
+ ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source)) &&
+ ((AUDIO_DEVICE_IN_BUILTIN_MIC == devices) || (AUDIO_DEVICE_IN_BACK_MIC == devices)) &&
+ (in->format == AUDIO_FORMAT_PCM_16_BIT)) {
+ ALOGD("%s: SSR enabled with channel_count :%d",
__func__, channel_count);
+ ret = true;
+ }
+ return ret;
+}
- if (!audio_extn_ssr_init(in, channel_count)) {
- ALOGD("%s: Created SSR session succesfully", __func__);
+int audio_extn_ssr_set_usecase(struct stream_in *in,
+ struct audio_config *config,
+ bool *update_params)
+{
+ int ret = -EINVAL;
+ int channel_count = audio_channel_count_from_in_mask(in->channel_mask);
+ audio_channel_representation_t representation =
+ audio_channel_mask_get_representation(in->channel_mask);
+ *update_params = false;
+
+ if (audio_extn_ssr_check_usecase(in)) {
+
+ if (representation == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
+ /* update params in case channel representation index.
+ * on returning error, flinger will retry with supported representation passed
+ */
+ ALOGD("%s: SSR supports only channel representation position, channel_mask(%#x)"
+ ,__func__, config->channel_mask);
+ config->channel_mask = AUDIO_CHANNEL_IN_5POINT1;
ret = 0;
+ *update_params = true;
} else {
- ALOGE("%s: Unable to start SSR record session", __func__);
+ if (!audio_extn_ssr_init(in, channel_count)) {
+ ALOGD("%s: Created SSR session succesfully", __func__);
+ ret = 0;
+ } else {
+ ALOGE("%s: Unable to start SSR record session", __func__);
+ }
}
- }
- return ret;
+ }
+ return ret;
}
static void pcm_buffer_queue_push(struct pcm_buffer_queue **queue,
diff --git a/hal/audio_extn/usb.c b/hal/audio_extn/usb.c
index a7b10d9..f936f99 100644
--- a/hal/audio_extn/usb.c
+++ b/hal/audio_extn/usb.c
@@ -47,7 +47,7 @@
#define SAMPLE_RATE_11025 11025
// Supported sample rates for USB
static uint32_t supported_sample_rates[] =
- {44100, 48000, 64000, 88200, 96000, 176400, 192000};
+ {44100, 48000, 64000, 88200, 96000, 176400, 192000, 384000};
#define MAX_SAMPLE_RATE_SIZE sizeof(supported_sample_rates)/sizeof(supported_sample_rates[0])
@@ -190,33 +190,6 @@
}
}
-static int usb_set_channel_mixer_ctl(int channel,
- char *ch_mixer_ctl_name)
-{
- struct mixer_ctl *ctl;
-
- ctl = mixer_get_ctl_by_name(usbmod->adev->mixer, ch_mixer_ctl_name);
- if (!ctl) {
- ALOGE("%s: Could not get ctl for mixer cmd - %s",
- __func__, ch_mixer_ctl_name);
- return -EINVAL;
- }
- switch (channel) {
- case 1:
- mixer_ctl_set_enum_by_string(ctl, "One");
- break;
- case 2:
- mixer_ctl_set_enum_by_string(ctl, "Two");
- break;
- default:
- ALOGV("%s: channel(%d) not supported, set as default 2 channels",
- __func__, channel);
- mixer_ctl_set_enum_by_string(ctl, "Two");
- break;
- }
- return 0;
-}
-
static int usb_set_dev_id_mixer_ctl(unsigned int usb_usecase_type, int card,
char *dev_mixer_ctl_name)
{
@@ -472,8 +445,6 @@
int card)
{
int ret;
- struct listnode *node_d;
- struct usb_device_config *dev_info;
/* get capabilities */
if ((ret = usb_get_capability(USB_PLAYBACK, usb_card_info, card))) {
@@ -481,14 +452,6 @@
__func__);
goto exit;
}
- /* Currently only use the first profile using to configure channel for simplification */
- list_for_each(node_d, &usb_card_info->usb_device_conf_list) {
- dev_info = node_to_item(node_d, struct usb_device_config, list);
- if (dev_info != NULL) {
- usb_set_channel_mixer_ctl(dev_info->channels, "USB_AUDIO_RX Channels");
- break;
- }
- }
usb_set_dev_id_mixer_ctl(USB_PLAYBACK, card, "USB_AUDIO_RX dev_token");
exit:
@@ -500,8 +463,6 @@
int card)
{
int ret;
- struct listnode *node_d;
- struct usb_device_config *dev_info;
/* get capabilities */
if ((ret = usb_get_capability(USB_CAPTURE, usb_card_info, card))) {
@@ -509,14 +470,6 @@
__func__);
goto exit;
}
- /* Currently only use the first profile using to configure channel for simplification */
- list_for_each(node_d, &usb_card_info->usb_device_conf_list) {
- dev_info = node_to_item(node_d, struct usb_device_config, list);
- if (dev_info != NULL) {
- usb_set_channel_mixer_ctl(dev_info->channels, "USB_AUDIO_TX Channels");
- break;
- }
- }
usb_set_dev_id_mixer_ctl(USB_CAPTURE, card, "USB_AUDIO_TX dev_token");
exit:
@@ -909,14 +862,8 @@
"%s: card_dev_type (0x%x), card_no(%d)",
__func__, card_info->usb_device_type, card_info->usb_card);
/* Currently only apply the first playback sound card configuration */
- if (is_playback && card_info->usb_device_type == AUDIO_DEVICE_OUT_USB_DEVICE) {
- is_usb_supported = usb_audio_backend_apply_policy(
- &card_info->usb_device_conf_list,
- bit_width,
- sample_rate,
- ch);
- break;
- } else if (card_info->usb_device_type == AUDIO_DEVICE_IN_USB_DEVICE ) {
+ if ((is_playback && card_info->usb_device_type == AUDIO_DEVICE_OUT_USB_DEVICE) ||
+ ((!is_playback) && card_info->usb_device_type == AUDIO_DEVICE_IN_USB_DEVICE)){
is_usb_supported = usb_audio_backend_apply_policy(
&card_info->usb_device_conf_list,
bit_width,
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index 26c43b4..9542fbd 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -495,7 +495,7 @@
struct stream_format *sf_info;
char value[PROPERTY_VALUE_MAX] = {0};
- if ((24 == bit_width) &&
+ if ((bit_width >= 24) &&
(devices & AUDIO_DEVICE_OUT_SPEAKER)) {
int32_t bw = platform_get_snd_device_bit_width(SND_DEVICE_OUT_SPEAKER);
if (-ENOSYS != bw)
@@ -529,6 +529,13 @@
sample_rate = OUTPUT_SAMPLING_RATE_DSD128;
}
+ if(devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
+ //TODO: Handle fractional sampling rate configuration for LL
+ audio_extn_a2dp_get_apptype_params(&sample_rate, &bit_width);
+ ALOGI("%s using %d sampling rate %d bit width for A2DP CoPP",
+ __func__, sample_rate, bit_width);
+ }
+
ALOGV("%s: flags: %x, format: %x sample_rate %d",
__func__, flags, format, sample_rate);
list_for_each(node_i, streams_output_cfg_list) {
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index f6e11e8..13e4ae9 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -383,13 +383,6 @@
{
struct audio_device *adev = out->dev;
- if (out->routing_change) {
- out->routing_change = false;
- // must be checked for backward compatibility
- if (adev->adm_on_routing_change)
- adev->adm_on_routing_change(adev->adm_data, out->handle);
- }
-
if (adev->adm_request_focus_v2)
adev->adm_request_focus_v2(adev->adm_data, out->handle, ns);
else if (adev->adm_request_focus)
@@ -400,12 +393,6 @@
{
struct audio_device *adev = in->dev;
- if (in->routing_change) {
- in->routing_change = false;
- if (adev->adm_on_routing_change)
- adev->adm_on_routing_change(adev->adm_data, in->capture_handle);
- }
-
if (adev->adm_request_focus_v2)
adev->adm_request_focus_v2(adev->adm_data, in->capture_handle, ns);
else if (adev->adm_request_focus)
@@ -622,29 +609,75 @@
return 0;
}
-/*
- * Enable ASRC mode if native or DSD stream is active.
- */
-static void audio_check_and_set_asrc_mode(struct audio_device *adev, snd_device_t snd_device)
+static void enable_asrc_mode(struct audio_device *adev)
{
- if (SND_DEVICE_OUT_HEADPHONES == snd_device &&
- !adev->asrc_mode_enabled) {
+ ALOGV("%s", __func__);
+ audio_route_apply_and_update_path(adev->audio_route,
+ "asrc-mode");
+ adev->asrc_mode_enabled = true;
+}
+
+static void disable_asrc_mode(struct audio_device *adev)
+{
+ ALOGV("%s", __func__);
+ audio_route_reset_and_update_path(adev->audio_route,
+ "asrc-mode");
+ adev->asrc_mode_enabled = false;
+}
+
+/*
+ * - Enable ASRC mode for incoming mix path use case(Headphone backend)if Headphone
+ * 44.1 or Native DSD backends are enabled for any of current use case.
+ * e.g. 48-> + (Naitve DSD or Headphone 44.1)
+ * - Disable current mix path use case(Headphone backend) and re-enable it with
+ * ASRC mode for incoming Headphone 44.1 or Native DSD use case.
+ * e.g. Naitve DSD or Headphone 44.1 -> + 48
+ */
+static void check_and_set_asrc_mode(struct audio_device *adev, snd_device_t snd_device)
+{
+ ALOGV("%s snd device %d", __func__, snd_device);
+ int new_backend_idx = platform_get_backend_index(snd_device);
+
+ if (((new_backend_idx == HEADPHONE_BACKEND) ||
+ (new_backend_idx == HEADPHONE_44_1_BACKEND) ||
+ (new_backend_idx == DSD_NATIVE_BACKEND)) &&
+ !adev->asrc_mode_enabled) {
struct listnode *node = NULL;
struct audio_usecase *uc = NULL;
struct stream_out *curr_out = NULL;
+ int usecase_backend_idx = DEFAULT_CODEC_BACKEND;
list_for_each(node, &adev->usecase_list) {
uc = node_to_item(node, struct audio_usecase, list);
curr_out = (struct stream_out*) uc->stream.out;
-
if (curr_out && PCM_PLAYBACK == uc->type) {
- if((platform_get_backend_index(uc->out_snd_device) == HEADPHONE_44_1_BACKEND) ||
- (platform_get_backend_index(uc->out_snd_device) == DSD_NATIVE_BACKEND)) {
+ usecase_backend_idx = platform_get_backend_index(uc->out_snd_device);
+
+ if((new_backend_idx == HEADPHONE_BACKEND) &&
+ ((usecase_backend_idx == HEADPHONE_44_1_BACKEND) ||
+ (usecase_backend_idx == DSD_NATIVE_BACKEND))) {
ALOGD("%s:DSD or native stream detected enabling asrcmode in hardware",
__func__);
- audio_route_apply_and_update_path(adev->audio_route,
- "asrc-mode");
- adev->asrc_mode_enabled = true;
+ enable_asrc_mode(adev);
+ break;
+ } else if(((new_backend_idx == HEADPHONE_44_1_BACKEND) ||
+ (new_backend_idx == DSD_NATIVE_BACKEND)) &&
+ (usecase_backend_idx == HEADPHONE_BACKEND)) {
+ ALOGD("%s:48K stream detected, disabling and enabling it with asrcmode in hardware",
+ __func__);
+ disable_audio_route(adev, uc);
+ disable_snd_device(adev, uc->out_snd_device);
+ // Apply true-high-quality-mode if DSD or > 44.1KHz or >=24-bit
+ if (new_backend_idx == DSD_NATIVE_BACKEND)
+ audio_route_apply_and_update_path(adev->audio_route,
+ "hph-true-highquality-mode");
+ else if ((new_backend_idx == HEADPHONE_44_1_BACKEND) &&
+ (curr_out->bit_width >= 24))
+ audio_route_apply_and_update_path(adev->audio_route,
+ "hph-highquality-mode");
+ enable_asrc_mode(adev);
+ enable_snd_device(adev, uc->out_snd_device);
+ enable_audio_route(adev, uc);
break;
}
}
@@ -802,8 +835,7 @@
audio_route_apply_and_update_path(adev->audio_route,
"true-native-mode");
adev->native_playback_enabled = true;
- } else
- audio_check_and_set_asrc_mode(adev, snd_device);
+ }
}
return 0;
}
@@ -862,8 +894,8 @@
} else if (SND_DEVICE_OUT_HEADPHONES == snd_device &&
adev->asrc_mode_enabled) {
ALOGD("%s: %d: disabling asrc mode in hardware", __func__, __LINE__);
- audio_route_reset_and_update_path(adev->audio_route, "asrc-mode");
- adev->asrc_mode_enabled = false;
+ disable_asrc_mode(adev);
+ audio_route_apply_and_update_path(adev->audio_route, "hph-lowpower-mode");
}
audio_extn_dev_arbi_release(snd_device);
@@ -936,9 +968,8 @@
(usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) ||
(usecase->devices & AUDIO_DEVICE_OUT_USB_DEVICE) ||
(force_restart_session)) &&
- (platform_check_backends_match(snd_device, usecase->out_snd_device)||
- (platform_check_codec_asrc_support(adev->platform) && !adev->asrc_mode_enabled &&
- platform_check_if_backend_has_to_be_disabled(snd_device,usecase->out_snd_device)))) {
+ (platform_check_backends_match(snd_device, usecase->out_snd_device))) {
+
ALOGD("%s:becf: check_usecases (%s) is active on (%s) - disabling ..",
__func__, use_case_table[usecase->id],
platform_get_snd_device_name(usecase->out_snd_device));
@@ -1087,10 +1118,9 @@
reset_hdmi_sink_caps(out);
/* Cache ext disp type */
- ret = platform_get_ext_disp_type(adev->platform);
- if (ret < 0) {
+ if (platform_get_ext_disp_type(adev->platform) <= 0) {
ALOGE("%s: Failed to query disp type, ret:%d", __func__, ret);
- return ret;
+ return -EINVAL;
}
switch (channels) {
@@ -1176,6 +1206,19 @@
return NULL;
}
+struct stream_in *get_next_active_input(const struct audio_device *adev)
+{
+ struct audio_usecase *usecase;
+ struct listnode *node;
+
+ list_for_each_reverse(node, &adev->usecase_list) {
+ usecase = node_to_item(node, struct audio_usecase, list);
+ if (usecase->type == PCM_CAPTURE)
+ return usecase->stream.in;
+ }
+ return NULL;
+}
+
/*
* is a true native playback active
*/
@@ -1234,6 +1277,7 @@
(DSD_NATIVE_BACKEND == platform_get_backend_index(uc->out_snd_device))) {
active = true;
ALOGV("%s:DSD playback is active", __func__);
+ break;
}
}
return active;
@@ -1259,7 +1303,7 @@
// Force all a2dp output devices to reconfigure for proper AFE encode format
if((usecase->stream.out) &&
- (usecase->stream.out->devices & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) &&
+ (usecase->stream.out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
audio_extn_a2dp_is_force_device_switch()) {
ALOGD("Force a2dp device switch to update new encoder config");
ret = true;
@@ -1290,6 +1334,10 @@
if ((usecase->type == VOICE_CALL) ||
(usecase->type == VOIP_CALL) ||
(usecase->type == PCM_HFP_CALL)) {
+ if(usecase->stream.out == NULL) {
+ ALOGE("%s: stream.out is NULL", __func__);
+ return -EINVAL;
+ }
out_snd_device = platform_get_output_snd_device(adev->platform,
usecase->stream.out);
in_snd_device = platform_get_input_snd_device(adev->platform, usecase->stream.out->devices);
@@ -1333,6 +1381,10 @@
}
}
if (usecase->type == PCM_PLAYBACK) {
+ if (usecase->stream.out == NULL) {
+ ALOGE("%s: stream.out is NULL", __func__);
+ return -EINVAL;
+ }
usecase->devices = usecase->stream.out->devices;
in_snd_device = SND_DEVICE_NONE;
if (out_snd_device == SND_DEVICE_NONE) {
@@ -1345,6 +1397,10 @@
}
}
} else if (usecase->type == PCM_CAPTURE) {
+ if (usecase->stream.in == NULL) {
+ ALOGE("%s: stream.in is NULL", __func__);
+ return -EINVAL;
+ }
usecase->devices = usecase->stream.in->device;
out_snd_device = SND_DEVICE_NONE;
if (in_snd_device == SND_DEVICE_NONE) {
@@ -1393,6 +1449,10 @@
if (voice_is_call_state_active(adev) ||
voice_extn_compress_voip_is_started(adev))
voice_set_sidetone(adev, usecase->out_snd_device, false);
+
+ /* Disable aanc only if voice call exists */
+ if (voice_is_call_state_active(adev))
+ voice_check_and_update_aanc_path(adev, usecase->out_snd_device, false);
}
/* Disable current sound devices */
@@ -1421,6 +1481,8 @@
/* Enable new sound devices */
if (out_snd_device != SND_DEVICE_NONE) {
check_usecases_codec_backend(adev, usecase, out_snd_device);
+ if (platform_check_codec_asrc_support(adev->platform))
+ check_and_set_asrc_mode(adev, out_snd_device);
enable_snd_device(adev, out_snd_device);
}
@@ -1461,6 +1523,10 @@
enable_audio_route(adev, usecase);
if (usecase->type == VOICE_CALL || usecase->type == VOIP_CALL) {
+ /* Enable aanc only if voice call exists */
+ if (voice_is_call_state_active(adev))
+ voice_check_and_update_aanc_path(adev, out_snd_device, true);
+
/* Enable sidetone only if other voice/voip call already exists */
if (voice_is_call_state_active(adev) ||
voice_extn_compress_voip_is_started(adev))
@@ -1486,7 +1552,7 @@
struct audio_usecase *uc_info;
struct audio_device *adev = in->dev;
- adev->active_input = NULL;
+ adev->active_input = get_next_active_input(adev);
ALOGV("%s: enter: usecase(%d: %s)", __func__,
in->usecase, use_case_table[in->usecase]);
@@ -1633,7 +1699,7 @@
audio_extn_perf_lock_release(&adev->perf_lock_handle);
stop_input_stream(in);
error_config:
- adev->active_input = NULL;
+ adev->active_input = get_next_active_input(adev);
/*
* sleep 50ms to allow sufficient time for kernel
* drivers to recover incases like SSR.
@@ -2182,6 +2248,35 @@
return size;
}
+static size_t get_output_period_size(uint32_t sample_rate,
+ audio_format_t format,
+ int channel_count,
+ int duration /*in millisecs*/)
+{
+ size_t size = 0;
+ uint32_t bytes_per_sample = audio_bytes_per_sample(format);
+
+ if ((duration == 0) || (sample_rate == 0) ||
+ (bytes_per_sample == 0) || (channel_count == 0)) {
+ ALOGW("Invalid config duration %d sr %d bps %d ch %d", duration, sample_rate,
+ bytes_per_sample, channel_count);
+ return -EINVAL;
+ }
+
+ size = (sample_rate *
+ duration *
+ bytes_per_sample *
+ channel_count) / 1000;
+ /*
+ * To have same PCM samples for all channels, the buffer size requires to
+ * be multiple of (number of channels * bytes per sample)
+ * For writes to succeed, the buffer must be written at address which is multiple of 32
+ */
+ size = ALIGN(size, (bytes_per_sample * channel_count * 32));
+
+ return (size/(channel_count * bytes_per_sample));
+}
+
static uint64_t get_actual_pcm_frames_rendered(struct stream_out *out)
{
uint64_t actual_frames_rendered = 0;
@@ -2386,11 +2481,19 @@
* (3sec). As BT is turned off, the write gets blocked.
* Avoid this by routing audio to speaker until standby.
*/
- if ((out->devices & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) &&
+ if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
(val == AUDIO_DEVICE_NONE)) {
val = AUDIO_DEVICE_OUT_SPEAKER;
}
-
+ /* To avoid a2dp to sco overlapping force route BT usecases
+ * to speaker based on Phone state
+ */
+ if ((val & AUDIO_DEVICE_OUT_ALL_A2DP) &&
+ ((adev->mode == AUDIO_MODE_RINGTONE) ||
+ (adev->mode == AUDIO_MODE_IN_CALL))) {
+ ALOGD("Forcing a2dp routing to speaker for ring/call mode");
+ val = AUDIO_DEVICE_OUT_SPEAKER;
+ }
/*
* select_devices() call below switches all the usecases on the same
* backend to the new device. Refer to check_usecases_codec_backend() in
@@ -2429,10 +2532,12 @@
if (!out->standby) {
if (!same_dev) {
ALOGV("update routing change");
- out->routing_change = true;
audio_extn_perf_lock_acquire(&adev->perf_lock_handle, 0,
adev->perf_lock_opts,
adev->perf_lock_opts_size);
+ if (adev->adm_on_routing_change)
+ adev->adm_on_routing_change(adev->adm_data,
+ out->handle);
}
select_devices(adev, out->usecase);
if (!same_dev)
@@ -2617,10 +2722,13 @@
static float AmpToDb(float amplification)
{
- if (amplification == 0) {
- return DSD_VOLUME_MIN_DB;
+ float db = DSD_VOLUME_MIN_DB;
+ if (amplification > 0) {
+ db = 20 * log10(amplification);
+ if(db < DSD_VOLUME_MIN_DB)
+ return DSD_VOLUME_MIN_DB;
}
- return 20 * log10(amplification);
+ return db;
}
static int out_set_volume(struct audio_stream_out *stream, float left,
@@ -3138,8 +3246,12 @@
if (is_offload_usecase(out->usecase)) {
ALOGD("copl(%p):calling compress flush", out);
lock_output_stream(out);
- stop_compressed_output_l(out);
- out->written = 0;
+ if (out->offload_state == OFFLOAD_STATE_PAUSED) {
+ stop_compressed_output_l(out);
+ out->written = 0;
+ } else {
+ ALOGW("%s called in invalid state %d", __func__, out->offload_state);
+ }
pthread_mutex_unlock(&out->lock);
ALOGD("copl(%p):out of compress flush", out);
return 0;
@@ -3283,7 +3395,9 @@
/* If recording is in progress, change the tx device to new device */
if (!in->standby && !in->is_st_session) {
ALOGV("update input routing change");
- in->routing_change = true;
+ if (adev->adm_on_routing_change)
+ adev->adm_on_routing_change(adev->adm_data,
+ in->capture_handle);
ret = select_devices(adev, in->usecase);
}
}
@@ -3781,13 +3895,13 @@
__func__, config->offload_info.version,
config->offload_info.bit_rate);
- /*Check if DSD audio format is supported in codec
- *and there is no active native DSD use case
+ /* Check if DSD audio format is supported in codec
+ * and there is no active native DSD use case
*/
if ((config->format == AUDIO_FORMAT_DSD) &&
- (!platform_check_codec_dsd_support(adev->platform) ||
- audio_is_dsd_native_stream_active(adev))) {
+ (!platform_check_codec_dsd_support(adev->platform) ||
+ audio_is_dsd_native_stream_active(adev))) {
ret = -EINVAL;
goto error_open;
}
@@ -3798,9 +3912,9 @@
* Direct PCM playback
*/
if (audio_extn_passthru_is_passthrough_stream(out) ||
- (config->format == AUDIO_FORMAT_DSD) ||
- config->offload_info.has_video ||
- out->flags & AUDIO_OUTPUT_FLAG_DIRECT_PCM) {
+ (config->format == AUDIO_FORMAT_DSD) ||
+ config->offload_info.has_video ||
+ out->flags & AUDIO_OUTPUT_FLAG_DIRECT_PCM) {
check_and_set_gapless_mode(adev, false);
} else
check_and_set_gapless_mode(adev, true);
@@ -3845,6 +3959,17 @@
out->config = pcm_config_afe_proxy_playback;
adev->voice_tx_output = out;
} else {
+ unsigned int channels = 0;
+ /*Update config params to default if not set by the caller*/
+ if (config->sample_rate == 0)
+ config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ if (config->channel_mask == AUDIO_CHANNEL_NONE)
+ config->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
+ if (config->format == AUDIO_FORMAT_DEFAULT)
+ config->format = AUDIO_FORMAT_PCM_16_BIT;
+
+ channels = audio_channel_count_from_out_mask(out->channel_mask);
+
if (out->flags & AUDIO_OUTPUT_FLAG_RAW) {
out->usecase = USECASE_AUDIO_PLAYBACK_ULL;
out->realtime = may_use_noirq_mode(adev, USECASE_AUDIO_PLAYBACK_ULL,
@@ -3856,6 +3981,13 @@
} else if (out->flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) {
out->usecase = USECASE_AUDIO_PLAYBACK_DEEP_BUFFER;
out->config = pcm_config_deep_buffer;
+ out->config.period_size = get_output_period_size(config->sample_rate, out->format,
+ channels, DEEP_BUFFER_OUTPUT_PERIOD_DURATION);
+ if (out->config.period_size <= 0) {
+ ALOGE("Invalid configuration period size is not valid");
+ ret = -EINVAL;
+ goto error_open;
+ }
} else {
/* primary path is the default path selected if no other outputs are available/suitable */
out->usecase = USECASE_AUDIO_PLAYBACK_PRIMARY;
@@ -3867,7 +3999,7 @@
out->bit_width = format_to_bitwidth_table[out->hal_op_format] << 3;
out->config.rate = config->sample_rate;
out->sample_rate = out->config.rate;
- out->config.channels = audio_channel_count_from_out_mask(out->channel_mask);
+ out->config.channels = channels;
if (out->hal_ip_format != out->hal_op_format) {
uint32_t buffer_size = out->config.period_size *
format_to_bitwidth_table[out->hal_op_format] *
@@ -4135,7 +4267,8 @@
ret = platform_get_ext_disp_type(adev->platform);
if (ret < 0) {
ALOGE("%s: Failed to query disp type, ret:%d", __func__, ret);
- return ret;
+ status = ret;
+ goto done;
}
platform_cache_edid(adev->platform);
} else if ((val & AUDIO_DEVICE_OUT_USB_DEVICE) ||
@@ -4159,10 +4292,13 @@
ret = str_parms_get_str(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT, value, sizeof(value));
if (ret >= 0) {
val = atoi(value);
- if (val & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
- ALOGV("invalidate cached edid");
- platform_invalidate_hdmi_config(adev->platform);
- } else if ((val & AUDIO_DEVICE_OUT_USB_DEVICE) ||
+ /*
+ * The HDMI / Displayport disconnect handling has been moved to
+ * audio extension to ensure that its parameters are not
+ * invalidated prior to updating sysfs of the disconnect event
+ * Invalidate will be handled by audio_extn_ext_disp_set_parameters()
+ */
+ if ((val & AUDIO_DEVICE_OUT_USB_DEVICE) ||
!(val ^ AUDIO_DEVICE_IN_USB_DEVICE)) {
ret = str_parms_get_str(parms, "card", value, sizeof(value));
if (ret >= 0) {
@@ -4180,7 +4316,7 @@
list_for_each(node, &adev->usecase_list) {
usecase = node_to_item(node, struct audio_usecase, list);
if ((usecase->type == PCM_PLAYBACK) &&
- (usecase->devices & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP)){
+ (usecase->devices & AUDIO_DEVICE_OUT_ALL_A2DP)){
ALOGD("reconfigure a2dp... forcing device switch");
lock_output_stream(usecase->stream.out);
audio_extn_a2dp_set_handoff_mode(true);
@@ -4348,6 +4484,7 @@
int ret = 0, buffer_size, frame_size;
int channel_count = audio_channel_count_from_in_mask(config->channel_mask);
bool is_low_latency = false;
+ bool channel_mask_updated = false;
*stream_in = NULL;
if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0) {
@@ -4442,7 +4579,14 @@
in->config.channels = channel_count;
in->config.rate = config->sample_rate;
in->sample_rate = config->sample_rate;
- } else if (!audio_extn_ssr_check_and_set_usecase(in)) {
+ } else if (!audio_extn_check_and_set_multichannel_usecase(adev,
+ in, config, &channel_mask_updated)) {
+ if (channel_mask_updated == true) {
+ ALOGD("%s: return error to retry with updated channel mask (%#x)",
+ __func__, config->channel_mask);
+ ret = -EINVAL;
+ goto err_open;
+ }
ALOGD("%s: created surround sound session succesfully",__func__);
} else if (audio_extn_compr_cap_enabled() &&
audio_extn_compr_cap_format_supported(config->format) &&
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 0633eb0..83ad54d 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -238,8 +238,6 @@
bool realtime;
int af_period_multiplier;
- bool routing_change;
-
struct audio_device *dev;
void* qaf_stream_handle;
pthread_cond_t qaf_offload_cond;
@@ -270,8 +268,6 @@
int bit_width;
bool realtime;
int af_period_multiplier;
- bool routing_change;
-
struct audio_device *dev;
};
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 47f251f..a42f984 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -118,6 +118,8 @@
#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
+#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
+
/* Reload ACDB files from specified path */
#define AUDIO_PARAMETER_KEY_RELOAD_ACDB "reload_acdb"
@@ -221,6 +223,7 @@
/* Vbat monitor related flags */
bool is_vbat_speaker;
bool gsm_mode_enabled;
+ int mono_speaker;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -244,7 +247,6 @@
bool edid_valid;
int ext_disp_type;
codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
- codec_backend_cfg_t current_tx_backend_cfg[MAX_CODEC_TX_BACKENDS];
char ec_ref_mixer_path[64];
char codec_version[CODEC_VERSION_MAX_LENGTH];
int hw_dep_fd;
@@ -343,6 +345,9 @@
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = "wsa-voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "vbat-voice-speaker",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = "wsa-voice-speaker-2",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "vbat-voice-speaker-2",
[SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
[SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
[SND_DEVICE_OUT_HDMI] = "hdmi",
@@ -369,8 +374,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
#ifdef RECORD_PLAY_CONCURRENCY
[SND_DEVICE_OUT_VOIP_HANDSET] = "voip-handset",
[SND_DEVICE_OUT_VOIP_SPEAKER] = "voip-speaker",
@@ -423,6 +430,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = "vi-feedback-mono-1",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = "vi-feedback-mono-2",
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
@@ -465,8 +474,11 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_LINE] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = 135,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = 135,
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 135,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 135,
[SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
@@ -492,8 +504,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = 103,
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = 101,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
#ifdef RECORD_PLAY_CONCURRENCY
[SND_DEVICE_OUT_VOIP_HANDSET] = 133,
[SND_DEVICE_OUT_VOIP_SPEAKER] = 132,
@@ -545,6 +559,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = 102,
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
@@ -591,6 +607,9 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_WSA)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
{TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
@@ -617,8 +636,10 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
#ifdef RECORD_PLAY_CONCURRENCY
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)},
@@ -669,6 +690,8 @@
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE)},
@@ -757,8 +780,8 @@
static int msm_device_to_be_id_external_codec [][NO_COLS] = {
{AUDIO_DEVICE_OUT_EARPIECE , 2},
{AUDIO_DEVICE_OUT_SPEAKER , 2},
- {AUDIO_DEVICE_OUT_WIRED_HEADSET , 2},
- {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 2},
+ {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
+ {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
{AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
{AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
{AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
@@ -1224,6 +1247,7 @@
backend_tag_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("vbat-voice-speaker");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("vbat-voice-speaker-2");
backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
@@ -1689,6 +1713,7 @@
my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
my_data->is_wsa_speaker = false;
my_data->hw_dep_fd = -1;
+ my_data->mono_speaker = SPKR_1;
property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, "");
if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
@@ -1897,16 +1922,13 @@
my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
+ if (idx > MAX_RX_CODEC_BACKENDS)
+ my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
}
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].sample_rate =
- CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].bit_width =
- CODEC_BACKEND_DEFAULT_BIT_WIDTH;
-
if (is_external_codec) {
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
strdup("SLIM_0_RX Format");
@@ -1923,9 +1945,9 @@
my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
strdup("SLIM_6_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[SLIMBUS_0_TX].bitwidth_mixer_ctl =
strdup("SLIM_0_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[SLIMBUS_0_TX].samplerate_mixer_ctl =
strdup("SLIM_0_TX SampleRate");
} else {
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
@@ -1933,16 +1955,17 @@
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
strdup("MI2S_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
strdup("MI2S_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
strdup("MI2S_TX SampleRate");
-
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
- strdup("USB_AUDIO_TX Format");
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
- strdup("USB_AUDIO_TX SampleRate");
}
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
+ strdup("USB_AUDIO_TX Format");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
+ strdup("USB_AUDIO_TX SampleRate");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
+ strdup("USB_AUDIO_TX Channels");
my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].bitwidth_mixer_ctl =
strdup("USB_AUDIO_RX Format");
@@ -2081,7 +2104,8 @@
return;
}
- if((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
!(usecase->type == VOICE_CALL || usecase->type == VOIP_CALL)) {
ALOGI("%s: Not adding vbat speaker device to non voice use cases", __func__);
return;
@@ -2485,7 +2509,7 @@
{
int32_t port = DEFAULT_CODEC_BACKEND;
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
if (backend_tag_table[snd_device] != NULL) {
if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
sizeof("headphones-44.1")) == 0)
@@ -2500,29 +2524,17 @@
else if (strcmp(backend_tag_table[snd_device], "usb-headphones") == 0)
port = USB_AUDIO_RX_BACKEND;
}
- } else {
- ALOGV("%s:napb: Invalid device - %d ", __func__, snd_device);
- }
-
- ALOGV("%s:napb: backend port - %d device - %d ", __func__, port,
- snd_device);
- return port;
-}
-
-static int platform_get_capture_backend_index(snd_device_t snd_device)
-{
- int32_t port = DEFAULT_CODEC_TX_BACKEND;
-
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
+ port = DEFAULT_CODEC_TX_BACKEND;
if (backend_tag_table[snd_device] != NULL) {
if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
port = USB_AUDIO_TX_BACKEND;
}
} else {
- ALOGW("%s: Invalid device - %d ", __func__, snd_device);
+ ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
}
- ALOGV("%s: backend port - %d snd_device %d", __func__, port, snd_device);
+ ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
return port;
}
@@ -2605,7 +2617,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -2640,9 +2654,18 @@
if (my_data->acdb_send_voice_cal == NULL) {
ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
} else {
- if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
- audio_extn_spkr_prot_is_enabled())
- out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ if (audio_extn_spkr_prot_is_enabled()) {
+ if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
+ }
acdb_rx_id = acdb_device_table[out_snd_device];
acdb_tx_id = acdb_device_table[in_snd_device];
@@ -2669,7 +2692,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -2899,6 +2924,7 @@
*num_devices = 2;
new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
+ status = true;
}
ALOGD("%s: snd_device(%d) num devices(%d) new_snd_devices(%d)", __func__,
@@ -3073,12 +3099,22 @@
} else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
snd_device = SND_DEVICE_OUT_BT_A2DP;
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
- if (my_data->is_vbat_speaker)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
- else if (my_data->is_wsa_speaker)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_WSA;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ if (my_data->is_vbat_speaker) {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT;
+ } else if (my_data->is_wsa_speaker) {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_WSA;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA;
+ } else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
} else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
snd_device = SND_DEVICE_OUT_USB_HEADSET;
@@ -3784,6 +3820,16 @@
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
+ if (err >= 0) {
+ if (!strncmp("left", value, sizeof("left")))
+ my_data->mono_speaker = SPKR_1;
+ else if (!strncmp("right", value, sizeof("right")))
+ my_data->mono_speaker = SPKR_2;
+
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER);
+ }
+
#ifdef RECORD_PLAY_CONCURRENCY
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC, value, sizeof(value));
if (err >= 0) {
@@ -4027,7 +4073,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4090,7 +4138,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4239,7 +4289,7 @@
if (bit_width !=
my_data->current_backend_cfg[backend_idx].bit_width) {
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
ctl = mixer_get_ctl_by_name(adev->mixer,
my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
if (!ctl) {
@@ -4255,7 +4305,7 @@
else
mixer_ctl_set_enum_by_string(ctl, "S24_LE");
} else if (bit_width == 32) {
- mixer_ctl_set_enum_by_string(ctl, "S24_LE");
+ mixer_ctl_set_enum_by_string(ctl, "S32_LE");
} else {
mixer_ctl_set_enum_by_string(ctl, "S16_LE");
}
@@ -4296,14 +4346,24 @@
rate_str = "KHZ_44P1";
break;
case 64000:
- case 88200:
case 96000:
rate_str = "KHZ_96";
break;
+ case 88200:
+ rate_str = "KHZ_88P2";
+ break;
case 176400:
+ rate_str = "KHZ_176P4";
+ break;
case 192000:
rate_str = "KHZ_192";
break;
+ case 352800:
+ rate_str = "KHZ_352P8";
+ break;
+ case 384000:
+ rate_str = "KHZ_384";
+ break;
default:
rate_str = "KHZ_48";
break;
@@ -4343,6 +4403,9 @@
channel_cnt_str = "Four"; break;
case 3:
channel_cnt_str = "Three"; break;
+ case 1:
+ channel_cnt_str = "One"; break;
+ case 2:
default:
channel_cnt_str = "Two"; break;
}
@@ -4578,6 +4641,13 @@
} else if ((usecase->devices & AUDIO_DEVICE_OUT_SPEAKER) ||
(usecase->devices & AUDIO_DEVICE_OUT_EARPIECE) ) {
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+
+ if (bit_width >= 24) {
+ bit_width = platform_get_snd_device_bit_width(SND_DEVICE_OUT_SPEAKER);
+ ALOGD("%s:becf: afe: reset bitwidth to %d (based on supported"
+ " value for this platform)", __func__, bit_width);
+ }
+
ALOGD("%s:becf: afe: playback on codec device not supporting native playback set "
"default Sample Rate(48k)", __func__);
}
@@ -4598,6 +4668,13 @@
hdmi_backend_cfg.channels = channels;
hdmi_backend_cfg.passthrough_enabled = false;
+ /*HDMI does not support 384Khz/32bit playback hence configure BE to 24b/192Khz*/
+ /* TODO: Instead have the validation against edid return the next best match*/
+ if (bit_width > 24)
+ hdmi_backend_cfg.bit_width = 24;
+ if (sample_rate > 192000)
+ hdmi_backend_cfg.sample_rate = 192000;
+
platform_check_hdmi_backend_cfg(adev, usecase, backend_idx, &hdmi_backend_cfg);
bit_width = hdmi_backend_cfg.bit_width;
@@ -4695,127 +4772,6 @@
}
/*
- * configures afe with bit width and Sample Rate
- */
-
-static int platform_set_capture_codec_backend_cfg(struct audio_device* adev,
- snd_device_t snd_device,
- struct audio_backend_cfg backend_cfg)
-{
- int ret = 0;
- int backend_idx = platform_get_capture_backend_index(snd_device);
- struct platform_data *my_data = (struct platform_data *)adev->platform;
-
- ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, backend_idx %d device (%s)",
- __func__, backend_cfg.bit_width, backend_cfg.sample_rate, backend_idx,
- platform_get_snd_device_name(snd_device));
-
- if (backend_cfg.bit_width !=
- my_data->current_tx_backend_cfg[backend_idx].bit_width) {
-
- struct mixer_ctl *ctl = NULL;
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- if (!ctl) {
- ALOGE("%s:txbecf: afe: Could not get ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- if (backend_cfg.bit_width == 24) {
- if (backend_cfg.format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
- else
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
- } else {
- ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
- }
-
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].bit_width = backend_cfg.bit_width;
- ALOGD("%s:txbecf: afe: %s mixer set to %d bit", __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl,
- backend_cfg.bit_width);
- }
-
- /*
- * Backend sample rate configuration follows:
- * 16 bit record - 48khz for streams at any valid sample rate
- * 24 bit record - 48khz for stream sample rate less than 48khz
- * 24 bit record - 96khz for sample rate range of 48khz to 96khz
- * 24 bit record - 192khz for sample rate range of 96khz to 192 khz
- * Upper limit is inclusive in the sample rate range.
- */
- // TODO: This has to be more dynamic based on policy file
-
- if (backend_cfg.sample_rate !=
- my_data->current_tx_backend_cfg[(int)backend_idx].sample_rate) {
- /*
- * sample rate update is needed only for hifi audio enabled platforms
- */
- char *rate_str = NULL;
- struct mixer_ctl *ctl = NULL;
-
- switch (backend_cfg.sample_rate) {
- case 8000:
- case 11025:
- case 16000:
- case 22050:
- case 32000:
- case 44100:
- case 48000:
- rate_str = "KHZ_48";
- break;
- case 64000:
- case 88200:
- case 96000:
- rate_str = "KHZ_96";
- break;
- case 176400:
- case 192000:
- rate_str = "KHZ_192";
- break;
- default:
- rate_str = "KHZ_48";
- break;
- }
-
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
-
- if (ctl < 0) {
- ALOGE("%s:txbecf: afe: Could not get ctl to set the Sample Rate for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- ALOGD("%s:txbecf: afe: %s set to %s", __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl,
- rate_str);
- ret = mixer_ctl_set_enum_by_string(ctl, rate_str);
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].sample_rate =
- backend_cfg.sample_rate;
- }
-
- return ret;
-}
-
-/*
* goes through all the current usecases and picks the highest
* bitwidth & samplerate
*/
@@ -4834,7 +4790,8 @@
channels = backend_cfg->channels;
ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
- "sample rate: %d",__func__,backend_idx, bit_width, sample_rate);
+ "sample rate: %d, channels %d",__func__,backend_idx, bit_width,
+ sample_rate, channels);
// For voice calls use default configuration i.e. 16b/48K, only applicable to
// default backend
@@ -4856,14 +4813,17 @@
"sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
// Force routing if the expected bitwdith or samplerate
// is not same as current backend comfiguration
- if ((bit_width != my_data->current_tx_backend_cfg[backend_idx].bit_width) ||
- (sample_rate != my_data->current_tx_backend_cfg[backend_idx].sample_rate)) {
+ if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
+ (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
+ (channels != my_data->current_backend_cfg[backend_idx].channels)) {
backend_cfg->bit_width = bit_width;
backend_cfg->sample_rate= sample_rate;
+ backend_cfg->channels = channels;
backend_change = true;
ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
- "new sample rate: %d", __func__, backend_cfg->bit_width,
- backend_cfg->sample_rate);
+ "new sample rate: %d new channel: %d",
+ __func__, backend_cfg->bit_width,
+ backend_cfg->sample_rate, backend_cfg->channels);
}
return backend_change;
@@ -4872,7 +4832,7 @@
bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
struct audio_usecase *usecase, snd_device_t snd_device)
{
- int backend_idx = platform_get_capture_backend_index(snd_device);
+ int backend_idx = platform_get_backend_index(snd_device);
int ret = 0;
struct audio_backend_cfg backend_cfg;
@@ -4898,8 +4858,8 @@
platform_get_snd_device_name(snd_device));
if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
&backend_cfg)) {
- ret = platform_set_capture_codec_backend_cfg(adev, snd_device,
- backend_cfg);
+ ret = platform_set_codec_backend_cfg(adev, snd_device,
+ backend_cfg);
if(!ret)
return true;
}
@@ -5553,8 +5513,11 @@
snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA) {
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
ret = true;
}
@@ -5574,12 +5537,19 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
+ break;
default:
acdb_id = -EINVAL;
break;
@@ -5599,15 +5569,37 @@
case SND_DEVICE_OUT_VOICE_SPEAKER:
case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
default:
return snd_device;
}
}
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device)
+{
+ switch(snd_device) {
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
+ default:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ }
+}
+
int platform_set_sidetone(struct audio_device *adev,
snd_device_t out_snd_device,
bool enable,
@@ -5631,6 +5623,14 @@
return 0;
}
+void platform_update_aanc_path(struct audio_device *adev __unused,
+ snd_device_t out_snd_device __unused,
+ bool enable __unused,
+ char *str __unused)
+{
+ return;
+}
+
bool platform_check_codec_dsd_support(void *platform __unused)
{
return false;
@@ -5641,12 +5641,6 @@
return false;
}
-bool platform_check_if_backend_has_to_be_disabled(snd_device_t new_snd_device __unused,
- snd_device_t cuurent_snd_device __unused)
-{
- return false;
-}
-
int platform_send_audio_cal(void* platform __unused,
int acdb_dev_id __unused, int acdb_device_type __unused,
int app_type __unused, int topology_id __unused,
@@ -5686,3 +5680,8 @@
{
return -ENOSYS;
}
+
+int platform_get_max_mic_count(void *platform) {
+ struct platform_data *my_data = (struct platform_data *)platform;
+ return my_data->max_mic_count;
+}
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index 1e54ee1..cba9068 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -39,6 +39,11 @@
SOURCE_QUAD_MIC = 0x8, /* Target contains 4 mics */
};
+enum {
+ SPKR_1,
+ SPKR_2
+};
+
#define PLATFORM_IMAGE_NAME "modem"
/*
@@ -92,6 +97,9 @@
SND_DEVICE_OUT_VOICE_SPEAKER,
SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT,
SND_DEVICE_OUT_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_LINE,
SND_DEVICE_OUT_HDMI,
@@ -118,8 +126,10 @@
SND_DEVICE_OUT_ANC_HANDSET,
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
#ifdef RECORD_PLAY_CONCURRENCY
SND_DEVICE_OUT_VOIP_HANDSET,
SND_DEVICE_OUT_VOIP_SPEAKER,
@@ -178,6 +188,8 @@
SND_DEVICE_IN_HANDSET_STEREO_DMIC,
SND_DEVICE_IN_SPEAKER_STEREO_DMIC,
SND_DEVICE_IN_CAPTURE_VI_FEEDBACK,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2,
SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE,
@@ -221,14 +233,14 @@
HDMI_RX_BACKEND,
DISP_PORT_RX_BACKEND,
USB_AUDIO_RX_BACKEND,
+ MAX_RX_CODEC_BACKENDS = USB_AUDIO_RX_BACKEND,
+ /* TX BE follows RX BE */
+ SLIMBUS_0_TX,
+ DEFAULT_CODEC_TX_BACKEND = SLIMBUS_0_TX,
+ USB_AUDIO_TX_BACKEND,
MAX_CODEC_BACKENDS
};
-enum {
- DEFAULT_CODEC_TX_BACKEND,
- SLIMBUS_0_TX = DEFAULT_CODEC_TX_BACKEND,
- USB_AUDIO_TX_BACKEND,
- MAX_CODEC_TX_BACKENDS
-};
+
#define AUDIO_PARAMETER_KEY_NATIVE_AUDIO "audio.nat.codec.enabled"
#define AUDIO_PARAMETER_KEY_NATIVE_AUDIO_MODE "native_audio_mode"
@@ -255,6 +267,7 @@
* the buffer size of an input/output stream
*/
#define DEEP_BUFFER_OUTPUT_PERIOD_SIZE 1920
+#define DEEP_BUFFER_OUTPUT_PERIOD_DURATION 40 /* 40 millisecs */
#define DEEP_BUFFER_OUTPUT_PERIOD_COUNT 2
#define LOW_LATENCY_OUTPUT_PERIOD_SIZE 240
#define LOW_LATENCY_OUTPUT_PERIOD_COUNT 2
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index 3c2dae6..e025772 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1229,6 +1229,11 @@
return -ENOSYS;
}
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device __unused)
+{
+ return -ENOSYS;
+}
+
int platform_spkr_prot_is_wsa_analog_mode(void *adev __unused)
{
return 0;
@@ -1310,6 +1315,14 @@
return 0;
}
+void platform_update_aanc_path(struct audio_device *adev __unused,
+ snd_device_t out_snd_device __unused,
+ bool enable __unused,
+ char *str __unused)
+{
+ return;
+}
+
bool platform_check_codec_dsd_support(void *platform __unused)
{
return false;
@@ -1325,8 +1338,3 @@
return false;
}
-bool platform_check_if_backend_has_to_be_disabled(snd_device_t new_snd_device __unused,
- snd_device_t cuurent_snd_device __unused)
-{
- return false;
-}
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 48bb46c..e947f91 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -60,7 +60,8 @@
#define LIB_ACDB_LOADER "libacdbloader.so"
#define CVD_VERSION_MIXER_CTL "CVD Version"
-#define MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
+#define FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
+#define MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024 * 1024)
#define MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024)
#define COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING (2 * 1024)
#define COMPRESS_OFFLOAD_FRAGMENT_SIZE (32 * 1024)
@@ -108,6 +109,8 @@
#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
+#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
+
#define AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS "perf_lock_opts"
/* Reload ACDB files from specified path */
@@ -218,6 +221,7 @@
/* Vbat monitor related flags */
bool is_vbat_speaker;
bool gsm_mode_enabled;
+ int mono_speaker;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -240,7 +244,6 @@
int ext_disp_type;
char ec_ref_mixer_path[64];
codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
- codec_backend_cfg_t current_tx_backend_cfg[MAX_CODEC_TX_BACKENDS];
char codec_version[CODEC_VERSION_MAX_LENGTH];
int hw_dep_fd;
char cvd_version[MAX_CVD_VERSION_STRING_SIZE];
@@ -348,6 +351,8 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "voice-speaker-vbat",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "voice-speaker-2-vbat",
[SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
[SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
[SND_DEVICE_OUT_HDMI] = "hdmi",
@@ -374,8 +379,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
/* Capture sound devices */
[SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
@@ -425,6 +432,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = "vi-feedback-mono-1",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = "vi-feedback-mono-2",
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
@@ -467,6 +476,8 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 14,
[SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_LINE] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
@@ -493,8 +504,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = 103,
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = 101,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
[SND_DEVICE_IN_HANDSET_MIC] = 4,
[SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
@@ -543,6 +556,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = 102,
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
@@ -588,6 +603,8 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
{TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
@@ -613,8 +630,10 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_EXTERNAL)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
@@ -660,6 +679,8 @@
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE)},
@@ -774,8 +795,8 @@
static int msm_device_to_be_id [][NO_COLS] = {
{AUDIO_DEVICE_OUT_EARPIECE , 2},
{AUDIO_DEVICE_OUT_SPEAKER , 2},
- {AUDIO_DEVICE_OUT_WIRED_HEADSET , 2},
- {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 2},
+ {AUDIO_DEVICE_OUT_WIRED_HEADSET , 41},
+ {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 41},
{AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
{AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
{AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
@@ -1121,6 +1142,7 @@
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("headphones-dsd");
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("voice-speaker-vbat");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("voice-speaker-2-vbat");
backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
@@ -1544,6 +1566,7 @@
my_data->edid_info = NULL;
my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
my_data->hw_dep_fd = -1;
+ my_data->mono_speaker = SPKR_1;
property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, "");
if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
@@ -1732,6 +1755,8 @@
my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
+ if (idx > MAX_RX_CODEC_BACKENDS)
+ my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
@@ -1752,15 +1777,17 @@
my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].samplerate_mixer_ctl =
strdup("SLIM_5_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
strdup("SLIM_0_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
strdup("SLIM_0_TX SampleRate");
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
strdup("USB_AUDIO_TX Format");
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
strdup("USB_AUDIO_TX SampleRate");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
+ strdup("USB_AUDIO_TX Channels");
ret = audio_extn_utils_get_codec_version(snd_card_name,
my_data->adev->snd_card,
@@ -1911,7 +1938,8 @@
return;
}
- if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
!(usecase->type == VOICE_CALL || usecase->type == VOIP_CALL)) {
ALOGI("%s: Not adding vbat speaker device to non voice use cases", __func__);
return;
@@ -1959,32 +1987,6 @@
return result;
}
-bool platform_check_if_backend_has_to_be_disabled(snd_device_t new_snd_device,
- snd_device_t cuurent_snd_device)
-{
- bool result = false;
-
- ALOGV("%s: current snd device = %s, new snd device = %s", __func__,
- platform_get_snd_device_name(cuurent_snd_device),
- platform_get_snd_device_name(new_snd_device));
-
- if ((new_snd_device < SND_DEVICE_MIN) || (new_snd_device >= SND_DEVICE_OUT_END) ||
- (cuurent_snd_device < SND_DEVICE_MIN) || (cuurent_snd_device >= SND_DEVICE_OUT_END)) {
- ALOGE("%s: Invalid snd_device",__func__);
- return false;
- }
-
- if (cuurent_snd_device == SND_DEVICE_OUT_HEADPHONES &&
- (new_snd_device == SND_DEVICE_OUT_HEADPHONES_44_1 ||
- new_snd_device == SND_DEVICE_OUT_HEADPHONES_DSD)) {
- result = true;
- }
-
- ALOGV("%s: Need to disable current backend %s, %d",
- __func__, platform_get_snd_device_name(cuurent_snd_device), result);
- return result;
-}
-
int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
{
int device_id;
@@ -2163,7 +2165,7 @@
{
if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
- return DEFAULT_OUTPUT_SAMPLING_RATE;
+ return CODEC_BACKEND_DEFAULT_BIT_WIDTH;
}
return backend_bit_width_table[snd_device];
}
@@ -2335,7 +2337,7 @@
{
int32_t port = DEFAULT_CODEC_BACKEND;
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
if (backend_tag_table[snd_device] != NULL) {
if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
sizeof("headphones-44.1")) == 0)
@@ -2353,28 +2355,17 @@
else if (strcmp(backend_tag_table[snd_device], "usb-headphones") == 0)
port = USB_AUDIO_RX_BACKEND;
}
- } else {
- ALOGV("%s:napb: Invalid device - %d ", __func__, snd_device);
- }
-
- ALOGV("%s:napb: backend port - %d snd_device %d", __func__, port, snd_device);
- return port;
-}
-
-static int platform_get_capture_backend_index(snd_device_t snd_device)
-{
- int32_t port = DEFAULT_CODEC_TX_BACKEND;
-
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
+ port = DEFAULT_CODEC_TX_BACKEND;
if (backend_tag_table[snd_device] != NULL) {
if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
port = USB_AUDIO_TX_BACKEND;
}
} else {
- ALOGW("%s: Invalid device - %d ", __func__, snd_device);
+ ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
}
- ALOGV("%s: backend port - %d snd_device %d", __func__, port, snd_device);
+ ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
return port;
}
@@ -2459,7 +2450,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -2494,9 +2487,16 @@
if (my_data->acdb_send_voice_cal == NULL) {
ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
} else {
- if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
- audio_extn_spkr_prot_is_enabled())
- out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ if (audio_extn_spkr_prot_is_enabled()) {
+ if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
+ }
acdb_rx_id = acdb_device_table[out_snd_device];
acdb_tx_id = acdb_device_table[in_snd_device];
@@ -2523,7 +2523,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -2740,9 +2742,9 @@
*num_devices = 2;
new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
+ status = true;
}
-
ALOGD("%s: snd_device(%d) num devices(%d) new_snd_devices(%d)", __func__,
snd_device, *num_devices, *new_snd_devices);
@@ -2902,10 +2904,17 @@
else
snd_device = SND_DEVICE_OUT_BT_SCO;
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
- if (my_data->is_vbat_speaker)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ if (my_data->is_vbat_speaker) {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT;
+ } else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
} else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
snd_device = SND_DEVICE_OUT_BT_A2DP;
} else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
@@ -2927,7 +2936,8 @@
}
if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
- devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
+ devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
+ devices & AUDIO_DEVICE_OUT_LINE) {
if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET
&& audio_extn_get_anc_enabled()) {
if (audio_extn_should_use_fb_anc())
@@ -3800,6 +3810,16 @@
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
+ if (err >= 0) {
+ if (!strncmp("left", value, sizeof("left")))
+ my_data->mono_speaker = SPKR_1;
+ else if (!strncmp("right", value, sizeof("right")))
+ my_data->mono_speaker = SPKR_2;
+
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER);
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE,
value, len);
if (err >= 0) {
@@ -4198,7 +4218,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4216,7 +4238,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4248,18 +4272,21 @@
fragment_size = info->offload_buffer_size;
}
- // For FLAC use max size since it is loss less, and has sampling rates
- // upto 192kHZ
- if (info != NULL && !info->has_video &&
- info->format == AUDIO_FORMAT_FLAC) {
- fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
- ALOGV("FLAC fragment size %d", fragment_size);
- }
-
- if (info != NULL && info->has_video && info->is_streaming) {
- fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING;
- ALOGV("%s: offload fragment size reduced for AV streaming to %d",
- __func__, fragment_size);
+ if (info != NULL && !info->has_video) {
+ if (info->is_streaming) {
+ fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING;
+ ALOGV("%s: offload fragment size reduced for AV streaming to %d",
+ __func__, fragment_size);
+ } else if (info->format == AUDIO_FORMAT_FLAC) {
+ fragment_size = FLAC_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
+ ALOGV("FLAC fragment size %d", fragment_size);
+ } else if (info->format == AUDIO_FORMAT_DSD) {
+ fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
+ if((property_get("audio.native.dsd.buffer.size.kb", value, "")) &&
+ atoi(value))
+ fragment_size = atoi(value) * 1024;
+ ALOGV("DSD fragment size %d", fragment_size);
+ }
}
fragment_size = ALIGN( fragment_size, 1024);
@@ -4303,7 +4330,7 @@
snd_device_t snd_device, struct audio_backend_cfg backend_cfg)
{
int ret = 0;
- int backend_idx = DEFAULT_CODEC_BACKEND;
+ int backend_idx = platform_get_backend_index(snd_device);
struct platform_data *my_data = (struct platform_data *)adev->platform;
backend_idx = platform_get_backend_index(snd_device);
unsigned int bit_width = backend_cfg.bit_width;
@@ -4313,13 +4340,14 @@
bool passthrough_enabled = backend_cfg.passthrough_enabled;
ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
- ", backend_idx %d device (%s)", __func__, bit_width, sample_rate, channels, backend_idx,
+ ", backend_idx %d device (%s)", __func__, bit_width,
+ sample_rate, channels, backend_idx,
platform_get_snd_device_name(snd_device));
if (bit_width !=
my_data->current_backend_cfg[backend_idx].bit_width) {
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
ctl = mixer_get_ctl_by_name(adev->mixer,
my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
if (!ctl) {
@@ -4331,23 +4359,30 @@
if (bit_width == 24) {
if (format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
- mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
else
- mixer_ctl_set_enum_by_string(ctl, "S24_LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
} else if (bit_width == 32) {
- mixer_ctl_set_enum_by_string(ctl, "S24_LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S32_LE");
} else {
- mixer_ctl_set_enum_by_string(ctl, "S16_LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
}
- my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
- ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
- my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
+ if ( ret < 0) {
+ ALOGE("%s:becf: afe: fail for %s mixer set to %d bit for %x format", __func__,
+ my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
+ } else {
+ my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
+ ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
+ my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
+ }
+ /* set the ret as 0 and not pass back to upper layer */
+ ret = 0;
}
if (sample_rate !=
my_data->current_backend_cfg[backend_idx].sample_rate) {
char *rate_str = NULL;
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
switch (sample_rate) {
case 8000:
@@ -4401,7 +4436,7 @@
}
if ((my_data->current_backend_cfg[backend_idx].channels_mixer_ctl) &&
(channels != my_data->current_backend_cfg[backend_idx].channels)) {
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
char *channel_cnt_str = NULL;
switch (channels) {
@@ -4417,6 +4452,9 @@
channel_cnt_str = "Four"; break;
case 3:
channel_cnt_str = "Three"; break;
+ case 1:
+ channel_cnt_str = "One"; break;
+ case 2:
default:
channel_cnt_str = "Two"; break;
}
@@ -4436,7 +4474,8 @@
platform_set_edid_channels_configuration(adev->platform, channels);
ALOGD("%s:becf: afe: %s set to %s", __func__,
- my_data->current_backend_cfg[backend_idx].channels_mixer_ctl, channel_cnt_str);
+ my_data->current_backend_cfg[backend_idx].channels_mixer_ctl,
+ channel_cnt_str);
}
bool set_ext_disp_format = false;
@@ -4658,13 +4697,41 @@
ALOGD("%s:becf: afe: true napb active set rate to 44.1 khz",
__func__);
}
- } else if (OUTPUT_SAMPLING_RATE_44100 == sample_rate) {
- sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
- ALOGD("%s:becf: afe: napb not active - set (48k) default rate",
+ } else if (na_mode != NATIVE_AUDIO_MODE_MULTIPLE_44_1) {
+ /*
+ * Map native sampling rates to upper limit range
+ * if multiple of native sampling rates are not supported.
+ * This check also indicates that this is not tavil codec
+ * And 32bit/384kHz is only supported on tavil
+ * Hence reset 32b/384kHz to 24b/192kHz.
+ */
+ switch (sample_rate) {
+ case 44100:
+ sample_rate = 48000;
+ break;
+ case 88200:
+ sample_rate = 96000;
+ break;
+ case 176400:
+ case 352800:
+ case 384000:
+ sample_rate = 192000;
+ break;
+ }
+ if (bit_width > 24)
+ bit_width = 24;
+
+ ALOGD("%s:becf: afe: napb not active - set non fractional rate",
__func__);
}
} else if ((usecase->devices & AUDIO_DEVICE_OUT_SPEAKER) ||
(usecase->devices & AUDIO_DEVICE_OUT_EARPIECE) ) {
+
+ if (bit_width >= 24) {
+ bit_width = platform_get_snd_device_bit_width(SND_DEVICE_OUT_SPEAKER);
+ ALOGD("%s:becf: afe: reset bitwidth to %d (based on supported"
+ " value for this platform)", __func__, bit_width);
+ }
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
ALOGD("%s:becf: afe: playback on codec device not supporting native playback set "
"default Sample Rate(48k)", __func__);
@@ -4685,6 +4752,15 @@
hdmi_backend_cfg.channels = channels;
hdmi_backend_cfg.passthrough_enabled = false;
+ /*
+ * HDMI does not support 384Khz/32bit playback hence configure BE to 24b/192Khz
+ * TODO: Instead have the validation against edid return the next best match
+ */
+ if (bit_width > 24)
+ hdmi_backend_cfg.bit_width = 24;
+ if (sample_rate > 192000)
+ hdmi_backend_cfg.sample_rate = 192000;
+
platform_check_hdmi_backend_cfg(adev, usecase, backend_idx, &hdmi_backend_cfg);
bit_width = hdmi_backend_cfg.bit_width;
@@ -4696,23 +4772,6 @@
channels_updated = true;
}
- /*
- * Map native sampling rates to upper limit range
- * if multiple of native sampling rates are not supported.
- */
- if (NATIVE_AUDIO_MODE_MULTIPLE_44_1 != na_mode) {
- switch (sample_rate) {
- case 88200:
- sample_rate = 96000;
- break;
- case 176400:
- sample_rate = 192000;
- break;
- case 352800:
- sample_rate = 192000;
- break;
- }
- }
ALOGI("%s:becf: afe: Codec selected backend: %d updated bit width: %d and sample rate: %d",
__func__, backend_idx , bit_width, sample_rate);
@@ -4786,126 +4845,6 @@
}
/*
- * configures afe with bit width and Sample Rate
- */
-
-static int platform_set_capture_codec_backend_cfg(struct audio_device* adev,
- snd_device_t snd_device,
- struct audio_backend_cfg backend_cfg)
-{
- int ret = 0;
- int backend_idx = platform_get_capture_backend_index(snd_device);
- struct platform_data *my_data = (struct platform_data *)adev->platform;
-
- ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, backend_idx %d device (%s)",
- __func__, backend_cfg.bit_width, backend_cfg.sample_rate, backend_idx,
- platform_get_snd_device_name(snd_device));
-
- if (backend_cfg.bit_width!=
- my_data->current_tx_backend_cfg[backend_idx].bit_width) {
-
- struct mixer_ctl *ctl = NULL;
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- if (!ctl) {
- ALOGE("%s:txbecf: afe: Could not get ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
- if (backend_cfg.bit_width == 24) {
- if (backend_cfg.format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
- else
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
- } else {
- ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
- }
-
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].bit_width = backend_cfg.bit_width;
- ALOGD("%s:txbecf: afe: %s mixer set to %d bit", __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl,
- backend_cfg.bit_width);
- }
-
- /*
- * Backend sample rate configuration follows:
- * 16 bit record - 48khz for streams at any valid sample rate
- * 24 bit record - 48khz for stream sample rate less than 48khz
- * 24 bit record - 96khz for sample rate range of 48khz to 96khz
- * 24 bit record - 192khz for sample rate range of 96khz to 192 khz
- * Upper limit is inclusive in the sample rate range.
- */
- // TODO: This has to be more dynamic based on policy file
-
- if (backend_cfg.sample_rate !=
- my_data->current_tx_backend_cfg[(int)backend_idx].sample_rate) {
- /*
- * sample rate update is needed only for hifi audio enabled platforms
- */
- char *rate_str = NULL;
- struct mixer_ctl *ctl = NULL;
-
- switch (backend_cfg.sample_rate) {
- case 8000:
- case 11025:
- case 16000:
- case 22050:
- case 32000:
- case 44100:
- case 48000:
- rate_str = "KHZ_48";
- break;
- case 64000:
- case 88200:
- case 96000:
- rate_str = "KHZ_96";
- break;
- case 176400:
- case 192000:
- rate_str = "KHZ_192";
- break;
- default:
- rate_str = "KHZ_48";
- break;
- }
-
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
-
- if (!ctl) {
- ALOGE("%s:txbecf: afe: Could not get ctl to set the Sample Rate for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- ALOGD("%s:txbecf: afe: %s set to %s", __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl,
- rate_str);
- ret = mixer_ctl_set_enum_by_string(ctl, rate_str);
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].sample_rate =
- backend_cfg.sample_rate;
- }
-
- return ret;
-}
-
-/*
* goes through all the current usecases and picks the highest
* bitwidth & samplerate
*/
@@ -4924,20 +4863,21 @@
channels = backend_cfg->channels;
ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
- "sample rate: %d",__func__,backend_idx, bit_width, sample_rate);
+ "sample rate: %d, channels %d",__func__,backend_idx, bit_width,
+ sample_rate, channels);
// For voice calls use default configuration i.e. 16b/48K, only applicable to
// default backend
// force routing is not required here, caller will do it anyway
if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
- ALOGW("%s:txbecf: afe:Use default bw and sr for voice/voip calls and "
+ ALOGW("%s:txbecf: afe: Use default bw and sr for voice/voip calls and "
"for unprocessed/camera source", __func__);
bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
}
if (backend_idx == USB_AUDIO_TX_BACKEND) {
audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, false);
- ALOGV("%s: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
+ ALOGV("%s:txbecf: afe: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
__func__, bit_width, sample_rate, channels);
}
@@ -4945,14 +4885,17 @@
"sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
// Force routing if the expected bitwdith or samplerate
// is not same as current backend comfiguration
- if ((bit_width != my_data->current_tx_backend_cfg[backend_idx].bit_width) ||
- (sample_rate != my_data->current_tx_backend_cfg[backend_idx].sample_rate)) {
+ if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
+ (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
+ (channels != my_data->current_backend_cfg[backend_idx].channels)) {
backend_cfg->bit_width = bit_width;
backend_cfg->sample_rate= sample_rate;
+ backend_cfg->channels = channels;
backend_change = true;
ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
- "new sample rate: %d", __func__, backend_cfg->bit_width,
- backend_cfg->sample_rate);
+ "new sample rate: %d new channel: %d",
+ __func__, backend_cfg->bit_width,
+ backend_cfg->sample_rate, backend_cfg->channels);
}
return backend_change;
@@ -4961,7 +4904,7 @@
bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
struct audio_usecase *usecase, snd_device_t snd_device)
{
- int backend_idx = platform_get_capture_backend_index(snd_device);
+ int backend_idx = platform_get_backend_index(snd_device);
int ret = 0;
struct audio_backend_cfg backend_cfg;
@@ -4987,8 +4930,8 @@
platform_get_snd_device_name(snd_device));
if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
&backend_cfg)) {
- ret = platform_set_capture_codec_backend_cfg(adev, snd_device,
- backend_cfg);
+ ret = platform_set_codec_backend_cfg(adev, snd_device,
+ backend_cfg);
if(!ret)
return true;
}
@@ -5546,7 +5489,9 @@
if (snd_device == SND_DEVICE_OUT_SPEAKER ||
snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
- snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) {
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2) {
ret = true;
}
@@ -5564,12 +5509,18 @@
case SND_DEVICE_OUT_VOICE_SPEAKER:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
+ break;
default:
acdb_id = -EINVAL;
break;
@@ -5587,14 +5538,34 @@
return SND_DEVICE_OUT_SPEAKER_PROTECTED;
case SND_DEVICE_OUT_VOICE_SPEAKER:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
default:
return snd_device;
}
}
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device)
+{
+ switch(snd_device) {
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
+ default:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ }
+}
int platform_spkr_prot_is_wsa_analog_mode(void *adev __unused)
{
@@ -5660,10 +5631,14 @@
{
int ret;
if (out_snd_device == SND_DEVICE_OUT_USB_HEADSET) {
+ if (property_get_bool("audio.debug.usb.disable_sidetone", 0)) {
+ ALOGI("Debug: Disable sidetone");
+ } else {
ret = audio_extn_usb_enable_sidetone(out_snd_device, enable);
if (ret)
ALOGI("%s: usb device %d does not support device sidetone\n",
__func__, out_snd_device);
+ }
} else {
ALOGV("%s: sidetone out device(%d) mixer cmd = %s\n",
__func__, out_snd_device, str);
@@ -5676,6 +5651,22 @@
return 0;
}
+void platform_update_aanc_path(struct audio_device *adev,
+ snd_device_t out_snd_device,
+ bool enable,
+ char *str)
+{
+ ALOGD("%s: aanc out device(%d) mixer cmd = %s, enable = %d\n",
+ __func__, out_snd_device, str, enable);
+
+ if (enable)
+ audio_route_apply_and_update_path(adev->audio_route, str);
+ else
+ audio_route_reset_and_update_path(adev->audio_route, str);
+
+ return;
+}
+
static void make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
int acdb_device_type, int app_type, int topology_id,
int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
@@ -5825,3 +5816,8 @@
ERROR_RETURN:
return ret;
}
+
+int platform_get_max_mic_count(void *platform) {
+ struct platform_data *my_data = (struct platform_data *)platform;
+ return my_data->max_mic_count;
+}
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index bcf5d93..c231843 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -39,6 +39,11 @@
SOURCE_QUAD_MIC = 0x8, /* Target contains 4 mics */
};
+enum {
+ SPKR_1,
+ SPKR_2
+};
+
/*
* Below are the devices for which is back end is same, SLIMBUS_0_RX.
* All these devices are handled by the internal HW codec. We can
@@ -89,6 +94,8 @@
SND_DEVICE_OUT_VOICE_HANDSET,
SND_DEVICE_OUT_VOICE_SPEAKER,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT,
SND_DEVICE_OUT_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_LINE,
SND_DEVICE_OUT_HDMI,
@@ -115,10 +122,13 @@
SND_DEVICE_OUT_ANC_HANDSET,
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
SND_DEVICE_OUT_SPEAKER_WSA,
SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA,
SND_DEVICE_OUT_END,
/*
@@ -172,6 +182,8 @@
SND_DEVICE_IN_HANDSET_STEREO_DMIC,
SND_DEVICE_IN_SPEAKER_STEREO_DMIC,
SND_DEVICE_IN_CAPTURE_VI_FEEDBACK,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2,
SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE,
@@ -213,14 +225,12 @@
HDMI_RX_BACKEND,
DISP_PORT_RX_BACKEND,
USB_AUDIO_RX_BACKEND,
- MAX_CODEC_BACKENDS
-};
-
-enum {
- DEFAULT_CODEC_TX_BACKEND,
- SLIMBUS_0_TX = DEFAULT_CODEC_TX_BACKEND,
+ MAX_RX_CODEC_BACKENDS = USB_AUDIO_RX_BACKEND,
+ /* TX BE follows RX BE */
+ SLIMBUS_0_TX,
+ DEFAULT_CODEC_TX_BACKEND = SLIMBUS_0_TX,
USB_AUDIO_TX_BACKEND,
- MAX_CODEC_TX_BACKENDS
+ MAX_CODEC_BACKENDS
};
#define AUDIO_PARAMETER_KEY_NATIVE_AUDIO "audio.nat.codec.enabled"
@@ -247,7 +257,14 @@
* We should take care of returning proper size when AudioFlinger queries for
* the buffer size of an input/output stream
*/
+
+/* for 384Khz output below period size corresponds to 20ms worth duration of buffer,
+ * current implementation can support buffer size of 40ms duration
+ * for 32b/384Khz/stereo output.
+ */
#define DEEP_BUFFER_OUTPUT_PERIOD_SIZE 1920
+#define DEEP_BUFFER_OUTPUT_PERIOD_DURATION 40 /* 40 milisecs */
+
#define DEEP_BUFFER_OUTPUT_PERIOD_COUNT 2
#define LOW_LATENCY_OUTPUT_PERIOD_SIZE 240
#define LOW_LATENCY_OUTPUT_PERIOD_COUNT 2
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 7bd6756..61f42de 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -24,6 +24,8 @@
#define CODEC_BACKEND_DEFAULT_BIT_WIDTH 16
#define CODEC_BACKEND_DEFAULT_SAMPLE_RATE 48000
#define CODEC_BACKEND_DEFAULT_CHANNELS 2
+#define CODEC_BACKEND_DEFAULT_TX_CHANNELS 1
+
enum {
NATIVE_AUDIO_MODE_SRC = 1,
@@ -143,6 +145,7 @@
bool platform_can_enable_spkr_prot_on_device(snd_device_t snd_device);
int platform_get_spkr_prot_acdb_id(snd_device_t snd_device);
int platform_get_spkr_prot_snd_device(snd_device_t snd_device);
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device);
int platform_spkr_prot_is_wsa_analog_mode(void *adev);
bool platform_can_split_snd_device(void *platform,
snd_device_t snd_device,
@@ -154,12 +157,17 @@
snd_device_t out_snd_device,
bool enable,
char * str);
+void platform_update_aanc_path(struct audio_device *adev,
+ snd_device_t out_snd_device,
+ bool enable,
+ char * str);
bool platform_supports_true_32bit();
bool platform_check_if_backend_has_to_be_disabled(snd_device_t new_snd_device, snd_device_t cuurent_snd_device);
bool platform_check_codec_dsd_support(void *platform);
bool platform_check_codec_asrc_support(void *platform);
int platform_get_backend_index(snd_device_t snd_device);
int platform_get_ext_disp_type(void *platform);
+void platform_invalidate_hdmi_config(void *platform);
int platform_send_audio_cal(void* platform, int acdb_dev_id, int acdb_device_type,
int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
@@ -178,4 +186,5 @@
void* data, int* length);
unsigned char* platform_get_license(void* platform, int* size);
+int platform_get_max_mic_count(void *platform);
#endif // AUDIO_PLATFORM_API_H
diff --git a/hal/voice.c b/hal/voice.c
index f86483e..ca3098b 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -95,6 +95,39 @@
return;
}
+static bool voice_is_aanc_device(snd_device_t out_device,
+ char *mixer_path)
+{
+ bool is_aanc_dev;
+
+ switch (out_device) {
+ case SND_DEVICE_OUT_ANC_HANDSET:
+ is_aanc_dev = true;
+ strlcpy(mixer_path, "aanc-path", MIXER_PATH_MAX_LENGTH);
+ break;
+ default:
+ is_aanc_dev = false;
+ break;
+ }
+
+ return is_aanc_dev;
+}
+
+void voice_check_and_update_aanc_path(struct audio_device *adev,
+ snd_device_t out_snd_device,
+ bool enable)
+{
+ char mixer_path[MIXER_PATH_MAX_LENGTH];
+
+ ALOGV("%s: %s, out_snd_device: %d\n",
+ __func__, (enable ? "enable" : "disable"), out_snd_device);
+
+ if (voice_is_aanc_device(out_snd_device, mixer_path))
+ platform_update_aanc_path(adev, out_snd_device, enable, mixer_path);
+
+ return;
+}
+
int voice_stop_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
{
int ret = 0;
@@ -125,6 +158,10 @@
if (!voice_is_call_state_active(adev))
voice_set_sidetone(adev, uc_info->out_snd_device, false);
+ /* Disable aanc only when no calls are active */
+ if (!voice_is_call_state_active(adev))
+ voice_check_and_update_aanc_path(adev, uc_info->out_snd_device, false);
+
ret = platform_stop_voice_call(adev->platform, session->vsid);
/* 1. Close the PCM devices */
@@ -229,6 +266,10 @@
pcm_start(session->pcm_tx);
pcm_start(session->pcm_rx);
+ /* Enable aanc only when no calls are active */
+ if (!voice_is_call_state_active(adev))
+ voice_check_and_update_aanc_path(adev, uc_info->out_snd_device, true);
+
/* Enable sidetone only when no calls are already active */
if (!voice_is_call_state_active(adev))
voice_set_sidetone(adev, uc_info->out_snd_device, true);
@@ -417,11 +458,13 @@
int err = 0;
adev->voice.mic_mute = state;
- if (adev->mode == AUDIO_MODE_IN_CALL)
+ if (audio_extn_hfp_is_active(adev)) {
+ err = hfp_set_mic_mute(adev, state);
+ } else if (adev->mode == AUDIO_MODE_IN_CALL) {
err = platform_set_mic_mute(adev->platform, state);
- if (adev->mode == AUDIO_MODE_IN_COMMUNICATION)
+ } else if (adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
err = voice_extn_compress_voip_set_mic_mute(adev, state);
-
+ }
return err;
}
diff --git a/hal/voice.h b/hal/voice.h
index efe48d8..3ae42a8 100644
--- a/hal/voice.h
+++ b/hal/voice.h
@@ -97,5 +97,8 @@
void voice_set_sidetone(struct audio_device *adev,
snd_device_t out_snd_device,
bool enable);
+void voice_check_and_update_aanc_path(struct audio_device *adev,
+ snd_device_t out_snd_device,
+ bool enable);
bool voice_is_call_state_active(struct audio_device *adev);
#endif //VOICE_H
diff --git a/mm-audio/aenc-g711/Android.mk b/mm-audio/aenc-g711/Android.mk
new file mode 100644
index 0000000..4aff5c6
--- /dev/null
+++ b/mm-audio/aenc-g711/Android.mk
@@ -0,0 +1,7 @@
+ifneq ($(filter arm aarch64 arm64, $(TARGET_ARCH)),)
+
+AENC_G7111_PATH:= $(call my-dir)
+
+include $(AENC_G7111_PATH)/qdsp6/Android.mk
+
+endif
diff --git a/mm-audio/aenc-g711/Makefile b/mm-audio/aenc-g711/Makefile
new file mode 100644
index 0000000..83d822b
--- /dev/null
+++ b/mm-audio/aenc-g711/Makefile
@@ -0,0 +1,6 @@
+all:
+ @echo "invoking omxaudio make"
+ $(MAKE) -C qdsp6
+
+install:
+ $(MAKE) -C qdsp6 install
diff --git a/mm-audio/aenc-g711/qdsp6/Android.mk b/mm-audio/aenc-g711/qdsp6/Android.mk
new file mode 100644
index 0000000..fd071eb
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/Android.mk
@@ -0,0 +1,72 @@
+ifneq ($(BUILD_TINY_ANDROID),true)
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# ---------------------------------------------------------------------------------
+# Common definitons
+# ---------------------------------------------------------------------------------
+
+libOmxG711Enc-def := -g -O3
+libOmxG711Enc-def += -DQC_MODIFIED
+libOmxG711Enc-def += -D_ANDROID_
+libOmxG711Enc-def += -D_ENABLE_QC_MSG_LOG_
+libOmxG711Enc-def += -DVERBOSE
+libOmxG711Enc-def += -D_DEBUG
+libOmxG711Enc-def += -Wconversion
+libOmxG711Enc-def += -DAUDIOV2
+
+# ---------------------------------------------------------------------------------
+# Make the Shared library (libOmxG711Enc)
+# ---------------------------------------------------------------------------------
+
+include $(CLEAR_VARS)
+
+libOmxG711Enc-inc := $(LOCAL_PATH)/inc
+libOmxG711Enc-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore
+
+LOCAL_MODULE := libOmxG711Enc
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := $(libOmxG711Enc-def)
+LOCAL_C_INCLUDES := $(libOmxG711Enc-inc)
+LOCAL_PRELINK_MODULE := false
+LOCAL_SHARED_LIBRARIES := libutils liblog libcutils
+
+LOCAL_SRC_FILES := src/aenc_svr.c
+LOCAL_SRC_FILES += src/omx_g711_aenc.cpp
+LOCAL_SRC_FILES += src/omx_log.cpp
+
+LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
+LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
+
+
+include $(BUILD_SHARED_LIBRARY)
+
+
+# ---------------------------------------------------------------------------------
+# Make the apps-test (mm-aenc-omxg711-test)
+# ---------------------------------------------------------------------------------
+
+include $(CLEAR_VARS)
+
+mm-g711-enc-test-inc := $(LOCAL_PATH)/inc
+mm-g711-enc-test-inc += $(LOCAL_PATH)/test
+mm-g711-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore
+
+LOCAL_MODULE := mm-aenc-omxg711-test
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := $(libOmxG711Enc-def)
+LOCAL_C_INCLUDES := $(mm-g711-enc-test-inc)
+LOCAL_PRELINK_MODULE := false
+LOCAL_SHARED_LIBRARIES := libmm-omxcore
+LOCAL_SHARED_LIBRARIES += libOmxG711Enc
+LOCAL_SRC_FILES := test/omx_g711_enc_test.c
+
+include $(BUILD_EXECUTABLE)
+
+endif
+
+# ---------------------------------------------------------------------------------
+# END
+# ---------------------------------------------------------------------------------
+
diff --git a/mm-audio/aenc-g711/qdsp6/Makefile b/mm-audio/aenc-g711/qdsp6/Makefile
new file mode 100644
index 0000000..80dd4e5
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/Makefile
@@ -0,0 +1,81 @@
+# ---------------------------------------------------------------------------------
+# MM-AUDIO-OSS-8K-AENC-G7111
+# ---------------------------------------------------------------------------------
+
+# cross-compiler flags
+CFLAGS += -Wall
+CFLAGS += -Wundef
+CFLAGS += -Wstrict-prototypes
+CFLAGS += -Wno-trigraphs
+
+# cross-compile flags specific to shared objects
+CFLAGS_SO += -fpic
+
+# required pre-processor flags
+CPPFLAGS := -D__packed__=
+CPPFLAGS += -DIMAGE_APPS_PROC
+CPPFLAGS += -DFEATURE_Q_SINGLE_LINK
+CPPFLAGS += -DFEATURE_Q_NO_SELF_QPTR
+CPPFLAGS += -DFEATURE_LINUX
+CPPFLAGS += -DFEATURE_NATIVELINUX
+CPPFLAGS += -DFEATURE_DSM_DUP_ITEMS
+
+CPPFLAGS += -g
+CPPFALGS += -D_DEBUG
+CPPFLAGS += -Iinc
+
+# linker flags
+LDFLAGS += -L$(SYSROOT)/usr/lib
+
+# linker flags for shared objects
+LDFLAGS_SO := -shared
+
+# defintions
+LIBMAJOR := $(basename $(basename $(LIBVER)))
+LIBINSTALLDIR := $(DESTDIR)usr/lib
+INCINSTALLDIR := $(DESTDIR)usr/include
+BININSTALLDIR := $(DESTDIR)usr/bin
+
+# ---------------------------------------------------------------------------------
+# BUILD
+# ---------------------------------------------------------------------------------
+all: libOmxG711Enc.so.$(LIBVER) mm-aenc-omxg711-test
+
+install:
+ echo "intalling aenc-g711 in $(DESTDIR)"
+ if [ ! -d $(LIBINSTALLDIR) ]; then mkdir -p $(LIBINSTALLDIR); fi
+ if [ ! -d $(INCINSTALLDIR) ]; then mkdir -p $(INCINSTALLDIR); fi
+ if [ ! -d $(BININSTALLDIR) ]; then mkdir -p $(BININSTALLDIR); fi
+ install -m 555 libOmxG711Enc.so.$(LIBVER) $(LIBINSTALLDIR)
+ cd $(LIBINSTALLDIR) && ln -s libOmxG711Enc.so.$(LIBVER) libOmxG711Enc.so.$(LIBMAJOR)
+ cd $(LIBINSTALLDIR) && ln -s libOmxG711Enc.so.$(LIBMAJOR) libOmxG711Enc.so
+ install -m 555 mm-aenc-omxg711-test $(BININSTALLDIR)
+
+# ---------------------------------------------------------------------------------
+# COMPILE LIBRARY
+# ---------------------------------------------------------------------------------
+LDLIBS := -lpthread
+LDLIBS += -lstdc++
+LDLIBS += -lOmxCore
+
+SRCS := src/omx_g711_aenc.cpp
+SRCS += src/aenc_svr.c
+
+libOmxG711Enc.so.$(LIBVER): $(SRCS)
+ $(CC) $(CPPFLAGS) $(CFLAGS_SO) $(LDFLAGS_SO) -Wl,-soname,libOmxG711Enc.so.$(LIBMAJOR) -o $@ $^ $(LDFLAGS) $(LDLIBS)
+
+# ---------------------------------------------------------------------------------
+# COMPILE TEST APP
+# ---------------------------------------------------------------------------------
+TEST_LDLIBS := -lpthread
+TEST_LDLIBS += -ldl
+TEST_LDLIBS += -lOmxCore
+
+#TEST_SRCS := test/omx_g711_enc_test.c
+
+mm-aenc-omxg711-test: libOmxG711Enc.so.$(LIBVER) $(TEST_SRCS)
+ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(TEST_LDLIBS)
+
+# ---------------------------------------------------------------------------------
+# END
+# ---------------------------------------------------------------------------------
diff --git a/mm-audio/aenc-g711/qdsp6/inc/Map.h b/mm-audio/aenc-g711/qdsp6/inc/Map.h
new file mode 100644
index 0000000..22d3634
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/inc/Map.h
@@ -0,0 +1,245 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010 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.
+--------------------------------------------------------------------------*/
+#ifndef _MAP_H_
+#define _MAP_H_
+
+#include <stdio.h>
+using namespace std;
+
+template <typename T,typename T2>
+class Map
+{
+ struct node
+ {
+ T data;
+ T2 data2;
+ node* prev;
+ node* next;
+ node(T t, T2 t2,node* p, node* n) :
+ data(t), data2(t2), prev(p), next(n) {}
+ };
+ node* head;
+ node* tail;
+ node* tmp;
+ unsigned size_of_list;
+ static Map<T,T2> *m_self;
+public:
+ Map() : head( NULL ), tail ( NULL ),tmp(head),size_of_list(0) {}
+ bool empty() const { return ( !head || !tail ); }
+ operator bool() const { return !empty(); }
+ void insert(T,T2);
+ void show();
+ int size();
+ T2 find(T); // Return VALUE
+ T find_ele(T);// Check if the KEY is present or not
+ T2 begin(); //give the first ele
+ bool erase(T);
+ bool eraseall();
+ bool isempty();
+ ~Map()
+ {
+ while(head)
+ {
+ node* temp(head);
+ head=head->next;
+ size_of_list--;
+ delete temp;
+ }
+ }
+};
+
+template <typename T,typename T2>
+T2 Map<T,T2>::find(T d1)
+{
+ tmp = head;
+ while(tmp)
+ {
+ if(tmp->data == d1)
+ {
+ return tmp->data2;
+ }
+ tmp = tmp->next;
+ }
+ return 0;
+}
+
+template <typename T,typename T2>
+T Map<T,T2>::find_ele(T d1)
+{
+ tmp = head;
+ while(tmp)
+ {
+ if(tmp->data == d1)
+ {
+ return tmp->data;
+ }
+ tmp = tmp->next;
+ }
+ return 0;
+}
+
+template <typename T,typename T2>
+T2 Map<T,T2>::begin()
+{
+ tmp = head;
+ if(tmp)
+ {
+ return (tmp->data2);
+ }
+ return 0;
+}
+
+template <typename T,typename T2>
+void Map<T,T2>::show()
+{
+ tmp = head;
+ while(tmp)
+ {
+ printf("%d-->%d\n",tmp->data,tmp->data2);
+ tmp = tmp->next;
+ }
+}
+
+template <typename T,typename T2>
+int Map<T,T2>::size()
+{
+ int count =0;
+ tmp = head;
+ while(tmp)
+ {
+ tmp = tmp->next;
+ count++;
+ }
+ return count;
+}
+
+template <typename T,typename T2>
+void Map<T,T2>::insert(T data, T2 data2)
+{
+ tail = new node(data, data2,tail, NULL);
+ if( tail->prev )
+ tail->prev->next = tail;
+
+ if( empty() )
+ {
+ head = tail;
+ tmp=head;
+ }
+ tmp = head;
+ size_of_list++;
+}
+
+template <typename T,typename T2>
+bool Map<T,T2>::erase(T d)
+{
+ bool found = false;
+ tmp = head;
+ node* prevnode = tmp;
+ node *tempnode;
+
+ while(tmp)
+ {
+ if((head == tail) && (head->data == d))
+ {
+ found = true;
+ tempnode = head;
+ head = tail = NULL;
+ delete tempnode;
+ break;
+ }
+ if((tmp ==head) && (tmp->data ==d))
+ {
+ found = true;
+ tempnode = tmp;
+ tmp = tmp->next;
+ tmp->prev = NULL;
+ head = tmp;
+ tempnode->next = NULL;
+ delete tempnode;
+ break;
+ }
+ if((tmp == tail) && (tmp->data ==d))
+ {
+ found = true;
+ tempnode = tmp;
+ prevnode->next = NULL;
+ tmp->prev = NULL;
+ tail = prevnode;
+ delete tempnode;
+ break;
+ }
+ if(tmp->data == d)
+ {
+ found = true;
+ prevnode->next = tmp->next;
+ tmp->next->prev = prevnode->next;
+ tempnode = tmp;
+ //tmp = tmp->next;
+ delete tempnode;
+ break;
+ }
+ prevnode = tmp;
+ tmp = tmp->next;
+ }
+ if(found)size_of_list--;
+ return found;
+}
+
+template <typename T,typename T2>
+bool Map<T,T2>::eraseall()
+{
+ // Be careful while using this method
+ // it not only removes the node but FREES(not delete) the allocated
+ // memory.
+ node *tempnode;
+ tmp = head;
+ while(head)
+ {
+ tempnode = head;
+ head = head->next;
+ tempnode->next = NULL;
+ if(tempnode->data)
+ free(tempnode->data);
+ if(tempnode->data2)
+ free(tempnode->data2);
+ delete tempnode;
+ }
+ tail = head = NULL;
+ return true;
+}
+
+
+template <typename T,typename T2>
+bool Map<T,T2>::isempty()
+{
+ if(!size_of_list) return true;
+ else return false;
+}
+
+#endif // _MAP_H_
diff --git a/mm-audio/aenc-g711/qdsp6/inc/aenc_svr.h b/mm-audio/aenc-g711/qdsp6/inc/aenc_svr.h
new file mode 100644
index 0000000..24132e1
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/inc/aenc_svr.h
@@ -0,0 +1,121 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010, 2016, 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.
+--------------------------------------------------------------------------*/
+#ifndef AENC_SVR_H
+#define AENC_SVR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <pthread.h>
+#include <sched.h>
+#include <utils/Log.h>
+
+#ifdef _ANDROID_
+#define LOG_TAG "QC_G711ENC"
+#endif
+
+#ifndef LOGE
+#define LOGE ALOGE
+#endif
+
+#ifndef LOGW
+#define LOGW ALOGW
+#endif
+
+#ifndef LOGD
+#define LOGD ALOGD
+#endif
+
+#ifndef LOGV
+#define LOGV ALOGV
+#endif
+
+#ifndef LOGI
+#define LOGI ALOGI
+#endif
+
+#define DEBUG_PRINT_ERROR LOGE
+#define DEBUG_PRINT LOGI
+#define DEBUG_DETAIL LOGV
+
+typedef void (*message_func)(void* client_data, unsigned char id);
+
+/**
+ @brief audio encoder ipc info structure
+
+ */
+struct g711_ipc_info
+{
+ pthread_t thr;
+ int pipe_in;
+ int pipe_out;
+ int dead;
+ message_func process_msg_cb;
+ void *client_data;
+ char thread_name[128];
+};
+
+/**
+ @brief This function starts command server
+
+ @param cb pointer to callback function from the client
+ @param client_data reference client wants to get back
+ through callback
+ @return handle to command server
+ */
+struct g711_ipc_info *omx_g711_thread_create(message_func cb,
+ void* client_data,
+ char *th_name);
+
+struct g711_ipc_info *omx_g711_event_thread_create(message_func cb,
+ void* client_data,
+ char *th_name);
+/**
+ @brief This function stop command server
+
+ @param svr handle to command server
+ @return none
+ */
+void omx_g711_thread_stop(struct g711_ipc_info *g711_ipc);
+
+
+/**
+ @brief This function post message in the command server
+
+ @param svr handle to command server
+ @return none
+ */
+void omx_g711_post_msg(struct g711_ipc_info *g711_ipc,
+ unsigned char id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AENC_SVR */
diff --git a/mm-audio/aenc-g711/qdsp6/inc/omx_g711_aenc.h b/mm-audio/aenc-g711/qdsp6/inc/omx_g711_aenc.h
new file mode 100644
index 0000000..9f91299
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/inc/omx_g711_aenc.h
@@ -0,0 +1,539 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010, 2014, 2016 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.
+--------------------------------------------------------------------------*/
+#ifndef _G711_ENC_H_
+#define _G711_ENC_H_
+/*============================================================================
+ Audio Encoder
+
+@file omx_g711_aenc.h
+This module contains the class definition for openMAX encoder component.
+
+
+
+============================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+
+/* Uncomment out below line #define LOG_NDEBUG 0 if we want to see
+ * all DEBUG_PRINT or LOGV messaging */
+#include<stdlib.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <time.h>
+#include <inttypes.h>
+#include <unistd.h>
+#include "QOMX_AudioExtensions.h"
+#include "QOMX_AudioIndexExtensions.h"
+#include "OMX_Core.h"
+#include "OMX_Audio.h"
+#include "aenc_svr.h"
+#include "qc_omx_component.h"
+#include "Map.h"
+#include <semaphore.h>
+#include <linux/msm_audio.h>
+#include <linux/msm_audio_g711.h>
+extern "C" {
+ void * get_omx_component_factory_fn(void);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Module specific globals
+//////////////////////////////////////////////////////////////////////////////
+
+
+
+#define OMX_SPEC_VERSION 0x00000101
+#define MIN(x,y) (((x) < (y)) ? (x) : (y))
+#define MAX(x,y) (x >= y?x:y)
+
+//////////////////////////////////////////////////////////////////////////////
+// Macros
+//////////////////////////////////////////////////////////////////////////////
+//
+
+
+#define PrintFrameHdr(i,bufHdr) \
+ DEBUG_PRINT("i=%d OMX bufHdr[%p]buf[%p]size[%d]TS[%lld]nFlags[0x%x]\n",\
+ i,\
+ bufHdr, \
+ ((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer, \
+ (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
+ ((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp, \
+ (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFlags)
+
+
+// BitMask Management logic
+#define BITS_PER_BYTE 8
+#define BITMASK_SIZE(mIndex) \
+ (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
+#define BITMASK_OFFSET(mIndex)\
+ ((mIndex)/BITS_PER_BYTE)
+#define BITMASK_FLAG(mIndex) \
+ (1 << ((mIndex) % BITS_PER_BYTE))
+#define BITMASK_CLEAR(mArray,mIndex)\
+ (mArray)[BITMASK_OFFSET(mIndex)] &= ~(BITMASK_FLAG(mIndex))
+#define BITMASK_SET(mArray,mIndex)\
+ (mArray)[BITMASK_OFFSET(mIndex)] |= BITMASK_FLAG(mIndex)
+#define BITMASK_PRESENT(mArray,mIndex)\
+ ((mArray)[BITMASK_OFFSET(mIndex)] & BITMASK_FLAG(mIndex))
+#define BITMASK_ABSENT(mArray,mIndex)\
+ (((mArray)[BITMASK_OFFSET(mIndex)] & \
+ BITMASK_FLAG(mIndex)) == 0x0)
+
+#define OMX_CORE_NUM_INPUT_BUFFERS 4
+#define OMX_CORE_NUM_OUTPUT_BUFFERS 8
+
+#define OMX_CORE_INPUT_BUFFER_SIZE 4096 // Multiple of 160
+#define OMX_CORE_CONTROL_CMDQ_SIZE 100
+#define OMX_AENC_VOLUME_STEP 0x147
+#define OMX_AENC_MIN 0
+#define OMX_AENC_MAX 100
+#define NON_TUNNEL 1
+#define TUNNEL 0
+#define IP_PORT_BITMASK 0x02
+#define OP_PORT_BITMASK 0x01
+#define IP_OP_PORT_BITMASK 0x03
+
+#define OMX_G711_DEFAULT_SF 8000
+#define OMX_G711_DEFAULT_CH_CFG 1
+#define OMX_G711_DEFAULT_VOL 25
+// 14 bytes for input meta data
+#define OMX_AENC_SIZEOF_META_BUF (OMX_CORE_INPUT_BUFFER_SIZE+14)
+
+#define TRUE 1
+#define FALSE 0
+
+#define NUMOFFRAMES 1
+#define MAXFRAMELENGTH 360
+#define OMX_G711_OUTPUT_BUFFER_SIZE ((NUMOFFRAMES * (sizeof(ENC_META_OUT) + MAXFRAMELENGTH) \
+ + 1))
+
+
+class omx_g711_aenc;
+
+// OMX mo3 audio encoder class
+class omx_g711_aenc: public qc_omx_component
+{
+public:
+ omx_g711_aenc(); // constructor
+ virtual ~omx_g711_aenc(); // destructor
+
+ OMX_ERRORTYPE allocate_buffer(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_U32 port,
+ OMX_PTR appData,
+ OMX_U32 bytes);
+
+
+ OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
+
+ OMX_ERRORTYPE component_init(OMX_STRING role);
+
+ OMX_ERRORTYPE component_role_enum(OMX_HANDLETYPE hComp,
+ OMX_U8 *role,
+ OMX_U32 index);
+
+ OMX_ERRORTYPE component_tunnel_request(OMX_HANDLETYPE hComp,
+ OMX_U32 port,
+ OMX_HANDLETYPE peerComponent,
+ OMX_U32 peerPort,
+ OMX_TUNNELSETUPTYPE *tunnelSetup);
+
+ OMX_ERRORTYPE empty_this_buffer(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE *buffer);
+
+
+ OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE *buffer);
+
+
+ OMX_ERRORTYPE fill_this_buffer(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE *buffer);
+
+
+ OMX_ERRORTYPE free_buffer(OMX_HANDLETYPE hComp,
+ OMX_U32 port,
+ OMX_BUFFERHEADERTYPE *buffer);
+
+ OMX_ERRORTYPE get_component_version(OMX_HANDLETYPE hComp,
+ OMX_STRING componentName,
+ OMX_VERSIONTYPE *componentVersion,
+ OMX_VERSIONTYPE * specVersion,
+ OMX_UUIDTYPE *componentUUID);
+
+ OMX_ERRORTYPE get_config(OMX_HANDLETYPE hComp,
+ OMX_INDEXTYPE configIndex,
+ OMX_PTR configData);
+
+ OMX_ERRORTYPE get_extension_index(OMX_HANDLETYPE hComp,
+ OMX_STRING paramName,
+ OMX_INDEXTYPE *indexType);
+
+ OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
+ OMX_INDEXTYPE paramIndex,
+ OMX_PTR paramData);
+
+ OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
+ OMX_STATETYPE *state);
+
+ static void process_in_port_msg(void *client_data,
+ unsigned char id);
+
+ static void process_out_port_msg(void *client_data,
+ unsigned char id);
+
+ static void process_command_msg(void *client_data,
+ unsigned char id);
+
+ static void process_event_cb(void *client_data,
+ unsigned char id);
+
+
+ OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp,
+ OMX_CALLBACKTYPE *callbacks,
+ OMX_PTR appData);
+
+ OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
+ OMX_INDEXTYPE configIndex,
+ OMX_PTR configData);
+
+ OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
+ OMX_INDEXTYPE paramIndex,
+ OMX_PTR paramData);
+
+ OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_U32 port,
+ OMX_PTR appData,
+ OMX_U32 bytes,
+ OMX_U8 *buffer);
+
+ OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_U32 port,
+ OMX_PTR appData,
+ void * eglImage);
+
+ bool post_command(unsigned int p1, unsigned int p2,
+ unsigned char id);
+
+ // Deferred callback identifiers
+ enum
+ {
+ //Event Callbacks from the component thread context
+ OMX_COMPONENT_GENERATE_EVENT = 0x1,
+ //Buffer Done callbacks from component thread context
+ OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
+ OMX_COMPONENT_GENERATE_ETB = 0x3,
+ //Command
+ OMX_COMPONENT_GENERATE_COMMAND = 0x4,
+ OMX_COMPONENT_GENERATE_FRAME_DONE = 0x05,
+ OMX_COMPONENT_GENERATE_FTB = 0x06,
+ OMX_COMPONENT_GENERATE_EOS = 0x07,
+ OMX_COMPONENT_PORTSETTINGS_CHANGED = 0x08,
+ OMX_COMPONENT_SUSPEND = 0x09,
+ OMX_COMPONENT_RESUME = 0x0a
+ };
+private:
+
+ ///////////////////////////////////////////////////////////
+ // Type definitions
+ ///////////////////////////////////////////////////////////
+ // Bit Positions
+ enum flags_bit_positions
+ {
+ // Defer transition to IDLE
+ OMX_COMPONENT_IDLE_PENDING =0x1,
+ // Defer transition to LOADING
+ OMX_COMPONENT_LOADING_PENDING =0x2,
+
+ OMX_COMPONENT_MUTED =0x3,
+
+ // Defer transition to Enable
+ OMX_COMPONENT_INPUT_ENABLE_PENDING =0x4,
+ // Defer transition to Enable
+ OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x5,
+ // Defer transition to Disable
+ OMX_COMPONENT_INPUT_DISABLE_PENDING =0x6,
+ // Defer transition to Disable
+ OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x7
+ };
+
+
+ typedef Map<OMX_BUFFERHEADERTYPE*, OMX_BUFFERHEADERTYPE*>
+ input_buffer_map;
+
+ typedef Map<OMX_BUFFERHEADERTYPE*, OMX_BUFFERHEADERTYPE*>
+ output_buffer_map;
+
+ enum port_indexes
+ {
+ OMX_CORE_INPUT_PORT_INDEX =0,
+ OMX_CORE_OUTPUT_PORT_INDEX =1
+ };
+
+ struct omx_event
+ {
+ unsigned long param1;
+ unsigned long param2;
+ unsigned char id;
+ };
+
+ struct omx_cmd_queue
+ {
+ omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
+ unsigned m_read;
+ unsigned m_write;
+ unsigned m_size;
+
+ omx_cmd_queue();
+ ~omx_cmd_queue();
+ bool insert_entry(unsigned long p1, unsigned long p2, unsigned char id);
+ bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned char *id);
+ bool get_msg_id(unsigned char *id);
+ bool get_msg_with_id(unsigned *p1,unsigned *p2, unsigned id);
+ };
+
+ typedef struct TIMESTAMP
+ {
+ unsigned int LowPart;
+ unsigned int HighPart;
+ }__attribute__((packed)) TIMESTAMP;
+
+ typedef struct metadata_input
+ {
+ unsigned short offsetVal;
+ TIMESTAMP nTimeStamp;
+ unsigned int nFlags;
+ }__attribute__((packed)) META_IN;
+
+ typedef struct enc_meta_out
+ {
+ unsigned int offset_to_frame;
+ unsigned int frame_size;
+ unsigned int encoded_pcm_samples;
+ unsigned int lsw_ts;
+ unsigned int msw_ts;
+ unsigned int nflags;
+ } __attribute__ ((packed))ENC_META_OUT;
+
+ typedef struct
+ {
+ OMX_U32 tot_in_buf_len;
+ OMX_U32 tot_out_buf_len;
+ OMX_TICKS tot_pb_time;
+ OMX_U32 fbd_cnt;
+ OMX_U32 ftb_cnt;
+ OMX_U32 etb_cnt;
+ OMX_U32 ebd_cnt;
+ }G711_PB_STATS;
+
+ ///////////////////////////////////////////////////////////
+ // Member variables
+ ///////////////////////////////////////////////////////////
+ OMX_U8 *m_tmp_meta_buf;
+ OMX_U8 *m_tmp_out_meta_buf;
+ OMX_U8 m_flush_cnt ;
+ OMX_U8 m_comp_deinit;
+
+ // the below var doesnt hold good if combo of use and alloc bufs are used
+ OMX_S32 m_volume;//Unit to be determined
+ OMX_PTR m_app_data;// Application data
+ int nNumInputBuf;
+ int nNumOutputBuf;
+ int m_drv_fd; // Kernel device node file handle
+ bool bFlushinprogress;
+ bool is_in_th_sleep;
+ bool is_out_th_sleep;
+ unsigned int m_flags; //encapsulate the waiting states.
+ OMX_TICKS nTimestamp;
+ unsigned int pcm_input; //tunnel or non-tunnel
+ unsigned int m_inp_act_buf_count; // Num of Input Buffers
+ unsigned int m_out_act_buf_count; // Numb of Output Buffers
+ unsigned int m_inp_current_buf_count; // Num of Input Buffers
+ unsigned int m_out_current_buf_count; // Numb of Output Buffers
+ unsigned int output_buffer_size;
+ unsigned int input_buffer_size;
+ unsigned short m_session_id;
+ bool is_mlaw;
+ // store I/P PORT state
+ OMX_BOOL m_inp_bEnabled;
+ // store O/P PORT state
+ OMX_BOOL m_out_bEnabled;
+ //Input port Populated
+ OMX_BOOL m_inp_bPopulated;
+ //Output port Populated
+ OMX_BOOL m_out_bPopulated;
+ sem_t sem_States;
+ sem_t sem_read_msg;
+ sem_t sem_write_msg;
+
+ volatile int m_is_event_done;
+ volatile int m_is_in_th_sleep;
+ volatile int m_is_out_th_sleep;
+ input_buffer_map m_input_buf_hdrs;
+ output_buffer_map m_output_buf_hdrs;
+ omx_cmd_queue m_input_q;
+ omx_cmd_queue m_input_ctrl_cmd_q;
+ omx_cmd_queue m_input_ctrl_ebd_q;
+ omx_cmd_queue m_command_q;
+ omx_cmd_queue m_output_q;
+ omx_cmd_queue m_output_ctrl_cmd_q;
+ omx_cmd_queue m_output_ctrl_fbd_q;
+ pthread_mutexattr_t m_outputlock_attr;
+ pthread_mutexattr_t m_commandlock_attr;
+ pthread_mutexattr_t m_lock_attr;
+ pthread_mutexattr_t m_state_attr;
+ pthread_mutexattr_t m_flush_attr;
+ pthread_mutexattr_t m_in_th_attr_1;
+ pthread_mutexattr_t m_out_th_attr_1;
+ pthread_mutexattr_t m_event_attr;
+ pthread_mutexattr_t m_in_th_attr;
+ pthread_mutexattr_t m_out_th_attr;
+ pthread_mutexattr_t out_buf_count_lock_attr;
+ pthread_mutexattr_t in_buf_count_lock_attr;
+ pthread_cond_t cond;
+ pthread_cond_t in_cond;
+ pthread_cond_t out_cond;
+ pthread_mutex_t m_lock;
+ pthread_mutex_t m_commandlock;
+ pthread_mutex_t m_outputlock;
+ // Mutexes for state change
+ pthread_mutex_t m_state_lock;
+ // Mutexes for flush acks from input and output threads
+ pthread_mutex_t m_flush_lock;
+ pthread_mutex_t m_event_lock;
+ pthread_mutex_t m_in_th_lock;
+ pthread_mutex_t m_out_th_lock;
+ pthread_mutex_t m_in_th_lock_1;
+ pthread_mutex_t m_out_th_lock_1;
+ pthread_mutex_t out_buf_count_lock;
+ pthread_mutex_t in_buf_count_lock;
+
+ OMX_STATETYPE m_state; // OMX State
+ OMX_STATETYPE nState;
+ OMX_CALLBACKTYPE m_cb; // Application callbacks
+ G711_PB_STATS m_g711_pb_stats;
+ struct g711_ipc_info *m_ipc_to_in_th; // for input thread
+ struct g711_ipc_info *m_ipc_to_out_th; // for output thread
+ struct g711_ipc_info *m_ipc_to_cmd_th; // for command thread
+ struct g711_ipc_info *m_ipc_to_event_th; //for txco event thread
+ OMX_PRIORITYMGMTTYPE m_priority_mgm ;
+ OMX_AUDIO_PARAM_PCMMODETYPE m_g711_param; // Cache G711 encoder parameter
+ OMX_AUDIO_PARAM_PCMMODETYPE m_pcm_param; // Cache pcm parameter
+ OMX_PARAM_COMPONENTROLETYPE component_Role;
+ OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
+
+ ///////////////////////////////////////////////////////////
+ // Private methods
+ ///////////////////////////////////////////////////////////
+ OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_U32 port,OMX_PTR appData,
+ OMX_U32 bytes);
+
+ OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE **bufferHdr,
+ OMX_U32 port,
+ OMX_PTR appData,
+ OMX_U32 bytes);
+
+ OMX_ERRORTYPE use_input_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE **bufHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer);
+
+ OMX_ERRORTYPE use_output_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE **bufHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer);
+
+ OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE *buffer);
+
+ OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp,
+ OMX_COMMANDTYPE cmd,
+ OMX_U32 param1,
+ OMX_PTR cmdData);
+
+ OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp,
+ OMX_COMMANDTYPE cmd,
+ OMX_U32 param1,
+ OMX_PTR cmdData);
+
+ bool allocate_done(void);
+
+ bool release_done(OMX_U32 param1);
+
+ bool execute_omx_flush(OMX_IN OMX_U32 param1, bool cmd_cmpl=true);
+
+ bool execute_input_omx_flush(void);
+
+ bool execute_output_omx_flush(void);
+
+ bool search_input_bufhdr(OMX_BUFFERHEADERTYPE *buffer);
+
+ bool search_output_bufhdr(OMX_BUFFERHEADERTYPE *buffer);
+
+ bool post_input(unsigned long p1, unsigned long p2,
+ unsigned char id);
+
+ bool post_output(unsigned long p1, unsigned long p2,
+ unsigned char id);
+
+ void process_events(omx_g711_aenc *client_data);
+
+ void buffer_done_cb(OMX_BUFFERHEADERTYPE *bufHdr);
+
+ void frame_done_cb(OMX_BUFFERHEADERTYPE *bufHdr);
+
+ void wait_for_event();
+
+ void event_complete();
+
+ void in_th_goto_sleep();
+
+ void in_th_wakeup();
+
+ void out_th_goto_sleep();
+
+ void out_th_wakeup();
+
+ void flush_ack();
+ void deinit_encoder();
+
+};
+#endif
diff --git a/mm-audio/aenc-g711/qdsp6/inc/omx_log.h b/mm-audio/aenc-g711/qdsp6/inc/omx_log.h
new file mode 100644
index 0000000..0080ccc
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/inc/omx_log.h
@@ -0,0 +1,61 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2016, 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.
+--------------------------------------------------------------------------*/
+
+#ifndef OMX_LOGS_H
+#define OMX_LOGS_H
+
+#include <inttypes.h>
+
+using namespace std;
+
+/*
+ * Change logging-level at runtime with "persist.debug.omx.logs.level"
+ *
+ * level OMX_LOGV OMX_LOGD
+ * ----------------------------------
+ * 0 silent silent
+ * 1 silent printed
+ * 2 printed printed
+ *
+ * AVLOGI/W/E are printed always
+ */
+
+extern uint32_t gOmxLogLevel;
+
+#define OMX_LOGV(format, args...) ALOGD_IF((gOmxLogLevel > 1), format, ##args)
+#define OMX_LOGD(format, args...) ALOGD_IF((gOmxLogLevel > 0), format, ##args)
+#define OMX_LOGI(format, args...) ALOGI(format, ##args)
+#define OMX_LOGW(format, args...) ALOGW(format, ##args)
+#define OMX_LOGE(format, args...) ALOGE(format, ##args)
+
+void updateLogLevel();
+
+
+#endif // OMX_LOGS_H
+
diff --git a/mm-audio/aenc-g711/qdsp6/src/aenc_svr.c b/mm-audio/aenc-g711/qdsp6/src/aenc_svr.c
new file mode 100644
index 0000000..fa44632
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/src/aenc_svr.c
@@ -0,0 +1,206 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010, 2016 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.
+--------------------------------------------------------------------------*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>
+#include <errno.h>
+
+#include <aenc_svr.h>
+
+/**
+ @brief This function processes posted messages
+
+ Once thread is being spawned, this function is run to
+ start processing commands posted by client
+
+ @param info pointer to context
+
+ */
+void *omx_g711_msg(void *info)
+{
+ struct g711_ipc_info *g711_info = (struct g711_ipc_info*)info;
+ unsigned char id;
+ ssize_t n;
+
+ DEBUG_DETAIL("\n%s: message thread start\n", __FUNCTION__);
+ while (!g711_info->dead)
+ {
+ n = read(g711_info->pipe_in, &id, 1);
+ if (0 == n) break;
+ if (1 == n)
+ {
+ DEBUG_DETAIL("\n%s-->pipe_in=%d pipe_out=%d\n",
+ g711_info->thread_name,
+ g711_info->pipe_in,
+ g711_info->pipe_out);
+
+ g711_info->process_msg_cb(g711_info->client_data, id);
+ }
+ if ((n < 0) && (errno != EINTR)) break;
+ }
+ DEBUG_DETAIL("%s: message thread stop\n", __FUNCTION__);
+
+ return 0;
+}
+
+void *omx_g711_events(void *info)
+{
+ struct g711_ipc_info *g711_info = (struct g711_ipc_info*)info;
+ unsigned char id = 0;
+
+ DEBUG_DETAIL("%s: message thread start\n", g711_info->thread_name);
+ g711_info->process_msg_cb(g711_info->client_data, id);
+ DEBUG_DETAIL("%s: message thread stop\n", g711_info->thread_name);
+ return 0;
+}
+
+/**
+ @brief This function starts command server
+
+ @param cb pointer to callback function from the client
+ @param client_data reference client wants to get back
+ through callback
+ @return handle to msging thread
+ */
+struct g711_ipc_info *omx_g711_thread_create(
+ message_func cb,
+ void* client_data,
+ char* th_name)
+{
+ int r;
+ int fds[2];
+ struct g711_ipc_info *g711_info;
+
+ g711_info = calloc(1, sizeof(struct g711_ipc_info));
+ if (!g711_info)
+ {
+ return 0;
+ }
+
+ g711_info->client_data = client_data;
+ g711_info->process_msg_cb = cb;
+ strlcpy(g711_info->thread_name, th_name, sizeof(g711_info->thread_name));
+
+ if (pipe(fds))
+ {
+ DEBUG_PRINT_ERROR("\n%s: pipe creation failed\n", __FUNCTION__);
+ goto fail_pipe;
+ }
+
+ g711_info->pipe_in = fds[0];
+ g711_info->pipe_out = fds[1];
+
+ r = pthread_create(&g711_info->thr, 0, omx_g711_msg, g711_info);
+ if (r < 0) goto fail_thread;
+
+ DEBUG_DETAIL("Created thread for %s \n", g711_info->thread_name);
+ return g711_info;
+
+
+fail_thread:
+ close(g711_info->pipe_in);
+ close(g711_info->pipe_out);
+
+fail_pipe:
+ free(g711_info);
+
+ return 0;
+}
+
+/**
+ * @brief This function starts command server
+ *
+ * @param cb pointer to callback function from the client
+ * @param client_data reference client wants to get back
+ * through callback
+ * @return handle to msging thread
+ * */
+struct g711_ipc_info *omx_g711_event_thread_create(
+ message_func cb,
+ void* client_data,
+ char* th_name)
+{
+ int r;
+ int fds[2];
+ struct g711_ipc_info *g711_info;
+
+ g711_info = calloc(1, sizeof(struct g711_ipc_info));
+ if (!g711_info)
+ {
+ return 0;
+ }
+
+ g711_info->client_data = client_data;
+ g711_info->process_msg_cb = cb;
+ strlcpy(g711_info->thread_name, th_name, sizeof(g711_info->thread_name));
+
+ if (pipe(fds))
+ {
+ DEBUG_PRINT("\n%s: pipe creation failed\n", __FUNCTION__);
+ goto fail_pipe;
+ }
+
+ g711_info->pipe_in = fds[0];
+ g711_info->pipe_out = fds[1];
+
+ r = pthread_create(&g711_info->thr, 0, omx_g711_events, g711_info);
+ if (r < 0) goto fail_thread;
+
+ DEBUG_DETAIL("Created thread for %s \n", g711_info->thread_name);
+ return g711_info;
+
+
+fail_thread:
+ close(g711_info->pipe_in);
+ close(g711_info->pipe_out);
+
+fail_pipe:
+ free(g711_info);
+
+ return 0;
+}
+
+void omx_g711_thread_stop(struct g711_ipc_info *g711_info) {
+ DEBUG_DETAIL("%s stop server\n", __FUNCTION__);
+ close(g711_info->pipe_in);
+ close(g711_info->pipe_out);
+ pthread_join(g711_info->thr,NULL);
+ g711_info->pipe_out = -1;
+ g711_info->pipe_in = -1;
+ DEBUG_DETAIL("%s: message thread close fds%d %d\n", g711_info->thread_name,
+ g711_info->pipe_in,g711_info->pipe_out);
+ free(g711_info);
+}
+
+void omx_g711_post_msg(struct g711_ipc_info *g711_info, unsigned char id) {
+ DEBUG_DETAIL("\n%s id=%d\n", __FUNCTION__,id);
+ write(g711_info->pipe_out, &id, 1);
+}
diff --git a/mm-audio/aenc-g711/qdsp6/src/omx_g711_aenc.cpp b/mm-audio/aenc-g711/qdsp6/src/omx_g711_aenc.cpp
new file mode 100644
index 0000000..23fe28a
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/src/omx_g711_aenc.cpp
@@ -0,0 +1,4572 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010, 2014, 2016 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.
+--------------------------------------------------------------------------*/
+/*============================================================================
+@file omx_aenc_g711.c
+ This module contains the implementation of the OpenMAX core & component.
+
+*//*========================================================================*/
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+
+
+#include<string.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include "omx_g711_aenc.h"
+#include "omx_log.h"
+#include <errno.h>
+
+using namespace std;
+#define SLEEP_MS 100
+
+// omx_cmd_queue destructor
+omx_g711_aenc::omx_cmd_queue::~omx_cmd_queue()
+{
+ // Nothing to do
+}
+
+// omx cmd queue constructor
+omx_g711_aenc::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0)
+{
+ memset(m_q, 0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE);
+}
+
+// omx cmd queue insert
+bool omx_g711_aenc::omx_cmd_queue::insert_entry(unsigned long p1,
+ unsigned long p2,
+ unsigned char id)
+{
+ bool ret = true;
+ if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE)
+ {
+ m_q[m_write].id = id;
+ m_q[m_write].param1 = p1;
+ m_q[m_write].param2 = p2;
+ m_write++;
+ m_size ++;
+ if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE)
+ {
+ m_write = 0;
+ }
+ } else
+ {
+ ret = false;
+ OMX_LOGE("ERROR!!! Command Queue Full");
+ }
+ return ret;
+}
+
+bool omx_g711_aenc::omx_cmd_queue::pop_entry(unsigned long *p1,
+ unsigned long *p2, unsigned char *id)
+{
+ bool ret = true;
+ if (m_size > 0)
+ {
+ *id = m_q[m_read].id;
+ *p1 = m_q[m_read].param1;
+ *p2 = m_q[m_read].param2;
+ // Move the read pointer ahead
+ ++m_read;
+ --m_size;
+ if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE)
+ {
+ m_read = 0;
+
+ }
+ } else
+ {
+ ret = false;
+ OMX_LOGE("ERROR Delete!!! Command Queue Empty");
+ }
+ return ret;
+}
+
+// factory function executed by the core to create instances
+void *get_omx_component_factory_fn(void)
+{
+ return(new omx_g711_aenc);
+}
+bool omx_g711_aenc::omx_cmd_queue::get_msg_id(unsigned char *id)
+{
+ if(m_size > 0)
+ {
+ *id = m_q[m_read].id;
+ OMX_LOGV("get_msg_id=%d\n",*id);
+ }
+ else{
+ return false;
+ }
+ return true;
+}
+/*=============================================================================
+FUNCTION:
+ wait_for_event
+
+DESCRIPTION:
+ waits for a particular event
+
+INPUT/OUTPUT PARAMETERS:
+ None
+
+RETURN VALUE:
+ None
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+void omx_g711_aenc::wait_for_event()
+{
+ int rc;
+ struct timespec ts;
+ pthread_mutex_lock(&m_event_lock);
+ while (0 == m_is_event_done)
+ {
+ clock_gettime(CLOCK_REALTIME, &ts);
+ ts.tv_sec += (SLEEP_MS/1000);
+ ts.tv_nsec += ((SLEEP_MS%1000) * 1000000);
+ rc = pthread_cond_timedwait(&cond, &m_event_lock, &ts);
+ if (rc == ETIMEDOUT && !m_is_event_done) {
+ OMX_LOGV("Timed out waiting for flush");
+ if (ioctl(m_drv_fd, AUDIO_FLUSH, 0) < 0)
+ {
+ OMX_LOGE("Flush:Input port, ioctl failed error: rc:%d, %s, no:%d \n",
+ rc, strerror(errno), errno);
+ if (m_cb.EventHandler)
+ m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError, OMX_ErrorInvalidState,
+ OMX_COMPONENT_GENERATE_EVENT, NULL);
+ break;
+ }
+ }
+ }
+ m_is_event_done = 0;
+ pthread_mutex_unlock(&m_event_lock);
+}
+
+/*=============================================================================
+FUNCTION:
+ event_complete
+
+DESCRIPTION:
+ informs about the occurance of an event
+
+INPUT/OUTPUT PARAMETERS:
+ None
+
+RETURN VALUE:
+ None
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+void omx_g711_aenc::event_complete()
+{
+ pthread_mutex_lock(&m_event_lock);
+ if (0 == m_is_event_done)
+ {
+ m_is_event_done = 1;
+ pthread_cond_signal(&cond);
+ }
+ pthread_mutex_unlock(&m_event_lock);
+}
+
+// All this non-sense because of a single g711 object
+void omx_g711_aenc::in_th_goto_sleep()
+{
+ pthread_mutex_lock(&m_in_th_lock);
+ while (0 == m_is_in_th_sleep)
+ {
+ pthread_cond_wait(&in_cond, &m_in_th_lock);
+ }
+ m_is_in_th_sleep = 0;
+ pthread_mutex_unlock(&m_in_th_lock);
+}
+
+void omx_g711_aenc::in_th_wakeup()
+{
+ pthread_mutex_lock(&m_in_th_lock);
+ if (0 == m_is_in_th_sleep)
+ {
+ m_is_in_th_sleep = 1;
+ pthread_cond_signal(&in_cond);
+ }
+ pthread_mutex_unlock(&m_in_th_lock);
+}
+
+void omx_g711_aenc::out_th_goto_sleep()
+{
+
+ pthread_mutex_lock(&m_out_th_lock);
+ while (0 == m_is_out_th_sleep)
+ {
+ pthread_cond_wait(&out_cond, &m_out_th_lock);
+ }
+ m_is_out_th_sleep = 0;
+ pthread_mutex_unlock(&m_out_th_lock);
+}
+
+void omx_g711_aenc::out_th_wakeup()
+{
+ pthread_mutex_lock(&m_out_th_lock);
+ if (0 == m_is_out_th_sleep)
+ {
+ m_is_out_th_sleep = 1;
+ pthread_cond_signal(&out_cond);
+ }
+ pthread_mutex_unlock(&m_out_th_lock);
+}
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::omx_g711_aenc
+
+DESCRIPTION
+ Constructor
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+omx_g711_aenc::omx_g711_aenc(): m_tmp_meta_buf(NULL),
+ m_tmp_out_meta_buf(NULL),
+ m_flush_cnt(255),
+ m_comp_deinit(0),
+ m_volume(25),
+ m_app_data(NULL),
+ nNumInputBuf(0),
+ nNumOutputBuf(0),
+ m_drv_fd(-1),
+ bFlushinprogress(0),
+ is_in_th_sleep(false),
+ is_out_th_sleep(false),
+ m_flags(0),
+ nTimestamp(0),
+ pcm_input(0),
+ m_inp_act_buf_count (OMX_CORE_NUM_INPUT_BUFFERS),
+ m_out_act_buf_count (OMX_CORE_NUM_OUTPUT_BUFFERS),
+ m_inp_current_buf_count(0),
+ m_out_current_buf_count(0),
+ output_buffer_size((OMX_U32)OMX_G711_OUTPUT_BUFFER_SIZE),
+ input_buffer_size(OMX_CORE_INPUT_BUFFER_SIZE),
+ m_session_id(0),
+ is_mlaw(false),
+ m_inp_bEnabled(OMX_TRUE),
+ m_out_bEnabled(OMX_TRUE),
+ m_inp_bPopulated(OMX_FALSE),
+ m_out_bPopulated(OMX_FALSE),
+ m_is_event_done(0),
+ m_state(OMX_StateInvalid),
+ m_ipc_to_in_th(NULL),
+ m_ipc_to_out_th(NULL),
+ m_ipc_to_cmd_th(NULL),
+ m_ipc_to_event_th(NULL)
+{
+ int cond_ret = 0;
+ component_Role.nSize = 0;
+ memset(&m_cmp, 0, sizeof(m_cmp));
+ memset(&m_cb, 0, sizeof(m_cb));
+ memset(&m_g711_pb_stats, 0, sizeof(m_g711_pb_stats));
+ memset(&m_g711_param, 0, sizeof(m_g711_param));
+ memset(&m_pcm_param, 0, sizeof(m_pcm_param));
+ memset(&m_buffer_supplier, 0, sizeof(m_buffer_supplier));
+ memset(&m_priority_mgm, 0, sizeof(m_priority_mgm));
+
+ pthread_mutexattr_init(&m_lock_attr);
+ pthread_mutex_init(&m_lock, &m_lock_attr);
+ pthread_mutexattr_init(&m_commandlock_attr);
+ pthread_mutex_init(&m_commandlock, &m_commandlock_attr);
+
+ pthread_mutexattr_init(&m_outputlock_attr);
+ pthread_mutex_init(&m_outputlock, &m_outputlock_attr);
+
+ pthread_mutexattr_init(&m_state_attr);
+ pthread_mutex_init(&m_state_lock, &m_state_attr);
+
+ pthread_mutexattr_init(&m_event_attr);
+ pthread_mutex_init(&m_event_lock, &m_event_attr);
+
+ pthread_mutexattr_init(&m_flush_attr);
+ pthread_mutex_init(&m_flush_lock, &m_flush_attr);
+
+ pthread_mutexattr_init(&m_event_attr);
+ pthread_mutex_init(&m_event_lock, &m_event_attr);
+
+ pthread_mutexattr_init(&m_in_th_attr);
+ pthread_mutex_init(&m_in_th_lock, &m_in_th_attr);
+
+ pthread_mutexattr_init(&m_out_th_attr);
+ pthread_mutex_init(&m_out_th_lock, &m_out_th_attr);
+
+ pthread_mutexattr_init(&m_in_th_attr_1);
+ pthread_mutex_init(&m_in_th_lock_1, &m_in_th_attr_1);
+
+ pthread_mutexattr_init(&m_out_th_attr_1);
+ pthread_mutex_init(&m_out_th_lock_1, &m_out_th_attr_1);
+
+ pthread_mutexattr_init(&out_buf_count_lock_attr);
+ pthread_mutex_init(&out_buf_count_lock, &out_buf_count_lock_attr);
+
+ pthread_mutexattr_init(&in_buf_count_lock_attr);
+ pthread_mutex_init(&in_buf_count_lock, &in_buf_count_lock_attr);
+ updateLogLevel();
+
+ if ((cond_ret = pthread_cond_init (&cond, NULL)) != 0)
+ {
+ OMX_LOGE("pthread_cond_init returns non zero for cond\n");
+ if (cond_ret == EAGAIN)
+ OMX_LOGE("The system lacked necessary \
+ resources(other than mem)\n");
+ else if (cond_ret == ENOMEM)
+ OMX_LOGE("Insufficient memory to initialise \
+ condition variable\n");
+ }
+ if ((cond_ret = pthread_cond_init (&in_cond, NULL)) != 0)
+ {
+ OMX_LOGE("pthread_cond_init returns non zero for in_cond\n");
+ if (cond_ret == EAGAIN)
+ OMX_LOGE("The system lacked necessary \
+ resources(other than mem)\n");
+ else if (cond_ret == ENOMEM)
+ OMX_LOGE("Insufficient memory to initialise \
+ condition variable\n");
+ }
+ if ((cond_ret = pthread_cond_init (&out_cond, NULL)) != 0)
+ {
+ OMX_LOGE("pthread_cond_init returns non zero for out_cond\n");
+ if (cond_ret == EAGAIN)
+ OMX_LOGE("The system lacked necessary \
+ resources(other than mem)\n");
+ else if (cond_ret == ENOMEM)
+ OMX_LOGE("Insufficient memory to initialise \
+ condition variable\n");
+ }
+
+ sem_init(&sem_read_msg,0, 0);
+ sem_init(&sem_write_msg,0, 0);
+ sem_init(&sem_States,0, 0);
+ return;
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::~omx_g711_aenc
+
+DESCRIPTION
+ Destructor
+
+PARAMETERS
+ None
+
+RETURN VALUE
+ None.
+========================================================================== */
+omx_g711_aenc::~omx_g711_aenc()
+{
+ OMX_LOGE("G711 Object getting destroyed comp-deinit=%d\n",
+ m_comp_deinit);
+ if ( !m_comp_deinit )
+ {
+ deinit_encoder();
+ }
+ pthread_mutexattr_destroy(&m_lock_attr);
+ pthread_mutex_destroy(&m_lock);
+
+ pthread_mutexattr_destroy(&m_commandlock_attr);
+ pthread_mutex_destroy(&m_commandlock);
+
+ pthread_mutexattr_destroy(&m_outputlock_attr);
+ pthread_mutex_destroy(&m_outputlock);
+
+ pthread_mutexattr_destroy(&m_state_attr);
+ pthread_mutex_destroy(&m_state_lock);
+
+ pthread_mutexattr_destroy(&m_event_attr);
+ pthread_mutex_destroy(&m_event_lock);
+
+ pthread_mutexattr_destroy(&m_flush_attr);
+ pthread_mutex_destroy(&m_flush_lock);
+
+ pthread_mutexattr_destroy(&m_in_th_attr);
+ pthread_mutex_destroy(&m_in_th_lock);
+
+ pthread_mutexattr_destroy(&m_out_th_attr);
+ pthread_mutex_destroy(&m_out_th_lock);
+
+ pthread_mutexattr_destroy(&out_buf_count_lock_attr);
+ pthread_mutex_destroy(&out_buf_count_lock);
+
+ pthread_mutexattr_destroy(&in_buf_count_lock_attr);
+ pthread_mutex_destroy(&in_buf_count_lock);
+
+ pthread_mutexattr_destroy(&m_in_th_attr_1);
+ pthread_mutex_destroy(&m_in_th_lock_1);
+
+ pthread_mutexattr_destroy(&m_out_th_attr_1);
+ pthread_mutex_destroy(&m_out_th_lock_1);
+ pthread_cond_destroy(&cond);
+ pthread_cond_destroy(&in_cond);
+ pthread_cond_destroy(&out_cond);
+ sem_destroy (&sem_read_msg);
+ sem_destroy (&sem_write_msg);
+ sem_destroy (&sem_States);
+ OMX_LOGE("OMX G711 component destroyed\n");
+ return;
+}
+
+/**
+ @brief memory function for sending EmptyBufferDone event
+ back to IL client
+
+ @param bufHdr OMX buffer header to be passed back to IL client
+ @return none
+ */
+void omx_g711_aenc::buffer_done_cb(OMX_BUFFERHEADERTYPE *bufHdr)
+{
+ if (m_cb.EmptyBufferDone)
+ {
+ PrintFrameHdr(OMX_COMPONENT_GENERATE_BUFFER_DONE,bufHdr);
+ bufHdr->nFilledLen = 0;
+
+ m_cb.EmptyBufferDone(&m_cmp, m_app_data, bufHdr);
+ pthread_mutex_lock(&in_buf_count_lock);
+ m_g711_pb_stats.ebd_cnt++;
+ nNumInputBuf--;
+ DEBUG_DETAIL("EBD CB:: in_buf_len=%d nNumInputBuf=%d\n ebd_cnt=%d",\
+ m_g711_pb_stats.tot_in_buf_len,
+ nNumInputBuf, m_g711_pb_stats.ebd_cnt);
+ pthread_mutex_unlock(&in_buf_count_lock);
+ }
+
+ return;
+}
+
+/*=============================================================================
+FUNCTION:
+ flush_ack
+
+DESCRIPTION:
+
+
+INPUT/OUTPUT PARAMETERS:
+ None
+
+RETURN VALUE:
+ None
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+void omx_g711_aenc::flush_ack()
+{
+ // Decrement the FLUSH ACK count and notify the waiting recepients
+ pthread_mutex_lock(&m_flush_lock);
+ --m_flush_cnt;
+ if (0 == m_flush_cnt)
+ {
+ event_complete();
+ }
+ OMX_LOGV("Rxed FLUSH ACK cnt=%d\n",m_flush_cnt);
+ pthread_mutex_unlock(&m_flush_lock);
+}
+void omx_g711_aenc::frame_done_cb(OMX_BUFFERHEADERTYPE *bufHdr)
+{
+ if (m_cb.FillBufferDone)
+ {
+ PrintFrameHdr(OMX_COMPONENT_GENERATE_FRAME_DONE,bufHdr);
+ m_g711_pb_stats.fbd_cnt++;
+ pthread_mutex_lock(&out_buf_count_lock);
+ nNumOutputBuf--;
+ OMX_LOGV("FBD CB:: nNumOutputBuf=%d out_buf_len=%u fbd_cnt=%u\n",\
+ nNumOutputBuf,
+ m_g711_pb_stats.tot_out_buf_len,
+ m_g711_pb_stats.fbd_cnt);
+ m_g711_pb_stats.tot_out_buf_len += bufHdr->nFilledLen;
+ m_g711_pb_stats.tot_pb_time = bufHdr->nTimeStamp;
+ OMX_LOGV("FBD:in_buf_len=%u out_buf_len=%u\n",
+ m_g711_pb_stats.tot_in_buf_len,
+ m_g711_pb_stats.tot_out_buf_len);
+
+ pthread_mutex_unlock(&out_buf_count_lock);
+ m_cb.FillBufferDone(&m_cmp, m_app_data, bufHdr);
+ }
+ return;
+}
+
+/*=============================================================================
+FUNCTION:
+ process_out_port_msg
+
+DESCRIPTION:
+ Function for handling all commands from IL client
+IL client commands are processed and callbacks are generated through
+this routine Audio Command Server provides the thread context for this routine
+
+INPUT/OUTPUT PARAMETERS:
+ [INOUT] client_data
+ [IN] id
+
+RETURN VALUE:
+ None
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+void omx_g711_aenc::process_out_port_msg(void *client_data, unsigned char id)
+{
+ unsigned long p1 = 0; // Parameter - 1
+ unsigned long p2 = 0; // Parameter - 2
+ unsigned char ident = 0;
+ unsigned qsize = 0; // qsize
+ unsigned tot_qsize = 0;
+ omx_g711_aenc *pThis = (omx_g711_aenc *) client_data;
+ OMX_STATETYPE state;
+
+loopback_out:
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ if ( state == OMX_StateLoaded )
+ {
+ OMX_LOGV(" OUT: IN LOADED STATE RETURN\n");
+ return;
+ }
+ pthread_mutex_lock(&pThis->m_outputlock);
+
+ qsize = pThis->m_output_ctrl_cmd_q.m_size;
+ tot_qsize = pThis->m_output_ctrl_cmd_q.m_size;
+ tot_qsize += pThis->m_output_ctrl_fbd_q.m_size;
+ tot_qsize += pThis->m_output_q.m_size;
+
+ if ( 0 == tot_qsize )
+ {
+ pthread_mutex_unlock(&pThis->m_outputlock);
+ DEBUG_DETAIL("OUT-->BREAK FROM LOOP...%d\n",tot_qsize);
+ return;
+ }
+ if ( (state != OMX_StateExecuting) && !qsize )
+ {
+ pthread_mutex_unlock(&pThis->m_outputlock);
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ if ( state == OMX_StateLoaded )
+ return;
+
+ DEBUG_DETAIL("OUT:1.SLEEPING OUT THREAD\n");
+ pthread_mutex_lock(&pThis->m_out_th_lock_1);
+ pThis->is_out_th_sleep = true;
+ pthread_mutex_unlock(&pThis->m_out_th_lock_1);
+ pThis->out_th_goto_sleep();
+
+ /* Get the updated state */
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ }
+
+ if ( ((!pThis->m_output_ctrl_cmd_q.m_size) && !pThis->m_out_bEnabled) )
+ {
+ // case where no port reconfig and nothing in the flush q
+ DEBUG_DETAIL("No flush/port reconfig qsize=%d tot_qsize=%d",\
+ qsize,tot_qsize);
+ pthread_mutex_unlock(&pThis->m_outputlock);
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ if ( state == OMX_StateLoaded )
+ return;
+
+ if(pThis->m_output_ctrl_cmd_q.m_size || !(pThis->bFlushinprogress))
+ {
+ OMX_LOGV("OUT:2. SLEEPING OUT THREAD \n");
+ pthread_mutex_lock(&pThis->m_out_th_lock_1);
+ pThis->is_out_th_sleep = true;
+ pthread_mutex_unlock(&pThis->m_out_th_lock_1);
+ pThis->out_th_goto_sleep();
+ }
+ /* Get the updated state */
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ }
+ qsize = pThis->m_output_ctrl_cmd_q.m_size;
+ tot_qsize = pThis->m_output_ctrl_cmd_q.m_size;
+ tot_qsize += pThis->m_output_ctrl_fbd_q.m_size;
+ tot_qsize += pThis->m_output_q.m_size;
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ DEBUG_DETAIL("OUT-->QSIZE-flush=%d,fbd=%d QSIZE=%d state=%d\n",\
+ pThis->m_output_ctrl_cmd_q.m_size,
+ pThis->m_output_ctrl_fbd_q.m_size,
+ pThis->m_output_q.m_size,state);
+
+
+ if (qsize)
+ {
+ // process FLUSH message
+ pThis->m_output_ctrl_cmd_q.pop_entry(&p1,&p2,&ident);
+ } else if ( (qsize = pThis->m_output_ctrl_fbd_q.m_size) &&
+ (pThis->m_out_bEnabled) && (state == OMX_StateExecuting) )
+ {
+ // then process EBD's
+ pThis->m_output_ctrl_fbd_q.pop_entry(&p1,&p2,&ident);
+ } else if ( (qsize = pThis->m_output_q.m_size) &&
+ (pThis->m_out_bEnabled) && (state == OMX_StateExecuting) )
+ {
+ // if no FLUSH and FBD's then process FTB's
+ pThis->m_output_q.pop_entry(&p1,&p2,&ident);
+ } else if ( state == OMX_StateLoaded )
+ {
+ pthread_mutex_unlock(&pThis->m_outputlock);
+ OMX_LOGV("IN: ***in OMX_StateLoaded so exiting\n");
+ return ;
+ } else
+ {
+ qsize = 0;
+ OMX_LOGV("OUT--> Empty Queue state=%d %d %d %d\n",state,
+ pThis->m_output_ctrl_cmd_q.m_size,
+ pThis->m_output_ctrl_fbd_q.m_size,
+ pThis->m_output_q.m_size);
+
+ if(state == OMX_StatePause)
+ {
+ DEBUG_DETAIL("OUT: SLEEPING AGAIN OUT THREAD\n");
+ pthread_mutex_lock(&pThis->m_out_th_lock_1);
+ pThis->is_out_th_sleep = true;
+ pthread_mutex_unlock(&pThis->m_out_th_lock_1);
+ pthread_mutex_unlock(&pThis->m_outputlock);
+ pThis->out_th_goto_sleep();
+ goto loopback_out;
+ }
+ }
+ pthread_mutex_unlock(&pThis->m_outputlock);
+
+ if ( qsize > 0 )
+ {
+ id = ident;
+ ident = 0;
+ DEBUG_DETAIL("OUT->state[%d]ident[%d]flushq[%d]fbd[%d]dataq[%d]\n",\
+ pThis->m_state,
+ ident,
+ pThis->m_output_ctrl_cmd_q.m_size,
+ pThis->m_output_ctrl_fbd_q.m_size,
+ pThis->m_output_q.m_size);
+
+ if ( OMX_COMPONENT_GENERATE_FRAME_DONE == id )
+ {
+ pThis->frame_done_cb((OMX_BUFFERHEADERTYPE *)p2);
+ } else if ( OMX_COMPONENT_GENERATE_FTB == id )
+ {
+ pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,
+ (OMX_BUFFERHEADERTYPE *)p2);
+ } else if ( OMX_COMPONENT_GENERATE_EOS == id )
+ {
+ pThis->m_cb.EventHandler(&pThis->m_cmp,
+ pThis->m_app_data,
+ OMX_EventBufferFlag,
+ 1, 1, NULL );
+
+ }
+ else if(id == OMX_COMPONENT_RESUME)
+ {
+ OMX_LOGV("RESUMED...\n");
+ }
+ else if(id == OMX_COMPONENT_GENERATE_COMMAND)
+ {
+ // Execute FLUSH command
+ if ( OMX_CommandFlush == p1 )
+ {
+ DEBUG_DETAIL("Executing FLUSH command on Output port\n");
+ pThis->execute_output_omx_flush();
+ } else
+ {
+ DEBUG_DETAIL("Invalid command[%lu]\n",p1);
+ }
+ } else
+ {
+ OMX_LOGE("ERROR:OUT-->Invalid Id[%d]\n",id);
+ }
+ } else
+ {
+ DEBUG_DETAIL("ERROR: OUT--> Empty OUTPUTQ\n");
+ }
+
+ return;
+}
+
+/*=============================================================================
+FUNCTION:
+ process_command_msg
+
+DESCRIPTION:
+
+
+INPUT/OUTPUT PARAMETERS:
+ [INOUT] client_data
+ [IN] id
+
+RETURN VALUE:
+ None
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+void omx_g711_aenc::process_command_msg(void *client_data, unsigned char id)
+{
+ unsigned long p1 = 0; // Parameter - 1
+ unsigned long p2 = 0; // Parameter - 2
+ unsigned char ident = 0;
+ unsigned qsize = 0;
+ omx_g711_aenc *pThis = (omx_g711_aenc*)client_data;
+ pthread_mutex_lock(&pThis->m_commandlock);
+
+ qsize = pThis->m_command_q.m_size;
+ DEBUG_DETAIL("CMD-->QSIZE=%d state=%d\n",pThis->m_command_q.m_size,
+ pThis->m_state);
+
+ if (!qsize)
+ {
+ DEBUG_DETAIL("CMD-->BREAKING FROM LOOP\n");
+ pthread_mutex_unlock(&pThis->m_commandlock);
+ return;
+ } else
+ {
+ pThis->m_command_q.pop_entry(&p1,&p2,&ident);
+ }
+ pthread_mutex_unlock(&pThis->m_commandlock);
+
+ id = ident;
+ DEBUG_DETAIL("CMD->state[%d]id[%d]cmdq[%d]n",\
+ pThis->m_state,ident, \
+ pThis->m_command_q.m_size);
+
+ if (OMX_COMPONENT_GENERATE_EVENT == id)
+ {
+ if (pThis->m_cb.EventHandler)
+ {
+ if (OMX_CommandStateSet == p1)
+ {
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->m_state = (OMX_STATETYPE) p2;
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ OMX_LOGV("CMD:Process->state set to %d \n", \
+ pThis->m_state);
+
+ if (pThis->m_state == OMX_StateExecuting ||
+ pThis->m_state == OMX_StateLoaded)
+ {
+
+ pthread_mutex_lock(&pThis->m_in_th_lock_1);
+ if (pThis->is_in_th_sleep)
+ {
+ pThis->is_in_th_sleep = false;
+ DEBUG_DETAIL("CMD:WAKING UP IN THREADS\n");
+ pThis->in_th_wakeup();
+ }
+ pthread_mutex_unlock(&pThis->m_in_th_lock_1);
+
+ pthread_mutex_lock(&pThis->m_out_th_lock_1);
+ if (pThis->is_out_th_sleep)
+ {
+ DEBUG_DETAIL("CMD:WAKING UP OUT THREADS\n");
+ pThis->is_out_th_sleep = false;
+ pThis->out_th_wakeup();
+ }
+ pthread_mutex_unlock(&pThis->m_out_th_lock_1);
+ }
+ }
+ if (OMX_StateInvalid == pThis->m_state)
+ {
+ pThis->m_cb.EventHandler(&pThis->m_cmp,
+ pThis->m_app_data,
+ OMX_EventError,
+ OMX_ErrorInvalidState,
+ 0, NULL );
+ } else if ((signed)p2 == OMX_ErrorPortUnpopulated)
+ {
+ pThis->m_cb.EventHandler(&pThis->m_cmp,
+ pThis->m_app_data,
+ OMX_EventError,
+ (OMX_U32)p2,
+ 0,
+ 0 );
+ } else
+ {
+ pThis->m_cb.EventHandler(&pThis->m_cmp,
+ pThis->m_app_data,
+ OMX_EventCmdComplete,
+ (OMX_U32)p1, (OMX_U32)p2, NULL );
+ }
+ } else
+ {
+ OMX_LOGE("ERROR:CMD-->EventHandler NULL \n");
+ }
+ } else if (OMX_COMPONENT_GENERATE_COMMAND == id)
+ {
+ pThis->send_command_proxy(&pThis->m_cmp,
+ (OMX_COMMANDTYPE)p1,
+ (OMX_U32)p2,(OMX_PTR)NULL);
+ } else if (OMX_COMPONENT_PORTSETTINGS_CHANGED == id)
+ {
+ DEBUG_DETAIL("CMD-->RXED PORTSETTINGS_CHANGED");
+ pThis->m_cb.EventHandler(&pThis->m_cmp,
+ pThis->m_app_data,
+ OMX_EventPortSettingsChanged,
+ 1, 1, NULL );
+ }
+ else
+ {
+ OMX_LOGE("CMD->state[%d]id[%d]\n",pThis->m_state,ident);
+ }
+ return;
+}
+
+/*=============================================================================
+FUNCTION:
+ process_in_port_msg
+
+DESCRIPTION:
+
+
+INPUT/OUTPUT PARAMETERS:
+ [INOUT] client_data
+ [IN] id
+
+RETURN VALUE:
+ None
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+void omx_g711_aenc::process_in_port_msg(void *client_data, unsigned char id)
+{
+ unsigned long p1 = 0; // Parameter - 1
+ unsigned long p2 = 0; // Parameter - 2
+ unsigned char ident = 0;
+ unsigned qsize = 0;
+ unsigned tot_qsize = 0;
+ omx_g711_aenc *pThis = (omx_g711_aenc *) client_data;
+ OMX_STATETYPE state;
+
+ if (!pThis)
+ {
+ OMX_LOGE("ERROR:IN--> Invalid Obj \n");
+ return;
+ }
+loopback_in:
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ if ( state == OMX_StateLoaded )
+ {
+ OMX_LOGV(" IN: IN LOADED STATE RETURN\n");
+ return;
+ }
+ // Protect the shared queue data structure
+ pthread_mutex_lock(&pThis->m_lock);
+
+ qsize = pThis->m_input_ctrl_cmd_q.m_size;
+ tot_qsize = qsize;
+ tot_qsize += pThis->m_input_ctrl_ebd_q.m_size;
+ tot_qsize += pThis->m_input_q.m_size;
+
+ if ( 0 == tot_qsize )
+ {
+ DEBUG_DETAIL("IN-->BREAKING FROM IN LOOP");
+ pthread_mutex_unlock(&pThis->m_lock);
+ return;
+ }
+
+ if ( (state != OMX_StateExecuting) && ! (pThis->m_input_ctrl_cmd_q.m_size))
+ {
+ pthread_mutex_unlock(&pThis->m_lock);
+ DEBUG_DETAIL("SLEEPING IN THREAD\n");
+ pthread_mutex_lock(&pThis->m_in_th_lock_1);
+ pThis->is_in_th_sleep = true;
+ pthread_mutex_unlock(&pThis->m_in_th_lock_1);
+ pThis->in_th_goto_sleep();
+
+ /* Get the updated state */
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ }
+ else if ((state == OMX_StatePause))
+ {
+ if(!(pThis->m_input_ctrl_cmd_q.m_size))
+ {
+ pthread_mutex_unlock(&pThis->m_lock);
+
+ DEBUG_DETAIL("IN: SLEEPING IN THREAD\n");
+ pthread_mutex_lock(&pThis->m_in_th_lock_1);
+ pThis->is_in_th_sleep = true;
+ pthread_mutex_unlock(&pThis->m_in_th_lock_1);
+ pThis->in_th_goto_sleep();
+
+ pthread_mutex_lock(&pThis->m_state_lock);
+ pThis->get_state(&pThis->m_cmp, &state);
+ pthread_mutex_unlock(&pThis->m_state_lock);
+ }
+ }
+
+ qsize = pThis->m_input_ctrl_cmd_q.m_size;
+ tot_qsize = qsize;
+ tot_qsize += pThis->m_input_ctrl_ebd_q.m_size;
+ tot_qsize += pThis->m_input_q.m_size;
+
+ DEBUG_DETAIL("Input-->QSIZE-flush=%d,ebd=%d QSIZE=%d state=%d\n",\
+ pThis->m_input_ctrl_cmd_q.m_size,
+ pThis->m_input_ctrl_ebd_q.m_size,
+ pThis->m_input_q.m_size, state);
+
+
+ if ( qsize )
+ {
+ // process FLUSH message
+ pThis->m_input_ctrl_cmd_q.pop_entry(&p1,&p2,&ident);
+ } else if ( (qsize = pThis->m_input_ctrl_ebd_q.m_size) &&
+ (state == OMX_StateExecuting) )
+ {
+ // then process EBD's
+ pThis->m_input_ctrl_ebd_q.pop_entry(&p1,&p2,&ident);
+ } else if ((qsize = pThis->m_input_q.m_size) &&
+ (state == OMX_StateExecuting))
+ {
+ // if no FLUSH and EBD's then process ETB's
+ pThis->m_input_q.pop_entry(&p1, &p2, &ident);
+ } else if ( state == OMX_StateLoaded )
+ {
+ pthread_mutex_unlock(&pThis->m_lock);
+ OMX_LOGV("IN: ***in OMX_StateLoaded so exiting\n");
+ return ;
+ } else
+ {
+ qsize = 0;
+ OMX_LOGV("IN-->state[%d]cmdq[%d]ebdq[%d]in[%d]\n",\
+ state,pThis->m_input_ctrl_cmd_q.m_size,
+ pThis->m_input_ctrl_ebd_q.m_size,
+ pThis->m_input_q.m_size);
+
+ if(state == OMX_StatePause)
+ {
+ DEBUG_DETAIL("IN: SLEEPING AGAIN IN THREAD\n");
+ pthread_mutex_lock(&pThis->m_in_th_lock_1);
+ pThis->is_in_th_sleep = true;
+ pthread_mutex_unlock(&pThis->m_in_th_lock_1);
+ pthread_mutex_unlock(&pThis->m_lock);
+ pThis->in_th_goto_sleep();
+ goto loopback_in;
+ }
+ }
+ pthread_mutex_unlock(&pThis->m_lock);
+
+ if ( qsize > 0 )
+ {
+ id = ident;
+ DEBUG_DETAIL("Input->state[%d]id[%d]flushq[%d]ebdq[%d]dataq[%d]\n",\
+ pThis->m_state,
+ ident,
+ pThis->m_input_ctrl_cmd_q.m_size,
+ pThis->m_input_ctrl_ebd_q.m_size,
+ pThis->m_input_q.m_size);
+ if ( OMX_COMPONENT_GENERATE_BUFFER_DONE == id )
+ {
+ pThis->buffer_done_cb((OMX_BUFFERHEADERTYPE *)p2);
+ }
+ else if(id == OMX_COMPONENT_GENERATE_EOS)
+ {
+ pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+ OMX_EventBufferFlag, 0, 1, NULL );
+ } else if ( OMX_COMPONENT_GENERATE_ETB == id )
+ {
+ pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1,
+ (OMX_BUFFERHEADERTYPE *)p2);
+ } else if ( OMX_COMPONENT_GENERATE_COMMAND == id )
+ {
+ // Execute FLUSH command
+ if ( OMX_CommandFlush == p1 )
+ {
+ DEBUG_DETAIL(" Executing FLUSH command on Input port\n");
+ pThis->execute_input_omx_flush();
+ } else
+ {
+ DEBUG_DETAIL("Invalid command[%lu]\n",p1);
+ }
+ }
+ else
+ {
+ OMX_LOGE("ERROR:IN-->Invalid Id[%d]\n",id);
+ }
+ } else
+ {
+ DEBUG_DETAIL("ERROR:IN-->Empty INPUT Q\n");
+ }
+ return;
+}
+
+/**
+ @brief member function for performing component initialization
+
+ @param role C string mandating role of this component
+ @return Error status
+ */
+OMX_ERRORTYPE omx_g711_aenc::component_init(OMX_STRING role)
+{
+
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ m_state = OMX_StateLoaded;
+
+ /* DSP does not give information about the bitstream
+ randomly assign the value right now. Query will result in
+ incorrect param */
+ memset(&m_g711_param, 0, sizeof(m_g711_param));
+ m_g711_param.nSize = (OMX_U32)sizeof(m_g711_param);
+ m_g711_param.nChannels = OMX_G711_DEFAULT_CH_CFG;
+ m_g711_param.nSamplingRate = OMX_G711_DEFAULT_SF;
+ m_volume = OMX_G711_DEFAULT_VOL; /* Close to unity gain */
+ memset(&m_g711_pb_stats,0,sizeof(G711_PB_STATS));
+ memset(&m_pcm_param, 0, sizeof(m_pcm_param));
+ m_pcm_param.nSize = (OMX_U32)sizeof(m_pcm_param);
+ m_pcm_param.nChannels = OMX_G711_DEFAULT_CH_CFG;
+ m_pcm_param.nSamplingRate = OMX_G711_DEFAULT_SF;
+ nTimestamp = 0;
+
+
+ nNumInputBuf = 0;
+ nNumOutputBuf = 0;
+ m_ipc_to_in_th = NULL; // Command server instance
+ m_ipc_to_out_th = NULL; // Client server instance
+ m_ipc_to_cmd_th = NULL; // command instance
+ m_is_out_th_sleep = 0;
+ m_is_in_th_sleep = 0;
+ is_out_th_sleep= false;
+
+ is_in_th_sleep=false;
+
+ memset(&m_priority_mgm, 0, sizeof(m_priority_mgm));
+ m_priority_mgm.nGroupID =0;
+ m_priority_mgm.nGroupPriority=0;
+
+ memset(&m_buffer_supplier, 0, sizeof(m_buffer_supplier));
+ m_buffer_supplier.nPortIndex=OMX_BufferSupplyUnspecified;
+
+ OMX_LOGE(" component init: role = %s\n",role);
+
+ OMX_LOGV(" component init: role = %s\n",role);
+ component_Role.nVersion.nVersion = OMX_SPEC_VERSION;
+ if (!strcmp(role,"OMX.qcom.audio.encoder.g711mlaw"))
+ {
+ pcm_input = 1;
+ component_Role.nSize = (OMX_U32)sizeof(role);
+ strlcpy((char *)component_Role.cRole, (const char*)role,
+ sizeof(component_Role.cRole));
+ OMX_LOGV("\ncomponent_init: Component %s LOADED \n", role);
+ is_mlaw = true;
+ } else if (!strcmp(role,"OMX.qcom.audio.encoder.tunneled.g711mlaw"))
+ {
+ pcm_input = 0;
+ component_Role.nSize = (OMX_U32)sizeof(role);
+ strlcpy((char *)component_Role.cRole, (const char*)role,
+ sizeof(component_Role.cRole));
+ OMX_LOGV("\ncomponent_init: Component %s LOADED \n", role);
+ is_mlaw = true;
+ } else if (!strcmp(role,"OMX.qcom.audio.encoder.g711alaw"))
+ {
+ pcm_input = 1;
+ component_Role.nSize = (OMX_U32)sizeof(role);
+ strlcpy((char *)component_Role.cRole, (const char*)role,
+ sizeof(component_Role.cRole));
+ OMX_LOGV("\ncomponent_init: Component %s LOADED \n", role);
+ } else if (!strcmp(role,"OMX.qcom.audio.encoder.tunneled.g711alaw"))
+ {
+ pcm_input = 0;
+ component_Role.nSize = (OMX_U32)sizeof(role);
+ strlcpy((char *)component_Role.cRole, (const char*)role,
+ sizeof(component_Role.cRole));
+ OMX_LOGV("\ncomponent_init: Component %s LOADED \n", role);
+ } else
+ {
+ component_Role.nSize = (OMX_U32)sizeof("\0");
+ strlcpy((char *)component_Role.cRole, (const char*)"\0",
+ sizeof(component_Role.cRole));
+ OMX_LOGV("\ncomponent_init: Component %s LOADED is invalid\n", role);
+ }
+ if(pcm_input)
+ {
+
+
+ m_tmp_meta_buf = (OMX_U8*) malloc(sizeof(OMX_U8) *
+ (OMX_CORE_INPUT_BUFFER_SIZE + sizeof(META_IN)));
+
+ if (m_tmp_meta_buf == NULL){
+ OMX_LOGV("Mem alloc failed for in meta buf\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ m_tmp_out_meta_buf =
+ (OMX_U8*)malloc(sizeof(OMX_U8)*OMX_G711_OUTPUT_BUFFER_SIZE);
+ if ( m_tmp_out_meta_buf == NULL ) {
+ OMX_LOGV("Mem alloc failed for out meta buf\n");
+ return OMX_ErrorInsufficientResources;
+ }
+
+ if(0 == pcm_input)
+ {
+ if (is_mlaw)
+ {
+ m_drv_fd = open("/dev/msm_g711mlaw_in",O_RDONLY);
+ OMX_LOGV("Driver msm_g711mlaw_in in Tunnel mode open\n");
+ }
+ else
+ {
+ m_drv_fd = open("/dev/msm_g711alaw_in",O_RDONLY);
+ OMX_LOGV("Driver msm_g711alaw_in in Tunnel mode open\n");
+ }
+ }
+ else
+ {
+ if (is_mlaw)
+ {
+ m_drv_fd = open("/dev/msm_g711mlaw_in",O_RDWR);
+ OMX_LOGV("Driver msm_g711mlaw_in in Non Tunnel mode open\n");
+ }
+ else
+ {
+ m_drv_fd = open("/dev/msm_g711alaw_in",O_RDWR);
+ OMX_LOGV("Driver msm_g711alaw_in in Non Tunnel mode open\n");
+ }
+ }
+ if (m_drv_fd < 0)
+ {
+ OMX_LOGE("Component_init Open Failed[%d] errno[%d]",\
+ m_drv_fd,errno);
+
+ return OMX_ErrorInsufficientResources;
+ }
+ if(ioctl(m_drv_fd, AUDIO_GET_SESSION_ID,&m_session_id) == -1)
+ {
+ OMX_LOGE("AUDIO_GET_SESSION_ID FAILED\n");
+ }
+ if(pcm_input)
+ {
+ if (!m_ipc_to_in_th)
+ {
+ m_ipc_to_in_th = omx_g711_thread_create(process_in_port_msg,
+ this, (char *)"INPUT_THREAD");
+ if (!m_ipc_to_in_th)
+ {
+ OMX_LOGE("ERROR!!! Failed to start \
+ Input port thread\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ }
+
+ if (!m_ipc_to_cmd_th)
+ {
+ m_ipc_to_cmd_th = omx_g711_thread_create(process_command_msg,
+ this, (char *)"CMD_THREAD");
+ if (!m_ipc_to_cmd_th)
+ {
+ OMX_LOGE("ERROR!!!Failed to start "
+ "command message thread\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+
+ if (!m_ipc_to_out_th)
+ {
+ m_ipc_to_out_th = omx_g711_thread_create(process_out_port_msg,
+ this, (char *)"OUTPUT_THREAD");
+ if (!m_ipc_to_out_th)
+ {
+ OMX_LOGE("ERROR!!! Failed to start output "
+ "port thread\n");
+ return OMX_ErrorInsufficientResources;
+ }
+ }
+ return eRet;
+}
+
+/**
+
+ @brief member function to retrieve version of component
+
+
+
+ @param hComp handle to this component instance
+ @param componentName name of component
+ @param componentVersion pointer to memory space which stores the
+ version number
+ @param specVersion pointer to memory sapce which stores version of
+ openMax specification
+ @param componentUUID
+ @return Error status
+ */
+OMX_ERRORTYPE omx_g711_aenc::get_component_version
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STRING componentName,
+ OMX_OUT OMX_VERSIONTYPE* componentVersion,
+ OMX_OUT OMX_VERSIONTYPE* specVersion,
+ OMX_OUT OMX_UUIDTYPE* componentUUID)
+{
+ if((hComp == NULL) || (componentName == NULL) ||
+ (specVersion == NULL) || (componentUUID == NULL))
+ {
+ componentVersion = NULL;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_state == OMX_StateInvalid)
+ {
+ OMX_LOGE("Get Comp Version in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+ componentVersion->nVersion = OMX_SPEC_VERSION;
+ specVersion->nVersion = OMX_SPEC_VERSION;
+ return OMX_ErrorNone;
+}
+/**
+ @brief member function handles command from IL client
+
+ This function simply queue up commands from IL client.
+ Commands will be processed in command server thread context later
+
+ @param hComp handle to component instance
+ @param cmd type of command
+ @param param1 parameters associated with the command type
+ @param cmdData
+ @return Error status
+*/
+OMX_ERRORTYPE omx_g711_aenc::send_command(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_COMMANDTYPE cmd,
+ OMX_IN OMX_U32 param1,
+ OMX_IN OMX_PTR cmdData)
+{
+ int portIndex = (int)param1;
+
+ if(hComp == NULL)
+ {
+ cmdData = cmdData;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (OMX_StateInvalid == m_state)
+ {
+ return OMX_ErrorInvalidState;
+ }
+ if ( (cmd == OMX_CommandFlush) && (portIndex > 1) )
+ {
+ return OMX_ErrorBadPortIndex;
+ }
+ post_command((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND);
+ OMX_LOGV("Send Command : returns with OMX_ErrorNone \n");
+ OMX_LOGV("send_command : recieved state before semwait= %u\n",param1);
+ sem_wait (&sem_States);
+ OMX_LOGV("send_command : recieved state after semwait\n");
+ return OMX_ErrorNone;
+}
+
+/**
+ @brief member function performs actual processing of commands excluding
+ empty buffer call
+
+ @param hComp handle to component
+ @param cmd command type
+ @param param1 parameter associated with the command
+ @param cmdData
+
+ @return error status
+*/
+OMX_ERRORTYPE omx_g711_aenc::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_COMMANDTYPE cmd,
+ OMX_IN OMX_U32 param1,
+ OMX_IN OMX_PTR cmdData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ // Handle only IDLE and executing
+ OMX_STATETYPE eState = (OMX_STATETYPE) param1;
+ int bFlag = 1;
+ nState = eState;
+
+ if(hComp == NULL)
+ {
+ cmdData = cmdData;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (OMX_CommandStateSet == cmd)
+ {
+ /***************************/
+ /* Current State is Loaded */
+ /***************************/
+ if (OMX_StateLoaded == m_state)
+ {
+ if (OMX_StateIdle == eState)
+ {
+
+ if (allocate_done() ||
+ (m_inp_bEnabled == OMX_FALSE
+ && m_out_bEnabled == OMX_FALSE))
+ {
+ OMX_LOGV("SCP-->Allocate Done Complete\n");
+ }
+ else
+ {
+ OMX_LOGV("SCP-->Loaded to Idle-Pending\n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+ bFlag = 0;
+ }
+
+ } else if (eState == OMX_StateLoaded)
+ {
+ OMX_LOGV("OMXCORE-SM: Loaded-->Loaded\n");
+ m_cb.EventHandler(&this->m_cmp,
+ this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorSameState,
+ 0, NULL );
+ eRet = OMX_ErrorSameState;
+ }
+
+ else if (eState == OMX_StateWaitForResources)
+ {
+ OMX_LOGV("OMXCORE-SM: Loaded-->WaitForResources\n");
+ eRet = OMX_ErrorNone;
+ }
+
+ else if (eState == OMX_StateExecuting)
+ {
+ OMX_LOGV("OMXCORE-SM: Loaded-->Executing\n");
+ m_cb.EventHandler(&this->m_cmp,
+ this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+
+ else if (eState == OMX_StatePause)
+ {
+ OMX_LOGV("OMXCORE-SM: Loaded-->Pause\n");
+ m_cb.EventHandler(&this->m_cmp,
+ this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+
+ else if (eState == OMX_StateInvalid)
+ {
+ OMX_LOGV("OMXCORE-SM: Loaded-->Invalid\n");
+ m_cb.EventHandler(&this->m_cmp,
+ this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorInvalidState,
+ 0, NULL );
+ m_state = OMX_StateInvalid;
+ eRet = OMX_ErrorInvalidState;
+ } else
+ {
+ OMX_LOGE("SCP-->Loaded to Invalid(%d))\n",eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+
+ /***************************/
+ /* Current State is IDLE */
+ /***************************/
+ else if (OMX_StateIdle == m_state)
+ {
+ if (OMX_StateLoaded == eState)
+ {
+ if (release_done(-1))
+ {
+ if (ioctl(m_drv_fd, AUDIO_STOP, 0) == -1)
+ {
+ OMX_LOGE("SCP:Idle->Loaded,\
+ ioctl stop failed %d\n", errno);
+ }
+
+ nTimestamp=0;
+
+ OMX_LOGV("SCP-->Idle to Loaded\n");
+ } else
+ {
+ OMX_LOGV("SCP--> Idle to Loaded-Pending\n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING);
+ // Skip the event notification
+ bFlag = 0;
+ }
+ }
+ else if (OMX_StateExecuting == eState)
+ {
+
+ struct msm_audio_g711_enc_config drv_g711_enc_config;
+ struct msm_audio_stream_config drv_stream_config;
+ struct msm_audio_buf_cfg buf_cfg;
+ struct msm_audio_config pcm_cfg;
+
+ if(ioctl(m_drv_fd, AUDIO_GET_STREAM_CONFIG, &drv_stream_config)
+ == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_GET_STREAM_CONFIG failed, \
+ errno[%d]\n", errno);
+ }
+ if(ioctl(m_drv_fd, AUDIO_SET_STREAM_CONFIG, &drv_stream_config)
+ == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_SET_STREAM_CONFIG failed, \
+ errno[%d]\n", errno);
+ }
+
+ if(ioctl(m_drv_fd, AUDIO_GET_G711_ENC_CONFIG,
+ &drv_g711_enc_config) == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_GET_G711_ENC_CONFIG failed,\
+ errno[%d]\n", errno);
+ }
+ if( drv_g711_enc_config.sample_rate != m_g711_param.nSamplingRate)
+ {
+ drv_g711_enc_config.sample_rate = m_g711_param.nSamplingRate;
+ }
+ OMX_LOGV("sampling rate %d", drv_g711_enc_config.sample_rate);
+ if(ioctl(m_drv_fd, AUDIO_SET_G711_ENC_CONFIG, &drv_g711_enc_config)
+ == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_SET_G711_ENC_CONFIG \
+ failed, errno[%d]\n", errno);
+ }
+ if (ioctl(m_drv_fd, AUDIO_GET_BUF_CFG, &buf_cfg) == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_GET_BUF_CFG, errno[%d]\n",
+ errno);
+ }
+ buf_cfg.meta_info_enable = 1;
+ buf_cfg.frames_per_buf = NUMOFFRAMES;
+ if (ioctl(m_drv_fd, AUDIO_SET_BUF_CFG, &buf_cfg) == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_SET_BUF_CFG, errno[%d]\n",
+ errno);
+ }
+ if(pcm_input)
+ {
+ if (ioctl(m_drv_fd, AUDIO_GET_CONFIG, &pcm_cfg) == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_GET_CONFIG, errno[%d]\n",
+ errno);
+ }
+ pcm_cfg.channel_count = m_pcm_param.nChannels;
+ pcm_cfg.sample_rate = m_pcm_param.nSamplingRate;
+ OMX_LOGV("pcm config %u %u\n",m_pcm_param.nChannels,
+ m_pcm_param.nSamplingRate);
+
+ if (ioctl(m_drv_fd, AUDIO_SET_CONFIG, &pcm_cfg) == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_SET_CONFIG, errno[%d]\n",
+ errno);
+ }
+ }
+ if(ioctl(m_drv_fd, AUDIO_START, 0) == -1)
+ {
+ OMX_LOGE("ioctl AUDIO_START failed, errno[%d]\n",
+ errno);
+ }
+ OMX_LOGV("SCP-->Idle to Executing\n");
+ nState = eState;
+ } else if (eState == OMX_StateIdle)
+ {
+ OMX_LOGV("OMXCORE-SM: Idle-->Idle\n");
+ m_cb.EventHandler(&this->m_cmp,
+ this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorSameState,
+ 0, NULL );
+ eRet = OMX_ErrorSameState;
+ } else if (eState == OMX_StateWaitForResources)
+ {
+ OMX_LOGV("OMXCORE-SM: Idle-->WaitForResources\n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ }
+
+ else if (eState == OMX_StatePause)
+ {
+ OMX_LOGV("OMXCORE-SM: Idle-->Pause\n");
+ }
+
+ else if (eState == OMX_StateInvalid)
+ {
+ OMX_LOGV("OMXCORE-SM: Idle-->Invalid\n");
+ m_state = OMX_StateInvalid;
+ this->m_cb.EventHandler(&this->m_cmp,
+ this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorInvalidState,
+ 0, NULL );
+ eRet = OMX_ErrorInvalidState;
+ } else
+ {
+ OMX_LOGE("SCP--> Idle to %d Not Handled\n",eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+
+ /******************************/
+ /* Current State is Executing */
+ /******************************/
+ else if (OMX_StateExecuting == m_state)
+ {
+ if (OMX_StateIdle == eState)
+ {
+ OMX_LOGV("SCP-->Executing to Idle \n");
+ if(pcm_input)
+ execute_omx_flush(-1,false);
+ else
+ execute_omx_flush(1,false);
+
+
+ } else if (OMX_StatePause == eState)
+ {
+ DEBUG_DETAIL("*************************\n");
+ OMX_LOGV("SCP-->RXED PAUSE STATE\n");
+ DEBUG_DETAIL("*************************\n");
+ //ioctl(m_drv_fd, AUDIO_PAUSE, 0);
+ } else if (eState == OMX_StateLoaded)
+ {
+ OMX_LOGV("\n OMXCORE-SM: Executing --> Loaded \n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ } else if (eState == OMX_StateWaitForResources)
+ {
+ OMX_LOGV("\n OMXCORE-SM: Executing --> WaitForResources \n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ } else if (eState == OMX_StateExecuting)
+ {
+ OMX_LOGV("\n OMXCORE-SM: Executing --> Executing \n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError, OMX_ErrorSameState,
+ 0, NULL );
+ eRet = OMX_ErrorSameState;
+ } else if (eState == OMX_StateInvalid)
+ {
+ OMX_LOGV("\n OMXCORE-SM: Executing --> Invalid \n");
+ m_state = OMX_StateInvalid;
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError, OMX_ErrorInvalidState,
+ 0, NULL );
+ eRet = OMX_ErrorInvalidState;
+ } else
+ {
+ OMX_LOGE("SCP--> Executing to %d Not Handled\n",
+ eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ /***************************/
+ /* Current State is Pause */
+ /***************************/
+ else if (OMX_StatePause == m_state)
+ {
+ if( (eState == OMX_StateExecuting || eState == OMX_StateIdle) )
+ {
+ pthread_mutex_lock(&m_out_th_lock_1);
+ if(is_out_th_sleep)
+ {
+ DEBUG_DETAIL("PE: WAKING UP OUT THREAD\n");
+ is_out_th_sleep = false;
+ out_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_out_th_lock_1);
+ }
+ if ( OMX_StateExecuting == eState )
+ {
+ nState = eState;
+ } else if ( OMX_StateIdle == eState )
+ {
+ OMX_LOGV("SCP-->Paused to Idle \n");
+ OMX_LOGV ("\n Internal flush issued");
+ pthread_mutex_lock(&m_flush_lock);
+ m_flush_cnt = 2;
+ pthread_mutex_unlock(&m_flush_lock);
+ if(pcm_input)
+ execute_omx_flush(-1,false);
+ else
+ execute_omx_flush(1,false);
+
+ } else if ( eState == OMX_StateLoaded )
+ {
+ OMX_LOGV("\n Pause --> loaded \n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ } else if (eState == OMX_StateWaitForResources)
+ {
+ OMX_LOGV("\n Pause --> WaitForResources \n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ } else if (eState == OMX_StatePause)
+ {
+ OMX_LOGV("\n Pause --> Pause \n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError, OMX_ErrorSameState,
+ 0, NULL );
+ eRet = OMX_ErrorSameState;
+ } else if (eState == OMX_StateInvalid)
+ {
+ OMX_LOGV("\n Pause --> Invalid \n");
+ m_state = OMX_StateInvalid;
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError, OMX_ErrorInvalidState,
+ 0, NULL );
+ eRet = OMX_ErrorInvalidState;
+ } else
+ {
+ OMX_LOGV("SCP-->Paused to %d Not Handled\n",eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ /**************************************/
+ /* Current State is WaitForResources */
+ /**************************************/
+ else if (m_state == OMX_StateWaitForResources)
+ {
+ if (eState == OMX_StateLoaded)
+ {
+ OMX_LOGV("OMXCORE-SM: WaitForResources-->Loaded\n");
+ } else if (eState == OMX_StateWaitForResources)
+ {
+ OMX_LOGV("OMXCORE-SM: waitForResources-->WaitForResources\n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError, OMX_ErrorSameState,
+ 0, NULL );
+ eRet = OMX_ErrorSameState;
+ } else if (eState == OMX_StateExecuting)
+ {
+ OMX_LOGV("OMXCORE-SM: WaitForResources-->Executing\n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ } else if (eState == OMX_StatePause)
+ {
+ OMX_LOGV("OMXCORE-SM: WaitForResources-->Pause\n");
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorIncorrectStateTransition,
+ 0, NULL );
+ eRet = OMX_ErrorIncorrectStateTransition;
+ } else if (eState == OMX_StateInvalid)
+ {
+ OMX_LOGV("OMXCORE-SM: WaitForResources-->Invalid\n");
+ m_state = OMX_StateInvalid;
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError,
+ OMX_ErrorInvalidState,
+ 0, NULL );
+ eRet = OMX_ErrorInvalidState;
+ } else
+ {
+ OMX_LOGE("SCP--> %d to %d(Not Handled)\n",
+ m_state,eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ /****************************/
+ /* Current State is Invalid */
+ /****************************/
+ else if (m_state == OMX_StateInvalid)
+ {
+ if (OMX_StateLoaded == eState || OMX_StateWaitForResources == eState
+ || OMX_StateIdle == eState || OMX_StateExecuting == eState
+ || OMX_StatePause == eState || OMX_StateInvalid == eState)
+ {
+ OMX_LOGV("OMXCORE-SM: Invalid-->Loaded/Idle/Executing"
+ "/Pause/Invalid/WaitForResources\n");
+ m_state = OMX_StateInvalid;
+ this->m_cb.EventHandler(&this->m_cmp, this->m_app_data,
+ OMX_EventError, OMX_ErrorInvalidState,
+ 0, NULL );
+ eRet = OMX_ErrorInvalidState;
+ }
+ } else
+ {
+ OMX_LOGE("OMXCORE-SM: %d --> %d(Not Handled)\n",\
+ m_state,eState);
+ eRet = OMX_ErrorBadParameter;
+ }
+ } else if (OMX_CommandFlush == cmd)
+ {
+ DEBUG_DETAIL("*************************\n");
+ OMX_LOGV("SCP-->RXED FLUSH COMMAND port=%u\n",param1);
+ DEBUG_DETAIL("*************************\n");
+ bFlag = 0;
+ if ( param1 == OMX_CORE_INPUT_PORT_INDEX ||
+ param1 == OMX_CORE_OUTPUT_PORT_INDEX ||
+ (signed)param1 == -1 )
+ {
+ execute_omx_flush(param1);
+ } else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ m_cb.EventHandler(&m_cmp, m_app_data, OMX_EventError,
+ OMX_CommandFlush, OMX_ErrorBadPortIndex, NULL );
+ }
+ } else if ( cmd == OMX_CommandPortDisable )
+ {
+ bFlag = 0;
+ if ( param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL )
+ {
+ OMX_LOGV("SCP: Disabling Input port Indx\n");
+ m_inp_bEnabled = OMX_FALSE;
+ if ( (m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+ && release_done(0) )
+ {
+ OMX_LOGV("send_command_proxy:OMX_CommandPortDisable:\
+ OMX_CORE_INPUT_PORT_INDEX:release_done \n");
+ OMX_LOGV("************* OMX_CommandPortDisable:\
+ m_inp_bEnabled=%d********\n",m_inp_bEnabled);
+
+ post_command(OMX_CommandPortDisable,
+ OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+
+ else
+ {
+ if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
+ {
+ OMX_LOGV("SCP: execute_omx_flush in Disable in "\
+ " param1=%u m_state=%d \n",param1, m_state);
+ execute_omx_flush(param1);
+ }
+ OMX_LOGV("send_command_proxy:OMX_CommandPortDisable:\
+ OMX_CORE_INPUT_PORT_INDEX \n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING);
+ // Skip the event notification
+
+ }
+
+ }
+ if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
+ {
+
+ OMX_LOGV("SCP: Disabling Output port Indx\n");
+ m_out_bEnabled = OMX_FALSE;
+ if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle)
+ && release_done(1))
+ {
+ OMX_LOGV("send_command_proxy:OMX_CommandPortDisable:\
+ OMX_CORE_OUTPUT_PORT_INDEX:release_done \n");
+ OMX_LOGV("************* OMX_CommandPortDisable:\
+ m_out_bEnabled=%d********\n",m_inp_bEnabled);
+
+ post_command(OMX_CommandPortDisable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ } else
+ {
+ if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting)
+ {
+ OMX_LOGV("SCP: execute_omx_flush in Disable out "\
+ "param1=%u m_state=%d \n",param1, m_state);
+ execute_omx_flush(param1);
+ }
+ BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+ // Skip the event notification
+
+ }
+ } else
+ {
+ OMX_LOGE("OMX_CommandPortDisable: disable wrong port ID");
+ }
+
+ } else if (cmd == OMX_CommandPortEnable)
+ {
+ bFlag = 0;
+ if (param1 == OMX_CORE_INPUT_PORT_INDEX || param1 == OMX_ALL)
+ {
+ m_inp_bEnabled = OMX_TRUE;
+ OMX_LOGV("SCP: Enabling Input port Indx\n");
+ if ((m_state == OMX_StateLoaded
+ && !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+ || (m_state == OMX_StateWaitForResources)
+ || (m_inp_bPopulated == OMX_TRUE))
+ {
+ post_command(OMX_CommandPortEnable,
+ OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+
+
+ } else
+ {
+ BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING);
+ // Skip the event notification
+
+ }
+ }
+
+ if (param1 == OMX_CORE_OUTPUT_PORT_INDEX || param1 == OMX_ALL)
+ {
+ OMX_LOGV("SCP: Enabling Output port Indx\n");
+ m_out_bEnabled = OMX_TRUE;
+ if ((m_state == OMX_StateLoaded
+ && !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+ || (m_state == OMX_StateWaitForResources)
+ || (m_out_bPopulated == OMX_TRUE))
+ {
+ post_command(OMX_CommandPortEnable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ } else
+ {
+ OMX_LOGV("send_command_proxy:OMX_CommandPortEnable:\
+ OMX_CORE_OUTPUT_PORT_INDEX:release_done \n");
+ BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+ // Skip the event notification
+
+ }
+ pthread_mutex_lock(&m_in_th_lock_1);
+ if(is_in_th_sleep)
+ {
+ is_in_th_sleep = false;
+ DEBUG_DETAIL("SCP:WAKING UP IN THREADS\n");
+ in_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_in_th_lock_1);
+ pthread_mutex_lock(&m_out_th_lock_1);
+ if (is_out_th_sleep)
+ {
+ is_out_th_sleep = false;
+ OMX_LOGV("SCP:WAKING OUT THR, OMX_CommandPortEnable\n");
+ out_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_out_th_lock_1);
+ } else
+ {
+ OMX_LOGE("OMX_CommandPortEnable: disable wrong port ID");
+ }
+
+ } else
+ {
+ OMX_LOGE("SCP-->ERROR: Invali Command [%d]\n",cmd);
+ eRet = OMX_ErrorNotImplemented;
+ }
+ OMX_LOGV("posting sem_States\n");
+ sem_post (&sem_States);
+ if (eRet == OMX_ErrorNone && bFlag)
+ {
+ post_command(cmd,eState,OMX_COMPONENT_GENERATE_EVENT);
+ }
+ return eRet;
+}
+
+/*=============================================================================
+FUNCTION:
+ execute_omx_flush
+
+DESCRIPTION:
+ Function that flushes buffers that are pending to be written to driver
+
+INPUT/OUTPUT PARAMETERS:
+ [IN] param1
+ [IN] cmd_cmpl
+
+RETURN VALUE:
+ true
+ false
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+bool omx_g711_aenc::execute_omx_flush(OMX_IN OMX_U32 param1, bool cmd_cmpl)
+{
+ bool bRet = true;
+
+ OMX_LOGV("Execute_omx_flush Port[%u]", param1);
+ struct timespec abs_timeout;
+ abs_timeout.tv_sec = 1;
+ abs_timeout.tv_nsec = 0;
+
+ if ((signed)param1 == -1)
+ {
+ bFlushinprogress = true;
+ OMX_LOGV("Execute flush for both I/p O/p port\n");
+ pthread_mutex_lock(&m_flush_lock);
+ m_flush_cnt = 2;
+ pthread_mutex_unlock(&m_flush_lock);
+
+ // Send Flush commands to input and output threads
+ post_input(OMX_CommandFlush,
+ OMX_CORE_INPUT_PORT_INDEX,OMX_COMPONENT_GENERATE_COMMAND);
+ post_output(OMX_CommandFlush,
+ OMX_CORE_OUTPUT_PORT_INDEX,OMX_COMPONENT_GENERATE_COMMAND);
+ // Send Flush to the kernel so that the in and out buffers are released
+ if (ioctl( m_drv_fd, AUDIO_FLUSH, 0) == -1)
+ OMX_LOGE("FLush:ioctl flush failed errno=%d\n",errno);
+ DEBUG_DETAIL("****************************************");
+ DEBUG_DETAIL("is_in_th_sleep=%d is_out_th_sleep=%d\n",\
+ is_in_th_sleep,is_out_th_sleep);
+ DEBUG_DETAIL("****************************************");
+
+ pthread_mutex_lock(&m_in_th_lock_1);
+ if (is_in_th_sleep)
+ {
+ is_in_th_sleep = false;
+ DEBUG_DETAIL("For FLUSH-->WAKING UP IN THREADS\n");
+ in_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_in_th_lock_1);
+
+ pthread_mutex_lock(&m_out_th_lock_1);
+ if (is_out_th_sleep)
+ {
+ is_out_th_sleep = false;
+ DEBUG_DETAIL("For FLUSH-->WAKING UP OUT THREADS\n");
+ out_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_out_th_lock_1);
+
+
+ // sleep till the FLUSH ACK are done by both the input and
+ // output threads
+ DEBUG_DETAIL("WAITING FOR FLUSH ACK's param1=%d",param1);
+ wait_for_event();
+
+ OMX_LOGV("RECIEVED BOTH FLUSH ACK's param1=%u cmd_cmpl=%d",\
+ param1,cmd_cmpl);
+
+ // If not going to idle state, Send FLUSH complete message
+ // to the Client, now that FLUSH ACK's have been recieved.
+ if (cmd_cmpl)
+ {
+ m_cb.EventHandler(&m_cmp, m_app_data, OMX_EventCmdComplete,
+ OMX_CommandFlush, OMX_CORE_INPUT_PORT_INDEX,
+ NULL );
+ m_cb.EventHandler(&m_cmp, m_app_data, OMX_EventCmdComplete,
+ OMX_CommandFlush, OMX_CORE_OUTPUT_PORT_INDEX,
+ NULL );
+ OMX_LOGV("Inside FLUSH.. sending FLUSH CMPL\n");
+ }
+ bFlushinprogress = false;
+ }
+ else if (param1 == OMX_CORE_INPUT_PORT_INDEX)
+ {
+ OMX_LOGV("Execute FLUSH for I/p port\n");
+ pthread_mutex_lock(&m_flush_lock);
+ m_flush_cnt = 1;
+ pthread_mutex_unlock(&m_flush_lock);
+ post_input(OMX_CommandFlush,
+ OMX_CORE_INPUT_PORT_INDEX,OMX_COMPONENT_GENERATE_COMMAND);
+ if (ioctl( m_drv_fd, AUDIO_FLUSH, 0) == -1)
+ OMX_LOGE("Flush:Input port, ioctl flush failed %d\n",
+ errno);
+ DEBUG_DETAIL("****************************************");
+ DEBUG_DETAIL("is_in_th_sleep=%d is_out_th_sleep=%d\n",\
+ is_in_th_sleep,is_out_th_sleep);
+ DEBUG_DETAIL("****************************************");
+
+ if (is_in_th_sleep)
+ {
+ pthread_mutex_lock(&m_in_th_lock_1);
+ is_in_th_sleep = false;
+ pthread_mutex_unlock(&m_in_th_lock_1);
+ DEBUG_DETAIL("For FLUSH-->WAKING UP IN THREADS\n");
+ in_th_wakeup();
+ }
+
+ if (is_out_th_sleep)
+ {
+ pthread_mutex_lock(&m_out_th_lock_1);
+ is_out_th_sleep = false;
+ pthread_mutex_unlock(&m_out_th_lock_1);
+ DEBUG_DETAIL("For FLUSH-->WAKING UP OUT THREADS\n");
+ out_th_wakeup();
+ }
+
+ //sleep till the FLUSH ACK are done by both the input and output threads
+ DEBUG_DETAIL("Executing FLUSH for I/p port\n");
+ DEBUG_DETAIL("WAITING FOR FLUSH ACK's param1=%d",param1);
+ wait_for_event();
+ DEBUG_DETAIL(" RECIEVED FLUSH ACK FOR I/P PORT param1=%d",param1);
+
+ // Send FLUSH complete message to the Client,
+ // now that FLUSH ACK's have been recieved.
+ if (cmd_cmpl)
+ {
+ m_cb.EventHandler(&m_cmp, m_app_data, OMX_EventCmdComplete,
+ OMX_CommandFlush, OMX_CORE_INPUT_PORT_INDEX,
+ NULL );
+ }
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX == param1)
+ {
+ OMX_LOGV("Executing FLUSH for O/p port\n");
+ pthread_mutex_lock(&m_flush_lock);
+ m_flush_cnt = 1;
+ pthread_mutex_unlock(&m_flush_lock);
+ DEBUG_DETAIL("Executing FLUSH for O/p port\n");
+ DEBUG_DETAIL("WAITING FOR FLUSH ACK's param1=%d",param1);
+ post_output(OMX_CommandFlush,
+ OMX_CORE_OUTPUT_PORT_INDEX,OMX_COMPONENT_GENERATE_COMMAND);
+ if (ioctl( m_drv_fd, AUDIO_FLUSH, 0) ==-1)
+ OMX_LOGE("Flush:Output port, ioctl flush failed %d\n",
+ errno);
+ DEBUG_DETAIL("****************************************");
+ DEBUG_DETAIL("is_in_th_sleep=%d is_out_th_sleep=%d\n",\
+ is_in_th_sleep,is_out_th_sleep);
+ DEBUG_DETAIL("****************************************");
+ if (is_in_th_sleep)
+ {
+ pthread_mutex_lock(&m_in_th_lock_1);
+ is_in_th_sleep = false;
+ pthread_mutex_unlock(&m_in_th_lock_1);
+ DEBUG_DETAIL("For FLUSH-->WAKING UP IN THREADS\n");
+ in_th_wakeup();
+ }
+
+ if (is_out_th_sleep)
+ {
+ pthread_mutex_lock(&m_out_th_lock_1);
+ is_out_th_sleep = false;
+ pthread_mutex_unlock(&m_out_th_lock_1);
+ DEBUG_DETAIL("For FLUSH-->WAKING UP OUT THREADS\n");
+ out_th_wakeup();
+ }
+
+ // sleep till the FLUSH ACK are done by both the input and
+ // output threads
+ wait_for_event();
+ // Send FLUSH complete message to the Client,
+ // now that FLUSH ACK's have been recieved.
+ if (cmd_cmpl)
+ {
+ m_cb.EventHandler(&m_cmp, m_app_data, OMX_EventCmdComplete,
+ OMX_CommandFlush, OMX_CORE_OUTPUT_PORT_INDEX,
+ NULL );
+ }
+ DEBUG_DETAIL("RECIEVED FLUSH ACK FOR O/P PORT param1=%d",param1);
+ } else
+ {
+ OMX_LOGV("Invalid Port ID[%u]",param1);
+ }
+ return bRet;
+}
+
+/*=============================================================================
+FUNCTION:
+ execute_input_omx_flush
+
+DESCRIPTION:
+ Function that flushes buffers that are pending to be written to driver
+
+INPUT/OUTPUT PARAMETERS:
+ None
+
+RETURN VALUE:
+ true
+ false
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+bool omx_g711_aenc::execute_input_omx_flush()
+{
+ OMX_BUFFERHEADERTYPE *omx_buf;
+ unsigned long p1 = 0; // Parameter - 1
+ unsigned long p2 = 0; // Parameter - 2
+ unsigned char ident = 0;
+ unsigned qsize=0; // qsize
+ unsigned tot_qsize=0; // qsize
+
+ OMX_LOGV("Execute_omx_flush on input port");
+
+ pthread_mutex_lock(&m_lock);
+ do
+ {
+ qsize = m_input_q.m_size;
+ tot_qsize = qsize;
+ tot_qsize += m_input_ctrl_ebd_q.m_size;
+
+ DEBUG_DETAIL("Input FLUSH-->flushq[%d] ebd[%d]dataq[%d]",\
+ m_input_ctrl_cmd_q.m_size,
+ m_input_ctrl_ebd_q.m_size,qsize);
+ if (!tot_qsize)
+ {
+ DEBUG_DETAIL("Input-->BREAKING FROM execute_input_flush LOOP");
+ pthread_mutex_unlock(&m_lock);
+ break;
+ }
+ if (qsize)
+ {
+ m_input_q.pop_entry(&p1, &p2, &ident);
+ if ((ident == OMX_COMPONENT_GENERATE_ETB) ||
+ (ident == OMX_COMPONENT_GENERATE_BUFFER_DONE))
+ {
+ omx_buf = (OMX_BUFFERHEADERTYPE *) p2;
+ DEBUG_DETAIL("Flush:Input dataq=%p \n", omx_buf);
+ omx_buf->nFilledLen = 0;
+ buffer_done_cb((OMX_BUFFERHEADERTYPE *)omx_buf);
+ }
+ } else if (m_input_ctrl_ebd_q.m_size)
+ {
+ m_input_ctrl_ebd_q.pop_entry(&p1, &p2, &ident);
+ if (ident == OMX_COMPONENT_GENERATE_BUFFER_DONE)
+ {
+ omx_buf = (OMX_BUFFERHEADERTYPE *) p2;
+ omx_buf->nFilledLen = 0;
+ DEBUG_DETAIL("Flush:ctrl dataq=%p \n", omx_buf);
+ buffer_done_cb((OMX_BUFFERHEADERTYPE *)omx_buf);
+ }
+ } else
+ {
+ }
+ }while (tot_qsize>0);
+ DEBUG_DETAIL("*************************\n");
+ DEBUG_DETAIL("IN-->FLUSHING DONE\n");
+ DEBUG_DETAIL("*************************\n");
+ flush_ack();
+ pthread_mutex_unlock(&m_lock);
+ return true;
+}
+
+/*=============================================================================
+FUNCTION:
+ execute_output_omx_flush
+
+DESCRIPTION:
+ Function that flushes buffers that are pending to be written to driver
+
+INPUT/OUTPUT PARAMETERS:
+ None
+
+RETURN VALUE:
+ true
+ false
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+bool omx_g711_aenc::execute_output_omx_flush()
+{
+ OMX_BUFFERHEADERTYPE *omx_buf;
+ unsigned long p1 = 0; // Parameter - 1
+ unsigned long p2 = 0; // Parameter - 2
+ unsigned char ident = 0;
+ unsigned qsize=0; // qsize
+ unsigned tot_qsize=0; // qsize
+
+ OMX_LOGV("Execute_omx_flush on output port");
+
+ pthread_mutex_lock(&m_outputlock);
+ do
+ {
+ qsize = m_output_q.m_size;
+ DEBUG_DETAIL("OUT FLUSH-->flushq[%d] fbd[%d]dataq[%d]",\
+ m_output_ctrl_cmd_q.m_size,
+ m_output_ctrl_fbd_q.m_size,qsize);
+ tot_qsize = qsize;
+ tot_qsize += m_output_ctrl_fbd_q.m_size;
+ if (!tot_qsize)
+ {
+ DEBUG_DETAIL("OUT-->BREAKING FROM execute_input_flush LOOP");
+ pthread_mutex_unlock(&m_outputlock);
+ break;
+ }
+ if (qsize)
+ {
+ m_output_q.pop_entry(&p1,&p2,&ident);
+ if ( (OMX_COMPONENT_GENERATE_FTB == ident) ||
+ (OMX_COMPONENT_GENERATE_FRAME_DONE == ident))
+ {
+ omx_buf = (OMX_BUFFERHEADERTYPE *) p2;
+ DEBUG_DETAIL("Ouput Buf_Addr=%p TS[0x%x] \n",\
+ omx_buf,nTimestamp);
+ omx_buf->nTimeStamp = nTimestamp;
+ omx_buf->nFilledLen = 0;
+ frame_done_cb((OMX_BUFFERHEADERTYPE *)omx_buf);
+ DEBUG_DETAIL("CALLING FBD FROM FLUSH");
+ }
+ } else if ((qsize = m_output_ctrl_fbd_q.m_size))
+ {
+ m_output_ctrl_fbd_q.pop_entry(&p1, &p2, &ident);
+ if (OMX_COMPONENT_GENERATE_FRAME_DONE == ident)
+ {
+ omx_buf = (OMX_BUFFERHEADERTYPE *) p2;
+ DEBUG_DETAIL("Ouput Buf_Addr=%p TS[0x%x] \n", \
+ omx_buf,nTimestamp);
+ omx_buf->nTimeStamp = nTimestamp;
+ omx_buf->nFilledLen = 0;
+ frame_done_cb((OMX_BUFFERHEADERTYPE *)omx_buf);
+ DEBUG_DETAIL("CALLING FROM CTRL-FBDQ FROM FLUSH");
+ }
+ }
+ }while (qsize>0);
+ DEBUG_DETAIL("*************************\n");
+ DEBUG_DETAIL("OUT-->FLUSHING DONE\n");
+ DEBUG_DETAIL("*************************\n");
+ flush_ack();
+ pthread_mutex_unlock(&m_outputlock);
+ return true;
+}
+
+/*=============================================================================
+FUNCTION:
+ post_input
+
+DESCRIPTION:
+ Function that posts command in the command queue
+
+INPUT/OUTPUT PARAMETERS:
+ [IN] p1
+ [IN] p2
+ [IN] id - command ID
+ [IN] lock - self-locking mode
+
+RETURN VALUE:
+ true
+ false
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+bool omx_g711_aenc::post_input(unsigned long p1,
+ unsigned long p2,
+ unsigned char id)
+{
+ bool bRet = false;
+ pthread_mutex_lock(&m_lock);
+
+ if((OMX_COMPONENT_GENERATE_COMMAND == id) || (id == OMX_COMPONENT_SUSPEND))
+ {
+ // insert flush message and ebd
+ m_input_ctrl_cmd_q.insert_entry(p1,p2,id);
+ } else if ((OMX_COMPONENT_GENERATE_BUFFER_DONE == id))
+ {
+ // insert ebd
+ m_input_ctrl_ebd_q.insert_entry(p1,p2,id);
+ } else
+ {
+ // ETBS in this queue
+ m_input_q.insert_entry(p1,p2,id);
+ }
+
+ if (m_ipc_to_in_th)
+ {
+ bRet = true;
+ omx_g711_post_msg(m_ipc_to_in_th, id);
+ }
+
+ DEBUG_DETAIL("PostInput-->state[%d]id[%d]flushq[%d]ebdq[%d]dataq[%d] \n",\
+ m_state,
+ id,
+ m_input_ctrl_cmd_q.m_size,
+ m_input_ctrl_ebd_q.m_size,
+ m_input_q.m_size);
+
+ pthread_mutex_unlock(&m_lock);
+ return bRet;
+}
+
+/*=============================================================================
+FUNCTION:
+ post_command
+
+DESCRIPTION:
+ Function that posts command in the command queue
+
+INPUT/OUTPUT PARAMETERS:
+ [IN] p1
+ [IN] p2
+ [IN] id - command ID
+ [IN] lock - self-locking mode
+
+RETURN VALUE:
+ true
+ false
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+bool omx_g711_aenc::post_command(unsigned int p1,
+ unsigned int p2,
+ unsigned char id)
+{
+ bool bRet = false;
+
+ pthread_mutex_lock(&m_commandlock);
+
+ m_command_q.insert_entry(p1,p2,id);
+
+ if (m_ipc_to_cmd_th)
+ {
+ bRet = true;
+ omx_g711_post_msg(m_ipc_to_cmd_th, id);
+ }
+
+ DEBUG_DETAIL("PostCmd-->state[%d]id[%d]cmdq[%d]flags[%x]\n",\
+ m_state,
+ id,
+ m_command_q.m_size,
+ m_flags >> 3);
+
+ pthread_mutex_unlock(&m_commandlock);
+ return bRet;
+}
+
+/*=============================================================================
+FUNCTION:
+ post_output
+
+DESCRIPTION:
+ Function that posts command in the command queue
+
+INPUT/OUTPUT PARAMETERS:
+ [IN] p1
+ [IN] p2
+ [IN] id - command ID
+ [IN] lock - self-locking mode
+
+RETURN VALUE:
+ true
+ false
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+bool omx_g711_aenc::post_output(unsigned long p1,
+ unsigned long p2,
+ unsigned char id)
+{
+ bool bRet = false;
+
+ pthread_mutex_lock(&m_outputlock);
+ if((OMX_COMPONENT_GENERATE_COMMAND == id) || (id == OMX_COMPONENT_SUSPEND)
+ || (id == OMX_COMPONENT_RESUME))
+ {
+ // insert flush message and fbd
+ m_output_ctrl_cmd_q.insert_entry(p1,p2,id);
+ } else if ( (OMX_COMPONENT_GENERATE_FRAME_DONE == id) )
+ {
+ // insert flush message and fbd
+ m_output_ctrl_fbd_q.insert_entry(p1,p2,id);
+ } else
+ {
+ m_output_q.insert_entry(p1,p2,id);
+ }
+ if ( m_ipc_to_out_th )
+ {
+ bRet = true;
+ omx_g711_post_msg(m_ipc_to_out_th, id);
+ }
+ DEBUG_DETAIL("PostOutput-->state[%d]id[%d]flushq[%d]ebdq[%d]dataq[%d]\n",\
+ m_state,
+ id,
+ m_output_ctrl_cmd_q.m_size,
+ m_output_ctrl_fbd_q.m_size,
+ m_output_q.m_size);
+
+ pthread_mutex_unlock(&m_outputlock);
+ return bRet;
+}
+/**
+ @brief member function that return parameters to IL client
+
+ @param hComp handle to component instance
+ @param paramIndex Parameter type
+ @param paramData pointer to memory space which would hold the
+ paramter
+ @return error status
+*/
+OMX_ERRORTYPE omx_g711_aenc::get_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_INOUT OMX_PTR paramData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_state == OMX_StateInvalid)
+ {
+ OMX_LOGE("Get Param in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+ if (paramData == NULL)
+ {
+ OMX_LOGV("get_parameter: paramData is NULL\n");
+ return OMX_ErrorBadParameter;
+ }
+
+ switch ((int)paramIndex)
+ {
+ case OMX_IndexParamPortDefinition:
+ {
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+ portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+
+ OMX_LOGV("OMX_IndexParamPortDefinition " \
+ "portDefn->nPortIndex = %u\n",
+ portDefn->nPortIndex);
+
+ portDefn->nVersion.nVersion = OMX_SPEC_VERSION;
+ portDefn->nSize = (OMX_U32)sizeof(portDefn);
+ portDefn->eDomain = OMX_PortDomainAudio;
+
+ if (0 == portDefn->nPortIndex)
+ {
+ portDefn->eDir = OMX_DirInput;
+ portDefn->bEnabled = m_inp_bEnabled;
+ portDefn->bPopulated = m_inp_bPopulated;
+ portDefn->nBufferCountActual = m_inp_act_buf_count;
+ portDefn->nBufferCountMin = OMX_CORE_NUM_INPUT_BUFFERS;
+ portDefn->nBufferSize = input_buffer_size;
+ portDefn->format.audio.bFlagErrorConcealment = OMX_TRUE;
+ portDefn->format.audio.eEncoding = OMX_AUDIO_CodingPCM;
+ portDefn->format.audio.pNativeRender = 0;
+ } else if (1 == portDefn->nPortIndex)
+ {
+ portDefn->eDir = OMX_DirOutput;
+ portDefn->bEnabled = m_out_bEnabled;
+ portDefn->bPopulated = m_out_bPopulated;
+ portDefn->nBufferCountActual = m_out_act_buf_count;
+ portDefn->nBufferCountMin = OMX_CORE_NUM_OUTPUT_BUFFERS;
+ portDefn->nBufferSize = output_buffer_size;
+ portDefn->format.audio.bFlagErrorConcealment = OMX_TRUE;
+ portDefn->format.audio.eEncoding = OMX_AUDIO_CodingG711;
+ portDefn->format.audio.pNativeRender = 0;
+ } else
+ {
+ portDefn->eDir = OMX_DirMax;
+ OMX_LOGE("Bad Port idx %d\n",\
+ (int)portDefn->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+
+ case OMX_IndexParamAudioInit:
+ {
+ OMX_PORT_PARAM_TYPE *portParamType =
+ (OMX_PORT_PARAM_TYPE *) paramData;
+ OMX_LOGV("OMX_IndexParamAudioInit\n");
+
+ portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+ portParamType->nSize = (OMX_U32)sizeof(portParamType);
+ portParamType->nPorts = 2;
+ portParamType->nStartPortNumber = 0;
+ break;
+ }
+
+ case OMX_IndexParamAudioPortFormat:
+ {
+ OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormatType =
+ (OMX_AUDIO_PARAM_PORTFORMATTYPE *) paramData;
+ OMX_LOGV("OMX_IndexParamAudioPortFormat\n");
+ portFormatType->nVersion.nVersion = OMX_SPEC_VERSION;
+ portFormatType->nSize = (OMX_U32)sizeof(portFormatType);
+
+ if (OMX_CORE_INPUT_PORT_INDEX == portFormatType->nPortIndex)
+ {
+
+ portFormatType->eEncoding = OMX_AUDIO_CodingPCM;
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX == portFormatType->nPortIndex)
+ {
+ OMX_LOGV("get_parameter: OMX_IndexParamAudioFormat: "\
+ "%u\n", portFormatType->nIndex);
+
+ portFormatType->eEncoding = OMX_AUDIO_CodingG711;
+ } else
+ {
+ OMX_LOGE("get_parameter: Bad port index %d\n",
+ (int)portFormatType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+ case QOMX_IndexParamAudioSessionId:
+ {
+ QOMX_AUDIO_STREAM_INFO_DATA *streaminfoparam =
+ (QOMX_AUDIO_STREAM_INFO_DATA *) paramData;
+ streaminfoparam->sessionId = (OMX_U8)m_session_id;
+ break;
+ }
+
+ case OMX_IndexParamAudioPcm:
+ {
+ OMX_AUDIO_PARAM_PCMMODETYPE *pcmparam =
+ (OMX_AUDIO_PARAM_PCMMODETYPE *) paramData;
+
+ if (OMX_CORE_INPUT_PORT_INDEX== pcmparam->nPortIndex ||
+ OMX_CORE_OUTPUT_PORT_INDEX== pcmparam->nPortIndex)
+ {
+ memcpy(pcmparam,&m_pcm_param,\
+ sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
+ OMX_LOGV("get_parameter: Sampling rate %u",\
+ pcmparam->nSamplingRate);
+ OMX_LOGV("get_parameter: Number of channels %u",\
+ pcmparam->nChannels);
+ } else
+ {
+ OMX_LOGE("get_parameter:OMX_IndexParamAudioPcm "\
+ "OMX_ErrorBadPortIndex %d\n", \
+ (int)pcmparam->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+ case OMX_IndexParamComponentSuspended:
+ {
+ OMX_PARAM_SUSPENSIONTYPE *suspend =
+ (OMX_PARAM_SUSPENSIONTYPE *) paramData;
+ OMX_LOGV("get_parameter: OMX_IndexParamComponentSuspended %p\n",
+ suspend);
+ break;
+ }
+ case OMX_IndexParamVideoInit:
+ {
+ OMX_PORT_PARAM_TYPE *portParamType =
+ (OMX_PORT_PARAM_TYPE *) paramData;
+ OMX_LOGV("get_parameter: OMX_IndexParamVideoInit\n");
+ portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+ portParamType->nSize = (OMX_U32)sizeof(portParamType);
+ portParamType->nPorts = 0;
+ portParamType->nStartPortNumber = 0;
+ break;
+ }
+ case OMX_IndexParamPriorityMgmt:
+ {
+ OMX_PRIORITYMGMTTYPE *priorityMgmtType =
+ (OMX_PRIORITYMGMTTYPE*)paramData;
+ OMX_LOGV("get_parameter: OMX_IndexParamPriorityMgmt\n");
+ priorityMgmtType->nSize = (OMX_U32)sizeof(priorityMgmtType);
+ priorityMgmtType->nVersion.nVersion = OMX_SPEC_VERSION;
+ priorityMgmtType->nGroupID = m_priority_mgm.nGroupID;
+ priorityMgmtType->nGroupPriority =
+ m_priority_mgm.nGroupPriority;
+ break;
+ }
+ case OMX_IndexParamImageInit:
+ {
+ OMX_PORT_PARAM_TYPE *portParamType =
+ (OMX_PORT_PARAM_TYPE *) paramData;
+ OMX_LOGV("get_parameter: OMX_IndexParamImageInit\n");
+ portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+ portParamType->nSize = (OMX_U32)sizeof(portParamType);
+ portParamType->nPorts = 0;
+ portParamType->nStartPortNumber = 0;
+ break;
+ }
+
+ case OMX_IndexParamCompBufferSupplier:
+ {
+ OMX_LOGV("get_parameter: \
+ OMX_IndexParamCompBufferSupplier\n");
+ OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType
+ = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+ OMX_LOGV("get_parameter: \
+ OMX_IndexParamCompBufferSupplier\n");
+
+ bufferSupplierType->nSize = (OMX_U32)sizeof(bufferSupplierType);
+ bufferSupplierType->nVersion.nVersion = OMX_SPEC_VERSION;
+ if (OMX_CORE_INPUT_PORT_INDEX ==
+ bufferSupplierType->nPortIndex)
+ {
+ bufferSupplierType->nPortIndex =
+ OMX_BufferSupplyUnspecified;
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX ==
+ bufferSupplierType->nPortIndex)
+ {
+ bufferSupplierType->nPortIndex =
+ OMX_BufferSupplyUnspecified;
+ } else
+ {
+ OMX_LOGE("get_parameter:"\
+ "OMX_IndexParamCompBufferSupplier eRet"\
+ "%08x\n", eRet);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+
+ /*Component should support this port definition*/
+ case OMX_IndexParamOtherInit:
+ {
+ OMX_PORT_PARAM_TYPE *portParamType =
+ (OMX_PORT_PARAM_TYPE *) paramData;
+ OMX_LOGV("get_parameter: OMX_IndexParamOtherInit\n");
+ portParamType->nVersion.nVersion = OMX_SPEC_VERSION;
+ portParamType->nSize = (OMX_U32)sizeof(portParamType);
+ portParamType->nPorts = 0;
+ portParamType->nStartPortNumber = 0;
+ break;
+ }
+ case OMX_IndexParamStandardComponentRole:
+ {
+ OMX_PARAM_COMPONENTROLETYPE *componentRole;
+ componentRole = (OMX_PARAM_COMPONENTROLETYPE*)paramData;
+ componentRole->nSize = component_Role.nSize;
+ componentRole->nVersion = component_Role.nVersion;
+ strlcpy((char *)componentRole->cRole,
+ (const char*)component_Role.cRole,
+ sizeof(componentRole->cRole));
+ OMX_LOGE("nSize = %d , nVersion = %d, cRole = %s\n",
+ component_Role.nSize,
+ component_Role.nVersion,
+ component_Role.cRole);
+ break;
+
+ }
+ default:
+ {
+ OMX_LOGE("unknown param %08x\n", paramIndex);
+ eRet = OMX_ErrorUnsupportedIndex;
+ }
+ }
+ return eRet;
+
+}
+
+/**
+ @brief member function that set paramter from IL client
+
+ @param hComp handle to component instance
+ @param paramIndex parameter type
+ @param paramData pointer to memory space which holds the paramter
+ @return error status
+ */
+OMX_ERRORTYPE omx_g711_aenc::set_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_IN OMX_PTR paramData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_state != OMX_StateLoaded)
+ {
+ OMX_LOGE("set_parameter is not in proper state\n");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ if (paramData == NULL)
+ {
+ OMX_LOGV("param data is NULL");
+ return OMX_ErrorBadParameter;
+ }
+
+ switch (paramIndex)
+ {
+ case OMX_IndexParamPortDefinition:
+ {
+ OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
+ portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
+
+ if (((m_state == OMX_StateLoaded)&&
+ !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+ || (m_state == OMX_StateWaitForResources &&
+ ((OMX_DirInput == portDefn->eDir &&
+ m_inp_bEnabled == true)||
+ (OMX_DirInput == portDefn->eDir &&
+ m_out_bEnabled == true)))
+ ||(((OMX_DirInput == portDefn->eDir &&
+ m_inp_bEnabled == false)||
+ (OMX_DirInput == portDefn->eDir &&
+ m_out_bEnabled == false)) &&
+ (m_state != OMX_StateWaitForResources)))
+ {
+ OMX_LOGV("Set Parameter called in valid state\n");
+ } else
+ {
+ OMX_LOGE("Set Parameter called in \
+ Invalid State\n");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ OMX_LOGV("OMX_IndexParamPortDefinition portDefn->nPortIndex "
+ "= %u\n",portDefn->nPortIndex);
+ if (OMX_CORE_INPUT_PORT_INDEX == portDefn->nPortIndex)
+ {
+ if ( portDefn->nBufferCountActual >
+ OMX_CORE_NUM_INPUT_BUFFERS )
+ {
+ m_inp_act_buf_count = portDefn->nBufferCountActual;
+ } else
+ {
+ m_inp_act_buf_count =OMX_CORE_NUM_INPUT_BUFFERS;
+ }
+ input_buffer_size = portDefn->nBufferSize;
+
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX == portDefn->nPortIndex)
+ {
+ if ( portDefn->nBufferCountActual >
+ OMX_CORE_NUM_OUTPUT_BUFFERS )
+ {
+ m_out_act_buf_count = portDefn->nBufferCountActual;
+ } else
+ {
+ m_out_act_buf_count =OMX_CORE_NUM_OUTPUT_BUFFERS;
+ }
+ output_buffer_size = portDefn->nBufferSize;
+ } else
+ {
+ OMX_LOGV(" set_parameter: Bad Port idx %d",\
+ (int)portDefn->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+ case OMX_IndexParamPriorityMgmt:
+ {
+ OMX_LOGV("set_parameter: OMX_IndexParamPriorityMgmt\n");
+
+ if (m_state != OMX_StateLoaded)
+ {
+ OMX_LOGE("Set Parameter called in \
+ Invalid State\n");
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ OMX_PRIORITYMGMTTYPE *priorityMgmtype
+ = (OMX_PRIORITYMGMTTYPE*) paramData;
+ OMX_LOGV("set_parameter: OMX_IndexParamPriorityMgmt %u\n",
+ priorityMgmtype->nGroupID);
+
+ OMX_LOGV("set_parameter: priorityMgmtype %u\n",
+ priorityMgmtype->nGroupPriority);
+
+ m_priority_mgm.nGroupID = priorityMgmtype->nGroupID;
+ m_priority_mgm.nGroupPriority = priorityMgmtype->nGroupPriority;
+
+ break;
+ }
+ case OMX_IndexParamAudioPortFormat:
+ {
+
+ OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormatType =
+ (OMX_AUDIO_PARAM_PORTFORMATTYPE *) paramData;
+ OMX_LOGV("set_parameter: OMX_IndexParamAudioPortFormat\n");
+
+ if (OMX_CORE_INPUT_PORT_INDEX== portFormatType->nPortIndex)
+ {
+ portFormatType->eEncoding = OMX_AUDIO_CodingPCM;
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX ==
+ portFormatType->nPortIndex)
+ {
+ OMX_LOGV("set_parameter: OMX_IndexParamAudioFormat:"\
+ " %u\n", portFormatType->nIndex);
+ portFormatType->eEncoding = OMX_AUDIO_CodingG711;
+ } else
+ {
+ OMX_LOGE("set_parameter: Bad port index %d\n", \
+ (int)portFormatType->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ break;
+ }
+
+
+ case OMX_IndexParamCompBufferSupplier:
+ {
+ OMX_LOGV("set_parameter: \
+ OMX_IndexParamCompBufferSupplier\n");
+ OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType
+ = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
+ OMX_LOGV("set_param: OMX_IndexParamCompBufferSupplier %d",\
+ bufferSupplierType->eBufferSupplier);
+
+ if (bufferSupplierType->nPortIndex == OMX_CORE_INPUT_PORT_INDEX
+ || bufferSupplierType->nPortIndex ==
+ OMX_CORE_OUTPUT_PORT_INDEX)
+ {
+ OMX_LOGV("set_parameter:\
+ OMX_IndexParamCompBufferSupplier\n");
+ m_buffer_supplier.eBufferSupplier =
+ bufferSupplierType->eBufferSupplier;
+ } else
+ {
+ OMX_LOGE("set_param:\
+ IndexParamCompBufferSup %08x\n", eRet);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+
+ break;
+ }
+ case OMX_IndexParamAudioPcm:
+ {
+ OMX_LOGV("set_parameter: OMX_IndexParamAudioPcm\n");
+ OMX_AUDIO_PARAM_PCMMODETYPE *pcmparam
+ = (OMX_AUDIO_PARAM_PCMMODETYPE *) paramData;
+
+ if (OMX_CORE_INPUT_PORT_INDEX== pcmparam->nPortIndex ||
+ OMX_CORE_OUTPUT_PORT_INDEX== pcmparam->nPortIndex)
+ {
+ memcpy(&m_pcm_param,pcmparam,\
+ sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
+ OMX_LOGV("set_pcm_parameter: %u %u",\
+ m_pcm_param.nChannels,
+ m_pcm_param.nSamplingRate);
+ } else
+ {
+ OMX_LOGE("Set_parameter:OMX_IndexParamAudioPcm "
+ "OMX_ErrorBadPortIndex %d\n",
+ (int)pcmparam->nPortIndex);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ m_g711_param = m_pcm_param;
+ break;
+ }
+ case OMX_IndexParamSuspensionPolicy:
+ {
+ eRet = OMX_ErrorNotImplemented;
+ break;
+ }
+ case OMX_IndexParamStandardComponentRole:
+ {
+ OMX_PARAM_COMPONENTROLETYPE *componentRole;
+ componentRole = (OMX_PARAM_COMPONENTROLETYPE*)paramData;
+ component_Role.nSize = componentRole->nSize;
+ component_Role.nVersion = componentRole->nVersion;
+ strlcpy((char *)component_Role.cRole,
+ (const char*)componentRole->cRole,
+ sizeof(component_Role.cRole));
+ break;
+ }
+
+ default:
+ {
+ OMX_LOGE("unknown param %d\n", paramIndex);
+ eRet = OMX_ErrorUnsupportedIndex;
+ }
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::GetConfig
+
+DESCRIPTION
+ OMX Get Config Method implementation.
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ OMX Error None if successful.
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::get_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_INOUT OMX_PTR configData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_state == OMX_StateInvalid)
+ {
+ OMX_LOGE("Get Config in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+
+ switch (configIndex)
+ {
+ case OMX_IndexConfigAudioVolume:
+ {
+ OMX_AUDIO_CONFIG_VOLUMETYPE *volume =
+ (OMX_AUDIO_CONFIG_VOLUMETYPE*) configData;
+
+ if (OMX_CORE_INPUT_PORT_INDEX == volume->nPortIndex)
+ {
+ volume->nSize = (OMX_U32)sizeof(volume);
+ volume->nVersion.nVersion = OMX_SPEC_VERSION;
+ volume->bLinear = OMX_TRUE;
+ volume->sVolume.nValue = m_volume;
+ volume->sVolume.nMax = OMX_AENC_MAX;
+ volume->sVolume.nMin = OMX_AENC_MIN;
+ } else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ }
+ break;
+
+ case OMX_IndexConfigAudioMute:
+ {
+ OMX_AUDIO_CONFIG_MUTETYPE *mute =
+ (OMX_AUDIO_CONFIG_MUTETYPE*) configData;
+
+ if (OMX_CORE_INPUT_PORT_INDEX == mute->nPortIndex)
+ {
+ mute->nSize = (OMX_U32)sizeof(mute);
+ mute->nVersion.nVersion = OMX_SPEC_VERSION;
+ mute->bMute = (BITMASK_PRESENT(&m_flags,
+ OMX_COMPONENT_MUTED)?OMX_TRUE:OMX_FALSE);
+ } else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ }
+ break;
+
+ default:
+ eRet = OMX_ErrorUnsupportedIndex;
+ break;
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::SetConfig
+
+DESCRIPTION
+ OMX Set Config method implementation
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ OMX Error None if successful.
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::set_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_IN OMX_PTR configData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_state == OMX_StateInvalid)
+ {
+ OMX_LOGE("Set Config in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+ if ( m_state == OMX_StateExecuting)
+ {
+ OMX_LOGE("set_config:Ignore in Exe state\n");
+ return OMX_ErrorInvalidState;
+ }
+
+ switch (configIndex)
+ {
+ case OMX_IndexConfigAudioVolume:
+ {
+ OMX_AUDIO_CONFIG_VOLUMETYPE *vol =
+ (OMX_AUDIO_CONFIG_VOLUMETYPE*)configData;
+ if (vol->nPortIndex == OMX_CORE_INPUT_PORT_INDEX)
+ {
+ if ((vol->sVolume.nValue <= OMX_AENC_MAX) &&
+ (vol->sVolume.nValue >= OMX_AENC_MIN))
+ {
+ m_volume = vol->sVolume.nValue;
+ if (BITMASK_ABSENT(&m_flags, OMX_COMPONENT_MUTED))
+ {
+ /* ioctl(m_drv_fd, AUDIO_VOLUME,
+ m_volume * OMX_AENC_VOLUME_STEP); */
+ }
+
+ } else
+ {
+ eRet = OMX_ErrorBadParameter;
+ }
+ } else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ }
+ break;
+
+ case OMX_IndexConfigAudioMute:
+ {
+ OMX_AUDIO_CONFIG_MUTETYPE *mute = (OMX_AUDIO_CONFIG_MUTETYPE*)
+ configData;
+ if (mute->nPortIndex == OMX_CORE_INPUT_PORT_INDEX)
+ {
+ if (mute->bMute == OMX_TRUE)
+ {
+ BITMASK_SET(&m_flags, OMX_COMPONENT_MUTED);
+ /* ioctl(m_drv_fd, AUDIO_VOLUME, 0); */
+ } else
+ {
+ BITMASK_CLEAR(&m_flags, OMX_COMPONENT_MUTED);
+ /* ioctl(m_drv_fd, AUDIO_VOLUME,
+ m_volume * OMX_AENC_VOLUME_STEP); */
+ }
+ } else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ }
+ break;
+
+ default:
+ eRet = OMX_ErrorUnsupportedIndex;
+ break;
+ }
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::GetExtensionIndex
+
+DESCRIPTION
+ OMX GetExtensionIndex method implementaion. <TBD>
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ OMX Error None if everything successful.
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::get_extension_index(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_STRING paramName,
+ OMX_OUT OMX_INDEXTYPE* indexType)
+{
+ if((hComp == NULL) || (paramName == NULL) || (indexType == NULL))
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_state == OMX_StateInvalid)
+ {
+ OMX_LOGE("Get Extension Index in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+ if(strncmp(paramName,"OMX.Qualcomm.index.audio.sessionId",
+ strlen("OMX.Qualcomm.index.audio.sessionId")) == 0)
+ {
+ *indexType =(OMX_INDEXTYPE)QOMX_IndexParamAudioSessionId;
+ OMX_LOGV("Extension index type - %d\n", *indexType);
+
+ }
+ else
+ {
+ return OMX_ErrorBadParameter;
+
+ }
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::GetState
+
+DESCRIPTION
+ Returns the state information back to the caller.<TBD>
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ Error None if everything is successful.
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::get_state(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STATETYPE* state)
+{
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ *state = m_state;
+ OMX_LOGV("Returning the state %d\n",*state);
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::ComponentTunnelRequest
+
+DESCRIPTION
+ OMX Component Tunnel Request method implementation. <TBD>
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ OMX Error None if everything successful.
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::component_tunnel_request
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_HANDLETYPE peerComponent,
+ OMX_IN OMX_U32 peerPort,
+ OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
+{
+ OMX_LOGE("Error: component_tunnel_request Not Implemented\n");
+
+ if((hComp == NULL) || (peerComponent == NULL) || (tunnelSetup == NULL))
+ {
+ port = port;
+ peerPort = peerPort;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::AllocateInputBuffer
+
+DESCRIPTION
+ Helper function for allocate buffer in the input pin
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::allocate_input_buffer
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr;
+ unsigned nBufSize = MAX(bytes, input_buffer_size);
+ char *buf_ptr;
+ if(m_inp_current_buf_count < m_inp_act_buf_count)
+ {
+ buf_ptr = (char *) calloc((nBufSize + \
+ sizeof(OMX_BUFFERHEADERTYPE)+sizeof(META_IN)) , 1);
+
+ if(hComp == NULL)
+ {
+ port = port;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ free(buf_ptr);
+ return OMX_ErrorBadParameter;
+ }
+ if (buf_ptr != NULL)
+ {
+ bufHdr = (OMX_BUFFERHEADERTYPE *) buf_ptr;
+ *bufferHdr = bufHdr;
+ memset(bufHdr,0,sizeof(OMX_BUFFERHEADERTYPE));
+
+ bufHdr->pBuffer = (OMX_U8 *)((buf_ptr) + sizeof(META_IN)+
+ sizeof(OMX_BUFFERHEADERTYPE));
+ bufHdr->nSize = (OMX_U32)sizeof(OMX_BUFFERHEADERTYPE);
+ bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
+ bufHdr->nAllocLen = nBufSize;
+ bufHdr->pAppPrivate = appData;
+ bufHdr->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
+ m_input_buf_hdrs.insert(bufHdr, NULL);
+
+ m_inp_current_buf_count++;
+ OMX_LOGV("AIB:bufHdr %p bufHdr->pBuffer %p m_inp_buf_cnt=%d \
+ bytes=%u", bufHdr, bufHdr->pBuffer,m_inp_current_buf_count,
+ bytes);
+
+ } else
+ {
+ OMX_LOGV("Input buffer memory allocation failed 1 \n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ }
+ else
+ {
+ OMX_LOGV("Input buffer memory allocation failed 2\n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE omx_g711_aenc::allocate_output_buffer
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr;
+ unsigned nBufSize = MAX(bytes,output_buffer_size);
+ char *buf_ptr;
+
+ if(hComp == NULL)
+ {
+ port = port;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_out_current_buf_count < m_out_act_buf_count)
+ {
+ buf_ptr = (char *) calloc( (nBufSize + sizeof(OMX_BUFFERHEADERTYPE)),1);
+
+ if (buf_ptr != NULL)
+ {
+ bufHdr = (OMX_BUFFERHEADERTYPE *) buf_ptr;
+ *bufferHdr = bufHdr;
+ memset(bufHdr,0,sizeof(OMX_BUFFERHEADERTYPE));
+
+ bufHdr->pBuffer = (OMX_U8 *)((buf_ptr) +
+ sizeof(OMX_BUFFERHEADERTYPE));
+ bufHdr->nSize = (OMX_U32)sizeof(OMX_BUFFERHEADERTYPE);
+ bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
+ bufHdr->nAllocLen = nBufSize;
+ bufHdr->pAppPrivate = appData;
+ bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ m_output_buf_hdrs.insert(bufHdr, NULL);
+ m_out_current_buf_count++;
+ OMX_LOGV("AOB::bufHdr %p bufHdr->pBuffer %p m_out_buf_cnt=%d "\
+ "bytes=%u",bufHdr, bufHdr->pBuffer,\
+ m_out_current_buf_count, bytes);
+ } else
+ {
+ OMX_LOGV("Output buffer memory allocation failed 1 \n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ } else
+ {
+ OMX_LOGV("Output buffer memory allocation failed\n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ return eRet;
+}
+
+
+// AllocateBuffer -- API Call
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::AllocateBuffer
+
+DESCRIPTION
+ Returns zero if all the buffers released..
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::allocate_buffer
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes)
+{
+
+ OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type
+
+ if (m_state == OMX_StateInvalid)
+ {
+ OMX_LOGE("Allocate Buf in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+ // What if the client calls again.
+ if (OMX_CORE_INPUT_PORT_INDEX == port)
+ {
+ eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes);
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX == port)
+ {
+ eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes);
+ } else
+ {
+ OMX_LOGE("Error: Invalid Port Index received %d\n",
+ (int)port);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+
+ if (eRet == OMX_ErrorNone)
+ {
+ OMX_LOGV("allocate_buffer: before allocate_done \n");
+ if (allocate_done())
+ {
+ OMX_LOGV("allocate_buffer: after allocate_done \n");
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+ {
+ BITMASK_CLEAR(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+ post_command(OMX_CommandStateSet,OMX_StateIdle,
+ OMX_COMPONENT_GENERATE_EVENT);
+ OMX_LOGV("allocate_buffer: post idle transition event \n");
+ }
+ OMX_LOGV("allocate_buffer: complete \n");
+ }
+ if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
+ {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
+ {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+ post_command(OMX_CommandPortEnable, OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ }
+ if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
+ {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
+ {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+ m_out_bEnabled = OMX_TRUE;
+
+ OMX_LOGV("AllocBuf-->is_out_th_sleep=%d\n",is_out_th_sleep);
+ pthread_mutex_lock(&m_out_th_lock_1);
+ if (is_out_th_sleep)
+ {
+ is_out_th_sleep = false;
+ DEBUG_DETAIL("AllocBuf:WAKING UP OUT THREADS\n");
+ out_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_out_th_lock_1);
+ pthread_mutex_lock(&m_in_th_lock_1);
+ if(is_in_th_sleep)
+ {
+ is_in_th_sleep = false;
+ DEBUG_DETAIL("AB:WAKING UP IN THREADS\n");
+ in_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_in_th_lock_1);
+ post_command(OMX_CommandPortEnable, OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ }
+ }
+ OMX_LOGV("Allocate Buffer exit with ret Code %d\n", eRet);
+ return eRet;
+}
+
+/*=============================================================================
+FUNCTION:
+ use_buffer
+
+DESCRIPTION:
+ OMX Use Buffer method implementation.
+
+INPUT/OUTPUT PARAMETERS:
+ [INOUT] bufferHdr
+ [IN] hComp
+ [IN] port
+ [IN] appData
+ [IN] bytes
+ [IN] buffer
+
+RETURN VALUE:
+ OMX_ERRORTYPE
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+OMX_ERRORTYPE omx_g711_aenc::use_buffer
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+ if (OMX_CORE_INPUT_PORT_INDEX == port)
+ {
+ eRet = use_input_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
+
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX == port)
+ {
+ eRet = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer);
+ } else
+ {
+ OMX_LOGE("Error: Invalid Port Index received %d\n",(int)port);
+ eRet = OMX_ErrorBadPortIndex;
+ }
+
+ if (eRet == OMX_ErrorNone)
+ {
+ OMX_LOGV("Checking for Output Allocate buffer Done");
+ if (allocate_done())
+ {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
+ {
+ BITMASK_CLEAR(&m_flags, OMX_COMPONENT_IDLE_PENDING);
+ post_command(OMX_CommandStateSet,OMX_StateIdle,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ }
+ if (port == OMX_CORE_INPUT_PORT_INDEX && m_inp_bPopulated)
+ {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING))
+ {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING);
+ post_command(OMX_CommandPortEnable, OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+
+ }
+ }
+ if (port == OMX_CORE_OUTPUT_PORT_INDEX && m_out_bPopulated)
+ {
+ if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING))
+ {
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING);
+ post_command(OMX_CommandPortEnable, OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ pthread_mutex_lock(&m_out_th_lock_1);
+ if (is_out_th_sleep)
+ {
+ is_out_th_sleep = false;
+ DEBUG_DETAIL("UseBuf:WAKING UP OUT THREADS\n");
+ out_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_out_th_lock_1);
+ pthread_mutex_lock(&m_in_th_lock_1);
+ if(is_in_th_sleep)
+ {
+ is_in_th_sleep = false;
+ DEBUG_DETAIL("UB:WAKING UP IN THREADS\n");
+ in_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_in_th_lock_1);
+ }
+ }
+ }
+ OMX_LOGV("Use Buffer for port[%u] eRet[%d]\n", port,eRet);
+ return eRet;
+}
+/*=============================================================================
+FUNCTION:
+ use_input_buffer
+
+DESCRIPTION:
+ Helper function for Use buffer in the input pin
+
+INPUT/OUTPUT PARAMETERS:
+ [INOUT] bufferHdr
+ [IN] hComp
+ [IN] port
+ [IN] appData
+ [IN] bytes
+ [IN] buffer
+
+RETURN VALUE:
+ OMX_ERRORTYPE
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+OMX_ERRORTYPE omx_g711_aenc::use_input_buffer
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr;
+ unsigned nBufSize = MAX(bytes, input_buffer_size);
+ char *buf_ptr;
+
+ if(hComp == NULL)
+ {
+ port = port;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if(bytes < input_buffer_size)
+ {
+ /* return if i\p buffer size provided by client
+ is less than min i\p buffer size supported by omx component*/
+ return OMX_ErrorInsufficientResources;
+ }
+ if (m_inp_current_buf_count < m_inp_act_buf_count)
+ {
+ buf_ptr = (char *) calloc(sizeof(OMX_BUFFERHEADERTYPE), 1);
+
+ if (buf_ptr != NULL)
+ {
+ bufHdr = (OMX_BUFFERHEADERTYPE *) buf_ptr;
+ *bufferHdr = bufHdr;
+ memset(bufHdr,0,sizeof(OMX_BUFFERHEADERTYPE));
+
+ bufHdr->pBuffer = (OMX_U8 *)(buffer);
+ OMX_LOGV("use_input_buffer:bufHdr %p bufHdr->pBuffer %p \
+ bytes=%u", bufHdr, bufHdr->pBuffer,bytes);
+ bufHdr->nSize = (OMX_U32)sizeof(OMX_BUFFERHEADERTYPE);
+ bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
+ bufHdr->nAllocLen = nBufSize;
+ input_buffer_size = nBufSize;
+ bufHdr->pAppPrivate = appData;
+ bufHdr->nInputPortIndex = OMX_CORE_INPUT_PORT_INDEX;
+ bufHdr->nOffset = 0;
+ m_input_buf_hdrs.insert(bufHdr, NULL);
+ m_inp_current_buf_count++;
+ } else
+ {
+ OMX_LOGV("Input buffer memory allocation failed 1 \n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ } else
+ {
+ OMX_LOGV("Input buffer memory allocation failed\n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ return eRet;
+}
+
+/*=============================================================================
+FUNCTION:
+ use_output_buffer
+
+DESCRIPTION:
+ Helper function for Use buffer in the output pin
+
+INPUT/OUTPUT PARAMETERS:
+ [INOUT] bufferHdr
+ [IN] hComp
+ [IN] port
+ [IN] appData
+ [IN] bytes
+ [IN] buffer
+
+RETURN VALUE:
+ OMX_ERRORTYPE
+
+Dependency:
+ None
+
+SIDE EFFECTS:
+ None
+=============================================================================*/
+OMX_ERRORTYPE omx_g711_aenc::use_output_buffer
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ OMX_BUFFERHEADERTYPE *bufHdr;
+ unsigned nBufSize = MAX(bytes,output_buffer_size);
+ char *buf_ptr;
+
+ if(hComp == NULL)
+ {
+ port = port;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (bytes < output_buffer_size)
+ {
+ /* return if o\p buffer size provided by client
+ is less than min o\p buffer size supported by omx component*/
+ return OMX_ErrorInsufficientResources;
+ }
+
+ OMX_LOGV("Inside omx_g711_aenc::use_output_buffer");
+ if (m_out_current_buf_count < m_out_act_buf_count)
+ {
+
+ buf_ptr = (char *) calloc(sizeof(OMX_BUFFERHEADERTYPE), 1);
+
+ if (buf_ptr != NULL)
+ {
+ bufHdr = (OMX_BUFFERHEADERTYPE *) buf_ptr;
+ OMX_LOGV("BufHdr=%p buffer=%p\n",bufHdr,buffer);
+ *bufferHdr = bufHdr;
+ memset(bufHdr,0,sizeof(OMX_BUFFERHEADERTYPE));
+
+ bufHdr->pBuffer = (OMX_U8 *)(buffer);
+ OMX_LOGV("use_output_buffer:bufHdr %p bufHdr->pBuffer %p \
+ len=%u\n", bufHdr, bufHdr->pBuffer,bytes);
+ bufHdr->nSize = (OMX_U32)sizeof(OMX_BUFFERHEADERTYPE);
+ bufHdr->nVersion.nVersion = OMX_SPEC_VERSION;
+ bufHdr->nAllocLen = nBufSize;
+ output_buffer_size = nBufSize;
+ bufHdr->pAppPrivate = appData;
+ bufHdr->nOutputPortIndex = OMX_CORE_OUTPUT_PORT_INDEX;
+ bufHdr->nOffset = 0;
+ m_output_buf_hdrs.insert(bufHdr, NULL);
+ m_out_current_buf_count++;
+
+ } else
+ {
+ OMX_LOGV("Output buffer memory allocation failed\n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ } else
+ {
+ OMX_LOGV("Output buffer memory allocation failed 2\n");
+ eRet = OMX_ErrorInsufficientResources;
+ }
+ return eRet;
+}
+/**
+ @brief member function that searches for caller buffer
+
+ @param buffer pointer to buffer header
+ @return bool value indicating whether buffer is found
+ */
+bool omx_g711_aenc::search_input_bufhdr(OMX_BUFFERHEADERTYPE *buffer)
+{
+
+ bool eRet = false;
+ OMX_BUFFERHEADERTYPE *temp = NULL;
+
+ //access only in IL client context
+ temp = m_input_buf_hdrs.find_ele(buffer);
+ if (buffer && temp)
+ {
+ DEBUG_DETAIL("search_input_bufhdr %p \n", buffer);
+ eRet = true;
+ }
+ return eRet;
+}
+
+/**
+ @brief member function that searches for caller buffer
+
+ @param buffer pointer to buffer header
+ @return bool value indicating whether buffer is found
+ */
+bool omx_g711_aenc::search_output_bufhdr(OMX_BUFFERHEADERTYPE *buffer)
+{
+
+ bool eRet = false;
+ OMX_BUFFERHEADERTYPE *temp = NULL;
+
+ //access only in IL client context
+ temp = m_output_buf_hdrs.find_ele(buffer);
+ if (buffer && temp)
+ {
+ DEBUG_DETAIL("search_output_bufhdr %p \n", buffer);
+ eRet = true;
+ }
+ return eRet;
+}
+
+// Free Buffer - API call
+/**
+ @brief member function that handles free buffer command from IL client
+
+ This function is a block-call function that handles IL client request to
+ freeing the buffer
+
+ @param hComp handle to component instance
+ @param port id of port which holds the buffer
+ @param buffer buffer header
+ @return Error status
+*/
+OMX_ERRORTYPE omx_g711_aenc::free_buffer(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+ OMX_LOGV("Free_Buffer buf %p\n", buffer);
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_state == OMX_StateIdle &&
+ (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
+ {
+ OMX_LOGV(" free buffer while Component in Loading pending\n");
+ } else if ((m_inp_bEnabled == OMX_FALSE &&
+ port == OMX_CORE_INPUT_PORT_INDEX)||
+ (m_out_bEnabled == OMX_FALSE &&
+ port == OMX_CORE_OUTPUT_PORT_INDEX))
+ {
+ OMX_LOGV("Free Buffer while port %u disabled\n", port);
+ } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause)
+ {
+ OMX_LOGV("Invalid state to free buffer,ports need to be disabled:\
+ OMX_ErrorPortUnpopulated\n");
+ post_command(OMX_EventError,
+ OMX_ErrorPortUnpopulated,
+ OMX_COMPONENT_GENERATE_EVENT);
+
+ return eRet;
+ } else
+ {
+ OMX_LOGV("free_buffer: Invalid state to free buffer,ports need to be\
+ disabled:OMX_ErrorPortUnpopulated\n");
+ post_command(OMX_EventError,
+ OMX_ErrorPortUnpopulated,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ if (OMX_CORE_INPUT_PORT_INDEX == port)
+ {
+ if (m_inp_current_buf_count != 0)
+ {
+ m_inp_bPopulated = OMX_FALSE;
+ if (true == search_input_bufhdr(buffer))
+ {
+ /* Buffer exist */
+ //access only in IL client context
+ OMX_LOGV("Free_Buf:in_buffer[%p]\n",buffer);
+ m_input_buf_hdrs.erase(buffer);
+ free(buffer);
+ m_inp_current_buf_count--;
+ } else
+ {
+ OMX_LOGE("Free_Buf:Error-->free_buffer, \
+ Invalid Input buffer header\n");
+ eRet = OMX_ErrorBadParameter;
+ }
+ } else
+ {
+ OMX_LOGE("Error: free_buffer,Port Index calculation \
+ came out Invalid\n");
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING)
+ && release_done(0))
+ {
+ OMX_LOGV("INPUT PORT MOVING TO DISABLED STATE \n");
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING);
+ post_command(OMX_CommandPortDisable,
+ OMX_CORE_INPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+ }
+ } else if (OMX_CORE_OUTPUT_PORT_INDEX == port)
+ {
+ if (m_out_current_buf_count != 0)
+ {
+ m_out_bPopulated = OMX_FALSE;
+ if (true == search_output_bufhdr(buffer))
+ {
+ /* Buffer exist */
+ //access only in IL client context
+ OMX_LOGV("Free_Buf:out_buffer[%p]\n",buffer);
+ m_output_buf_hdrs.erase(buffer);
+ free(buffer);
+ m_out_current_buf_count--;
+ } else
+ {
+ OMX_LOGV("Free_Buf:Error-->free_buffer , \
+ Invalid Output buffer header\n");
+ eRet = OMX_ErrorBadParameter;
+ }
+ } else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ }
+
+ if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING)
+ && release_done(1))
+ {
+ OMX_LOGV("OUTPUT PORT MOVING TO DISABLED STATE \n");
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING);
+ post_command(OMX_CommandPortDisable,
+ OMX_CORE_OUTPUT_PORT_INDEX,
+ OMX_COMPONENT_GENERATE_EVENT);
+
+ }
+ } else
+ {
+ eRet = OMX_ErrorBadPortIndex;
+ }
+ if ((OMX_ErrorNone == eRet) &&
+ (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING)))
+ {
+ if (release_done(-1))
+ {
+ if(ioctl(m_drv_fd, AUDIO_STOP, 0) < 0)
+ OMX_LOGE("AUDIO STOP in free buffer failed\n");
+ else
+ OMX_LOGV("AUDIO STOP in free buffer passed\n");
+
+
+ OMX_LOGV("Free_Buf: Free buffer\n");
+
+
+ // Send the callback now
+ BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING);
+ OMX_LOGV("Before OMX_StateLoaded \
+ OMX_COMPONENT_GENERATE_EVENT\n");
+ post_command(OMX_CommandStateSet,
+ OMX_StateLoaded,OMX_COMPONENT_GENERATE_EVENT);
+ OMX_LOGV("After OMX_StateLoaded OMX_COMPONENT_GENERATE_EVENT\n");
+
+ }
+ }
+ return eRet;
+}
+
+
+/**
+ @brief member function that that handles empty this buffer command
+
+ This function meremly queue up the command and data would be consumed
+ in command server thread context
+
+ @param hComp handle to component instance
+ @param buffer pointer to buffer header
+ @return error status
+ */
+OMX_ERRORTYPE omx_g711_aenc::empty_this_buffer(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+
+ OMX_LOGV("ETB:Buf:%p Len %u TS %lld numInBuf=%d\n", \
+ buffer, buffer->nFilledLen, buffer->nTimeStamp, (nNumInputBuf));
+ if (m_state == OMX_StateInvalid)
+ {
+ OMX_LOGV("Empty this buffer in Invalid State\n");
+ return OMX_ErrorInvalidState;
+ }
+ if (!m_inp_bEnabled)
+ {
+ OMX_LOGV("empty_this_buffer OMX_ErrorIncorrectStateOperation "\
+ "Port Status %d \n", m_inp_bEnabled);
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ if (buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE))
+ {
+ OMX_LOGV("omx_g711_aenc::etb--> Buffer Size Invalid\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (buffer->nVersion.nVersion != OMX_SPEC_VERSION)
+ {
+ OMX_LOGV("omx_g711_aenc::etb--> OMX Version Invalid\n");
+ return OMX_ErrorVersionMismatch;
+ }
+
+ if (buffer->nInputPortIndex != OMX_CORE_INPUT_PORT_INDEX)
+ {
+ return OMX_ErrorBadPortIndex;
+ }
+ if ((m_state != OMX_StateExecuting) &&
+ (m_state != OMX_StatePause))
+ {
+ OMX_LOGE("Invalid state\n");
+ eRet = OMX_ErrorInvalidState;
+ }
+ if (OMX_ErrorNone == eRet)
+ {
+ if (search_input_bufhdr(buffer) == true)
+ {
+ post_input((unsigned long)hComp,
+ (unsigned long) buffer,OMX_COMPONENT_GENERATE_ETB);
+ } else
+ {
+ OMX_LOGE("Bad header %p \n", buffer);
+ eRet = OMX_ErrorBadParameter;
+ }
+ }
+ pthread_mutex_lock(&in_buf_count_lock);
+ nNumInputBuf++;
+ m_g711_pb_stats.etb_cnt++;
+ pthread_mutex_unlock(&in_buf_count_lock);
+ return eRet;
+}
+/**
+ @brief member function that writes data to kernel driver
+
+ @param hComp handle to component instance
+ @param buffer pointer to buffer header
+ @return error status
+ */
+OMX_ERRORTYPE omx_g711_aenc::empty_this_buffer_proxy
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_STATETYPE state;
+ META_IN meta_in;
+ //Pointer to the starting location of the data to be transcoded
+ OMX_U8 *srcStart;
+ //The total length of the data to be transcoded
+ srcStart = buffer->pBuffer;
+ OMX_U8 *data = NULL;
+ ssize_t bytes = 0;
+
+ PrintFrameHdr(OMX_COMPONENT_GENERATE_ETB,buffer);
+ memset(&meta_in,0,sizeof(meta_in));
+ if ( search_input_bufhdr(buffer) == false )
+ {
+ OMX_LOGV("ETBP: INVALID BUF HDR\n");
+ buffer_done_cb((OMX_BUFFERHEADERTYPE *)buffer);
+ return OMX_ErrorBadParameter;
+ }
+ if (m_tmp_meta_buf)
+ {
+ data = m_tmp_meta_buf;
+
+ // copy the metadata info from the BufHdr and insert to payload
+ meta_in.offsetVal = (OMX_U16)sizeof(META_IN);
+ meta_in.nTimeStamp.LowPart =
+ (unsigned int)((((OMX_BUFFERHEADERTYPE*)buffer)->nTimeStamp) & 0xFFFFFFFF);
+ meta_in.nTimeStamp.HighPart =
+ (unsigned int)(((((OMX_BUFFERHEADERTYPE*)buffer)->nTimeStamp) >> 32) & 0xFFFFFFFF);
+ meta_in.nFlags &= ~OMX_BUFFERFLAG_EOS;
+ if(buffer->nFlags & OMX_BUFFERFLAG_EOS)
+ {
+ OMX_LOGV("EOS OCCURED \n");
+ meta_in.nFlags |= OMX_BUFFERFLAG_EOS;
+ }
+ memcpy(data,&meta_in, meta_in.offsetVal);
+ OMX_LOGV("meta_in.nFlags = 0x%8x\n",meta_in.nFlags);
+ }
+
+ memcpy(&data[sizeof(META_IN)],buffer->pBuffer,buffer->nFilledLen);
+ bytes = write(m_drv_fd, data, buffer->nFilledLen+sizeof(META_IN));
+ if (bytes <= 0) {
+ frame_done_cb((OMX_BUFFERHEADERTYPE *)buffer);
+
+ if (errno == ENETRESET)
+ {
+ ALOGE("In SSR, return error to close the session");
+ m_cb.EventHandler(&m_cmp,
+ m_app_data,
+ OMX_EventError,
+ OMX_ErrorHardware,
+ 0, NULL );
+ }
+ return OMX_ErrorNone;
+ }
+
+ pthread_mutex_lock(&m_state_lock);
+ get_state(&m_cmp, &state);
+ pthread_mutex_unlock(&m_state_lock);
+
+ if (OMX_StateExecuting == state)
+ {
+ DEBUG_DETAIL("In Exe state, EBD CB");
+ buffer_done_cb((OMX_BUFFERHEADERTYPE *)buffer);
+ } else
+ {
+ /* Assume empty this buffer function has already checked
+ validity of buffer */
+ OMX_LOGV("Empty buffer %p to kernel driver\n", buffer);
+ post_input((unsigned long) & hComp,(unsigned long) buffer,
+ OMX_COMPONENT_GENERATE_BUFFER_DONE);
+ }
+ return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE omx_g711_aenc::fill_this_buffer_proxy
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_STATETYPE state;
+ ENC_META_OUT *meta_out = NULL;
+ ssize_t nReadbytes = 0;
+
+ pthread_mutex_lock(&m_state_lock);
+ get_state(&m_cmp, &state);
+ pthread_mutex_unlock(&m_state_lock);
+
+ if (true == search_output_bufhdr(buffer))
+ {
+ OMX_LOGV("\nBefore Read..m_drv_fd = %d,\n",m_drv_fd);
+ nReadbytes = read(m_drv_fd,buffer->pBuffer,output_buffer_size );
+ DEBUG_DETAIL("FTBP->Al_len[%lu]buf[%p]size[%d]numOutBuf[%d]\n",\
+ buffer->nAllocLen,buffer->pBuffer,
+ nReadbytes,nNumOutputBuf);
+ if (nReadbytes <= 0) {
+ buffer->nFilledLen = 0;
+ buffer->nOffset = 0;
+ buffer->nTimeStamp = nTimestamp;
+ frame_done_cb((OMX_BUFFERHEADERTYPE *)buffer);
+
+ if (errno == ENETRESET)
+ {
+ ALOGE("In SSR, return error to close the session");
+ m_cb.EventHandler(&m_cmp,
+ m_app_data,
+ OMX_EventError,
+ OMX_ErrorHardware,
+ 0, NULL );
+ }
+ return OMX_ErrorNone;
+ } else
+ OMX_LOGV("Read bytes %d\n",nReadbytes);
+
+ // Buffer from Driver will have
+ // 1 byte => Nr of frame field
+ // (sizeof(ENC_META_OUT) * Nr of frame) bytes => meta_out->offset_to_frame
+ // Frame Size * Nr of frame =>
+
+ meta_out = (ENC_META_OUT *)(buffer->pBuffer + sizeof(unsigned char));
+ buffer->nTimeStamp = (((OMX_TICKS)meta_out->msw_ts << 32)+
+ meta_out->lsw_ts);
+ buffer->nFlags |= meta_out->nflags;
+ buffer->nOffset = (OMX_U32) (meta_out->offset_to_frame +
+ sizeof(unsigned char));
+ buffer->nFilledLen = (OMX_U32)(nReadbytes - buffer->nOffset);
+ nTimestamp = buffer->nTimeStamp;
+ OMX_LOGV("nflags %d frame_size %d offset_to_frame %d \
+ timestamp %lld\n", meta_out->nflags,
+ meta_out->frame_size, meta_out->offset_to_frame,
+ buffer->nTimeStamp);
+
+ if ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS )
+ {
+ buffer->nFilledLen = 0;
+ buffer->nOffset = 0;
+ buffer->nTimeStamp = nTimestamp;
+ frame_done_cb((OMX_BUFFERHEADERTYPE *)buffer);
+ if ((buffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS )
+ {
+ OMX_LOGV("FTBP: Now, Send EOS flag to Client \n");
+ m_cb.EventHandler(&m_cmp,
+ m_app_data,
+ OMX_EventBufferFlag,
+ 1, 1, NULL );
+ }
+
+ return OMX_ErrorNone;
+ }
+ OMX_LOGV("nState %d \n",nState );
+
+ pthread_mutex_lock(&m_state_lock);
+ get_state(&m_cmp, &state);
+ pthread_mutex_unlock(&m_state_lock);
+
+ if (state == OMX_StatePause)
+ {
+ OMX_LOGV("FTBP:Post the FBD to event thread currstate=%d\n",\
+ state);
+ post_output((unsigned long) & hComp,(unsigned long) buffer,
+ OMX_COMPONENT_GENERATE_FRAME_DONE);
+ }
+ else
+ {
+ frame_done_cb((OMX_BUFFERHEADERTYPE *)buffer);
+
+ }
+
+ }
+ else
+ OMX_LOGV("\n FTBP-->Invalid buffer in FTB \n");
+
+
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::FillThisBuffer
+
+DESCRIPTION
+ IL client uses this method to release the frame buffer
+ after displaying them.
+
+
+
+PARAMETERS
+
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::fill_this_buffer
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ if (buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE))
+ {
+ OMX_LOGV("omx_g711_aenc::ftb--> Buffer Size Invalid\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (m_out_bEnabled == OMX_FALSE)
+ {
+ return OMX_ErrorIncorrectStateOperation;
+ }
+
+ if (buffer->nVersion.nVersion != OMX_SPEC_VERSION)
+ {
+ OMX_LOGV("omx_g711_aenc::ftb--> OMX Version Invalid\n");
+ return OMX_ErrorVersionMismatch;
+ }
+ if (buffer->nOutputPortIndex != OMX_CORE_OUTPUT_PORT_INDEX)
+ {
+ return OMX_ErrorBadPortIndex;
+ }
+ pthread_mutex_lock(&out_buf_count_lock);
+ nNumOutputBuf++;
+ m_g711_pb_stats.ftb_cnt++;
+ DEBUG_DETAIL("FTB:nNumOutputBuf is %d", nNumOutputBuf);
+ pthread_mutex_unlock(&out_buf_count_lock);
+ post_output((unsigned long)hComp,
+ (unsigned long) buffer,OMX_COMPONENT_GENERATE_FTB);
+ return eRet;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::SetCallbacks
+
+DESCRIPTION
+ Set the callbacks.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ OMX Error None if everything successful.
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::set_callbacks(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_CALLBACKTYPE* callbacks,
+ OMX_IN OMX_PTR appData)
+{
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ m_cb = *callbacks;
+ m_app_data = appData;
+
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::ComponentDeInit
+
+DESCRIPTION
+ Destroys the component and release memory allocated to the heap.
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ OMX Error None if everything successful.
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
+{
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (OMX_StateLoaded != m_state && OMX_StateInvalid != m_state)
+ {
+ OMX_LOGE("Warning: Rxed DeInit when not in LOADED state %d\n",
+ m_state);
+ }
+ deinit_encoder();
+
+OMX_LOGE("%s:COMPONENT DEINIT...\n", __FUNCTION__);
+ return OMX_ErrorNone;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::deinit_encoder
+
+DESCRIPTION
+ Closes all the threads and release memory allocated to the heap.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ None.
+
+========================================================================== */
+void omx_g711_aenc::deinit_encoder()
+{
+ OMX_LOGV("Component-deinit being processed\n");
+ OMX_LOGV("********************************\n");
+ OMX_LOGV("STATS: in-buf-len[%u]out-buf-len[%u] tot-pb-time[%lld]",\
+ m_g711_pb_stats.tot_in_buf_len,
+ m_g711_pb_stats.tot_out_buf_len,
+ m_g711_pb_stats.tot_pb_time);
+ OMX_LOGV("STATS: fbd-cnt[%u]ftb-cnt[%u]etb-cnt[%u]ebd-cnt[%u]",\
+ m_g711_pb_stats.fbd_cnt,m_g711_pb_stats.ftb_cnt,
+ m_g711_pb_stats.etb_cnt,
+ m_g711_pb_stats.ebd_cnt);
+ memset(&m_g711_pb_stats,0,sizeof(G711_PB_STATS));
+
+ if((OMX_StateLoaded != m_state) && (OMX_StateInvalid != m_state))
+ {
+ OMX_LOGE("%s,Deinit called in state[%d]\n",__FUNCTION__,\
+ m_state);
+ // Get back any buffers from driver
+ if(pcm_input)
+ execute_omx_flush(-1,false);
+ else
+ execute_omx_flush(1,false);
+ // force state change to loaded so that all threads can be exited
+ pthread_mutex_lock(&m_state_lock);
+ m_state = OMX_StateLoaded;
+ pthread_mutex_unlock(&m_state_lock);
+ OMX_LOGE("Freeing Buf:inp_current_buf_count[%d][%d]\n",\
+ m_inp_current_buf_count,
+ m_input_buf_hdrs.size());
+ m_input_buf_hdrs.eraseall();
+ OMX_LOGE("Freeing Buf:out_current_buf_count[%d][%d]\n",\
+ m_out_current_buf_count,
+ m_output_buf_hdrs.size());
+ m_output_buf_hdrs.eraseall();
+
+ }
+ if(pcm_input)
+ {
+ pthread_mutex_lock(&m_in_th_lock_1);
+ if (is_in_th_sleep)
+ {
+ is_in_th_sleep = false;
+ DEBUG_DETAIL("Deinit:WAKING UP IN THREADS\n");
+ in_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_in_th_lock_1);
+ }
+ pthread_mutex_lock(&m_out_th_lock_1);
+ if (is_out_th_sleep)
+ {
+ is_out_th_sleep = false;
+ DEBUG_DETAIL("SCP:WAKING UP OUT THREADS\n");
+ out_th_wakeup();
+ }
+ pthread_mutex_unlock(&m_out_th_lock_1);
+ if(pcm_input)
+ {
+ if (m_ipc_to_in_th != NULL)
+ {
+ omx_g711_thread_stop(m_ipc_to_in_th);
+ m_ipc_to_in_th = NULL;
+ }
+ }
+
+ if (m_ipc_to_cmd_th != NULL)
+ {
+ omx_g711_thread_stop(m_ipc_to_cmd_th);
+ m_ipc_to_cmd_th = NULL;
+ }
+ if (m_ipc_to_out_th != NULL)
+ {
+ DEBUG_DETAIL("Inside omx_g711_thread_stop\n");
+ omx_g711_thread_stop(m_ipc_to_out_th);
+ m_ipc_to_out_th = NULL;
+ }
+
+
+ if(ioctl(m_drv_fd, AUDIO_STOP, 0) <0)
+ OMX_LOGE("De-init: AUDIO_STOP FAILED\n");
+
+ if(pcm_input && m_tmp_meta_buf )
+ {
+ free(m_tmp_meta_buf);
+ }
+
+ if(m_tmp_out_meta_buf)
+ {
+ free(m_tmp_out_meta_buf);
+ }
+ nNumInputBuf = 0;
+ nNumOutputBuf = 0;
+ bFlushinprogress = 0;
+
+ m_inp_current_buf_count=0;
+ m_out_current_buf_count=0;
+ m_out_act_buf_count = 0;
+ m_inp_act_buf_count = 0;
+ m_inp_bEnabled = OMX_FALSE;
+ m_out_bEnabled = OMX_FALSE;
+ m_inp_bPopulated = OMX_FALSE;
+ m_out_bPopulated = OMX_FALSE;
+
+ if ( m_drv_fd >= 0 )
+ {
+ if(close(m_drv_fd) < 0)
+ OMX_LOGV("De-init: Driver Close Failed \n");
+ m_drv_fd = -1;
+ }
+ else
+ {
+ OMX_LOGE(" G711 device already closed\n");
+ }
+ m_comp_deinit=1;
+ m_is_out_th_sleep = 1;
+ m_is_in_th_sleep = 1;
+ OMX_LOGV("************************************\n");
+ OMX_LOGV(" DEINIT COMPLETED");
+ OMX_LOGV("************************************\n");
+
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::UseEGLImage
+
+DESCRIPTION
+ OMX Use EGL Image method implementation <TBD>.
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ Not Implemented error.
+
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::use_EGL_image
+(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN void* eglImage)
+{
+ OMX_LOGE("Error : use_EGL_image: Not Implemented \n");
+
+ if((hComp == NULL) || (appData == NULL) || (eglImage == NULL))
+ {
+ bufferHdr = bufferHdr;
+ port = port;
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ return OMX_ErrorNotImplemented;
+}
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::ComponentRoleEnum
+
+DESCRIPTION
+ OMX Component Role Enum method implementation.
+
+PARAMETERS
+ <TBD>.
+
+RETURN VALUE
+ OMX Error None if everything is successful.
+========================================================================== */
+OMX_ERRORTYPE omx_g711_aenc::component_role_enum(
+ OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_U8* role,
+ OMX_IN OMX_U32 index)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorNone;
+ const char *cmp_role = "audio_encoder.g711";
+
+ if(hComp == NULL)
+ {
+ OMX_LOGE("Returning OMX_ErrorBadParameter\n");
+ return OMX_ErrorBadParameter;
+ }
+ if (index == 0 && role)
+ {
+ memcpy(role, cmp_role, strlen(cmp_role));
+ *(((char *) role) + strlen(cmp_role) + 1) = '\0';
+ } else
+ {
+ eRet = OMX_ErrorNoMore;
+ }
+ return eRet;
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::AllocateDone
+
+DESCRIPTION
+ Checks if entire buffer pool is allocated by IL Client or not.
+ Need this to move to IDLE state.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false.
+
+========================================================================== */
+bool omx_g711_aenc::allocate_done(void)
+{
+ OMX_BOOL bRet = OMX_FALSE;
+ if (pcm_input==1)
+ {
+ if ((m_inp_act_buf_count == m_inp_current_buf_count)
+ &&(m_out_act_buf_count == m_out_current_buf_count))
+ {
+ bRet=OMX_TRUE;
+
+ }
+ if ((m_inp_act_buf_count == m_inp_current_buf_count) && m_inp_bEnabled )
+ {
+ m_inp_bPopulated = OMX_TRUE;
+ }
+
+ if ((m_out_act_buf_count == m_out_current_buf_count) && m_out_bEnabled )
+ {
+ m_out_bPopulated = OMX_TRUE;
+ }
+ } else if (pcm_input==0)
+ {
+ if (m_out_act_buf_count == m_out_current_buf_count)
+ {
+ bRet=OMX_TRUE;
+
+ }
+ if ((m_out_act_buf_count == m_out_current_buf_count) && m_out_bEnabled )
+ {
+ m_out_bPopulated = OMX_TRUE;
+ }
+
+ }
+ return bRet;
+}
+
+
+/* ======================================================================
+FUNCTION
+ omx_g711_aenc::ReleaseDone
+
+DESCRIPTION
+ Checks if IL client has released all the buffers.
+
+PARAMETERS
+ None.
+
+RETURN VALUE
+ true/false
+
+========================================================================== */
+bool omx_g711_aenc::release_done(OMX_U32 param1)
+{
+ OMX_LOGV("Inside omx_g711_aenc::release_done");
+ OMX_BOOL bRet = OMX_FALSE;
+
+ if (param1 == OMX_ALL)
+ {
+ if ((0 == m_inp_current_buf_count)&&(0 == m_out_current_buf_count))
+ {
+ bRet=OMX_TRUE;
+ }
+ } else if (param1 == OMX_CORE_INPUT_PORT_INDEX )
+ {
+ if ((0 == m_inp_current_buf_count))
+ {
+ bRet=OMX_TRUE;
+ }
+ } else if (param1 == OMX_CORE_OUTPUT_PORT_INDEX)
+ {
+ if ((0 == m_out_current_buf_count))
+ {
+ bRet=OMX_TRUE;
+ }
+ }
+ return bRet;
+}
diff --git a/mm-audio/aenc-g711/qdsp6/src/omx_log.cpp b/mm-audio/aenc-g711/qdsp6/src/omx_log.cpp
new file mode 100644
index 0000000..39498be
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/src/omx_log.cpp
@@ -0,0 +1,50 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2016 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.
+--------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <utils/Log.h>
+#include <cutils/properties.h>
+
+#include "omx_log.h"
+
+using namespace std;
+
+uint32_t gOmxLogLevel;
+
+void updateLogLevel() {
+ char level[PROPERTY_VALUE_MAX];
+#ifdef ANDROID
+ property_get("persist.debug.omx.logs.level", level, "0");
+ gOmxLogLevel = atoi(level);
+#else
+ gOmxLogLevel = atoi("0");
+#endif
+}
+
+
diff --git a/mm-audio/aenc-g711/qdsp6/test/omx_g711_enc_test.c b/mm-audio/aenc-g711/qdsp6/test/omx_g711_enc_test.c
new file mode 100644
index 0000000..54e80ea
--- /dev/null
+++ b/mm-audio/aenc-g711/qdsp6/test/omx_g711_enc_test.c
@@ -0,0 +1,1026 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2010, 2014, 2016, 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.
+--------------------------------------------------------------------------*/
+
+
+/*
+ An Open max test application ....
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include "OMX_Core.h"
+#include "OMX_Component.h"
+#include "pthread.h"
+#include <signal.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+#include<unistd.h>
+#include<string.h>
+#include <pthread.h>
+#include "QOMX_AudioExtensions.h"
+#include "QOMX_AudioIndexExtensions.h"
+#include <linux/ioctl.h>
+
+typedef unsigned char uint8;
+typedef unsigned char byte;
+typedef unsigned int uint32;
+typedef unsigned int uint16;
+
+QOMX_AUDIO_STREAM_INFO_DATA streaminfoparam;
+
+void Release_Encoder();
+
+#ifdef AUDIOV2
+unsigned short session_id;
+int device_id;
+int control = 0;
+const char *device="handset_tx";
+#define DIR_TX 2
+#endif
+
+#define MIN(A,B) (((A) < (B))?(A):(B))
+
+FILE *F1 = NULL;
+
+uint32_t channels = 1;
+uint32_t samplerate = 8000;
+uint32_t pcmplayback = 0;
+uint32_t tunnel = 0;
+uint32_t rectime = 0;
+uint32_t encode_format = 0;
+#define DEBUG_PRINT printf
+unsigned to_idle_transition = 0;
+
+
+/************************************************************************/
+/* #DEFINES */
+/************************************************************************/
+#define false 0
+#define true 1
+
+#define CONFIG_VERSION_SIZE(param) \
+ param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\
+ param.nSize = sizeof(param);
+
+#define FAILED(result) (result != OMX_ErrorNone)
+
+#define SUCCEEDED(result) (result == OMX_ErrorNone)
+
+/************************************************************************/
+/* GLOBAL DECLARATIONS */
+/************************************************************************/
+
+pthread_mutex_t lock;
+pthread_cond_t cond;
+pthread_mutex_t elock;
+pthread_cond_t econd;
+pthread_cond_t fcond;
+pthread_mutex_t etb_lock;
+pthread_mutex_t etb_lock1;
+pthread_cond_t etb_cond;
+FILE * inputBufferFile;
+FILE * outputBufferFile;
+OMX_PARAM_PORTDEFINITIONTYPE inputportFmt;
+OMX_PARAM_PORTDEFINITIONTYPE outputportFmt;
+OMX_AUDIO_PARAM_PCMMODETYPE pcmParams;
+OMX_PORT_PARAM_TYPE portParam;
+OMX_ERRORTYPE error;
+
+
+
+
+#define ID_RIFF 0x46464952
+#define ID_WAVE 0x45564157
+#define ID_FMT 0x20746d66
+#define ID_DATA 0x61746164
+#define ID_FACT 0x74636166
+
+#define FORMAT_PCM 0x0001
+#define FORMAT_ALAW 0x0006
+#define FORMAT_MULAW 0x0007
+
+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;
+};
+
+struct __attribute__((__packed__)) g711_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;
+ uint16_t extension_size;
+ uint32_t fact_id;
+ uint32_t fact_sz;
+ uint32_t sample_length;
+ uint32_t data_id;
+ uint32_t data_sz;
+};
+
+struct enc_meta_out{
+ unsigned int offset_to_frame;
+ unsigned int frame_size;
+ unsigned int encoded_pcm_samples;
+ unsigned int msw_ts;
+ unsigned int lsw_ts;
+ unsigned int nflags;
+} __attribute__ ((packed));
+
+static int totaldatalen = 0;
+
+static struct wav_header hdr;
+static struct g711_header g711hdr;
+/************************************************************************/
+/* GLOBAL INIT */
+/************************************************************************/
+
+unsigned int input_buf_cnt = 0;
+unsigned int output_buf_cnt = 0;
+int used_ip_buf_cnt = 0;
+volatile int event_is_done = 0;
+volatile int ebd_event_is_done = 0;
+volatile int fbd_event_is_done = 0;
+volatile int etb_event_is_done = 0;
+int ebd_cnt;
+int bInputEosReached = 0;
+int bOutputEosReached = 0;
+int bInputEosReached_tunnel = 0;
+static int etb_done = 0;
+int bFlushing = false;
+int bPause = false;
+const char *in_filename;
+const char *out_filename;
+
+int timeStampLfile = 0;
+int timestampInterval = 100;
+
+//* OMX Spec Version supported by the wrappers. Version = 1.1 */
+const OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101;
+OMX_COMPONENTTYPE* g711_enc_handle = 0;
+
+OMX_BUFFERHEADERTYPE **pInputBufHdrs = NULL;
+OMX_BUFFERHEADERTYPE **pOutputBufHdrs = NULL;
+
+/************************************************************************/
+/* GLOBAL FUNC DECL */
+/************************************************************************/
+int Init_Encoder(char*);
+int Play_Encoder();
+OMX_STRING aud_comp;
+/**************************************************************************/
+/* STATIC DECLARATIONS */
+/**************************************************************************/
+
+static int open_audio_file ();
+static int Read_Buffer(OMX_BUFFERHEADERTYPE *pBufHdr );
+static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *g711_enc_handle,
+ OMX_BUFFERHEADERTYPE ***pBufHdrs,
+ OMX_U32 nPortIndex,
+ unsigned int bufCntMin, unsigned int bufSize);
+
+
+static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_EVENTTYPE eEvent,
+ OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
+ OMX_IN OMX_PTR pEventData);
+static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+
+static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+static OMX_ERRORTYPE parse_pcm_header();
+static OMX_ERRORTYPE attach_g711_header();
+void wait_for_event(void)
+{
+ pthread_mutex_lock(&lock);
+ DEBUG_PRINT("%s: event_is_done=%d", __FUNCTION__, event_is_done);
+ while (event_is_done == 0) {
+ pthread_cond_wait(&cond, &lock);
+ }
+ event_is_done = 0;
+ pthread_mutex_unlock(&lock);
+}
+
+void event_complete(void )
+{
+ pthread_mutex_lock(&lock);
+ if (event_is_done == 0) {
+ event_is_done = 1;
+ pthread_cond_broadcast(&cond);
+ }
+ pthread_mutex_unlock(&lock);
+}
+
+void etb_wait_for_event(void)
+{
+ pthread_mutex_lock(&etb_lock1);
+ DEBUG_PRINT("%s: etb_event_is_done=%d", __FUNCTION__, etb_event_is_done);
+ while (etb_event_is_done == 0) {
+ pthread_cond_wait(&etb_cond, &etb_lock1);
+ }
+ etb_event_is_done = 0;
+ pthread_mutex_unlock(&etb_lock1);
+}
+
+void etb_event_complete(void )
+{
+ pthread_mutex_lock(&etb_lock1);
+ if (etb_event_is_done == 0) {
+ etb_event_is_done = 1;
+ pthread_cond_broadcast(&etb_cond);
+ }
+ pthread_mutex_unlock(&etb_lock1);
+}
+
+
+OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_EVENTTYPE eEvent,
+ OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2,
+ OMX_IN OMX_PTR pEventData)
+{
+ DEBUG_PRINT("Function %s \n", __FUNCTION__);
+ /* To remove warning for unused variable to keep prototype same */
+ (void)hComponent;
+ (void)pAppData;
+ (void)pEventData;
+
+ switch(eEvent) {
+ case OMX_EventCmdComplete:
+ DEBUG_PRINT("\n OMX_EventCmdComplete event=%d data1=%u data2=%u\n",(OMX_EVENTTYPE)eEvent,
+ nData1,nData2);
+ event_complete();
+ break;
+ case OMX_EventError:
+ DEBUG_PRINT("\n OMX_EventError \n");
+ break;
+ case OMX_EventBufferFlag:
+ DEBUG_PRINT("\n OMX_EventBufferFlag \n");
+ bOutputEosReached = true;
+ event_complete();
+ break;
+ case OMX_EventPortSettingsChanged:
+ DEBUG_PRINT("\n OMX_EventPortSettingsChanged \n");
+ break;
+ default:
+ DEBUG_PRINT("\n Unknown Event \n");
+ break;
+ }
+ return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
+{
+ size_t bytes_writen = 0;
+ size_t total_bytes_writen = 0;
+ size_t len = 0;
+ struct enc_meta_out *meta = NULL;
+ OMX_U8 *src = pBuffer->pBuffer;
+ unsigned int num_of_frames = 1;
+
+ /* To remove warning for unused variable to keep prototype same */
+ (void)pAppData;
+
+ if(((pBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+ DEBUG_PRINT("FBD::EOS on output port totaldatalen %d\n ", totaldatalen);
+ bOutputEosReached = true;
+ g711hdr.data_sz = (uint32_t)totaldatalen;
+ g711hdr.sample_length = (uint32_t)totaldatalen;
+ g711hdr.riff_sz = g711hdr.data_sz + sizeof(g711hdr) - 8;
+ fseek(outputBufferFile, 0, SEEK_SET);
+ fwrite(&g711hdr,1, sizeof(g711hdr), outputBufferFile);
+ fseek(outputBufferFile, 0, SEEK_END);
+ return OMX_ErrorNone;
+ }
+ if(bInputEosReached_tunnel || bOutputEosReached)
+ {
+ DEBUG_PRINT("EOS REACHED NO MORE PROCESSING OF BUFFERS\n");
+ return OMX_ErrorNone;
+ }
+ if(num_of_frames != src[0]){
+
+ printf("Data corrupt\n");
+ return OMX_ErrorNone;
+ }
+ /* Skip the first bytes */
+
+
+
+ src += sizeof(unsigned char);
+ meta = (struct enc_meta_out *)src;
+ while (num_of_frames > 0) {
+ meta = (struct enc_meta_out *)src;
+ len = meta->frame_size;
+ bytes_writen = fwrite(pBuffer->pBuffer + sizeof(unsigned char) + meta->offset_to_frame,1,len,outputBufferFile);
+ if(bytes_writen < len)
+ {
+ DEBUG_PRINT("error: invalid g711 encoded data \n");
+ return OMX_ErrorNone;
+ }
+ src += sizeof(struct enc_meta_out);
+ num_of_frames--;
+ total_bytes_writen += len;
+ }
+ DEBUG_PRINT(" FillBufferDone size writen to file %zu\n",total_bytes_writen);
+ totaldatalen = totaldatalen + (int)total_bytes_writen;
+
+ DEBUG_PRINT(" FBD calling FTB\n");
+ OMX_FillThisBuffer(hComponent,pBuffer);
+ return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent,
+ OMX_IN OMX_PTR pAppData,
+ OMX_IN OMX_BUFFERHEADERTYPE* pBuffer)
+{
+ int readBytes =0;
+
+ /* To remove warning for unused variable to keep prototype same */
+ (void)pAppData;
+
+ ebd_cnt++;
+ used_ip_buf_cnt--;
+ pthread_mutex_lock(&etb_lock);
+ if(!etb_done)
+ {
+ DEBUG_PRINT("\n*********************************************\n");
+ DEBUG_PRINT("Wait till first set of buffers are given to component\n");
+ DEBUG_PRINT("\n*********************************************\n");
+ etb_done++;
+ pthread_mutex_unlock(&etb_lock);
+ etb_wait_for_event();
+ }
+ else
+ {
+ pthread_mutex_unlock(&etb_lock);
+ }
+
+
+ if(bInputEosReached)
+ {
+ DEBUG_PRINT("\n*********************************************\n");
+ DEBUG_PRINT(" EBD::EOS on input port\n ");
+ DEBUG_PRINT("*********************************************\n");
+ return OMX_ErrorNone;
+ }else if (bFlushing == true) {
+ DEBUG_PRINT("omx_g711_aenc_test: bFlushing is set to TRUE used_ip_buf_cnt=%d\n",used_ip_buf_cnt);
+ if (used_ip_buf_cnt == 0) {
+ bFlushing = false;
+ } else {
+ DEBUG_PRINT("omx_g711_aenc_test: more buffer to come back used_ip_buf_cnt=%d\n",used_ip_buf_cnt);
+ return OMX_ErrorNone;
+ }
+ }
+
+ if((readBytes = Read_Buffer(pBuffer)) > 0) {
+ pBuffer->nFilledLen = (OMX_U32)readBytes;
+ used_ip_buf_cnt++;
+ OMX_EmptyThisBuffer(hComponent,pBuffer);
+ }
+ else{
+ pBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
+ used_ip_buf_cnt++;
+ bInputEosReached = true;
+ pBuffer->nFilledLen = 0;
+ OMX_EmptyThisBuffer(hComponent,pBuffer);
+ DEBUG_PRINT("EBD..Either EOS or Some Error while reading file\n");
+ }
+ return OMX_ErrorNone;
+}
+
+void signal_handler(int sig_id) {
+
+ /* Flush */
+ if (sig_id == SIGUSR1) {
+ DEBUG_PRINT("%s Initiate flushing\n", __FUNCTION__);
+ bFlushing = true;
+ OMX_SendCommand(g711_enc_handle, OMX_CommandFlush, OMX_ALL, NULL);
+ } else if (sig_id == SIGUSR2) {
+ if (bPause == true) {
+ DEBUG_PRINT("%s resume playback\n", __FUNCTION__);
+ bPause = false;
+ OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
+ } else {
+ DEBUG_PRINT("%s pause playback\n", __FUNCTION__);
+ bPause = true;
+ OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StatePause, NULL);
+ }
+ }
+}
+
+int main(int argc, char **argv)
+{
+ unsigned int bufCnt=0;
+ OMX_ERRORTYPE result;
+
+ struct sigaction sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = &signal_handler;
+ sigaction(SIGABRT, &sa, NULL);
+ sigaction(SIGUSR1, &sa, NULL);
+ sigaction(SIGUSR2, &sa, NULL);
+
+ (void) signal(SIGINT, Release_Encoder);
+
+ pthread_cond_init(&cond, 0);
+ pthread_mutex_init(&lock, 0);
+ pthread_cond_init(&etb_cond, 0);
+ pthread_mutex_init(&etb_lock, 0);
+ pthread_mutex_init(&etb_lock1, 0);
+
+ if (argc >= 5) {
+ in_filename = argv[1];
+ out_filename = argv[2];
+ encode_format = (uint32_t)atoi(argv[3]);
+ tunnel = (uint32_t)atoi(argv[4]);
+ rectime = (uint32_t)atoi(argv[5]);
+
+
+ DEBUG_PRINT("Input parameters: enocder format= %d, tunnel %d, rectime = %d\n",
+ encode_format, tunnel, rectime);
+
+ } else {
+ DEBUG_PRINT(" invalid format: \n");
+ DEBUG_PRINT("ex: ./mm-aenc-omxg711 INPUTFILE G711_OUTPUTFILE ENCODE_FORMAT TUNNEL RECORDTIME \n");
+ DEBUG_PRINT("ENCODE formats are : G711MLAW :0 , G711ALAW: 1");
+ DEBUG_PRINT("FOR TUNNEL MOD PASS INPUT FILE AS ZERO\n");
+ DEBUG_PRINT("RECORDTIME in seconds for AST Automation ...TUNNEL MODE ONLY\n");
+ return 0;
+ }
+ if(tunnel == 0) {
+ if(encode_format == 0) {
+ aud_comp = "OMX.qcom.audio.encoder.g711mlaw";
+ }
+ else {
+ aud_comp = "OMX.qcom.audio.encoder.g711alaw";
+ }
+ } else {
+ if(encode_format == 0) {
+ aud_comp = "OMX.qcom.audio.encoder.tunneled.g711mlaw";
+ }
+ else {
+ aud_comp = "OMX.qcom.audio.encoder.tunneled.g711alaw";
+ }
+ }
+ if(Init_Encoder(aud_comp)!= 0x00)
+ {
+ DEBUG_PRINT("Decoder Init failed\n");
+ return -1;
+ }
+
+ fcntl(0, F_SETFL, O_NONBLOCK);
+
+ if(Play_Encoder() != 0x00)
+ {
+ DEBUG_PRINT("Play_Decoder failed\n");
+ return -1;
+ }
+
+ // Wait till EOS is reached...
+ if(rectime && tunnel)
+ {
+ sleep(rectime);
+ rectime = 0;
+ bInputEosReached_tunnel = 1;
+ DEBUG_PRINT("\EOS ON INPUT PORT\n");
+ }
+ else
+ {
+ wait_for_event();
+ }
+
+ if((bInputEosReached_tunnel) || ((bOutputEosReached) && !tunnel))
+ {
+
+ DEBUG_PRINT("\nMoving the decoder to idle state \n");
+ OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0);
+ wait_for_event();
+ DEBUG_PRINT("\nMoving the encoder to loaded state \n");
+ OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateLoaded,0);
+ sleep(1);
+ if (!tunnel)
+ {
+ DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n");
+ for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) {
+ OMX_FreeBuffer(g711_enc_handle, 0, pInputBufHdrs[bufCnt]);
+ }
+ }
+
+ DEBUG_PRINT ("\nFillBufferDone: Deallocating o/p buffers \n");
+ for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) {
+ OMX_FreeBuffer(g711_enc_handle, 1, pOutputBufHdrs[bufCnt]);
+ }
+ wait_for_event();
+
+ result = OMX_FreeHandle(g711_enc_handle);
+ if (result != OMX_ErrorNone) {
+ DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result);
+ }
+ OMX_Deinit();
+ ebd_cnt=0;
+ bOutputEosReached = false;
+ bInputEosReached_tunnel = false;
+ bInputEosReached = 0;
+ g711_enc_handle = NULL;
+ pthread_cond_destroy(&cond);
+ pthread_mutex_destroy(&lock);
+ fclose(outputBufferFile);
+ DEBUG_PRINT("*****************************************\n");
+ DEBUG_PRINT("******...G711 ENC TEST COMPLETED...***************\n");
+ DEBUG_PRINT("*****************************************\n");
+ }
+ return 0;
+}
+
+void Release_Encoder()
+{
+ static int cnt=0;
+ OMX_ERRORTYPE result;
+
+ DEBUG_PRINT("END OF G711 ENCODING: EXITING PLEASE WAIT\n");
+ bInputEosReached_tunnel = 1;
+ event_complete();
+ cnt++;
+ if(cnt > 1)
+ {
+ /* FORCE RESET */
+ g711_enc_handle = NULL;
+ ebd_cnt=0;
+ bInputEosReached_tunnel = false;
+
+ result = OMX_FreeHandle(g711_enc_handle);
+ if (result != OMX_ErrorNone) {
+ DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result);
+ }
+
+ /* Deinit OpenMAX */
+
+ OMX_Deinit();
+
+ pthread_cond_destroy(&cond);
+ pthread_mutex_destroy(&lock);
+ DEBUG_PRINT("*****************************************\n");
+ DEBUG_PRINT("******...G711 ENC TEST COMPLETED...***************\n");
+ DEBUG_PRINT("*****************************************\n");
+ exit(0);
+ }
+}
+
+int Init_Encoder(OMX_STRING audio_component)
+{
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+ OMX_ERRORTYPE omxresult;
+ OMX_U32 total = 0;
+ typedef OMX_U8* OMX_U8_PTR;
+ char *role ="audio_encoder";
+
+ static OMX_CALLBACKTYPE call_back = {
+ &EventHandler,&EmptyBufferDone,&FillBufferDone
+ };
+
+ /* Init. the OpenMAX Core */
+ DEBUG_PRINT("\nInitializing OpenMAX Core....\n");
+ omxresult = OMX_Init();
+
+ if(OMX_ErrorNone != omxresult) {
+ DEBUG_PRINT("\n Failed to Init OpenMAX core");
+ return -1;
+ }
+ else {
+ DEBUG_PRINT("\nOpenMAX Core Init Done\n");
+ }
+
+ /* Query for audio decoders*/
+ DEBUG_PRINT("G711_test: Before entering OMX_GetComponentOfRole");
+ OMX_GetComponentsOfRole(role, &total, 0);
+ DEBUG_PRINT ("\nTotal components of role=%s :%u", role, total);
+
+
+ omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&g711_enc_handle),
+ (OMX_STRING)audio_component, NULL, &call_back);
+ if (FAILED(omxresult)) {
+ DEBUG_PRINT("\nFailed to Load the component:%s\n", audio_component);
+ return -1;
+ }
+ else
+ {
+ DEBUG_PRINT("\nComponent %s is in LOADED state\n", audio_component);
+ }
+
+ /* Get the port information */
+ CONFIG_VERSION_SIZE(portParam);
+ omxresult = OMX_GetParameter(g711_enc_handle, OMX_IndexParamAudioInit,
+ (OMX_PTR)&portParam);
+
+ if(FAILED(omxresult)) {
+ DEBUG_PRINT("\nFailed to get Port Param\n");
+ return -1;
+ }
+ else
+ {
+ DEBUG_PRINT("\nportParam.nPorts:%u\n", portParam.nPorts);
+ DEBUG_PRINT("\nportParam.nStartPortNumber:%u\n",
+ portParam.nStartPortNumber);
+ }
+ return 0;
+}
+
+int Play_Encoder()
+{
+ unsigned int i;
+ int Size=0;
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+ OMX_ERRORTYPE ret;
+ OMX_INDEXTYPE index;
+#ifdef __LP64__
+ DEBUG_PRINT("sizeof[%ld]\n", sizeof(OMX_BUFFERHEADERTYPE));
+#else
+ DEBUG_PRINT("sizeof[%d]\n", sizeof(OMX_BUFFERHEADERTYPE));
+#endif
+
+ /* open the i/p and o/p files based on the video file format passed */
+ if(open_audio_file()) {
+ DEBUG_PRINT("\n Returning -1");
+ return -1;
+ }
+
+ /* Query the encoder input min buf requirements */
+ CONFIG_VERSION_SIZE(inputportFmt);
+
+ /* Port for which the Client needs to obtain info */
+ inputportFmt.nPortIndex = portParam.nStartPortNumber;
+
+ OMX_GetParameter(g711_enc_handle,OMX_IndexParamPortDefinition,&inputportFmt);
+ DEBUG_PRINT ("\nEnc Input Buffer Count %u\n", inputportFmt.nBufferCountMin);
+ DEBUG_PRINT ("\nEnc: Input Buffer Size %u\n", inputportFmt.nBufferSize);
+
+ if(OMX_DirInput != inputportFmt.eDir) {
+ DEBUG_PRINT ("\nEnc: Expect Input Port\n");
+ return -1;
+ }
+
+ pcmParams.nPortIndex = 0;
+ pcmParams.nChannels = channels;
+ pcmParams.bInterleaved = OMX_TRUE;
+ pcmParams.nSamplingRate = samplerate;
+ OMX_SetParameter(g711_enc_handle,OMX_IndexParamAudioPcm,&pcmParams);
+
+
+ /* Query the encoder outport's min buf requirements */
+ CONFIG_VERSION_SIZE(outputportFmt);
+ /* Port for which the Client needs to obtain info */
+ outputportFmt.nPortIndex = portParam.nStartPortNumber + 1;
+
+ OMX_GetParameter(g711_enc_handle,OMX_IndexParamPortDefinition,&outputportFmt);
+ DEBUG_PRINT ("\nEnc: Output Buffer Count %u\n", outputportFmt.nBufferCountMin);
+ DEBUG_PRINT ("\nEnc: Output Buffer Size %u\n", outputportFmt.nBufferSize);
+
+ if(OMX_DirOutput != outputportFmt.eDir) {
+ DEBUG_PRINT ("\nEnc: Expect Output Port\n");
+ return -1;
+ }
+
+
+ CONFIG_VERSION_SIZE(pcmParams);
+
+
+ pcmParams.nPortIndex = 1;
+ pcmParams.nChannels = channels; //Only mono is supported
+ pcmParams.nSamplingRate = samplerate;
+ OMX_SetParameter(g711_enc_handle,OMX_IndexParamAudioPcm,&pcmParams);
+ OMX_GetExtensionIndex(g711_enc_handle,"OMX.Qualcomm.index.audio.sessionId",&index);
+ OMX_GetParameter(g711_enc_handle,index,&streaminfoparam);
+ DEBUG_PRINT ("\nOMX_SendCommand Encoder -> IDLE\n");
+ OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0);
+ /* wait_for_event(); should not wait here event complete status will
+ not come until enough buffer are allocated */
+ if (tunnel == 0)
+ {
+ input_buf_cnt = inputportFmt.nBufferCountActual; // inputportFmt.nBufferCountMin + 5;
+ DEBUG_PRINT("Transition to Idle State succesful...\n");
+ /* Allocate buffer on decoder's i/p port */
+ error = Allocate_Buffer(g711_enc_handle, &pInputBufHdrs, inputportFmt.nPortIndex,
+ input_buf_cnt, inputportFmt.nBufferSize);
+ if (error != OMX_ErrorNone || pInputBufHdrs == NULL) {
+ DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer error\n");
+ return -1;
+ }
+ else {
+ DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer success\n");
+ }
+ }
+ output_buf_cnt = outputportFmt.nBufferCountMin ;
+
+ /* Allocate buffer on encoder's O/Pp port */
+ error = Allocate_Buffer(g711_enc_handle, &pOutputBufHdrs, outputportFmt.nPortIndex,
+ output_buf_cnt, outputportFmt.nBufferSize);
+ if (error != OMX_ErrorNone || pOutputBufHdrs == NULL) {
+ DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer error\n");
+ return -1;
+ }
+ else {
+ DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer success\n");
+ }
+
+ wait_for_event();
+
+ if (tunnel == 1)
+ {
+ DEBUG_PRINT ("\nOMX_SendCommand to enable TUNNEL MODE during IDLE\n");
+ OMX_SendCommand(g711_enc_handle, OMX_CommandPortDisable,0,0); // disable input port
+ wait_for_event();
+ }
+
+ DEBUG_PRINT ("\nOMX_SendCommand encoder -> Executing\n");
+ OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateExecuting,0);
+ wait_for_event();
+
+ DEBUG_PRINT(" Start sending OMX_FILLthisbuffer\n");
+
+ attach_g711_header();
+
+ for(i=0; i < output_buf_cnt; i++) {
+ DEBUG_PRINT ("\nOMX_FillThisBuffer on output buf no.%d\n",i);
+ pOutputBufHdrs[i]->nOutputPortIndex = 1;
+ pOutputBufHdrs[i]->nFlags = pOutputBufHdrs[i]->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS;
+ ret = OMX_FillThisBuffer(g711_enc_handle, pOutputBufHdrs[i]);
+ if (OMX_ErrorNone != ret) {
+ DEBUG_PRINT("OMX_FillThisBuffer failed with result %d\n", ret);
+ }
+ else {
+ DEBUG_PRINT("OMX_FillThisBuffer success!\n");
+ }
+ }
+
+ if(tunnel == 0)
+ {
+ DEBUG_PRINT(" Start sending OMX_emptythisbuffer\n");
+ for (i = 0;i < input_buf_cnt;i++) {
+ DEBUG_PRINT ("\nOMX_EmptyThisBuffer on Input buf no.%d\n",i);
+ pInputBufHdrs[i]->nInputPortIndex = 0;
+ Size = Read_Buffer(pInputBufHdrs[i]);
+ if(Size <=0 ){
+ DEBUG_PRINT("NO DATA READ\n");
+ bInputEosReached = true;
+ pInputBufHdrs[i]->nFlags= OMX_BUFFERFLAG_EOS;
+ }
+ pInputBufHdrs[i]->nFilledLen = (OMX_U32)Size;
+ pInputBufHdrs[i]->nInputPortIndex = 0;
+ used_ip_buf_cnt++;
+ ret = OMX_EmptyThisBuffer(g711_enc_handle, pInputBufHdrs[i]);
+ if (OMX_ErrorNone != ret) {
+ DEBUG_PRINT("OMX_EmptyThisBuffer failed with result %d\n", ret);
+ }
+ else {
+ DEBUG_PRINT("OMX_EmptyThisBuffer success!\n");
+ }
+ if(Size <=0 ){
+ break;//eos reached
+ }
+ }
+ pthread_mutex_lock(&etb_lock);
+ if(etb_done)
+ {
+ DEBUG_PRINT("Component is waiting for EBD to be released.\n");
+ etb_event_complete();
+ }
+ else
+ {
+ DEBUG_PRINT("\n****************************\n");
+ DEBUG_PRINT("EBD not yet happened ...\n");
+ DEBUG_PRINT("\n****************************\n");
+ etb_done++;
+ }
+ pthread_mutex_unlock(&etb_lock);
+ }
+ return 0;
+}
+
+
+
+static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *avc_enc_handle,
+ OMX_BUFFERHEADERTYPE ***pBufHdrs,
+ OMX_U32 nPortIndex,
+ unsigned int bufCntMin, unsigned int bufSize)
+{
+ DEBUG_PRINT("Inside %s \n", __FUNCTION__);
+ OMX_ERRORTYPE error=OMX_ErrorNone;
+ unsigned int bufCnt=0;
+ /* To remove warning for unused variable to keep prototype same */
+ (void)avc_enc_handle;
+
+ *pBufHdrs= (OMX_BUFFERHEADERTYPE **)
+ malloc(sizeof(OMX_BUFFERHEADERTYPE*)*bufCntMin);
+
+ for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) {
+ DEBUG_PRINT("\n OMX_AllocateBuffer No %d \n", bufCnt);
+ error = OMX_AllocateBuffer(g711_enc_handle, &((*pBufHdrs)[bufCnt]),
+ nPortIndex, NULL, bufSize);
+ }
+ return error;
+}
+
+
+
+
+static int Read_Buffer (OMX_BUFFERHEADERTYPE *pBufHdr )
+{
+ size_t bytes_read=0;
+ pBufHdr->nFilledLen = 0;
+ pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS;
+
+ bytes_read = fread(pBufHdr->pBuffer, 1, pBufHdr->nAllocLen , inputBufferFile);
+
+ pBufHdr->nFilledLen = (OMX_U32)bytes_read;
+ if(bytes_read == 0)
+ {
+
+ pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS;
+ DEBUG_PRINT ("\nBytes read zero\n");
+ }
+ else
+ {
+ pBufHdr->nFlags = pBufHdr->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS;
+ }
+
+ return (int)bytes_read;
+}
+
+
+
+//In Encoder this Should Open a PCM or WAV file for input.
+
+static int open_audio_file ()
+{
+ int error_code = 0;
+
+ if (!tunnel)
+ {
+ DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename);
+ inputBufferFile = fopen (in_filename, "rb");
+ if (inputBufferFile == NULL) {
+ DEBUG_PRINT("\ni/p file %s could NOT be opened\n",
+ in_filename);
+ error_code = -1;
+ }
+ if(parse_pcm_header() != 0x00)
+ {
+ DEBUG_PRINT("PCM parser failed \n");
+ return -1;
+ }
+ }
+
+ DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, out_filename);
+ outputBufferFile = fopen (out_filename, "wb");
+ if (outputBufferFile == NULL) {
+ DEBUG_PRINT("\ni/p file %s could NOT be opened\n",
+ out_filename);
+ error_code = -1;
+ }
+ return error_code;
+}
+
+static OMX_ERRORTYPE attach_g711_header()
+{
+
+ memset(&g711hdr, 0, sizeof(struct g711_header));
+
+ g711hdr.riff_id = ID_RIFF;
+ g711hdr.riff_fmt = ID_WAVE;
+ g711hdr.fmt_id = ID_FMT;
+ g711hdr.fmt_sz = 18;
+
+ //change format type from wav to g711
+ if(encode_format == 0) {
+ g711hdr.audio_format = FORMAT_MULAW;
+ }
+ else {
+ g711hdr.audio_format = FORMAT_ALAW;
+ }
+
+ g711hdr.num_channels = hdr.num_channels;
+ g711hdr.sample_rate = hdr.sample_rate;
+ g711hdr.bits_per_sample = 8;
+ g711hdr.byte_rate = g711hdr.sample_rate * g711hdr.num_channels * (g711hdr.bits_per_sample / 8);
+ g711hdr.block_align = (uint16_t)((g711hdr.bits_per_sample / 8) * g711hdr.num_channels);
+ g711hdr.extension_size = 0;
+ g711hdr.fact_id = ID_FACT;
+ g711hdr.fact_sz = 4;
+ g711hdr.data_id = ID_DATA;
+ g711hdr.data_sz = 0;
+ g711hdr.riff_sz = g711hdr.data_sz + sizeof(g711hdr) - 8;
+
+ fwrite(&g711hdr,1, sizeof(g711hdr), outputBufferFile);
+
+ /*To Do : Attach Fact chunk for Non -PCM format */
+ return OMX_ErrorNone;
+}
+
+static OMX_ERRORTYPE parse_pcm_header()
+{
+
+ DEBUG_PRINT("\n***************************************************************\n");
+ if(fread(&hdr, 1, sizeof(hdr),inputBufferFile)!=sizeof(hdr))
+ {
+ DEBUG_PRINT("Wav file cannot read header\n");
+ return -1;
+ }
+
+ if ((hdr.riff_id != ID_RIFF) ||
+ (hdr.riff_fmt != ID_WAVE)||
+ (hdr.fmt_id != ID_FMT))
+ {
+ DEBUG_PRINT("Wav file is not a riff/wave file\n");
+ return -1;
+ }
+
+ if (hdr.audio_format != FORMAT_PCM)
+ {
+ DEBUG_PRINT("Wav file is not pcm format %d and fmt size is %d\n",
+ hdr.audio_format, hdr.fmt_sz);
+ return -1;
+ }
+
+ if ((hdr.sample_rate != 8000) && (hdr.sample_rate != 16000)) {
+ DEBUG_PRINT("samplerate = %d, not supported, Supported "
+ "samplerates are 8000, 16000", samplerate);
+ return -1;
+ }
+
+ if (hdr.num_channels != 1) {
+ DEBUG_PRINT("stereo and multi channel are not supported, channels %d"
+ , hdr.num_channels);
+ return -1;
+ }
+
+ DEBUG_PRINT("Samplerate is %d\n", hdr.sample_rate);
+ DEBUG_PRINT("Channel Count is %d\n", hdr.num_channels);
+ DEBUG_PRINT("\n***************************************************************\n");
+
+ samplerate = hdr.sample_rate;
+ channels = hdr.num_channels;
+
+ return OMX_ErrorNone;
+}
diff --git a/policy_hal/Android.mk b/policy_hal/Android.mk
index 854eaee..f9913c4 100644
--- a/policy_hal/Android.mk
+++ b/policy_hal/Android.mk
@@ -1,3 +1,16 @@
+# This file was modified by Dolby Laboratories, Inc. The portions of the
+# code that are surrounded by "DOLBY..." are copyrighted and
+# licensed separately, as follows:
+#
+# (C) 2016 Dolby Laboratories, Inc.
+# All rights reserved.
+#
+# This program is protected under international and U.S. Copyright laws as
+# an unpublished work. This program is confidential and proprietary to the
+# copyright owners. Reproduction or disclosure, in whole or in part, or the
+# production of derivative works therefrom without the express permission of
+# the copyright owners is prohibited.
+#
ifneq ($(USE_LEGACY_AUDIO_POLICY), 1)
ifeq ($(USE_CUSTOM_AUDIO_POLICY), 1)
LOCAL_PATH := $(call my-dir)
@@ -64,6 +77,11 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_FM_POWER_OPT)),true)
LOCAL_CFLAGS += -DFM_POWER_OPT
endif
+# DOLBY_START
+ifeq ($(strip $(DOLBY_ENABLE)),true)
+LOCAL_CFLAGS += $(dolby_cflags)
+endif
+# DOLBY_END
ifeq ($(USE_XML_AUDIO_POLICY_CONF), 1)
LOCAL_CFLAGS += -DUSE_XML_AUDIO_POLICY_CONF
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index 9b950d9..089efc5 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -435,6 +435,48 @@
return BAD_VALUE;
}
+bool AudioPolicyManagerCustom::isInvalidationOfMusicStreamNeeded(routing_strategy strategy)
+{
+ if (strategy == STRATEGY_MEDIA) {
+ for (size_t i = 0; i < mOutputs.size(); i++) {
+ sp<SwAudioOutputDescriptor> newOutputDesc = mOutputs.valueAt(i);
+ if (newOutputDesc->mFormat == AUDIO_FORMAT_DSD)
+ return false;
+ }
+ }
+ return true;
+}
+
+void AudioPolicyManagerCustom::checkOutputForStrategy(routing_strategy strategy)
+{
+ audio_devices_t oldDevice = getDeviceForStrategy(strategy, true /*fromCache*/);
+ audio_devices_t newDevice = getDeviceForStrategy(strategy, false /*fromCache*/);
+ SortedVector<audio_io_handle_t> srcOutputs = getOutputsForDevice(oldDevice, mOutputs);
+ SortedVector<audio_io_handle_t> dstOutputs = getOutputsForDevice(newDevice, mOutputs);
+
+ // also take into account external policy-related changes: add all outputs which are
+ // associated with policies in the "before" and "after" output vectors
+ ALOGV("checkOutputForStrategy(): policy related outputs");
+ for (size_t i = 0 ; i < mPreviousOutputs.size() ; i++) {
+ const sp<SwAudioOutputDescriptor> desc = mPreviousOutputs.valueAt(i);
+ if (desc != 0 && desc->mPolicyMix != NULL) {
+ srcOutputs.add(desc->mIoHandle);
+ ALOGV(" previous outputs: adding %d", desc->mIoHandle);
+ }
+ }
+ for (size_t i = 0 ; i < mOutputs.size() ; i++) {
+ const sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
+ if (desc != 0 && desc->mPolicyMix != NULL) {
+ dstOutputs.add(desc->mIoHandle);
+ ALOGV(" new outputs: adding %d", desc->mIoHandle);
+ }
+ }
+
+ if (!vectorsEqual(srcOutputs,dstOutputs) && isInvalidationOfMusicStreamNeeded(strategy)) {
+ AudioPolicyManager::checkOutputForStrategy(strategy);
+ }
+}
+
// This function checks for the parameters which can be offloaded.
// This can be enhanced depending on the capability of the DSP and policy
// of the system.
@@ -464,6 +506,11 @@
}
}
#endif
+ if (property_get_bool("voice.dsd.playback.conc.disabled", true) &&
+ isInCall() && (offloadInfo.format == AUDIO_FORMAT_DSD)) {
+ ALOGD("blocking DSD compress offload on call mode");
+ return false;
+ }
#ifdef RECORD_PLAY_CONCURRENCY
char recConcPropValue[PROPERTY_VALUE_MAX];
bool prop_rec_play_enabled = false;
@@ -846,6 +893,26 @@
}
#endif
+
+ sp<SwAudioOutputDescriptor> outputDesc = NULL;
+ for (size_t i = 0; i < mOutputs.size(); i++) {
+ outputDesc = mOutputs.valueAt(i);
+ if ((outputDesc == NULL) || (outputDesc->mProfile == NULL)) {
+ ALOGD("voice_conc:ouput desc / profile is NULL");
+ continue;
+ }
+
+ if (property_get_bool("voice.dsd.playback.conc.disabled", true) &&
+ (outputDesc->mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
+ (outputDesc->mFormat == AUDIO_FORMAT_DSD)) {
+ ALOGD("voice_conc:calling closeOutput on call mode for DSD COMPRESS output");
+ closeOutput(mOutputs.keyAt(i));
+ // call invalidate for music, so that DSD compress will fallback to deep-buffer.
+ mpClientInterface->invalidateStream(AUDIO_STREAM_MUSIC);
+ }
+
+ }
+
#ifdef RECORD_PLAY_CONCURRENCY
char recConcPropValue[PROPERTY_VALUE_MAX];
bool prop_rec_play_enabled = false;
@@ -1338,17 +1405,34 @@
return false;
}
-bool static isDirectPCMEnabled(int bitWidth)
+bool static tryForDirectPCM(int bitWidth, audio_output_flags_t *flags)
{
- bool directPCMEnabled = false;
- if (bitWidth == 24 || bitWidth == 32)
- directPCMEnabled =
- property_get_bool("audio.offload.pcm.24bit.enable", false);
- else
- directPCMEnabled =
- property_get_bool("audio.offload.pcm.16bit.enable", false);
+ bool playerDirectPCM = false; // Output request for Track created by mediaplayer
+ bool trackDirectPCM = false; // Output request for track created by other apps
- return directPCMEnabled;
+ // Direct PCM is allowed only if
+ // In case of mediaPlayer playback
+ // 16 bit direct pcm or 24bit direct PCM property is set and
+ // the FLAG requested is DIRECT_PCM ( NuPlayer case) or
+ // In case of AudioTracks created by apps
+ // track offload is enabled and FLAG requested is FLAG_NONE.
+
+ if (*flags == AUDIO_OUTPUT_FLAG_DIRECT_PCM) {
+ if (bitWidth == 24 || bitWidth == 32)
+ playerDirectPCM =
+ property_get_bool("audio.offload.pcm.24bit.enable", false);
+ else
+ playerDirectPCM =
+ property_get_bool("audio.offload.pcm.16bit.enable", false);
+ // Reset flag to NONE so that we can still reuse direct pcm criteria check
+ // in getOutputforDevice
+ *flags = AUDIO_OUTPUT_FLAG_NONE;
+ } else if ( *flags == AUDIO_OUTPUT_FLAG_NONE) {
+ trackDirectPCM = property_get_bool("audio.offload.track.enable", true);
+ }
+
+ ALOGI("%s for Direct PCM",trackDirectPCM || playerDirectPCM?"Check":"Dont check");
+ return trackDirectPCM || playerDirectPCM;
}
status_t AudioPolicyManagerCustom::getOutputForAttr(const audio_attributes_t *attr,
@@ -1373,8 +1457,7 @@
}
if (!offloadDisabled && (offloadInfo == NULL) &&
- isDirectPCMEnabled(bitWidth) &&
- (flags == AUDIO_OUTPUT_FLAG_NONE)) {
+ tryForDirectPCM(bitWidth, &flags)) {
tOffloadInfo.sample_rate = samplingRate;
tOffloadInfo.channel_mask = channelMask;
@@ -2164,40 +2247,6 @@
ALOGD("USE_XML_AUDIO_POLICY_CONF is FALSE");
#endif
- //TODO: Check the new logic to parse policy conf and update the below code
- // Need this when SSR encoding is enabled
- char ssr_enabled[PROPERTY_VALUE_MAX] = {0};
- bool prop_ssr_enabled = false;
-
- if (property_get("ro.qc.sdk.audio.ssr", ssr_enabled, NULL)) {
- prop_ssr_enabled = atoi(ssr_enabled) || !strncmp("true", ssr_enabled, 4);
- }
-
- for (size_t i = 0; i < mHwModules.size(); i++) {
- ALOGV("Hw module %zu", i);
- for (size_t j = 0; j < mHwModules[i]->mInputProfiles.size(); j++) {
- const sp<IOProfile> inProfile = mHwModules[i]->mInputProfiles[j];
- AudioProfileVector profiles = inProfile->getAudioProfiles();
- for (size_t k = 0; k < profiles.size(); k++){
- ChannelsVector channels = profiles[k]->getChannels();
- for (size_t x = 0; x < channels.size(); x++) {
- audio_channel_mask_t channelMask = channels[x];
- ALOGV("Channel Mask %x size %zu", channelMask,
- channels.size());
- if (AUDIO_CHANNEL_IN_5POINT1 == channelMask) {
- if (!prop_ssr_enabled) {
- ALOGI("removing AUDIO_CHANNEL_IN_5POINT1 from"
- " input profile as SSR(surround sound record)"
- " is not supported on this chipset variant");
- channels.removeItemsAt(x, 1);
- ALOGV("Channel Mask size now %zu",
- channels.size());
- }
- }
- }
- }
- }
- }
#ifdef RECORD_PLAY_CONCURRENCY
mIsInputRequestOnProgress = false;
#endif
diff --git a/policy_hal/AudioPolicyManager.h b/policy_hal/AudioPolicyManager.h
index deef57d..00da599 100644
--- a/policy_hal/AudioPolicyManager.h
+++ b/policy_hal/AudioPolicyManager.h
@@ -96,6 +96,14 @@
// see getDeviceForStrategy() for the use of fromCache parameter
audio_devices_t getNewOutputDevice(const sp<AudioOutputDescriptor>& outputDesc,
bool fromCache);
+
+ // avoid invalidation for active music stream on previous outputs
+ // which is supported on the new device.
+ bool isInvalidationOfMusicStreamNeeded(routing_strategy strategy);
+
+ // Must be called before updateDevicesAndOutputs()
+ void checkOutputForStrategy(routing_strategy strategy);
+
// returns true if given output is direct output
bool isDirectOutput(audio_io_handle_t output);
diff --git a/post_proc/volume_listener.c b/post_proc/volume_listener.c
index e1dd026..7b60248 100644
--- a/post_proc/volume_listener.c
+++ b/post_proc/volume_listener.c
@@ -697,24 +697,31 @@
struct listnode *node = NULL;
vol_listener_context_t *context = NULL;
vol_listener_context_t *recv_contex = (vol_listener_context_t *)handle;
- int status = -1;
+ int status = -EINVAL;
bool recompute_flag = false;
int active_stream_count = 0;
+ uint32_t session_id;
+ uint32_t stream_type;
+ effect_uuid_t uuid;
+
ALOGV("%s context %p", __func__, handle);
- if (recv_contex == NULL || recv_contex->desc == NULL) {
- ALOGE("%s: Got invalid handle while release, DO NOTHING ", __func__);
+
+ if (recv_contex == NULL) {
return status;
}
-
pthread_mutex_lock(&vol_listner_init_lock);
+ session_id = recv_contex->session_id;
+ stream_type = recv_contex->stream_type;
+ uuid = recv_contex->desc->uuid;
// check if the handle/context provided is valid
list_for_each(node, &vol_effect_list) {
context = node_to_item(node, struct vol_listener_context_s, effect_list_node);
- if ((memcmp(&(context->desc->uuid), &(recv_contex->desc->uuid), sizeof(effect_uuid_t)) == 0)
- && (context->session_id == recv_contex->session_id)
- && (context->stream_type == recv_contex->stream_type)) {
+ if ((memcmp(&(context->desc->uuid), &uuid, sizeof(effect_uuid_t)) == 0)
+ && (context->session_id == session_id)
+ && (context->stream_type == stream_type)) {
ALOGV("--- Found something to remove ---");
+ list_remove(node);
PRINT_STREAM_TYPE(context->stream_type);
if (context->dev_id == AUDIO_DEVICE_OUT_SPEAKER) {
recompute_flag = true;
@@ -730,6 +737,8 @@
if (status != 0) {
ALOGE("something wrong ... <<<--- Found NOTHING to remove ... ???? --->>>>>");
+ pthread_mutex_unlock(&vol_listner_init_lock);
+ return status;
}
// if there are no active streams, reset cal and volume level
diff --git a/qahw_api/Android.mk b/qahw_api/Android.mk
new file mode 100644
index 0000000..8c99c5b
--- /dev/null
+++ b/qahw_api/Android.mk
@@ -0,0 +1,32 @@
+ifeq ($(strip $(BOARD_SUPPORTS_QAHW)),true)
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+libqahw-inc := $(LOCAL_PATH)/inc
+
+LOCAL_MODULE := libqahw
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_OWNER := qti
+LOCAL_C_INCLUDES := $(libqahw-inc)
+
+LOCAL_SRC_FILES := \
+ src/qahw.c
+
+LOCAL_SHARED_LIBRARIES := \
+ liblog \
+ libcutils \
+ libhardware
+
+LOCAL_COPY_HEADERS_TO := mm-audio/qahw_api/inc
+LOCAL_COPY_HEADERS := inc/qahw_api.h
+LOCAL_COPY_HEADERS += inc/qahw_defs.h
+
+LOCAL_PRELINK_MODULE := false
+
+include $(BUILD_SHARED_LIBRARY)
+
+#test app compilation
+include $(LOCAL_PATH)/test/Android.mk
+endif
diff --git a/qahw_api/inc/qahw_api.h b/qahw_api/inc/qahw_api.h
new file mode 100644
index 0000000..17f6f5f
--- /dev/null
+++ b/qahw_api/inc/qahw_api.h
@@ -0,0 +1,420 @@
+/*
+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Copyright (C) 2011 The Android Open Source Project *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef QTI_AUDIO_HAL_API_H
+#define QTI_AUDIO_HAL_API_H
+
+#include <stdint.h>
+#include <strings.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <cutils/bitops.h>
+#include <system/audio.h>
+#include "qahw_defs.h"
+
+__BEGIN_DECLS
+/*
+ * Helper macros for module implementors.
+ *
+ * The derived modules should provide convenience macros for supported
+ * versions so that implementations can explicitly specify module
+ * versions at definition time.
+ */
+
+#define QAHW_MAKE_API_VERSION(maj,min) \
+ ((((maj) & 0xff) << 8) | ((min) & 0xff))
+
+/* First generation of audio devices had version hardcoded to 0. all devices with
+ * versions < 1.0 will be considered of first generation API.
+ */
+#define QAHW_MODULE_API_VERSION_0_0 QAHW_MAKE_API_VERSION(0, 0)
+
+/* Minimal QTI audio HAL version supported by the audio framework */
+#define QAHW_MODULE_API_VERSION_MIN QAHW_MODULE_API_VERSION_0_0
+
+/**
+ * List of known audio HAL modules. This is the base name of the audio HAL
+ * library composed of the "audio." prefix, one of the base names below and
+ * a suffix specific to the device.
+ * e.g: audio.primary.goldfish.so or audio.a2dp.default.so
+ */
+
+#define QAHW_MODULE_ID_PRIMARY "audio.primary"
+#define QAHW_MODULE_ID_A2DP "audio.a2dp"
+#define QAHW_MODULE_ID_USB "audio.usb"
+
+typedef void qahw_module_handle_t;
+typedef void qahw_stream_handle_t;
+
+/**************************************/
+/* Output stream specific APIs **/
+
+/*
+ * This method creates and opens the audio hardware output stream.
+ * The "address" parameter qualifies the "devices" audio device type if needed.
+ * The format format depends on the device type:
+ * - Bluetooth devices use the MAC address of the device in the form "00:11:22:AA:BB:CC"
+ * - USB devices use the ALSA card and device numbers in the form "card=X;device=Y"
+ * - Other devices may use a number or any other string.
+ */
+
+int qahw_open_output_stream(qahw_module_handle_t *hw_module,
+ audio_io_handle_t handle,
+ audio_devices_t devices,
+ audio_output_flags_t flags,
+ struct audio_config *config,
+ qahw_stream_handle_t **out_handle,
+ const char *address);
+
+int qahw_close_output_stream(qahw_stream_handle_t *out_handle);
+
+
+/*
+ * Return the sampling rate in Hz - eg. 44100.
+ */
+uint32_t qahw_out_get_sample_rate(const qahw_stream_handle_t *stream);
+
+/*
+ * use set_parameters with key QAHW_PARAMETER_STREAM_SAMPLING_RATE
+ */
+int qahw_out_set_sample_rate(qahw_stream_handle_t *stream, uint32_t rate);
+
+/*
+ * Return size of input/output buffer in bytes for this stream - eg. 4800.
+ * It should be a multiple of the frame size. See also get_input_buffer_size.
+ */
+size_t qahw_out_get_buffer_size(const qahw_stream_handle_t *stream);
+
+/*
+ * Return the channel mask -
+ * e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
+ */
+audio_channel_mask_t qahw_out_get_channels(const qahw_stream_handle_t *stream);
+
+/*
+ * Return the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
+ */
+audio_format_t qahw_out_get_format(const qahw_stream_handle_t *stream);
+
+/*
+ * Put the audio hardware input/output into standby mode.
+ * Driver should exit from standby mode at the next I/O operation.
+ * Returns 0 on success and <0 on failure.
+ */
+int qahw_out_standby(qahw_stream_handle_t *stream);
+
+/*
+ * set/get audio stream parameters. The function accepts a list of
+ * parameter key value pairs in the form: key1=value1;key2=value2;...
+ *
+ * Some keys are reserved for standard parameters (See AudioParameter class)
+ *
+ * If the implementation does not accept a parameter change while
+ * the output is active but the parameter is acceptable otherwise, it must
+ * return -ENOSYS.
+ *
+ * The audio flinger will put the stream in standby and then change the
+ * parameter value.
+ */
+int qahw_out_set_parameters(qahw_stream_handle_t *stream, const char*kv_pairs);
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char* qahw_out_get_parameters(const qahw_stream_handle_t *stream,
+ const char *keys);
+
+/*
+ * Return the audio hardware driver estimated latency in milliseconds.
+ */
+uint32_t qahw_out_get_latency(const qahw_stream_handle_t *stream);
+
+/*
+ * Use this method in situations where audio mixing is done in the
+ * hardware. This method serves as a direct interface with hardware,
+ * allowing you to directly set the volume as apposed to via the framework.
+ * This method might produce multiple PCM outputs or hardware accelerated
+ * codecs, such as MP3 or AAC.
+ */
+int qahw_out_set_volume(qahw_stream_handle_t *stream, float left, float right);
+
+/*
+ * Write audio buffer present in meta_data starting from offset
+ * along with timestamp to driver. Returns number of bytes
+ * written or a negative status_t. If at least one frame was written successfully
+ * prior to the error, it is suggested that the driver return that successful
+ * (short) byte count and then return an error in the subsequent call.
+ * timestamp is only sent driver is session has been opened with timestamp flag
+ * otherwise its ignored.
+ *
+ * If set_callback() has previously been called to enable non-blocking mode
+ * the write() is not allowed to block. It must write only the number of
+ * bytes that currently fit in the driver/hardware buffer and then return
+ * this byte count. If this is less than the requested write size the
+ * callback function must be called when more space is available in the
+ * driver/hardware buffer.
+ */
+ssize_t qahw_out_write(qahw_stream_handle_t *stream,
+ qahw_out_buffer_t *out_buf);
+
+/*
+ * return the number of audio frames written by the audio dsp to DAC since
+ * the output has exited standby
+ */
+int qahw_out_get_render_position(const qahw_stream_handle_t *stream,
+ uint32_t *dsp_frames);
+
+/*
+ * set the callback function for notifying completion of non-blocking
+ * write and drain.
+ * Calling this function implies that all future rite() and drain()
+ * must be non-blocking and use the callback to signal completion.
+ */
+int qahw_out_set_callback(qahw_stream_handle_t *stream,
+ qahw_stream_callback_t callback,
+ void *cookie);
+
+/*
+ * Notifies to the audio driver to stop playback however the queued buffers are
+ * retained by the hardware. Useful for implementing pause/resume. Empty implementation
+ * if not supported however should be implemented for hardware with non-trivial
+ * latency. In the pause state audio hardware could still be using power. User may
+ * consider calling suspend after a timeout.
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_pause(qahw_stream_handle_t *out_handle);
+
+/*
+ * Notifies to the audio driver to resume playback following a pause.
+ * Returns error if called without matching pause.
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_resume(qahw_stream_handle_t *out_handle);
+
+/*
+ * Requests notification when data buffered by the driver/hardware has
+ * been played. If set_callback() has previously been called to enable
+ * non-blocking mode, the drain() must not block, instead it should return
+ * quickly and completion of the drain is notified through the callback.
+ * If set_callback() has not been called, the drain() must block until
+ * completion.
+ * If type==AUDIO_DRAIN_ALL, the drain completes when all previously written
+ * data has been played.
+ * If type==AUDIO_DRAIN_EARLY_NOTIFY, the drain completes shortly before all
+ * data for the current track has played to allow time for the framework
+ * to perform a gapless track switch.
+ *
+ * Drain must return immediately on stop() and flush() call
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_drain(qahw_stream_handle_t *out_handle, qahw_drain_type_t type);
+
+/*
+ * Notifies to the audio driver to flush the queued data. Stream must already
+ * be paused before calling flush().
+ *
+ * Implementation of this function is mandatory for offloaded playback.
+ */
+int qahw_out_flush(qahw_stream_handle_t *out_handle);
+
+/*
+ * Return a recent count of the number of audio frames presented to an external observer.
+ * This excludes frames which have been written but are still in the pipeline.
+ * The count is not reset to zero when output enters standby.
+ * Also returns the value of CLOCK_MONOTONIC as of this presentation count.
+ * The returned count is expected to be 'recent',
+ * but does not need to be the most recent possible value.
+ * However, the associated time should correspond to whatever count is returned.
+ * Example: assume that N+M frames have been presented, where M is a 'small' number.
+ * Then it is permissible to return N instead of N+M,
+ * and the timestamp should correspond to N rather than N+M.
+ * The terms 'recent' and 'small' are not defined.
+ * They reflect the quality of the implementation.
+ *
+ * 3.0 and higher only.
+ */
+int qahw_out_get_presentation_position(const qahw_stream_handle_t *out_handle,
+ uint64_t *frames, struct timespec *timestamp);
+
+/* Input stream specific APIs */
+
+/* This method creates and opens the audio hardware input stream */
+int qahw_open_input_stream(qahw_module_handle_t *hw_module,
+ audio_io_handle_t handle,
+ audio_devices_t devices,
+ struct audio_config *config,
+ qahw_stream_handle_t **stream_in,
+ audio_input_flags_t flags,
+ const char *address,
+ audio_source_t source);
+
+int qahw_close_input_stream(qahw_stream_handle_t *in_handle);
+
+
+/*
+ * Return the sampling rate in Hz - eg. 44100.
+ */
+uint32_t qahw_in_get_sample_rate(const qahw_stream_handle_t *in_handle);
+
+/*
+ * currently unused - use set_parameters with key
+ * QAHW_PARAMETER_STREAM_SAMPLING_RATE
+ */
+int qahw_in_set_sample_rate(qahw_stream_handle_t *in_handle, uint32_t rate);
+
+/*
+ * Return size of input/output buffer in bytes for this stream - eg. 4800.
+ * It should be a multiple of the frame size. See also get_input_buffer_size.
+ */
+size_t qahw_in_get_buffer_size(const qahw_stream_handle_t *in_handle);
+
+/*
+ * Return the channel mask -
+ * e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
+ */
+audio_channel_mask_t qahw_in_get_channels(const qahw_stream_handle_t *in_handle);
+
+/*
+ * Return the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
+ */
+audio_format_t qahw_in_get_format(const qahw_stream_handle_t *in_handle);
+
+/*
+ * currently unused - use set_parameters with key
+ * QAHW_PARAMETER_STREAM_FORMAT
+ */
+int qahw_in_set_format(qahw_stream_handle_t *in_handle, audio_format_t format);
+
+/*
+ * Put the audio hardware input/output into standby mode.
+ * Driver should exit from standby mode at the next I/O operation.
+ * Returns 0 on success and <0 on failure.
+ */
+int qahw_in_standby(qahw_stream_handle_t *in_handle);
+
+/*
+ * set/get audio stream parameters. The function accepts a list of
+ * parameter key value pairs in the form: key1=value1;key2=value2;...
+ *
+ * Some keys are reserved for standard parameters (See AudioParameter class)
+ *
+ * If the implementation does not accept a parameter change while
+ * the output is active but the parameter is acceptable otherwise, it must
+ * return -ENOSYS.
+ *
+ * The audio flinger will put the stream in standby and then change the
+ * parameter value.
+ */
+int qahw_in_set_parameters(qahw_stream_handle_t *in_handle, const char *kv_pairs);
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char* qahw_in_get_parameters(const qahw_stream_handle_t *in_handle,
+ const char *keys);
+/*
+ * Read audio buffer in from audio driver. Returns number of bytes read, or a
+ * negative status_t. meta_data structure is filled buffer pointer, start
+ * offset and valid catpure timestamp (if session is opened with timetamp flag)
+ * and buffer. if at least one frame was read prior to the error,
+ * read should return that byte count and then return an error in the
+ * subsequent call.
+ */
+ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
+ qahw_in_buffer_t *in_buf);
+/*
+ * Return the amount of input frames lost in the audio driver since the
+ * last call of this function.
+ * Audio driver is expected to reset the value to 0 and restart counting
+ * upon returning the current value by this function call.
+ * Such loss typically occurs when the user space process is blocked
+ * longer than the capacity of audio driver buffers.
+ *
+ * Unit: the number of input audio frames
+ */
+uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle);
+
+/*
+ * Return a recent count of the number of audio frames received and
+ * the clock time associated with that frame count.
+ *
+ * frames is the total frame count received. This should be as early in
+ * the capture pipeline as possible. In general,
+ * frames should be non-negative and should not go "backwards".
+ *
+ * time is the clock MONOTONIC time when frames was measured. In general,
+ * time should be a positive quantity and should not go "backwards".
+ *
+ * The status returned is 0 on success, -ENOSYS if the device is not
+ * ready/available, or -EINVAL if the arguments are null or otherwise invalid.
+ */
+int qahw_in_get_capture_position(const qahw_stream_handle_t *in_handle,
+ int64_t *frames, int64_t *time);
+
+/* Module specific APIs */
+
+/* convenience API for opening and closing an audio HAL module */
+qahw_module_handle_t *qahw_load_module(const char *hw_module_id);
+
+int qahw_unload_module(qahw_module_handle_t *hw_module);
+
+/*
+ * check to see if the audio hardware interface has been initialized.
+ * returns 0 on success, -ENODEV on failure.
+ */
+int qahw_init_check(const qahw_module_handle_t *hw_module);
+
+/* set the audio volume of a voice call. Range is between 0.0 and 1.0 */
+int qahw_set_voice_volume(qahw_module_handle_t *hw_module, float volume);
+
+/*
+ * set_mode is called when the audio mode changes. AUDIO_MODE_NORMAL mode
+ * is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is
+ * playing, and AUDIO_MODE_IN_CALL when a call is in progress.
+ */
+int qahw_set_mode(qahw_module_handle_t *hw_module, audio_mode_t mode);
+
+/* set/get global audio parameters */
+int qahw_set_parameters(qahw_module_handle_t *hw_module, const char *kv_pairs);
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char* qahw_get_parameters(const qahw_module_handle_t *hw_module,
+ const char *keys);
+
+/* Returns audio input buffer size according to parameters passed or
+ * 0 if one of the parameters is not supported.
+ * See also get_buffer_size which is for a particular stream.
+ */
+size_t qahw_get_input_buffer_size(const qahw_module_handle_t *hw_module,
+ const struct audio_config *config);
+
+/*returns current QTI HAL version */
+int qahw_get_version();
+
+__END_DECLS
+
+#endif // QTI_AUDIO_HAL_API_H
diff --git a/qahw_api/inc/qahw_defs.h b/qahw_api/inc/qahw_defs.h
new file mode 100644
index 0000000..4441435
--- /dev/null
+++ b/qahw_api/inc/qahw_defs.h
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Copyright (C) 2011 The Android Open Source Project *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/cdefs.h>
+#include <stdint.h>
+
+#ifndef QTI_AUDIO_HAL_DEFS_H
+#define QTI_AUDIO_HAL_DEFS_H
+
+__BEGIN_DECLS
+
+/**************************************/
+
+/**
+ * standard audio parameters that the HAL may need to handle
+ */
+
+/**
+ * audio device parameters
+ */
+
+/* BT SCO Noise Reduction + Echo Cancellation parameters */
+#define QAHW_PARAMETER_KEY_BT_NREC "bt_headset_nrec"
+#define QAHW_PARAMETER_VALUE_ON "on"
+#define QAHW_PARAMETER_VALUE_OFF "off"
+
+/* TTY mode selection */
+#define QAHW_PARAMETER_KEY_TTY_MODE "tty_mode"
+#define QAHW_PARAMETER_VALUE_TTY_OFF "tty_off"
+#define QAHW_PARAMETER_VALUE_TTY_VCO "tty_vco"
+#define QAHW_PARAMETER_VALUE_TTY_HCO "tty_hco"
+#define QAHW_PARAMETER_VALUE_TTY_FULL "tty_full"
+
+/* Hearing Aid Compatibility - Telecoil (HAC-T) mode on/off
+ Strings must be in sync with CallFeaturesSetting.java */
+#define QAHW_PARAMETER_KEY_HAC "HACSetting"
+#define QAHW_PARAMETER_VALUE_HAC_ON "ON"
+#define QAHW_PARAMETER_VALUE_HAC_OFF "OFF"
+
+/* A2DP sink address set by framework */
+#define QAHW_PARAMETER_A2DP_SINK_ADDRESS "a2dp_sink_address"
+
+/* A2DP source address set by framework */
+#define QAHW_PARAMETER_A2DP_SOURCE_ADDRESS "a2dp_source_address"
+
+/* Screen state */
+#define QAHW_PARAMETER_KEY_SCREEN_STATE "screen_state"
+
+/* Bluetooth SCO wideband */
+#define QAHW_PARAMETER_KEY_BT_SCO_WB "bt_wbs"
+
+/* Get a new HW synchronization source identifier.
+ * Return a valid source (positive integer) or AUDIO_HW_SYNC_INVALID if an error occurs
+ * or no HW sync is available. */
+#define QAHW_PARAMETER_HW_AV_SYNC "hw_av_sync"
+
+/**
+ * audio stream parameters
+ */
+
+#define QAHW_PARAMETER_STREAM_ROUTING "routing" /* audio_devices_t */
+#define QAHW_PARAMETER_STREAM_FORMAT "format" /* audio_format_t */
+#define QAHW_PARAMETER_STREAM_CHANNELS "channels" /* audio_channel_mask_t */
+#define QAHW_PARAMETER_STREAM_FRAME_COUNT "frame_count" /* size_t */
+#define QAHW_PARAMETER_STREAM_INPUT_SOURCE "input_source" /* audio_source_t */
+#define QAHW_PARAMETER_STREAM_SAMPLING_RATE "sampling_rate" /* uint32_t */
+
+#define QAHW_PARAMETER_DEVICE_CONNECT "connect" /* audio_devices_t */
+#define QAHW_PARAMETER_DEVICE_DISCONNECT "disconnect" /* audio_devices_t */
+
+/* Query supported formats. The response is a '|' separated list of strings from
+ * audio_format_t enum e.g: "sup_formats=AUDIO_FORMAT_PCM_16_BIT" */
+#define QAHW_PARAMETER_STREAM_SUP_FORMATS "sup_formats"
+
+/* Query supported channel masks. The response is a '|' separated list of
+ * strings from audio_channel_mask_t enum
+ * e.g: "sup_channels=AUDIO_CHANNEL_OUT_STEREO|AUDIO_CHANNEL_OUT_MONO" */
+#define QAHW_PARAMETER_STREAM_SUP_CHANNELS "sup_channels"
+
+/* Query supported sampling rates. The response is a '|' separated list of
+ * integer values e.g: "sup_sampling_rates=44100|48000" */
+#define QAHW_PARAMETER_STREAM_SUP_SAMPLING_RATES "sup_sampling_rates"
+
+/* Set the HW synchronization source for an output stream. */
+#define QAHW_PARAMETER_STREAM_HW_AV_SYNC "hw_av_sync"
+
+/* Enable mono audio playback if 1, else should be 0. */
+#define QAHW_PARAMETER_MONO_OUTPUT "mono_output"
+
+/**
+ * audio codec parameters
+ */
+
+#define QAHW_OFFLOAD_CODEC_PARAMS "music_offload_codec_param"
+#define QAHW_OFFLOAD_CODEC_BIT_PER_SAMPLE "music_offload_bit_per_sample"
+#define QAHW_OFFLOAD_CODEC_BIT_RATE "music_offload_bit_rate"
+#define QAHW_OFFLOAD_CODEC_AVG_BIT_RATE "music_offload_avg_bit_rate"
+#define QAHW_OFFLOAD_CODEC_ID "music_offload_codec_id"
+#define QAHW_OFFLOAD_CODEC_BLOCK_ALIGN "music_offload_block_align"
+#define QAHW_OFFLOAD_CODEC_SAMPLE_RATE "music_offload_sample_rate"
+#define QAHW_OFFLOAD_CODEC_ENCODE_OPTION "music_offload_encode_option"
+#define QAHW_OFFLOAD_CODEC_NUM_CHANNEL "music_offload_num_channels"
+#define QAHW_OFFLOAD_CODEC_DOWN_SAMPLING "music_offload_down_sampling"
+#define QAHW_OFFLOAD_CODEC_DELAY_SAMPLES "delay_samples"
+#define QAHW_OFFLOAD_CODEC_PADDING_SAMPLES "padding_samples"
+
+/**
+ * extended audio codec parameters
+ */
+
+#define QAHW_OFFLOAD_CODEC_WMA_FORMAT_TAG "music_offload_wma_format_tag"
+#define QAHW_OFFLOAD_CODEC_WMA_BLOCK_ALIGN "music_offload_wma_block_align"
+#define QAHW_OFFLOAD_CODEC_WMA_BIT_PER_SAMPLE "music_offload_wma_bit_per_sample"
+#define QAHW_OFFLOAD_CODEC_WMA_CHANNEL_MASK "music_offload_wma_channel_mask"
+#define QAHW_OFFLOAD_CODEC_WMA_ENCODE_OPTION "music_offload_wma_encode_option"
+#define QAHW_OFFLOAD_CODEC_WMA_ENCODE_OPTION1 "music_offload_wma_encode_option1"
+#define QAHW_OFFLOAD_CODEC_WMA_ENCODE_OPTION2 "music_offload_wma_encode_option2"
+
+#define QAHW_OFFLOAD_CODEC_FLAC_MIN_BLK_SIZE "music_offload_flac_min_blk_size"
+#define QAHW_OFFLOAD_CODEC_FLAC_MAX_BLK_SIZE "music_offload_flac_max_blk_size"
+#define QAHW_OFFLOAD_CODEC_FLAC_MIN_FRAME_SIZE "music_offload_flac_min_frame_size"
+#define QAHW_OFFLOAD_CODEC_FLAC_MAX_FRAME_SIZE "music_offload_flac_max_frame_size"
+
+#define QAHW_OFFLOAD_CODEC_ALAC_FRAME_LENGTH "music_offload_alac_frame_length"
+#define QAHW_OFFLOAD_CODEC_ALAC_COMPATIBLE_VERSION "music_offload_alac_compatible_version"
+#define QAHW_OFFLOAD_CODEC_ALAC_BIT_DEPTH "music_offload_alac_bit_depth"
+#define QAHW_OFFLOAD_CODEC_ALAC_PB "music_offload_alac_pb"
+#define QAHW_OFFLOAD_CODEC_ALAC_MB "music_offload_alac_mb"
+#define QAHW_OFFLOAD_CODEC_ALAC_KB "music_offload_alac_kb"
+#define QAHW_OFFLOAD_CODEC_ALAC_NUM_CHANNELS "music_offload_alac_num_channels"
+#define QAHW_OFFLOAD_CODEC_ALAC_MAX_RUN "music_offload_alac_max_run"
+#define QAHW_OFFLOAD_CODEC_ALAC_MAX_FRAME_BYTES "music_offload_alac_max_frame_bytes"
+#define QAHW_OFFLOAD_CODEC_ALAC_AVG_BIT_RATE "music_offload_alac_avg_bit_rate"
+#define QAHW_OFFLOAD_CODEC_ALAC_SAMPLING_RATE "music_offload_alac_sampling_rate"
+#define QAHW_OFFLOAD_CODEC_ALAC_CHANNEL_LAYOUT_TAG "music_offload_alac_channel_layout_tag"
+
+#define QAHW_OFFLOAD_CODEC_APE_COMPATIBLE_VERSION "music_offload_ape_compatible_version"
+#define QAHW_OFFLOAD_CODEC_APE_COMPRESSION_LEVEL "music_offload_ape_compression_level"
+#define QAHW_OFFLOAD_CODEC_APE_FORMAT_FLAGS "music_offload_ape_format_flags"
+#define QAHW_OFFLOAD_CODEC_APE_BLOCKS_PER_FRAME "music_offload_ape_blocks_per_frame"
+#define QAHW_OFFLOAD_CODEC_APE_FINAL_FRAME_BLOCKS "music_offload_ape_final_frame_blocks"
+#define QAHW_OFFLOAD_CODEC_APE_TOTAL_FRAMES "music_offload_ape_total_frames"
+#define QAHW_OFFLOAD_CODEC_APE_BITS_PER_SAMPLE "music_offload_ape_bits_per_sample"
+#define QAHW_OFFLOAD_CODEC_APE_NUM_CHANNELS "music_offload_ape_num_channels"
+#define QAHW_OFFLOAD_CODEC_APE_SAMPLE_RATE "music_offload_ape_sample_rate"
+#define QAHW_OFFLOAD_CODEC_APE_SEEK_TABLE_PRESENT "music_offload_seek_table_present"
+
+#define QAHW_OFFLOAD_CODEC_VORBIS_BITSTREAM_FMT "music_offload_vorbis_bitstream_fmt"
+
+/* Query fm volume */
+#define QAHW_PARAMETER_KEY_FM_VOLUME "fm_volume"
+
+/* Query if a2dp is supported */
+#define QAHW_PARAMETER_KEY_HANDLE_A2DP_DEVICE "isA2dpDeviceSupported"
+
+/* type of asynchronous write callback events. Mutually exclusive */
+typedef enum {
+ QAHW_STREAM_CBK_EVENT_WRITE_READY, /* non blocking write completed */
+ QAHW_STREAM_CBK_EVENT_DRAIN_READY /* drain completed */
+} qahw_stream_callback_event_t;
+
+typedef int qahw_stream_callback_t(qahw_stream_callback_event_t event,
+ void *param,
+ void *cookie);
+
+/* type of drain requested to audio_stream_out->drain(). Mutually exclusive */
+typedef enum {
+ QAHW_DRAIN_ALL, /* drain() returns when all data has been played */
+ QAHW_DRAIN_EARLY_NOTIFY /* drain() returns a short time before all data
+ from the current track has been played to
+ give time for gapless track switch */
+} qahw_drain_type_t;
+
+/* meta data flags */
+/*TBD: Extend this based on stb requirement*/
+typedef enum {
+ QAHW_META_DATA_FLAGS_NONE = 0,
+} qahw_meta_data_flags_t;
+
+typedef struct {
+ const void *buffer; /* write buffer pointer */
+ size_t bytes; /* 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 */
+ uint32_t reserved[64]; /*reserved for future */
+} qahw_out_buffer_t;
+
+typedef struct {
+ void *buffer; /* read buffer pointer */
+ size_t bytes; /* size of buffer */
+ size_t offset; /* offset in buffer from where valid byte starts */
+ int64_t *timestamp; /* timestmap */
+ uint32_t reserved[64]; /*reserved for future */
+} qahw_in_buffer_t;
+
+__END_DECLS
+
+#endif // QTI_AUDIO_HAL_DEFS_H
+
diff --git a/qahw_api/src/qahw.c b/qahw_api/src/qahw.c
new file mode 100644
index 0000000..06bcee1
--- /dev/null
+++ b/qahw_api/src/qahw.c
@@ -0,0 +1,1513 @@
+/*
+* Copyright (c) 2016, 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.
+*/
+
+#define LOG_TAG "qahw"
+/*#define LOG_NDEBUG 0*/
+#define LOG_NDDEBUG 0
+
+#include <utils/Log.h>
+#include <stdlib.h>
+#include <cutils/list.h>
+
+#include <hardware/audio.h>
+#include "qahw_api.h"
+
+#define NO_ERROR 0
+#define MAX_MODULE_NAME_LENGTH 100
+
+/*
+ * The current HAL API version.
+ */
+#define QAHW_MODULE_API_VERSION_CURRENT QAHW_MODULE_API_VERSION_0_0
+
+typedef struct {
+ audio_hw_device_t *audio_device;
+ char module_name[MAX_MODULE_NAME_LENGTH];
+ struct listnode module_list;
+ struct listnode in_list;
+ struct listnode out_list;
+ pthread_mutex_t lock;
+ uint32_t ref_count;
+} qahw_module_t;
+
+typedef struct {
+ qahw_module_t *module;
+ struct listnode module_list;
+ pthread_mutex_t lock;
+} qahw_module_instances_t;
+
+typedef struct {
+ audio_stream_out_t *stream;
+ qahw_module_t *module;
+ struct listnode list;
+ pthread_mutex_t lock;
+} qahw_stream_out_t;
+
+typedef struct {
+ audio_stream_in_t *stream;
+ qahw_module_t *module;
+ struct listnode list;
+ pthread_mutex_t lock;
+} qahw_stream_in_t;
+
+typedef enum {
+ STREAM_DIR_IN,
+ STREAM_DIR_OUT,
+} qahw_stream_direction_t;
+
+static struct listnode qahw_module_list;
+static int qahw_list_count;
+static pthread_mutex_t qahw_module_init_lock = PTHREAD_MUTEX_INITIALIZER;
+
+/** Start of internal functions */
+/******************************************************************************/
+
+/* call this function without anylock held */
+static bool is_valid_qahw_stream(void *qahw_stream,
+ qahw_stream_direction_t dir)
+{
+
+ int is_valid = false;
+ struct listnode *module_node = NULL;
+ struct listnode *stream_node = NULL;
+ struct listnode *list_node = NULL;
+ void *stream = NULL;
+ qahw_module_t *qahw_module = NULL;
+
+ if (qahw_stream == NULL) {
+ ALOGE("%s:: Invalid stream", __func__);
+ goto exit;
+ }
+
+ if ((dir != STREAM_DIR_OUT) && (dir != STREAM_DIR_IN)) {
+ ALOGE("%s:: Invalid stream direction %d", __func__, dir);
+ goto exit;
+ }
+
+ /* go through all the modules and check for valid stream */
+ pthread_mutex_lock(&qahw_module_init_lock);
+ list_for_each(module_node, &qahw_module_list) {
+ qahw_module = node_to_item(module_node, qahw_module_t, module_list);
+ pthread_mutex_lock(&qahw_module->lock);
+ if(dir == STREAM_DIR_OUT)
+ list_node = &qahw_module->out_list;
+ else
+ list_node = &qahw_module->in_list;
+ list_for_each(stream_node, list_node) {
+ if(dir == STREAM_DIR_OUT)
+ stream = (void *)node_to_item(stream_node,
+ qahw_stream_out_t,
+ list);
+ else
+ stream = (void *)node_to_item(stream_node,
+ qahw_stream_in_t,
+ list);
+ if(stream == qahw_stream) {
+ is_valid = true;
+ break;
+ }
+ }
+ pthread_mutex_unlock(&qahw_module->lock);
+ if(is_valid)
+ break;
+ }
+ pthread_mutex_unlock(&qahw_module_init_lock);
+
+exit:
+ return is_valid;
+}
+
+/* call this fucntion with ahw_module_init_lock held*/
+static qahw_module_t* get_qahw_module_by_ptr(qahw_module_t *qahw_module)
+{
+ struct listnode *node = NULL;
+ qahw_module_t *module = NULL, *module_temp = NULL;
+
+ if (qahw_module == NULL)
+ goto exit;
+
+ list_for_each(node, &qahw_module_list) {
+ module_temp = node_to_item(node, qahw_module_t, module_list);
+ if (module_temp == qahw_module) {
+ module = module_temp;
+ break;
+ }
+ }
+exit:
+ return module;
+}
+
+/* call this function with qahw_module_init_lock held*/
+static qahw_module_t* get_qahw_module_by_name(const char *qahw_name)
+{
+ struct listnode *node = NULL;
+ qahw_module_t *module = NULL, *module_temp = NULL;
+
+ if (qahw_name == NULL)
+ goto exit;
+
+ list_for_each(node, &qahw_module_list) {
+ module_temp = node_to_item(node, qahw_module_t, module_list);
+ if(!strncmp(qahw_name, module_temp->module_name, MAX_MODULE_NAME_LENGTH)) {
+ module = module_temp;
+ break;
+ }
+ }
+exit:
+ return module;
+}
+/* End of of internal functions */
+
+/*
+ * Return the sampling rate in Hz - eg. 44100.
+ */
+uint32_t qahw_out_get_sample_rate(const qahw_stream_handle_t *out_handle)
+{
+ uint32_t rate = 0;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGV("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.get_sample_rate)
+ rate = out->common.get_sample_rate(&out->common);
+ else
+ ALOGW("%s not supported", __func__);
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rate;
+}
+
+/*
+ * currently unused - use set_parameters with key
+ * AUDIO_PARAMETER_STREAM_SAMPLING_RATE
+ */
+int qahw_out_set_sample_rate(qahw_stream_handle_t *out_handle, uint32_t rate)
+{
+ int32_t rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.set_sample_rate) {
+ rc = out->common.set_sample_rate(&out->common, rate);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+exit:
+ return rc;
+}
+
+size_t qahw_out_get_buffer_size(const qahw_stream_handle_t *out_handle)
+{
+ size_t buf_size = 0;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.get_buffer_size) {
+ buf_size = out->common.get_buffer_size(&out->common);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return buf_size;
+}
+
+audio_channel_mask_t qahw_out_get_channels(const qahw_stream_handle_t *out_handle)
+{
+ audio_channel_mask_t ch_mask = 0;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.get_channels) {
+ ch_mask = out->common.get_channels(&out->common);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return ch_mask;
+}
+
+audio_format_t qahw_out_get_format(const qahw_stream_handle_t *out_handle)
+{
+ audio_format_t format = AUDIO_FORMAT_INVALID;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.get_format) {
+ format = out->common.get_format(&out->common);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return format;
+}
+
+int qahw_out_standby(qahw_stream_handle_t *out_handle)
+{
+ int32_t rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.standby) {
+ rc = out->common.standby(&out->common);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+int qahw_out_set_parameters(qahw_stream_handle_t *out_handle, const char *kv_pairs)
+{
+ int rc = NO_ERROR;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ rc = -EINVAL;
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.set_parameters) {
+ rc = out->common.set_parameters(&out->common, kv_pairs);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+char *qahw_out_get_parameters(const qahw_stream_handle_t *out_handle,
+ const char *keys)
+{
+ char *str_param = NULL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->common.get_parameters) {
+ str_param = out->common.get_parameters(&out->common, keys);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return str_param;
+}
+
+uint32_t qahw_out_get_latency(const qahw_stream_handle_t *out_handle)
+{
+ uint32_t latency = 0;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->get_latency) {
+ latency = out->get_latency(out);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return latency;
+}
+
+int qahw_out_set_volume(qahw_stream_handle_t *out_handle, float left, float right)
+{
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->set_volume) {
+ rc = out->set_volume(out, left, right);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+ssize_t qahw_out_write(qahw_stream_handle_t *out_handle,
+ qahw_out_buffer_t *out_buf)
+{
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if ((out_buf == NULL) || (out_buf->buffer == NULL)) {
+ ALOGE("%s::Invalid meta data %p", __func__, out_buf);
+ goto exit;
+ }
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ /*TBD:: validate other meta data parameters */
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->write) {
+ rc = out->write(out, out_buf->buffer, out_buf->bytes);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+exit:
+ return rc;
+}
+
+int qahw_out_get_render_position(const qahw_stream_handle_t *out_handle,
+ uint32_t *dsp_frames)
+{
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->get_render_position) {
+ rc = out->get_render_position(out, dsp_frames);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+exit:
+ return rc;
+}
+
+int qahw_out_set_callback(qahw_stream_handle_t *out_handle,
+ qahw_stream_callback_t callback,
+ void *cookie)
+{
+ /*TBD:load hal func pointer and call */
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->set_callback) {
+ rc = out->set_callback(out, (stream_callback_t)callback, cookie);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+int qahw_out_pause(qahw_stream_handle_t *out_handle)
+{
+ /*TBD:load hal func pointer and call */
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->pause) {
+ rc = out->pause(out);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+int qahw_out_resume(qahw_stream_handle_t *out_handle)
+{
+ /*TBD:load hal func pointer and call */
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->resume) {
+ rc = out->resume(out);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+int qahw_out_drain(qahw_stream_handle_t *out_handle, qahw_drain_type_t type )
+{
+ /*TBD:load hal func pointer and call */
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->drain) {
+ rc = out->drain(out,(audio_drain_type_t)type);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+int qahw_out_flush(qahw_stream_handle_t *out_handle)
+{
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->flush) {
+ rc = out->flush(out);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+int qahw_out_get_presentation_position(const qahw_stream_handle_t *out_handle,
+ uint64_t *frames, struct timespec *timestamp)
+{
+ int rc = -EINVAL;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ audio_stream_out_t *out = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ out = qahw_stream_out->stream;
+ if (out->get_presentation_position) {
+ rc = out->get_presentation_position(out, frames, timestamp);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+exit:
+ return rc;
+}
+
+/* Input stream specific APIs */
+uint32_t qahw_in_get_sample_rate(const qahw_stream_handle_t *in_handle)
+{
+ uint32_t rate = 0;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.get_sample_rate) {
+ rate = in->common.get_sample_rate(&in->common);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return rate;
+}
+
+/*
+ * currently unused - use set_parameters with key
+ * AUDIO_PARAMETER_STREAM_SAMPLING_RATE
+ */
+int qahw_in_set_sample_rate(qahw_stream_handle_t *in_handle, uint32_t rate)
+{
+ int rc = -EINVAL;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.set_sample_rate) {
+ rc = in->common.set_sample_rate(&in->common, rate);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return rc;
+}
+
+size_t qahw_in_get_buffer_size(const qahw_stream_handle_t *in_handle)
+{
+ size_t buf_size = 0;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.get_sample_rate) {
+ buf_size = in->common.get_buffer_size(&in->common);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return buf_size;
+}
+
+
+audio_channel_mask_t qahw_in_get_channels(const qahw_stream_handle_t *in_handle)
+{
+ audio_channel_mask_t ch_mask = 0;;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.get_channels) {
+ ch_mask = in->common.get_channels(&in->common);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return ch_mask;
+}
+
+audio_format_t qahw_in_get_format(const qahw_stream_handle_t *in_handle)
+{
+ audio_format_t format = AUDIO_FORMAT_INVALID;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.get_format) {
+ format = in->common.get_format(&in->common);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return format;
+}
+
+/*
+ * currently unused - use set_parameters with key
+ * AUDIO_PARAMETER_STREAM_FORMAT
+ */
+int qahw_in_set_format(qahw_stream_handle_t *in_handle, audio_format_t format)
+{
+ int rc = -EINVAL;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.set_format) {
+ rc = in->common.set_format(&in->common, format);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return rc;
+}
+
+int qahw_in_standby(qahw_stream_handle_t *in_handle)
+{
+ int rc = -EINVAL;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.standby) {
+ rc = in->common.standby(&in->common);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return rc;
+}
+
+/*
+ * set/get audio stream parameters. The function accepts a list of
+ * parameter key value pairs in the form: key1=value1;key2=value2;...
+ *
+ * Some keys are reserved for standard parameters (See AudioParameter class)
+ *
+ * If the implementation does not accept a parameter change while
+ * the output is active but the parameter is acceptable otherwise, it must
+ * return -ENOSYS.
+ *
+ * The audio flinger will put the stream in standby and then change the
+ * parameter value.
+ */
+int qahw_in_set_parameters(qahw_stream_handle_t *in_handle, const char *kv_pairs)
+{
+ int rc = -EINVAL;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.set_parameters) {
+ rc = in->common.set_parameters(&in->common, kv_pairs);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+exit:
+ return rc;
+}
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char * qahw_in_get_parameters(const qahw_stream_handle_t *in_handle,
+ const char *keys)
+{
+ char *str_param = NULL;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->common.get_parameters) {
+ str_param = in->common.get_parameters(&in->common, keys);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return str_param;
+}
+
+/*
+ * Read audio buffer in from audio driver. Returns number of bytes read, or a
+ * negative status_t. If at least one frame was read prior to the error,
+ * read should return that byte count and then return an error in the subsequent call.
+ */
+ssize_t qahw_in_read(qahw_stream_handle_t *in_handle,
+ qahw_in_buffer_t *in_buf)
+{
+ int rc = -EINVAL;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if ((in_buf == NULL) || (in_buf->buffer == NULL)) {
+ ALOGE("%s::Invalid meta data %p", __func__, in_buf);
+ goto exit;
+ }
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ /*TBD:: call HAL timestamp read API*/
+ if (in->read) {
+ rc = in->read(in, in_buf->buffer, in_buf->bytes);
+ in_buf->offset = 0;
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return rc;
+}
+
+/*
+ * Return the amount of input frames lost in the audio driver since the
+ * last call of this function.
+ * Audio driver is expected to reset the value to 0 and restart counting
+ * upon returning the current value by this function call.
+ * Such loss typically occurs when the user space process is blocked
+ * longer than the capacity of audio driver buffers.
+ *
+ * Unit: the number of input audio frames
+ */
+uint32_t qahw_in_get_input_frames_lost(qahw_stream_handle_t *in_handle)
+{
+ uint32_t rc = 0;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ audio_stream_in_t *in = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ in = qahw_stream_in->stream;
+ if (in->get_input_frames_lost) {
+ rc = in->get_input_frames_lost(in);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+exit:
+ return rc;
+}
+
+/*
+ * Return a recent count of the number of audio frames received and
+ * the clock time associated with that frame count.
+ *
+ * frames is the total frame count received. This should be as early in
+ * the capture pipeline as possible. In general,
+ * frames should be non-negative and should not go "backwards".
+ *
+ * time is the clock MONOTONIC time when frames was measured. In general,
+ * time should be a positive quantity and should not go "backwards".
+ *
+ * The status returned is 0 on success, -ENOSYS if the device is not
+ * ready/available, or -EINVAL if the arguments are null or otherwise invalid.
+ */
+int qahw_in_get_capture_position(const qahw_stream_handle_t *in_handle __unused,
+ int64_t *frames __unused, int64_t *time __unused)
+{
+ /*TBD:: do we need this*/
+ return -ENOSYS;
+}
+
+/*
+ * check to see if the audio hardware interface has been initialized.
+ * returns 0 on success, -ENODEV on failure.
+ */
+int qahw_init_check(const qahw_module_handle_t *hw_module)
+{
+ int rc = -EINVAL;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ if (qahw_module->audio_device->init_check) {
+ rc = qahw_module->audio_device->init_check(qahw_module->audio_device);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_module->lock);
+
+exit:
+ return rc;
+}
+/* set the audio volume of a voice call. Range is between 0.0 and 1.0 */
+int qahw_set_voice_volume(qahw_module_handle_t *hw_module, float volume)
+{
+ int rc = -EINVAL;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ if (qahw_module->audio_device->set_voice_volume) {
+ rc = qahw_module->audio_device->set_voice_volume(qahw_module->audio_device,
+ volume);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_module->lock);
+
+exit:
+ return rc;
+}
+
+/*
+ * set_mode is called when the audio mode changes. AUDIO_MODE_NORMAL mode
+ * is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is
+ * playing, and AUDIO_MODE_IN_CALL when a call is in progress.
+ */
+int qahw_set_mode(qahw_module_handle_t *hw_module, audio_mode_t mode)
+{
+ int rc = -EINVAL;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ if (qahw_module->audio_device->set_mode) {
+ rc = qahw_module->audio_device->set_mode(qahw_module->audio_device,
+ mode);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_module->lock);
+
+exit:
+ return rc;
+}
+
+/* set/get global audio parameters */
+int qahw_set_parameters(qahw_module_handle_t *hw_module, const char *kv_pairs)
+{
+ int rc = -EINVAL;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp;
+ audio_hw_device_t *audio_device;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ audio_device = qahw_module->audio_device;
+ if (qahw_module->audio_device->set_parameters) {
+ rc = audio_device->set_parameters(qahw_module->audio_device, kv_pairs);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_module->lock);
+
+exit:
+ return rc;
+}
+
+/*
+ * Returns a pointer to a heap allocated string. The caller is responsible
+ * for freeing the memory for it using free().
+ */
+char * qahw_get_parameters(const qahw_module_handle_t *hw_module,
+ const char *keys)
+{
+ char *str_param = NULL;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp;
+ audio_hw_device_t *audio_device;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ audio_device = qahw_module->audio_device;
+ if (qahw_module->audio_device->get_parameters) {
+ str_param = audio_device->get_parameters(qahw_module->audio_device, keys);
+ } else {
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_module->lock);
+
+exit:
+ return str_param;
+}
+
+/* Returns audio input buffer size according to parameters passed or
+ * 0 if one of the parameters is not supported.
+ * See also get_buffer_size which is for a particular stream.
+ */
+size_t qahw_get_input_buffer_size(const qahw_module_handle_t *hw_module,
+ const struct audio_config *config)
+{
+ size_t rc = 0;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp;
+ audio_hw_device_t *audio_device;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ goto exit;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ audio_device = qahw_module->audio_device;
+ if (qahw_module->audio_device->get_input_buffer_size) {
+ rc = audio_device->get_input_buffer_size(qahw_module->audio_device,
+ config);
+ } else {
+ rc = -ENOSYS;
+ ALOGW("%s not supported", __func__);
+ }
+ pthread_mutex_unlock(&qahw_module->lock);
+
+exit:
+ return rc;
+}
+
+/*
+ * This method creates and opens the audio hardware output stream.
+ * The "address" parameter qualifies the "devices" audio device type if needed.
+ * The format format depends on the device type:
+ * - Bluetooth devices use the MAC address of the device in the form "00:11:22:AA:BB:CC"
+ * - USB devices use the ALSA card and device numbers in the form "card=X;device=Y"
+ * - Other devices may use a number or any other string.
+ */
+int qahw_open_output_stream(qahw_module_handle_t *hw_module,
+ audio_io_handle_t handle,
+ audio_devices_t devices,
+ audio_output_flags_t flags,
+ struct audio_config *config,
+ qahw_stream_handle_t **out_handle,
+ const char *address)
+{
+ int rc = -EINVAL;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp = NULL;
+ audio_hw_device_t *audio_device = NULL;
+ qahw_stream_out_t *qahw_stream_out = NULL;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ return rc;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ audio_device = qahw_module->audio_device;
+ qahw_stream_out = (qahw_stream_out_t *)calloc(1, sizeof(qahw_stream_out_t));
+ if (qahw_stream_out == NULL) {
+ ALOGE("%s:: calloc failed for out stream_out_t",__func__);
+ rc = -ENOMEM;
+ goto exit;
+ }
+
+ rc = audio_device->open_output_stream(audio_device,
+ handle,
+ devices,
+ flags,
+ config,
+ &qahw_stream_out->stream,
+ address);
+ if (rc) {
+ ALOGE("%s::open output stream failed %d",__func__, rc);
+ free(qahw_stream_out);
+ } else {
+ qahw_stream_out->module = hw_module;
+ *out_handle = (void *)qahw_stream_out;
+ pthread_mutex_init(&qahw_stream_out->lock, (const pthread_mutexattr_t *)NULL);
+ list_add_tail(&qahw_module->out_list, &qahw_stream_out->list);
+ }
+
+exit:
+ pthread_mutex_unlock(&qahw_module->lock);
+ return rc;
+}
+
+int qahw_close_output_stream(qahw_stream_handle_t *out_handle)
+{
+
+ int rc = 0;
+ qahw_stream_out_t *qahw_stream_out = (qahw_stream_out_t *)out_handle;
+ qahw_module_t *qahw_module = NULL;
+ audio_hw_device_t *audio_device = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_out, STREAM_DIR_OUT)) {
+ ALOGE("%s::Invalid out handle %p", __func__, out_handle);
+ rc = -EINVAL;
+ goto exit;
+ }
+
+ ALOGV("%s::calling device close_output_stream %p", __func__, out_handle);
+ pthread_mutex_lock(&qahw_stream_out->lock);
+ qahw_module = qahw_stream_out->module;
+ audio_device = qahw_module->audio_device;
+ audio_device->close_output_stream(audio_device,
+ qahw_stream_out->stream);
+
+ pthread_mutex_lock(&qahw_module->lock);
+ list_remove(&qahw_stream_out->list);
+ pthread_mutex_unlock(&qahw_module->lock);
+
+ pthread_mutex_unlock(&qahw_stream_out->lock);
+
+ pthread_mutex_destroy(&qahw_stream_out->lock);
+ free(qahw_stream_out);
+
+exit:
+ return rc;
+}
+
+/* This method creates and opens the audio hardware input stream */
+int qahw_open_input_stream(qahw_module_handle_t *hw_module,
+ audio_io_handle_t handle,
+ audio_devices_t devices,
+ struct audio_config *config,
+ qahw_stream_handle_t **in_handle,
+ audio_input_flags_t flags,
+ const char *address,
+ audio_source_t source)
+{
+ int rc = -EINVAL;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp = NULL;
+ audio_hw_device_t *audio_device = NULL;
+ qahw_stream_in_t *qahw_stream_in = NULL;
+
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ pthread_mutex_unlock(&qahw_module_init_lock);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ return rc;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ audio_device = qahw_module->audio_device;
+ qahw_stream_in = (qahw_stream_in_t *)calloc(1, sizeof(qahw_stream_in_t));
+ if (qahw_stream_in == NULL) {
+ ALOGE("%s:: calloc failed for in stream_in_t",__func__);
+ rc = -ENOMEM;
+ goto exit;
+ }
+
+ rc = audio_device->open_input_stream(audio_device,
+ handle,
+ devices,
+ config,
+ &qahw_stream_in->stream,
+ flags,
+ address,
+ source);
+ if (rc) {
+ ALOGE("%s::open input stream failed %d",__func__, rc);
+ free(qahw_stream_in);
+ } else {
+ qahw_stream_in->module = hw_module;
+ *in_handle = (void *)qahw_stream_in;
+ pthread_mutex_init(&qahw_stream_in->lock, (const pthread_mutexattr_t *)NULL);
+ list_add_tail(&qahw_module->in_list, &qahw_stream_in->list);
+ }
+
+exit:
+ pthread_mutex_unlock(&qahw_module->lock);
+ return rc;
+}
+
+int qahw_close_input_stream(qahw_stream_handle_t *in_handle)
+{
+ int rc = 0;
+ qahw_stream_in_t *qahw_stream_in = (qahw_stream_in_t *)in_handle;
+ qahw_module_t *qahw_module = NULL;
+ audio_hw_device_t *audio_device = NULL;
+
+ if (!is_valid_qahw_stream((void *)qahw_stream_in, STREAM_DIR_IN)) {
+ ALOGV("%s::Invalid in handle %p", __func__, in_handle);
+ rc = -EINVAL;
+ goto exit;
+ }
+
+ ALOGV("%s:: calling device close_input_stream %p", __func__, in_handle);
+ pthread_mutex_lock(&qahw_stream_in->lock);
+ qahw_module = qahw_stream_in->module;
+ audio_device = qahw_module->audio_device;
+ audio_device->close_input_stream(audio_device,
+ qahw_stream_in->stream);
+
+ pthread_mutex_lock(&qahw_module->lock);
+ list_remove(&qahw_stream_in->list);
+ pthread_mutex_unlock(&qahw_module->lock);
+
+ pthread_mutex_unlock(&qahw_stream_in->lock);
+
+ pthread_mutex_destroy(&qahw_stream_in->lock);
+ free(qahw_stream_in);
+
+exit:
+ return rc;
+}
+
+/*returns current QTI HAL verison */
+int qahw_get_version() {
+ return QAHW_MODULE_API_VERSION_CURRENT;
+}
+
+/* convenience API for opening and closing an audio HAL module */
+
+qahw_module_handle_t *qahw_load_module(const char *hw_module_id)
+{
+ int rc = -EINVAL;
+ qahw_module_handle_t *qahw_mod_handle = NULL;
+ qahw_module_t *qahw_module = NULL;
+ char *ahal_name = NULL;
+ const hw_module_t* module = NULL;
+ audio_hw_device_t* audio_device = NULL;
+
+ if (hw_module_id == NULL) {
+ ALOGE("%s::module id is NULL",__func__);
+ goto exit;
+ }
+
+ if (!strcmp(hw_module_id, QAHW_MODULE_ID_PRIMARY)) {
+ ahal_name = "primary";
+ } else if (!strcmp(hw_module_id, QAHW_MODULE_ID_A2DP)) {
+ ahal_name = "a2dp";
+ } else if (!strcmp(hw_module_id, QAHW_MODULE_ID_USB)) {
+ ahal_name = "usb";
+ } else {
+ ALOGE("%s::Invalid Module id %s", __func__, hw_module_id);
+ goto exit;
+ }
+
+ /* return exiting module ptr if already loaded */
+ pthread_mutex_lock(&qahw_module_init_lock);
+ if (qahw_list_count > 0) {
+ qahw_module = get_qahw_module_by_name(hw_module_id);
+ if(qahw_module != NULL) {
+ qahw_mod_handle = (void *)qahw_module;
+ pthread_mutex_lock(&qahw_module->lock);
+ qahw_module->ref_count++;
+ pthread_mutex_unlock(&qahw_module->lock);
+ goto error_exit;
+ }
+ }
+
+ rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, ahal_name, &module);
+ if(rc) {
+ ALOGE("%s::HAL Loading failed %d", __func__, rc);
+ goto error_exit;
+ }
+
+ rc = audio_hw_device_open(module, &audio_device);
+ if(rc) {
+ ALOGE("%s::HAL Device open failed %d", __func__, rc);
+ goto error_exit;
+ }
+
+ qahw_module = (qahw_module_t *)calloc(1, sizeof(qahw_module_t));
+ if(qahw_module == NULL) {
+ ALOGE("%s::calloc failed", __func__);
+ audio_hw_device_close(audio_device);
+ goto error_exit;
+ }
+ ALOGD("%s::Loaded HAL %s module %p", __func__, ahal_name, qahw_module);
+
+ if (!qahw_list_count)
+ list_init(&qahw_module_list);
+ qahw_list_count++;
+
+ pthread_mutex_init(&qahw_module->lock, (const pthread_mutexattr_t *) NULL);
+ pthread_mutex_lock(&qahw_module->lock);
+ qahw_module->ref_count++;
+ pthread_mutex_unlock(&qahw_module->lock);
+
+ list_init(&qahw_module->out_list);
+ list_init(&qahw_module->in_list);
+
+ /* update qahw_module */
+ qahw_module->audio_device = audio_device;
+ strlcpy(&qahw_module->module_name[0], hw_module_id, MAX_MODULE_NAME_LENGTH);
+
+ qahw_mod_handle = (void *)qahw_module;
+
+ /* Add module list to global module list */
+ list_add_tail(&qahw_module_list, &qahw_module->module_list);
+
+
+error_exit:
+ pthread_mutex_unlock(&qahw_module_init_lock);
+
+exit:
+ return qahw_mod_handle;
+}
+
+int qahw_unload_module(qahw_module_handle_t *hw_module)
+{
+ int rc = -EINVAL;
+ bool is_empty = false;
+ qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+ qahw_module_t *qahw_module_temp = NULL;
+
+ /* close HW device if its valid and all the streams on
+ * it is closed
+ */
+ pthread_mutex_lock(&qahw_module_init_lock);
+ qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+ if (qahw_module_temp == NULL) {
+ ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+ goto error_exit;
+ }
+
+ pthread_mutex_lock(&qahw_module->lock);
+ qahw_module->ref_count--;
+ if (qahw_module->ref_count > 0) {
+ rc = 0;
+ ALOGE("%s:: skipping module unload of %p count %d", __func__,
+ qahw_module,
+ qahw_module->ref_count);
+ pthread_mutex_unlock(&qahw_module->lock);
+ goto error_exit;
+ }
+
+ is_empty = (list_empty(&qahw_module->out_list) &&
+ list_empty(&qahw_module->in_list));
+ if (is_empty) {
+ rc = audio_hw_device_close(qahw_module->audio_device);
+ if(rc) {
+ ALOGE("%s::HAL Device close failed Error %d Module %p",__func__,
+ rc, qahw_module);
+ rc = 0;
+ }
+ qahw_list_count--;
+ list_remove(&qahw_module->module_list);
+ pthread_mutex_unlock(&qahw_module->lock);
+ pthread_mutex_destroy(&qahw_module->lock);
+ free(qahw_module);
+ } else {
+ pthread_mutex_unlock(&qahw_module->lock);
+ ALOGE("%s::failed as all the streams on this module"
+ "is not closed", __func__);
+ rc = -EINVAL;
+ }
+
+error_exit:
+ pthread_mutex_unlock(&qahw_module_init_lock);
+
+exit:
+ return rc;
+}
+
+__END_DECLS
diff --git a/qahw_api/test/Android.mk b/qahw_api/test/Android.mk
new file mode 100644
index 0000000..1688069
--- /dev/null
+++ b/qahw_api/test/Android.mk
@@ -0,0 +1,40 @@
+LOCAL_PATH := $(call my-dir)
+
+# audio_hal_playback_test
+# ==============================================================================
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := qahw_playback_test.c
+LOCAL_MODULE := hal_play_test
+
+hal-play-inc = $(TARGET_OUT_HEADERS)/mm-audio/qahw_api/inc
+
+LOCAL_CFLAGS += -Wall -Werror -Wno-sign-compare
+
+LOCAL_SHARED_LIBRARIES := \
+ libaudioutils\
+ libqahw \
+ libutils
+
+LOCAL_32_BIT_ONLY := true
+
+LOCAL_C_INCLUDES += $(hal-play-inc)
+
+include $(BUILD_EXECUTABLE)
+
+# audio_hal_multi_record_test
+# ==============================================================================
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := qahw_multi_record_test.c
+LOCAL_MODULE := hal_rec_test
+LOCAL_CFLAGS += -Wall -Werror -Wno-sign-compare
+LOCAL_SHARED_LIBRARIES := \
+ libaudioutils \
+ libqahw \
+ libutils
+
+LOCAL_32_BIT_ONLY := true
+
+hal-rec-inc = $(TARGET_OUT_HEADERS)/mm-audio/qahw_api/inc
+
+LOCAL_C_INCLUDES += $(hal-rec-inc)
+include $(BUILD_EXECUTABLE)
diff --git a/qahw_api/test/qahw_multi_record_test.c b/qahw_api/test/qahw_multi_record_test.c
new file mode 100644
index 0000000..07dede7
--- /dev/null
+++ b/qahw_api/test/qahw_multi_record_test.c
@@ -0,0 +1,488 @@
+/*
+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Copyright (C) 2015 The Android Open Source Project *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Test app to record multiple audio sessions at the HAL layer */
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "qahw_api.h"
+#include "qahw_defs.h"
+
+struct audio_config_params {
+ qahw_module_handle_t *qahw_mod_handle;
+ audio_io_handle_t handle;
+ audio_devices_t input_device;
+ audio_config_t config;
+ audio_input_flags_t flags;
+ const char* kStreamName ;
+ audio_source_t kInputSource;
+ char output_filename[256];
+ double loopTime;
+ char profile[50];
+};
+
+#define SOUNDFOCUS_PARAMS "SoundFocus.start_angles;SoundFocus.enable_sectors;" \
+ "SoundFocus.gain_step"
+#define SOURCETRACK_PARAMS "SourceTrack.vad;SourceTrack.doa_speech;SourceTrack.doa_noise;"\
+ "SourceTrack.polar_activity;ssr.noise_level;ssr.noise_level_after_ns"
+int sourcetrack_done = 0;
+static pthread_mutex_t glock;
+pthread_cond_t gcond;
+int tests_running;
+bool gerror;
+
+void *read_sourcetrack_data(void* data)
+{
+ char kvpair_soundfocus[200] = SOUNDFOCUS_PARAMS;
+ char kvpair_sourcetrack[200] = SOURCETRACK_PARAMS;
+ char *string = NULL;
+ char *token = NULL;
+ char choice = '\0';
+ int i =0;
+ qahw_module_handle_t *qawh_module_handle =
+ (qahw_module_handle_t *)data;
+
+ while (1) {
+ printf("\nGet SoundFocus Params from app");
+ string = qahw_get_parameters(qawh_module_handle, kvpair_soundfocus);
+ if (!string) {
+ printf("Error.Failed Get SoundFocus Params\n");
+ } else {
+ token = strtok (string , "=");
+ while (token) {
+ if (*token == 'S') {
+ choice = *(token + 11);
+ token = strtok (NULL,",;");
+ i=0;
+ }
+ switch (choice) {
+ case 'g':
+ printf ("\nSoundFocus.gain_step=%s",token);
+ break;
+ case 'e':
+ printf ("\nSoundFocus.enable_sectors[%d]=%s",i,token);
+ i++;
+ break;
+ case 's':
+ printf ("\nSoundFocus.start_angles[%d]=%s",i,token);
+ i++;
+ break;
+ }
+ token = strtok (NULL,",;=");
+ }
+ }
+ choice = '\0';
+ printf ("\nGet SourceTracking Params from app");
+ string = qahw_get_parameters(qawh_module_handle, kvpair_sourcetrack);
+ if (!string) {
+ printf ("Error.Failed Get SourceTrack Params\n");
+ } else {
+ token = strtok (string , "=");
+ while (token) {
+ if (*token == 'S') {
+ choice = *(token + 12);
+ if (choice == 'd')
+ choice = *(token + 16);
+ token = strtok (NULL,",;");
+ i=0;
+ }
+ switch (choice) {
+ case 'p':
+ printf ("\nSourceTrack.polar_activity=%s,",token);
+ choice = '\0';
+ break;
+ case 'v':
+ printf ("\nSourceTrack.vad[%d]=%s",i,token);
+ i++;
+ break;
+ case 's':
+ printf ("\nSourceTrack.doa_speech=%s",token);
+ break;
+ case 'n':
+ printf ("\nSourceTrack.doa_noise[%d]=%s",i,token);
+ i++;
+ break;
+ default :
+ printf ("%s,",token);
+ break;
+ }
+ token = strtok (NULL,",;=");
+ }
+ }
+ if (sourcetrack_done == 1)
+ return NULL;
+ }
+}
+
+void *start_input(void *thread_param)
+{
+ int rc = 0;
+ struct audio_config_params* params = (struct audio_config_params*) thread_param;
+ qahw_module_handle_t *qahw_mod_handle = params->qahw_mod_handle;
+
+ // Open audio input stream.
+ qahw_stream_handle_t* in_handle = NULL;
+
+ rc = qahw_open_input_stream(qahw_mod_handle,
+ params->handle, params->input_device,
+ ¶ms->config, &in_handle,
+ params->flags, params->kStreamName,
+ params->kInputSource);
+ if (rc) {
+ printf("ERROR :::: Could not open input stream.\n" );
+ pthread_mutex_lock(&glock);
+ gerror = true;
+ pthread_cond_signal(&gcond);
+ pthread_mutex_unlock(&glock);
+ pthread_exit(0);
+ }
+
+ // Get buffer size to get upper bound on data to read from the HAL.
+ size_t buffer_size;
+ buffer_size = qahw_in_get_buffer_size(in_handle);
+ char *buffer;
+ buffer = (char *)calloc(1, buffer_size);
+ if (buffer == NULL) {
+ printf("calloc failed!!\n");
+ pthread_mutex_lock(&glock);
+ gerror = true;
+ pthread_cond_signal(&gcond);
+ pthread_mutex_unlock(&glock);
+ pthread_exit(0);
+ }
+
+ printf("input opened, buffer = %p, size %zun",
+ buffer, buffer_size);
+
+ int num_channels = audio_channel_count_from_in_mask(params->config.channel_mask);
+
+ time_t start_time = time(0);
+ ssize_t bytes_read = -1;
+ char param[100] = "audio_stream_profile=";
+ qahw_in_buffer_t in_buf;
+
+ // set profile for the recording session
+ strlcat(param, params->profile, sizeof(param));
+ qahw_in_set_parameters(in_handle, param);
+
+ printf("\nPlease speak into the microphone for %lf seconds.\n", params->loopTime);
+
+ FILE *fd = fopen(params->output_filename,"w");
+ if (fd == NULL) {
+ printf("File open failed \n");
+ pthread_mutex_lock(&glock);
+ gerror = true;
+ pthread_cond_signal(&gcond);
+ pthread_mutex_unlock(&glock);
+ pthread_exit(0);
+ }
+ pthread_mutex_lock(&glock);
+ tests_running++;
+ pthread_cond_signal(&gcond);
+ pthread_mutex_unlock(&glock);
+ memset(&in_buf,0, sizeof(qahw_in_buffer_t));
+
+ while(true) {
+ in_buf.buffer = buffer;
+ in_buf.bytes = buffer_size;
+ bytes_read = qahw_in_read(in_handle, &in_buf);
+ fwrite(in_buf.buffer, sizeof(char), buffer_size, fd);
+ if(difftime(time(0), start_time) > params->loopTime) {
+ printf("\nTest completed.\n");
+ break;
+ }
+ }
+
+ printf("closing input");
+
+ // Close output stream and device.
+ rc = qahw_in_standby(in_handle);
+ if (rc) {
+ printf("out standby failed %d \n",rc);
+ }
+
+ rc = qahw_close_input_stream(in_handle);
+ if (rc) {
+ printf("could not close input stream %d \n",rc);
+ }
+
+ // Print instructions to access the file.
+ printf("\nThe 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:\nsample rate: %i\nformat: %d\n"
+ "num channels: %i\n",
+ params->output_filename, params->config.sample_rate,
+ params->config.format, num_channels);
+
+ pthread_mutex_lock(&glock);
+ tests_running--;
+ pthread_cond_signal(&gcond);
+ pthread_mutex_unlock(&glock);
+ pthread_exit(0);
+ return NULL;
+}
+
+int read_config_params_from_user(struct audio_config_params *thread_param, int rec_session) {
+ int channels = 0, format = 0, sample_rate = 0,source = 0, device = 0;
+
+ thread_param->kStreamName = "input_stream";
+
+ printf(" \n Enter input device (4->built-in mic, 16->wired_headset .. etc) ::::: ");
+ scanf(" %d", &device);
+ if (device & AUDIO_DEVICE_IN_BUILTIN_MIC)
+ thread_param->input_device = AUDIO_DEVICE_IN_BUILTIN_MIC;
+ else if (device & AUDIO_DEVICE_IN_WIRED_HEADSET)
+ thread_param->input_device = AUDIO_DEVICE_IN_WIRED_HEADSET;
+
+ printf(" \n Enter the channels (1 -mono, 2 -stereo and 4 -quad channels) ::::: ");
+ scanf(" %d", &channels);
+ if (channels == 1) {
+ thread_param->config.channel_mask = AUDIO_CHANNEL_IN_MONO;
+ } else if (channels == 2) {
+ thread_param->config.channel_mask = AUDIO_CHANNEL_IN_STEREO;
+ } else if (channels == 4) {
+ thread_param->config.channel_mask = AUDIO_CHANNEL_INDEX_MASK_4;
+ } else {
+ gerror = true;
+ printf("\nINVALID channels");
+ return -1;
+ }
+
+ printf(" \n Enter the format (16 - 16 bit recording, 24 - 24 bit recording) ::::: ");
+ scanf(" %d", &format);
+ if (format == 16) {
+ thread_param->config.format = AUDIO_FORMAT_PCM_16_BIT;
+ } else if (format == 24) {
+ thread_param->config.format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
+ } else {
+ gerror = true;
+ printf("\n INVALID format");
+ return -1;
+ }
+
+ printf(" \n Enter the sample rate (48000, 16000 etc) :::: ");
+ scanf(" %d", &sample_rate);
+ thread_param->config.sample_rate = sample_rate;
+
+#ifdef MULTIRECORD_SUPPOT
+ printf(" \n Enter profile (none, record_fluence, record_mec, record_unprocessed etc) :::: ");
+ scanf(" %s", thread_param->profile);
+#else
+ thread_param->flags = (audio_input_flags_t)AUDIO_INPUT_FLAG_NONE;
+#endif
+ printf("\n Enter the audio source ( ref: system/media/audio/include/system/audio.h) :::: ");
+ scanf(" %d", &source);
+ thread_param->kInputSource = (audio_source_t)source;
+
+ if (rec_session == 1) {
+ thread_param->handle = 0x999;
+ strcpy(thread_param->output_filename, "/data/rec1.raw");
+ } else if (rec_session == 2) {
+ thread_param->handle = 0x998;
+ strcpy(thread_param->output_filename, "/data/rec2.raw");
+ } else if (rec_session == 3) {
+ thread_param->handle = 0x997;
+ strcpy(thread_param->output_filename, "/data/rec3.raw");
+ } else if (rec_session == 4) {
+ thread_param->handle = 0x996;
+ strcpy(thread_param->output_filename, "/data/rec4.raw");
+ }
+
+ printf("\n Enter the record duration in seconds :::: ");
+ scanf(" %lf", &thread_param->loopTime);
+ return 0;
+}
+
+int main() {
+ int max_recordings_requested = 0, source_track = 0;
+ int thread_active[4] = {0};
+ qahw_module_handle_t *qahw_mod_handle;
+ const char *mod_name = "audio.primary";
+
+ pthread_cond_init(&gcond, (const pthread_condattr_t *) NULL);
+
+ qahw_mod_handle = qahw_load_module(mod_name);
+ if(qahw_mod_handle == NULL) {
+ printf(" qahw_load_module failed");
+ return -1;
+ }
+#ifdef MULTIRECORD_SUPPOT
+ printf("Starting audio hal multi recording test. \n");
+ printf(" Enter number of record sessions to be started \n");
+ printf(" (Maximum of 4 record sessions are allowed):::: ");
+ scanf(" %d", &max_recordings_requested);
+#else
+ max_recordings_requested = 1;
+#endif
+ printf(" \n Source Tracking enabled ??? ( 1 - Enable 0 - Disable)::: ");
+ scanf(" %d", &source_track);
+
+ struct audio_config_params thread1_params, thread2_params;
+ struct audio_config_params thread3_params, thread4_params;
+
+ switch (max_recordings_requested) {
+ case 4:
+ printf(" Enter the config params for fourth record session \n");
+ thread4_params.qahw_mod_handle = qahw_mod_handle;
+ read_config_params_from_user( &thread4_params, 4);
+ thread_active[3] = 1;
+ printf(" \n");
+ case 3:
+ printf(" Enter the config params for third record session \n");
+ thread3_params.qahw_mod_handle = qahw_mod_handle;
+ read_config_params_from_user( &thread3_params, 3);
+ thread_active[2] = 1;
+ printf(" \n");
+ case 2:
+ printf(" Enter the config params for second record session \n");
+ thread2_params.qahw_mod_handle = qahw_mod_handle;
+ read_config_params_from_user( &thread2_params, 2);
+ thread_active[1] = 1;
+ printf(" \n");
+ case 1:
+ printf(" Enter the config params for first record session \n");
+ thread1_params.qahw_mod_handle = qahw_mod_handle;
+ read_config_params_from_user( &thread1_params, 1);
+ thread_active[0] = 1;
+ printf(" \n");
+ break;
+ default:
+ printf(" INVALID input -- Max record sessions supported is 4 -exit \n");
+ gerror = true;
+ break;
+ }
+
+ pthread_t tid[4];
+ pthread_t sourcetrack_thread;
+ int ret = -1;
+
+ if (thread_active[0] == 1) {
+ printf("\n Create first record thread \n");
+ ret = pthread_create(&tid[0], NULL, start_input, (void *)&thread1_params);
+ if (ret) {
+ gerror = true;
+ printf(" Failed to create first record thread \n ");
+ thread_active[0] = 0;
+ }
+ }
+ if (thread_active[1] == 1) {
+ printf("Create second record thread \n");
+ ret = pthread_create(&tid[1], NULL, start_input, (void *)&thread2_params);
+ if (ret) {
+ gerror = true;
+ printf(" Failed to create second record thread \n ");
+ thread_active[1] = 0;
+ }
+ }
+ if (thread_active[2] == 1) {
+ printf("Create third record thread \n");
+ ret = pthread_create(&tid[2], NULL, start_input, (void *)&thread3_params);
+ if (ret) {
+ gerror = true;
+ printf(" Failed to create third record thread \n ");
+ thread_active[2] = 0;
+ }
+ }
+ if (thread_active[3] == 1) {
+ printf("Create fourth record thread \n");
+ ret = pthread_create(&tid[3], NULL, start_input, (void *)&thread4_params);
+ if (ret) {
+ gerror = true;
+ printf(" Failed to create fourth record thread \n ");
+ thread_active[3] = 0;
+ }
+ }
+ if (source_track && max_recordings_requested) {
+ printf("Create source tracking thread \n");
+ ret = pthread_create(&sourcetrack_thread,
+ NULL, read_sourcetrack_data,
+ (void *)qahw_mod_handle);
+ if (ret) {
+ printf(" Failed to create source tracking thread \n ");
+ source_track = 0;
+ }
+ }
+
+ // set bad mic param
+ while (max_recordings_requested && !source_track) {
+ bool test_completed = false;
+
+ pthread_mutex_lock(&glock);
+ if (!tests_running && !gerror)
+ pthread_cond_wait(&gcond, &glock);
+ test_completed = (tests_running == 0);
+ gerror = true;
+ pthread_mutex_unlock(&glock);
+
+ if (test_completed)
+ break;
+#ifdef MULTIRECORD_SUPPOT
+ char ch;
+ printf("\n Bad mic test required (y/n):::");
+ scanf(" %c", &ch);
+ if (ch == 'y' || ch == 'Y') {
+ int bad_mic_ch_index, ret;
+ char param[100] = "bad_mic_channel_index=";
+ printf("\nEnter bad mic channel index (1, 2, 4 ...):::");
+ scanf(" %d", &bad_mic_ch_index);
+ snprintf(param, sizeof(param), "%s%d", param, bad_mic_ch_index);
+ ret = qahw_set_parameters(qahw_mod_handle, param);
+ printf("param %s set to hal with return value %d\n", param, ret);
+ } else {
+ break;
+ }
+#endif
+ }
+
+ printf(" Waiting for threads exit \n");
+ if (thread_active[0] == 1) {
+ pthread_join(tid[0], NULL);
+ printf("after first record thread exit \n");
+ }
+ if (thread_active[1] == 1) {
+ pthread_join(tid[1], NULL);
+ printf("after second record thread exit \n");
+ }
+ if (thread_active[2] == 1) {
+ pthread_join(tid[2], NULL);
+ printf("after third record thread exit \n");
+ }
+ if (thread_active[3] == 1) {
+ pthread_join(tid[3], NULL);
+ printf("after fourth record thread exit \n");
+ }
+ if (source_track) {
+ sourcetrack_done = 1;
+ pthread_join(sourcetrack_thread,NULL);
+ printf("after source tracking thread exit \n");
+ }
+
+ ret = qahw_unload_module(qahw_mod_handle);
+ if (ret) {
+ printf("could not unload hal %d \n",ret);
+ }
+
+
+ printf("Done with hal record test \n");
+ pthread_cond_destroy(&gcond);
+ return 0;
+}
diff --git a/qahw_api/test/qahw_playback_test.c b/qahw_api/test/qahw_playback_test.c
new file mode 100644
index 0000000..f334719
--- /dev/null
+++ b/qahw_api/test/qahw_playback_test.c
@@ -0,0 +1,488 @@
+/*
+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
+ * Not a Contribution.
+ *
+ * Copyright (C) 2015 The Android Open Source Project *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Test app to play audio at the HAL layer */
+
+#include <getopt.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "qahw_api.h"
+#include "qahw_defs.h"
+
+#define nullptr NULL
+FILE * log_file = NULL;
+const char *log_filename = NULL;
+float vol_level = 0.01;
+
+enum {
+ FILE_WAV = 1,
+ FILE_MP3,
+ FILE_AAC,
+ FILE_AAC_ADTS
+};
+
+typedef enum {
+ AAC_LC = 1,
+ AAC_HE_V1,
+ AAC_HE_V2
+} aac_format_type_t;
+
+static pthread_mutex_t write_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t write_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t drain_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t drain_cond = PTHREAD_COND_INITIALIZER;
+
+
+int async_callback(qahw_stream_callback_event_t event, void *param,
+ void *cookie)
+{
+ switch (event) {
+ case QAHW_STREAM_CBK_EVENT_WRITE_READY:
+ fprintf(log_file, "QAHW_STREAM_CBK_EVENT_DRAIN_READY\n");
+ pthread_mutex_lock(&write_lock);
+ pthread_cond_signal(&write_cond);
+ pthread_mutex_unlock(&write_lock);
+ break;
+ case QAHW_STREAM_CBK_EVENT_DRAIN_READY:
+ fprintf(log_file, "QAHW_STREAM_CBK_EVENT_DRAIN_READY\n");
+ pthread_mutex_lock(&drain_lock);
+ pthread_cond_signal(&drain_cond);
+ pthread_mutex_unlock(&drain_lock);
+ default:
+ break;
+ }
+ return 0;
+}
+
+
+int write_to_hal(qahw_stream_handle_t* out_handle, char *data,
+ size_t bytes)
+{
+ ssize_t ret;
+ pthread_mutex_lock(&write_lock);
+ qahw_out_buffer_t out_buf;
+
+ memset(&out_buf,0, sizeof(qahw_out_buffer_t));
+ out_buf.buffer = data;
+ out_buf.bytes = bytes;
+
+ ret = qahw_out_write(out_handle, &out_buf);
+ if (ret < 0 || ret == bytes) {
+ fprintf(log_file, "Writing data to hal failed or full write %ld, %ld\n",
+ ret, bytes);
+ } else if (ret != bytes) {
+ fprintf(log_file, "ret %ld, bytes %ld\n", ret, bytes);
+ fprintf(log_file, "Waiting for event write ready\n");
+ pthread_cond_wait(&write_cond, &write_lock);
+ fprintf(log_file, "out of wait for event write ready\n");
+ }
+
+ pthread_mutex_unlock(&write_lock);
+ return ret;
+}
+
+
+/* Play audio from a WAV file.
+ *
+ * Parameters:
+ * out_stream: A pointer to the output audio stream.
+ * in_file: A pointer to a SNDFILE object.
+ * config: A pointer to struct that contains audio configuration data.
+ *
+ * Returns: An int which has a non-negative number on success.
+ */
+
+int play_file(qahw_stream_handle_t* out_handle, FILE* in_file,
+ bool is_offload) {
+ int rc = 0;
+ int offset = 0;
+ size_t bytes_wanted = 0;
+ size_t write_length = 0;
+ size_t bytes_remaining = 0;
+ size_t bytes_written = 0;
+ size_t bytes_read = 0;
+ char *data = NULL;
+ qahw_out_buffer_t out_buf;
+ bool exit = false;
+
+ if (is_offload) {
+ fprintf(log_file, "Set callback for offload stream\n");
+ qahw_out_set_callback(out_handle, async_callback, NULL);
+ }
+
+ rc = qahw_out_set_volume(out_handle, vol_level, vol_level);
+ if (rc < 0)
+ fprintf(log_file, "unable to set volume");
+
+ bytes_wanted = qahw_out_get_buffer_size(out_handle);
+ data = (char *) malloc (bytes_wanted);
+ if (data == NULL) {
+ fprintf(log_file, "calloc failed!!\n");
+ return -ENOMEM;
+ }
+
+ while (!exit) {
+ if (!bytes_remaining) {
+ bytes_read = fread(data, 1, bytes_wanted, in_file);
+ fprintf(log_file, "fread from file %ld\n", bytes_read);
+ if (bytes_read <= 0) {
+ if (feof(in_file)) {
+ fprintf(log_file, "End of file");
+ if (is_offload) {
+ pthread_mutex_lock(&drain_lock);
+ if (is_offload) {
+ qahw_out_drain(out_handle, QAHW_DRAIN_ALL);
+ pthread_cond_wait(&drain_cond, &drain_lock);
+ fprintf(log_file, "Out of compress drain\n");
+ }
+ pthread_mutex_unlock(&drain_lock);
+ }
+ } else {
+ fprintf(log_file, "Error in fread --%d\n", ferror(in_file));
+ fprintf(stderr, "Error in fread --%d\n", ferror(in_file));
+ }
+ exit = true;
+ continue;
+ }
+ bytes_remaining = write_length = bytes_read;
+ }
+
+ offset = write_length - bytes_remaining;
+ fprintf(log_file, "bytes_remaining %ld, offset %d, write length %ld\n",
+ bytes_remaining, offset, write_length);
+ bytes_written = write_to_hal(out_handle, data+offset, bytes_remaining);
+ bytes_remaining -= bytes_written;
+ fprintf(log_file, "bytes_written %ld, bytes_remaining %ld\n",
+ bytes_written, bytes_remaining);
+ }
+
+ return rc;
+}
+
+bool is_valid_aac_format_type(aac_format_type_t format_type)
+{
+ bool valid_format_type = false;
+
+ switch (format_type) {
+ case AAC_LC:
+ case AAC_HE_V1:
+ case AAC_HE_V2:
+ valid_format_type = true;
+ break;
+ default:
+ break;
+ }
+ return valid_format_type;
+}
+
+/*
+ * Obtain aac format (refer audio.h) for format type entered.
+ */
+
+audio_format_t get_aac_format(int filetype, aac_format_type_t format_type)
+{
+ audio_format_t aac_format = AUDIO_FORMAT_AAC_ADTS_LC; /* default aac frmt*/
+
+ if (filetype == FILE_AAC_ADTS) {
+ switch (format_type) {
+ case AAC_LC:
+ aac_format = AUDIO_FORMAT_AAC_ADTS_LC;
+ break;
+ case AAC_HE_V1:
+ aac_format = AUDIO_FORMAT_AAC_ADTS_HE_V1;
+ break;
+ case AAC_HE_V2:
+ aac_format = AUDIO_FORMAT_AAC_ADTS_HE_V2;
+ break;
+ default:
+ break;
+ }
+ } else if (filetype == FILE_AAC) {
+ switch (format_type) {
+ case AAC_LC:
+ aac_format = AUDIO_FORMAT_AAC_LC;
+ break;
+ case AAC_HE_V1:
+ aac_format = AUDIO_FORMAT_AAC_HE_V1;
+ break;
+ case AAC_HE_V2:
+ aac_format = AUDIO_FORMAT_AAC_HE_V2;
+ break;
+ default:
+ break;
+ }
+ } else {
+ fprintf(log_file, "Invalid filetype provided %d\n", filetype);
+ fprintf(stderr, "Invalid filetype provided %d\n", filetype);
+ }
+
+ fprintf(log_file, "aac format %d\n", aac_format);
+ return aac_format;
+}
+
+void usage() {
+ printf(" \n Command \n");
+ printf(" \n hal_play_test <file path> - path of file to be played\n");
+ printf(" \n Options\n");
+ printf(" -r --sample-rate <sampling rate> - Required for Non-WAV streams\n");
+ printf(" For AAC-HE pls specify half the sample rate\n\n");
+ printf(" -c --channel count <channels> - Required for Non-WAV streams\n\n");
+ printf(" -v --volume <float volume level> - Volume level float value between 0.0 - 1.0.\n");
+ printf(" -d --device <decimal value> - see system/media/audio/include/system/audio.h for device values\n");
+ printf(" Optional Argument and Default value is 2, i.e Speaker\n\n");
+ printf(" -t --file-type <file type> - 1:WAV 2:MP3 3:AAC 4:AAC_ADTS\n");
+ printf(" Required for non WAV formats\n\n");
+ printf(" -a --aac-type <aac type> - Required for AAC streams\n");
+ printf(" 1: LC 2: HE_V1 3: HE_V2\n\n");
+ printf(" -l --log-file <FILEPATH> - File path for debug msg, to print\n");
+ printf(" on console use stdout or 1 \n\n");
+ printf(" \n Examples \n");
+ printf(" hal_play_test /etc/Anukoledenadu.wav -> plays Wav stream with default params\n\n");
+ printf(" hal_play_test /etc/MateRani.mp3 -t 2 -d 2 -v 0.01 -r 44100 -c 2 \n");
+ printf(" -> plays MP3 stream(-t = 2) on speaker device(-d = 2)\n");
+ printf(" -> 2 channels and 44100 sample rate\n\n");
+ printf(" hal_play_test /etc/AACLC-71-48000Hz-384000bps.aac -t 4 -d 2 -v 0.05 -r 48000 -c 2 -a 1 \n");
+ printf(" -> plays AAC-ADTS stream(-t = 4) on speaker device(-d = 2)\n");
+ printf(" -> AAC format type is LC(-a = 1)\n");
+ printf(" -> 2 channels and 48000 sample rate\n\n");
+ printf(" hal_play_test /etc/AACHE-adts-stereo-32000KHz-128000Kbps.aac -t 4 -d 2 -v 0.05 -r 16000 -c 2 -a 3 \n");
+ printf(" -> plays AAC-ADTS stream(-t = 4) on speaker device(-d = 2)\n");
+ printf(" -> AAC format type is HE V2(-a = 3)\n");
+ printf(" -> 2 channels and 16000 sample rate\n");
+ printf(" -> note that the sample rate is half the actual sample rate\n\n");
+}
+
+int main(int argc, char* argv[]) {
+
+ FILE *file_stream = NULL;
+ char header[44] = {0};
+ char* filename = nullptr;
+ qahw_module_handle_t *qahw_mod_handle;
+ const char *mod_name = "audio.primary";
+ qahw_stream_handle_t* out_handle = nullptr;
+ int rc = 0;
+
+ /*
+ * Default values
+ */
+ int filetype = FILE_WAV;
+ int sample_rate = 44100;
+ int channels = 2;
+ const int audio_device_base = 0x2;/* spkr device*/
+ aac_format_type_t format_type = AAC_LC;
+ log_file = stdout;
+ audio_devices_t output_device = AUDIO_DEVICE_OUT_SPEAKER;
+
+ struct option long_options[] = {
+ /* These options set a flag. */
+ {"device", required_argument, 0, 'd'},
+ {"sample-rate", required_argument, 0, 'r'},
+ {"channels", required_argument, 0, 'c'},
+ {"volume", required_argument, 0, 'v'},
+ {"log-file", required_argument, 0, 'l'},
+ {"file-type", required_argument, 0, 't'},
+ {"aac-type", required_argument, 0, 'a'},
+ {"help", no_argument, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+
+ int opt = 0;
+ int option_index = 0;
+ while ((opt = getopt_long(argc,
+ argv,
+ "-r:c:d:v:l::t:a:h",
+ long_options,
+ &option_index)) != -1) {
+ switch (opt) {
+ case 'r':
+ sample_rate = atoi(optarg);
+ break;
+ case 'c':;
+ channels = atoi(optarg);
+ break;
+ case 'd':
+ output_device = atoi(optarg);
+ break;
+ case 'v':
+ vol_level = atof(optarg);
+ break;
+ case 'l':
+ /*
+ * Fix Me: unable to log to a given file.
+ */
+ log_filename = optarg;
+ if((log_file = fopen(log_filename,"wb"))== NULL) {
+ fprintf(stderr, "Cannot open log file %s\n", log_filename);
+ /*
+ * continue to log to std out.
+ */
+ log_file = stdout;
+ }
+
+ break;
+ case 't':
+ filetype = atoi(optarg);
+ break;
+ case 'a':
+ format_type = atoi(optarg);
+ break;
+ case 'h':
+ usage();
+ return 0;
+ break;
+ }
+ }
+
+ filename = argv[1];
+ if((file_stream = fopen(filename, "r"))== NULL) {
+ fprintf(stderr, "Cannot Open Audio File %s\n", filename);
+ goto EXIT;
+ }
+
+ /*
+ * Set to a high number so it doesn't interfere with existing stream handles
+ */
+
+ audio_io_handle_t handle = 0x999;
+ audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
+
+ fprintf(stdout, "Playing:%s\n", filename);
+ fprintf(stdout, "File Type:%d\n", filetype);
+ fprintf(stdout, "Sample Rate:%d\n", sample_rate);
+ fprintf(stdout, "Channels:%d\n", channels);
+ fprintf(stdout, "Log file:%s\n", log_filename);
+ fprintf(stdout, "Volume level:%f\n", vol_level);
+ fprintf(stdout, "Output Device:%d\n", output_device);
+ fprintf(stdout, "Format Type:%d\n", format_type);
+
+ fprintf(stdout, "Starting audio hal tests.\n");
+
+ qahw_mod_handle = qahw_load_module(mod_name);
+
+ audio_config_t config;
+ memset(&config, 0, sizeof(audio_config_t));
+
+ switch (filetype) {
+ case FILE_WAV:
+ /*
+ * Read the wave header
+ */
+ rc = fread (header, 44 , 1, file_stream);
+ if (rc != 1) {
+ fprintf(stdout, "Error .Fread failed\n");
+ exit(0);
+ }
+ if (strncmp (header, "RIFF", 4) && strncmp (header+8, "WAVE", 4)) {
+ fprintf(stdout, "Not a wave format\n");
+ exit (1);
+ }
+ memcpy (&channels, &header[22], 2);
+ memcpy (&sample_rate, &header[24], 4);
+ config.channel_mask = audio_channel_out_mask_from_count(channels);
+ config.offload_info.channel_mask = config.channel_mask;
+ config.offload_info.sample_rate = sample_rate;
+ config.offload_info.format = AUDIO_FORMAT_PCM_16_BIT;
+ break;
+
+ case FILE_MP3:
+ config.channel_mask = audio_channel_out_mask_from_count(channels);
+ config.offload_info.channel_mask = config.channel_mask;
+ config.sample_rate = sample_rate;
+ config.offload_info.sample_rate = sample_rate;
+ config.offload_info.format = AUDIO_FORMAT_MP3;
+ flags |= AUDIO_OUTPUT_FLAG_NON_BLOCKING;
+ break;
+
+ case FILE_AAC:
+ case FILE_AAC_ADTS:
+ config.channel_mask = audio_channel_out_mask_from_count(channels);
+ config.offload_info.channel_mask = config.channel_mask;
+ config.sample_rate = sample_rate;
+ config.offload_info.sample_rate = sample_rate;
+ if (!is_valid_aac_format_type(format_type)) {
+ fprintf(log_file, "Invalid format type for AAC %d\n", format_type);
+ goto EXIT;
+ }
+ config.offload_info.format = get_aac_format(filetype, format_type);
+ flags |= AUDIO_OUTPUT_FLAG_NON_BLOCKING;
+ break;
+
+
+ default:
+ fprintf(stderr, "Does not support given filetype\n");
+ usage();
+ return 0;
+ }
+ config.offload_info.version = AUDIO_OFFLOAD_INFO_VERSION_CURRENT;
+ config.offload_info.size = sizeof(audio_offload_info_t);
+
+ fprintf(log_file, "Now playing to output_device=%d sample_rate=%d \n"
+ , output_device, config.offload_info.sample_rate);
+ const char* stream_name = "output_stream";
+
+ fprintf(log_file, "calling open_out_put_stream:\n");
+ rc = qahw_open_output_stream(qahw_mod_handle,
+ handle,
+ output_device,
+ flags,
+ &config,
+ &out_handle,
+ stream_name);
+ fprintf(log_file, "open output stream is sucess:%d out_handhle %p\n"
+ , rc, out_handle);
+ if (rc) {
+ fprintf(stdout, "could not open output stream %d \n", rc);
+ goto EXIT;
+ }
+
+ play_file(out_handle,
+ file_stream,
+ (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD));
+
+EXIT:
+
+ if (out_handle != nullptr) {
+ rc = qahw_out_standby(out_handle);
+ if (rc) {
+ fprintf(stdout, "out standby failed %d \n", rc);
+ }
+
+ rc = qahw_close_output_stream(out_handle);
+ if (rc) {
+ fprintf(stdout, "could not close output stream %d \n", rc);
+ }
+
+ rc = qahw_unload_module(qahw_mod_handle);
+ if (rc) {
+ fprintf(stdout, "could not unload hal %d \n", rc);
+ return -1;
+ }
+ }
+
+ if ((log_file != stdout) && (log_file != nullptr))
+ fclose(log_file);
+
+ if (file_stream != nullptr)
+ fclose(file_stream);
+
+ fprintf(stdout, "\nBYE BYE\n");
+ return 0;
+}