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