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