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 LOG_TAG
17 #define LOG_TAG "AudioVolume"
18 #endif
19 
20 #include "audio_volume.h"
21 #include "audio_volume_c.h"
22 #include "audio_common_log.h"
23 #include "audio_utils.h"
24 #include "audio_stream_info.h"
25 #include "media_monitor_manager.h"
26 #include "event_bean.h"
27 
28 namespace OHOS {
29 namespace AudioStandard {
30 static const std::unordered_map<std::string, AudioStreamType> STREAM_TYPE_STRING_ENUM_MAP = {
31     {"voice_call", STREAM_VOICE_CALL},
32     {"voice_call_assistant", STREAM_VOICE_CALL_ASSISTANT},
33     {"music", STREAM_MUSIC},
34     {"ring", STREAM_RING},
35     {"media", STREAM_MEDIA},
36     {"voice_assistant", STREAM_VOICE_ASSISTANT},
37     {"system", STREAM_SYSTEM},
38     {"alarm", STREAM_ALARM},
39     {"notification", STREAM_NOTIFICATION},
40     {"bluetooth_sco", STREAM_BLUETOOTH_SCO},
41     {"enforced_audible", STREAM_ENFORCED_AUDIBLE},
42     {"dtmf", STREAM_DTMF},
43     {"tts", STREAM_TTS},
44     {"accessibility", STREAM_ACCESSIBILITY},
45     {"recording", STREAM_RECORDING},
46     {"movie", STREAM_MOVIE},
47     {"game", STREAM_GAME},
48     {"speech", STREAM_SPEECH},
49     {"system_enforced", STREAM_SYSTEM_ENFORCED},
50     {"ultrasonic", STREAM_ULTRASONIC},
51     {"wakeup", STREAM_WAKEUP},
52     {"voice_message", STREAM_VOICE_MESSAGE},
53     {"navigation", STREAM_NAVIGATION}
54 };
55 
GetInstance()56 AudioVolume *AudioVolume::GetInstance()
57 {
58     static AudioVolume instance;
59     return &instance;
60 }
61 
AudioVolume()62 AudioVolume::AudioVolume()
63 {
64     AUDIO_INFO_LOG("AudioVolume construct");
65 }
66 
~AudioVolume()67 AudioVolume::~AudioVolume()
68 {
69     streamVolume_.clear();
70     systemVolume_.clear();
71     historyVolume_.clear();
72     monitorVolume_.clear();
73 }
74 
GetVolume(uint32_t sessionId,int32_t volumeType,const std::string & deviceClass)75 float AudioVolume::GetVolume(uint32_t sessionId, int32_t volumeType, const std::string &deviceClass)
76 {
77     Trace trace("AudioVolume::GetVolume sessionId:" + std::to_string(sessionId));
78     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
79     float volumeStream = 1.0f;
80     auto it = streamVolume_.find(sessionId);
81     if (it != streamVolume_.end()) {
82         volumeStream =
83             it->second.isMuted_ ? 0.0f : it->second.volume_ * it->second.duckFactor_ * it->second.lowPowerFactor_;
84         AUDIO_DEBUG_LOG("stream volume, sessionId:%{public}u, volume:%{public}f, duck:%{public}f, lowPower:%{public}f,"
85             " isMuted:%{public}d, streamVolumeSize:%{public}zu",
86             sessionId, it->second.volume_, it->second.duckFactor_, it->second.lowPowerFactor_, it->second.isMuted_,
87             streamVolume_.size());
88     } else {
89         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u, streamVolumeSize:%{public}zu",
90             sessionId, streamVolume_.size());
91     }
92 
93     std::shared_lock<std::shared_mutex> lockSystem(systemMutex_);
94     int32_t volumeLevel = 0;
95     float volumeSystem = 1.0f;
96     std::string key = std::to_string(volumeType) + deviceClass;
97     auto itSV = systemVolume_.find(key);
98     if (itSV != systemVolume_.end()) {
99         volumeLevel = itSV->second.volumeLevel_;
100         volumeSystem = itSV->second.isMuted_ ? 0.0f : itSV->second.volume_;
101         AUDIO_DEBUG_LOG("system volume, volumeType:%{public}d, deviceClass:%{public}s,"
102             " volume:%{public}f, isMuted:%{public}d, systemVolumeSize:%{public}zu",
103             volumeType, deviceClass.c_str(), itSV->second.volume_, itSV->second.isMuted_, systemVolume_.size());
104     } else {
105         AUDIO_ERR_LOG("system volume not exist, volumeType:%{public}d, deviceClass:%{public}s,"
106             " systemVolumeSize:%{public}zu", volumeType, deviceClass.c_str(), systemVolume_.size());
107     }
108     float volumeFloat = volumeStream * volumeSystem;
109     if (monitorVolume_.find(sessionId) != monitorVolume_.end()) {
110         if (monitorVolume_[sessionId].first != volumeFloat) {
111             AUDIO_INFO_LOG("volume, sessionId:%{public}u, volume:%{public}f, volumeType:%{public}d,"
112                 " deviceClass:%{public}s, stream volume:%{public}f, system volume:%{public}f",
113                 sessionId, volumeFloat, volumeType, deviceClass.c_str(), volumeStream, volumeSystem);
114         }
115         monitorVolume_[sessionId] = {volumeFloat, volumeLevel};
116     }
117     return volumeFloat;
118 }
119 
GetStreamVolume(uint32_t sessionId)120 float AudioVolume::GetStreamVolume(uint32_t sessionId)
121 {
122     Trace trace("AudioVolume::GetStreamVolume sessionId:" + std::to_string(sessionId));
123     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
124     float volumeStream = 1.0f;
125     auto it = streamVolume_.find(sessionId);
126     if (it != streamVolume_.end()) {
127         volumeStream =
128             it->second.isMuted_ ? 0.0f : it->second.volume_ * it->second.duckFactor_ * it->second.lowPowerFactor_;
129         AUDIO_DEBUG_LOG("stream volume, sessionId:%{public}u, volume:%{public}f, duck:%{public}f, lowPower:%{public}f,"
130             " isMuted:%{public}d, streamVolumeSize:%{public}zu",
131             sessionId, it->second.volume_, it->second.duckFactor_, it->second.lowPowerFactor_, it->second.isMuted_,
132             streamVolume_.size());
133     } else {
134         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u, streamVolumeSize:%{public}zu",
135             sessionId, streamVolume_.size());
136     }
137     if (monitorVolume_.find(sessionId) != monitorVolume_.end()) {
138         if (monitorVolume_[sessionId].first != volumeStream) {
139             AUDIO_INFO_LOG("volume, sessionId:%{public}u, stream volume:%{public}f", sessionId, volumeStream);
140         }
141         monitorVolume_[sessionId] = {volumeStream, 15}; // 15 level only stream volume
142     }
143     return volumeStream;
144 }
145 
GetHistoryVolume(uint32_t sessionId)146 float AudioVolume::GetHistoryVolume(uint32_t sessionId)
147 {
148     Trace trace("AudioVolume::GetHistoryVolume sessionId:" + std::to_string(sessionId));
149     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
150     auto it = historyVolume_.find(sessionId);
151     if (it != historyVolume_.end()) {
152         return it->second;
153     }
154     return 0.0f;
155 }
156 
SetHistoryVolume(uint32_t sessionId,float volume)157 void AudioVolume::SetHistoryVolume(uint32_t sessionId, float volume)
158 {
159     AUDIO_INFO_LOG("history volume, sessionId:%{public}u, volume:%{public}f", sessionId, volume);
160     Trace trace("AudioVolume::SetHistoryVolume sessionId:" + std::to_string(sessionId));
161     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
162     auto it = historyVolume_.find(sessionId);
163     if (it != historyVolume_.end()) {
164         it->second = volume;
165     }
166 }
167 
AddStreamVolume(uint32_t sessionId,int32_t streamType,int32_t streamUsage,int32_t uid,int32_t pid)168 void AudioVolume::AddStreamVolume(uint32_t sessionId, int32_t streamType, int32_t streamUsage,
169     int32_t uid, int32_t pid)
170 {
171     AUDIO_INFO_LOG("stream volume, sessionId:%{public}u", sessionId);
172     std::unique_lock<std::shared_mutex> lock(volumeMutex_);
173     auto it = streamVolume_.find(sessionId);
174     if (it == streamVolume_.end()) {
175         streamVolume_.emplace(sessionId, StreamVolume(sessionId, streamType, streamUsage, uid, pid));
176         historyVolume_.emplace(sessionId, 0.0f);
177         monitorVolume_.emplace(sessionId, std::make_pair(0.0f, 0));
178     } else {
179         AUDIO_ERR_LOG("stream volume already exist, sessionId:%{public}u", sessionId);
180     }
181 }
182 
RemoveStreamVolume(uint32_t sessionId)183 void AudioVolume::RemoveStreamVolume(uint32_t sessionId)
184 {
185     AUDIO_INFO_LOG("stream volume, sessionId:%{public}u", sessionId);
186     std::unique_lock<std::shared_mutex> lock(volumeMutex_);
187     auto it = streamVolume_.find(sessionId);
188     if (it != streamVolume_.end()) {
189         streamVolume_.erase(sessionId);
190     } else {
191         AUDIO_ERR_LOG("stream volume already delete, sessionId:%{public}u", sessionId);
192     }
193     auto itHistory = historyVolume_.find(sessionId);
194     if (itHistory != historyVolume_.end()) {
195         historyVolume_.erase(sessionId);
196     }
197     auto itMonitor = monitorVolume_.find(sessionId);
198     if (itMonitor != monitorVolume_.end()) {
199         monitorVolume_.erase(sessionId);
200     }
201 }
202 
SetStreamVolume(uint32_t sessionId,float volume)203 void AudioVolume::SetStreamVolume(uint32_t sessionId, float volume)
204 {
205     AUDIO_INFO_LOG("stream volume, sessionId:%{public}u, volume:%{public}f", sessionId, volume);
206     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
207     auto it = streamVolume_.find(sessionId);
208     if (it != streamVolume_.end()) {
209         it->second.volume_ = volume;
210     } else {
211         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u", sessionId);
212     }
213 }
214 
SetStreamVolumeDuckFactor(uint32_t sessionId,float duckFactor)215 void AudioVolume::SetStreamVolumeDuckFactor(uint32_t sessionId, float duckFactor)
216 {
217     AUDIO_INFO_LOG("stream volume, sessionId:%{public}u, duckFactor:%{public}f", sessionId, duckFactor);
218     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
219     auto it = streamVolume_.find(sessionId);
220     if (it != streamVolume_.end()) {
221         it->second.duckFactor_ = duckFactor;
222     } else {
223         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u", sessionId);
224     }
225 }
226 
SetStreamVolumeLowPowerFactor(uint32_t sessionId,float lowPowerFactor)227 void AudioVolume::SetStreamVolumeLowPowerFactor(uint32_t sessionId, float lowPowerFactor)
228 {
229     AUDIO_INFO_LOG("stream volume, sessionId:%{public}u, lowPowerFactor:%{public}f", sessionId, lowPowerFactor);
230     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
231     auto it = streamVolume_.find(sessionId);
232     if (it != streamVolume_.end()) {
233         it->second.lowPowerFactor_ = lowPowerFactor;
234     } else {
235         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u", sessionId);
236     }
237 }
238 
SetStreamVolumeMute(uint32_t sessionId,bool isMuted)239 void AudioVolume::SetStreamVolumeMute(uint32_t sessionId, bool isMuted)
240 {
241     AUDIO_INFO_LOG("stream volume, sessionId:%{public}u, isMuted:%{public}d", sessionId, isMuted);
242     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
243     auto it = streamVolume_.find(sessionId);
244     if (it != streamVolume_.end()) {
245         it->second.isMuted_ = isMuted;
246     }
247 }
248 
SetStreamVolumeFade(uint32_t sessionId,float fadeBegin,float fadeEnd)249 void AudioVolume::SetStreamVolumeFade(uint32_t sessionId, float fadeBegin, float fadeEnd)
250 {
251     AUDIO_INFO_LOG("stream volume, sessionId:%{public}u, fadeBegin:%{public}f, fadeEnd:%{public}f",
252         sessionId, fadeBegin, fadeEnd);
253     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
254     auto it = streamVolume_.find(sessionId);
255     if (it != streamVolume_.end()) {
256         it->second.fadeBegin_ = fadeBegin;
257         it->second.fadeEnd_ = fadeEnd;
258     } else {
259         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u", sessionId);
260     }
261 }
262 
GetStreamVolumeFade(uint32_t sessionId)263 std::pair<float, float> AudioVolume::GetStreamVolumeFade(uint32_t sessionId)
264 {
265     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
266     auto it = streamVolume_.find(sessionId);
267     if (it != streamVolume_.end()) {
268         return {it->second.fadeBegin_, it->second.fadeEnd_};
269     } else {
270         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u", sessionId);
271     }
272     return {1.0f, 1.0f};
273 }
274 
SetSystemVolume(SystemVolume & systemVolume)275 void AudioVolume::SetSystemVolume(SystemVolume &systemVolume)
276 {
277     auto volumeType = systemVolume.GetVolumeType();
278     auto deviceClass = systemVolume.GetDeviceClass();
279     std::string key = std::to_string(volumeType) + deviceClass;
280     bool haveSystemVolume = true;
281     {
282         std::shared_lock<std::shared_mutex> lock(systemMutex_);
283         auto it = systemVolume_.find(key);
284         if (it != systemVolume_.end()) {
285             it->second.volume_ = systemVolume.volume_;
286             it->second.volumeLevel_ = systemVolume.volumeLevel_;
287             it->second.isMuted_ = systemVolume.isMuted_;
288         } else {
289             haveSystemVolume = false;
290         }
291     }
292     if (!haveSystemVolume) {
293         std::unique_lock<std::shared_mutex> lock(systemMutex_);
294         systemVolume_.emplace(key, systemVolume);
295     }
296     AUDIO_INFO_LOG("system volume, volumeType:%{public}d, deviceClass:%{public}s,"
297         " volume:%{public}f, volumeLevel:%{public}d, isMuted:%{public}d, systemVolumeSize:%{public}zu",
298         volumeType, deviceClass.c_str(), systemVolume.volume_, systemVolume.volumeLevel_, systemVolume.isMuted_,
299         systemVolume_.size());
300 }
301 
SetSystemVolume(int32_t volumeType,const std::string & deviceClass,float volume,int32_t volumeLevel)302 void AudioVolume::SetSystemVolume(int32_t volumeType, const std::string &deviceClass, float volume, int32_t volumeLevel)
303 {
304     std::string key = std::to_string(volumeType) + deviceClass;
305     bool haveSystemVolume = true;
306     {
307         std::shared_lock<std::shared_mutex> lock(systemMutex_);
308         auto it = systemVolume_.find(key);
309         if (it != systemVolume_.end()) {
310             it->second.volume_ = volume;
311             it->second.volumeLevel_ = volumeLevel;
312         } else {
313             haveSystemVolume = false;
314         }
315     }
316     if (!haveSystemVolume) {
317         std::unique_lock<std::shared_mutex> lock(systemMutex_);
318         SystemVolume systemVolume(volumeType, deviceClass, volume, volumeLevel, false);
319         systemVolume_.emplace(key, systemVolume);
320     }
321     AUDIO_INFO_LOG("system volume, volumeType:%{public}d, deviceClass:%{public}s,"
322         " volume:%{public}f, volumeLevel:%{public}d, systemVolumeSize:%{public}zu",
323         volumeType, deviceClass.c_str(), volume, volumeLevel, systemVolume_.size());
324 }
325 
SetSystemVolumeMute(int32_t volumeType,const std::string & deviceClass,bool isMuted)326 void AudioVolume::SetSystemVolumeMute(int32_t volumeType, const std::string &deviceClass, bool isMuted)
327 {
328     AUDIO_INFO_LOG("system volume, volumeType:%{public}d, deviceClass:%{public}s, isMuted:%{public}d",
329         volumeType, deviceClass.c_str(), isMuted);
330     std::string key = std::to_string(volumeType) + deviceClass;
331     bool haveSystemVolume = true;
332     {
333         std::shared_lock<std::shared_mutex> lock(systemMutex_);
334         auto it = systemVolume_.find(key);
335         if (it != systemVolume_.end()) {
336             it->second.isMuted_ = isMuted;
337         } else {
338             haveSystemVolume = false;
339         }
340     }
341     if (!haveSystemVolume) {
342         std::unique_lock<std::shared_mutex> lock(systemMutex_);
343         SystemVolume systemVolume(volumeType, deviceClass, 0.0f, 0, isMuted);
344         systemVolume_.emplace(key, systemVolume);
345     }
346 }
347 
ConvertStreamTypeStrToInt(const std::string & streamType)348 int32_t AudioVolume::ConvertStreamTypeStrToInt(const std::string &streamType)
349 {
350     AudioStreamType stream = STREAM_MUSIC;
351     if (STREAM_TYPE_STRING_ENUM_MAP.find(streamType) != STREAM_TYPE_STRING_ENUM_MAP.end()) {
352         stream = STREAM_TYPE_STRING_ENUM_MAP.at(streamType);
353     } else {
354         AUDIO_WARNING_LOG("Invalid stream type [%{public}s]. Use default type", streamType.c_str());
355     }
356     return stream;
357 }
358 
IsSameVolume(float x,float y)359 bool AudioVolume::IsSameVolume(float x, float y)
360 {
361     return (std::abs((x) - (y)) <= std::abs(FLOAT_EPS));
362 }
363 
Dump(std::string & dumpString)364 void AudioVolume::Dump(std::string &dumpString)
365 {
366     AUDIO_INFO_LOG("AudioVolume dump begin");
367     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
368     // dump system volume
369     std::vector<SystemVolume> systemVolumeList;
370     for (auto &systemVolume : systemVolume_) {
371         systemVolumeList.push_back(systemVolume.second);
372     }
373     std::sort(systemVolumeList.begin(), systemVolumeList.end(), [](SystemVolume &a, SystemVolume &b) {
374         return a.GetVolumeType() < b.GetVolumeType();
375     });
376     AppendFormat(dumpString, "\n  - audio system volume size: %zu\n", systemVolumeList.size());
377     for (auto &systemVolume : systemVolumeList) {
378         AppendFormat(dumpString, "  streamtype: %d ", systemVolume.GetVolumeType());
379         AppendFormat(dumpString, "  isMute: %s ", (systemVolume.isMuted_ ? "true" : "false"));
380         AppendFormat(dumpString, "  volFloat: %f ", systemVolume.volume_);
381         AppendFormat(dumpString, "  volInt: %d ", systemVolume.volumeLevel_);
382         AppendFormat(dumpString, "  device class: %s \n", systemVolume.GetDeviceClass().c_str());
383     }
384 
385     // dump stream volume
386     std::vector<StreamVolume> streamVolumeList;
387     for (auto &streamVolume : streamVolume_) {
388         streamVolumeList.push_back(streamVolume.second);
389     }
390     std::sort(streamVolumeList.begin(), streamVolumeList.end(), [](StreamVolume &a, StreamVolume &b) {
391         return a.GetSessionId() < b.GetSessionId();
392     });
393     AppendFormat(dumpString, "\n  - audio stream volume size: %zu, his volume size: %zu, mon volume size: %zu\n",
394         streamVolumeList.size(), historyVolume_.size(), monitorVolume_.size());
395     for (auto &streamVolume : streamVolumeList) {
396         auto monVol = monitorVolume_.find(streamVolume.GetSessionId());
397         AppendFormat(dumpString, "  sessionId: %u ", streamVolume.GetSessionId());
398         AppendFormat(dumpString, "  streamType: %d ", streamVolume.GetStreamType());
399         AppendFormat(dumpString, "  streamUsage: %d ", streamVolume.GetStreamUsage());
400         AppendFormat(dumpString, "  appUid: %d ", streamVolume.GetAppUid());
401         AppendFormat(dumpString, "  appPid: %d ", streamVolume.GetAppPid());
402         AppendFormat(dumpString, "  volume: %f ", monVol != monitorVolume_.end() ? monVol->second.first : 0.0f);
403         AppendFormat(dumpString, "  volumeLevel: %d ",  monVol != monitorVolume_.end() ? monVol->second.second : 0);
404         AppendFormat(dumpString, "  volFactor: %f ", streamVolume.volume_);
405         AppendFormat(dumpString, "  duckFactor: %f ", streamVolume.duckFactor_);
406         AppendFormat(dumpString, "  powerFactor: %f ", streamVolume.lowPowerFactor_);
407         AppendFormat(dumpString, "  fadeBegin: %f ", streamVolume.fadeBegin_);
408         AppendFormat(dumpString, "  fadeEnd: %f \n", streamVolume.fadeEnd_);
409     }
410 }
411 
Monitor(uint32_t sessionId,bool isOutput)412 void AudioVolume::Monitor(uint32_t sessionId, bool isOutput)
413 {
414     std::shared_lock<std::shared_mutex> lock(volumeMutex_);
415     auto streamVolume = streamVolume_.find(sessionId);
416     if (streamVolume != streamVolume_.end()) {
417         auto monVol = monitorVolume_.find(sessionId);
418         std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
419             Media::MediaMonitor::AUDIO, Media::MediaMonitor::VOLUME_CHANGE,
420             Media::MediaMonitor::BEHAVIOR_EVENT);
421         bean->Add("ISOUTPUT", isOutput ? 1 : 0);
422         bean->Add("STREAMID", static_cast<int32_t>(sessionId));
423         bean->Add("APP_UID", streamVolume->second.GetAppUid());
424         bean->Add("APP_PID", streamVolume->second.GetAppPid());
425         bean->Add("STREAMTYPE", streamVolume->second.GetStreamType());
426         bean->Add("STREAM_TYPE", streamVolume->second.GetStreamUsage());
427         bean->Add("VOLUME", monVol != monitorVolume_.end() ? monVol->second.first : 0.0f);
428         bean->Add("SYSVOLUME", monVol != monitorVolume_.end() ? monVol->second.second : 0);
429         bean->Add("VOLUMEFACTOR", streamVolume->second.volume_);
430         bean->Add("POWERVOLUMEFACTOR", streamVolume->second.lowPowerFactor_);
431         Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
432     } else {
433         AUDIO_ERR_LOG("stream volume not exist, sessionId:%{public}u", sessionId);
434     }
435 }
436 
SetFadeoutState(uint32_t streamIndex,uint32_t fadeoutState)437 void AudioVolume::SetFadeoutState(uint32_t streamIndex, uint32_t fadeoutState)
438 {
439     std::unique_lock<std::shared_mutex> lock(fadoutMutex_);
440     fadeoutState_.insert_or_assign(streamIndex, fadeoutState);
441 }
442 
GetFadeoutState(uint32_t streamIndex)443 uint32_t AudioVolume::GetFadeoutState(uint32_t streamIndex)
444 {
445     std::shared_lock<std::shared_mutex> lock(fadoutMutex_);
446     auto it = fadeoutState_.find(streamIndex);
447     if (it != fadeoutState_.end()) { return it->second; }
448     AUDIO_WARNING_LOG("No such streamIndex in map!");
449     return INVALID_STATE;
450 }
451 
RemoveFadeoutState(uint32_t streamIndex)452 void AudioVolume::RemoveFadeoutState(uint32_t streamIndex)
453 {
454     std::unique_lock<std::shared_mutex> lock(fadoutMutex_);
455     fadeoutState_.erase(streamIndex);
456 }
457 } // namespace AudioStandard
458 } // namespace OHOS
459 
460 #ifdef __cplusplus
461 extern "C" {
462 #endif
463 using namespace OHOS::AudioStandard;
464 
GetCurVolume(uint32_t sessionId,const char * streamType,const char * deviceClass)465 float GetCurVolume(uint32_t sessionId, const char *streamType, const char *deviceClass)
466 {
467     CHECK_AND_RETURN_RET_LOG(streamType != nullptr, 1.0f, "streamType is nullptr");
468     CHECK_AND_RETURN_RET_LOG(deviceClass != nullptr, 1.0f, "deviceClass is nullptr");
469     std::string tmpStreamType = streamType;
470     // Set voice call assistant stream type to full volume
471     if (tmpStreamType == "voice_call_assistant") {
472         return 1.0f;
473     }
474     int32_t stream = AudioVolume::GetInstance()->ConvertStreamTypeStrToInt(streamType);
475     AudioStreamType volumeType = VolumeUtils::GetVolumeTypeFromStreamType(static_cast<AudioStreamType>(stream));
476     return AudioVolume::GetInstance()->GetVolume(sessionId, volumeType, deviceClass);
477 }
478 
GetStreamVolume(uint32_t sessionId)479 float GetStreamVolume(uint32_t sessionId)
480 {
481     return AudioVolume::GetInstance()->GetStreamVolume(sessionId);
482 }
483 
GetPreVolume(uint32_t sessionId)484 float GetPreVolume(uint32_t sessionId)
485 {
486     return AudioVolume::GetInstance()->GetHistoryVolume(sessionId);
487 }
488 
SetPreVolume(uint32_t sessionId,float volume)489 void SetPreVolume(uint32_t sessionId, float volume)
490 {
491     AudioVolume::GetInstance()->SetHistoryVolume(sessionId, volume);
492 }
493 
GetStreamVolumeFade(uint32_t sessionId,float * fadeBegin,float * fadeEnd)494 void GetStreamVolumeFade(uint32_t sessionId, float *fadeBegin, float *fadeEnd)
495 {
496     auto fade = AudioVolume::GetInstance()->GetStreamVolumeFade(sessionId);
497     *fadeBegin = fade.first;
498     *fadeEnd = fade.second;
499 }
500 
SetStreamVolumeFade(uint32_t sessionId,float fadeBegin,float fadeEnd)501 void SetStreamVolumeFade(uint32_t sessionId, float fadeBegin, float fadeEnd)
502 {
503     AudioVolume::GetInstance()->SetStreamVolumeFade(sessionId, fadeBegin, fadeEnd);
504 }
505 
IsSameVolume(float x,float y)506 bool IsSameVolume(float x, float y)
507 {
508     return AudioVolume::GetInstance()->IsSameVolume(x, y);
509 }
510 
MonitorVolume(uint32_t sessionId,bool isOutput)511 void MonitorVolume(uint32_t sessionId, bool isOutput)
512 {
513     AudioVolume::GetInstance()->Monitor(sessionId, isOutput);
514 }
515 
SetFadeoutState(uint32_t streamIndex,uint32_t fadeoutState)516 void SetFadeoutState(uint32_t streamIndex, uint32_t fadeoutState)
517 {
518     AudioVolume::GetInstance()->SetFadeoutState(streamIndex, fadeoutState);
519 }
520 
GetFadeoutState(uint32_t streamIndex)521 uint32_t GetFadeoutState(uint32_t streamIndex)
522 {
523     return AudioVolume::GetInstance()->GetFadeoutState(streamIndex);
524 }
525 #ifdef __cplusplus
526 }
527 #endif