1 /*
2 * Copyright (c) 2024-2025 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 "VolumeDataMaintainer"
17 #endif
18
19 #include "volume_data_maintainer.h"
20 #include "system_ability_definition.h"
21 #include "audio_policy_manager_factory.h"
22 #include "media_monitor_manager.h"
23
24 namespace OHOS {
25 namespace AudioStandard {
26 const std::string AUDIO_SAFE_VOLUME_STATE = "audio_safe_volume_state";
27 const std::string AUDIO_SAFE_VOLUME_STATE_BT = "audio_safe_volume_state_bt";
28 const std::string UNSAFE_VOLUME_MUSIC_ACTIVE_MS = "unsafe_volume_music_active_ms";
29 const std::string UNSAFE_VOLUME_MUSIC_ACTIVE_MS_BT = "unsafe_volume_music_active_ms_bt";
30 const std::string UNSAFE_VOLUME_LEVEL = "unsafe_volume_level";
31 const std::string UNSAFE_VOLUME_LEVEL_BT = "unsafe_volume_level_bt";
32 const std::string SETTINGS_CLONED = "settingsCloneStatus";
33 const int32_t INVALIAD_SETTINGS_CLONE_STATUS = -1;
34 const int32_t SETTINGS_CLONING_STATUS = 1;
35 const int32_t SETTINGS_CLONED_STATUS = 0;
36 constexpr int32_t MAX_SAFE_STATUS = 2;
37
38 static const std::vector<VolumeDataMaintainer::VolumeDataMaintainerStreamType> VOLUME_MUTE_STREAM_TYPE = {
39 // all volume types except STREAM_ALL
40 VolumeDataMaintainer::VT_STREAM_ALARM,
41 VolumeDataMaintainer::VT_STREAM_DTMF,
42 VolumeDataMaintainer::VT_STREAM_TTS,
43 VolumeDataMaintainer::VT_STREAM_ACCESSIBILITY,
44 VolumeDataMaintainer::VT_STREAM_ASSISTANT,
45 };
46
47 static const std::vector<DeviceType> DEVICE_TYPE_LIST = {
48 // The five devices represent the three volume groups(build-in, wireless, wired).
49 DEVICE_TYPE_SPEAKER,
50 DEVICE_TYPE_EARPIECE,
51 DEVICE_TYPE_BLUETOOTH_A2DP,
52 DEVICE_TYPE_WIRED_HEADSET,
53 DEVICE_TYPE_REMOTE_CAST
54 };
55
56 static std::map<VolumeDataMaintainer::VolumeDataMaintainerStreamType, AudioStreamType> AUDIO_STREAMTYPE_MAP = {
57 {VolumeDataMaintainer::VT_STREAM_ALARM, STREAM_ALARM},
58 {VolumeDataMaintainer::VT_STREAM_DTMF, STREAM_DTMF},
59 {VolumeDataMaintainer::VT_STREAM_TTS, STREAM_VOICE_ASSISTANT},
60 {VolumeDataMaintainer::VT_STREAM_ACCESSIBILITY, STREAM_ACCESSIBILITY},
61 };
62
63 static std::map<AudioStreamType, std::string> AUDIO_STREAMTYPE_VOLUME_MAP = {
64 {STREAM_MUSIC, "music_volume"},
65 {STREAM_RING, "ring_volume"},
66 {STREAM_SYSTEM, "system_volume"},
67 {STREAM_NOTIFICATION, "notification_volume"},
68 {STREAM_ALARM, "alarm_volume"},
69 {STREAM_DTMF, "dtmf_volume"},
70 {STREAM_VOICE_CALL, "voice_call_volume"},
71 {STREAM_VOICE_ASSISTANT, "voice_assistant_volume"},
72 {STREAM_ACCESSIBILITY, "accessibility_volume"},
73 {STREAM_ULTRASONIC, "ultrasonic_volume"},
74 {STREAM_WAKEUP, "wakeup"},
75 };
76
77 static std::map<AudioStreamType, std::string> AUDIO_STREAMTYPE_MUTE_STATUS_MAP = {
78 {STREAM_MUSIC, "music_mute_status"},
79 {STREAM_RING, "ring_mute_status"},
80 {STREAM_SYSTEM, "system_mute_status"},
81 {STREAM_NOTIFICATION, "notification_mute_status"},
82 {STREAM_ALARM, "alarm_mute_status"},
83 {STREAM_DTMF, "dtmf_mute_status"},
84 {STREAM_VOICE_CALL, "voice_call_mute_status"},
85 {STREAM_VOICE_ASSISTANT, "voice_assistant_mute_status"},
86 {STREAM_ACCESSIBILITY, "accessibility_mute_status"},
87 {STREAM_ULTRASONIC, "unltrasonic_mute_status"},
88 };
89
VolumeDataMaintainer()90 VolumeDataMaintainer::VolumeDataMaintainer()
91 {
92 AUDIO_DEBUG_LOG("VolumeDataMaintainer Create");
93 }
94
~VolumeDataMaintainer()95 VolumeDataMaintainer::~VolumeDataMaintainer()
96 {
97 AUDIO_DEBUG_LOG("VolumeDataMaintainer Destory");
98 }
99
CheckOsAccountReady()100 bool VolumeDataMaintainer::CheckOsAccountReady()
101 {
102 return AudioSettingProvider::CheckOsAccountReady();
103 }
104
SetDataShareReady(std::atomic<bool> isDataShareReady)105 void VolumeDataMaintainer::SetDataShareReady(std::atomic<bool> isDataShareReady)
106 {
107 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
108 audioSettingProvider.SetDataShareReady(std::atomic_load(&isDataShareReady));
109 }
110
SaveVolume(DeviceType type,AudioStreamType streamType,int32_t volumeLevel,std::string networkId)111 bool VolumeDataMaintainer::SaveVolume(DeviceType type, AudioStreamType streamType, int32_t volumeLevel,
112 std::string networkId)
113 {
114 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
115 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
116 return SaveVolumeInternal(type, streamForVolumeMap, volumeLevel, networkId);
117 }
118
SaveVolumeDegree(DeviceType type,AudioStreamType streamTypeIn,int32_t volumeDegree,std::string networkId)119 bool VolumeDataMaintainer::SaveVolumeDegree(DeviceType type, AudioStreamType streamTypeIn,
120 int32_t volumeDegree, std::string networkId)
121 {
122 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
123 AudioStreamType streamType = VolumeUtils::GetVolumeTypeFromStreamType(streamTypeIn);
124
125 std::string volumeKey = GetVolumeKeyForDataShare(type, streamType, networkId);
126 if (!volumeKey.compare("")) {
127 AUDIO_ERR_LOG("[device %{public}d, streamType %{public}d] is not supported for datashare",
128 type, streamType);
129 return false;
130 }
131 volumeKey += "_degree";
132
133 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
134 ErrCode ret = audioSettingProvider.PutIntValue(volumeKey, volumeDegree, "system");
135 if (ret != SUCCESS) {
136 AUDIO_ERR_LOG("Save Volume To DataBase volumeMap failed");
137 return false;
138 }
139 return true;
140 }
141
SaveVolumeInternal(DeviceType type,AudioStreamType streamType,int32_t volumeLevel,std::string networkId)142 bool VolumeDataMaintainer::SaveVolumeInternal(DeviceType type, AudioStreamType streamType, int32_t volumeLevel,
143 std::string networkId)
144 {
145 std::string volumeKey = GetVolumeKeyForDataShare(type, streamType, networkId);
146 if (!volumeKey.compare("")) {
147 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_VOLUME_INTERNA_A),
148 ERR_READ_FAILED);
149 AUDIO_ERR_LOG("[device %{public}d, streamType %{public}d] is not supported for datashare",
150 type, streamType);
151 return false;
152 }
153
154 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
155 ErrCode ret = audioSettingProvider.PutIntValue(volumeKey, volumeLevel, "system");
156 if (ret != SUCCESS) {
157 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_VOLUME_INTERNA_B),
158 static_cast<int32_t>(ret));
159 AUDIO_ERR_LOG("Save Volume To DataBase volumeMap failed");
160 return false;
161 }
162 return true;
163 }
164
GetVolume(DeviceType deviceType,AudioStreamType streamType,std::string networkId)165 bool VolumeDataMaintainer::GetVolume(DeviceType deviceType, AudioStreamType streamType, std::string networkId)
166 {
167 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
168 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
169 return GetVolumeInternal(deviceType, streamForVolumeMap, networkId);
170 }
171
GetVolumeDegree(DeviceType deviceType,AudioStreamType streamTypeIn,std::string networkId)172 bool VolumeDataMaintainer::GetVolumeDegree(DeviceType deviceType, AudioStreamType streamTypeIn, std::string networkId)
173 {
174 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
175 AudioStreamType streamType = VolumeUtils::GetVolumeTypeFromStreamType(streamTypeIn);
176 // Voice call assistant stream is full volume by default
177 if (streamType == STREAM_VOICE_CALL_ASSISTANT) {
178 return true;
179 }
180 std::string volumeKey = GetVolumeKeyForDataShare(deviceType, streamType, networkId);
181 if (!volumeKey.compare("")) {
182 AUDIO_ERR_LOG("[device %{public}d, streamType %{public}d] is not supported for datashare",
183 deviceType, streamType);
184 return false;
185 }
186 volumeKey += "_degree";
187
188 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
189 int32_t volumeValue = 0;
190 ErrCode ret = audioSettingProvider.GetIntValue(volumeKey, volumeValue, "system");
191 if (ret != SUCCESS) {
192 AUDIO_ERR_LOG("Get streamType %{public}d, deviceType %{public}d, Volume FromDataBase volumeMap failed.",
193 streamType, deviceType);
194 return false;
195 } else {
196 volumeDegreeMap_[streamType] = volumeValue;
197 AUDIO_PRERELEASE_LOGI("Get streamType %{public}d, deviceType %{public}d, "\
198 "Volume FromDataBase volumeMap from datashare %{public}d.", streamType, deviceType, volumeValue);
199 }
200
201 return true;
202 }
203
GetVolumeInternal(DeviceType deviceType,AudioStreamType streamType,std::string networkId)204 bool VolumeDataMaintainer::GetVolumeInternal(DeviceType deviceType, AudioStreamType streamType, std::string networkId)
205 {
206 // Voice call assistant stream is full volume by default
207 if (streamType == STREAM_VOICE_CALL_ASSISTANT) {
208 return true;
209 }
210 std::string volumeKey = GetVolumeKeyForDataShare(deviceType, streamType, networkId);
211 if (!volumeKey.compare("")) {
212 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_VOLUME_INTERNAL_A),
213 ERR_READ_FAILED);
214 AUDIO_ERR_LOG("[device %{public}d, streamType %{public}d] is not supported for datashare",
215 deviceType, streamType);
216 return false;
217 }
218
219 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
220 int32_t volumeValue = 0;
221 ErrCode ret = audioSettingProvider.GetIntValue(volumeKey, volumeValue, "system");
222 if (ret != SUCCESS) {
223 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_VOLUME_INTERNAL_B),
224 static_cast<int32_t>(ret));
225 AUDIO_ERR_LOG("Get streamType %{public}d, deviceType %{public}d, Volume FromDataBase volumeMap failed.",
226 streamType, deviceType);
227 return false;
228 } else {
229 volumeLevelMap_[streamType] = volumeValue;
230 AUDIO_PRERELEASE_LOGI("Get streamType %{public}d, deviceType %{public}d, "\
231 "Volume FromDataBase volumeMap from datashare %{public}d.", streamType, deviceType, volumeValue);
232 }
233
234 return true;
235 }
236
SaveVolumeWithDatabaseVolumeName(const std::string & databaseVolumeName,AudioStreamType streamType,int32_t volumeLevel)237 bool VolumeDataMaintainer::SaveVolumeWithDatabaseVolumeName(const std::string &databaseVolumeName,
238 AudioStreamType streamType, int32_t volumeLevel)
239 {
240 AUDIO_INFO_LOG("SaveVolume: databaseVolumeName [%{public}s], streamType [%{public}d], volumeLevel [%{public}d]",
241 databaseVolumeName.c_str(), streamType, volumeLevel);
242 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
243 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
244 std::string volumeKey = GetVolumeKeyForDatabaseVolumeName(databaseVolumeName, streamForVolumeMap);
245 if (volumeKey == "") {
246 AUDIO_ERR_LOG("databaseVolumeName [%{public}s], streamType [%{public}d] is not supported for dataShare",
247 databaseVolumeName.c_str(), streamType);
248 return false;
249 }
250 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
251 ErrCode ret = audioSettingProvider.PutIntValue(volumeKey, volumeLevel, "system");
252 if (ret != SUCCESS) {
253 AUDIO_ERR_LOG("Failed to save volume to database!");
254 return false;
255 }
256 return true;
257 }
258
GetVolumeWithDatabaseVolumeName(const std::string & databaseVolumeName,AudioStreamType streamType)259 bool VolumeDataMaintainer::GetVolumeWithDatabaseVolumeName(const std::string &databaseVolumeName,
260 AudioStreamType streamType)
261 {
262 AUDIO_INFO_LOG("GetVolume: databaseVolumeName [%{public}s], streamType [%{public}d]",
263 databaseVolumeName.c_str(), streamType);
264 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
265 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
266 std::string volumeKey = GetVolumeKeyForDatabaseVolumeName(databaseVolumeName, streamForVolumeMap);
267 if (volumeKey == "") {
268 AUDIO_ERR_LOG("databaseVolumeName [%{public}s], streamType [%{public}d] is not supported for dataShare",
269 databaseVolumeName.c_str(), streamType);
270 return false;
271 }
272 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
273 int32_t volumeValue = 0;
274 ErrCode ret = audioSettingProvider.GetIntValue(volumeKey, volumeValue, "system");
275 if (ret != SUCCESS) {
276 AUDIO_ERR_LOG("Failed to get volume from database!");
277 return false;
278 }
279 volumeLevelMap_[streamForVolumeMap] = volumeValue;
280 AUDIO_INFO_LOG("Get Volume: volumeKey [%{public}s], volumeValue [%{public}d]",
281 volumeKey.c_str(), volumeValue);
282 return true;
283 }
284
SaveMuteStatusWithDatabaseVolumeName(const std::string & databaseVolumeName,AudioStreamType streamType,bool muteStatus)285 bool VolumeDataMaintainer::SaveMuteStatusWithDatabaseVolumeName(const std::string &databaseVolumeName,
286 AudioStreamType streamType, bool muteStatus)
287 {
288 AUDIO_INFO_LOG("SaveMuteStatus: databaseVolumeName [%{public}s], streamType [%{public}d], muteStatus [%{public}d]",
289 databaseVolumeName.c_str(), streamType, muteStatus);
290 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
291 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
292 std::string muteKey = GetMuteKeyForDatabaseVolumeName(databaseVolumeName, streamForVolumeMap);
293 if (muteKey == "") {
294 AUDIO_ERR_LOG("databaseVolumeName [%{public}s], streamType [%{public}d] is not supported for dataShare",
295 databaseVolumeName.c_str(), streamType);
296 return false;
297 }
298 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
299 ErrCode ret = audioSettingProvider.PutBoolValue(muteKey, muteStatus, "system");
300 if (ret != SUCCESS) {
301 AUDIO_ERR_LOG("Failed to save mute status to database!");
302 return false;
303 }
304 return true;
305 }
306
GetMuteStatusWithDatabaseVolumeName(const std::string & databaseVolumeName,AudioStreamType streamType)307 bool VolumeDataMaintainer::GetMuteStatusWithDatabaseVolumeName(const std::string &databaseVolumeName,
308 AudioStreamType streamType)
309 {
310 AUDIO_INFO_LOG("GetMuteStatus: databaseVolumeName [%{public}s], streamType [%{public}d]",
311 databaseVolumeName.c_str(), streamType);
312 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
313 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
314 std::string muteKey = GetMuteKeyForDatabaseVolumeName(databaseVolumeName, streamForVolumeMap);
315 if (muteKey == "") {
316 AUDIO_ERR_LOG("databaseVolumeName [%{public}s], streamType [%{public}d] is not supported for dataShare",
317 databaseVolumeName.c_str(), streamType);
318 return false;
319 }
320 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
321 bool muteStatus = false;
322 ErrCode ret = audioSettingProvider.GetBoolValue(muteKey, muteStatus, "system");
323 if (ret != SUCCESS) {
324 AUDIO_ERR_LOG("Failed to get mute status from database!");
325 return false;
326 }
327 muteStatusMap_[streamForVolumeMap] = muteStatus;
328 AUDIO_INFO_LOG("GetMuteStatus: muteKey [%{public}s], muteStatus [%{public}d]",
329 muteKey.c_str(), muteStatus);
330 return true;
331 }
332
SetAppVolume(int32_t appUid,int32_t volumeLevel)333 void VolumeDataMaintainer::SetAppVolume(int32_t appUid, int32_t volumeLevel)
334 {
335 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
336 appVolumeLevelMap_[appUid] = volumeLevel;
337 }
338
SetAppVolumeMuted(int32_t appUid,bool muted)339 void VolumeDataMaintainer::SetAppVolumeMuted(int32_t appUid, bool muted)
340 {
341 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
342 int ownedAppUid = IPCSkeleton::GetCallingUid();
343 appMuteStatusMap_[appUid][ownedAppUid] = muted;
344 }
345
SetAppStreamMuted(int32_t appUid,AudioStreamType streamType,bool muted)346 void VolumeDataMaintainer::SetAppStreamMuted(int32_t appUid, AudioStreamType streamType, bool muted)
347 {
348 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
349 if (muted) {
350 // Set mute status for the given app and stream type
351 appStreamMuteMap_[appUid][streamType] = true;
352 } else {
353 auto uidIt = appStreamMuteMap_.find(appUid);
354 if (uidIt != appStreamMuteMap_.end()) {
355 // Remove the stream type if mute is false
356 uidIt->second.erase(streamType);
357 // If no more stream types under this appUid, remove the appUid entry
358 if (uidIt->second.empty()) {
359 appStreamMuteMap_.erase(uidIt);
360 }
361 }
362 }
363 }
364
IsAppStreamMuted(int32_t appUid,AudioStreamType streamType)365 bool VolumeDataMaintainer::IsAppStreamMuted(int32_t appUid, AudioStreamType streamType)
366 {
367 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
368 auto uidIt = appStreamMuteMap_.find(appUid);
369 if (uidIt == appStreamMuteMap_.end()) {
370 return false;
371 }
372
373 const auto &streamMap = uidIt->second;
374 auto streamIt = streamMap.find(streamType);
375 if (streamIt == streamMap.end()) {
376 return false;
377 }
378
379 return streamIt->second;
380 }
381
GetAppMute(int32_t appUid,bool & isMute)382 void VolumeDataMaintainer::GetAppMute(int32_t appUid, bool &isMute)
383 {
384 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
385 auto iter = appMuteStatusMap_.find(appUid);
386 if (iter == appMuteStatusMap_.end()) {
387 isMute = false;
388 } else {
389 for (auto subIter : iter->second) {
390 if (subIter.second) {
391 isMute = true;
392 return;
393 }
394 }
395 isMute = false;
396 }
397 }
398
GetAppMuteOwned(int32_t appUid,bool & isMute)399 void VolumeDataMaintainer::GetAppMuteOwned(int32_t appUid, bool &isMute)
400 {
401 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
402 int ownedAppUid = IPCSkeleton::GetCallingUid();
403 auto iter = appMuteStatusMap_.find(appUid);
404 if (iter == appMuteStatusMap_.end()) {
405 isMute = false;
406 } else {
407 isMute = iter->second[ownedAppUid];
408 }
409 }
410
SetStreamVolume(AudioStreamType streamType,int32_t volumeLevel)411 void VolumeDataMaintainer::SetStreamVolume(AudioStreamType streamType, int32_t volumeLevel)
412 {
413 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
414 SetStreamVolumeInternal(streamType, volumeLevel);
415 }
416
SetStreamVolumeInternal(AudioStreamType streamType,int32_t volumeLevel)417 void VolumeDataMaintainer::SetStreamVolumeInternal(AudioStreamType streamType, int32_t volumeLevel)
418 {
419 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
420 volumeLevelMap_[streamForVolumeMap] = volumeLevel;
421 }
422
GetStreamVolume(AudioStreamType streamType)423 int32_t VolumeDataMaintainer::GetStreamVolume(AudioStreamType streamType)
424 {
425 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
426 return GetStreamVolumeInternal(streamType);
427 }
428
GetDeviceVolume(DeviceType deviceType,AudioStreamType streamType)429 int32_t VolumeDataMaintainer::GetDeviceVolume(DeviceType deviceType, AudioStreamType streamType)
430 {
431 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
432 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
433 return GetDeviceVolumeInternal(deviceType, streamForVolumeMap);
434 }
435
GetDeviceVolumeInternal(DeviceType deviceType,AudioStreamType streamType)436 int32_t VolumeDataMaintainer::GetDeviceVolumeInternal(DeviceType deviceType, AudioStreamType streamType)
437 {
438 std::string volumeKey = GetVolumeKeyForDataShare(deviceType, streamType);
439 int32_t volumeValue = 0;
440 if (!volumeKey.compare("")) {
441 AUDIO_ERR_LOG("[device %{public}d, streamType %{public}d] is not supported for datashare",
442 deviceType, streamType);
443 return volumeValue;
444 }
445
446 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
447 ErrCode ret = audioSettingProvider.GetIntValue(volumeKey, volumeValue, "system");
448 if (ret != SUCCESS) {
449 AUDIO_ERR_LOG("Get streamType %{public}d, deviceType %{public}d, Volume FromDataBase volumeMap failed.",
450 streamType, deviceType);
451 } else {
452 AUDIO_PRERELEASE_LOGI("Get streamType %{public}d, deviceType %{public}d, "\
453 "Volume FromDataBase volumeMap from datashare %{public}d.", streamType, deviceType, volumeValue);
454 }
455
456 return volumeValue;
457 }
458
IsSetAppVolume(int32_t appUid)459 bool VolumeDataMaintainer::IsSetAppVolume(int32_t appUid)
460 {
461 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
462 return appVolumeLevelMap_.find(appUid) != appVolumeLevelMap_.end();
463 }
464
GetAppVolume(int32_t appUid)465 int32_t VolumeDataMaintainer::GetAppVolume(int32_t appUid)
466 {
467 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
468 return appVolumeLevelMap_[appUid];
469 }
470
471
GetStreamVolumeInternal(AudioStreamType streamType)472 int32_t VolumeDataMaintainer::GetStreamVolumeInternal(AudioStreamType streamType)
473 {
474 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
475 return volumeLevelMap_[streamForVolumeMap];
476 }
477
WriteVolumeDbAccessExceptionEvent(int32_t errorCase,int32_t errorMsg)478 void VolumeDataMaintainer::WriteVolumeDbAccessExceptionEvent(int32_t errorCase, int32_t errorMsg)
479 {
480 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
481 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::DB_ACCESS_EXCEPTION,
482 Media::MediaMonitor::EventType::FAULT_EVENT);
483 bean->Add("DB_TYPE", "volume");
484 bean->Add("ERROR_CASE", errorCase);
485 bean->Add("ERROR_MSG", errorMsg);
486 bean->Add("ERROR_DESCRIPTION", "Dateabase access failed");
487 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
488 }
489
GetVolumeMap()490 std::unordered_map<AudioStreamType, int32_t> VolumeDataMaintainer::GetVolumeMap()
491 {
492 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
493 return volumeLevelMap_;
494 }
495
SaveMuteStatus(DeviceType deviceType,AudioStreamType streamType,bool muteStatus,std::string networkId)496 bool VolumeDataMaintainer::SaveMuteStatus(DeviceType deviceType, AudioStreamType streamType,
497 bool muteStatus, std::string networkId)
498 {
499 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
500 if (streamType == STREAM_RING && VolumeUtils::GetVolumeTypeFromStreamType(streamType) == STREAM_RING) {
501 AUDIO_INFO_LOG("set ring stream mute status to all device.");
502 bool saveMuteResult = false;
503 for (auto &device : DEVICE_TYPE_LIST) {
504 // set ring stream mute status to device
505 saveMuteResult = SaveMuteStatusInternal(device, streamType, muteStatus, networkId);
506 if (!saveMuteResult) {
507 AUDIO_INFO_LOG("save mute failed.");
508 break;
509 }
510 }
511 return saveMuteResult;
512 }
513 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
514 return SaveMuteStatusInternal(deviceType, streamForVolumeMap, muteStatus, networkId);
515 }
516
SaveMuteStatusInternal(DeviceType deviceType,AudioStreamType streamType,bool muteStatus,std::string networkId)517 bool VolumeDataMaintainer::SaveMuteStatusInternal(DeviceType deviceType, AudioStreamType streamType,
518 bool muteStatus, std::string networkId)
519 {
520 std::string muteKey = GetMuteKeyForDataShare(deviceType, streamType, networkId);
521 if (!muteKey.compare("")) {
522 WriteVolumeDbAccessExceptionEvent(
523 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_MUTE_STATUS_INTERNAL),
524 ERR_READ_FAILED);
525 AUDIO_ERR_LOG("[device %{public}d, streamType %{public}d] is not supported for "\
526 "datashare", deviceType, streamType);
527 return false;
528 }
529
530 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
531 ErrCode ret = audioSettingProvider.PutBoolValue(muteKey, muteStatus, "system");
532 if (ret != SUCCESS) {
533 AUDIO_WARNING_LOG("Failed to write mutestatus: %{public}d to setting db! Err: %{public}d", muteStatus, ret);
534 } else {
535 AUDIO_INFO_LOG("muteKey:%{public}s, muteStatus:%{public}d", muteKey.c_str(), muteStatus);
536 }
537
538 return true;
539 }
540
SetStreamMuteStatus(AudioStreamType streamType,bool muteStatus)541 bool VolumeDataMaintainer::SetStreamMuteStatus(AudioStreamType streamType, bool muteStatus)
542 {
543 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
544 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
545 muteStatusMap_[streamForVolumeMap] = muteStatus;
546 return true;
547 }
548
GetMuteStatus(DeviceType deviceType,AudioStreamType streamType,std::string networkId)549 bool VolumeDataMaintainer::GetMuteStatus(DeviceType deviceType, AudioStreamType streamType,
550 std::string networkId)
551 {
552 std::lock_guard<ffrt::mutex> lock(volumeForDbMutex_);
553 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
554 return GetMuteStatusInternal(deviceType, streamForVolumeMap, networkId);
555 }
556
GetMuteStatusInternal(DeviceType deviceType,AudioStreamType streamType,std::string networkId)557 bool VolumeDataMaintainer::GetMuteStatusInternal(DeviceType deviceType, AudioStreamType streamType,
558 std::string networkId)
559 {
560 std::string muteKey = GetMuteKeyForDataShare(deviceType, streamType, networkId);
561 if (!muteKey.compare("")) {
562 WriteVolumeDbAccessExceptionEvent(
563 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_MUTE_STATUS_INTERNAL_A),
564 ERR_READ_FAILED);
565 AUDIO_ERR_LOG("[device %{public}d, streamType %{public}d] is not supported for "\
566 "datashare", deviceType, streamType);
567 return false;
568 }
569
570 AudioSettingProvider& audioSettingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
571 bool muteStatus = false;
572 ErrCode ret = audioSettingProvider.GetBoolValue(muteKey, muteStatus, "system");
573 if (ret != SUCCESS) {
574 WriteVolumeDbAccessExceptionEvent(
575 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_MUTE_STATUS_INTERNAL_B),
576 static_cast<int32_t>(ret));
577 AUDIO_ERR_LOG("Get MuteStatus From DataBase muteStatus failed");
578 return false;
579 } else {
580 muteStatusMap_[streamType] = muteStatus;
581 AUDIO_DEBUG_LOG("Get MuteStatus From DataBase muteStatus from datashare %{public}d", muteStatus);
582 }
583
584 return true;
585 }
586
GetStreamMute(AudioStreamType streamType)587 bool VolumeDataMaintainer::GetStreamMute(AudioStreamType streamType)
588 {
589 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
590 return GetStreamMuteInternal(streamType);
591 }
592
GetStreamMuteInternal(AudioStreamType streamType)593 bool VolumeDataMaintainer::GetStreamMuteInternal(AudioStreamType streamType)
594 {
595 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
596 return muteStatusMap_[streamForVolumeMap];
597 }
598
GetMuteAffected(int32_t & affected)599 bool VolumeDataMaintainer::GetMuteAffected(int32_t &affected)
600 {
601 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
602 const std::string settingKey = "mute_streams_affected";
603 int32_t value = 0;
604 ErrCode ret = settingProvider.GetIntValue(settingKey, value, "system");
605 if (ret != SUCCESS) {
606 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_MUTE_AFFECTED),
607 static_cast<int32_t>(ret));
608 AUDIO_WARNING_LOG("Failed to get muteaffected failed Err: %{public}d", ret);
609 return false;
610 } else {
611 affected = value;
612 }
613 return true;
614 }
615
GetMuteTransferStatus(bool & status)616 bool VolumeDataMaintainer::GetMuteTransferStatus(bool &status)
617 {
618 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
619 const std::string settingKey = "need_mute_affected_transfer";
620 ErrCode ret = settingProvider.GetBoolValue(settingKey, status);
621 if (ret != SUCCESS) {
622 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_MUTE_TRANSFER_STATUS),
623 static_cast<int32_t>(ret));
624 AUDIO_WARNING_LOG("Failed to get muteaffected failed Err: %{public}d", ret);
625 return false;
626 }
627 return true;
628 }
629
SetMuteAffectedToMuteStatusDataBase(int32_t affected)630 bool VolumeDataMaintainer::SetMuteAffectedToMuteStatusDataBase(int32_t affected)
631 {
632 // transfer mute_streams_affected to mutestatus
633 for (auto &streamtype : VOLUME_MUTE_STREAM_TYPE) {
634 if (static_cast<uint32_t>(affected) & (1 << streamtype)) {
635 for (auto &device : DEVICE_TYPE_LIST) {
636 // save mute status to database
637 SaveMuteStatusInternal(device, AUDIO_STREAMTYPE_MAP[streamtype], true);
638 }
639 }
640 }
641 return true;
642 }
643
SaveMuteTransferStatus(bool status)644 bool VolumeDataMaintainer::SaveMuteTransferStatus(bool status)
645 {
646 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
647 const std::string settingKey = "need_mute_affected_transfer";
648 ErrCode ret = settingProvider.PutIntValue(settingKey, status);
649 if (ret != SUCCESS) {
650 WriteVolumeDbAccessExceptionEvent(
651 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_MUTE_TRANSFER_STATUS),
652 static_cast<int32_t>(ret));
653 AUDIO_WARNING_LOG("Failed to SaveMuteTransferStatus: %{public}d to setting db! Err: %{public}d", status, ret);
654 return false;
655 }
656 return true;
657 }
658
SaveRingerMode(AudioRingerMode ringerMode)659 bool VolumeDataMaintainer::SaveRingerMode(AudioRingerMode ringerMode)
660 {
661 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
662 const std::string settingKey = "ringer_mode";
663 ErrCode ret = settingProvider.PutIntValue(settingKey, static_cast<int32_t>(ringerMode));
664 if (ret != SUCCESS) {
665 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_RINGER_MODE),
666 static_cast<int32_t>(ret));
667 AUDIO_WARNING_LOG("Failed to write ringer_mode: %{public}d to setting db! Err: %{public}d", ringerMode, ret);
668 return false;
669 }
670 return true;
671 }
672
GetRingerMode(AudioRingerMode & ringerMode)673 bool VolumeDataMaintainer::GetRingerMode(AudioRingerMode &ringerMode)
674 {
675 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
676 const std::string settingKey = "ringer_mode";
677 int32_t value = 0;
678 ErrCode ret = settingProvider.GetIntValue(settingKey, value);
679 if (ret != SUCCESS) {
680 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_RINGER_MODE),
681 static_cast<int32_t>(ret));
682 AUDIO_WARNING_LOG("Failed to write ringer_mode: %{public}d to setting db! Err: %{public}d", ringerMode, ret);
683 return false;
684 } else {
685 ringerMode = static_cast<AudioRingerMode>(value);
686 }
687 return true;
688 }
689
SaveSafeStatus(DeviceType deviceType,SafeStatus safeStatus)690 bool VolumeDataMaintainer::SaveSafeStatus(DeviceType deviceType, SafeStatus safeStatus)
691 {
692 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
693 ErrCode ret = SUCCESS;
694 switch (deviceType) {
695 case DEVICE_TYPE_BLUETOOTH_A2DP:
696 case DEVICE_TYPE_BLUETOOTH_SCO:
697 ret = settingProvider.PutIntValue(AUDIO_SAFE_VOLUME_STATE_BT, static_cast<int32_t>(safeStatus));
698 break;
699 case DEVICE_TYPE_WIRED_HEADSET:
700 case DEVICE_TYPE_USB_HEADSET:
701 case DEVICE_TYPE_USB_ARM_HEADSET:
702 ret = settingProvider.PutIntValue(AUDIO_SAFE_VOLUME_STATE, static_cast<int32_t>(safeStatus));
703 break;
704 default:
705 AUDIO_WARNING_LOG("the device type not support safe volume");
706 return false;
707 }
708 if (ret != SUCCESS) {
709 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_SAFE_STATUS),
710 static_cast<int32_t>(ret));
711 AUDIO_ERR_LOG("device:%{public}d, insert failed, safe status:%{public}d", deviceType, safeStatus);
712 return false;
713 }
714 return true;
715 }
716
GetSafeStatus(DeviceType deviceType,SafeStatus & safeStatus)717 bool VolumeDataMaintainer::GetSafeStatus(DeviceType deviceType, SafeStatus &safeStatus)
718 {
719 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
720 ErrCode ret = SUCCESS;
721 int32_t value = 0;
722 switch (deviceType) {
723 case DEVICE_TYPE_BLUETOOTH_A2DP:
724 case DEVICE_TYPE_BLUETOOTH_SCO:
725 ret = settingProvider.GetIntValue(AUDIO_SAFE_VOLUME_STATE_BT, value);
726 break;
727 case DEVICE_TYPE_WIRED_HEADSET:
728 case DEVICE_TYPE_USB_HEADSET:
729 case DEVICE_TYPE_USB_ARM_HEADSET:
730 ret = settingProvider.GetIntValue(AUDIO_SAFE_VOLUME_STATE, value);
731 break;
732 default:
733 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_SAFE_STATUS_A),
734 static_cast<int32_t>(ret));
735 AUDIO_WARNING_LOG("the device type not support safe volume");
736 return false;
737 }
738 if (ret != SUCCESS) {
739 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_SAFE_STATUS_B),
740 static_cast<int32_t>(ret));
741 AUDIO_ERR_LOG("device:%{public}d, insert failed, safe status:%{public}d", deviceType, safeStatus);
742 return false;
743 }
744 if (value > static_cast<int32_t>(SAFE_ACTIVE)) {
745 value = value - MAX_SAFE_STATUS;
746 SaveSafeStatus(deviceType, static_cast<SafeStatus>(value));
747 }
748 safeStatus = static_cast<SafeStatus>(value);
749 return true;
750 }
751
SaveSafeVolumeTime(DeviceType deviceType,int64_t time)752 bool VolumeDataMaintainer::SaveSafeVolumeTime(DeviceType deviceType, int64_t time)
753 {
754 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
755 ErrCode ret = SUCCESS;
756 switch (deviceType) {
757 case DEVICE_TYPE_BLUETOOTH_A2DP:
758 case DEVICE_TYPE_BLUETOOTH_SCO:
759 ret = settingProvider.PutLongValue(UNSAFE_VOLUME_MUSIC_ACTIVE_MS_BT, time, "secure");
760 break;
761 case DEVICE_TYPE_WIRED_HEADSET:
762 case DEVICE_TYPE_USB_HEADSET:
763 case DEVICE_TYPE_USB_ARM_HEADSET:
764 ret = settingProvider.PutLongValue(UNSAFE_VOLUME_MUSIC_ACTIVE_MS, time, "secure");
765 break;
766 default:
767 WriteVolumeDbAccessExceptionEvent(
768 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_SAFE_VOLUME_TIME_A),
769 static_cast<int32_t>(ret));
770 AUDIO_WARNING_LOG("the device type not support safe volume");
771 return false;
772 }
773 if (ret != SUCCESS) {
774 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_SAFE_VOLUME_TIME_B),
775 static_cast<int32_t>(ret));
776 AUDIO_ERR_LOG("device:%{public}d, insert failed", deviceType);
777 return false;
778 }
779
780 return true;
781 }
782
GetSafeVolumeTime(DeviceType deviceType,int64_t & time)783 bool VolumeDataMaintainer::GetSafeVolumeTime(DeviceType deviceType, int64_t &time)
784 {
785 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
786 ErrCode ret = SUCCESS;
787 switch (deviceType) {
788 case DEVICE_TYPE_BLUETOOTH_A2DP:
789 case DEVICE_TYPE_BLUETOOTH_SCO:
790 ret = settingProvider.GetLongValue(UNSAFE_VOLUME_MUSIC_ACTIVE_MS_BT, time, "secure");
791 break;
792 case DEVICE_TYPE_WIRED_HEADSET:
793 case DEVICE_TYPE_USB_HEADSET:
794 case DEVICE_TYPE_USB_ARM_HEADSET:
795 ret = settingProvider.GetLongValue(UNSAFE_VOLUME_MUSIC_ACTIVE_MS, time, "secure");
796 break;
797 default:
798 WriteVolumeDbAccessExceptionEvent(
799 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_SAFE_VOLUME_TIME_A),
800 static_cast<int32_t>(ret));
801 AUDIO_WARNING_LOG("the device type not support safe mode");
802 return false;
803 }
804 if (ret != SUCCESS) {
805 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_SAFE_VOLUME_TIME_B),
806 static_cast<int32_t>(ret));
807 AUDIO_ERR_LOG("device:%{public}d, get safe active time failed", deviceType);
808 return false;
809 }
810 return true;
811 }
812
SetRestoreVolumeLevel(DeviceType deviceType,int32_t volume)813 bool VolumeDataMaintainer::SetRestoreVolumeLevel(DeviceType deviceType, int32_t volume)
814 {
815 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
816 ErrCode ret = SUCCESS;
817 switch (deviceType) {
818 case DEVICE_TYPE_BLUETOOTH_A2DP:
819 case DEVICE_TYPE_BLUETOOTH_SCO:
820 ret = settingProvider.PutIntValue(UNSAFE_VOLUME_LEVEL_BT, volume);
821 break;
822 case DEVICE_TYPE_WIRED_HEADSET:
823 case DEVICE_TYPE_USB_HEADSET:
824 case DEVICE_TYPE_USB_ARM_HEADSET:
825 case DEVICE_TYPE_DP:
826 ret = settingProvider.PutIntValue(UNSAFE_VOLUME_LEVEL, volume);
827 break;
828 default:
829 WriteVolumeDbAccessExceptionEvent(
830 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SET_RESTORE_VOLUME_LEVEL_A),
831 static_cast<int32_t>(ret));
832 AUDIO_WARNING_LOG("the device type not support safe volume");
833 return false;
834 }
835 if (ret != SUCCESS) {
836 WriteVolumeDbAccessExceptionEvent(
837 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SET_RESTORE_VOLUME_LEVEL_B),
838 static_cast<int32_t>(ret));
839 AUDIO_ERR_LOG("device:%{public}d, insert failed", deviceType);
840 return false;
841 }
842
843 return true;
844 }
845
GetRestoreVolumeLevel(DeviceType deviceType,int32_t & volume)846 bool VolumeDataMaintainer::GetRestoreVolumeLevel(DeviceType deviceType, int32_t &volume)
847 {
848 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
849 ErrCode ret = SUCCESS;
850 int32_t value = 0;
851 switch (deviceType) {
852 case DEVICE_TYPE_BLUETOOTH_A2DP:
853 case DEVICE_TYPE_BLUETOOTH_SCO:
854 ret = settingProvider.GetIntValue(UNSAFE_VOLUME_LEVEL_BT, value);
855 break;
856 case DEVICE_TYPE_WIRED_HEADSET:
857 case DEVICE_TYPE_USB_HEADSET:
858 case DEVICE_TYPE_USB_ARM_HEADSET:
859 case DEVICE_TYPE_DP:
860 ret = settingProvider.GetIntValue(UNSAFE_VOLUME_LEVEL, value);
861 break;
862 default:
863 WriteVolumeDbAccessExceptionEvent(
864 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_RESTORE_VOLUME_LEVEL_A),
865 static_cast<int32_t>(ret));
866 AUDIO_WARNING_LOG("the device type not support safe volume");
867 return false;
868 }
869 if (ret != SUCCESS) {
870 WriteVolumeDbAccessExceptionEvent(
871 static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_RESTORE_VOLUME_LEVEL_B),
872 static_cast<int32_t>(ret));
873 AUDIO_ERR_LOG("device:%{public}d, insert failed", deviceType);
874 return false;
875 }
876 volume = value;
877 return true;
878 }
879
SaveSystemSoundUrl(const std::string & key,const std::string & value)880 bool VolumeDataMaintainer::SaveSystemSoundUrl(const std::string &key, const std::string &value)
881 {
882 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
883 ErrCode ret = settingProvider.PutStringValue(key, value);
884 if (ret != SUCCESS) {
885 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_SYSTEM_SOUND_URL),
886 static_cast<int32_t>(ret));
887 AUDIO_WARNING_LOG("Failed to system sound url: %{public}s to setting db! Err: %{public}d", value.c_str(), ret);
888 return false;
889 }
890 return true;
891 }
892
GetSystemSoundUrl(const std::string & key,std::string & value)893 bool VolumeDataMaintainer::GetSystemSoundUrl(const std::string &key, std::string &value)
894 {
895 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
896 ErrCode ret = settingProvider.GetStringValue(key, value);
897 if (ret != SUCCESS) {
898 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_SYSTEM_SOUND_URL),
899 static_cast<int32_t>(ret));
900 AUDIO_WARNING_LOG("Failed to get systemsoundurl failed Err: %{public}d", ret);
901 return false;
902 }
903 return true;
904 }
905
RegisterCloned()906 void VolumeDataMaintainer::RegisterCloned()
907 {
908 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
909 AudioSettingObserver::UpdateFunc updateFunc = [&](const std::string& key) {
910 int32_t value = INVALIAD_SETTINGS_CLONE_STATUS;
911 ErrCode result =
912 AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID).GetIntValue(SETTINGS_CLONED, value);
913 if (!isSettingsCloneHaveStarted_ && (value == SETTINGS_CLONING_STATUS) && (result == SUCCESS)) {
914 AUDIO_INFO_LOG("clone staring");
915 isSettingsCloneHaveStarted_ = true;
916 }
917
918 if (isSettingsCloneHaveStarted_ && (value == SETTINGS_CLONED_STATUS) && (result == SUCCESS)) {
919 AUDIO_INFO_LOG("Get SETTINGS_CLONED success, clone done, restore.");
920 AudioPolicyManagerFactory::GetAudioPolicyManager().DoRestoreData();
921 isSettingsCloneHaveStarted_ = false;
922 }
923 };
924 sptr<AudioSettingObserver> observer = settingProvider.CreateObserver(SETTINGS_CLONED, updateFunc);
925 ErrCode ret = settingProvider.RegisterObserver(observer);
926 if (ret != ERR_OK) {
927 AUDIO_ERR_LOG("RegisterObserver failed");
928 }
929 }
930
SaveMicMuteState(bool isMute)931 bool VolumeDataMaintainer::SaveMicMuteState(bool isMute)
932 {
933 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
934 const std::string settingKey = "micmute_state";
935 ErrCode ret = settingProvider.PutBoolValue(settingKey, isMute, "secure", true, AudioSettingProvider::MAIN_USER_ID);
936 if (ret != SUCCESS) {
937 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::SAVE_MIC_MUTE_STATE),
938 static_cast<int32_t>(ret));
939 AUDIO_ERR_LOG("Failed to saveMicMuteState: %{public}d to setting db! Err: %{public}d", isMute, ret);
940 return false;
941 }
942 return true;
943 }
944
GetMicMuteState(bool & isMute)945 bool VolumeDataMaintainer::GetMicMuteState(bool &isMute)
946 {
947 AudioSettingProvider& settingProvider = AudioSettingProvider::GetInstance(AUDIO_POLICY_SERVICE_ID);
948 const std::string settingKey = "micmute_state";
949 ErrCode ret = settingProvider.GetBoolValue(settingKey, isMute, "secure", AudioSettingProvider::MAIN_USER_ID);
950 if (ret != SUCCESS) {
951 WriteVolumeDbAccessExceptionEvent(static_cast<int32_t>(VolumeDbAccessExceptionFuncId::GET_MIC_MUTE_STATE),
952 static_cast<int32_t>(ret));
953 AUDIO_WARNING_LOG("Failed to write micmute_state: %{public}d to setting db! Err: %{public}d", isMute, ret);
954 return false;
955 }
956
957 return true;
958 }
GetDeviceTypeName(DeviceType deviceType)959 std::string VolumeDataMaintainer::GetDeviceTypeName(DeviceType deviceType)
960 {
961 std::string type = "";
962 switch (deviceType) {
963 case DEVICE_TYPE_EARPIECE:
964 type = "_earpiece";
965 return type;
966 case DEVICE_TYPE_SPEAKER:
967 type = "_builtin";
968 return type;
969 case DEVICE_TYPE_DP:
970 case DEVICE_TYPE_HDMI:
971 type = "_dp";
972 return type;
973 case DEVICE_TYPE_BLUETOOTH_A2DP:
974 case DEVICE_TYPE_BLUETOOTH_SCO:
975 case DEVICE_TYPE_NEARLINK:
976 type = "_wireless";
977 return type;
978 case DEVICE_TYPE_HEARING_AID:
979 type = "_hearing_aid";
980 return type;
981 case DEVICE_TYPE_WIRED_HEADSET:
982 case DEVICE_TYPE_WIRED_HEADPHONES:
983 case DEVICE_TYPE_USB_HEADSET:
984 case DEVICE_TYPE_USB_ARM_HEADSET:
985 type = "_wired";
986 return type;
987 case DEVICE_TYPE_REMOTE_CAST:
988 type = "_remote_cast";
989 return type;
990 default:
991 AUDIO_ERR_LOG("device %{public}d is not supported for dataShare", deviceType);
992 return "";
993 }
994 }
995
GetVolumeKeyForDatabaseVolumeName(std::string databaseVolumeName,AudioStreamType streamType)996 std::string VolumeDataMaintainer::GetVolumeKeyForDatabaseVolumeName(
997 std::string databaseVolumeName, AudioStreamType streamType)
998 {
999 std::string type = "";
1000 if (!AUDIO_STREAMTYPE_VOLUME_MAP.count(streamType)) {
1001 return "";
1002 }
1003 type = AUDIO_STREAMTYPE_VOLUME_MAP[streamType];
1004 if (type == "") {
1005 AUDIO_ERR_LOG("streamType %{public}d is not supported for datashare", streamType);
1006 return "";
1007 }
1008
1009 return databaseVolumeName + "_" + type;
1010 }
1011
GetMuteKeyForDatabaseVolumeName(std::string databaseVolumeName,AudioStreamType streamType)1012 std::string VolumeDataMaintainer::GetMuteKeyForDatabaseVolumeName(
1013 std::string databaseVolumeName, AudioStreamType streamType)
1014 {
1015 std::string type = "";
1016 if (!AUDIO_STREAMTYPE_MUTE_STATUS_MAP.count(streamType)) {
1017 return "";
1018 }
1019 type = AUDIO_STREAMTYPE_MUTE_STATUS_MAP[streamType];
1020 if (type == "") {
1021 AUDIO_ERR_LOG("streamType %{public}d is not supported for datashare", streamType);
1022 return "";
1023 }
1024
1025 return databaseVolumeName + "_" + type;
1026 }
1027
GetVolumeKeyForDataShare(DeviceType deviceType,AudioStreamType streamType,std::string networkId)1028 std::string VolumeDataMaintainer::GetVolumeKeyForDataShare(DeviceType deviceType, AudioStreamType streamType,
1029 std::string networkId)
1030 {
1031 std::string type = "";
1032 if (!AUDIO_STREAMTYPE_VOLUME_MAP.count(streamType)) {
1033 return "";
1034 }
1035 type = AUDIO_STREAMTYPE_VOLUME_MAP[streamType];
1036 if (type == "") {
1037 AUDIO_ERR_LOG("streamType %{public}d is not supported for datashare", streamType);
1038 return "";
1039 }
1040
1041 std::string deviceTypeName = GetDeviceTypeName(deviceType);
1042 if (deviceTypeName == "") {
1043 AUDIO_ERR_LOG("device %{public}d is not supported for datashare", deviceType);
1044 return "";
1045 }
1046 if (VolumeUtils::IsPCVolumeEnable() && streamType == AudioStreamType::STREAM_MUSIC &&
1047 deviceType == DeviceType::DEVICE_TYPE_BLUETOOTH_SCO) {
1048 type = AUDIO_STREAMTYPE_VOLUME_MAP[STREAM_VOICE_CALL];
1049 }
1050 if (streamType == AudioStreamType::STREAM_VOICE_ASSISTANT &&
1051 deviceType == DeviceType::DEVICE_TYPE_BLUETOOTH_SCO) {
1052 deviceTypeName += "_sco";
1053 }
1054
1055 if (networkId != "LocalDevice" && deviceType == DEVICE_TYPE_SPEAKER) {
1056 deviceTypeName += "_distributed";
1057 }
1058
1059 if (deviceType == DEVICE_TYPE_DP) {
1060 deviceTypeName += "_dp";
1061 }
1062 return type + deviceTypeName;
1063 }
1064
GetMuteKeyForDataShare(DeviceType deviceType,AudioStreamType streamType,std::string networkId)1065 std::string VolumeDataMaintainer::GetMuteKeyForDataShare(DeviceType deviceType, AudioStreamType streamType,
1066 std::string networkId)
1067 {
1068 std::string type = "";
1069 if (!AUDIO_STREAMTYPE_MUTE_STATUS_MAP.count(streamType)) {
1070 return "";
1071 }
1072 type = AUDIO_STREAMTYPE_MUTE_STATUS_MAP[streamType];
1073 if (type == "") {
1074 AUDIO_ERR_LOG("streamType %{public}d is not supported for datashare", streamType);
1075 return "";
1076 }
1077
1078 std::string deviceTypeName = GetDeviceTypeName(deviceType);
1079 if (deviceTypeName == "") {
1080 AUDIO_ERR_LOG("device %{public}d is not supported for datashare", deviceType);
1081 return "";
1082 }
1083 if (VolumeUtils::IsPCVolumeEnable() && streamType == AudioStreamType::STREAM_MUSIC &&
1084 deviceType == DeviceType::DEVICE_TYPE_BLUETOOTH_SCO) {
1085 type = AUDIO_STREAMTYPE_VOLUME_MAP[STREAM_VOICE_CALL];
1086 }
1087
1088 if (streamType == AudioStreamType::STREAM_VOICE_ASSISTANT &&
1089 deviceType == DeviceType::DEVICE_TYPE_BLUETOOTH_SCO) {
1090 deviceTypeName += "_sco";
1091 }
1092
1093 if (networkId != "LocalDevice" && deviceType == DEVICE_TYPE_SPEAKER) {
1094 deviceTypeName += "_distributed";
1095 }
1096
1097 if (deviceType == DEVICE_TYPE_DP) {
1098 deviceTypeName += "_dp";
1099 }
1100 return type + deviceTypeName;
1101 }
1102
SetVolumeDegree(AudioStreamType streamType,int32_t volumeDegree)1103 void VolumeDataMaintainer::SetVolumeDegree(AudioStreamType streamType, int32_t volumeDegree)
1104 {
1105 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
1106 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
1107 volumeDegreeMap_[streamForVolumeMap] = volumeDegree;
1108 }
1109
GetVolumeDegree(AudioStreamType streamType)1110 int32_t VolumeDataMaintainer::GetVolumeDegree(AudioStreamType streamType)
1111 {
1112 std::lock_guard<ffrt::mutex> lock(volumeMutex_);
1113 AudioStreamType streamForVolumeMap = VolumeUtils::GetVolumeTypeFromStreamType(streamType);
1114 return volumeDegreeMap_[streamForVolumeMap];
1115 }
1116
1117 } // namespace AudioStandard
1118 } // namespace OHOS
1119