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