/* * Copyright (C) 2019 MediaTek Inc. * * 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. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include "AudioPolicyInterface.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "../../managerdefault/EngineLibrary.h" #include "../../common/managerdefinitions/include/TypeConverter.h" #include "../../../../../../vendor/mediatek/proprietary/external/audio_utils/common_headers/gain_table/AudioGainTableParam.h" // MTK_AUDIO #include "../../../../../../vendor/mediatek/proprietary/external/audio_utils/common_headers/gain_table/AudioGainTableParamLegacy.h" // MTK_AUDIO #include "AudioPolicyVendorControl.h" // MTK_AUDIO #include "AudioPolicyManagerCustomInterface.h" // MTK_AUDIO #include "../../../../../../vendor/mediatek/proprietary/external/audio_utils/common_headers/custom_volume/AudioCustomVolume.h" // MTK_AUDIO namespace android { // MTK_AUDIO #define SONIFICATION_AUX_DIGITAL_VOLUME_FACTOR 0.5 #define SONIFICATION_AUX_DIGITAL_VOLUME_FACTOR_DB (-6) #define AUDIO_HIFI_OUTPUT_SUPPORT_FLAG (AUDIO_OUTPUT_FLAG_DEEP_BUFFER |AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) class AudioPolicyManager; class AudioPolicyManagerCustomImpl : public AudioPolicyManagerCustomInterface { public: explicit AudioPolicyManagerCustomImpl(); virtual ~AudioPolicyManagerCustomImpl(); virtual status_t common_set(AudioPolicyManager *audioPolicyManger); virtual audio_stream_type_t gainTable_getVolumeStream(); virtual int gainTable_getVolumeIndex(); virtual DeviceTypeSet gainTable_getVolumeDevice(); virtual status_t gainTable_setVolumeStream(audio_stream_type_t stream); virtual status_t gainTable_setVolumeIndex(int index); virtual status_t gainTable_setVolumeDevice(DeviceTypeSet device); virtual status_t gainTable_getCustomAudioVolume(void); virtual float gainTable_getVolumeDbFromComputeVolume(VolumeSource volsrc, int index, DeviceTypeSet device, float volumeDB); virtual DeviceTypeSet gainTable_getDeviceFromComputeVolume(VolumeSource volumeSource, int index, audio_devices_t device); virtual float gainTable_getCorrectVolumeDbFromComputeVolume(VolumeSource volumeSource, float volumeDB, DeviceTypeSet device); virtual DeviceTypeSet gainTable_checkInvalidDeviceFromCheckAndSetVolume(const sp& outputDesc, DeviceTypeSet device); virtual status_t gainTable_applyAnalogGainFromCheckAndSetVolume(VolumeSource volumeSource, int index, const sp& outputDesc, DeviceTypeSet device, int delayMs, bool force); virtual status_t gainTable_setVolumeFromCheckAndSetVolume(VolumeSource volsrc, int index, const sp& outputDesc, DeviceTypeSet device, int delayMs, bool force, float volumeDb); virtual status_t gainTable_routeAndApplyVolumeFromStopSource(const sp& outputDesc, DeviceVector device, audio_stream_type_t stream, bool force); virtual bool gainTable_skipAdjustGainFromSetStreamVolumeIndex(audio_devices_t curDevice, audio_devices_t wantDevice); virtual audio_devices_t gainTable_replaceApplyDeviceFromSetStreamVolumeIndex(audio_devices_t outputDevice, audio_devices_t curDevice); virtual void gainTable_initXML(); virtual status_t common_setPolicyManagerCustomParameters(int par1, int par2, int par3, int par4); virtual audio_output_flags_t common_getFlagsForClientDescFromCheckOutputForAttributes(sp clientDesc); virtual status_t fm_initOutputIdForApp(void); virtual DeviceVector fm_correctDeviceFromSetDeviceConnectionStateInt(const sp& outputDesc, DeviceVector device, bool force); virtual status_t fm_addAudioPatch(audio_patch_handle_t handle, const sp& patch); virtual status_t fm_removeAudioPatch(audio_patch_handle_t handle); virtual status_t fm_applyGainFromCheckAndSetVolume(VolumeSource volumeSource, int index, const sp& outputDesc,DeviceTypeSet device, int delayMs, bool force); virtual status_t fm_muteStrategyFromCheckOutputForStrategy(const audio_attributes_t &attr, DeviceVector oldDevice, DeviceVector newDevice); virtual status_t fm_checkSkipVolumeFromCheckOutputForStrategy(const audio_attributes_t &attr, DeviceVector oldDevice, DeviceVector newDevice); virtual status_t fm_releaseSkipVolumeFromCheckOutputForStrategy(void); virtual bool fm_checkFirstMusicFromStartSource(const sp& outputDesc, audio_stream_type_t stream); virtual uint32_t fm_extendMuteFromCheckDeviceMuteStrategies(const sp& outputDesc, VolumeSource volumeSource, uint32_t muteDurationMs, uint32_t extendDurationMs); virtual status_t fm_signalAPProutingFromSetOutputDevice(const sp& outputDesc, bool force); virtual bool setFMIndirectMode(uint32_t sampleRate); virtual uint32_t fm_extendSleepFromCheckDeviceMuteStrategies(const sp& outputDesc, uint32_t muteWaitMs); virtual status_t usbPhoneCall_closeAllInputsFromSetPhoneState(void); virtual status_t setCurModeFromSetPhoneState(audio_mode_t state); virtual status_t gainNvram_remapIndexRangeFromInitStreamVolume(audio_stream_type_t stream, int *indexMin, int *indexMax); virtual status_t gainNvram_remapIndexFromSetStreamVolumeIndex(audio_stream_type_t stream, int *index, audio_devices_t device); virtual status_t gainNvram_remapIndexFromGetStreamVolumeIndex(audio_stream_type_t stream, int *index, audio_devices_t device); virtual status_t lowLatency_updatePrimaryModuleDeviceFromSetPhoneState(audio_mode_t state, DeviceTypeSet rxDevice); virtual status_t lowLatency_CheckSpeakerProtectionDevice(const sp& outProfile); virtual bool lowLatency_skipSelectedDeviceFormSetOutputDevice(const sp& outputDesc, const DeviceVector &devices); virtual bool lowLatency_skipOutputCheckFromGetOutputsForDevice(audio_devices_t device, const SwAudioOutputCollection& openOutputs, size_t i); virtual bool lowLatency_stopToRouteFromStopSource(audio_devices_t newDevice, const sp& outputDesc); virtual bool lowLatency_startToRouteFromStartSource(const sp& outputDesc, bool beFirstActive); virtual bool lowLatency_isOutputActiveFromStartSource(const sp& outputDesc); virtual bool lowLatency_setOutputFirstActiveFromStartSource(const sp& outputDesc, bool beFirstActive, DeviceVector device); virtual bool lowLatency_checkOutputFirstActiveFromSetOutputDevice(const sp& outputDesc); virtual status_t besLoudness_signalDupOutputFromSetOutputDevice(const sp& outputDesc, const DeviceVector &device, int delayMs); virtual status_t offload_invalidateMusicForInCallFromSetPhoneState(audio_mode_t state, int oldState); virtual bool offload_isInCallFromIsOffloadSupported(void); virtual bool debug_skipShowLog(); virtual bool debug_showGetOutputForAttr(audio_devices_t device, const audio_config_t *config, audio_output_flags_t flags, audio_stream_type_t stream, audio_io_handle_t output); virtual bool debug_showGetInputForAttr(AudioPolicyInterface::input_type_t inputType, audio_devices_t device, audio_io_handle_t input); virtual bool debug_showSetOutputDevice(const sp& outputDesc, const DeviceVector & device, bool force, int delayMs); virtual status_t hifiAudio_startOutputSamplerate(audio_port_handle_t portId, int samplerate); virtual status_t hifiAudio_stopOutputSamplerate(audio_port_handle_t portId, int samplerate); virtual status_t hifiAudio_initSetting(void); virtual status_t hifiAudio_addOutput(audio_io_handle_t output, const sp& outputDesc); virtual status_t hifiAudio_removeOutput(audio_io_handle_t outputHandle); virtual bool isFMActive(void); virtual bool hifiAudio_needCheckMuteForPhoneCall(DeviceVector newDevices, DeviceVector oldDevices); virtual bool hifiAudio_needCheckInvalidateFromCheckOutputForAttributes(DeviceVector newDevices, DeviceVector oldDevices); virtual bool hifiAudio_invalidateStream(audio_io_handle_t ioHandle, uint32_t samplingRate, DeviceVector newDevices, DeviceVector oldDevices); virtual int hifiAudio_getCachedHIFIState(void); virtual bool usbAudio_IsDeepBufferSupportUSBDevice(); virtual status_t BLEPhoneCall_addCurrentVolumeIndexFromsetVolumeIndexForAttributes( int index, audio_devices_t device, IVolumeCurves &volumeCurves); virtual void hifiAudio_updateSampleRate(uint32_t samplingRate); virtual bool isMbrainSupport() { return mMbrainEnable; } virtual bool MBrain_conditionCheck(const audio_stream_type_t stream); virtual status_t MBrain_LogHook(const int level, const char* event, const audio_mode_t mode, const audio_output_flags_t outflags, const audio_input_flags_t inflags, const DeviceTypeSet SinkDevice, const DeviceTypeSet SourceDevice, const audio_port_handle_t TrackId, const audio_stream_type_t stream, const audio_session_t session, const uid_t uid); virtual bool spatializer_checkVirtualizerClient(); virtual bool spatialAudio_getSupportStatus(void); virtual void spatialAudio_muteStrategyForReleaseOutput(void); protected: enum output_samplerate_index { OUTPUT_RATE_8_INDEX =0, OUTPUT_RATE_11_025_INDEX, OUTPUT_RATE_16_INDEX, OUTPUT_RATE_22_05_INDEX, OUTPUT_RATE_32_INDEX, OUTPUT_RATE_44_1_INDEX, OUTPUT_RATE_48_INDEX, OUTPUT_RATE_88_2_INDEX, OUTPUT_RATE_96_INDEX, OUTPUT_RATE_176_4_INDEX, OUTPUT_RATE_192_INDEX, OUTPUT_NUM_RATE_INDEX }; enum output_samplerate { OUTPUT_RATE_8 = 8000, OUTPUT_RATE_11_025 = 11025, OUTPUT_RATE_16 = 16000, OUTPUT_RATE_22_05 = 22050, OUTPUT_RATE_32 = 32000, OUTPUT_RATE_44_1 = 44100, OUTPUT_RATE_48 = 48000, OUTPUT_RATE_88_2 = 88200, OUTPUT_RATE_96 = 96000, OUTPUT_RATE_176_4 = 176400, OUTPUT_RATE_192 = 192000, }; enum output_samplerate_policy { SampleRate_Do_nothing =0, SampleRate_First_Start, SampleRate_ForceReplace, }; uint32_t mSampleRateArray[OUTPUT_NUM_RATE_INDEX]; uint32_t mHiFiOutputCurSampleRate; uint32_t mSampleRate_Policy; uint32_t mHiFiOutputDefaultSampleRate; SortedVector mHiFiOutputIOHandles; virtual bool aaudio_conidtionCheck(aaudio_cond_t cond, audio_input_flags_t inflags, audio_output_flags_t outflags, audio_mode_t state); virtual status_t aaudio_invalidateMMAPStream(void); virtual status_t aaudio_policyForceReplaceSampleRate(sp desc); virtual status_t common_muteStrategyFromCheckOutputForStrategy(SortedVector dstOutput, const audio_attributes_t &attr, DeviceTypeSet oldDevice, DeviceTypeSet newDevice); virtual status_t common_extendMuteTimeForUSBFromCheckOutputForStrategy(uint32_t& maxLatency, DeviceVector oldDevice); virtual status_t common_extendMuteTimeForBLEFromCheckOutputForStrategy(uint32_t& maxLatency, DeviceVector newDevice); virtual audio_io_handle_t multipleRecord_policySelectInput(sp& profile, bool isSoundTrigger, audio_session_t session, const audio_config_base_t *config, audio_input_flags_t flags, bool forceOpen = false); virtual status_t swBridgPhoneCall_Control(swbridgephonecall_cmd_t cmd, audio_devices_t type = AUDIO_DEVICE_NONE, uint32_t delayMs = 0); private: AudioPolicyManager *mAudioPolicyManager; // For public function audio_stream_type_t mVolumeStream; int mVolumeIndex; DeviceTypeSet mVolumeDevice; GainTableParam mGainTable; vndGainEnum mVndGainEnum; int mGainTableSceneIndex; int mGainTableSceneCount; DeviceTypeSet mDeviceOfCheckAndSetVolume; bool mFMDirectAudioPatchEnable; bool mSkipFMVolControl; audio_port_handle_t mFmPortId; bool mUsbHeadsetConnect; bool mNeedRemapVoiceVolumeIndex; AUDIO_CUSTOM_VOLUME_STRUCT mAudioCustVolumeTable; float linearToLog(int volume); int logToLinear(float volume); float linearToLogHifi(int volume); int hifiIndexToAnalog(int index); bool setHIFIVolumeMode(uint32_t sampleRate); bool mHifiVolumeMode; int mHifiState; bool mSampleRateForce; void* mlibMBrainHandle; status_t checkAndSetGainTableAnalogGain(audio_stream_type_t stream, int index, const sp& outputDesc,DeviceTypeSet device, int delayMs, bool force); audio_stream_type_t selectGainTableActiveStream(audio_stream_type_t requestStream); float computeGainTableCustomVolume(audio_stream_type_t stream, int index, DeviceTypeSet device); enum tty_mode_t { AUD_TTY_OFF = 0, AUD_TTY_FULL = 1, AUD_TTY_VCO = 2, AUD_TTY_HCO = 4, AUD_TTY_ERR = -1 }; tty_mode_t mTty_Ctm; DeviceTypeSet getNewDeviceForTty(DeviceTypeSet device, tty_mode_t tty_mode); bool isFMDirectMode(const sp& patch); bool isFMDirectActive(void); int mapVol(float &vol, float unitstep); int mappingVoiceVol(float &vol, float unitstep); int getStreamMaxLevels(int stream); float mapVoltoCustomVol(unsigned char array[], int volmin, int volmax, float &vol ,int stream); float mapVoiceVoltoCustomVol(unsigned char array[], int volmin, int volmax, float &vol, int vol_stream_type); float computeCustomVolume(int stream, int index, DeviceTypeSet device); void loadCustomVolume(); status_t updatePrimaryModuleDevice(DeviceTypeSet rxDevice); sp mFMOutput; // primary or deepbuf output descriptor status_t freeGainTable(void); void dumpmVndGainEnum(void); status_t allocateGainTable(void); status_t initmVndGainEnum(void); status_t copySceneGainTable(unsigned char *temp_buffer); status_t copyNonSceneGainTable(unsigned char *temp_buffer); status_t updateCurrentSceneIndexOfGainTable(void); int getSceneIndexOfGainTable(String8 sceneName); uint32_t getSampleRateIndex(uint32_t sampleRate); uint32_t getSampleRateCount(); bool checkFirstActive(void); bool checkStreamActive(void); void dumpSampleRateArray(void); uint32_t getFirstTrackSampleRate(); bool isPrimarySupportSampleRate(uint32_t SampleRate); bool shouldOutputSetSamplerate(audio_io_handle_t ioHandle); status_t policyFirstStart(audio_stream_type_t stream , uint32_t sampleRate, audio_io_handle_t ioHandle); status_t policyRestore(audio_stream_type_t stream); uint32_t getHifiDeviceSampleRate(audio_io_handle_t ioHandle, uint32_t sampleRate); status_t policyForceReplace(audio_stream_type_t stream, uint32_t sampleRate, audio_io_handle_t ioHandle, bool forceReplace = false); status_t sampleRatePolicy(audio_stream_type_t stream, uint32_t sampleRate, audio_io_handle_t ioHandle); status_t addSampleRateArray(audio_stream_type_t stream __unused,uint32_t sampleRate); status_t removeSampleRateArray(audio_stream_type_t stream __unused, uint32_t sampleRate); void initSamplerateArray(uint32_t init_sample_rate); uint32_t getMaxTrackSampleRate(audio_stream_type_t stream = AUDIO_STREAM_DEFAULT); audio_io_handle_t getPrimaryFastOutput(); bool isSupportDeepBuffer(void); bool setHIFIState(int enable); int getHIFIState(void); bool isMMAPActive(void); audio_io_handle_t getVOIPRxOutput(void); bool mPhoneCallSwBridgeEnable; void setVolumeParameterToHAL(audio_stream_type_t activeStream, int index, DeviceTypeSet device, int delayMs, bool force); sp getDeepBufferOutput(); sp getHifiPlaybackOutput(); status_t MBrain_load_mbrain_api(); int (*MBrain_AudioLogHook)(int level, char* str); bool mMbrainEnable; }; };