Merge "hal: Configure frame size of AAC encoded output."
diff --git a/configs/msmsteppe/audio_output_policy.conf b/configs/msmsteppe/audio_io_policy.conf
similarity index 86%
rename from configs/msmsteppe/audio_output_policy.conf
rename to configs/msmsteppe/audio_io_policy.conf
index 877b6a5..3fc62eb 100644
--- a/configs/msmsteppe/audio_output_policy.conf
+++ b/configs/msmsteppe/audio_io_policy.conf
@@ -82,3 +82,24 @@
app_type 69940
}
}
+
+inputs {
+ record_16bit {
+ formats AUDIO_FORMAT_PCM_16_BIT
+ sampling_rates 8000|16000|32000|44100|48000|88200|96000|176400|192000
+ bit_width 16
+ app_type 69938
+ }
+ record_24bit {
+ formats AUDIO_FORMAT_PCM_24_BIT_PACKED|AUDIO_FORMAT_PCM_24_BIT
+ sampling_rates 44100|48000|88200|96000|176400|192000
+ bit_width 24
+ app_type 69948
+ }
+ record_32bit {
+ formats AUDIO_FORMAT_PCM_32_BIT|AUDIO_FORMAT_PCM_FLOAT
+ sampling_rates 44100|48000|88200|96000|176400|192000
+ bit_width 32
+ app_type 69949
+ }
+}
diff --git a/configs/msmsteppe/audio_platform_info.xml b/configs/msmsteppe/audio_platform_info.xml
index 15c9119..fb181f5 100644
--- a/configs/msmsteppe/audio_platform_info.xml
+++ b/configs/msmsteppe/audio_platform_info.xml
@@ -42,6 +42,10 @@
<device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" acdb_id="145"/>
<device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
<device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC_AEC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_VOCE_RECOG_USB_HEADSET_HEX_MIC" acdb_id="162"/>
</acdb_ids>
<module_ids>
diff --git a/configs/msmsteppe/audio_platform_info_intcodec.xml b/configs/msmsteppe/audio_platform_info_intcodec.xml
index 14f9421..2e98afc 100644
--- a/configs/msmsteppe/audio_platform_info_intcodec.xml
+++ b/configs/msmsteppe/audio_platform_info_intcodec.xml
@@ -100,6 +100,10 @@
<device name="SND_DEVICE_IN_UNPROCESSED_THREE_MIC" acdb_id="145"/>
<device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
<device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_USB_HEADSET_HEX_MIC_AEC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_UNPROCESSED_USB_HEADSET_HEX_MIC" acdb_id="162"/>
+ <device name="SND_DEVICE_IN_VOCE_RECOG_USB_HEADSET_HEX_MIC" acdb_id="162"/>
<device name="SND_DEVICE_IN_HANDSET_GENERIC_QMIC" acdb_id="157"/>
</acdb_ids>
<backend_names>
diff --git a/configs/msmsteppe/audio_policy_configuration.xml b/configs/msmsteppe/audio_policy_configuration.xml
index 2131c39..4a0ff8a 100644
--- a/configs/msmsteppe/audio_policy_configuration.xml
+++ b/configs/msmsteppe/audio_policy_configuration.xml
@@ -187,6 +187,17 @@
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,AUDIO_CHANNEL_INDEX_MASK_6"/>
</mixPort>
+ <mixPort name="usb_surround_sound" role="sink">
+ <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,88200,96000,176400,192000"
+ 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,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,88200,96000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <profile name="" format="AUDIO_FORMAT_PCM_FLOAT"
+ samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,88200,96000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ </mixPort>
<mixPort name="record_24" role="sink">
<profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,96000,192000"
@@ -312,15 +323,26 @@
</devicePort>
<devicePort tagName="USB Device In" type="AUDIO_DEVICE_IN_USB_DEVICE" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <!-- edit as needed -->
+ <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
</devicePort>
<devicePort tagName="USB Headset In" type="AUDIO_DEVICE_IN_USB_HEADSET" role="source">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
<profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
- samplingRates="44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
+ <!-- edit as needed -->
+ <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
+ samplingRates="44100,48000,64000,88200,96000,128000,176400,192000"
+ channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_IN_7POINT1,AUDIO_CHANNEL_INDEX_MASK_8"/>
</devicePort>
</devicePorts>
@@ -360,6 +382,8 @@
sources="Wired Headset Mic,BT SCO Headset Mic,FM Tuner,USB Device In,USB Headset In,Telephony Rx"/>
<route type="mix" sink="surround_sound"
sources="Built-In Mic,Built-In Back Mic"/>
+ <route type="mix" sink="usb_surround_sound"
+ sources="USB Device In,USB Headset In"/>
<route type="mix" sink="record_24"
sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic"/>
<route type="mix" sink="mmap_no_irq_in"
diff --git a/configs/msmsteppe/mixer_paths_wcd9375.xml b/configs/msmsteppe/mixer_paths_wcd9375.xml
index 85de3eb..680f445 100644
--- a/configs/msmsteppe/mixer_paths_wcd9375.xml
+++ b/configs/msmsteppe/mixer_paths_wcd9375.xml
@@ -371,8 +371,9 @@
<ctl name="COMP7 Switch" value="0" />
<ctl name="COMP8 Switch" value="0" />
- <!-- Headphone Default mode - AB -->
- <ctl name="RX HPH Mode" value="CLS_AB" />
+ <!-- Headphone class-H mode -->
+ <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
<!-- IIR/voice anc -->
<ctl name="IIR0 Band1" id ="0" value="268435456" />
@@ -2130,9 +2131,13 @@
</path>
<path name="hph-highquality-mode">
+ <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
+ <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
</path>
<path name="hph-lowpower-mode">
+ <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
</path>
<path name="true-native-mode">
diff --git a/configs/msmsteppe/mixer_paths_wcd9375qrd.xml b/configs/msmsteppe/mixer_paths_wcd9375qrd.xml
index df6890b..2a9499e 100644
--- a/configs/msmsteppe/mixer_paths_wcd9375qrd.xml
+++ b/configs/msmsteppe/mixer_paths_wcd9375qrd.xml
@@ -371,8 +371,9 @@
<ctl name="COMP7 Switch" value="0" />
<ctl name="COMP8 Switch" value="0" />
- <!-- Headphone Default mode - AB -->
- <ctl name="RX HPH Mode" value="CLS_AB" />
+ <!-- Headphone class-H mode -->
+ <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
<!-- IIR/voice anc -->
<ctl name="IIR0 Band1" id ="0" value="268435456" />
@@ -2210,9 +2211,13 @@
</path>
<path name="hph-highquality-mode">
+ <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
+ <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
</path>
<path name="hph-lowpower-mode">
+ <ctl name="RX_HPH_PWR_MODE" value="ULP" />
+ <ctl name="RX HPH Mode" value="CLS_H_ULP" />
</path>
<path name="true-native-mode">
diff --git a/configs/msmsteppe/msmsteppe.mk b/configs/msmsteppe/msmsteppe.mk
index a275dee..e7158fa 100644
--- a/configs/msmsteppe/msmsteppe.mk
+++ b/configs/msmsteppe/msmsteppe.mk
@@ -74,7 +74,7 @@
DEVICE_PACKAGE_OVERLAYS += hardware/qcom/audio/configs/common/overlay
PRODUCT_COPY_FILES += \
- hardware/qcom/audio/configs/msmsteppe/audio_output_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_output_policy.conf \
+ hardware/qcom/audio/configs/msmsteppe/audio_io_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_io_policy.conf \
hardware/qcom/audio/configs/msmsteppe/audio_effects.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.conf \
hardware/qcom/audio/configs/msmsteppe/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
hardware/qcom/audio/configs/msmsteppe/audio_tuning_mixer_tavil.txt:$(TARGET_COPY_OUT_VENDOR)/etc/audio_tuning_mixer_tavil.txt \
diff --git a/configs/sdm710/audio_platform_info_intcodec.xml b/configs/sdm710/audio_platform_info_intcodec.xml
index 603ec57..4ae3bb1 100644
--- a/configs/sdm710/audio_platform_info_intcodec.xml
+++ b/configs/sdm710/audio_platform_info_intcodec.xml
@@ -27,6 +27,8 @@
<audio_platform_info>
<bit_width_configs>
<device name="SND_DEVICE_OUT_SPEAKER" bit_width="24"/>
+ <device name="SND_DEVICE_IN_HANDSET_MIC" bit_width="24"/>
+ <device name="SND_DEVICE_IN_HANDSET_GENERIC_QMIC" bit_width="24"/>
</bit_width_configs>
<interface_names>
<device name="AUDIO_DEVICE_IN_BUILTIN_MIC" interface="INT3_MI2S" codec_type="internal"/>
diff --git a/configs/sdm710/mixer_paths_tavil.xml b/configs/sdm710/mixer_paths_tavil.xml
index 14bbd40..3cb7a9f 100644
--- a/configs/sdm710/mixer_paths_tavil.xml
+++ b/configs/sdm710/mixer_paths_tavil.xml
@@ -758,6 +758,25 @@
<ctl name="DISPLAY_PORT Mixer MultiMedia4" value="1" />
</path>
+ <path name="silence-playback">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+ <ctl name="SLIMBUS_0_RX Audio Mixer MultiMedia9" value="1" />
+ </path>
+
+ <path name="ec-ref-audio-capture">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+ <ctl name="MultiMedia9 Mixer AFE_LOOPBACK_TX" value="1" />
+ </path>
+
+ <path name="ec-ref-loopback-mono">
+ </path>
+
+ <path name="ec-ref-loopback-stereo">
+ </path>
+
+ <path name="ec-ref-loopback-quad">
+ </path>
+
<path name="silence-playback display-port">
<ctl name="DISPLAY_PORT Mixer MultiMedia9" value="1" />
</path>
diff --git a/configs/sdm710/sdm710.mk b/configs/sdm710/sdm710.mk
index 536cc2c..6710eef 100644
--- a/configs/sdm710/sdm710.mk
+++ b/configs/sdm710/sdm710.mk
@@ -50,7 +50,7 @@
AUDIO_FEATURE_ENABLED_FLUENCE := true
AUDIO_FEATURE_ENABLED_HDMI_EDID := true
AUDIO_FEATURE_ENABLED_HDMI_PASSTHROUGH := true
-#AUDIO_FEATURE_ENABLED_KEEP_ALIVE := true
+AUDIO_FEATURE_ENABLED_KEEP_ALIVE := true
AUDIO_FEATURE_ENABLED_DISPLAY_PORT := true
AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := false
AUDIO_FEATURE_ENABLED_HFP := true
@@ -68,8 +68,13 @@
BOARD_SUPPORTS_QSTHW_API := true
AUDIO_FEATURE_ENABLED_RAS := true
AUDIO_FEATURE_ENABLED_SND_MONITOR := true
+BOARD_SUPPORTS_SOUND_TRIGGER_ARM := true
+AUDIO_FEATURE_ENABLED_FFV := true
+AUDIO_FEATURE_ENABLED_KEEP_ALIVE_ARM_FFV := true
AUDIO_FEATURE_ENABLED_DLKM := true
AUDIO_FEATURE_ENABLED_SVA_MULTI_STAGE := true
+BOARD_SUPPORTS_SOUND_TRIGGER_CPU_AFFINITY_SET := true
+BOARD_SUPPORTS_FFV_EC_THREAD_RT_PRIORITY := true
##AUDIO_FEATURE_FLAGS
ifneq ($(strip $(TARGET_USES_RRO)), true)
diff --git a/configs/sdm710/sound_trigger_mixer_paths_wcd9340.xml b/configs/sdm710/sound_trigger_mixer_paths_wcd9340.xml
index ffae119..4d1bb31 100644
--- a/configs/sdm710/sound_trigger_mixer_paths_wcd9340.xml
+++ b/configs/sdm710/sound_trigger_mixer_paths_wcd9340.xml
@@ -95,6 +95,7 @@
<ctl name= "WDMA3 CH2 MUX" value="PORT_0" />
<ctl name= "WDMA3_ON_OFF Switch" value="0" />
<ctl name="SLIM_0_TX Channels" value="One" />
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="None"/>
<path name="listen-voice-wakeup-1">
<ctl name="SLIMBUS_5_TX LSM Function" value="AUDIO" />
@@ -332,6 +333,44 @@
<ctl name="DMIC MUX8" value="DMIC0" />
</path>
+ <path name="listen-handset-qmic">
+ <ctl name="AIF1_CAP Mixer SLIM TX5" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX6" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX7" value="1" />
+ <ctl name="AIF1_CAP Mixer SLIM TX8" value="1" />
+ <ctl name="SLIM_0_TX Channels" value="Four" />
+ <ctl name="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="DMIC5" />
+ <ctl name="CDC_IF TX7 MUX" value="DEC7" />
+ <ctl name="ADC MUX7" value="DMIC" />
+ <ctl name="DMIC MUX7" value="DMIC2" />
+ <ctl name="CDC_IF TX8 MUX" value="DEC8" />
+ <ctl name="ADC MUX8" value="DMIC" />
+ <ctl name="DMIC MUX8" value="DMIC0" />
+ </path>
+
+ <path name="audio-capture">
+ <ctl name="MultiMedia2 Mixer SLIM_0_TX" value="1" />
+ </path>
+
+ <path name="ec-ref-audio-capture">
+ <ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX" />
+ <ctl name="MultiMedia9 Mixer AFE_LOOPBACK_TX" value="1" />
+ </path>
+
+ <path name="ec-ref-loopback-mono">
+ </path>
+
+ <path name="ec-ref-loopback-stereo">
+ </path>
+
+ <path name="ec-ref-loopback-quad">
+ </path>
+
<path name="echo-reference">
<ctl name="AUDIO_REF_EC_UL1 MUX" value="SLIM_RX"/>
<ctl name="EC Reference Channels" value="Two"/>
diff --git a/configs/sdm710/sound_trigger_platform_info.xml b/configs/sdm710/sound_trigger_platform_info.xml
index 9510045..4d657bd 100644
--- a/configs/sdm710/sound_trigger_platform_info.xml
+++ b/configs/sdm710/sound_trigger_platform_info.xml
@@ -54,10 +54,29 @@
<param DEVICE_HANDSET_QMIC_APE="137" />
<param DEVICE_HEADSET_MIC_CPE="139" />
<param DEVICE_HANDSET_DMIC_APE="149" />
+ <param DEVICE_HANDSET_QMIC_ARM="140" />
</acdb_ids>
<!-- Multiple sound_model_config tags can be listed, each with unique -->
<!-- vendor_uuid. The below tag represents QTI SVA engine sound model -->
<!-- configuration. ISV must use their own unique vendor_uuid. -->
+ <!-- ARM based SVA sound_model_config -->
+ <sound_model_config>
+ <param vendor_uuid="67fabb70-79e8-4e1c-a202-bcb050243a70" />
+ <param execution_type="ARM" />
+ <!-- ec reference loopback params -->
+ <!-- split_ec_ref_data - true if ec ref is packed with mic captured data -->
+ <param split_ec_ref_data="false"/>
+ <param ec_ref_channel_count="2"/>
+
+ <!-- Profile specific data which the algorithm can support -->
+ <param sample_rate="16000" />
+ <param bit_width="16" />
+ <param channel_count="4"/>
+ <!-- adm_cfg_profile should match with the one defined under adm_config -->
+ <!-- Set it to NONE if LSM directly connects to AFE -->
+ <param adm_cfg_profile="DEFAULT" />
+ </sound_model_config>
+ <!-- Sound model config for Hotword !-->
<sound_model_config>
<param vendor_uuid="68ab2d40-e860-11e3-95ef-0002a5d5c51b" />
<param execution_type="WDSP" /> <!-- value: "WDSP" "ADSP" "DYNAMIC" -->
diff --git a/configure.ac b/configure.ac
old mode 100644
new mode 100755
index a84e2cd..9b411cd
--- a/configure.ac
+++ b/configure.ac
@@ -81,6 +81,10 @@
AC_SUBST([TARGET_PLATFORM], ["msm8974"])
TARGET_CFLAGS="-DPLATFORM_MSM8996"
fi
+if (test x$TARGET_SUPPORT = xsdmsteppe); then
+ AC_SUBST([TARGET_PLATFORM], ["msm8974"])
+ TARGET_CFLAGS="-DPLATFORM_MSMSTEPPE"
+fi
AC_SUBST([TARGET_CFLAGS])
AM_CONDITIONAL([QTI_AUDIO_SERVER_ENABLED],[test x$BOARD_SUPPORTS_QTI_AUDIO_SERVER = xtrue])
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index ddf6b1d..7dedc48 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -84,6 +84,7 @@
#define MIXER_ENC_FMT_SBC "SBC"
#define MIXER_ENC_FMT_AAC "AAC"
#define MIXER_ENC_FMT_APTX "APTX"
+#define MIXER_FMT_TWS_CHANNEL_MODE "TWS Channel Mode"
#define MIXER_ENC_FMT_APTXHD "APTXHD"
#define MIXER_ENC_FMT_NONE "NONE"
#define ENCODER_LATENCY_SBC 10
@@ -173,6 +174,7 @@
typedef int (*audio_check_a2dp_ready_t)(void);
typedef uint16_t (*audio_get_a2dp_sink_latency_t)(void);
typedef int (*audio_is_scrambling_enabled_t)(void);
+typedef bool (*audio_is_tws_mono_mode_enable_t)(void);
enum A2DP_STATE {
A2DP_STATE_CONNECTED,
@@ -240,6 +242,7 @@
audio_check_a2dp_ready_t audio_check_a2dp_ready;
audio_get_a2dp_sink_latency_t audio_get_a2dp_sink_latency;
audio_is_scrambling_enabled_t audio_is_scrambling_enabled;
+ audio_is_tws_mono_mode_enable_t audio_is_tws_mono_mode_enable;
enum A2DP_STATE bt_state;
enc_codec_t bt_encoder_format;
uint32_t enc_sampling_rate;
@@ -250,6 +253,8 @@
bool is_a2dp_offload_supported;
bool is_handoff_in_progress;
bool is_aptx_dual_mono_supported;
+ /* Mono Mode support for TWS+ */
+ bool is_tws_mono_mode_on;
bool is_aptx_adaptive;
/* Adaptive bitrate config for A2DP codecs */
struct a2dp_abr_config abr_config;
@@ -784,6 +789,8 @@
dlsym(a2dp.bt_lib_handle,"audio_get_a2dp_sink_latency");
a2dp.audio_is_scrambling_enabled = (audio_is_scrambling_enabled_t)
dlsym(a2dp.bt_lib_handle,"audio_is_scrambling_enabled");
+ a2dp.audio_is_tws_mono_mode_enable = (audio_is_tws_mono_mode_enable_t)
+ dlsym(a2dp.bt_lib_handle,"isTwsMonomodeEnable");
}
}
@@ -1232,6 +1239,26 @@
return ret;
}
+
+static void audio_a2dp_update_tws_channel_mode()
+{
+ char* channel_mode;
+ struct mixer_ctl *ctl_channel_mode;
+ if (a2dp.is_tws_mono_mode_on)
+ channel_mode = "One";
+ else
+ channel_mode = "Two";
+ ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
+ if (!ctl_channel_mode) {
+ ALOGE("failed to get tws mixer ctl");
+ return;
+ }
+ if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
+ ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
+ return;
+ }
+}
+
static int update_aptx_dsp_config_v2(struct aptx_enc_cfg_t *aptx_dsp_cfg,
audio_aptx_encoder_config *aptx_bt_cfg)
{
@@ -1261,8 +1288,15 @@
break;
case 2:
default:
- aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
- aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
+ if (!a2dp.is_tws_mono_mode_on) {
+ aptx_dsp_cfg->custom_cfg.channel_mapping[0] = PCM_CHANNEL_L;
+ aptx_dsp_cfg->custom_cfg.channel_mapping[1] = PCM_CHANNEL_R;
+ }
+ else {
+ a2dp.is_tws_mono_mode_on = true;
+ ALOGD("Update tws for mono_mode_on: %d",a2dp.is_tws_mono_mode_on);
+ audio_a2dp_update_tws_channel_mode();
+ }
break;
}
a2dp.enc_channels = aptx_dsp_cfg->custom_cfg.num_channels;
@@ -1751,6 +1785,8 @@
case ENC_CODEC_TYPE_APTX_DUAL_MONO:
ALOGD(" Received APTX dual mono encoder supported BT device");
a2dp.is_aptx_dual_mono_supported = true;
+ if (a2dp.audio_is_tws_mono_mode_enable != NULL)
+ a2dp.is_tws_mono_mode_on = a2dp.audio_is_tws_mono_mode_enable();
aptx_encoder_cfg.dual_mono_cfg = (audio_aptx_dual_mono_config *)codec_info;
is_configured =
configure_aptx_enc_format(&aptx_encoder_cfg);
@@ -1854,8 +1890,9 @@
{
int ret =0;
- struct mixer_ctl *ctl_enc_config, *ctrl_bit_format;
+ struct mixer_ctl *ctl_enc_config, *ctrl_bit_format, *ctl_channel_mode;
struct sbc_enc_cfg_t dummy_reset_config;
+ char* channel_mode;
memset(&dummy_reset_config, 0x0, sizeof(struct sbc_enc_cfg_t));
ctl_enc_config = mixer_get_ctl_by_name(a2dp.adev->mixer,
@@ -1877,6 +1914,17 @@
ALOGE("%s: Failed to set bit format to encoder", __func__);
}
}
+ ctl_channel_mode = mixer_get_ctl_by_name(a2dp.adev->mixer,MIXER_FMT_TWS_CHANNEL_MODE);
+
+ if (!ctl_channel_mode) {
+ ALOGE("failed to get tws mixer ctl");
+ } else {
+ channel_mode = "Two";
+ if (mixer_ctl_set_enum_by_string(ctl_channel_mode, channel_mode) != 0) {
+ ALOGE("%s: Failed to set the channel mode = %s", __func__, channel_mode);
+ }
+ a2dp.is_tws_mono_mode_on = false;
+ }
}
static int reset_a2dp_dec_config_params()
@@ -1981,6 +2029,17 @@
goto param_handled;
}
+ ret = str_parms_get_str(parms, "TwsChannelConfig", value, sizeof(value));
+ if (ret>=0) {
+ ALOGD("Setting tws channel mode to %s",value);
+ if(!(strncmp(value,"mono",strlen(value))))
+ a2dp.is_tws_mono_mode_on = true;
+ else if(!(strncmp(value,"dual-mono",strlen(value))))
+ a2dp.is_tws_mono_mode_on = false;
+ audio_a2dp_update_tws_channel_mode();
+ goto param_handled;
+ }
+
ret = str_parms_get_str(parms, "A2dpSuspended", value, sizeof(value));
if (ret >= 0) {
if (a2dp.bt_lib_handle) {
@@ -2112,6 +2171,7 @@
a2dp.abr_config.abr_started = false;
a2dp.abr_config.imc_instance = 0;
a2dp.abr_config.abr_tx_handle = NULL;
+ a2dp.is_tws_mono_mode_on = false;
reset_a2dp_enc_config_params();
reset_a2dp_dec_config_params();
update_offload_codec_capabilities();
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index ba096c9..ae1fef7 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -64,6 +64,8 @@
#define MAX_SLEEP_RETRY 100
#define WIFI_INIT_WAIT_SLEEP 50
+#define MAX_NUM_CHANNELS 8
+#define Q14_GAIN_UNITY 0x4000
struct audio_extn_module {
bool anc_enabled;
@@ -301,6 +303,74 @@
ALOGV("%s: Setting custom stereo state success", __func__);
}
}
+
+void audio_extn_send_dual_mono_mixing_coefficients(struct stream_out *out)
+{
+ struct audio_device *adev = out->dev;
+ struct mixer_ctl *ctl;
+ char mixer_ctl_name[128];
+ int cust_ch_mixer_cfg[128], len = 0;
+ int ip_channel_cnt = audio_channel_count_from_out_mask(out->channel_mask);
+ int pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
+ int op_channel_cnt = 2;
+ int i, j, err;
+
+ ALOGV("%s", __func__);
+ if (!out->started) {
+ out->set_dual_mono = true;
+ goto exit;
+ }
+
+ ALOGD("%s: i/p channel count %d, o/p channel count %d, pcm id %d", __func__,
+ ip_channel_cnt, op_channel_cnt, pcm_device_id);
+
+ snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
+ "Audio Stream %d Channel Mix Cfg", pcm_device_id);
+ ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+ if (!ctl) {
+ ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s",
+ __func__, mixer_ctl_name);
+ goto exit;
+ }
+
+ /* Output channel count corresponds to backend configuration channels.
+ * Input channel count corresponds to ASM session channels.
+ * Set params is called with channels that need to be selected from
+ * input to generate output.
+ * ex: "8,2" to downmix from 8 to 2 i.e. to downmix from 8 to 2,
+ *
+ * This mixer control takes values in the following sequence:
+ * - input channel count(m)
+ * - output channel count(n)
+ * - weight coeff for [out ch#1, in ch#1]
+ * ....
+ * - weight coeff for [out ch#1, in ch#m]
+ *
+ * - weight coeff for [out ch#2, in ch#1]
+ * ....
+ * - weight coeff for [out ch#2, in ch#m]
+ *
+ * - weight coeff for [out ch#n, in ch#1]
+ * ....
+ * - weight coeff for [out ch#n, in ch#m]
+ *
+ * To get dualmono ouptu weightage coeff is calculated as Unity gain
+ * divided by number of input channels.
+ */
+ cust_ch_mixer_cfg[len++] = ip_channel_cnt;
+ cust_ch_mixer_cfg[len++] = op_channel_cnt;
+ for (i = 0; i < op_channel_cnt; i++) {
+ for (j = 0; j < ip_channel_cnt; j++) {
+ cust_ch_mixer_cfg[len++] = Q14_GAIN_UNITY/ip_channel_cnt;
+ }
+ }
+
+ err = mixer_ctl_set_array(ctl, cust_ch_mixer_cfg, len);
+ if (err)
+ ALOGE("%s: ERROR. Mixer ctl set failed", __func__);
+exit:
+ return;
+}
#endif /* CUSTOM_STEREO_ENABLED */
#ifndef DTS_EAGLE
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index e74bd36..b2b0e73 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -43,6 +43,8 @@
#include "ip_hdlr_intf.h"
#include "battery_listener.h"
+#define AUDIO_PARAMETER_DUAL_MONO "dual_mono"
+
#ifndef AFE_PROXY_ENABLED
#define AUDIO_DEVICE_OUT_PROXY 0x40000
#endif
@@ -1132,4 +1134,9 @@
int audio_extn_ext_hw_plugin_set_audio_gain(void *plugin,
struct audio_usecase *usecase, uint32_t gain);
#endif
+#ifndef CUSTOM_STEREO_ENABLED
+#define audio_extn_send_dual_mono_mixing_coefficients(out) (0)
+#else
+void audio_extn_send_dual_mono_mixing_coefficients(struct stream_out *out);
+#endif
#endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_extn/fm.c b/hal/audio_extn/fm.c
index 02561ba..b635994 100644
--- a/hal/audio_extn/fm.c
+++ b/hal/audio_extn/fm.c
@@ -44,6 +44,7 @@
#define AUDIO_PARAMETER_KEY_REC_PLAY_CONC "rec_play_conc_on"
#define AUDIO_PARAMETER_KEY_FM_MUTE "fm_mute"
#define AUDIO_PARAMETER_KEY_FM_RESTORE_VOLUME "fm_restore_volume"
+#define AUDIO_PARAMETER_KEY_FM_ROUTING "fm_routing"
#define FM_LOOPBACK_DRAIN_TIME_MS 2
static struct pcm_config pcm_config_fm = {
@@ -64,6 +65,7 @@
bool is_fm_muted;
float fm_volume;
bool restart_fm;
+ audio_devices_t fm_device;
card_status_t card_status;
};
@@ -74,6 +76,7 @@
.is_fm_running = 0,
.is_fm_muted = 0,
.restart_fm = 0,
+ .fm_device = 0,
.card_status = CARD_STATUS_ONLINE,
};
@@ -153,30 +156,46 @@
disable_snd_device(adev, uc_info->in_snd_device);
list_remove(&uc_info->list);
+ free(uc_info->stream.out);
free(uc_info);
ALOGD("%s: exit: status(%d)", __func__, ret);
return ret;
}
-static int32_t fm_start(struct audio_device *adev)
+
+static int32_t fm_start(struct audio_device *adev, audio_devices_t outputDevices)
{
+ struct stream_out *fm_out;
int32_t ret = 0;
struct audio_usecase *uc_info;
int32_t pcm_dev_rx_id, pcm_dev_tx_id;
- ALOGD("%s: enter", __func__);
+
+ ALOGD("%s: Start FM over output device %d ", __func__, outputDevices);
fmmod.is_fm_running = true;
+ fm_out = (struct stream_out *)calloc(1, sizeof(struct stream_out));
+ if (!fm_out)
+ return -ENOMEM;
+
+ fm_out->sample_rate = 48000;
+ fm_out->format = AUDIO_FORMAT_PCM_16_BIT;
+ fm_out->usecase = USECASE_AUDIO_PLAYBACK_FM;
+ fm_out->config = pcm_config_fm;
+ fm_out->devices = outputDevices;
+
uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
- if (!uc_info)
+ if (!uc_info) {
+ free(fm_out);
return -ENOMEM;
+ }
uc_info->id = USECASE_AUDIO_PLAYBACK_FM;
uc_info->type = PCM_PLAYBACK;
- uc_info->stream.out = adev->primary_output;
- uc_info->devices = adev->primary_output->devices;
+ uc_info->stream.out = fm_out;
+ uc_info->devices = outputDevices;
uc_info->in_snd_device = SND_DEVICE_NONE;
uc_info->out_snd_device = SND_DEVICE_NONE;
@@ -221,6 +240,9 @@
pcm_start(fmmod.fm_pcm_rx);
pcm_start(fmmod.fm_pcm_tx);
+ fmmod.fm_device = fm_out->devices;
+ fm_set_volume(adev, fmmod.fm_volume, false);
+
ALOGD("%s: exit: status(%d)", __func__, ret);
return 0;
@@ -266,7 +288,7 @@
if (fmmod.restart_fm && (fmmod.card_status == CARD_STATUS_ONLINE)) {
ALOGD("sound card is ONLINE, restart FM");
fmmod.restart_fm = 0;
- fm_start(adev);
+ fm_start(adev, fmmod.fm_device);
}
ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_HANDLE_FM,
@@ -277,8 +299,8 @@
if (val != 0) {
if(val & AUDIO_DEVICE_OUT_FM
&& fmmod.is_fm_running == false) {
- adev->primary_output->devices = val & ~AUDIO_DEVICE_OUT_FM;
- fm_start(adev);
+ audio_devices_t OutputDevice = val & ~AUDIO_DEVICE_OUT_FM;
+ fm_start(adev, OutputDevice);
} else if (!(val & AUDIO_DEVICE_OUT_FM)
&& fmmod.is_fm_running == true) {
fm_set_volume(adev, 0, false);
@@ -288,6 +310,21 @@
}
}
+ ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_FM_ROUTING,
+ value, sizeof(value));
+ if (ret >= 0 && fmmod.is_fm_running) {
+ val = atoi(value);
+ ALOGD("%s: FM usecase", __func__);
+ if (val != 0) {
+ if(val & AUDIO_DEVICE_OUT_FM) {
+ audio_devices_t OutputDevice = val & ~AUDIO_DEVICE_OUT_FM;
+ fm_set_volume(adev, 0, false);
+ fm_stop(adev);
+ fm_start(adev, OutputDevice);
+ }
+ }
+ }
+
memset(value, 0, sizeof(value));
ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_FM_VOLUME,
value, sizeof(value));
diff --git a/hal/audio_extn/passthru.c b/hal/audio_extn/passthru.c
index b608043..9180391 100644
--- a/hal/audio_extn/passthru.c
+++ b/hal/audio_extn/passthru.c
@@ -546,6 +546,12 @@
struct stream_out *out)
{
struct audio_backend_cfg backend_cfg;
+ backend_cfg.sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ backend_cfg.channels = CODEC_BACKEND_DEFAULT_CHANNELS;
+ backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
+ backend_cfg.format = AUDIO_FORMAT_PCM_16_BIT;
+ backend_cfg.passthrough_enabled = false;
+
snd_device_t out_snd_device = SND_DEVICE_NONE;
int max_edid_channels = platform_edid_get_max_channels(out->dev->platform);
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index fc97cce..59fb5a3 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -747,7 +747,7 @@
struct timespec ts;
bool acquire_device = false;
- status.status = 0;
+ memset(&status, 0, sizeof(status));
memset(&protCfg, 0, sizeof(protCfg));
if (!adev) {
ALOGE("%s: Invalid params", __func__);
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index d35ff0d..5c7fc9c 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1703,28 +1703,25 @@
if (channels > MAX_HIFI_CHANNEL_COUNT)
channels = MAX_HIFI_CHANNEL_COUNT;
+ channel_count = DEFAULT_CHANNEL_COUNT;
+
if (is_playback) {
// For playback we never report mono because the framework always outputs stereo
- channel_count = DEFAULT_CHANNEL_COUNT;
// audio_channel_out_mask_from_count() does return positional masks for channel counts
- // above 2 but we want indexed masks here. So we
- for ( ; channel_count <= channels && num_masks < max_masks; channel_count++) {
- supported_channel_masks[num_masks++] = audio_channel_out_mask_from_count(channel_count);
- }
- for ( ; channel_count <= channels && num_masks < max_masks; channel_count++) {
- supported_channel_masks[num_masks++] =
- audio_channel_mask_for_index_assignment_from_count(channel_count);
- }
+ // above 2 but we want indexed masks here.
+ supported_channel_masks[num_masks++] = audio_channel_out_mask_from_count(channel_count);
} else {
- // For capture we report all supported channel masks from 1 channel up.
- channel_count = MIN_CHANNEL_COUNT;
// audio_channel_in_mask_from_count() does the right conversion to either positional or
// indexed mask
- for ( ; channel_count <= channels && num_masks < max_masks; channel_count++) {
- supported_channel_masks[num_masks++] =
- audio_channel_in_mask_from_count(channel_count);
- }
+ supported_channel_masks[num_masks++] = audio_channel_in_mask_from_count(channel_count);
}
+
+ for (channel_count = channels; ((channel_count >= DEFAULT_CHANNEL_COUNT) &&
+ (num_masks < max_masks)); channel_count--) {
+ supported_channel_masks[num_masks++] =
+ audio_channel_mask_for_index_assignment_from_count(channel_count);
+ }
+
ALOGV("%s: %s supported ch %d supported_channel_masks[0] %08x num_masks %d", __func__,
is_playback ? "P" : "C", channels, supported_channel_masks[0], num_masks);
return num_masks;
@@ -3213,6 +3210,8 @@
}
break;
}
+ platform_set_stream_channel_map(adev->platform, out->channel_mask,
+ out->pcm_device_id, &out->channel_map_param.channel_map[0]);
ALOGV("%s: pcm_prepare", __func__);
if (pcm_is_ready(out->pcm)) {
@@ -3226,8 +3225,6 @@
goto error_open;
}
}
- platform_set_stream_channel_map(adev->platform, out->channel_mask,
- out->pcm_device_id, &out->channel_map_param.channel_map[0]);
// apply volume for voip playback after path is set up
if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP)
out_set_voip_volume(&out->stream, out->volume_l, out->volume_r);
@@ -3424,12 +3421,47 @@
"%s: stream can not declare supporting its sample rate %x", __func__, sample_rate);
}
+static inline uint32_t lcm(uint32_t num1, uint32_t num2)
+{
+ uint32_t high = num1, low = num2, temp = 0;
+
+ if (!num1 || !num2)
+ return 0;
+
+ if (num1 < num2) {
+ high = num2;
+ low = num1;
+ }
+
+ while (low != 0) {
+ temp = low;
+ low = high % low;
+ high = temp;
+ }
+ return (num1 * num2)/high;
+}
+
+static inline uint32_t nearest_multiple(uint32_t num, uint32_t multiplier)
+{
+ uint32_t remainder = 0;
+
+ if (!multiplier)
+ return num;
+
+ remainder = num % multiplier;
+ if (remainder)
+ num += (multiplier - remainder);
+
+ return num;
+}
+
static size_t get_input_buffer_size(uint32_t sample_rate,
audio_format_t format,
int channel_count,
bool is_low_latency)
{
size_t size = 0;
+ uint32_t bytes_per_period_sample = 0;
if (check_input_parameters(sample_rate, format, channel_count) != 0)
return 0;
@@ -3438,15 +3470,16 @@
if (is_low_latency)
size = configured_low_latency_capture_period_size;
- size *= audio_bytes_per_sample(format) * channel_count;
+ bytes_per_period_sample = audio_bytes_per_sample(format) * channel_count;
+ size *= bytes_per_period_sample;
/* make sure the size is multiple of 32 bytes
* At 48 kHz mono 16-bit PCM:
* 5.000 ms = 240 frames = 15*16*1*2 = 480, a whole multiple of 32 (15)
* 3.333 ms = 160 frames = 10*16*1*2 = 320, a whole multiple of 32 (10)
+ * Also, make sure the size is multiple of bytes per period sample
*/
- size += 0x1f;
- size &= ~0x1f;
+ size = nearest_multiple(size, lcm(32, bytes_per_period_sample));
return size;
}
@@ -3987,6 +4020,13 @@
pthread_mutex_unlock(&out->lock);
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_DUAL_MONO, value,
+ sizeof(value));
+ if (err >= 0) {
+ if (!strncmp("true", value, sizeof("true")) || atoi(value))
+ audio_extn_send_dual_mono_mixing_coefficients(out);
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_PROFILE, value, sizeof(value));
if (err >= 0) {
strlcpy(out->profile, value, sizeof(out->profile));
@@ -4597,6 +4637,8 @@
ret = -EINVAL;
goto exit;
}
+ if (out->set_dual_mono)
+ audio_extn_send_dual_mono_mixing_coefficients(out);
}
if (adev->is_channel_status_set == false && (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)){
@@ -5969,6 +6011,7 @@
out->a2dp_compress_mute = false;
out->hal_output_suspend_supported = 0;
out->dynamic_pm_qos_config_supported = 0;
+ out->set_dual_mono = false;
if ((flags & AUDIO_OUTPUT_FLAG_BD) &&
(property_get_bool("vendor.audio.matrix.limiter.enable", false)))
@@ -7240,6 +7283,7 @@
in->usecase = USECASE_AUDIO_RECORD_MMAP;
in->config = pcm_config_mmap_capture;
in->config.format = pcm_format_from_audio_format(config->format);
+ in->config.channels = channel_count;
in->stream.start = in_start;
in->stream.stop = in_stop;
in->stream.create_mmap_buffer = in_create_mmap_buffer;
@@ -7391,8 +7435,10 @@
// between the callback and close_stream
audio_extn_snd_mon_unregister_listener(stream);
- /* Disable echo reference while closing input stream */
- platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE);
+ // Disable echo reference if there are no active input and hfp call
+ // while closing input stream
+ if (!adev->active_input && !audio_extn_hfp_is_active(adev))
+ platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE);
if (in == NULL) {
ALOGE("%s: audio_stream_in ptr is NULL", __func__);
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index c13ca56..1675893 100755
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -354,6 +354,7 @@
bool stream_config_changed;
mix_matrix_params_t pan_scale_params;
mix_matrix_params_t downmix_params;
+ bool set_dual_mono;
};
struct stream_in {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 2539ed1..30b9d10 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -2381,8 +2381,6 @@
ALOGD("ACDB initialization failed");
}
}
- /* init keep-alive for compress passthru */
- audio_extn_keep_alive_init(adev);
#ifdef DYNAMIC_LOG_ENABLED
log_utils_init();
#endif
@@ -6473,7 +6471,8 @@
*/
static bool platform_check_capture_codec_backend_cfg(struct audio_device* adev,
int backend_idx,
- struct audio_backend_cfg *backend_cfg)
+ struct audio_backend_cfg *backend_cfg,
+ snd_device_t snd_device)
{
bool backend_change = false;
unsigned int bit_width;
@@ -6494,14 +6493,18 @@
// 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)
- || (my_data->is_internal_codec)) {
+ 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 "
"for unprocessed/camera source", __func__);
bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
+ } else if (my_data->is_internal_codec && !audio_is_usb_in_device(snd_device)) {
+ sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
+ channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
+ if (adev->active_input->bit_width == 24)
+ bit_width = platform_get_snd_device_bit_width(snd_device);
} else {
struct listnode *node;
struct audio_usecase *uc = NULL;
@@ -6593,7 +6596,7 @@
backend_idx, usecase->id,
platform_get_snd_device_name(snd_device));
if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
- &backend_cfg)) {
+ &backend_cfg, snd_device)) {
ret = platform_set_codec_backend_cfg(adev, snd_device,
backend_cfg);
if(!ret)
diff --git a/qahw_api/test/qahw_playback_test.c b/qahw_api/test/qahw_playback_test.c
index 4160754..a048d3e 100644
--- a/qahw_api/test/qahw_playback_test.c
+++ b/qahw_api/test/qahw_playback_test.c
@@ -251,6 +251,7 @@
stream_param[i].ethread_data = nullptr;
stream_param[i].device_url = "stream";
stream_param[i].play_later = false;
+ stream_param[i].set_params = nullptr;
pthread_mutex_init(&stream_param[i].write_lock, (const pthread_mutexattr_t *)NULL);
pthread_cond_init(&stream_param[i].write_cond, (const pthread_condattr_t *) NULL);
@@ -797,6 +798,14 @@
if (bytes_to_read <= 0)
read_complete_file = true;
+ if (params->set_params) {
+ rc = qahw_out_set_parameters(params->out_handle, params->set_params);
+ if (rc) {
+ fprintf(log_file, "stream %s: failed to set kvpairs\n", params->set_params);
+ fprintf(stderr, "stream %s: failed to set kvpairs\n", params->set_params);
+ }
+ }
+
while (!exit && !stop_playback) {
if (!bytes_remaining) {
fprintf(log_file, "\nstream %d: reading bytes %zd\n", params->stream_index, bytes_wanted);
@@ -2095,7 +2104,7 @@
while ((opt = getopt_long(argc,
argv,
- "-f:r:c:b:d:s:v:V:l:t:a:w:k:PD:KF:Ee:A:u:m:S:C:p::x:y:qQh:i:h:g:",
+ "-f:r:c:b:d:s:v:V:l:t:a:w:k:PD:KF:Ee:A:u:m:S:C:p::x:y:qQh:i:h:g:O:",
long_options,
&option_index)) != -1) {
@@ -2233,6 +2242,9 @@
case 'K':
kpi_mode = true;
break;
+ case 'O':
+ stream_param[i].set_params = optarg;
+ break;
case 'F':
stream_param[i].flags = atoll(optarg);
stream_param[i].flags_set = true;
@@ -2533,6 +2545,7 @@
fprintf(log_file, "stream %d: Bitwidth:%d\n", stream->stream_index, stream->config.offload_info.bit_width);
fprintf(log_file, "stream %d: AAC Format Type:%d\n", stream->stream_index, stream->aac_fmt_type);
fprintf(log_file, "stream %d: Kvpair Values:%s\n", stream->stream_index, stream->kvpair_values);
+ fprintf(log_file, "stream %d: set params Values:%s\n", stream->stream_index, stream->set_params);
fprintf(log_file, "Log file:%s\n", log_filename);
fprintf(log_file, "Volume level:%f\n", vol_level);
diff --git a/qahw_api/test/qahw_playback_test.h b/qahw_api/test/qahw_playback_test.h
index 66229f5..b8bddbc 100644
--- a/qahw_api/test/qahw_playback_test.h
+++ b/qahw_api/test/qahw_playback_test.h
@@ -143,6 +143,7 @@
pthread_cond_t input_buffer_available_cond;
pthread_mutex_t input_buffer_available_lock;
uint32_t input_buffer_available_size;
+ char *set_params;
}stream_config;
qahw_module_handle_t * load_hal(audio_devices_t dev);