• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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