• 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_VOLUME_H
17 #define AUDIO_VOLUME_H
18 
19 #include <string>
20 #include <unordered_map>
21 #include <shared_mutex>
22 #include "audio_stream_info.h"
23 #include "audio_volume_c.h"
24 #include "audio_utils.h"
25 #include "audio_info.h"
26 
27 namespace OHOS {
28 namespace AudioStandard {
29 class StreamVolume;
30 class SystemVolume;
31 class AppVolume;
32 enum FadePauseState {
33     NO_FADE,
34     DO_FADE,
35     DONE_FADE,
36     INVALID_STATE
37 };
38 const int32_t MAX_STREAM_CACHE_AMOUNT = 10;
39 
40 class AudioVolume {
41 public:
42     static AudioVolume *GetInstance();
43     ~AudioVolume();
44 
45     float GetVolume(uint32_t sessionId, int32_t streamType, const std::string &deviceClass,
46         VolumeValues *volumes); // all volume
47     float GetStreamVolume(uint32_t sessionId); // only stream volume factor
48     float GetAppVolume(int32_t appUid, AudioVolumeMode mode);
49     // history volume
50     float GetHistoryVolume(uint32_t sessionId);
51     void SetHistoryVolume(uint32_t sessionId, float volume);
52 
53     // stream volume
54     void AddStreamVolume(StreamVolumeParams &streamVolumeParams);
55     void RemoveStreamVolume(uint32_t sessionId);
56     void SetStreamVolume(uint32_t sessionId, float volume);
57     void SetStreamVolumeDuckFactor(uint32_t sessionId, float duckFactor);
58     void SetStreamVolumeLowPowerFactor(uint32_t sessionId, float lowPowerFactor);
59     void SetStreamVolumeMute(uint32_t sessionId, bool isMuted);
60 
61     // system volume
62     void SetSystemVolume(SystemVolume &systemVolume);
63     void SetAppVolume(AppVolume &appVolume);
64     void SetAppVolumeMute(int32_t appUid, bool muted);
65     bool SetAppRingMuted(int32_t appUid, bool isMuted);
66     void SetSystemVolume(int32_t volumeType, const std::string &deviceClass, float volume, int32_t volumeLevel);
67     void SetSystemVolumeMute(int32_t volumeType, const std::string &deviceClass, bool isMuted);
68 
69     // stream type convert
70     int32_t ConvertStreamTypeStrToInt(const std::string &streamType);
71     bool IsSameVolume(float x, float y);
72     void Dump(std::string &dumpString);
73     void Monitor(uint32_t sessionId, bool isOutput);
74 
75     void SetFadeoutState(uint32_t streamIndex, uint32_t fadeoutState);
76     uint32_t GetFadeoutState(uint32_t streamIndex);
77     void RemoveFadeoutState(uint32_t streamIndex);
78 
79     void SetStopFadeoutState(uint32_t streamIndex, uint32_t fadeoutState);
80     uint32_t GetStopFadeoutState(uint32_t streamIndex);
81     void RemoveStopFadeoutState(uint32_t streamIndex);
82 
83     void SetDefaultAppVolume(int32_t level);
84     void SetVgsVolumeSupported(bool isVgsSupported);
85     std::vector<AdjustStreamVolumeInfo> GetStreamVolumeInfo(AdjustStreamVolume volumeType);
86     void SaveAdjustStreamVolumeInfo(float volume, uint32_t sessionId, std::string invocationTime, uint32_t code);
87     void SetCurrentActiveDevice(DeviceType currentActiveDevice);
88     void SetDoNotDisturbStatusVolume(uint32_t sessionId, float volume);
89     uint32_t GetDoNotDisturbStatusVolume(int32_t volumeType, int32_t appUid, uint32_t sessionId);
90     void SetDoNotDisturbStatusWhiteListVolume(std::vector<std::map<std::string, std::string>>
91         doNotDisturbStatusWhiteList);
92     void SetDoNotDisturbStatus(bool isDoNotDisturb);
93     void SetOffloadType(uint32_t streamIndex, int32_t offloadType);
94     int32_t GetOffloadType(uint32_t streamIndex);
95 private:
96     AudioVolume();
97     float GetAppVolumeInternal(int32_t appUid, AudioVolumeMode mode);
98     bool IsVgsVolumeSupported() const;
99 private:
100     std::unordered_map<uint32_t, StreamVolume> streamVolume_ {};
101     std::unordered_map<std::string, SystemVolume> systemVolume_ {};
102     std::unordered_map<int32_t, AppVolume> appVolume_ {};
103     std::shared_mutex volumeMutex_ {};
104     bool isVgsVolumeSupported_ = false;
105     std::shared_mutex fadeoutMutex_ {};
106     std::unordered_map<uint32_t, uint32_t> fadeoutState_{};
107     std::unordered_map<uint32_t, uint32_t> stopFadeoutState_{};
108     std::unordered_map<uint32_t, int32_t> offloadType_{};
109     int32_t defaultAppVolume_ = 0;
110 
111     std::shared_ptr<FixedSizeList<AdjustStreamVolumeInfo>> setStreamVolumeInfo_ =
112         std::make_shared<FixedSizeList<AdjustStreamVolumeInfo>>(MAX_STREAM_CACHE_AMOUNT);
113     std::shared_ptr<FixedSizeList<AdjustStreamVolumeInfo>> setLowPowerVolumeInfo_ =
114         std::make_shared<FixedSizeList<AdjustStreamVolumeInfo>>(MAX_STREAM_CACHE_AMOUNT);
115     std::shared_ptr<FixedSizeList<AdjustStreamVolumeInfo>> setDuckVolumeInfo_ =
116         std::make_shared<FixedSizeList<AdjustStreamVolumeInfo>>(MAX_STREAM_CACHE_AMOUNT);
117 
118     DeviceType currentActiveDevice_ = DEVICE_TYPE_NONE;
119     std::unordered_map<uint32_t, float> doNotDisturbStatusWhiteListVolume_ {};
120     bool isDoNotDisturbStatus_ = false;
121 };
122 
123 class StreamVolume {
124 public:
StreamVolume(uint32_t sessionId,int32_t streamType,int32_t streamUsage,int32_t uid,int32_t pid,bool isSystemApp,int32_t mode,bool isVKB)125     StreamVolume(uint32_t sessionId, int32_t streamType, int32_t streamUsage, int32_t uid, int32_t pid,
126         bool isSystemApp, int32_t mode, bool isVKB) : sessionId_(sessionId), streamType_(streamType),
127         streamUsage_(streamUsage), appUid_(uid), appPid_(pid), isSystemApp_(isSystemApp),
128         isVirtualKeyboard_(isVKB) {volumeMode_ = static_cast<AudioVolumeMode>(mode);};
129     ~StreamVolume() = default;
GetSessionId()130     uint32_t GetSessionId() {return sessionId_;};
GetStreamType()131     int32_t GetStreamType() {return streamType_;};
GetStreamUsage()132     int32_t GetStreamUsage() {return streamUsage_;};
GetAppUid()133     int32_t GetAppUid() {return appUid_;};
GetAppPid()134     int32_t GetAppPid() {return appPid_;};
IsSystemApp()135     bool IsSystemApp() {return isSystemApp_;};
GetVolumeMode()136     AudioVolumeMode GetVolumeMode() {return volumeMode_;};
IsVirtualKeyboard()137     bool IsVirtualKeyboard() {return isVirtualKeyboard_;};
138 public:
139     float volume_ = 1.0f;
140     float duckFactor_ = 1.0f;
141     float lowPowerFactor_ = 1.0f;
142     bool isMuted_ = false;
143 
144     float appVolume_ = 1.0f;
145     float totalVolume_ = 1.0f; // volume_ * duckFactor_ * lowPowerFactor_ * appVolume_
146 
147     float historyVolume_ = 0.0f; // used all volume
148     float monitorVolume_ = 0.0f; // monitor all volume change
149     int32_t monitorVolumeLevel_ = 0; // monitor system volume level change
150 
151 private:
152     uint32_t sessionId_ = 0;
153     int32_t streamType_ = 0;
154     int32_t streamUsage_ = 0;
155     int32_t appUid_ = 0;
156     int32_t appPid_ = 0;
157     bool isSystemApp_ = false;
158     AudioVolumeMode volumeMode_ = AUDIOSTREAM_VOLUMEMODE_SYSTEM_GLOBAL;
159     bool isVirtualKeyboard_ = false;
160 };
161 
162 class SystemVolume {
163 public:
SystemVolume(int32_t volumeType,std::string deviceClass,float volume,int32_t volumeLevel,bool isMuted)164     SystemVolume(int32_t volumeType, std::string deviceClass, float volume, int32_t volumeLevel, bool isMuted)
165         : volumeType_(volumeType), deviceClass_(deviceClass), volume_(volume),
166         volumeLevel_(volumeLevel), isMuted_(isMuted) {};
167     ~SystemVolume() = default;
GetVolumeType()168     int32_t GetVolumeType() {return volumeType_;};
GetDeviceClass()169     std::string GetDeviceClass() {return deviceClass_;};
170 
171 private:
172     int32_t volumeType_ = 0;
173     std::string deviceClass_ = "";
174 
175 public:
176     float volume_ = 0.0f;
177     int32_t volumeLevel_ = 0;
178     bool isMuted_ = false;
179     float totalVolume_ = 0.0f;
180 };
181 
182 class AppVolume {
183 public:
AppVolume(int32_t appUid,float volume,int32_t volumeLevel,bool isMuted)184     AppVolume(int32_t appUid, float volume, int32_t volumeLevel, bool isMuted)
185         : appUid_(appUid), volume_(volume),
186         volumeLevel_(volumeLevel), isMuted_(isMuted) {};
187     ~AppVolume() = default;
GetAppUid()188     int32_t GetAppUid() {return appUid_;};
189 
190 private:
191     int32_t appUid_ = 0;
192 
193 public:
194     float volume_ = 1.0f;
195     int32_t volumeLevel_ = 0;
196     bool isMuted_ = false;
197     float totalVolume_ = 1.0f;
198 };
199 } // namespace AudioStandard
200 } // namespace OHOS
201 #endif
202