/*
* Copyright (C) 2014 MediaTek Inc.
* Modification based on code covered by the mentioned copyright
* and/or permission notice(s).
*/
/*
* Copyright (C) 2009 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.
*/
#define LOG_TAG "AudioPolicyManager"
//#define LOG_NDEBUG 0
#ifdef MTK_AUDIO
#include <cutils/xlog.h>
#ifdef ALOGE
#undef ALOGE
#endif
#ifdef ALOGW
#undef ALOGW
#endif
#ifdef ALOGI
#undef ALOGI
#endif
#ifdef ALOGD
#undef ALOGD
#endif
#ifdef ALOGV
#undef ALOGV
#endif
#define ALOGE XLOGE
#define ALOGW XLOGW
#define ALOGI XLOGI
#define ALOGD XLOGD
#define ALOGV XLOGV
#define MTK_VOL_CALC_DEBUG
#ifdef MTK_VOL_CALC_DEBUG
#define MTK_VOL_CALC ALOGV
#else
#define MTK_VOL_CALC(a...) do { } while(0)
#endif
#define VERY_VERBOSE_LOGGING
#else
#include <utils/Log.h>
#endif
//#define VERY_VERBOSE_LOGGING
#ifdef VERY_VERBOSE_LOGGING
#define ALOGVV ALOGV
#else
#define ALOGVV(a...) do { } while(0)
#endif
// A device mask for all audio input devices that are considered "virtual" when evaluating
// active inputs in getActiveInput()
#define APM_AUDIO_IN_DEVICE_VIRTUAL_ALL (AUDIO_DEVICE_IN_REMOTE_SUBMIX|AUDIO_DEVICE_IN_FM_TUNER)
// A device mask for all audio output devices that are considered "remote" when evaluating
// active output devices in isStreamActiveRemotely()
#define APM_AUDIO_OUT_DEVICE_REMOTE_ALL AUDIO_DEVICE_OUT_REMOTE_SUBMIX
// A device mask for all audio input and output devices where matching inputs/outputs on device
// type alone is not enough: the address must match too
#define APM_AUDIO_DEVICE_MATCH_ADDRESS_ALL (AUDIO_DEVICE_IN_REMOTE_SUBMIX | \
AUDIO_DEVICE_OUT_REMOTE_SUBMIX)
#include <inttypes.h>
#include <math.h>
#include <cutils/properties.h>
#include <utils/Log.h>
#ifdef MTK_AUDIO
#include <hardware/audio_mtk.h>
#else
#include <hardware/audio.h>
#endif
#include <hardware/audio_effect.h>
#include <media/AudioParameter.h>
#include <media/AudioPolicyHelper.h>
#include <soundtrigger/SoundTrigger.h>
#include "AudioPolicyManager.h"
#include "audio_policy_conf.h"
#if defined(DOLBY_UDC) || defined(DOLBY_DAP_MOVE_EFFECT)
#include "DolbyAudioPolicy_impl.h"
#endif // DOLBY_END
#ifdef MTK_AUDIO
#include <media/mediarecorder.h>
#include "AudioDef.h"
#include "audio_custom_exp.h"
#include "AudioPolicyParameters.h"
#define MUSIC_WAIT_TIME (1000*200)
#ifndef BOOT_ANIMATION_VOLUME
#define BOOT_ANIMATION_VOLUME (0.25)
#endif
#endif
#ifdef MTK_AUDIO
/*
* WFD_AUDIO_UT: Use A2DP to force connect WFD device
* - Can record from WFD device.
* - When disconnection will cause system hang issue.
*/
//#define WFD_AUDIO_UT
static const char * gaf_policy_r_submix_propty = "af.policy.r_submix_prio_adjust";
//static const char * gaf_policy_invertSetModeRouting_propty = "af.policy.invertModeRout";
static const char PROPERTY_KEY_FM_FORCE_DIRECT_MODE_TYPE[PROPERTY_KEY_MAX] = "af.fm.force_direct_mode_type";
static const char PROPERTY_KEY_POLICY_MODE[PROPERTY_KEY_MAX] = "af.Policy.SampleRate_policy";
#endif
#if 1
// total 64 dB
//static const float dBPerStep = 0.25f;
//static const float VOLUME_MAPPING_STEP = 256.0f;
#else
static const float dBPerStep = 0.5f;
static const float VOLUME_MAPPING_STEP = 100.0f;
#endif
#ifdef MTK_AUDIO // TODO(Harvey): only for fix build error, remove it later
#ifndef VOICE_VOLUME_MAX
#define VOICE_VOLUME_MAX (160)
#endif
#ifndef VOICE_ONEDB_STEP
#define VOICE_ONEDB_STEP (4)
#endif
#if 0
enum PolicyParameters
{
POLICY_LOAD_VOLUME = 0,
POLICY_SET_FM_SPEAKER,
POLICY_CHECK_FM_PRIMARY_KEY_ROUTING,
POLICY_SET_FM_PRESTOP,
POLICY_SET_A2DP_FORCE_IGNORE,
POLICY_SET_FM_TX_ENABLE,
POLICY_SET_FM_RX_FORCE_DISABLE_TX,
};
#endif
//#define SUPPORT_ANDROID_FM_PLAYER //Using Android FM Player
#endif
namespace android {
// ----------------------------------------------------------------------------
// Definitions for audio_policy.conf file parsing
// ----------------------------------------------------------------------------
struct StringToEnum {
const char *name;
uint32_t value;
};
#define STRING_TO_ENUM(string) { #string, string }
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
const StringToEnum sDeviceNameToEnumTable[] = {
#if defined(MTK_AUDIO)&&defined(DISABLE_EARPIECE)
#else
STRING_TO_ENUM(AUDIO_DEVICE_OUT_EARPIECE),
#endif
STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER_SAFE),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADPHONE),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_SCO),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_A2DP),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_DIGITAL),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_ACCESSORY),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_DEVICE),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_USB),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_REMOTE_SUBMIX),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_TELEPHONY_TX),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_LINE),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI_ARC),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPDIF),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_FM),
STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_LINE),
#ifndef MTK_AUDIO //First input device is AMBIENT, it will cause BUILTIN_MIC openinput fail in Construct of AudioPolicyManager
STRING_TO_ENUM(AUDIO_DEVICE_IN_AMBIENT),
#endif
STRING_TO_ENUM(AUDIO_DEVICE_IN_BUILTIN_MIC),
STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_IN_ALL_SCO),
STRING_TO_ENUM(AUDIO_DEVICE_IN_WIRED_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_IN_AUX_DIGITAL),
STRING_TO_ENUM(AUDIO_DEVICE_IN_HDMI),
STRING_TO_ENUM(AUDIO_DEVICE_IN_TELEPHONY_RX),
STRING_TO_ENUM(AUDIO_DEVICE_IN_VOICE_CALL),
STRING_TO_ENUM(AUDIO_DEVICE_IN_BACK_MIC),
STRING_TO_ENUM(AUDIO_DEVICE_IN_REMOTE_SUBMIX),
STRING_TO_ENUM(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET),
STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_ACCESSORY),
STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_DEVICE),
STRING_TO_ENUM(AUDIO_DEVICE_IN_FM_TUNER),
STRING_TO_ENUM(AUDIO_DEVICE_IN_TV_TUNER),
STRING_TO_ENUM(AUDIO_DEVICE_IN_LINE),
STRING_TO_ENUM(AUDIO_DEVICE_IN_SPDIF),
STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_A2DP),
STRING_TO_ENUM(AUDIO_DEVICE_IN_LOOPBACK),
#ifdef MTK_AUDIO
STRING_TO_ENUM(AUDIO_DEVICE_OUT_FM_TX),
STRING_TO_ENUM(AUDIO_DEVICE_IN_FM),
STRING_TO_ENUM(AUDIO_DEVICE_IN_MATV),
#endif
};
const StringToEnum sOutputFlagNameToEnumTable[] = {
STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DIRECT),
STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_PRIMARY),
STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_FAST),
STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DEEP_BUFFER),
STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD),
STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_NON_BLOCKING),
STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_HW_AV_SYNC