1 /*
2  * Copyright (c) 2021-2022 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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioAdapterManager"
17 #endif
18 
19 #include "audio_adapter_manager.h"
20 
21 
22 #include "parameter.h"
23 #include "parameters.h"
24 
25 #include "audio_volume_parser.h"
26 #include "audio_utils.h"
27 #include "audio_volume.h"
28 
29 using namespace std;
30 
31 namespace OHOS {
32 namespace AudioStandard {
33 static const std::vector<AudioStreamType> VOLUME_TYPE_LIST = {
34     // all volume types except STREAM_ALL
35     STREAM_MUSIC,
36     STREAM_RING,
37     STREAM_VOICE_CALL,
38     STREAM_VOICE_ASSISTANT,
39     STREAM_ALARM,
40     STREAM_ACCESSIBILITY,
41     STREAM_ULTRASONIC,
42     STREAM_VOICE_CALL_ASSISTANT
43 };
44 
45 static const std::vector<DeviceType> VOLUME_GROUP_TYPE_LIST = {
46     DEVICE_TYPE_EARPIECE,
47     DEVICE_TYPE_SPEAKER,
48     DEVICE_TYPE_BLUETOOTH_A2DP,
49     DEVICE_TYPE_WIRED_HEADSET,
50     DEVICE_TYPE_REMOTE_CAST
51 };
52 
53 static const std::vector<std::string> SYSTEM_SOUND_KEY_LIST = {
54     // all keys for system sound uri
55     "ringtone_for_sim_card_0",
56     "ringtone_for_sim_card_1",
57     "system_tone_for_sim_card_0",
58     "system_tone_for_sim_card_1",
59     "system_tone_for_notification"
60 };
61 
62 // LCOV_EXCL_START
Init()63 bool AudioAdapterManager::Init()
64 {
65     char testMode[10] = {0}; // 10 for system parameter usage
66     auto res = GetParameter("debug.audio_service.testmodeon", "0", testMode, sizeof(testMode));
67     if (res == 1 && testMode[0] == '1') {
68         AUDIO_DEBUG_LOG("testMode on");
69         testModeOn_ = true;
70     }
71 
72     std::unique_ptr<AudioVolumeParser> audiovolumeParser = make_unique<AudioVolumeParser>();
73     if (!audiovolumeParser->LoadConfig(streamVolumeInfos_)) {
74         AUDIO_INFO_LOG("Audio Volume Config Load Configuration successfully");
75         useNonlinearAlgo_ = 1;
76         UpdateVolumeMapIndex();
77     }
78 
79     // init volume before kvstore start by local prop for bootanimation
80     char currentVolumeValue[3] = {0};
81     auto ret = GetParameter("persist.multimedia.audio.ringtonevolume", "7",
82         currentVolumeValue, sizeof(currentVolumeValue));
83     if (ret > 0) {
84         int32_t ringtoneVolumeLevel = atoi(currentVolumeValue);
85         volumeDataMaintainer_.SetStreamVolume(STREAM_RING, ringtoneVolumeLevel);
86         AUDIO_INFO_LOG("Init: Get ringtone volume to map success %{public}d",
87             volumeDataMaintainer_.GetStreamVolume(STREAM_RING));
88     } else {
89         AUDIO_ERR_LOG("Init: Get volume parameter failed %{public}d", ret);
90     }
91 
92     std::string defaultSafeVolume = std::to_string(GetMaxVolumeLevel(STREAM_MUSIC));
93     AUDIO_INFO_LOG("defaultSafeVolume %{public}s", defaultSafeVolume.c_str());
94     char currentSafeVolumeValue[3] = {0};
95     ret = GetParameter("const.audio.safe_media_volume", defaultSafeVolume.c_str(),
96         currentSafeVolumeValue, sizeof(currentSafeVolumeValue));
97     if (ret > 0) {
98         safeVolume_ = atoi(currentSafeVolumeValue);
99         AUDIO_INFO_LOG("Get currentSafeVolumeValue success %{public}d", safeVolume_);
100     } else {
101         AUDIO_ERR_LOG("Get currentSafeVolumeValue failed %{public}d", ret);
102     }
103 
104     char safeVolumeTimeout[6] = {0};
105     ret = GetParameter("persist.multimedia.audio.safevolume.timeout", "1140",
106         safeVolumeTimeout, sizeof(safeVolumeTimeout));
107     if (ret > 0) {
108         safeVolumeTimeout_ = atoi(safeVolumeTimeout);
109         AUDIO_INFO_LOG("Get safeVolumeTimeout success %{public}d", safeVolumeTimeout_);
110     } else {
111         AUDIO_ERR_LOG("Get safeVolumeTimeout failed %{public}d", ret);
112     }
113 
114     handler_ = std::make_shared<AudioAdapterManagerHandler>();
115 
116     isVolumeUnadjustable_ = system::GetBoolParameter("const.multimedia.audio.fixedvolume", false);
117     AUDIO_INFO_LOG("Get fixdvolume parameter success %{public}d", isVolumeUnadjustable_);
118 
119     return true;
120 }
121 
ConnectServiceAdapter()122 bool AudioAdapterManager::ConnectServiceAdapter()
123 {
124     std::unique_ptr<PolicyCallbackImpl> policyCallbackImpl = std::make_unique<PolicyCallbackImpl>(this);
125     audioServiceAdapter_ = AudioServiceAdapter::CreateAudioAdapter(std::move(policyCallbackImpl));
126     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_, false,
127         "[AudioAdapterManager] Error in audio adapter initialization");
128 
129     bool result = audioServiceAdapter_->Connect();
130     CHECK_AND_RETURN_RET_LOG(result, false, "[AudioAdapterManager] Error in connecting audio adapter");
131 
132     return true;
133 }
134 
InitKVStore()135 void AudioAdapterManager::InitKVStore()
136 {
137     InitKVStoreInternal();
138 }
139 
InitKVStoreInternal()140 void AudioAdapterManager::InitKVStoreInternal()
141 {
142     CHECK_AND_RETURN_LOG(!isLoaded_, "InitKVStore: the database value is loaded");
143 
144     AUDIO_INFO_LOG("in");
145     bool isFirstBoot = false;
146     volumeDataMaintainer_.RegisterCloned();
147     InitAudioPolicyKvStore(isFirstBoot);
148 
149     if (handler_ != nullptr) {
150         handler_->SendKvDataUpdate(isFirstBoot);
151     }
152 }
153 
HandleKvData(bool isFirstBoot)154 void AudioAdapterManager::HandleKvData(bool isFirstBoot)
155 {
156     InitVolumeMap(isFirstBoot);
157     InitRingerMode(isFirstBoot);
158     InitMuteStatusMap(isFirstBoot);
159     InitSafeStatus(isFirstBoot);
160     InitSafeTime(isFirstBoot);
161 
162     if (isNeedCopySystemUrlData_) {
163         CloneSystemSoundUrl();
164     }
165 
166     if (!isNeedCopyVolumeData_ && !isNeedCopyMuteData_ && !isNeedCopyRingerModeData_ && !isNeedCopySystemUrlData_) {
167         isAllCopyDone_ = true;
168         if (audioPolicyServerHandler_ != nullptr) {
169             audioPolicyServerHandler_->SendRingerModeUpdatedCallback(ringerMode_);
170             SetVolumeCallbackAfterClone();
171         }
172     }
173 
174     if (isAllCopyDone_ && audioPolicyKvStore_ != nullptr) {
175         // delete KvStore
176         InitSafeStatus(true);
177         InitSafeTime(true);
178         AUDIO_INFO_LOG("Copy audio_policy private database success to settings database, delete private database...");
179         DeleteAudioPolicyKvStore();
180     }
181 
182     // Make sure that the volume value is applied.
183     auto iter = VOLUME_TYPE_LIST.begin();
184     while (iter != VOLUME_TYPE_LIST.end()) {
185         SetVolumeDb(*iter);
186         iter++;
187     }
188 }
189 
ReInitKVStore()190 int32_t AudioAdapterManager::ReInitKVStore()
191 {
192     CHECK_AND_RETURN_RET_LOG(audioPolicyKvStore_ != nullptr, ERR_INVALID_OPERATION,
193         "audioPolicyKvStore_ is already nullptr");
194     audioPolicyKvStore_ = nullptr;
195     DistributedKvDataManager manager;
196     Options options;
197 
198     AppId appId;
199     appId.appId = "audio_policy_manager";
200     options.baseDir = std::string("/data/service/el1/public/database/") + appId.appId;
201 
202     StoreId storeId;
203     storeId.storeId = "audiopolicy";
204     Status status = Status::SUCCESS;
205 
206     status = manager.CloseKvStore(appId, storeId);
207     AUDIO_ERR_LOG("CloseKvStore status: %{public}d", status);
208     CHECK_AND_RETURN_RET_LOG(status == Status::SUCCESS, ERR_ILLEGAL_STATE, "CloseKvStore failed!");
209 
210     status = manager.DeleteKvStore(appId, storeId, options.baseDir);
211     CHECK_AND_RETURN_RET_LOG(status == Status::SUCCESS, ERR_ILLEGAL_STATE, "CloseKvStore failed!");
212 
213     InitKVStoreInternal();
214     return SUCCESS;
215 }
216 
Deinit(void)217 void AudioAdapterManager::Deinit(void)
218 {
219     CHECK_AND_RETURN_LOG(audioServiceAdapter_, "Deinit audio adapter null");
220 
221     if (handler_ != nullptr) {
222         AUDIO_INFO_LOG("release handler");
223         handler_->ReleaseEventRunner();
224         handler_ = nullptr;
225     }
226     return audioServiceAdapter_->Disconnect();
227 }
228 
SetAudioStreamRemovedCallback(AudioStreamRemovedCallback * callback)229 int32_t AudioAdapterManager::SetAudioStreamRemovedCallback(AudioStreamRemovedCallback *callback)
230 {
231     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
232         "SetAudioStreamRemovedCallback callback == nullptr");
233 
234     sessionCallback_ = callback;
235     return SUCCESS;
236 }
237 
238 // LCOV_EXCL_STOP
GetMaxVolumeLevel(AudioVolumeType volumeType)239 int32_t AudioAdapterManager::GetMaxVolumeLevel(AudioVolumeType volumeType)
240 {
241     CHECK_AND_RETURN_RET_LOG(volumeType >= STREAM_VOICE_CALL && volumeType <= STREAM_TYPE_MAX,
242         ERR_INVALID_PARAM, "Invalid stream type");
243     return maxVolumeIndexMap_[volumeType];
244 }
245 
GetMinVolumeLevel(AudioVolumeType volumeType)246 int32_t AudioAdapterManager::GetMinVolumeLevel(AudioVolumeType volumeType)
247 {
248     CHECK_AND_RETURN_RET_LOG(volumeType >= STREAM_VOICE_CALL && volumeType <= STREAM_TYPE_MAX,
249         ERR_INVALID_PARAM, "Invalid stream type");
250     return minVolumeIndexMap_[volumeType];
251 }
252 
SaveRingtoneVolumeToLocal(AudioVolumeType volumeType,int32_t volumeLevel)253 void AudioAdapterManager::SaveRingtoneVolumeToLocal(AudioVolumeType volumeType, int32_t volumeLevel)
254 {
255     if (volumeType == STREAM_RING) {
256         int32_t ret = SetParameter("persist.multimedia.audio.ringtonevolume", std::to_string(volumeLevel).c_str());
257         if (ret == 0) {
258             AUDIO_INFO_LOG("Save ringtone volume for boot success %{public}d", volumeLevel);
259         } else {
260             AUDIO_ERR_LOG("Save ringtone volume for boot failed, result %{public}d", ret);
261         }
262     }
263 }
264 
SetDataShareReady(std::atomic<bool> isDataShareReady)265 void AudioAdapterManager::SetDataShareReady(std::atomic<bool> isDataShareReady)
266 {
267     volumeDataMaintainer_.SetDataShareReady(std::atomic_load(&isDataShareReady));
268 }
269 
SetSystemVolumeLevel(AudioStreamType streamType,int32_t volumeLevel)270 int32_t AudioAdapterManager::SetSystemVolumeLevel(AudioStreamType streamType, int32_t volumeLevel)
271 {
272     if (GetSystemVolumeLevel(streamType) == volumeLevel && currentActiveDevice_ != DEVICE_TYPE_BLUETOOTH_SCO &&
273         currentActiveDevice_ != DEVICE_TYPE_BLUETOOTH_A2DP) {
274         AUDIO_INFO_LOG("The volume is the same as before.");
275         return SUCCESS;
276     }
277     AUDIO_INFO_LOG("SetSystemVolumeLevel: streamType: %{public}d, deviceType: %{public}d, volumeLevel:%{public}d",
278         streamType, currentActiveDevice_, volumeLevel);
279     if (volumeLevel == 0 &&
280         (streamType == STREAM_VOICE_ASSISTANT || streamType == STREAM_VOICE_CALL ||
281         streamType == STREAM_ALARM || streamType == STREAM_ACCESSIBILITY ||
282         streamType == STREAM_VOICE_COMMUNICATION)) {
283         // these types can not set to mute, but don't return error
284         AUDIO_ERR_LOG("SetSystemVolumeLevel this type can not set mute");
285         return SUCCESS;
286     }
287     int32_t mimRet = GetMinVolumeLevel(streamType);
288     int32_t maxRet = GetMaxVolumeLevel(streamType);
289     CHECK_AND_RETURN_RET_LOG(volumeLevel >= mimRet && volumeLevel <= maxRet, ERR_OPERATION_FAILED,
290         "volumeLevel not in scope.");
291 
292     // In case if KvStore didnot connect during bootup
293     if (!isLoaded_) {
294         InitKVStoreInternal();
295     }
296 
297     if (currentActiveDevice_ == DEVICE_TYPE_BLUETOOTH_SCO || currentActiveDevice_ == DEVICE_TYPE_BLUETOOTH_A2DP) {
298         if (isBtFirstSetVolume_ && volumeLevel > safeVolume_) {
299             volumeLevel = safeVolume_;
300             isBtFirstSetVolume_ = false;
301         }
302     }
303 
304     volumeDataMaintainer_.SetStreamVolume(streamType, volumeLevel);
305 
306     if (handler_ != nullptr) {
307         if (Util::IsDualToneStreamType(streamType)) {
308             AUDIO_INFO_LOG("DualToneStreamType. Save volume for speaker.");
309             handler_->SendSaveVolume(DEVICE_TYPE_SPEAKER, streamType, volumeLevel);
310         } else {
311             handler_->SendSaveVolume(currentActiveDevice_, streamType, volumeLevel);
312         }
313     }
314 
315     return SetVolumeDb(streamType);
316 }
317 
HandleSaveVolume(DeviceType deviceType,AudioStreamType streamType,int32_t volumeLevel)318 void AudioAdapterManager::HandleSaveVolume(DeviceType deviceType, AudioStreamType streamType, int32_t volumeLevel)
319 {
320     volumeDataMaintainer_.SaveVolume(deviceType, streamType, volumeLevel);
321 }
322 
HandleStreamMuteStatus(AudioStreamType streamType,bool mute,StreamUsage streamUsage)323 void AudioAdapterManager::HandleStreamMuteStatus(AudioStreamType streamType, bool mute, StreamUsage streamUsage)
324 {
325     volumeDataMaintainer_.SaveMuteStatus(currentActiveDevice_, streamType, mute);
326 }
327 
HandleRingerMode(AudioRingerMode ringerMode)328 void AudioAdapterManager::HandleRingerMode(AudioRingerMode ringerMode)
329 {
330     // In case if KvStore didnot connect during bootup
331     if (!isLoaded_) {
332         InitKVStoreInternal();
333     }
334 
335     AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(STREAM_RING);
336     int32_t volumeLevel =
337         volumeDataMaintainer_.GetStreamVolume(STREAM_RING) * ((ringerMode != RINGER_MODE_NORMAL) ? 0 : 1);
338 
339     // Save volume in local prop for bootanimation
340     SaveRingtoneVolumeToLocal(streamForVolumeMap, volumeLevel);
341 
342     volumeDataMaintainer_.SaveRingerMode(ringerMode);
343 }
344 
SetAudioServerProxy(sptr<IStandardAudioService> gsp)345 void AudioAdapterManager::SetAudioServerProxy(sptr<IStandardAudioService> gsp)
346 {
347     CHECK_AND_RETURN_LOG(gsp != nullptr, "audioServerProxy null");
348     audioServerProxy_ = gsp;
349 }
350 
SetDoubleRingVolumeDb(const AudioStreamType & streamType,const int32_t & volumeLevel)351 int32_t AudioAdapterManager::SetDoubleRingVolumeDb(const AudioStreamType &streamType, const int32_t &volumeLevel)
352 {
353     float volumeDb = 1.0f;
354     if (useNonlinearAlgo_) {
355         if (Util::IsDualToneStreamType(streamType)) {
356             volumeDb = CalculateVolumeDbNonlinear(streamType, DEVICE_TYPE_SPEAKER, volumeLevel);
357         } else {
358             volumeDb = CalculateVolumeDbNonlinear(streamType, currentActiveDevice_, volumeLevel);
359         }
360     } else {
361         volumeDb = CalculateVolumeDb(volumeLevel);
362     }
363     SetAudioVolume(streamType, volumeDb);
364 
365     return SUCCESS;
366 }
367 
SetVolumeDb(AudioStreamType streamType)368 int32_t AudioAdapterManager::SetVolumeDb(AudioStreamType streamType)
369 {
370     AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
371     int32_t volumeLevel =
372         volumeDataMaintainer_.GetStreamVolume(streamType) * (GetStreamMute(streamType) ? 0 : 1);
373 
374     // Save volume in local prop for bootanimation
375     SaveRingtoneVolumeToLocal(streamForVolumeMap, volumeLevel);
376 
377     float volumeDb = 1.0f;
378     if (useNonlinearAlgo_) {
379         if (Util::IsDualToneStreamType(streamType)) {
380             volumeDb = CalculateVolumeDbNonlinear(streamType, DEVICE_TYPE_SPEAKER, volumeLevel);
381         } else {
382             volumeDb = CalculateVolumeDbNonlinear(streamType, currentActiveDevice_, volumeLevel);
383         }
384     } else {
385         volumeDb = CalculateVolumeDb(volumeLevel);
386     }
387     // Set voice call assistant stream to full volume
388     if (streamType == STREAM_VOICE_CALL_ASSISTANT) {
389         volumeDb = 1.0f;
390     }
391 
392     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_, ERR_OPERATION_FAILED,
393         "SetSystemVolumeLevel audio adapter null");
394 
395     AUDIO_INFO_LOG("streamType:%{public}d volumeDb:%{public}f volume:%{public}d", streamType, volumeDb, volumeLevel);
396 
397     // audio volume
398     SetAudioVolume(streamType, volumeDb);
399 
400     return SUCCESS;
401 }
402 
SetAudioVolume(AudioStreamType streamType,float volumeDb)403 void AudioAdapterManager::SetAudioVolume(AudioStreamType streamType, float volumeDb)
404 {
405     static std::unordered_map<DeviceType, std::vector<std::string>> deviceClassMap = {
406         {DEVICE_TYPE_SPEAKER, {PRIMARY_CLASS, MCH_CLASS, REMOTE_CLASS, OFFLOAD_CLASS}},
407         {DEVICE_TYPE_USB_HEADSET, {PRIMARY_CLASS, MCH_CLASS, OFFLOAD_CLASS}},
408         {DEVICE_TYPE_BLUETOOTH_A2DP, {A2DP_CLASS, PRIMARY_CLASS, MCH_CLASS, OFFLOAD_CLASS}},
409         {DEVICE_TYPE_BLUETOOTH_SCO, {PRIMARY_CLASS, MCH_CLASS}},
410         {DEVICE_TYPE_EARPIECE, {PRIMARY_CLASS, MCH_CLASS}},
411         {DEVICE_TYPE_WIRED_HEADSET, {PRIMARY_CLASS, MCH_CLASS}},
412         {DEVICE_TYPE_WIRED_HEADPHONES, {PRIMARY_CLASS, MCH_CLASS}},
413         {DEVICE_TYPE_USB_ARM_HEADSET, {USB_CLASS}},
414         {DEVICE_TYPE_REMOTE_CAST, {REMOTE_CAST_INNER_CAPTURER_SINK_NAME}},
415         {DEVICE_TYPE_DP, {DP_CLASS}},
416         {DEVICE_TYPE_FILE_SINK, {FILE_CLASS}},
417         {DEVICE_TYPE_FILE_SOURCE, {FILE_CLASS}},
418     };
419 
420     std::lock_guard<std::mutex> lock(audioVolumeMutex_);
421     AudioStreamType volumeType = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
422     bool isMuted = GetStreamMute(volumeType);
423     int32_t volumeLevel = volumeDataMaintainer_.GetStreamVolume(volumeType) * (isMuted ? 0 : 1);
424     if (GetActiveDevice() == DEVICE_TYPE_BLUETOOTH_A2DP && IsAbsVolumeScene() && volumeType == STREAM_MUSIC) {
425         isMuted = IsAbsVolumeMute();
426         volumeLevel = volumeDataMaintainer_.GetStreamVolume(volumeType) * (isMuted ? 0 : 1);
427         volumeDb = isMuted ? 0.0f : 0.63957f; // 0.63957 = -4dB
428     }
429     auto audioVolume = AudioVolume::GetInstance();
430     CHECK_AND_RETURN_LOG(audioVolume != nullptr, "audioVolume handle null");
431     auto it = deviceClassMap.find(GetActiveDevice());
432     if (it == deviceClassMap.end()) {
433         AUDIO_ERR_LOG("unkown device type %{public}d", GetActiveDevice());
434         return;
435     }
436     for (auto &deviceClass : it->second) {
437         SystemVolume systemVolume(volumeType, deviceClass, volumeDb, volumeLevel, isMuted);
438         if (deviceClass != OFFLOAD_CLASS) {
439             audioVolume->SetSystemVolume(systemVolume);
440         } else if (deviceClass == OFFLOAD_CLASS && volumeType == STREAM_MUSIC) {
441             audioVolume->SetSystemVolume(systemVolume);
442             SetOffloadVolume(volumeType, volumeDb);
443         }
444     }
445 }
446 
SetOffloadVolume(AudioStreamType streamType,float volumeDb)447 void AudioAdapterManager::SetOffloadVolume(AudioStreamType streamType, float volumeDb)
448 {
449     float volume = volumeDb; // maybe only system volume
450     if (!(streamType == STREAM_MUSIC || streamType == STREAM_SPEECH)) {
451         return;
452     }
453     DeviceType dev = GetActiveDevice();
454     if (!(dev == DEVICE_TYPE_SPEAKER || dev == DEVICE_TYPE_BLUETOOTH_A2DP || dev == DEVICE_TYPE_USB_HEADSET)) {
455         return;
456     }
457     CHECK_AND_RETURN_LOG(audioServerProxy_ != nullptr, "audioServerProxy_ null");
458     std::string identity = IPCSkeleton::ResetCallingIdentity();
459     if (offloadSessionID_.has_value()) { // need stream volume and system volume
460         volume = AudioVolume::GetInstance()->GetVolume(offloadSessionID_.value(), streamType, OFFLOAD_CLASS);
461         audioServerProxy_->OffloadSetVolume(volume);
462     }
463     IPCSkeleton::SetCallingIdentity(identity);
464 }
465 
SetOffloadSessionId(uint32_t sessionId)466 void AudioAdapterManager::SetOffloadSessionId(uint32_t sessionId)
467 {
468     if (sessionId < MIN_SESSIONID || sessionId > MAX_SESSIONID) {
469         AUDIO_PRERELEASE_LOGE("set sessionId[%{public}d] error", sessionId);
470     } else {
471         AUDIO_PRERELEASE_LOGI("set sessionId[%{public}d]", sessionId);
472     }
473     offloadSessionID_ = sessionId;
474 }
475 
ResetOffloadSessionId()476 void AudioAdapterManager::ResetOffloadSessionId()
477 {
478     AUDIO_PRERELEASE_LOGI("reset offload sessionId[%{public}d]", offloadSessionID_.value());
479     offloadSessionID_.reset();
480 }
481 
GetSystemVolumeLevel(AudioStreamType streamType)482 int32_t AudioAdapterManager::GetSystemVolumeLevel(AudioStreamType streamType)
483 {
484     if (GetStreamMuteInternal(streamType)) {
485         return MIN_VOLUME_LEVEL;
486     }
487 
488     return volumeDataMaintainer_.GetStreamVolume(streamType);
489 }
490 
GetSystemVolumeLevelNoMuteState(AudioStreamType streamType)491 int32_t AudioAdapterManager::GetSystemVolumeLevelNoMuteState(AudioStreamType streamType)
492 {
493     return volumeDataMaintainer_.GetStreamVolume(streamType);
494 }
495 
GetSystemVolumeDb(AudioStreamType streamType)496 float AudioAdapterManager::GetSystemVolumeDb(AudioStreamType streamType)
497 {
498     int32_t volumeLevel = volumeDataMaintainer_.GetStreamVolume(streamType);
499     return CalculateVolumeDb(volumeLevel);
500 }
501 
SetStreamMute(AudioStreamType streamType,bool mute,StreamUsage streamUsage)502 int32_t AudioAdapterManager::SetStreamMute(AudioStreamType streamType, bool mute, StreamUsage streamUsage)
503 {
504     return SetStreamMuteInternal(streamType, mute, streamUsage);
505 }
506 
SetStreamMuteInternal(AudioStreamType streamType,bool mute,StreamUsage streamUsage)507 int32_t AudioAdapterManager::SetStreamMuteInternal(AudioStreamType streamType, bool mute,
508     StreamUsage streamUsage)
509 {
510     AUDIO_INFO_LOG("stream type %{public}d, mute:%{public}d, streamUsage:%{public}d", streamType, mute, streamUsage);
511     if (mute &&
512         (streamType == STREAM_VOICE_ASSISTANT || streamType == STREAM_VOICE_CALL ||
513         streamType == STREAM_ALARM || streamType == STREAM_ACCESSIBILITY ||
514         streamType == STREAM_VOICE_COMMUNICATION)) {
515         // these types can not set to mute, but don't return error
516         AUDIO_ERR_LOG("SetStreamMute: this type can not set mute");
517         return SUCCESS;
518     }
519     if (Util::IsDualToneStreamType(streamType) && currentActiveDevice_ != DEVICE_TYPE_SPEAKER &&
520         GetRingerMode() != RINGER_MODE_NORMAL && mute && Util::IsRingerOrAlarmerStreamUsage(streamUsage)) {
521         AUDIO_INFO_LOG("Dual tone stream type %{public}d, current active device:[%{public}d] is no speaker, dont mute",
522             streamType, currentActiveDevice_);
523         return SUCCESS;
524     }
525 
526     // set stream mute status to mem.
527     volumeDataMaintainer_.SetStreamMuteStatus(streamType, mute);
528 
529     if (handler_ != nullptr) {
530         handler_->SendStreamMuteStatusUpdate(streamType, mute, streamUsage);
531     }
532 
533     // Achieve the purpose of adjusting the mute status by adjusting the stream volume.
534     return SetVolumeDb(streamType);
535 }
536 
SetPersistMicMuteState(const bool isMute)537 int32_t AudioAdapterManager::SetPersistMicMuteState(const bool isMute)
538 {
539     AUDIO_INFO_LOG("Save mute state: %{public}d in setting db", isMute);
540     bool res = volumeDataMaintainer_.SaveMicMuteState(isMute);
541 
542     return res == true ? SUCCESS : ERROR;
543 }
544 
GetPersistMicMuteState(bool & isMute) const545 int32_t AudioAdapterManager::GetPersistMicMuteState(bool &isMute) const
546 {
547     bool res = volumeDataMaintainer_.GetMicMuteState(isMute);
548     AUDIO_INFO_LOG("Get mute state from setting db is: %{public}d", isMute);
549 
550     return res == true ? SUCCESS : ERROR;
551 }
552 
SetSourceOutputStreamMute(int32_t uid,bool setMute)553 int32_t AudioAdapterManager::SetSourceOutputStreamMute(int32_t uid, bool setMute)
554 {
555     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_, ERR_OPERATION_FAILED,
556         "SetSourceOutputStreamMute audio adapter null");
557     return audioServiceAdapter_->SetSourceOutputMute(uid, setMute);
558 }
559 
GetStreamMute(AudioStreamType streamType)560 bool AudioAdapterManager::GetStreamMute(AudioStreamType streamType)
561 {
562     return GetStreamMuteInternal(streamType);
563 }
564 
GetStreamVolume(AudioStreamType streamType)565 int32_t AudioAdapterManager::GetStreamVolume(AudioStreamType streamType)
566 {
567     return volumeDataMaintainer_.GetStreamVolume(streamType);
568 }
569 
GetStreamMuteInternal(AudioStreamType streamType)570 bool AudioAdapterManager::GetStreamMuteInternal(AudioStreamType streamType)
571 {
572     return volumeDataMaintainer_.GetStreamMute(streamType);
573 }
574 
575 // LCOV_EXCL_START
GetAllSinks()576 vector<SinkInfo> AudioAdapterManager::GetAllSinks()
577 {
578     if (!audioServiceAdapter_) {
579         AUDIO_ERR_LOG("GetAllSinks audio adapter null");
580         vector<SinkInfo> sinkInputList;
581         return sinkInputList;
582     }
583 
584     return audioServiceAdapter_->GetAllSinks();
585 }
586 
GetAllSinkInputs()587 vector<SinkInput> AudioAdapterManager::GetAllSinkInputs()
588 {
589     if (!audioServiceAdapter_) {
590         AUDIO_ERR_LOG("GetAllSinkInputs audio adapter null");
591         vector<SinkInput> sinkInputList;
592         return sinkInputList;
593     }
594 
595     return audioServiceAdapter_->GetAllSinkInputs();
596 }
597 
GetAllSourceOutputs()598 vector<SourceOutput> AudioAdapterManager::GetAllSourceOutputs()
599 {
600     if (!audioServiceAdapter_) {
601         AUDIO_ERR_LOG("GetAllSourceOutputs audio adapter null");
602         vector<SourceOutput> sourceOutputList;
603         return sourceOutputList;
604     }
605 
606     return audioServiceAdapter_->GetAllSourceOutputs();
607 }
608 
SuspendAudioDevice(std::string & portName,bool isSuspend)609 int32_t AudioAdapterManager::SuspendAudioDevice(std::string &portName, bool isSuspend)
610 {
611     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_, ERR_OPERATION_FAILED,
612         "SuspendAudioDevice audio adapter null");
613 
614     return audioServiceAdapter_->SuspendAudioDevice(portName, isSuspend);
615 }
616 
SetSinkMute(const std::string & sinkName,bool isMute,bool isSync)617 bool AudioAdapterManager::SetSinkMute(const std::string &sinkName, bool isMute, bool isSync)
618 {
619     static std::unordered_map<std::string, std::string> sinkNameMap = {
620         {PRIMARY_SPEAKER, PRIMARY_CLASS},
621         {OFFLOAD_PRIMARY_SPEAKER, OFFLOAD_CLASS},
622         {BLUETOOTH_SPEAKER, A2DP_CLASS},
623         {MCH_PRIMARY_SPEAKER, MCH_CLASS},
624         {USB_SPEAKER, USB_CLASS},
625         {DP_SINK, DP_CLASS},
626         {FILE_SINK, FILE_CLASS},
627         {REMOTE_CAST_INNER_CAPTURER_SINK_NAME, REMOTE_CAST_INNER_CAPTURER_SINK_NAME},
628     };
629     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_, false, "SetSinkMute audio adapter null");
630     auto audioVolume = AudioVolume::GetInstance();
631     CHECK_AND_RETURN_RET_LOG(audioVolume, false, "SetSinkMute audioVolume handle null");
632     auto it = sinkNameMap.find(sinkName);
633     for (auto &volumeType : VOLUME_TYPE_LIST) {
634         if (it != sinkNameMap.end()) {
635             if ((it->second == OFFLOAD_CLASS && volumeType == STREAM_MUSIC) ||
636                 it->second != OFFLOAD_CLASS) {
637                 audioVolume->SetSystemVolumeMute(volumeType, it->second, isMute);
638             }
639         } else if (sinkName.find("_out") != std::string::npos &&
640             sinkName.find(LOCAL_NETWORK_ID) == std::string::npos) {
641             audioVolume->SetSystemVolumeMute(volumeType, REMOTE_CLASS, isMute);
642         } else {
643             AUDIO_ERR_LOG("unkown sink name %{public}s", sinkName.c_str());
644         }
645     }
646 
647     return audioServiceAdapter_->SetSinkMute(sinkName, isMute, isSync);
648 }
649 
SelectDevice(DeviceRole deviceRole,InternalDeviceType deviceType,std::string name)650 int32_t AudioAdapterManager::SelectDevice(DeviceRole deviceRole, InternalDeviceType deviceType, std::string name)
651 {
652     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_, ERR_OPERATION_FAILED,
653         "SelectDevice audio adapter null");
654     switch (deviceRole) {
655         case DeviceRole::INPUT_DEVICE:
656             return audioServiceAdapter_->SetDefaultSource(name);
657         case DeviceRole::OUTPUT_DEVICE: {
658             AUDIO_INFO_LOG("SetDefaultSink %{public}d", deviceType);
659             return audioServiceAdapter_->SetDefaultSink(name);
660         }
661         default:
662             AUDIO_ERR_LOG("SelectDevice error deviceRole %{public}d", deviceRole);
663             return ERR_OPERATION_FAILED;
664     }
665     return SUCCESS;
666 }
667 
SetDeviceActive(InternalDeviceType deviceType,std::string name,bool active,DeviceFlag flag)668 int32_t AudioAdapterManager::SetDeviceActive(InternalDeviceType deviceType,
669     std::string name, bool active, DeviceFlag flag)
670 {
671     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_, ERR_OPERATION_FAILED,
672         "SetDeviceActive audio adapter null");
673 
674     switch (deviceType) {
675         case InternalDeviceType::DEVICE_TYPE_USB_ARM_HEADSET: {
676             if (name == USB_SPEAKER) {
677                 return audioServiceAdapter_->SetDefaultSink(name);
678             } else {
679                 return audioServiceAdapter_->SetDefaultSource(name);
680             }
681         }
682         default: {
683             int32_t ret = SUCCESS;
684             int32_t errs[2]{SUCCESS, SUCCESS};
685             if (IsInputDevice(deviceType) && (flag & INPUT_DEVICES_FLAG)) {
686                 AUDIO_INFO_LOG("SetDefaultSource %{public}d", deviceType);
687                 errs[0] = audioServiceAdapter_->SetDefaultSource(name);
688                 if (errs[0] != SUCCESS) {
689                     AUDIO_ERR_LOG("SetDefaultSource err: %{public}d", errs[0]);
690                     ret = errs[0];
691                 }
692             }
693             if (IsOutputDevice(deviceType) && (flag & OUTPUT_DEVICES_FLAG)) {
694                 AUDIO_INFO_LOG("SetDefaultSink %{public}d", deviceType);
695                 errs[1] = audioServiceAdapter_->SetDefaultSink(name);
696                 if (errs[1] != SUCCESS) {
697                     AUDIO_ERR_LOG("SetDefaultSink err: %{public}d", errs[1]);
698                     ret = errs[1];
699                 }
700             }
701             // Ensure compatibility across different platforms and versions
702             if (errs[0] == SUCCESS || errs[1] == SUCCESS) {
703                 return SUCCESS;
704             }
705             return ret;
706         }
707     }
708     return SUCCESS;
709 }
710 
SetVolumeForSwitchDevice(InternalDeviceType deviceType)711 void AudioAdapterManager::SetVolumeForSwitchDevice(InternalDeviceType deviceType)
712 {
713     if (!isLoaded_) {
714         AUDIO_ERR_LOG("The data base is not loaded. Can not load new volume for new device!");
715         // The ring volume is also saved in audio_config.para.
716         // So the boot animation can still play with right volume.
717         return;
718     }
719 
720     std::lock_guard<std::mutex> lock(activeDeviceMutex_);
721     // The same device does not set the volume
722     bool isSameVolumeGroup = GetVolumeGroupForDevice(currentActiveDevice_) == GetVolumeGroupForDevice(deviceType);
723     if (currentActiveDevice_ == deviceType) {
724         AUDIO_INFO_LOG("Old device: %{public}d. New device: %{public}d. No need to update volume",
725             currentActiveDevice_, deviceType);
726         return;
727     }
728 
729     AUDIO_INFO_LOG("SetVolumeForSwitchDevice: Load volume and mute status for new device %{public}d,"
730         "same volume group %{public}d", deviceType, isSameVolumeGroup);
731     // Current device must be updated even if kvStore is nullptr.
732     currentActiveDevice_ = deviceType;
733 
734     if (!isSameVolumeGroup) {
735         LoadVolumeMap();
736         LoadMuteStatusMap();
737         UpdateSafeVolume();
738     }
739 
740     auto iter = VOLUME_TYPE_LIST.begin();
741     while (iter != VOLUME_TYPE_LIST.end()) {
742         // update volume level and mute status for each stream type
743         SetVolumeDb(*iter);
744         AUDIO_INFO_LOG("SetVolumeForSwitchDevice: volume: %{public}d, mute: %{public}d for stream type %{public}d",
745             volumeDataMaintainer_.GetStreamVolume(*iter), volumeDataMaintainer_.GetStreamMute(*iter), *iter);
746         iter++;
747     }
748 }
749 
MoveSinkInputByIndexOrName(uint32_t sinkInputId,uint32_t sinkIndex,std::string sinkName)750 int32_t AudioAdapterManager::MoveSinkInputByIndexOrName(uint32_t sinkInputId, uint32_t sinkIndex, std::string sinkName)
751 {
752     return audioServiceAdapter_->MoveSinkInputByIndexOrName(sinkInputId, sinkIndex, sinkName);
753 }
754 
MoveSourceOutputByIndexOrName(uint32_t sourceOutputId,uint32_t sourceIndex,std::string sourceName)755 int32_t AudioAdapterManager::MoveSourceOutputByIndexOrName(uint32_t sourceOutputId, uint32_t sourceIndex,
756     std::string sourceName)
757 {
758     return audioServiceAdapter_->MoveSourceOutputByIndexOrName(sourceOutputId, sourceIndex, sourceName);
759 }
760 
761 // LCOV_EXCL_STOP
SetRingerMode(AudioRingerMode ringerMode)762 int32_t AudioAdapterManager::SetRingerMode(AudioRingerMode ringerMode)
763 {
764     return SetRingerModeInternal(ringerMode);
765 }
766 
SetRingerModeInternal(AudioRingerMode ringerMode)767 int32_t AudioAdapterManager::SetRingerModeInternal(AudioRingerMode ringerMode)
768 {
769     AUDIO_INFO_LOG("SetRingerMode: %{public}d", ringerMode);
770     ringerMode_ = ringerMode;
771 
772     if (handler_ != nullptr) {
773         handler_->SendRingerModeUpdate(ringerMode);
774     }
775     return SUCCESS;
776 }
777 
GetRingerMode() const778 AudioRingerMode AudioAdapterManager::GetRingerMode() const
779 {
780     return ringerMode_;
781 }
782 
783 // LCOV_EXCL_START
OpenAudioPort(const AudioModuleInfo & audioModuleInfo)784 AudioIOHandle AudioAdapterManager::OpenAudioPort(const AudioModuleInfo &audioModuleInfo)
785 {
786     std::string moduleArgs = GetModuleArgs(audioModuleInfo);
787 
788     AUDIO_INFO_LOG("[Adapter load-module] %{public}s %{public}s",
789         audioModuleInfo.lib.c_str(), audioModuleInfo.className.c_str());
790 
791     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_ != nullptr, ERR_OPERATION_FAILED, "ServiceAdapter is null");
792     curActiveCount_++;
793     AudioIOHandle ioHandle = audioServiceAdapter_->OpenAudioPort(audioModuleInfo.lib, moduleArgs.c_str());
794     AUDIO_INFO_LOG("Open %{public}d port end.", static_cast<int32_t>(ioHandle));
795     return ioHandle;
796 }
797 
CloseAudioPort(AudioIOHandle ioHandle)798 int32_t AudioAdapterManager::CloseAudioPort(AudioIOHandle ioHandle)
799 {
800     CHECK_AND_RETURN_RET_LOG(audioServiceAdapter_ != nullptr, ERR_OPERATION_FAILED, "ServiceAdapter is null");
801     curActiveCount_--;
802     int32_t ret = audioServiceAdapter_->CloseAudioPort(ioHandle);
803     AUDIO_INFO_LOG("Close %{public}d port end.", static_cast<int32_t>(ioHandle));
804     return ret;
805 }
806 
GetCurActivateCount() const807 int32_t AudioAdapterManager::GetCurActivateCount() const
808 {
809     return curActiveCount_ > 0 ? curActiveCount_ : 0;
810 }
811 
UpdateSinkArgs(const AudioModuleInfo & audioModuleInfo,std::string & args)812 void UpdateSinkArgs(const AudioModuleInfo &audioModuleInfo, std::string &args)
813 {
814     if (!audioModuleInfo.name.empty()) {
815         args.append(" sink_name=");
816         args.append(audioModuleInfo.name);
817     }
818 
819     if (!audioModuleInfo.adapterName.empty()) {
820         args.append(" adapter_name=");
821         args.append(audioModuleInfo.adapterName);
822     }
823 
824     if (!audioModuleInfo.className.empty()) {
825         args.append(" device_class=");
826         args.append(audioModuleInfo.className);
827     }
828 
829     if (!audioModuleInfo.fileName.empty()) {
830         args.append(" file_path=");
831         args.append(audioModuleInfo.fileName);
832     }
833     if (!audioModuleInfo.sinkLatency.empty()) {
834         args.append(" sink_latency=");
835         args.append(audioModuleInfo.sinkLatency);
836     }
837 
838     if (!audioModuleInfo.networkId.empty()) {
839         args.append(" network_id=");
840         args.append(audioModuleInfo.networkId);
841     } else {
842         args.append(" network_id=LocalDevice");
843     }
844 
845     if (!audioModuleInfo.deviceType.empty()) {
846         args.append(" device_type=");
847         args.append(audioModuleInfo.deviceType);
848     }
849 
850     if (!audioModuleInfo.extra.empty()) {
851         args.append(" split_mode=");
852         args.append(audioModuleInfo.extra);
853     }
854 }
855 
UpdateSourceArgs(const AudioModuleInfo & audioModuleInfo,std::string & args)856 void UpdateSourceArgs(const AudioModuleInfo &audioModuleInfo, std::string &args)
857 {
858     if (!audioModuleInfo.name.empty()) {
859         args.append(" source_name=");
860         args.append(audioModuleInfo.name);
861     }
862 
863     if (!audioModuleInfo.adapterName.empty()) {
864         args.append(" adapter_name=");
865         args.append(audioModuleInfo.adapterName);
866     }
867 
868     if (!audioModuleInfo.className.empty()) {
869         args.append(" device_class=");
870         args.append(audioModuleInfo.className);
871     }
872 
873     if (!audioModuleInfo.fileName.empty()) {
874         args.append(" file_path=");
875         args.append(audioModuleInfo.fileName);
876     }
877 
878     if (!audioModuleInfo.networkId.empty()) {
879         args.append(" network_id=");
880         args.append(audioModuleInfo.networkId);
881     } else {
882         args.append(" network_id=LocalDevice");
883     }
884 
885     if (!audioModuleInfo.deviceType.empty()) {
886         args.append(" device_type=");
887         args.append(audioModuleInfo.deviceType);
888     }
889 
890     if (!audioModuleInfo.sourceType.empty()) {
891         args.append(" source_type=");
892         args.append(audioModuleInfo.sourceType);
893     }
894 }
895 
UpdateCommonArgs(const AudioModuleInfo & audioModuleInfo,std::string & args)896 void UpdateCommonArgs(const AudioModuleInfo &audioModuleInfo, std::string &args)
897 {
898     if (!audioModuleInfo.rate.empty()) {
899         args = "rate=";
900         args.append(audioModuleInfo.rate);
901     }
902 
903     if (!audioModuleInfo.channels.empty()) {
904         args.append(" channels=");
905         args.append(audioModuleInfo.channels);
906     }
907 
908     if (!audioModuleInfo.bufferSize.empty()) {
909         args.append(" buffer_size=");
910         args.append(audioModuleInfo.bufferSize);
911     }
912 
913     if (!audioModuleInfo.format.empty()) {
914         args.append(" format=");
915         args.append(audioModuleInfo.format);
916     }
917 
918     if (!audioModuleInfo.fixedLatency.empty()) {
919         args.append(" fixed_latency=");
920         args.append(audioModuleInfo.fixedLatency);
921     }
922 
923     if (!audioModuleInfo.renderInIdleState.empty()) {
924         args.append(" render_in_idle_state=");
925         args.append(audioModuleInfo.renderInIdleState);
926     }
927 
928     if (!audioModuleInfo.OpenMicSpeaker.empty()) {
929         args.append(" open_mic_speaker=");
930         args.append(audioModuleInfo.OpenMicSpeaker);
931     }
932 
933     if (!audioModuleInfo.offloadEnable.empty()) {
934         args.append(" offload_enable=");
935         args.append(audioModuleInfo.offloadEnable);
936     }
937     AUDIO_INFO_LOG("[Adapter load-module] [PolicyManager] common args:%{public}s", args.c_str());
938 }
939 
940 // Private Members
GetModuleArgs(const AudioModuleInfo & audioModuleInfo) const941 std::string AudioAdapterManager::GetModuleArgs(const AudioModuleInfo &audioModuleInfo) const
942 {
943     std::string args;
944 
945     if (audioModuleInfo.lib == HDI_SINK) {
946         UpdateCommonArgs(audioModuleInfo, args);
947         UpdateSinkArgs(audioModuleInfo, args);
948         if (testModeOn_) {
949             args.append(" test_mode_on=");
950             args.append("1");
951         }
952     } else if (audioModuleInfo.lib == SPLIT_STREAM_SINK) {
953         UpdateCommonArgs(audioModuleInfo, args);
954         UpdateSinkArgs(audioModuleInfo, args);
955     } else if (audioModuleInfo.lib == HDI_SOURCE) {
956         UpdateCommonArgs(audioModuleInfo, args);
957         UpdateSourceArgs(audioModuleInfo, args);
958     } else if (audioModuleInfo.lib == PIPE_SINK) {
959         if (!audioModuleInfo.fileName.empty()) {
960             args = "file=";
961             args.append(audioModuleInfo.fileName);
962         }
963     } else if (audioModuleInfo.lib == PIPE_SOURCE) {
964         if (!audioModuleInfo.fileName.empty()) {
965             args = "file=";
966             args.append(audioModuleInfo.fileName);
967         }
968     } else if (audioModuleInfo.lib == CLUSTER_SINK) {
969         UpdateCommonArgs(audioModuleInfo, args);
970         if (!audioModuleInfo.name.empty()) {
971             args.append(" sink_name=");
972             args.append(audioModuleInfo.name);
973         }
974     } else if (audioModuleInfo.lib == EFFECT_SINK) {
975         UpdateCommonArgs(audioModuleInfo, args);
976         if (!audioModuleInfo.name.empty()) {
977             args.append(" sink_name=");
978             args.append(audioModuleInfo.name);
979         }
980         if (!audioModuleInfo.sceneName.empty()) {
981             args.append(" scene_name=");
982             args.append(audioModuleInfo.sceneName);
983         }
984     } else if (audioModuleInfo.lib == INNER_CAPTURER_SINK || audioModuleInfo.lib == RECEIVER_SINK) {
985         UpdateCommonArgs(audioModuleInfo, args);
986         if (!audioModuleInfo.name.empty()) {
987             args.append(" sink_name=");
988             args.append(audioModuleInfo.name);
989         }
990     }
991     return args;
992 }
993 
GetVolumeKeyForKvStore(DeviceType deviceType,AudioStreamType streamType)994 std::string AudioAdapterManager::GetVolumeKeyForKvStore(DeviceType deviceType, AudioStreamType streamType)
995 {
996     DeviceGroup type = GetVolumeGroupForDevice(deviceType);
997     std::string typeStr = std::to_string(type);
998     CHECK_AND_RETURN_RET_LOG(type != DEVICE_GROUP_INVALID, typeStr,
999         "Device %{public}d is not supported for kvStore", deviceType);
1000 
1001     switch (streamType) {
1002         case STREAM_MUSIC:
1003             return typeStr + "_music_volume";
1004         case STREAM_RING:
1005         case STREAM_VOICE_RING:
1006             return typeStr + "_ring_volume";
1007         case STREAM_SYSTEM:
1008             return typeStr + "_system_volume";
1009         case STREAM_NOTIFICATION:
1010             return typeStr + "_notification_volume";
1011         case STREAM_ALARM:
1012             return typeStr + "_alarm_volume";
1013         case STREAM_DTMF:
1014             return typeStr + "_dtmf_volume";
1015         case STREAM_VOICE_CALL:
1016         case STREAM_VOICE_COMMUNICATION:
1017             return typeStr + "_voice_call_volume";
1018         case STREAM_VOICE_ASSISTANT:
1019             return typeStr + "_voice_assistant_volume";
1020         case STREAM_ACCESSIBILITY:
1021             return typeStr + "_accessibility_volume";
1022         case STREAM_ULTRASONIC:
1023             return typeStr + "_ultrasonic_volume";
1024         case STREAM_WAKEUP:
1025             return typeStr + "wakeup";
1026         default:
1027             AUDIO_ERR_LOG("GetVolumeKeyForKvStore: streamType %{public}d is not supported for kvStore", streamType);
1028             return "";
1029     }
1030 }
1031 
GetStreamIDByType(std::string streamType)1032 AudioStreamType AudioAdapterManager::GetStreamIDByType(std::string streamType)
1033 {
1034     AudioStreamType stream = STREAM_MUSIC;
1035 
1036     if (!streamType.compare(std::string("music")))
1037         stream = STREAM_MUSIC;
1038     else if (!streamType.compare(std::string("ring")))
1039         stream = STREAM_RING;
1040     else if (!streamType.compare(std::string("voice_call")))
1041         stream = STREAM_VOICE_CALL;
1042     else if (!streamType.compare(std::string("system")))
1043         stream = STREAM_SYSTEM;
1044     else if (!streamType.compare(std::string("notification")))
1045         stream = STREAM_NOTIFICATION;
1046     else if (!streamType.compare(std::string("alarm")))
1047         stream = STREAM_ALARM;
1048     else if (!streamType.compare(std::string("voice_assistant")))
1049         stream = STREAM_VOICE_ASSISTANT;
1050     else if (!streamType.compare(std::string("accessibility")))
1051         stream = STREAM_ACCESSIBILITY;
1052     else if (!streamType.compare(std::string("ultrasonic")))
1053         stream = STREAM_ULTRASONIC;
1054     else if (!streamType.compare(std::string("camcorder")))
1055         stream = STREAM_CAMCORDER;
1056     return stream;
1057 }
1058 
GetDeviceCategory(DeviceType deviceType)1059 DeviceVolumeType AudioAdapterManager::GetDeviceCategory(DeviceType deviceType)
1060 {
1061     switch (deviceType) {
1062         case DEVICE_TYPE_EARPIECE:
1063             return EARPIECE_VOLUME_TYPE;
1064         case DEVICE_TYPE_SPEAKER:
1065         case DEVICE_TYPE_FILE_SOURCE:
1066             return SPEAKER_VOLUME_TYPE;
1067         case DEVICE_TYPE_WIRED_HEADSET:
1068         case DEVICE_TYPE_WIRED_HEADPHONES:
1069         case DEVICE_TYPE_BLUETOOTH_SCO:
1070         case DEVICE_TYPE_BLUETOOTH_A2DP:
1071         case DEVICE_TYPE_USB_HEADSET:
1072         case DEVICE_TYPE_DP:
1073             return HEADSET_VOLUME_TYPE;
1074         default:
1075             return SPEAKER_VOLUME_TYPE;
1076     }
1077 }
1078 
InitAudioPolicyKvStore(bool & isFirstBoot)1079 bool AudioAdapterManager::InitAudioPolicyKvStore(bool& isFirstBoot)
1080 {
1081     DistributedKvDataManager manager;
1082     Options options;
1083 
1084     AppId appId;
1085     appId.appId = "audio_policy_manager";
1086 
1087     options.securityLevel = S1;
1088     options.createIfMissing = false;
1089     options.encrypt = false;
1090     options.autoSync = false;
1091     options.kvStoreType = KvStoreType::SINGLE_VERSION;
1092     options.area = EL1;
1093     options.baseDir = std::string("/data/service/el1/public/database/") + appId.appId;
1094 
1095     StoreId storeId;
1096     storeId.storeId = "audiopolicy";
1097     Status status = Status::SUCCESS;
1098 
1099     // open and initialize kvstore instance.
1100     if (audioPolicyKvStore_ == nullptr) {
1101         uint32_t retries = 0;
1102 
1103         do {
1104             status = manager.GetSingleKvStore(options, appId, storeId, audioPolicyKvStore_);
1105             AUDIO_ERR_LOG("GetSingleKvStore status: %{public}d", status);
1106             if ((status == Status::SUCCESS) || (status == Status::INVALID_ARGUMENT) ||
1107                 (status == Status::DATA_CORRUPTED) || (status == Status::CRYPT_ERROR)) {
1108                 break;
1109             } else {
1110                 AUDIO_ERR_LOG("InitAudioPolicyKvStore: Kvstore Connect failed! Retrying.");
1111                 retries++;
1112                 usleep(KVSTORE_CONNECT_RETRY_DELAY_TIME);
1113             }
1114         } while (retries <= KVSTORE_CONNECT_RETRY_COUNT);
1115     }
1116 
1117     if (audioPolicyKvStore_ != nullptr) {
1118         isNeedCopyVolumeData_ = true;
1119         isNeedCopyMuteData_ = true;
1120         isNeedCopyRingerModeData_ = true;
1121         isNeedCopySystemUrlData_ = true;
1122         volumeDataMaintainer_.SetFirstBoot(false);
1123         return true;
1124     }
1125     // first boot
1126     if (!volumeDataMaintainer_.GetFirstBoot(isFirstBoot)) {
1127         AUDIO_INFO_LOG("first boot, ready init data to database");
1128         isFirstBoot = true;
1129         volumeDataMaintainer_.SetFirstBoot(false);
1130     }
1131 
1132     return true;
1133 }
1134 
DeleteAudioPolicyKvStore()1135 void AudioAdapterManager::DeleteAudioPolicyKvStore()
1136 {
1137     DistributedKvDataManager manager;
1138     Options options;
1139 
1140     AppId appId;
1141     appId.appId = "audio_policy_manager";
1142 
1143     options.securityLevel = S1;
1144     options.createIfMissing = false;
1145     options.encrypt = false;
1146     options.autoSync = false;
1147     options.kvStoreType = KvStoreType::SINGLE_VERSION;
1148     options.area = EL1;
1149     options.baseDir = std::string("/data/service/el1/public/database/") + appId.appId;
1150 
1151     StoreId storeId;
1152     storeId.storeId = "audiopolicy";
1153     Status status = Status::SUCCESS;
1154 
1155     if (audioPolicyKvStore_ != nullptr) {
1156         status = manager.CloseKvStore(appId, storeId);
1157         if (status != Status::SUCCESS) {
1158             AUDIO_ERR_LOG("close KvStore failed");
1159         }
1160         status = manager.DeleteKvStore(appId, storeId, options.baseDir);
1161         if (status != Status::SUCCESS) {
1162             AUDIO_ERR_LOG("DeleteKvStore failed");
1163         }
1164         audioPolicyKvStore_ = nullptr;
1165     }
1166 }
1167 
UpdateSafeVolume()1168 void AudioAdapterManager::UpdateSafeVolume()
1169 {
1170     if (volumeDataMaintainer_.GetStreamVolume(STREAM_MUSIC) <= safeVolume_) {
1171         return;
1172     }
1173     AUDIO_INFO_LOG("update current volume to safevolume, device:%{public}d", currentActiveDevice_);
1174     switch (currentActiveDevice_) {
1175         case DEVICE_TYPE_WIRED_HEADSET:
1176         case DEVICE_TYPE_WIRED_HEADPHONES:
1177         case DEVICE_TYPE_USB_HEADSET:
1178         case DEVICE_TYPE_USB_ARM_HEADSET:
1179             if (isWiredBoot_) {
1180                 volumeDataMaintainer_.SetStreamVolume(STREAM_MUSIC, safeVolume_);
1181                 volumeDataMaintainer_.SaveVolume(currentActiveDevice_, STREAM_MUSIC, safeVolume_);
1182                 isWiredBoot_ = false;
1183             }
1184             break;
1185         case DEVICE_TYPE_BLUETOOTH_SCO:
1186         case DEVICE_TYPE_BLUETOOTH_A2DP:
1187             if (isBtBoot_) {
1188                 volumeDataMaintainer_.SetStreamVolume(STREAM_MUSIC, safeVolume_);
1189                 volumeDataMaintainer_.SaveVolume(currentActiveDevice_, STREAM_MUSIC, safeVolume_);
1190                 isBtBoot_ = false;
1191             }
1192             break;
1193         default:
1194             AUDIO_ERR_LOG("current device: %{public}d is not support", currentActiveDevice_);
1195             break;
1196     }
1197 }
1198 
InitVolumeMap(bool isFirstBoot)1199 void AudioAdapterManager::InitVolumeMap(bool isFirstBoot)
1200 {
1201     if (!isFirstBoot) {
1202         LoadVolumeMap();
1203         UpdateSafeVolume();
1204         return;
1205     }
1206     AUDIO_INFO_LOG("InitVolumeMap: Wrote default stream volumes to KvStore");
1207     std::unordered_map<AudioStreamType, int32_t> volumeLevelMapTemp = volumeDataMaintainer_.GetVolumeMap();
1208     for (auto &deviceType: VOLUME_GROUP_TYPE_LIST) {
1209         for (auto &streamType: VOLUME_TYPE_LIST) {
1210             // if GetVolume failed, wirte default value
1211             if (!volumeDataMaintainer_.GetVolume(deviceType, streamType)) {
1212                 volumeDataMaintainer_.SaveVolume(deviceType, streamType, volumeLevelMapTemp[streamType]);
1213             }
1214         }
1215     }
1216     // reLoad the current device volume
1217     LoadVolumeMap();
1218     UpdateSafeVolume();
1219 }
1220 
ResetRemoteCastDeviceVolume()1221 void AudioAdapterManager::ResetRemoteCastDeviceVolume()
1222 {
1223     for (auto &streamType: VOLUME_TYPE_LIST) {
1224         AudioStreamType streamAlias = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
1225         int32_t volumeLevel = GetMaxVolumeLevel(streamAlias);
1226         volumeDataMaintainer_.SaveVolume(DEVICE_TYPE_REMOTE_CAST, streamType, volumeLevel);
1227     }
1228 }
1229 
InitRingerMode(bool isFirstBoot)1230 void AudioAdapterManager::InitRingerMode(bool isFirstBoot)
1231 {
1232     if (isFirstBoot) {
1233         ringerMode_ = RINGER_MODE_NORMAL;
1234         isLoaded_ = true;
1235         if (!volumeDataMaintainer_.GetRingerMode(ringerMode_)) {
1236             isLoaded_ = volumeDataMaintainer_.SaveRingerMode(RINGER_MODE_NORMAL);
1237         }
1238         AUDIO_INFO_LOG("InitRingerMode first boot ringermode:%{public}d", ringerMode_);
1239     } else {
1240         // read ringerMode from private kvStore
1241         if (isNeedCopyRingerModeData_ && audioPolicyKvStore_ != nullptr) {
1242             AUDIO_INFO_LOG("copy ringerMode from private database to share database");
1243             Key key = "ringermode";
1244             Value value;
1245             Status status = audioPolicyKvStore_->Get(key, value);
1246             if (status == Status::SUCCESS) {
1247                 ringerMode_ = static_cast<AudioRingerMode>(TransferByteArrayToType<int>(value.Data()));
1248                 volumeDataMaintainer_.SaveRingerMode(ringerMode_);
1249             }
1250             isNeedCopyRingerModeData_ = false;
1251         }
1252         // if read ringer mode success, data is loaded.
1253         isLoaded_ = volumeDataMaintainer_.GetRingerMode(ringerMode_);
1254     }
1255     AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(STREAM_RING);
1256     int32_t volumeLevel =
1257         volumeDataMaintainer_.GetStreamVolume(STREAM_RING) * ((ringerMode_ != RINGER_MODE_NORMAL) ? 0 : 1);
1258     // Save volume in local prop for bootanimation
1259     SaveRingtoneVolumeToLocal(streamForVolumeMap, volumeLevel);
1260 }
1261 
CloneVolumeMap(void)1262 void AudioAdapterManager::CloneVolumeMap(void)
1263 {
1264     CHECK_AND_RETURN_LOG(audioPolicyKvStore_ != nullptr, "clone volumemap failed, audioPolicyKvStore_nullptr");
1265     // read volume from private Kvstore
1266     AUDIO_INFO_LOG("Copy Volume from private database to shareDatabase");
1267     for (auto &deviceType : VOLUME_GROUP_TYPE_LIST) {
1268         for (auto &streamType : VOLUME_TYPE_LIST) {
1269             std::string volumeKey = GetVolumeKeyForKvStore(deviceType, streamType);
1270             Key key = volumeKey;
1271             Value value;
1272             Status status = audioPolicyKvStore_->Get(volumeKey, value);
1273             if (status != SUCCESS) {
1274                 AUDIO_WARNING_LOG("get volumeLevel failed, deviceType:%{public}d, streanType:%{public}d",
1275                     deviceType, streamType);
1276                 continue;
1277             }
1278             int32_t volumeLevel = TransferByteArrayToType<int>(value.Data());
1279             // clone data to VolumeToShareData
1280             volumeDataMaintainer_.SaveVolume(deviceType, streamType, volumeLevel);
1281         }
1282     }
1283 
1284     isNeedCopyVolumeData_ = false;
1285 }
1286 
LoadVolumeMap(void)1287 bool AudioAdapterManager::LoadVolumeMap(void)
1288 {
1289     if (isNeedCopyVolumeData_ && (audioPolicyKvStore_ != nullptr)) {
1290         CloneVolumeMap();
1291     }
1292 
1293     bool result = false;
1294     for (auto &streamType: VOLUME_TYPE_LIST) {
1295         if (Util::IsDualToneStreamType(streamType)) {
1296             result = volumeDataMaintainer_.GetVolume(DEVICE_TYPE_SPEAKER, streamType);
1297         } else {
1298             result = volumeDataMaintainer_.GetVolume(currentActiveDevice_, streamType);
1299         }
1300         if (!result) {
1301             AUDIO_ERR_LOG("LoadVolumeMap: Could not load volume for streamType[%{public}d] from kvStore", streamType);
1302         }
1303     }
1304 
1305     return true;
1306 }
1307 
TransferMuteStatus(void)1308 void AudioAdapterManager::TransferMuteStatus(void)
1309 {
1310     // read mute_streams_affected and transfer
1311     int32_t mute_streams_affected = 0;
1312     bool isNeedTransferMute = true;
1313     bool ret = volumeDataMaintainer_.GetMuteAffected(mute_streams_affected) &&
1314         volumeDataMaintainer_.GetMuteTransferStatus(isNeedTransferMute);
1315     if (!ret && (mute_streams_affected > 0) && isNeedTransferMute) {
1316         AUDIO_INFO_LOG("start transfer mute value");
1317         volumeDataMaintainer_.SetMuteAffectedToMuteStatusDataBase(mute_streams_affected);
1318         volumeDataMaintainer_.SaveMuteTransferStatus(false);
1319     }
1320 }
1321 
InitMuteStatusMap(bool isFirstBoot)1322 void AudioAdapterManager::InitMuteStatusMap(bool isFirstBoot)
1323 {
1324     if (isFirstBoot) {
1325         for (auto &deviceType : VOLUME_GROUP_TYPE_LIST) {
1326             for (auto &streamType : VOLUME_TYPE_LIST) {
1327                 CheckAndDealMuteStatus(deviceType, streamType);
1328             }
1329         }
1330         TransferMuteStatus();
1331     } else {
1332         LoadMuteStatusMap();
1333     }
1334 }
1335 
CheckAndDealMuteStatus(const DeviceType & deviceType,const AudioStreamType & streamType)1336 void  AudioAdapterManager::CheckAndDealMuteStatus(const DeviceType &deviceType, const AudioStreamType &streamType)
1337 {
1338     if (streamType == STREAM_RING) {
1339         bool muteStateForStreamRing = (ringerMode_ == RINGER_MODE_NORMAL) ? false : true;
1340         AUDIO_INFO_LOG("fist boot ringer mode:%{public}d, stream ring mute state:%{public}d", ringerMode_,
1341             muteStateForStreamRing);
1342         // set stream mute status to mem.
1343         if (currentActiveDevice_ == deviceType) {
1344             volumeDataMaintainer_.SetStreamMuteStatus(streamType, muteStateForStreamRing);
1345         }
1346         volumeDataMaintainer_.SaveMuteStatus(deviceType, streamType, muteStateForStreamRing);
1347     } else if (!volumeDataMaintainer_.GetMuteStatus(deviceType, streamType)) {
1348         if (currentActiveDevice_ == deviceType) {
1349             volumeDataMaintainer_.SetStreamMuteStatus(streamType, false);
1350         }
1351         volumeDataMaintainer_.SaveMuteStatus(deviceType, streamType, false);
1352     }
1353     if (currentActiveDevice_ == deviceType) {
1354         SetVolumeDb(streamType);
1355     }
1356 }
1357 
SetVolumeCallbackAfterClone()1358 void AudioAdapterManager::SetVolumeCallbackAfterClone()
1359 {
1360     for (auto &streamType : VOLUME_TYPE_LIST) {
1361         VolumeEvent volumeEvent;
1362         volumeEvent.volumeType = streamType;
1363         volumeEvent.volume = GetSystemVolumeLevel(streamType);
1364         volumeEvent.updateUi = false;
1365         volumeEvent.volumeGroupId = 0;
1366         volumeEvent.networkId = LOCAL_NETWORK_ID;
1367         if (audioPolicyServerHandler_ != nullptr) {
1368             audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
1369         }
1370     }
1371 }
1372 
CloneMuteStatusMap(void)1373 void AudioAdapterManager::CloneMuteStatusMap(void)
1374 {
1375     // read mute status from private Kvstore
1376     CHECK_AND_RETURN_LOG(audioPolicyKvStore_ != nullptr, "clone mute status failed, audioPolicyKvStore_ nullptr");
1377     AUDIO_INFO_LOG("Copy mute from private database to shareDatabase");
1378     for (auto &deviceType : VOLUME_GROUP_TYPE_LIST) {
1379         for (auto &streamType : VOLUME_TYPE_LIST) {
1380             std::string muteKey = GetMuteKeyForKvStore(deviceType, streamType);
1381             Key key = muteKey;
1382             Value value;
1383             Status status = audioPolicyKvStore_->Get(key, value);
1384             if (status != SUCCESS) {
1385                 AUDIO_WARNING_LOG("get muteStatus:failed, deviceType:%{public}d, streanType:%{public}d",
1386                     deviceType, streamType);
1387                 continue;
1388             }
1389             bool muteStatus = TransferByteArrayToType<int>(value.Data());
1390             // clone data to VolumeToShareData
1391             if (currentActiveDevice_ == deviceType) {
1392                 volumeDataMaintainer_.SetStreamMuteStatus(streamType, muteStatus);
1393             }
1394             volumeDataMaintainer_.SaveMuteStatus(deviceType, streamType, muteStatus);
1395         }
1396     }
1397     isNeedCopyMuteData_ = false;
1398 }
1399 
LoadMuteStatusMap(void)1400 bool AudioAdapterManager::LoadMuteStatusMap(void)
1401 {
1402     if (isNeedCopyMuteData_ && (audioPolicyKvStore_ != nullptr)) {
1403         CloneMuteStatusMap();
1404     }
1405 
1406     TransferMuteStatus();
1407 
1408     for (auto &streamType: VOLUME_TYPE_LIST) {
1409         bool result = volumeDataMaintainer_.GetMuteStatus(currentActiveDevice_, streamType);
1410         if (!result) {
1411             AUDIO_WARNING_LOG("Could not load mute status for stream type %{public}d from database.", streamType);
1412         }
1413         if (streamType == STREAM_RING) {
1414             bool muteStateForStreamRing = (ringerMode_ == RINGER_MODE_NORMAL) ? false : true;
1415             if (currentActiveDevice_ != DEVICE_TYPE_SPEAKER) {
1416                 continue;
1417             }
1418             AUDIO_INFO_LOG("ringer mode:%{public}d, stream ring mute state:%{public}d", ringerMode_,
1419                 muteStateForStreamRing);
1420             if (muteStateForStreamRing == GetStreamMute(streamType)) {
1421                 continue;
1422             }
1423             volumeDataMaintainer_.SaveMuteStatus(currentActiveDevice_, streamType, muteStateForStreamRing);
1424             SetStreamMute(streamType, muteStateForStreamRing);
1425         }
1426     }
1427     return true;
1428 }
1429 
InitSafeStatus(bool isFirstBoot)1430 void AudioAdapterManager::InitSafeStatus(bool isFirstBoot)
1431 {
1432     if (isFirstBoot) {
1433         AUDIO_INFO_LOG("Wrote default safe status to KvStore");
1434         for (auto &deviceType : VOLUME_GROUP_TYPE_LIST) {
1435             // Adapt to safe volume upgrade scenarios
1436             if (!volumeDataMaintainer_.GetSafeStatus(DEVICE_TYPE_WIRED_HEADSET, safeStatus_) &&
1437                 (deviceType == DEVICE_TYPE_WIRED_HEADSET)) {
1438                 volumeDataMaintainer_.SaveSafeStatus(DEVICE_TYPE_WIRED_HEADSET, SAFE_ACTIVE);
1439             }
1440             if (!volumeDataMaintainer_.GetSafeStatus(DEVICE_TYPE_BLUETOOTH_A2DP, safeStatusBt_) &&
1441                 (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP)) {
1442                 volumeDataMaintainer_.SaveSafeStatus(DEVICE_TYPE_BLUETOOTH_A2DP, SAFE_ACTIVE);
1443             }
1444         }
1445     } else {
1446         volumeDataMaintainer_.GetSafeStatus(DEVICE_TYPE_WIRED_HEADSET, safeStatus_);
1447         volumeDataMaintainer_.GetSafeStatus(DEVICE_TYPE_BLUETOOTH_A2DP, safeStatusBt_);
1448     }
1449 }
1450 
InitSafeTime(bool isFirstBoot)1451 void AudioAdapterManager::InitSafeTime(bool isFirstBoot)
1452 {
1453     if (isFirstBoot) {
1454         AUDIO_INFO_LOG("Wrote default safe status to KvStore");
1455         for (auto &deviceType : VOLUME_GROUP_TYPE_LIST) {
1456             if (!volumeDataMaintainer_.GetSafeVolumeTime(DEVICE_TYPE_WIRED_HEADSET, safeActiveTime_) &&
1457                 (deviceType == DEVICE_TYPE_WIRED_HEADSET)) {
1458                 volumeDataMaintainer_.SaveSafeVolumeTime(DEVICE_TYPE_WIRED_HEADSET, 0);
1459             }
1460             if (!volumeDataMaintainer_.GetSafeVolumeTime(DEVICE_TYPE_BLUETOOTH_A2DP, safeActiveBtTime_) &&
1461                 (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP)) {
1462                 volumeDataMaintainer_.SaveSafeVolumeTime(DEVICE_TYPE_BLUETOOTH_A2DP, 0);
1463             }
1464             ConvertSafeTime();
1465             isNeedConvertSafeTime_ = false;
1466         }
1467     } else {
1468         volumeDataMaintainer_.GetSafeVolumeTime(DEVICE_TYPE_WIRED_HEADSET, safeActiveTime_);
1469         volumeDataMaintainer_.GetSafeVolumeTime(DEVICE_TYPE_BLUETOOTH_A2DP, safeActiveBtTime_);
1470         if (isNeedConvertSafeTime_) {
1471             ConvertSafeTime();
1472             isNeedConvertSafeTime_ = false;
1473         }
1474     }
1475 }
1476 
ConvertSafeTime(void)1477 void AudioAdapterManager::ConvertSafeTime(void)
1478 {
1479     // Adapt to safe volume time when upgrade scenarios
1480     if (safeActiveTime_ > 0) {
1481         safeActiveTime_ = safeActiveTime_ / CONVERT_FROM_MS_TO_SECONDS;
1482         volumeDataMaintainer_.SaveSafeVolumeTime(DEVICE_TYPE_WIRED_HEADSET, safeActiveTime_);
1483     }
1484     if (safeActiveBtTime_ > 0) {
1485         safeActiveBtTime_ = safeActiveBtTime_ / CONVERT_FROM_MS_TO_SECONDS;
1486         volumeDataMaintainer_.SaveSafeVolumeTime(DEVICE_TYPE_BLUETOOTH_A2DP, safeActiveBtTime_);
1487     }
1488 }
1489 
GetCurrentDeviceSafeStatus(DeviceType deviceType)1490 SafeStatus AudioAdapterManager::GetCurrentDeviceSafeStatus(DeviceType deviceType)
1491 {
1492     switch (deviceType) {
1493         case DEVICE_TYPE_WIRED_HEADSET:
1494         case DEVICE_TYPE_WIRED_HEADPHONES:
1495         case DEVICE_TYPE_USB_HEADSET:
1496         case DEVICE_TYPE_USB_ARM_HEADSET:
1497             volumeDataMaintainer_.GetSafeStatus(DEVICE_TYPE_WIRED_HEADSET, safeStatus_);
1498             return safeStatus_;
1499         case DEVICE_TYPE_BLUETOOTH_SCO:
1500         case DEVICE_TYPE_BLUETOOTH_A2DP:
1501             volumeDataMaintainer_.GetSafeStatus(DEVICE_TYPE_BLUETOOTH_A2DP, safeStatusBt_);
1502             return safeStatusBt_;
1503         default:
1504             AUDIO_ERR_LOG("current device : %{public}d is not support", deviceType);
1505             break;
1506     }
1507 
1508     return SAFE_UNKNOWN;
1509 }
1510 
GetCurentDeviceSafeTime(DeviceType deviceType)1511 int64_t AudioAdapterManager::GetCurentDeviceSafeTime(DeviceType deviceType)
1512 {
1513     switch (deviceType) {
1514         case DEVICE_TYPE_WIRED_HEADSET:
1515         case DEVICE_TYPE_WIRED_HEADPHONES:
1516         case DEVICE_TYPE_USB_HEADSET:
1517         case DEVICE_TYPE_USB_ARM_HEADSET:
1518             volumeDataMaintainer_.GetSafeVolumeTime(DEVICE_TYPE_WIRED_HEADSET, safeActiveTime_);
1519             return safeActiveTime_;
1520         case DEVICE_TYPE_BLUETOOTH_SCO:
1521         case DEVICE_TYPE_BLUETOOTH_A2DP:
1522             volumeDataMaintainer_.GetSafeVolumeTime(DEVICE_TYPE_BLUETOOTH_A2DP, safeActiveBtTime_);
1523             return safeActiveBtTime_;
1524         default:
1525             AUDIO_ERR_LOG("current device : %{public}d is not support", deviceType);
1526             break;
1527     }
1528 
1529     return -1;
1530 }
1531 
SetDeviceSafeStatus(DeviceType deviceType,SafeStatus status)1532 int32_t AudioAdapterManager::SetDeviceSafeStatus(DeviceType deviceType, SafeStatus status)
1533 {
1534     if (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP) {
1535         safeStatusBt_ = status;
1536     } else if (deviceType == DEVICE_TYPE_WIRED_HEADSET) {
1537         safeStatus_ = status;
1538     }
1539     bool ret = volumeDataMaintainer_.SaveSafeStatus(deviceType, status);
1540     CHECK_AND_RETURN_RET(ret, ERROR, "SaveSafeStatus failed");
1541     return SUCCESS;
1542 }
1543 
SetDeviceSafeTime(DeviceType deviceType,int64_t time)1544 int32_t AudioAdapterManager::SetDeviceSafeTime(DeviceType deviceType, int64_t time)
1545 {
1546     if (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP) {
1547         safeActiveBtTime_ = time;
1548     } else if (deviceType == DEVICE_TYPE_WIRED_HEADSET) {
1549         safeActiveTime_ = time;
1550     }
1551     bool ret = volumeDataMaintainer_.SaveSafeVolumeTime(deviceType, time);
1552     CHECK_AND_RETURN_RET(ret, ERROR, "SetDeviceSafeTime failed");
1553     return SUCCESS;
1554 }
1555 
GetMuteKeyForKvStore(DeviceType deviceType,AudioStreamType streamType)1556 std::string AudioAdapterManager::GetMuteKeyForKvStore(DeviceType deviceType, AudioStreamType streamType)
1557 {
1558     std::string type = "";
1559     switch (deviceType) {
1560         case DEVICE_TYPE_EARPIECE:
1561         case DEVICE_TYPE_SPEAKER:
1562             type = "build-in";
1563             break;
1564         case DEVICE_TYPE_BLUETOOTH_A2DP:
1565         case DEVICE_TYPE_BLUETOOTH_SCO:
1566             type = "wireless";
1567             break;
1568         case DEVICE_TYPE_WIRED_HEADSET:
1569         case DEVICE_TYPE_USB_HEADSET:
1570         case DEVICE_TYPE_USB_ARM_HEADSET:
1571         case DEVICE_TYPE_DP:
1572             type = "wired";
1573             break;
1574         default:
1575             AUDIO_ERR_LOG("GetMuteKeyForKvStore: device %{public}d is not supported for kvStore", deviceType);
1576             return "";
1577     }
1578 
1579     switch (streamType) {
1580         case STREAM_MUSIC:
1581             return type + "_music_mute_status";
1582         case STREAM_RING:
1583         case STREAM_VOICE_RING:
1584             return type + "_ring_mute_status";
1585         case STREAM_SYSTEM:
1586             return type + "_system_mute_status";
1587         case STREAM_NOTIFICATION:
1588             return type + "_notification_mute_status";
1589         case STREAM_ALARM:
1590             return type + "_alarm_mute_status";
1591         case STREAM_DTMF:
1592             return type + "_dtmf_mute_status";
1593         case STREAM_VOICE_CALL:
1594         case STREAM_VOICE_COMMUNICATION:
1595             return type + "_voice_call_mute_status";
1596         case STREAM_VOICE_ASSISTANT:
1597             return type + "_voice_assistant_mute_status";
1598         case STREAM_ACCESSIBILITY:
1599             return type + "_accessibility_mute_status";
1600         case STREAM_ULTRASONIC:
1601             return type + "_unltrasonic_mute_status";
1602         default:
1603             AUDIO_ERR_LOG("GetMuteKeyForKvStore: streamType %{public}d is not supported for kvStore", streamType);
1604             return "";
1605     }
1606 }
1607 
CalculateVolumeDb(int32_t volumeLevel)1608 float AudioAdapterManager::CalculateVolumeDb(int32_t volumeLevel)
1609 {
1610     float value = static_cast<float>(volumeLevel) / MAX_VOLUME_LEVEL;
1611     float roundValue = static_cast<int>(value * CONST_FACTOR);
1612 
1613     return static_cast<float>(roundValue) / CONST_FACTOR;
1614 }
1615 
CloneSystemSoundUrl(void)1616 void AudioAdapterManager::CloneSystemSoundUrl(void)
1617 {
1618     CHECK_AND_RETURN_LOG(isNeedCopySystemUrlData_ && (audioPolicyKvStore_ != nullptr),
1619         "audioPolicyKvStore_ is nullptr,clone systemurl failed");
1620     for (auto &key: SYSTEM_SOUND_KEY_LIST) {
1621         Value value;
1622         Status status = audioPolicyKvStore_->Get(key, value);
1623         if (status == Status::SUCCESS) {
1624             std::string systemSoundUri = value.ToString();
1625             systemSoundUriMap_[key] = systemSoundUri;
1626             volumeDataMaintainer_.SaveSystemSoundUrl(key, systemSoundUri);
1627         }
1628     }
1629     isNeedCopySystemUrlData_ = false;
1630 }
1631 
InitSystemSoundUriMap()1632 void AudioAdapterManager::InitSystemSoundUriMap()
1633 {
1634     for (auto &key: SYSTEM_SOUND_KEY_LIST) {
1635         std::string systemSoundUri = "";
1636         volumeDataMaintainer_.GetSystemSoundUrl(key, systemSoundUri);
1637         if (systemSoundUri == "") {
1638             AUDIO_WARNING_LOG("Could not load system sound uri for %{public}s from kvStore", key.c_str());
1639         }
1640         systemSoundUriMap_[key] = systemSoundUri;
1641     }
1642 }
1643 
SetSystemSoundUri(const std::string & key,const std::string & uri)1644 int32_t AudioAdapterManager::SetSystemSoundUri(const std::string &key, const std::string &uri)
1645 {
1646     auto pos = std::find(SYSTEM_SOUND_KEY_LIST.begin(), SYSTEM_SOUND_KEY_LIST.end(), key);
1647     if (pos == SYSTEM_SOUND_KEY_LIST.end()) {
1648         AUDIO_ERR_LOG("Invalid key %{public}s for system sound uri", key.c_str());
1649         return ERR_INVALID_PARAM;
1650     }
1651     std::lock_guard<std::mutex> lock(systemSoundMutex_);
1652     if (systemSoundUriMap_.size() == 0) {
1653         InitSystemSoundUriMap();
1654         CHECK_AND_RETURN_RET_LOG(systemSoundUriMap_.size() != 0, ERR_OPERATION_FAILED,
1655             "Failed to init system sound uri map.");
1656     }
1657     systemSoundUriMap_[key] = uri;
1658     if (!volumeDataMaintainer_.SaveSystemSoundUrl(key, uri)) {
1659         AUDIO_ERR_LOG("SetSystemSoundUri failed");
1660         return ERROR;
1661     }
1662     return SUCCESS;
1663 }
1664 
GetSystemSoundUri(const std::string & key)1665 std::string AudioAdapterManager::GetSystemSoundUri(const std::string &key)
1666 {
1667     auto pos = std::find(SYSTEM_SOUND_KEY_LIST.begin(), SYSTEM_SOUND_KEY_LIST.end(), key);
1668     if (pos == SYSTEM_SOUND_KEY_LIST.end()) {
1669         AUDIO_ERR_LOG("Invalid key %{public}s for system sound uri", key.c_str());
1670         return "";
1671     }
1672     std::lock_guard<std::mutex> lock(systemSoundMutex_);
1673     if (systemSoundUriMap_.size() == 0) {
1674         InitSystemSoundUriMap();
1675         CHECK_AND_RETURN_RET_LOG(systemSoundUriMap_.size() != 0, "",
1676             "Failed to init system sound uri map.");
1677     }
1678     return systemSoundUriMap_[key];
1679 }
1680 
GetMinStreamVolume() const1681 float AudioAdapterManager::GetMinStreamVolume() const
1682 {
1683     return MIN_STREAM_VOLUME;
1684 }
1685 
GetMaxStreamVolume() const1686 float AudioAdapterManager::GetMaxStreamVolume() const
1687 {
1688     return MAX_STREAM_VOLUME;
1689 }
1690 
IsVolumeUnadjustable()1691 bool AudioAdapterManager::IsVolumeUnadjustable()
1692 {
1693     return isVolumeUnadjustable_;
1694 }
1695 
GetSystemVolumeInDb(AudioVolumeType volumeType,int32_t volumeLevel,DeviceType deviceType)1696 float AudioAdapterManager::GetSystemVolumeInDb(AudioVolumeType volumeType, int32_t volumeLevel, DeviceType deviceType)
1697 {
1698     AUDIO_DEBUG_LOG("GetSystemVolumeInDb for volumeType: %{public}d deviceType:%{public}d volumeLevel:%{public}d",
1699         volumeType, deviceType, volumeLevel);
1700     if (useNonlinearAlgo_) {
1701         getSystemVolumeInDb_ = CalculateVolumeDbNonlinear(volumeType, deviceType, volumeLevel);
1702     } else {
1703         getSystemVolumeInDb_ = CalculateVolumeDb(volumeLevel);
1704     }
1705     AUDIO_DEBUG_LOG("Get system volume in db success %{public}f", getSystemVolumeInDb_);
1706 
1707     return getSystemVolumeInDb_;
1708 }
1709 
GetPositionInVolumePoints(std::vector<VolumePoint> & volumePoints,int32_t idx)1710 uint32_t AudioAdapterManager::GetPositionInVolumePoints(std::vector<VolumePoint> &volumePoints, int32_t idx)
1711 {
1712     int32_t leftPos = 0;
1713     int32_t rightPos = static_cast<int32_t>(volumePoints.size() - 1);
1714     while (leftPos <= rightPos) {
1715         int32_t midPos = leftPos + (rightPos - leftPos)/NUMBER_TWO;
1716         int32_t c = static_cast<int32_t>(volumePoints[midPos].index) - idx;
1717         if (c == 0) {
1718             leftPos = midPos;
1719             break;
1720         } else if (c < 0) {
1721             leftPos = midPos + 1;
1722         } else {
1723             rightPos = midPos - 1;
1724         }
1725     }
1726     return leftPos;
1727 }
1728 
CalculateVolumeDbNonlinear(AudioStreamType streamType,DeviceType deviceType,int32_t volumeLevel)1729 float AudioAdapterManager::CalculateVolumeDbNonlinear(AudioStreamType streamType,
1730     DeviceType deviceType, int32_t volumeLevel)
1731 {
1732     AUDIO_DEBUG_LOG("CalculateVolumeDbNonlinear for stream: %{public}d devicetype:%{public}d volumeLevel:%{public}d",
1733         streamType, deviceType, volumeLevel);
1734     AudioStreamType streamAlias = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
1735     int32_t minVolIndex = GetMinVolumeLevel(streamAlias);
1736     int32_t maxVolIndex = GetMaxVolumeLevel(streamAlias);
1737     if (minVolIndex < 0 || maxVolIndex < 0 || minVolIndex >= maxVolIndex) {
1738         return 0.0f;
1739     }
1740     if (volumeLevel < minVolIndex) {
1741         volumeLevel = minVolIndex;
1742     }
1743     if (volumeLevel > maxVolIndex) {
1744         volumeLevel = maxVolIndex;
1745     }
1746 
1747     DeviceVolumeType deviceCategory = GetDeviceCategory(deviceType);
1748     std::vector<VolumePoint> volumePoints;
1749     GetVolumePoints(streamAlias, deviceCategory, volumePoints);
1750     uint32_t pointSize = volumePoints.size();
1751 
1752     CHECK_AND_RETURN_RET_LOG(pointSize != 0, 1.0f, "pointSize is 0");
1753     int32_t volSteps = static_cast<int32_t>(1 + volumePoints[pointSize - 1].index - volumePoints[0].index);
1754     int32_t idxRatio = (volSteps * (volumeLevel - minVolIndex)) / (maxVolIndex - minVolIndex);
1755     int32_t position = static_cast<int32_t>(GetPositionInVolumePoints(volumePoints, idxRatio));
1756     if (position == 0) {
1757         if (minVolIndex != 0) {
1758             AUDIO_INFO_LOG("Min volume index not zero, use min db: %{public}0.1f", volumePoints[0].dbValue / 100.0f);
1759             return exp((volumePoints[0].dbValue / 100.0f) * 0.115129f);
1760         }
1761         AUDIO_DEBUG_LOG("position = 0, return 0.0");
1762         return 0.0f;
1763     } else if (position >= static_cast<int32_t>(pointSize)) {
1764         AUDIO_DEBUG_LOG("position > pointSize, return %{public}f",
1765             exp(volumePoints[pointSize - 1].dbValue * 0.115129f));
1766         return exp((volumePoints[pointSize - 1].dbValue / 100.0f) * 0.115129f);
1767     }
1768     float indexFactor = (static_cast<float>(idxRatio - static_cast<int32_t>(volumePoints[position - 1].index))) /
1769         (static_cast<float>(volumePoints[position].index - volumePoints[position - 1].index));
1770 
1771     float dbValue = (volumePoints[position - 1].dbValue / 100.0f) +
1772         indexFactor * ((volumePoints[position].dbValue / 100.0f) - (volumePoints[position - 1].dbValue / 100.0f));
1773 
1774     AUDIO_DEBUG_LOG(" index=[%{public}d, %{public}d, %{public}d]"
1775         "db=[%{public}0.1f %{public}0.1f %{public}0.1f] factor=[%{public}f]",
1776         volumePoints[position - 1].index, idxRatio, volumePoints[position].index,
1777         (static_cast<float>(volumePoints[position - 1].dbValue) / 100.0f), dbValue,
1778         (static_cast<float>(volumePoints[position].dbValue) / 100.0f), exp(dbValue * 0.115129f));
1779 
1780     return exp(dbValue * 0.115129f);
1781 }
1782 
InitVolumeMapIndex()1783 void AudioAdapterManager::InitVolumeMapIndex()
1784 {
1785     useNonlinearAlgo_ = 0;
1786     for (auto streamType : VOLUME_TYPE_LIST) {
1787         minVolumeIndexMap_[streamType] = MIN_VOLUME_LEVEL;
1788         maxVolumeIndexMap_[streamType] = MAX_VOLUME_LEVEL;
1789         volumeDataMaintainer_.SetStreamVolume(streamType, DEFAULT_VOLUME_LEVEL);
1790         AUDIO_DEBUG_LOG("streamType %{public}d index = [%{public}d, %{public}d, %{public}d]",
1791             streamType, minVolumeIndexMap_[streamType],
1792             maxVolumeIndexMap_[streamType], volumeDataMaintainer_.GetStreamVolume(streamType));
1793     }
1794 
1795     volumeDataMaintainer_.SetStreamVolume(STREAM_VOICE_CALL_ASSISTANT, MAX_VOLUME_LEVEL);
1796     volumeDataMaintainer_.SetStreamVolume(STREAM_ULTRASONIC, MAX_VOLUME_LEVEL);
1797 }
1798 
UpdateVolumeMapIndex()1799 void AudioAdapterManager::UpdateVolumeMapIndex()
1800 {
1801     for (auto streamVolInfoPair : streamVolumeInfos_) {
1802         auto streamVolInfo = streamVolInfoPair.second;
1803         minVolumeIndexMap_[streamVolInfo->streamType] = streamVolInfo->minLevel;
1804         maxVolumeIndexMap_[streamVolInfo->streamType] = streamVolInfo->maxLevel;
1805         volumeDataMaintainer_.SetStreamVolume(streamVolInfo->streamType, streamVolInfo->defaultLevel);
1806         AUDIO_DEBUG_LOG("update streamType %{public}d index = [%{public}d, %{public}d, %{public}d]",
1807             streamVolInfo->streamType, minVolumeIndexMap_[streamVolInfo->streamType],
1808             maxVolumeIndexMap_[streamVolInfo->streamType],
1809             volumeDataMaintainer_.GetStreamVolume(streamVolInfo->streamType));
1810     }
1811 }
1812 
GetVolumePoints(AudioVolumeType streamType,DeviceVolumeType deviceType,std::vector<VolumePoint> & volumePoints)1813 void AudioAdapterManager::GetVolumePoints(AudioVolumeType streamType, DeviceVolumeType deviceType,
1814     std::vector<VolumePoint> &volumePoints)
1815 {
1816     auto streamVolInfo = streamVolumeInfos_.find(streamType);
1817     auto deviceVolInfo = streamVolInfo->second->deviceVolumeInfos.find(deviceType);
1818     volumePoints = deviceVolInfo->second->volumePoints;
1819 }
1820 
GetStreamVolumeInfoMap(StreamVolumeInfoMap & streamVolumeInfos)1821 void AudioAdapterManager::GetStreamVolumeInfoMap(StreamVolumeInfoMap &streamVolumeInfos)
1822 {
1823     streamVolumeInfos = streamVolumeInfos_;
1824 }
1825 
SetActiveDevice(DeviceType deviceType)1826 void AudioAdapterManager::SetActiveDevice(DeviceType deviceType)
1827 {
1828     AUDIO_PRERELEASE_LOGI("SetActiveDevice deviceType %{public}d", deviceType);
1829     SetVolumeForSwitchDevice(deviceType);
1830 }
1831 
GetActiveDevice()1832 DeviceType AudioAdapterManager::GetActiveDevice()
1833 {
1834     return currentActiveDevice_;
1835 }
1836 
SetAbsVolumeScene(bool isAbsVolumeScene)1837 void AudioAdapterManager::SetAbsVolumeScene(bool isAbsVolumeScene)
1838 {
1839     AUDIO_PRERELEASE_LOGI("SetAbsVolumeScene: %{public}d", isAbsVolumeScene);
1840     isAbsVolumeScene_ = isAbsVolumeScene;
1841     if (currentActiveDevice_ == DEVICE_TYPE_BLUETOOTH_A2DP) {
1842         SetVolumeDb(STREAM_MUSIC);
1843     } else {
1844         AUDIO_INFO_LOG("The currentActiveDevice is not A2DP");
1845     }
1846 }
1847 
IsAbsVolumeScene() const1848 bool AudioAdapterManager::IsAbsVolumeScene() const
1849 {
1850     return isAbsVolumeScene_;
1851 }
1852 
SetAbsVolumeMute(bool mute)1853 void AudioAdapterManager::SetAbsVolumeMute(bool mute)
1854 {
1855     AUDIO_INFO_LOG("SetAbsVolumeMute: %{public}d", mute);
1856     isAbsVolumeMute_ = mute;
1857     if (currentActiveDevice_ == DEVICE_TYPE_BLUETOOTH_A2DP) {
1858         SetVolumeDb(STREAM_MUSIC);
1859     } else {
1860         AUDIO_INFO_LOG("The currentActiveDevice is not A2DP");
1861     }
1862 }
1863 
1864 
IsAbsVolumeMute() const1865 bool AudioAdapterManager::IsAbsVolumeMute() const
1866 {
1867     return isAbsVolumeMute_;
1868 }
1869 
NotifyAccountsChanged(const int & id)1870 void AudioAdapterManager::NotifyAccountsChanged(const int &id)
1871 {
1872     AUDIO_INFO_LOG("start reload the kv data, current id:%{public}d", id);
1873     LoadVolumeMap();
1874     LoadMuteStatusMap();
1875 }
1876 
DoRestoreData()1877 int32_t AudioAdapterManager::DoRestoreData()
1878 {
1879     isLoaded_ = false;
1880     isNeedConvertSafeTime_ = true; // reset convert safe volume status
1881     volumeDataMaintainer_.SaveMuteTransferStatus(true); // reset mute convert status
1882     InitKVStore();
1883     return SUCCESS;
1884 }
1885 
GetSafeVolumeLevel() const1886 int32_t AudioAdapterManager::GetSafeVolumeLevel() const
1887 {
1888     return safeVolume_;
1889 }
1890 
GetSafeVolumeTimeout() const1891 int32_t AudioAdapterManager::GetSafeVolumeTimeout() const
1892 {
1893     if (safeVolumeTimeout_ <= 0) {
1894         AUDIO_INFO_LOG("safeVolumeTimeout is invalid, return default value:%{public}d", DEFAULT_SAFE_VOLUME_TIMEOUT);
1895         return DEFAULT_SAFE_VOLUME_TIMEOUT;
1896     }
1897     return safeVolumeTimeout_;
1898 }
1899 
SafeVolumeDump(std::string & dumpString)1900 void AudioAdapterManager::SafeVolumeDump(std::string &dumpString)
1901 {
1902     dumpString += "SafeVolume info:\n";
1903     for (auto &streamType : VOLUME_TYPE_LIST) {
1904         AppendFormat(dumpString, "  - samplingAudioStreamTypeate: %d", streamType);
1905         AppendFormat(dumpString, "   volumeLevel: %d\n", volumeDataMaintainer_.GetStreamVolume(streamType));
1906         AppendFormat(dumpString, "  - AudioStreamType: %d", streamType);
1907         AppendFormat(dumpString, "   streamMuteStatus: %d\n", volumeDataMaintainer_.GetStreamMute(streamType));
1908     }
1909     std::string statusBt = (safeStatusBt_ == SAFE_ACTIVE) ? "SAFE_ACTIVE" : "SAFE_INACTIVE";
1910     std::string status = (safeStatus_ == SAFE_ACTIVE) ? "SAFE_ACTIVE" : "SAFE_INACTIVE";
1911     AppendFormat(dumpString, "  - ringerMode: %d\n", ringerMode_);
1912     AppendFormat(dumpString, "  - SafeVolume: %d\n", safeVolume_);
1913     AppendFormat(dumpString, "  - BtSafeStatus: %s\n", statusBt.c_str());
1914     AppendFormat(dumpString, "  - SafeStatus: %s\n", status.c_str());
1915     AppendFormat(dumpString, "  - ActiveBtSafeTime: %lld\n", safeActiveBtTime_);
1916     AppendFormat(dumpString, "  - ActiveSafeTime: %lld\n", safeActiveTime_);
1917 }
1918 
SetVgsVolumeSupported(bool isVgsSupported)1919 void AudioAdapterManager::SetVgsVolumeSupported(bool isVgsSupported)
1920 {
1921     isVgsVolumeSupported_ = isVgsSupported;
1922 }
1923 
IsVgsVolumeSupported() const1924 bool AudioAdapterManager::IsVgsVolumeSupported() const
1925 {
1926     return isVgsVolumeSupported_;
1927 }
1928 // LCOV_EXCL_STOP
1929 } // namespace AudioStandard
1930 } // namespace OHOS
1931