Merge "hal: Use echo ref snd device only for echo ref use cases - checks if uc_id is for echo ref use case - ensures auto-only use of echo ref snd device"
diff --git a/configs/lahaina/yupik_overlay/mixer_paths_yupikidp_overlay.xml b/configs/lahaina/yupik_overlay/mixer_paths_yupikidp_overlay.xml
index d016dd4..e79e5f1 100644
--- a/configs/lahaina/yupik_overlay/mixer_paths_yupikidp_overlay.xml
+++ b/configs/lahaina/yupik_overlay/mixer_paths_yupikidp_overlay.xml
@@ -67,18 +67,18 @@
<path name="speaker-dmic-broadside">
<ctl name="TX_CDC_DMA_TX_3 Channels" value="Two"/>
<ctl name="TX_AIF1_CAP Mixer DEC1" value="1"/>
- <ctl name="TX DMIC MUX1" value="DMIC0"/>
+ <ctl name="TX DMIC MUX1" value="DMIC3"/>
<ctl name="TX_AIF1_CAP Mixer DEC2" value="1"/>
- <ctl name="TX DMIC MUX2" value="DMIC3"/>
+ <ctl name="TX DMIC MUX2" value="DMIC0"/>
</path>
<path name="three-mic">
<ctl name="TX_CDC_DMA_TX_3 Channels" value="Three"/>
<ctl name="TX_AIF1_CAP Mixer DEC1" value="1"/>
- <ctl name="TX DMIC MUX1" value="DMIC0"/>
+ <ctl name="TX DMIC MUX1" value="DMIC3"/>
<ctl name="TX_AIF1_CAP Mixer DEC2" value="1"/>
- <ctl name="TX DMIC MUX2" value="DMIC2"/>
+ <ctl name="TX DMIC MUX2" value="DMIC0"/>
<ctl name="TX_AIF1_CAP Mixer DEC3" value="1"/>
- <ctl name="TX DMIC MUX3" value="DMIC3"/>
+ <ctl name="TX DMIC MUX3" value="DMIC2"/>
</path>
<path name="speaker-tmic">
<path name="three-mic" />
@@ -86,13 +86,13 @@
<path name="speaker-qmic">
<ctl name="TX_CDC_DMA_TX_3 Channels" value="Four"/>
<ctl name="TX_AIF1_CAP Mixer DEC1" value="1"/>
- <ctl name="TX DMIC MUX1" value="DMIC0"/>
+ <ctl name="TX DMIC MUX1" value="DMIC3"/>
<ctl name="TX_AIF1_CAP Mixer DEC2" value="1"/>
- <ctl name="TX DMIC MUX2" value="DMIC1"/>
+ <ctl name="TX DMIC MUX2" value="DMIC0"/>
<ctl name="TX_AIF1_CAP Mixer DEC3" value="1"/>
<ctl name="TX DMIC MUX3" value="DMIC2"/>
<ctl name="TX_AIF1_CAP Mixer DEC4" value="1"/>
- <ctl name="TX DMIC MUX4" value="DMIC3"/>
+ <ctl name="TX DMIC MUX4" value="DMIC1"/>
</path>
<path name="voice-tty-vco-handset-mic">
<path name="dmic1"/>
diff --git a/configs/lahaina/yupik_overlay/mixer_paths_yupikqrd_overlay.xml b/configs/lahaina/yupik_overlay/mixer_paths_yupikqrd_overlay.xml
index d57fdad..0dd5a01 100644
--- a/configs/lahaina/yupik_overlay/mixer_paths_yupikqrd_overlay.xml
+++ b/configs/lahaina/yupik_overlay/mixer_paths_yupikqrd_overlay.xml
@@ -35,10 +35,10 @@
<ctl name="TX DEC5 MUX" value="MSM_DMIC"/>
<ctl name="TX DEC6 MUX" value="MSM_DMIC"/>
<ctl name="TX DEC7 MUX" value="MSM_DMIC"/>
- <ctl name="TX_DEC0 Volume" value="96"/>
- <ctl name="TX_DEC1 Volume" value="96"/>
- <ctl name="TX_DEC2 Volume" value="96"/>
- <ctl name="TX_DEC3 Volume" value="96"/>
+ <ctl name="TX_DEC0 Volume" value="84"/>
+ <ctl name="TX_DEC1 Volume" value="84"/>
+ <ctl name="TX_DEC2 Volume" value="84"/>
+ <ctl name="TX_DEC3 Volume" value="84"/>
<ctl name="MultiMedia1 Mixer SEC_MI2S_TX" value="0"/>
<ctl name="MultiMedia2 Mixer SEC_MI2S_TX" value="0"/>
<ctl name="MultiMedia8 Mixer SEC_MI2S_TX" value="0"/>
diff --git a/configs/msm8937/audio_platform_info_sdm429w.xml b/configs/msm8937/audio_platform_info_sdm429w.xml
index 91a7a20..9509f18 100644
--- a/configs/msm8937/audio_platform_info_sdm429w.xml
+++ b/configs/msm8937/audio_platform_info_sdm429w.xml
@@ -56,6 +56,7 @@
<param key="spkr_1_tz_name" value="wsa881x.0f"/>
<param key="spkr_2_tz_name" value=""/>
<param key="hfp_pcm_dev_id" value="18"/>
+ <param key="afe_loopback" value="1"/>
</config_params>
<acdb_ids>
<device name="SND_DEVICE_OUT_SPEAKER_PROTECTED" acdb_id="136"/>
diff --git a/configs/msm8937/audio_platform_info_sdm429w_dvt2.xml b/configs/msm8937/audio_platform_info_sdm429w_dvt2.xml
index 8dacccf..65450e5 100644
--- a/configs/msm8937/audio_platform_info_sdm429w_dvt2.xml
+++ b/configs/msm8937/audio_platform_info_sdm429w_dvt2.xml
@@ -59,6 +59,7 @@
<param key="spkr_2_tz_name" value=""/>
<param key="hfp_vol_mixer_ctl" value="SLIMBUS_7 LOOPBACK Volume"/>
<param key="hfp_pcm_dev_id" value="18"/>
+ <param key="afe_loopback" value="1"/>
</config_params>
<acdb_ids>
<device name="SND_DEVICE_OUT_SPEAKER_PROTECTED" acdb_id="136"/>
diff --git a/configs/msm8937/msm8937.mk b/configs/msm8937/msm8937.mk
index 23364e2..a801809 100644
--- a/configs/msm8937/msm8937.mk
+++ b/configs/msm8937/msm8937.mk
@@ -157,10 +157,10 @@
$(TOPDIR)vendor/qcom/opensource/audio-hal/primary-hal/configs/msm8937/audio_policy_configuration_sdm429w.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml
else ifeq ($(TARGET_USES_AOSP_FOR_AUDIO), true)
PRODUCT_COPY_FILES += \
- $(TOPDIR)vendor/qcom/opensource/audio-hal/primary-hal/configs/msm8937/audio_policy_configuration_common.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \
+ $(TOPDIR)vendor/qcom/opensource/audio-hal/primary-hal/configs/msm8937/audio_policy_configuration_common.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml
else
PRODUCT_COPY_FILES += \
- $(TOPDIR)vendor/qcom/opensource/audio-hal/primary-hal/configs/msm8937/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml
+ $(TOPDIR)vendor/qcom/opensource/audio-hal/primary-hal/configs/msm8937/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio/audio_policy_configuration.xml
endif
PRODUCT_COPY_FILES += \
$(TOPDIR)vendor/qcom/opensource/audio-hal/primary-hal/configs/common/bluetooth_qti_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_audio_policy_configuration.xml \
@@ -205,10 +205,6 @@
PRODUCT_PROPERTY_OVERRIDES += \
vendor.audio.offload.track.enable=true
-#Enable music through deep buffer
-PRODUCT_PROPERTY_OVERRIDES += \
-audio.deep_buffer.media=true
-
#enable voice path for PCM VoIP by default
PRODUCT_PROPERTY_OVERRIDES += \
vendor.voice.path.for.pcm.voip=true
diff --git a/configs/msmnile_au/audio_policy_configuration.xml b/configs/msmnile_au/audio_policy_configuration.xml
index 4193abd..07b27d3 100644
--- a/configs/msmnile_au/audio_policy_configuration.xml
+++ b/configs/msmnile_au/audio_policy_configuration.xml
@@ -175,12 +175,6 @@
<profile name="" format="AUDIO_FORMAT_AAC_ADTS_HE_V2"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
- <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- 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,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="dsd_compress_passthrough" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
diff --git a/configs/msmnile_au/msmnile_au.mk b/configs/msmnile_au/msmnile_au.mk
index 7d9aa3c..0cc188e 100644
--- a/configs/msmnile_au/msmnile_au.mk
+++ b/configs/msmnile_au/msmnile_au.mk
@@ -93,13 +93,17 @@
ifeq ($(TARGET_PRODUCT),msmnile_au)
AUDIO_FEATURE_ENABLED_DAEMON_SUPPORT := true
+AUDIO_FEATURE_ENABLED_SILENT_BOOT := true
else
AUDIO_FEATURE_ENABLED_DAEMON_SUPPORT := false
+AUDIO_FEATURE_ENABLED_SILENT_BOOT := false
endif
-
endif
AUDIO_FEATURE_ENABLED_FM_TUNER_EXT := true
AUDIO_FEATURE_ENABLED_ICC := true
+ifneq ( ,$(filter S 12, $(PLATFORM_VERSION)))
+AUDIO_FEATURE_ENABLED_POWER_POLICY := true
+endif
##AUTOMOTIVE_AUDIO_FEATURE_FLAGS
ifneq ($(strip $(TARGET_USES_RRO)), true)
@@ -389,7 +393,8 @@
vendor.audio.feature.audiozoom.enable=false \
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
-vendor.audio.feature.synth.enable=true
+vendor.audio.feature.synth.enable=true \
+vendor.audio.feature.powerpolicy.enable=true
else
# Non-Generic ODM varient related
PRODUCT_ODM_PROPERTIES += \
@@ -436,7 +441,8 @@
vendor.audio.feature.audiozoom.enable=false \
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
-vendor.audio.feature.synth.enable=true
+vendor.audio.feature.synth.enable=true \
+vendor.audio.feature.powerpolicy.enable=true
endif
# for HIDL related packages
diff --git a/configs/msmsteppe_au/audio_policy_configuration.xml b/configs/msmsteppe_au/audio_policy_configuration.xml
index 24d1447..e85abe1 100644
--- a/configs/msmsteppe_au/audio_policy_configuration.xml
+++ b/configs/msmsteppe_au/audio_policy_configuration.xml
@@ -175,12 +175,6 @@
<profile name="" format="AUDIO_FORMAT_AAC_ADTS_HE_V2"
samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
- <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
- 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,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="dsd_compress_passthrough" role="source"
flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
diff --git a/configs/msmsteppe_au/msmsteppe_au.mk b/configs/msmsteppe_au/msmsteppe_au.mk
index 769333d..9d990a5 100644
--- a/configs/msmsteppe_au/msmsteppe_au.mk
+++ b/configs/msmsteppe_au/msmsteppe_au.mk
@@ -80,9 +80,13 @@
ifneq ($(ENABLE_HYP),true)
AUDIO_FEATURE_ENABLED_AUTO_AUDIOD := true
AUDIO_FEATURE_ENABLED_DAEMON_SUPPORT := true
+AUDIO_FEATURE_ENABLED_SILENT_BOOT := true
endif
AUDIO_FEATURE_ENABLED_FM_TUNER_EXT := true
AUDIO_FEATURE_ENABLED_ICC := true
+ifneq ( ,$(filter S 12, $(PLATFORM_VERSION)))
+AUDIO_FEATURE_ENABLED_POWER_POLICY := true
+endif
##AUTOMOTIVE_AUDIO_FEATURE_FLAGS
ifneq ($(strip $(TARGET_USES_RRO)), true)
@@ -365,7 +369,8 @@
vendor.audio.feature.audiozoom.enable=false \
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
-vendor.audio.feature.synth.enable=true
+vendor.audio.feature.synth.enable=true \
+vendor.audio.feature.powerpolicy.enable=true
else
# Non-Generic ODM varient related
PRODUCT_ODM_PROPERTIES += \
@@ -412,7 +417,8 @@
vendor.audio.feature.audiozoom.enable=false \
vendor.audio.feature.snd_mon.enable=false \
vendor.audio.feature.auto_hal.enable=true \
-vendor.audio.feature.synth.enable=true
+vendor.audio.feature.synth.enable=true \
+vendor.audio.feature.powerpolicy.enable=true
endif
# for HIDL related packages
diff --git a/hal/audio_extn/Android.mk b/hal/audio_extn/Android.mk
index aba6592..db80656 100755
--- a/hal/audio_extn/Android.mk
+++ b/hal/audio_extn/Android.mk
@@ -1139,3 +1139,41 @@
endif
include $(BUILD_SHARED_LIBRARY)
endif
+#-------------------------------------------
+
+# Build Power_Policy_Client LIB
+#-------------------------------------------
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_POWER_POLICY)),true)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libaudiopowerpolicy
+
+LOCAL_VENDOR_MODULE := true
+
+LOCAL_SRC_FILES:= \
+ PowerPolicyClient.cpp \
+ power_policy_launcher.cpp
+
+LOCAL_C_INCLUDES:= \
+ vendor/qcom/opensource/audio-hal/primary-hal/hal \
+ system/media/audio/include
+
+LOCAL_SHARED_LIBRARIES:= \
+ android.frameworks.automotive.powerpolicy-ndk_platform \
+ libbase \
+ libbinder_ndk \
+ libcutils \
+ liblog \
+ libpowerpolicyclient
+
+ifneq ($(filter kona lahaina holi,$(TARGET_BOARD_PLATFORM)),)
+LOCAL_SANITIZE := integer_overflow
+endif
+
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DAEMON_SUPPORT)),true)
+ LOCAL_CFLAGS += -DDAEMON_SUPPORT_AUTO
+endif
+
+include $(BUILD_SHARED_LIBRARY)
+endif
diff --git a/hal/audio_extn/PowerPolicyClient.cpp b/hal/audio_extn/PowerPolicyClient.cpp
new file mode 100644
index 0000000..e3a9e22
--- /dev/null
+++ b/hal/audio_extn/PowerPolicyClient.cpp
@@ -0,0 +1,117 @@
+/* Copyright (c) 2021, 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 "PowerPolicyClient.h"
+
+#include <android-base/logging.h>
+#include <dlfcn.h>
+
+#ifdef DAEMON_SUPPORT_AUTO
+#define LIB_AUDIO_HAL_PLUGIN "libaudiohalpluginclient.so"
+#else
+#define LIB_AUDIO_HAL_PLUGIN "libaudiohalplugin.so"
+#endif
+
+namespace aafap = aidl::android::frameworks::automotive::powerpolicy;
+
+using aafap::CarPowerPolicy;
+using aafap::CarPowerPolicyFilter;
+using aafap::PowerComponent;
+using ::android::frameworks::automotive::powerpolicy::hasComponent;
+using ::ndk::ScopedAStatus;
+
+namespace {
+
+constexpr PowerComponent kAudioComponent = PowerComponent::AUDIO;
+constexpr PowerComponent kMicComponent = PowerComponent::MICROPHONE;
+
+} // namespace
+
+PowerPolicyClient::PowerPolicyClient() {
+ plugin_handle = dlopen(LIB_AUDIO_HAL_PLUGIN, RTLD_NOW);
+ if (plugin_handle == NULL) {
+ LOG(ERROR) << "Failed to open plugin library";
+ return;
+ }
+
+ hal_plugin_send_msg = (hal_plugin_send_msg_t) dlsym(plugin_handle,
+ "audio_hal_plugin_send_msg");
+ if (hal_plugin_send_msg == NULL) {
+ LOG(ERROR) << "dlsym failed for audio_hal_plugin_send_msg";
+ dlclose(plugin_handle);
+ plugin_handle = NULL;
+ }
+
+ LOG(ERROR) << "PowerPolicyClient Initialzed";
+}
+
+PowerPolicyClient::~PowerPolicyClient() {
+ if (plugin_handle != NULL)
+ dlclose(plugin_handle);
+}
+
+void PowerPolicyClient::onInitFailed() {
+ LOG(ERROR) << "Initializing power policy client failed";
+}
+
+std::vector<PowerComponent> PowerPolicyClient::getComponentsOfInterest() {
+ std::vector<PowerComponent> components{kAudioComponent, kMicComponent};
+ return components;
+}
+
+ScopedAStatus PowerPolicyClient::onPolicyChanged(const CarPowerPolicy& powerPolicy) {
+ uint8_t disable = 0;
+
+ if (hasComponent(powerPolicy.enabledComponents, kAudioComponent)) {
+ LOG(ERROR) << "Power policy: Audio component is enabled";
+ disable = 0;
+ if (hal_plugin_send_msg != NULL)
+ hal_plugin_send_msg(AUDIO_HAL_PLUGIN_MSG_SILENT_MODE,
+ &disable, sizeof(disable));
+ } else if (hasComponent(powerPolicy.disabledComponents, kAudioComponent)) {
+ LOG(ERROR) << "Power policy: Audio component is disabled";
+ disable = 1;
+ if (hal_plugin_send_msg != NULL)
+ hal_plugin_send_msg(AUDIO_HAL_PLUGIN_MSG_SILENT_MODE,
+ &disable, sizeof(disable));
+ }
+
+ if (hasComponent(powerPolicy.enabledComponents, kMicComponent)) {
+ LOG(ERROR) << "Power policy: Microphone component is enabled";
+ disable = 0;
+ if (hal_plugin_send_msg != NULL)
+ hal_plugin_send_msg(AUDIO_HAL_PLUGIN_MSG_MIC_STATE,
+ &disable, sizeof(disable));
+ } else if (hasComponent(powerPolicy.disabledComponents, kMicComponent)) {
+ disable = 1;
+ if (hal_plugin_send_msg != NULL)
+ hal_plugin_send_msg(AUDIO_HAL_PLUGIN_MSG_MIC_STATE,
+ &disable, sizeof(disable));
+ LOG(ERROR) << "Power policy: Microphone component is disabled";
+ }
+ return ScopedAStatus::ok();
+}
diff --git a/hal/audio_extn/PowerPolicyClient.h b/hal/audio_extn/PowerPolicyClient.h
new file mode 100644
index 0000000..da0b434
--- /dev/null
+++ b/hal/audio_extn/PowerPolicyClient.h
@@ -0,0 +1,53 @@
+/* Copyright (c) 2021, 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 QTI_AUDIO_POWERPOLICYCLIENT_H_
+#define QTI_AUDIO_POWERPOLICYCLIENT_H_
+
+#include "PowerPolicyClientBase.h"
+#include "audio_hal_plugin.h"
+
+typedef int32_t (*hal_plugin_send_msg_t) (audio_hal_plugin_msg_type_t, void*, uint32_t);
+
+class PowerPolicyClient
+ : public ::android::frameworks::automotive::powerpolicy::PowerPolicyClientBase {
+ public:
+ explicit PowerPolicyClient();
+ ~PowerPolicyClient();
+
+ void onInitFailed();
+ std::vector<::aidl::android::frameworks::automotive::powerpolicy::PowerComponent>
+ getComponentsOfInterest() override;
+ ::ndk::ScopedAStatus onPolicyChanged(
+ const ::aidl::android::frameworks::automotive::powerpolicy::CarPowerPolicy&) override;
+
+ private:
+ void* plugin_handle;
+ hal_plugin_send_msg_t hal_plugin_send_msg;
+};
+
+#endif // QTI_AUDIO_POWERPOLICYCLIENT_H_
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index c9dac71..654128a 100755
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -6451,7 +6451,75 @@
// END: Synth ========================================================================
+// START: Power Policy Client ======================================================================
+#ifdef __LP64__
+#define POWER_POLICY_LIB_PATH "/vendor/lib64/libaudiopowerpolicy.so"
+#else
+#define POWER_POLICY_LIB_PATH "/vendor/lib/libaudiopowerpolicy.so"
+#endif
+static void* power_policy_lib_handle;
+typedef int (*launch_power_policy_t) ();
+static launch_power_policy_t launch_power_policy;
+
+static void* power_policy_thread_func(void* arg __unused) {
+ if (launch_power_policy == NULL) {
+ ALOGE("%s: Power Policy launcher is NULL", __func__);
+ goto exit;
+ }
+ ALOGD("%s: Launching Power Policy Client", __func__);
+ launch_power_policy();
+
+exit:
+ pthread_exit(NULL);
+}
+
+static int power_policy_feature_init(bool is_feature_enabled)
+{
+ pthread_t tid;
+ pthread_attr_t attr;
+
+ ALOGD("%s: Called with feature %s", __func__,
+ is_feature_enabled ? "Enabled" : "NOT Enabled");
+ if (is_feature_enabled) {
+ // dlopen lib
+ power_policy_lib_handle = dlopen(POWER_POLICY_LIB_PATH, RTLD_NOW);
+
+ if (!power_policy_lib_handle) {
+ ALOGE("%s: dlopen failed", __func__);
+ goto feature_disabled;
+ }
+ if (!(launch_power_policy = (launch_power_policy_t)dlsym(
+ power_policy_lib_handle, "launchPowerPolicyClient")))
+ {
+ ALOGE("%s: dlsym failed", __func__);
+ goto feature_disabled;
+ }
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ if (pthread_create(&tid, &attr, power_policy_thread_func, NULL))
+ {
+ ALOGE("%s: Failed to create power policy thread", __func__);
+ goto feature_disabled;
+ }
+ ALOGD("%s:: ---- Feature Power Policy Client is Enabled ----", __func__);
+ return 0;
+ }
+
+feature_disabled:
+ if (power_policy_lib_handle) {
+ dlclose(power_policy_lib_handle);
+ power_policy_lib_handle = NULL;
+ }
+
+ launch_power_policy = NULL;
+
+ ALOGW(":: %s: ---- Feature Power Policy Client is disabled ----", __func__);
+ return -ENOSYS;
+
+// END: Power Policy Client ======================================================================
+}
void audio_extn_feature_init()
{
vendor_enhanced_info = audio_extn_utils_get_vendor_enhanced_info();
@@ -6576,6 +6644,9 @@
synth_feature_init(
property_get_bool("vendor.audio.feature.synth.enable",
false));
+ power_policy_feature_init(
+ property_get_bool("vendor.audio.feature.powerpolicy.enable",
+ false));
}
void audio_extn_set_parameters(struct audio_device *adev,
diff --git a/hal/audio_extn/power_policy_launcher.cpp b/hal/audio_extn/power_policy_launcher.cpp
new file mode 100644
index 0000000..a85f30c
--- /dev/null
+++ b/hal/audio_extn/power_policy_launcher.cpp
@@ -0,0 +1,51 @@
+/* Copyright (c) 2021, 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 "PowerPolicyClient.h"
+
+#include <android-base/logging.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <log/log.h>
+
+extern "C" {
+
+ int launchPowerPolicyClient() {
+ ALOGD("%s: power policy launcher called", __func__);
+ ABinderProcess_setThreadPoolMaxThreadCount(0);
+ std::shared_ptr<PowerPolicyClient> powerPolicyClient =
+ ::ndk::SharedRefBase::make<PowerPolicyClient>();
+ ALOGD("%s:Instantiating power policy client from launcher", __func__);
+ powerPolicyClient->init();
+ ALOGD("%s: Power Policy class inited, joining threadpool", __func__);
+
+ ABinderProcess_joinThreadPool();
+
+ LOG(ERROR) << "Error in PowerPolicyClient binder thread";
+ return EXIT_FAILURE; // should not reach
+ }
+}
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index a4d17b8..31ce934 100755
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -1101,50 +1101,57 @@
goto exit_send_app_type_cfg;
}
+ /*
+ * Value of afe_loopback gets read based on the property defined in
+ * audio_platform_info.xml. If afe loopback is set then do not execute
+ * session 1 path as app type mixer control will not be created for
+ * afe loopback
+ */
+
if (usecase->type == PCM_HFP_CALL) {
-
- /* config HFP session:1 playback path */
- if (is_bus_dev_usecase) {
- app_type = usecase->out_app_type_cfg.app_type;
- sample_rate= usecase->out_app_type_cfg.sample_rate;
- } else {
- snd_device = SND_DEVICE_NONE; // use legacy behavior
- app_type = platform_get_default_app_type_v2(adev->platform, PCM_PLAYBACK);
- sample_rate= CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
- }
- rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
- acdb_dev_id, sample_rate,
- PCM_PLAYBACK,
- snd_device);
- if (rc < 0)
- goto exit_send_app_type_cfg;
-
- /* config HFP session:1 capture path */
- if (is_bus_dev_usecase) {
- snd_device = usecase->in_snd_device;
- pcm_device_id = platform_get_pcm_device_id(usecase->id, PCM_CAPTURE);
- acdb_dev_id = platform_get_snd_device_acdb_id(snd_device);
- if (acdb_dev_id < 0) {
- ALOGE("%s: Couldn't get the acdb dev id", __func__);
- rc = -EINVAL;
- goto exit_send_app_type_cfg;
+ if (!(platform_get_is_afe_loopback_enabled(adev->platform))) {
+ /* config HFP session:1 playback path */
+ if (is_bus_dev_usecase) {
+ app_type = usecase->out_app_type_cfg.app_type;
+ sample_rate= usecase->out_app_type_cfg.sample_rate;
+ } else {
+ snd_device = SND_DEVICE_NONE; // use legacy behavior
+ app_type = platform_get_default_app_type_v2(adev->platform, PCM_PLAYBACK);
+ sample_rate= CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
}
- app_type = usecase->in_app_type_cfg.app_type;
- sample_rate= usecase->in_app_type_cfg.sample_rate;
- } else {
- snd_device = SND_DEVICE_NONE; // use legacy behavior
- app_type = platform_get_default_app_type_v2(adev->platform, PCM_CAPTURE);
+ rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
+ acdb_dev_id, sample_rate,
+ PCM_PLAYBACK,
+ snd_device);
+ if (rc < 0)
+ goto exit_send_app_type_cfg;
+
+ /* config HFP session:1 capture path */
+ if (is_bus_dev_usecase) {
+ snd_device = usecase->in_snd_device;
+ pcm_device_id = platform_get_pcm_device_id(usecase->id, PCM_CAPTURE);
+ acdb_dev_id = platform_get_snd_device_acdb_id(snd_device);
+ if (acdb_dev_id < 0) {
+ ALOGE("%s: Couldn't get the acdb dev id", __func__);
+ rc = -EINVAL;
+ goto exit_send_app_type_cfg;
+ }
+ app_type = usecase->in_app_type_cfg.app_type;
+ sample_rate= usecase->in_app_type_cfg.sample_rate;
+ } else {
+ snd_device = SND_DEVICE_NONE; // use legacy behavior
+ app_type = platform_get_default_app_type_v2(adev->platform, PCM_CAPTURE);
+ }
+ rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
+ acdb_dev_id, sample_rate,
+ PCM_CAPTURE,
+ snd_device);
+ if (rc < 0)
+ goto exit_send_app_type_cfg;
+
+ if (is_bus_dev_usecase)
+ goto exit_send_app_type_cfg;
}
- rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
- acdb_dev_id, sample_rate,
- PCM_CAPTURE,
- snd_device);
- if (rc < 0)
- goto exit_send_app_type_cfg;
-
- if (is_bus_dev_usecase)
- goto exit_send_app_type_cfg;
-
/* config HFP session:2 capture path */
pcm_device_id = HFP_ASM_RX_TX;
snd_device = usecase->in_snd_device;
@@ -1157,7 +1164,7 @@
app_type = platform_get_default_app_type_v2(adev->platform, PCM_CAPTURE);
rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
acdb_dev_id, sample_rate, PCM_CAPTURE,
- SND_DEVICE_NONE);
+ usecase->in_snd_device);
if (rc < 0)
goto exit_send_app_type_cfg;
@@ -1165,7 +1172,7 @@
app_type = platform_get_default_app_type_v2(adev->platform, PCM_PLAYBACK);
rc = set_stream_app_type_mixer_ctrl(adev, pcm_device_id, app_type,
acdb_dev_id, sample_rate,
- PCM_PLAYBACK, SND_DEVICE_NONE);
+ PCM_PLAYBACK, usecase->out_snd_device);
if (rc < 0)
goto exit_send_app_type_cfg;
}
diff --git a/hal/audio_hal_plugin.h b/hal/audio_hal_plugin.h
index b5033c8..1f56a2f 100644
--- a/hal/audio_hal_plugin.h
+++ b/hal/audio_hal_plugin.h
@@ -86,6 +86,8 @@
AUDIO_HAL_PLUGIN_MSG_CODEC_GET_PP_EQ, /**< get EQ params */
AUDIO_HAL_PLUGIN_MSG_CODEC_GET_PP_EQ_SUBBANDS, /**< get EQ subbands params */
AUDIO_HAL_PLUGIN_MSG_CODEC_TUNNEL_GET_CMD, /**< pass through get cmds */
+ AUDIO_HAL_PLUGIN_MSG_SILENT_MODE, /**<set silent boot mode */
+ AUDIO_HAL_PLUGIN_MSG_MIC_STATE, /**< enable or disable codec mic */
AUDIO_HAL_PLUGIN_MSG_MAX
} audio_hal_plugin_msg_type_t;
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 2a335f0..d31df8e 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -7665,6 +7665,11 @@
return false;
}
+int platform_get_is_afe_loopback_enabled(void *platform __unused)
+{
+ return 0;
+}
+
int platform_set_edid_channels_configuration(void *platform, int channels, int backend_idx __unused, snd_device_t snd_device __unused) {
struct platform_data *my_data = (struct platform_data *)platform;
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index 439b6d7..aa4286f 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1223,6 +1223,11 @@
return -ENOSYS;
}
+int platform_get_is_afe_loopback_enabled(void *platform __unused)
+{
+ return 0;
+}
+
int platform_set_edid_channels_configuration(void *platform __unused,
int channels __unused,
int backend_idx __unused)
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 5788727..d30e777 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -317,6 +317,7 @@
bool fluence_nn_enabled;
int fluence_type;
int fluence_mode;
+ int afe_loopback;
char fluence_cap[PROPERTY_VALUE_MAX];
bool ambisonic_capture;
bool ambisonic_profile;
@@ -8524,6 +8525,12 @@
}
}
+ err = str_parms_get_str(parms, "afe_loopback", value, len);
+ if (err >= 0) {
+ my_data->afe_loopback = atoi(value);
+ ALOGD("Updating afe_loopback as %d from platform XML" , my_data->afe_loopback);
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
if (err >= 0) {
if (!strncmp("left", value, sizeof("left")))
@@ -11513,6 +11520,12 @@
backend_idx, snd_device, 0, 0);
}
+int platform_get_is_afe_loopback_enabled(void *platform)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ return my_data->afe_loopback;
+}
+
int platform_set_edid_channels_configuration_v2(void *platform, int channels,
int backend_idx, snd_device_t snd_device,
int controller, int stream) {
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 922d61e..f0b10f5 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -333,6 +333,7 @@
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);
+int platform_get_is_afe_loopback_enabled(void *platform);
void platform_invalidate_hdmi_config(void *platform);
void platform_invalidate_backend_config(void * platform,snd_device_t snd_device);
bool platform_get_spkr_hph_single_be_native_concurrency_flag();