/* Copyright Statement: * * This software/firmware and related documentation ("MediaTek Software") are * protected under relevant copyright laws. The information contained herein is * confidential and proprietary to MediaTek Inc. and/or its licensors. Without * the prior written permission of MediaTek inc. and/or its licensors, any * reproduction, modification, use or disclosure of MediaTek Software, and * information contained herein, in whole or in part, shall be strictly * prohibited. * * MediaTek Inc. (C) 2010. All rights reserved. * * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. * * The following software/firmware and/or related documentation ("MediaTek * Software") have been modified by MediaTek Inc. All revisions are subject to * any receiver's applicable license agreements with MediaTek Inc. */ #ifndef ANDROID_AUDIO_UTILITY_MTK_H #define ANDROID_AUDIO_UTILITY_MTK_H #include #include #include #include //#include //#include "../../../../protect-bsp/frameworks/av/media/libeffects/loudness/MtkEffectLoudness.h" static const effect_uuid_t SL_IID_MTKLOUDNESS_ = { 0x1486d4c0, 0x8757, 0x11e0, 0xb091, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }; const effect_uuid_t * const SL_IID_MTKLOUDNESS = &SL_IID_MTKLOUDNESS_; namespace android { class AudioDump { public: enum PROP_AUDIO_DUMP { PROP_AUDIO_DUMP_WRITER = 0, PROP_AUDIO_DUMP_TRACK, PROP_AUDIO_DUMP_OFFLOAD, PROP_AUDIO_DUMP_RESAMPLER, PROP_AUDIO_DUMP_MIXER, PROP_AUDIO_DUMP_RECORD, PROP_AUDIO_DUMP_EFFECT, PROP_AUDIO_DUMP_DRC, PROP_AUDIO_DUMP_LOG, PROP_AUDIO_DUMP_AAUDIO, PROP_AUDIO_DUMP_MAXNUM }; static void dump(const char * path, void * buffer, int count); static void threadDump(const char * path, void * buffer, int count, audio_format_t format, uint32_t sampleRate, uint32_t channelCount); static bool getProperty(AudioDump::PROP_AUDIO_DUMP index); static bool getPropertyLegacy(AudioDump::PROP_AUDIO_DUMP index); static int checkPath(const char * path); static unsigned long getDumpSize(const char * path); static void updateKeys(int key); static void updateKeysLegacy(int key); static bool checkIfNeedToDump(audio_format_t format); // For audio dump debug static const char * const keyAudioDumpWriter; static const char * const keyAudioDumpTrack; static const char * const keyAudioDumpOffload; static const char * const keyAudioDumpResampler; static const char * const keyAudioDumpMixer; static const char * const keyAudioDumpRecord; static const char * const keyAudioDumpEffect; static const char * const keyAudioDumpDrc; static const char * const keyAudioDumpLog; static const char * const keyAudioDumpAAudio; static const char *audioDumpPropertyStr[]; static const char * const keyAudioDumpLegacyWriter; static const char * const keyAudioDumpLegacyTrack; static const char * const keyAudioDumpLegacyOffload; static const char * const keyAudioDumpLegacyResampler; static const char * const keyAudioDumpLegacyMixer; static const char * const keyAudioDumpLegacyRecord; static const char * const keyAudioDumpLegacyEffect; static const char * const keyAudioDumpLegacyDrc; static const char * const keyAudioDumpLegacyLog; static const char * const keyAudioDumpLegacyAAudio; static const char *audioDumpLegacyPropertyStr[]; private: static void pushBufferInfo(const char * path, void * buffer, int count, audio_format_t format, uint32_t sampleRate, uint32_t channelCount); private: AudioDump(AudioDump &); AudioDump & operator =(AudioDump&); }; class HwFSync{ public: HwFSync(); ~HwFSync(); void setFsync(); bool underflow(); void reset(); static void callback(int signal); private: HwFSync(HwFSync &); HwFSync & operator = (HwFSync&); int mFd; struct sigaction action; static bool mUnderflow; }; class FeatureOption { public: static void getValues(); static void getBleValues(); static bool MTK_AUDIOMIXER_ENABLE_DRC; static int MTK_ENABLE_STEREO_SPEAKER; static bool MTK_USB_PHONECALL; static bool MTK_TTY_SUPPORT; static bool MTK_HIFIAUDIO_SUPPORT; static bool MTK_BESLOUDNESS_ENABLE; static bool MTK_AUDIO_GAIN_TABLE; static bool MTK_AUDIO_GAIN_NVRAM ; static bool MTK_FM_ENABLE ; static bool MTK_AURISYS_FRAMEWORK_SUPPORT; static bool MTK_BT_HEARING_AID_SUPPORT; static bool MTK_BT_HEARING_AID_USING_AOSP_FMW; static bool MTK_TC10_FEATURE; static bool MTK_TC10_IN_HOUSE; static bool MTK_AUDIO_A2DP_LATENCY_IMPROVE; static bool MTK_MUSIC_ROUTE_TO_BTSCO_DURING_BTSCO_ON; static bool MTK_BLE_PHONECALL; static bool MTK_CRS_FEATURE; static bool MTK_USING_VENDOR_S; static bool MTK_USING_VENDOR_T; static bool MTK_SPATIALIZER_SUPPORT_STEREO; static bool MTK_MBRAIN_MODE; static bool MTK_SPATIALIZER_LATENCY_LOG; private: static const char * const foName_MTK_BESLOUDNESS_RUN_WITH_HAL; static const char * const foName_MTK_BESLOUDNESS_SUPPORT; static const char * const foName_MTK_AUDIO_NUMBER_OF_SPEAKER; static const char * const foName_MTK_AUDIO_HIERARCHICAL_PARAM_SUPPORT; static const char * const foName_MTK_AUDIO_FM_DRIVER_DISABLE; static const char * const foName_MTK_HIFIAUDIO_SUPPORT; static const char * const foName_MTK_AURISYS_FRAMEWORK_SUPPORT; static const char * const foName_MTK_USB_PHONECALL; static const char * const foName_MTK_TTY_SUPPORT; static const char * const foName_MTK_BT_HEARING_AID_SUPPORT; static const char * const foName_MTK_BT_HEARING_AID_USING_AOSP_FMW; static const char * const foName_MTK_TC10_FEATURE; static const char * const foName_MTK_TC10_IN_HOUSE; static const char * const foName_MTK_AUDIO_A2DP_LATENCY_IMPROVE; static const char * const foName_MTK_MUSIC_ROUTE_TO_BTSCO_DURING_BTSCO_ON; static const char * const foName_MTK_BLE_PHONECALL; }; //MTK80721 FIX CR: ALPS00355888 extern "C"{ void setCPU_MIN_Freq(const char *pfreq); } class AudioUtilThread : public Thread { public: enum BATTERY_EVENT { BATTERY_NOTE_START_AUDIO = 0, BATTERY_NOTE_STOP_AUDIO }; AudioUtilThread() {} virtual ~AudioUtilThread() {} void exit(); void BatteryStateRegister(BATTERY_EVENT event, uint32_t uid); void BatteryStateNotify(); private: typedef struct BatteryNote { BATTERY_EVENT event; uint32_t uid; } BatteryNote; virtual bool threadLoop(); Mutex mLock; Condition mWaitWorkCV; Mutex mBatteryStateVectorLock; Vector mBatteryStateVector; }; #define MTK_LEAUDIO_MODE_OFF "off" #define MTK_LEAUDIO_MODE_UMS "ums" #define MTK_LEAUDIO_MODE_CGUMS "ums-cg" static inline std::string MTK_audio_get_audio_policy_config_file() { static constexpr const char *apmXmlConfigFileName = "audio_policy_configuration.xml"; static constexpr const char *apmA2dpOffloadDisabledXmlConfigFileName = "audio_policy_configuration_a2dp_offload_disabled.xml"; static constexpr const char *apmBluetoothLegacyHalXmlConfigFileName = "audio_policy_configuration_bluetooth_legacy_hal.xml"; static constexpr const char *apmA2dpOffloadDisabledCgEnabledXmlConfigFileName = "audio_policy_configuration_a2dp_offload_disabled_cg_enabled.xml"; static constexpr const char *apmA2dpOffloadEnableCgEnabledXmlConfigFileName = "audio_policy_configuration_a2dp_offload_enable_cg_enable.xml"; static constexpr const char *apmA2dpOffloadDisabledCgEnabledBmsEnableXmlConfigFileName = "audio_policy_configuration_a2dp_offload_disabled_cg_enabled_bms_enable.xml"; static constexpr const char *apmA2dpOffloadEnableCgEnabledBmsEnableXmlConfigFileName = "audio_policy_configuration_a2dp_offload_enable_cg_enable_bms_enable.xml"; std::string audioPolicyXmlConfigFile; char bluetooth_le_mode[PROPERTY_VALUE_MAX] = { 0 }; property_get("persist.vendor.bluetooth.leaudio_mode", bluetooth_le_mode, MTK_LEAUDIO_MODE_OFF); ALOGD("%s bluetooth_le_mode %s, a2dp offload enabled %d", __func__, bluetooth_le_mode, !property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)); //support BMS for S vendor project int API_LEVEL = property_get_int32("ro.vndk.version", 0); bool vendor_s = (API_LEVEL == __ANDROID_API_S__); // First try alternative files if needed if (property_get_bool("ro.bluetooth.a2dp_offload.supported", false)) { ALOGD("%s ro.bluetooth.a2dp_offload.supported true", __func__); if (property_get_bool("persist.bluetooth.bluetooth_audio_hal.disabled", false) && property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)) { // Both BluetoothAudio@2.0 and BluetoothA2dp@1.0 (Offload) are disabled, and uses // the legacy hardware module for A2DP and hearing aid. //not support cg/ums when using legacy bluetooth legacy hal audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmBluetoothLegacyHalXmlConfigFileName); ALOGD("%s %d %s", __func__, __LINE__, apmBluetoothLegacyHalXmlConfigFileName); } else if (!property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)) { // A2DP offload enabled ALOGD("%s %d a2dp offload enabled",__func__, __LINE__); if(strncmp(bluetooth_le_mode, MTK_LEAUDIO_MODE_CGUMS, strlen(MTK_LEAUDIO_MODE_CGUMS)) == 0) { //support BMS for S vendor project audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadEnableCgEnabledBmsEnableXmlConfigFileName); if (vendor_s && (!audioPolicyXmlConfigFile.empty())) { ALOGD("%s %d a2dp offload, cg-ums offload, BMS for S vendor %s ", __func__, __LINE__, apmA2dpOffloadEnableCgEnabledBmsEnableXmlConfigFileName); } else { //a2dp offload, ums-cg mode. audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadEnableCgEnabledXmlConfigFileName); ALOGD("%s %d a2dp offload, cg-ums offload %s ", __func__, __LINE__, apmA2dpOffloadEnableCgEnabledXmlConfigFileName); } } else { //a2dp non offload, ums non offload audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmXmlConfigFileName); ALOGD("%s %d a2dp non-offload, ums non offload %s", __func__, __LINE__, apmXmlConfigFileName); } } else if (property_get_bool("persist.bluetooth.a2dp_offload.disabled", false)) { ALOGD("%s %d a2dp offload disable",__func__, __LINE__); if(strncmp(bluetooth_le_mode, MTK_LEAUDIO_MODE_CGUMS, strlen(MTK_LEAUDIO_MODE_CGUMS)) == 0) { //support BMS for S vendor project audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadDisabledCgEnabledBmsEnableXmlConfigFileName); if (vendor_s && (!audioPolicyXmlConfigFile.empty())) { ALOGD("%s %d a2dp non offload , cg-ums offload , BMS for S vendor %s ", __func__, __LINE__, apmA2dpOffloadDisabledCgEnabledBmsEnableXmlConfigFileName); } else { //a2dp non offload, ums-cg mode. audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadDisabledCgEnabledXmlConfigFileName); ALOGD("%s %d a2dp non offload , cg-ums offload %s ", __func__, __LINE__, apmA2dpOffloadDisabledCgEnabledXmlConfigFileName); } } else { //a2dp non offload, ums non offload audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadDisabledXmlConfigFileName); ALOGD("%s %d a2dp non-offload, ums non offload %s", __func__, __LINE__, apmA2dpOffloadDisabledXmlConfigFileName); } } } else if (property_get_bool("persist.bluetooth.bluetooth_audio_hal.disabled", false)) { //ro.bluetooth.a2dp_offload.supported == ture audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmBluetoothLegacyHalXmlConfigFileName); ALOGD("%s %d %s", __func__, __LINE__, apmBluetoothLegacyHalXmlConfigFileName); } else { // disable a2dp offload ALOGD("%s %d disable a2dp offload", __func__, __LINE__); if(strncmp(bluetooth_le_mode, MTK_LEAUDIO_MODE_CGUMS, strlen(MTK_LEAUDIO_MODE_CGUMS)) == 0) { //support BMS for S vendor project audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadDisabledCgEnabledBmsEnableXmlConfigFileName); if (vendor_s && (!audioPolicyXmlConfigFile.empty())) { ALOGD("%s %d a2dp non offload, ums offload, cg offload, BMS for S vendor %s", __func__, __LINE__, apmA2dpOffloadDisabledCgEnabledBmsEnableXmlConfigFileName); } else { // a2dp offload disable and cg enable audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadDisabledCgEnabledXmlConfigFileName); ALOGD("%s %d a2dp non offload, ums offload, cg offload %s", __func__, __LINE__, apmA2dpOffloadDisabledCgEnabledXmlConfigFileName); } } else if (strncmp(bluetooth_le_mode, MTK_LEAUDIO_MODE_UMS, strlen(MTK_LEAUDIO_MODE_UMS)) == 0) { audioPolicyXmlConfigFile = audio_find_readable_configuration_file( apmA2dpOffloadDisabledXmlConfigFileName); ALOGD("%s %d a2dp non offloadb, ums non offload %s ", __func__, __LINE__, apmA2dpOffloadDisabledXmlConfigFileName); } } ALOGD_IF(audioPolicyXmlConfigFile.empty()," %s, %d, a2dp offload, ums non-offload, use %s", __func__,__LINE__,apmXmlConfigFileName); return audioPolicyXmlConfigFile.empty() ? audio_find_readable_configuration_file(apmXmlConfigFileName) : audioPolicyXmlConfigFile; } // ALPS07884508: ultra game mode void initWhiteList(); bool checkWhiteList(const char* scenarioName, const char* packageName); static inline bool audio_is_channel_mask_stereo_spatialized(audio_channel_mask_t channelMask) { return audio_channel_mask_get_representation(channelMask) == AUDIO_CHANNEL_REPRESENTATION_POSITION && (channelMask & AUDIO_CHANNEL_OUT_STEREO) == AUDIO_CHANNEL_OUT_STEREO; } } #endif