1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef AUDIO_EFFECT_CHAIN_H 17 #define AUDIO_EFFECT_CHAIN_H 18 19 #include <atomic> 20 21 #include "audio_effect.h" 22 #include "audio_utils.h" 23 24 #ifdef SENSOR_ENABLE 25 #include "audio_head_tracker.h" 26 #endif 27 #include "audio_effect_hdi_param.h" 28 #ifdef WINDOW_MANAGER_ENABLE 29 #include "audio_effect_rotation.h" 30 #endif 31 #include "audio_effect_volume.h" 32 33 namespace OHOS { 34 namespace AudioStandard { 35 enum AudioEffectChainSetParamIndex { 36 COMMAND_CODE_INDEX = 0, 37 SCENE_TYPE_INDEX = 1, 38 EFFECT_MODE_INDEX = 2, 39 ROTATION_INDEX = 3, 40 VOLUME_INDEX = 4, 41 EXTRA_SCENE_TYPE_INDEX = 5, 42 SPATIAL_DEVICE_TYPE_INDEX = 6, 43 SPATIALIZATION_SCENE_TYPE_INDEX = 7, 44 SPATIALIZATION_ENABLED_INDEX = 8, 45 STREAM_USAGE_INDEX = 9, 46 }; 47 48 struct AudioEffectProcInfo { 49 bool headTrackingEnabled; 50 bool btOffloadEnabled; 51 }; 52 53 class AudioEffectChain { 54 public: 55 #ifdef SENSOR_ENABLE 56 AudioEffectChain(std::string scene, std::shared_ptr<HeadTracker> headTracker); 57 #else 58 AudioEffectChain(std::string scene); 59 #endif 60 ~AudioEffectChain(); 61 void SetEffectMode(const std::string &mode); 62 void SetExtraSceneType(const std::string &extraSceneType); 63 void SetEffectCurrSceneType(AudioEffectScene currSceneType); 64 void SetSpatializationSceneType(AudioSpatializationSceneType spatializationSceneType); 65 void SetSpatializationEnabled(bool enabled); 66 void AddEffectHandle(AudioEffectHandle effectHandle, AudioEffectLibrary *libHandle, AudioEffectScene currSceneType); 67 void ApplyEffectChain(float *bufIn, float *bufOut, uint32_t frameLen, AudioEffectProcInfo procInfo); 68 bool IsEmptyEffectHandles(); 69 int32_t UpdateMultichannelIoBufferConfig(const uint32_t &channels, const uint64_t &channelLayout); 70 void StoreOldEffectChainInfo(std::string &sceneMode, AudioEffectConfig &ioBufferConfig); 71 void InitEffectChain(); 72 void SetHeadTrackingDisabled(); 73 uint32_t GetLatency(); 74 int32_t UpdateEffectParam(); 75 void ResetIoBufferConfig(); 76 void SetFinalVolume(const float volume); 77 float GetFinalVolume(); 78 void SetCurrVolume(const float volume); 79 float GetCurrVolume(); 80 void SetFinalVolumeState(const bool state); 81 bool GetFinalVolumeState(); 82 void SetSpatialDeviceType(AudioSpatialDeviceType spatialDeviceType); 83 void SetStreamUsage(const int32_t streamUsage); 84 85 private: 86 AudioEffectConfig GetIoBufferConfig(); 87 void ReleaseEffectChain(); 88 int32_t SetEffectParamToHandle(AudioEffectHandle handle, int32_t &replyData); 89 void DumpEffectProcessData(std::string fileName, void *buffer, size_t len); 90 91 std::mutex reloadMutex_; 92 std::string sceneType_ = ""; 93 std::string effectMode_ = ""; 94 uint32_t latency_ = 0; 95 uint32_t extraEffectChainType_ = 0; 96 StreamUsage streamUsage_ = STREAM_USAGE_INVALID; 97 AudioEffectScene currSceneType_ = SCENE_MUSIC; 98 std::vector<AudioEffectHandle> standByEffectHandles_; 99 std::vector<AudioEffectLibrary *> libHandles_; 100 AudioEffectConfig ioBufferConfig_ = {}; 101 AudioBuffer audioBufIn_ = {}; 102 AudioBuffer audioBufOut_ = {}; 103 FILE *dumpFileInput_ = nullptr; 104 FILE *dumpFileOutput_ = nullptr; 105 float finalVolume_ = 1.0f; 106 float currVolume_ = 0.0f; 107 bool sendFinalVolumeState_ = false; 108 AudioSpatialDeviceType spatialDeviceType_{ EARPHONE_TYPE_OTHERS }; 109 AudioSpatializationSceneType spatializationSceneType_ = SPATIALIZATION_SCENE_TYPE_DEFAULT; 110 bool spatializationEnabled_ = false; 111 std::string dumpNameIn_ = ""; 112 std::string dumpNameOut_ = ""; 113 114 #ifdef SENSOR_ENABLE 115 std::shared_ptr<HeadTracker> headTracker_; 116 #endif 117 }; 118 119 } // namespace AudioStandard 120 } // namespace OHOS 121 #endif // AUDIO_EFFECT_CHAIN_H