blob: 5b1709650aa4b6563089fada47e6fdf5984181a4 [file] [log] [blame]
/*
* Copyright (c) 2019-2020, 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_NDEBUG 0
#define LOG_TAG "APMConfigHelper"
#include "APMConfigHelper.h"
#include <cutils/properties.h>
#include <log/log.h>
#include <stdlib.h>
namespace android {
void APMConfigHelper::dump(String8 *dst) const
{
// apmconfig struct dump
dst->appendFormat("\nAudioPolicyManagerCustom Dump: %p\n", this);
dst->appendFormat("audio_offload_video: %d \n", mConfigs.audio_offload_video);
dst->appendFormat("audio_offload_disable: %d \n", mConfigs.audio_offload_disable);
dst->appendFormat("audio_deepbuffer_media: %d \n", mConfigs.audio_deepbuffer_media);
dst->appendFormat("audio_av_streaming_offload_enable: %d \n", mConfigs.audio_av_streaming_offload_enable);
dst->appendFormat("audio_offload_track_enable: %d \n", mConfigs.audio_offload_track_enable);
dst->appendFormat("audio_offload_multiple_enabled: %d \n", mConfigs.audio_offload_multiple_enabled);
dst->appendFormat("voice_dsd_playback_conc_disabled: %d \n", mConfigs.voice_dsd_playback_conc_disabled);
dst->appendFormat("audio_sva_conc_enabled: %d \n", mConfigs.audio_sva_conc_enabled);
dst->appendFormat("audio_va_concurrency_enabled: %d \n", mConfigs.audio_va_concurrency_enabled);
dst->appendFormat("audio_rec_playback_conc_disabled: %d \n", mConfigs.audio_rec_playback_conc_disabled);
dst->appendFormat("voice_path_for_pcm_voip: %d \n", mConfigs.voice_path_for_pcm_voip);
dst->appendFormat("voice_playback_conc_disabled: %d \n", mConfigs.voice_playback_conc_disabled);
dst->appendFormat("voice_record_conc_disabled: %d \n", mConfigs.voice_record_conc_disabled);
dst->appendFormat("voice_voip_conc_disabled: %d \n", mConfigs.voice_voip_conc_disabled);
dst->appendFormat("audio_offload_min_duration_secs: %u \n", mConfigs.audio_offload_min_duration_secs);
dst->appendFormat("voice_conc_fallbackpath: %s \n", mConfigs.voice_conc_fallbackpath.c_str());
dst->appendFormat("audio_extn_hdmi_spk_enabled: %d \n", mConfigs.audio_extn_hdmi_spk_enabled);
dst->appendFormat("audio_extn_formats_enabled: %d \n", mConfigs.audio_extn_formats_enabled);
dst->appendFormat("audio_extn_afe_proxy_enabled: %d \n", mConfigs.audio_extn_afe_proxy_enabled);
dst->appendFormat("compress_voip_enabled: %d \n", mConfigs.compress_voip_enabled);
dst->appendFormat("fm_power_opt: %d \n", mConfigs.fm_power_opt);
dst->appendFormat("voice_concurrency: %d \n", mConfigs.voice_concurrency);
dst->appendFormat("record_play_concurrency: %d \n", mConfigs.record_play_concurrency);
dst->appendFormat("use_xml_audio_policy_conf: %d \n", mConfigs.use_xml_audio_policy_conf);
}
void APMConfigHelper::retrieveConfigs()
{
#ifdef AHAL_EXT_ENABLED
if (isRemote) {
ALOGV("Already retrieved configs from remote");
return;
}
ALOGV("Try retrieving configs from remote");
mConfigs = getApmConfigs< IAudioHalExt,
&IAudioHalExt::getApmConfigs>(mConfigs, isRemote);
#endif /* AHAL_EXT_ENABLED */
// apmconfig struct dump
ALOGV("apmconfigs retrieved from %s", isRemote? "remote" : "local");
ALOGV("audio_offload_video: %d", mConfigs.audio_offload_video);
ALOGV("audio_offload_disable: %d", mConfigs.audio_offload_disable);
ALOGV("audio_deepbuffer_media: %d", mConfigs.audio_deepbuffer_media);
ALOGV("audio_av_streaming_offload_enable: %d", mConfigs.audio_av_streaming_offload_enable);
ALOGV("audio_offload_track_enable: %d", mConfigs.audio_offload_track_enable);
ALOGV("audio_offload_multiple_enabled: %d", mConfigs.audio_offload_multiple_enabled);
ALOGV("voice_dsd_playback_conc_disabled: %d", mConfigs.voice_dsd_playback_conc_disabled);
ALOGV("audio_sva_conc_enabled: %d", mConfigs.audio_sva_conc_enabled);
ALOGV("audio_va_concurrency_enabled: %d", mConfigs.audio_va_concurrency_enabled);
ALOGV("audio_rec_playback_conc_disabled: %d", mConfigs.audio_rec_playback_conc_disabled);
ALOGV("voice_path_for_pcm_voip: %d", mConfigs.voice_path_for_pcm_voip);
ALOGV("voice_playback_conc_disabled: %d", mConfigs.voice_playback_conc_disabled);
ALOGV("voice_record_conc_disabled: %d", mConfigs.voice_record_conc_disabled);
ALOGV("voice_voip_conc_disabled: %d", mConfigs.voice_voip_conc_disabled);
ALOGV("audio_offload_min_duration_secs: %u", mConfigs.audio_offload_min_duration_secs);
ALOGV("voice_conc_fallbackpath: %s", mConfigs.voice_conc_fallbackpath.c_str());
ALOGV("audio_extn_hdmi_spk_enabled: %d", mConfigs.audio_extn_hdmi_spk_enabled);
ALOGV("audio_extn_formats_enabled: %d", mConfigs.audio_extn_formats_enabled);
ALOGV("audio_extn_afe_proxy_enabled: %d", mConfigs.audio_extn_afe_proxy_enabled);
ALOGV("compress_voip_enabled: %d", mConfigs.compress_voip_enabled);
ALOGV("fm_power_opt: %d", mConfigs.fm_power_opt);
ALOGV("voice_concurrency: %d", mConfigs.voice_concurrency);
ALOGV("record_play_concurrency: %d", mConfigs.record_play_concurrency);
ALOGV("use_xml_audio_policy_conf: %d", mConfigs.use_xml_audio_policy_conf);
return;
}
APMConfigHelper::APMConfigHelper()
: isRemote(false)
{
uint32_t audio_offload_min_duration_secs = 0;
char voice_conc_fallbackpath[PROPERTY_VALUE_MAX] = "\0";
audio_offload_min_duration_secs =
(uint32_t)property_get_int32("audio.offload.min.duration.secs", 0);
property_get("vendor.voice.conc.fallbackpath", voice_conc_fallbackpath, NULL);
mConfigs = {
(bool) property_get_bool("audio.offload.video", true),
(bool) property_get_bool("audio.offload.disable", false),
(bool) property_get_bool("audio.deep_buffer.media", true),
(bool) property_get_bool("vendor.audio.av.streaming.offload.enable", false),
(bool) property_get_bool("vendor.audio.offload.track.enable", true),
(bool) property_get_bool("vendor.audio.offload.multiple.enabled", false),
(bool) property_get_bool("vendor.voice.dsd.playback.conc.disabled", true),
(bool) property_get_bool("persist.vendor.audio.sva.conc.enabled", false),
(bool) property_get_bool("persist.vendor.audio.va_concurrency_enabled", false),
(bool) property_get_bool("vendor.audio.rec.playback.conc.disabled", false),
(bool) property_get_bool("vendor.voice.path.for.pcm.voip", true),
(bool) property_get_bool("vendor.voice.playback.conc.disabled", false),
(bool) property_get_bool("vendor.voice.record.conc.disabled", false),
(bool) property_get_bool("vendor.voice.voip.conc.disabled", false),
audio_offload_min_duration_secs,
voice_conc_fallbackpath,
#ifdef AUDIO_EXTN_HDMI_SPK_ENABLED
true,
#else
false,
#endif
#ifdef AUDIO_EXTN_FORMATS_ENABLED
true,
#else
false,
#endif
#ifdef AUDIO_EXTN_AFE_PROXY_ENABLED
true,
#else
false,
#endif
#ifdef COMPRESS_VOIP_ENABLED
true,
#else
false,
#endif
#ifdef FM_POWER_OPT
true,
#else
false,
#endif
#ifdef VOICE_CONCURRENCY
true,
#else
false,
#endif
#ifdef RECORD_PLAY_CONCURRENCY
true,
#else
false,
#endif
#ifdef USE_XML_AUDIO_POLICY_CONF
true,
#else
false,
#endif
};
}
bool APMConfigHelper::isAudioOffloadVideoEnabled()
{
ALOGV("isAudioOffloadVideoEnabled enter");
retrieveConfigs();
return mConfigs.audio_offload_video;
}
bool APMConfigHelper::isAudioOffloadDisabled()
{
ALOGV("isAudioOffloadDisabled enter");
retrieveConfigs();
return mConfigs.audio_offload_disable;
}
bool APMConfigHelper::isAudioDeepbufferMediaEnabled()
{
ALOGV("isAudioDeepbufferMediaEnabled enter");
retrieveConfigs();
return mConfigs.audio_deepbuffer_media;
}
bool APMConfigHelper::isAVStreamingOffloadEnabled()
{
ALOGV("isAVStreamingOffloadEnabled enter");
retrieveConfigs();
return mConfigs.audio_av_streaming_offload_enable;
}
bool APMConfigHelper::isAudioTrackOffloadEnabled()
{
ALOGV("isAudioTrackOffloadEnabled enter");
retrieveConfigs();
return mConfigs.audio_offload_track_enable;
}
bool APMConfigHelper::isAudioMultipleOffloadEnable()
{
ALOGV("isAudioMultipleOffloadEnable enter");
retrieveConfigs();
return mConfigs.audio_offload_multiple_enabled;
}
bool APMConfigHelper::isVoiceDSDConcDisabled()
{
ALOGV("isVoiceDSDConcDisabled enter");
retrieveConfigs();
return mConfigs.voice_dsd_playback_conc_disabled;
}
bool APMConfigHelper::isSVAConcEnabled()
{
ALOGV("isSVAConcEnabled enter");
retrieveConfigs();
return mConfigs.audio_sva_conc_enabled;
}
bool APMConfigHelper::isVAConcEnabled()
{
ALOGV("isVAConcEnabled enter");
retrieveConfigs();
return mConfigs.audio_va_concurrency_enabled;
}
bool APMConfigHelper::isRecPlayConcDisabled()
{
ALOGV("isRecPlayConcDisabled enter");
retrieveConfigs();
return mConfigs.audio_rec_playback_conc_disabled;
}
bool APMConfigHelper::useVoicePathForPCMVOIP()
{
ALOGV("useVoicePathForPCMVOIP enter");
retrieveConfigs();
return mConfigs.voice_path_for_pcm_voip;
}
bool APMConfigHelper::isVoicePlayConcDisabled()
{
ALOGV("isVoicePlayConcDisabled enter");
retrieveConfigs();
return mConfigs.voice_playback_conc_disabled;
}
bool APMConfigHelper::isVoiceRecConcDisabled()
{
ALOGV("isVoiceRecConcDisabled enter");
retrieveConfigs();
return mConfigs.voice_record_conc_disabled;
}
bool APMConfigHelper::isVoiceVOIPConcDisabled()
{
ALOGV("isVoiceVOIPConcDisabled enter");
retrieveConfigs();
return mConfigs.voice_voip_conc_disabled;
}
uint32_t APMConfigHelper::getAudioOffloadMinDuration()
{
ALOGV("getAudioOffloadMinDuration enter");
retrieveConfigs();
return mConfigs.audio_offload_min_duration_secs;
}
string APMConfigHelper::getVoiceConcFallbackPath()
{
ALOGV("getVoiceConcFallbackPath enter");
retrieveConfigs();
return mConfigs.voice_conc_fallbackpath;
}
bool APMConfigHelper::isHDMISpkEnabled()
{
ALOGV("isHDMISpkEnabled enter");
retrieveConfigs();
return mConfigs.audio_extn_hdmi_spk_enabled;
}
bool APMConfigHelper::isExtnFormatsEnabled()
{
ALOGV("isExtnFormatsEnabled enter");
retrieveConfigs();
return mConfigs.audio_extn_formats_enabled;
}
bool APMConfigHelper::isAFEProxyEnabled()
{
ALOGV("isAFEProxyEnabled enter");
retrieveConfigs();
return mConfigs.audio_extn_afe_proxy_enabled;
}
bool APMConfigHelper::isCompressVOIPEnabled()
{
ALOGV("isCompressVOIPEnabled enter");
retrieveConfigs();
return mConfigs.compress_voip_enabled;
}
bool APMConfigHelper::isFMPowerOptEnabled()
{
ALOGV("isFMPowerOptEnabled enter");
retrieveConfigs();
return mConfigs.fm_power_opt;
}
bool APMConfigHelper::isVoiceConcEnabled()
{
ALOGV("isVoiceConcEnabled enter");
retrieveConfigs();
return mConfigs.voice_concurrency;
}
bool APMConfigHelper::isRecPlayConcEnabled()
{
ALOGV("isRecPlayConcEnabled enter");
retrieveConfigs();
return mConfigs.record_play_concurrency;
}
bool APMConfigHelper::useXMLAudioPolicyConf()
{
ALOGV("useXMLAudioPolicyConf enter");
retrieveConfigs();
return mConfigs.use_xml_audio_policy_conf;
}
}