• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
23 #ifdef SENSOR_ENABLE
24 #include "audio_head_tracker.h"
25 #endif
26 #ifdef WINDOW_MANAGER_ENABLE
27 #include "audio_effect_rotation.h"
28 #endif
29 #include "audio_effect_volume.h"
30 
31 namespace OHOS {
32 namespace AudioStandard {
33 
34 struct AudioEffectProcInfo {
35     bool headTrackingEnabled;
36     bool btOffloadEnabled;
37 };
38 
39 class AudioEffectChain {
40 public:
41 #ifdef SENSOR_ENABLE
42     AudioEffectChain(std::string scene, std::shared_ptr<HeadTracker> headTracker);
43 #else
44     AudioEffectChain(std::string scene);
45 #endif
46     ~AudioEffectChain();
47     void SetEffectMode(const std::string &mode);
48     void SetExtraSceneType(const std::string &extraSceneType);
49     void SetFoldState(const std::string &foldState);
50     void SetLidState(const std::string &lidState);
51     void SetEffectCurrSceneType(AudioEffectScene currSceneType);
52     void SetSpatializationSceneType(AudioSpatializationSceneType spatializationSceneType);
53     void SetSpatializationEnabled(bool enabled);
54     void SetSpatializationEnabledForFading(bool enabled);
55     void AddEffectHandle(AudioEffectHandle effectHandle, AudioEffectLibrary *libHandle, AudioEffectScene currSceneType,
56         const std::string &effectName, const std::string &property);
57     void ApplyEffectChain(float *bufIn, float *bufOut, uint32_t frameLen, AudioEffectProcInfo procInfo);
58     void UpdateBufferConfig(uint32_t &channels, uint64_t &channelLayout);
59     bool IsEmptyEffectHandles();
60     int32_t UpdateMultichannelIoBufferConfig(const uint32_t &channels, const uint64_t &channelLayout);
61     void StoreOldEffectChainInfo(std::string &sceneMode, AudioEffectConfig &ioBufferConfig);
62     void InitEffectChain();
63     void SetHeadTrackingDisabled();
64     uint32_t GetLatency();
65     int32_t UpdateEffectParam();
66     void ResetIoBufferConfig();
67     void SetFinalVolume(const float volume);
68     float GetFinalVolume();
69     void SetCurrVolume(const float volume);
70     float GetCurrVolume();
71     void SetFinalVolumeState(const bool state);
72     bool GetFinalVolumeState();
73     void SetSpatialDeviceType(AudioSpatialDeviceType spatialDeviceType);
74     int32_t SetEffectProperty(const std::string &effect, const std::string &property);
75     void SetStreamUsage(const int32_t streamUsage);
76     void GetInputChannelInfo(uint32_t &channels, uint64_t &channelLayout);
77     int32_t updatePrimaryChannel();
78     bool CheckChannelLayoutByReplyInfo(AudioEffectTransInfo info);
79     void SetCurrChannelNoCheck(const uint32_t channel);
80     void SetCurrChannelLayoutNoCheck(const uint64_t channelLayout);
81     void updateDumpName();
82     void SetAbsVolumeStateToEffectChain(const bool absVolumeState);
83 private:
84     AudioEffectConfig GetIoBufferConfig();
85     void ReleaseEffectChain();
86     int32_t SetEffectParamToHandle(AudioEffectHandle handle, int32_t &replyData);
87     void DumpEffectProcessData(std::string fileName, void *buffer, size_t len);
88     int32_t UpdateMultichannelIoBufferConfigInner();
89     int32_t UpdateEffectParamInner();
90     void CrossFadeProcess(float *bufOut, uint32_t frameLen);
91 
92     std::mutex reloadMutex_;
93     std::string sceneType_ = "";
94     std::string effectMode_ = "";
95     uint32_t latency_ = 0;
96     uint32_t extraEffectChainType_ = 0;
97     uint32_t foldState_ = 0;
98     uint32_t lidState_ = 0;
99     StreamUsage streamUsage_ = STREAM_USAGE_INVALID;
100     AudioEffectScene currSceneType_ = SCENE_MUSIC;
101     std::vector<AudioEffectHandle> standByEffectHandles_;
102     std::vector<std::string> effectNames_;
103     std::vector<AudioEffectLibrary *> libHandles_;
104     AudioEffectConfig ioBufferConfig_ = {};
105     AudioEffectConfig preIoBufferConfig_ = {};
106     AudioBuffer audioBufIn_ = {};
107     AudioBuffer audioBufOut_ = {};
108     FILE *dumpFileInput_ = nullptr;
109     FILE *dumpFileOutput_ = nullptr;
110     float finalVolume_ = 1.0f;
111     float currVolume_ = 0.0f;
112     bool sendFinalVolumeState_ = false;
113     AudioSpatialDeviceType spatialDeviceType_{ EARPHONE_TYPE_OTHERS };
114     AudioSpatializationSceneType spatializationSceneType_ = SPATIALIZATION_SCENE_TYPE_MUSIC;
115     bool spatializationEnabled_ = false;
116     std::string dumpNameIn_ = "";
117     std::string dumpNameOut_ = "";
118     bool spatializationEnabledFading_ = false;
119     int32_t fadingCounts_ = 0;
120     uint32_t currChannelNoCheck_ = STEREO;
121     uint64_t currchannelLayoutNoCheck_ = CH_LAYOUT_STEREO;
122     std::vector<float> effectBuffer_;
123     bool absVolumeState_ = true;
124 
125 #ifdef SENSOR_ENABLE
126     std::shared_ptr<HeadTracker> headTracker_;
127 #endif
128 };
129 
130 } // namespace AudioStandard
131 } // namespace OHOS
132 #endif // AUDIO_EFFECT_CHAIN_H