• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "AudioServer"
17 #endif
18 
19 #include "audio_server.h"
20 
21 #include <cinttypes>
22 #include <codecvt>
23 #include <csignal>
24 #include <fstream>
25 #include <sstream>
26 #include <thread>
27 #include <unordered_map>
28 #include <vector>
29 #include <format>
30 
31 #include "bundle_mgr_interface.h"
32 #include "bundle_mgr_proxy.h"
33 #include "iservice_registry.h"
34 #include "system_ability_definition.h"
35 #include "hisysevent.h"
36 #include "parameters.h"
37 
38 #include "core_service_handler.h"
39 #include "icore_service_provider_ipc.h"
40 #include "manager/hdi_adapter_manager.h"
41 #include "sink/i_audio_render_sink.h"
42 #include "source/i_audio_capture_source.h"
43 #include "util/id_handler.h"
44 #include "audio_errors.h"
45 #include "audio_common_log.h"
46 #include "audio_asr.h"
47 #include "audio_service.h"
48 #include "audio_schedule.h"
49 #include "audio_utils.h"
50 #ifdef HAS_FEATURE_INNERCAPTURER
51 #include "playback_capturer_manager.h"
52 #endif
53 #include "config/audio_param_parser.h"
54 #include "media_monitor_manager.h"
55 #include "offline_stream_in_server.h"
56 #include "audio_dump_pcm.h"
57 #include "audio_info.h"
58 #include "i_hpae_manager.h"
59 #include "audio_server_hpae_dump.h"
60 #include "audio_resource_service.h"
61 #include "audio_manager_listener.h"
62 #include "app_bundle_manager.h"
63 #ifdef SUPPORT_OLD_ENGINE
64 #define PA
65 #ifdef PA
66 extern "C" {
67     extern int ohos_pa_main(int argc, char *argv[]);
68 }
69 #endif
70 #endif // SUPPORT_OLD_ENGINE
71 using namespace std;
72 
73 namespace OHOS {
74 namespace AudioStandard {
75 constexpr int32_t UID_MSDP_SA = 6699;
76 constexpr int32_t INTELL_VOICE_SERVICR_UID = 1042;
77 uint32_t AudioServer::paDaemonTid_;
78 std::map<std::string, std::string> AudioServer::audioParameters;
79 std::unordered_map<std::string, std::unordered_map<std::string, std::set<std::string>>> AudioServer::audioParameterKeys;
80 const string DEFAULT_COOKIE_PATH = "/data/data/.pulse_dir/state/cookie";
81 const std::string CHECK_FAST_BLOCK_PREFIX = "Is_Fast_Blocked_For_AppName#";
82 constexpr const char *TEL_SATELLITE_SUPPORT = "const.telephony.satellite.supported";
83 const std::string SATEMODEM_PARAMETER = "usedmodem=satemodem";
84 const std::string PCM_DUMP_KEY = "PCM_DUMP";
85 const std::string EFFECT_LIVE_KEY = "hpae_effect";
86 constexpr int32_t UID_FOUNDATION_SA = 5523;
87 const unsigned int TIME_OUT_SECONDS = 10;
88 const char* DUMP_AUDIO_PERMISSION = "ohos.permission.DUMP_AUDIO";
89 const char* MANAGE_INTELLIGENT_VOICE_PERMISSION = "ohos.permission.MANAGE_INTELLIGENT_VOICE";
90 const char* CAST_AUDIO_OUTPUT_PERMISSION = "ohos.permission.CAST_AUDIO_OUTPUT";
91 const char* CAPTURE_PLAYBACK_PERMISSION = "ohos.permission.CAPTURE_PLAYBACK";
92 static const std::vector<StreamUsage> STREAMS_NEED_VERIFY_SYSTEM_PERMISSION = {
93     STREAM_USAGE_SYSTEM,
94     STREAM_USAGE_DTMF,
95     STREAM_USAGE_ENFORCED_TONE,
96     STREAM_USAGE_ULTRASONIC,
97     STREAM_USAGE_VOICE_MODEM_COMMUNICATION
98 };
99 static const int32_t MODERN_INNER_API_VERSION = 12;
100 const int32_t API_VERSION_REMAINDER = 1000;
101 static constexpr int32_t VM_MANAGER_UID = 7700;
102 static const int32_t FAST_DUMPINFO_LEN = 2;
103 static const int32_t BUNDLENAME_LENGTH_LIMIT = 1024;
104 static const size_t PARAMETER_SET_LIMIT = 1024;
105 constexpr int32_t UID_CAMERA = 1047;
106 constexpr int32_t MAX_RENDERER_STREAM_CNT_PER_UID = 128;
107 const int32_t DEFAULT_MAX_RENDERER_INSTANCES = 128;
108 const int32_t DEFAULT_MAX_LOOPBACK_INSTANCES = 1;
109 const int32_t MCU_UID = 7500;
110 const int32_t TV_SERVICE_UID = 7501;
111 constexpr int32_t CHECK_ALL_RENDER_UID = -1;
112 constexpr int64_t RENDER_DETECTION_CYCLE_NS = 10000000000;
113 constexpr int32_t RENDER_BAD_FRAMES_RATIO = 100;
114 static const std::set<int32_t> RECORD_CHECK_FORWARD_LIST = {
115     VM_MANAGER_UID,
116     UID_CAMERA
117 };
118 static const std::set<int32_t> GENERATE_SESSIONID_UID_SET = {
119     MCU_UID,
120     TV_SERVICE_UID
121 };
122 const int32_t RSS_THRESHOLD = 2;
123 // using pass-in appInfo for uids:
124 constexpr int32_t UID_MEDIA_SA = 1013;
125 enum PermissionStatus {
126     PERMISSION_GRANTED = 0,
127     PERMISSION_DENIED = 1,
128     PERMISSION_UNKNOWN = 2,
129 };
130 
131 const std::set<int32_t> RECORD_PASS_APPINFO_LIST = {
132     UID_MEDIA_SA
133 };
134 
135 const std::set<SourceType> VALID_SOURCE_TYPE = {
136     SOURCE_TYPE_MIC,
137     SOURCE_TYPE_VOICE_RECOGNITION,
138     SOURCE_TYPE_PLAYBACK_CAPTURE,
139     SOURCE_TYPE_WAKEUP,
140     SOURCE_TYPE_VOICE_CALL,
141     SOURCE_TYPE_VOICE_COMMUNICATION,
142     SOURCE_TYPE_ULTRASONIC,
143     SOURCE_TYPE_VIRTUAL_CAPTURE,
144     SOURCE_TYPE_VOICE_MESSAGE,
145     SOURCE_TYPE_REMOTE_CAST,
146     SOURCE_TYPE_VOICE_TRANSCRIPTION,
147     SOURCE_TYPE_CAMCORDER,
148     SOURCE_TYPE_UNPROCESSED,
149     SOURCE_TYPE_LIVE
150 };
151 
152 static constexpr unsigned int GET_BUNDLE_TIME_OUT_SECONDS = 10;
153 static constexpr unsigned int WAIT_AUDIO_POLICY_READY_TIMEOUT_SECONDS = 5;
154 static constexpr int32_t MAX_WAIT_IN_SERVER_COUNT = 5;
155 static constexpr int32_t RESTORE_SESSION_TRY_COUNT = 10;
156 static constexpr uint32_t  RESTORE_SESSION_RETRY_WAIT_TIME_IN_MS = 50000;
157 
158 static const std::vector<SourceType> AUDIO_SUPPORTED_SOURCE_TYPES = {
159     SOURCE_TYPE_INVALID,
160     SOURCE_TYPE_MIC,
161     SOURCE_TYPE_VOICE_RECOGNITION,
162     SOURCE_TYPE_PLAYBACK_CAPTURE,
163     SOURCE_TYPE_WAKEUP,
164     SOURCE_TYPE_VOICE_CALL,
165     SOURCE_TYPE_VOICE_COMMUNICATION,
166     SOURCE_TYPE_ULTRASONIC,
167     SOURCE_TYPE_VIRTUAL_CAPTURE,
168     SOURCE_TYPE_VOICE_MESSAGE,
169     SOURCE_TYPE_REMOTE_CAST,
170     SOURCE_TYPE_VOICE_TRANSCRIPTION,
171     SOURCE_TYPE_CAMCORDER,
172     SOURCE_TYPE_UNPROCESSED,
173     SOURCE_TYPE_LIVE,
174 };
175 
176 static const std::vector<SourceType> AUDIO_FAST_STREAM_SUPPORTED_SOURCE_TYPES = {
177     SOURCE_TYPE_MIC,
178     SOURCE_TYPE_VOICE_RECOGNITION,
179     SOURCE_TYPE_VOICE_CALL,
180     SOURCE_TYPE_VOICE_COMMUNICATION,
181     SOURCE_TYPE_VIRTUAL_CAPTURE,
182     SOURCE_TYPE_VOICE_MESSAGE,
183     SOURCE_TYPE_VOICE_TRANSCRIPTION,
184     SOURCE_TYPE_CAMCORDER,
185     SOURCE_TYPE_UNPROCESSED,
186     SOURCE_TYPE_LIVE,
187 };
188 
IsVoiceModemCommunication(StreamUsage streamUsage,int32_t callingUid)189 static bool IsVoiceModemCommunication(StreamUsage streamUsage, int32_t callingUid)
190 {
191     return streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION && callingUid == UID_FOUNDATION_SA;
192 }
193 
GetField(const std::string & src,const char * field,const char sep)194 static std::string GetField(const std::string &src, const char* field, const char sep)
195 {
196     auto str = std::string(field) + '=';
197     auto pos = src.find(str);
198     CHECK_AND_RETURN_RET(pos != std::string::npos, "");
199     pos += str.length();
200     auto end = src.find(sep, pos);
201     return end == std::string::npos ? src.substr(pos) : src.substr(pos, end - pos);
202 }
203 
GetSinkByProp(HdiIdType type,const std::string & info=HDI_ID_INFO_DEFAULT,bool tryCreate=false)204 static inline std::shared_ptr<IAudioRenderSink> GetSinkByProp(HdiIdType type, const std::string &info =
205     HDI_ID_INFO_DEFAULT, bool tryCreate = false)
206 {
207     uint32_t id = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_RENDER, type, info);
208     return HdiAdapterManager::GetInstance().GetRenderSink(id, tryCreate);
209 }
210 
GetSourceByProp(HdiIdType type,const std::string & info=HDI_ID_INFO_DEFAULT,bool tryCreate=false)211 static inline std::shared_ptr<IAudioCaptureSource> GetSourceByProp(HdiIdType type, const std::string &info =
212     HDI_ID_INFO_DEFAULT, bool tryCreate = false)
213 {
214     uint32_t id = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_CAPTURE, type, info);
215     return HdiAdapterManager::GetInstance().GetCaptureSource(id, tryCreate);
216 }
217 
UpdateArmInstance(std::shared_ptr<IAudioRenderSink> & sink,std::shared_ptr<IAudioCaptureSource> & source)218 static void UpdateArmInstance(std::shared_ptr<IAudioRenderSink> &sink,
219     std::shared_ptr<IAudioCaptureSource> &source)
220 {
221     sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB, true);
222     source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB, true);
223     std::shared_ptr<IAudioRenderSink> primarySink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
224     CHECK_AND_RETURN_LOG(primarySink, "primarySink is nullptr!");
225     primarySink->ResetActiveDeviceForDisconnect(DEVICE_TYPE_NONE);
226 }
227 
SetAudioSceneForAllSource(AudioScene audioScene)228 static void SetAudioSceneForAllSource(AudioScene audioScene)
229 {
230     std::shared_ptr<IAudioCaptureSource> usbSource = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
231     if (usbSource != nullptr && usbSource->IsInited()) {
232         usbSource->SetAudioScene(audioScene);
233     }
234     std::shared_ptr<IAudioCaptureSource> accSource = GetSourceByProp(HDI_ID_TYPE_ACCESSORY, HDI_ID_INFO_ACCESSORY);
235     if (accSource != nullptr && accSource->IsInited()) {
236         accSource->SetAudioScene(audioScene);
237     }
238     std::shared_ptr<IAudioCaptureSource> primarySource = GetSourceByProp(HDI_ID_TYPE_PRIMARY);
239     if (primarySource != nullptr && primarySource->IsInited()) {
240         primarySource->SetAudioScene(audioScene);
241     }
242 #ifdef SUPPORT_LOW_LATENCY
243     std::shared_ptr<IAudioCaptureSource> fastSource = GetSourceByProp(HDI_ID_TYPE_FAST, HDI_ID_INFO_DEFAULT, true);
244     if (fastSource != nullptr && fastSource->IsInited()) {
245         fastSource->SetAudioScene(audioScene);
246     }
247     std::shared_ptr<IAudioCaptureSource> fastVoipSource = GetSourceByProp(HDI_ID_TYPE_FAST, HDI_ID_INFO_VOIP, true);
248     if (fastVoipSource != nullptr && fastVoipSource->IsInited()) {
249         fastVoipSource->SetAudioScene(audioScene);
250     }
251 #endif
252     std::shared_ptr<IAudioCaptureSource> a2dpInSource = GetSourceByProp(HDI_ID_TYPE_BLUETOOTH);
253     if (a2dpInSource != nullptr && a2dpInSource->IsInited()) {
254         a2dpInSource->SetAudioScene(audioScene);
255     }
256 }
257 
SetAudioSceneForAllSink(AudioScene audioScene,bool scoExcludeFlag)258 static void SetAudioSceneForAllSink(AudioScene audioScene, bool scoExcludeFlag)
259 {
260     std::shared_ptr<IAudioRenderSink> usbSink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
261     if (usbSink != nullptr && usbSink->IsInited()) {
262         usbSink->SetAudioScene(audioScene, scoExcludeFlag);
263     }
264     std::shared_ptr<IAudioRenderSink> primarySink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
265     if (primarySink != nullptr && primarySink->IsInited()) {
266         primarySink->SetAudioScene(audioScene, scoExcludeFlag);
267     }
268 }
269 
UpdateDeviceForAllSource(std::shared_ptr<IAudioCaptureSource> & source,DeviceType type)270 static void UpdateDeviceForAllSource(std::shared_ptr<IAudioCaptureSource> &source, DeviceType type)
271 {
272     if (source == nullptr || !source->IsInited()) {
273         AUDIO_WARNING_LOG("Capturer is not initialized.");
274     } else {
275         source->UpdateActiveDevice(type);
276     }
277 #ifdef SUPPORT_LOW_LATENCY
278     std::shared_ptr<IAudioCaptureSource> fastSource = GetSourceByProp(HDI_ID_TYPE_FAST, HDI_ID_INFO_DEFAULT, true);
279     if (fastSource != nullptr && fastSource->IsInited()) {
280         fastSource->UpdateActiveDevice(type);
281     }
282     std::shared_ptr<IAudioCaptureSource> fastVoipSource = GetSourceByProp(HDI_ID_TYPE_FAST, HDI_ID_INFO_VOIP, true);
283     if (fastVoipSource != nullptr && fastVoipSource->IsInited()) {
284         fastVoipSource->UpdateActiveDevice(type);
285     }
286 #endif
287 }
288 
289 // std::vector<StringPair> -> std::vector<std::pair<std::string, std::string>>
ConvertStringPair(const std::vector<StringPair> & stringPair)290 static std::vector<std::pair<std::string, std::string>> ConvertStringPair(const std::vector<StringPair> &stringPair)
291 {
292     std::vector<std::pair<std::string, std::string>> result;
293     for (const auto &it : stringPair) {
294         result.emplace_back(it.firstParam, it.secondParam);
295     }
296     return result;
297 }
298 
299 // std::vector<std::pair<std::string, std::string>> -> std::vector<StringPair>
ConvertStringPair(const std::vector<std::pair<std::string,std::string>> & result)300 static std::vector<StringPair> ConvertStringPair(const std::vector<std::pair<std::string, std::string>> &result)
301 {
302     std::vector<StringPair> stringPair;
303     for (auto it = result.begin(); it != result.end(); it++) {
304         stringPair.push_back({it->first, it->second});
305     }
306     return stringPair;
307 }
308 
OnRemoteDied(const wptr<IRemoteObject> & remote)309 void ProxyDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
310 {
311     CHECK_AND_RETURN_LOG(audioServer_ != nullptr, "audioServer is nullptr!");
312     audioServer_->RemoveRendererDataTransferCallback(pid_);
313     AudioStreamMonitor::GetInstance().OnCallbackAppDied(pid_);
314 }
315 
PipeInfoGuard(uint32_t sessionId)316 PipeInfoGuard::PipeInfoGuard(uint32_t sessionId)
317 {
318     AUDIO_INFO_LOG("SessionId: %{public}u", sessionId);
319     sessionId_ = sessionId;
320 }
321 
~PipeInfoGuard()322 PipeInfoGuard::~PipeInfoGuard()
323 {
324     if (releaseFlag_) {
325         CoreServiceHandler::GetInstance().UpdateSessionOperation(sessionId_, SESSION_OPERATION_RELEASE,
326             SESSION_OP_MSG_REMOVE_PIPE);
327     }
328 }
329 
SetReleaseFlag(bool flag)330 void PipeInfoGuard::SetReleaseFlag(bool flag)
331 {
332     AUDIO_INFO_LOG("Flag: %{public}d", flag);
333     releaseFlag_ = flag;
334 }
335 
336 class CapturerStateOb final : public IAudioSourceCallback {
337 public:
CapturerStateOb(uint32_t captureId,std::function<void (bool,size_t,size_t)> callback)338     explicit CapturerStateOb(uint32_t captureId, std::function<void(bool, size_t, size_t)> callback)
339         : captureId_(captureId), callback_(callback)
340     {
341     }
342 
~CapturerStateOb()343     ~CapturerStateOb() override final
344     {
345     }
346 
OnCaptureState(bool isActive)347     void OnCaptureState(bool isActive) override final
348     {
349         std::lock_guard<std::mutex> lock(captureIdMtx_);
350         auto preNum = captureIds_.size();
351         if (isActive) {
352             captureIds_.insert(captureId_);
353         } else {
354             captureIds_.erase(captureId_);
355         }
356         auto curNum = captureIds_.size();
357         AUDIO_INFO_LOG("captureId: %{public}u, preNum: %{public}zu, curNum: %{public}zu, isActive: %{public}d",
358             captureId_, preNum, curNum, isActive);
359         callback_(isActive, preNum, curNum);
360     }
361 
362 private:
363     static inline std::unordered_set<uint32_t> captureIds_;
364     static inline std::mutex captureIdMtx_;
365 
366     uint32_t captureId_;
367     // callback to audioserver
368     std::function<void(bool, size_t, size_t)> callback_;
369 };
370 
371 REGISTER_SYSTEM_ABILITY_BY_ID(AudioServer, AUDIO_DISTRIBUTED_SERVICE_ID, true)
372 
373 #ifdef SUPPORT_OLD_ENGINE
374 #ifdef PA
375 constexpr int PA_ARG_COUNT = 1;
376 
paDaemonThread(void * arg)377 void *AudioServer::paDaemonThread(void *arg)
378 {
379     /* Load the mandatory pulseaudio modules at start */
380     char *argv[] = {
381         (char*)"pulseaudio",
382     };
383     // set audio thread priority
384     ScheduleThreadInServer(getpid(), gettid());
385     paDaemonTid_ = static_cast<uint32_t>(gettid());
386     AUDIO_INFO_LOG("Calling ohos_pa_main\n");
387     ohos_pa_main(PA_ARG_COUNT, argv);
388     AUDIO_INFO_LOG("Exiting ohos_pa_main\n");
389     UnscheduleThreadInServer(getpid(), gettid());
390     _exit(-1);
391 }
392 #endif
393 #endif // SUPPORT_OLD_ENGINE
394 
AudioServer(int32_t systemAbilityId,bool runOnCreate)395 AudioServer::AudioServer(int32_t systemAbilityId, bool runOnCreate)
396     : SystemAbility(systemAbilityId, runOnCreate),
397     audioEffectServer_(std::make_unique<AudioEffectServer>())
398 {
399     AudioStreamMonitor::GetInstance().SetAudioServerPtr(this);
400 }
401 
OnDump()402 void AudioServer::OnDump() {}
403 
Dump(int32_t fd,const std::vector<std::u16string> & args)404 int32_t AudioServer::Dump(int32_t fd, const std::vector<std::u16string> &args)
405 {
406     AUDIO_INFO_LOG("Dump Process Invoked");
407     if (args.size() == FAST_DUMPINFO_LEN && args[0] == u"-fb") {
408         std::string bundleName = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(args[1]);
409         std::string result;
410         GetAudioParameter(CHECK_FAST_BLOCK_PREFIX + bundleName, result);
411         std::string dumpString = "check fast list :bundle name is" + bundleName + " result is " + result + "\n";
412         return write(fd, dumpString.c_str(), dumpString.size());
413     }
414 
415     if (args.size() == 1 && args[0] == u"-dfl") {
416         std::string dumpString;
417         AudioService::GetInstance()->DumpForegroundList(dumpString);
418         return write(fd, dumpString.c_str(), dumpString.size());
419     }
420 
421     std::queue<std::u16string> argQue;
422     for (decltype(args.size()) index = 0; index < args.size(); ++index) {
423         argQue.push(args[index]);
424     }
425     std::string dumpString;
426     int32_t res = 0;
427 #ifdef SUPPORT_OLD_ENGINE
428     int32_t engineFlag = GetEngineFlag();
429     if (engineFlag == 1) {
430         if (hpaeDumpObj_ == nullptr) {
431             hpaeDumpObj_ = std::make_shared<AudioServerHpaeDump>();
432         }
433         res = hpaeDumpObj_->Initialize();
434         CHECK_AND_RETURN_RET_LOG(res == AUDIO_DUMP_SUCCESS, AUDIO_DUMP_INIT_ERR,
435             "Audio Service Hpae Dump Not Initialed");
436         hpaeDumpObj_->AudioDataDump(dumpString, argQue);
437     } else {
438         AudioServerDump dumpObj;
439         res = dumpObj.Initialize();
440         CHECK_AND_RETURN_RET_LOG(res == AUDIO_DUMP_SUCCESS, AUDIO_DUMP_INIT_ERR,
441             "Audio Service Dump Not initialised\n");
442         dumpObj.AudioDataDump(dumpString, argQue);
443     }
444 #else
445     if (hpaeDumpObj_ == nullptr) {
446         hpaeDumpObj_ = std::make_shared<AudioServerHpaeDump>();
447     }
448     res = hpaeDumpObj_->Initialize();
449     CHECK_AND_RETURN_RET_LOG(res == SUCCESS, ERROR,
450         "Audio Service Hpae Dump Not Initialed");
451     hpaeDumpObj_->AudioDataDump(dumpString, argQue);
452 #endif // SUPPORT_OLD_ENGINE
453     return write(fd, dumpString.c_str(), dumpString.size());
454 }
455 
RemoveRendererDataTransferCallback(const int32_t & pid)456 void AudioServer::RemoveRendererDataTransferCallback(const int32_t &pid)
457 {
458     std::lock_guard<std::mutex> lock(audioDataTransferMutex_);
459     if (audioDataTransferCbMap_.count(pid) > 0) {
460         audioDataTransferCbMap_.erase(pid);
461     }
462 }
463 
RegisterDataTransferCallback(const sptr<IRemoteObject> & object)464 int32_t AudioServer::RegisterDataTransferCallback(const sptr<IRemoteObject> &object)
465 {
466     bool result = PermissionUtil::VerifySystemPermission();
467     CHECK_AND_RETURN_RET_LOG(result, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
468     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "AudioServer:set listener object is nullptr");
469 
470     std::lock_guard<std::mutex> lock(audioDataTransferMutex_);
471 
472     sptr<IStandardAudioServerManagerListener> listener = iface_cast<IStandardAudioServerManagerListener>(object);
473 
474     CHECK_AND_RETURN_RET_LOG(listener != nullptr, ERR_INVALID_PARAM, "AudioServer: listener obj cast failed");
475 
476     std::shared_ptr<DataTransferStateChangeCallbackInner> callback =
477     std::make_shared<AudioManagerListenerCallback>(listener);
478     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "AudioPolicyServer: failed to  create cb obj");
479 
480     int32_t pid = IPCSkeleton::GetCallingPid();
481     sptr<ProxyDeathRecipient> recipient = new ProxyDeathRecipient(pid, this);
482     object->AddDeathRecipient(recipient);
483     audioDataTransferCbMap_[pid] = callback;
484     AUDIO_INFO_LOG("Pid: %{public}d registerDataTransferCallback done", pid);
485     return SUCCESS;
486 }
487 
RegisterDataTransferMonitorParam(int32_t callbackId,const DataTransferMonitorParam & param)488 int32_t AudioServer::RegisterDataTransferMonitorParam(int32_t callbackId,
489     const DataTransferMonitorParam &param)
490 {
491     bool result = PermissionUtil::VerifySystemPermission();
492     CHECK_AND_RETURN_RET_LOG(result, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
493     int32_t pid = IPCSkeleton::GetCallingPid();
494     AudioStreamMonitor::GetInstance().RegisterAudioRendererDataTransferStateListener(
495         param, pid, callbackId);
496     AUDIO_INFO_LOG("Register end, pid = %{public}d, callbackId = %{public}d",
497         pid, callbackId);
498     return SUCCESS;
499 }
500 
UnregisterDataTransferMonitorParam(int32_t callbackId)501 int32_t AudioServer::UnregisterDataTransferMonitorParam(int32_t callbackId)
502 {
503     bool result = PermissionUtil::VerifySystemPermission();
504     CHECK_AND_RETURN_RET_LOG(result, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
505     int32_t pid = IPCSkeleton::GetCallingPid();
506     AudioStreamMonitor::GetInstance().UnregisterAudioRendererDataTransferStateListener(
507         pid, callbackId);
508     AUDIO_INFO_LOG("Unregister end, pid = %{public}d, callbackId = %{public}d",
509         pid, callbackId);
510     return SUCCESS;
511 }
512 
OnDataTransferStateChange(const int32_t & pid,const int32_t & callbackId,const AudioRendererDataTransferStateChangeInfo & info)513 void AudioServer::OnDataTransferStateChange(const int32_t &pid, const int32_t &callbackId,
514     const AudioRendererDataTransferStateChangeInfo &info)
515 {
516     std::shared_ptr<DataTransferStateChangeCallbackInner> callback = nullptr;
517     {
518         std::lock_guard<std::mutex> lock(audioDataTransferMutex_);
519         if (audioDataTransferCbMap_.count(pid) > 0) {
520             callback = audioDataTransferCbMap_[pid];
521         } else {
522             AUDIO_ERR_LOG("callback is null");
523             return;
524         }
525     }
526     callback->OnDataTransferStateChange(callbackId, info);
527 }
528 
OnMuteStateChange(const int32_t & pid,const int32_t & callbackId,const int32_t & uid,const uint32_t & sessionId,const bool & isMuted)529 void AudioServer::OnMuteStateChange(const int32_t &pid, const int32_t &callbackId,
530     const int32_t &uid, const uint32_t &sessionId, const bool &isMuted)
531 {
532     std::shared_ptr<DataTransferStateChangeCallbackInner> callback = nullptr;
533     {
534         std::lock_guard<std::mutex> lock(audioDataTransferMutex_);
535         CHECK_AND_RETURN_LOG(audioDataTransferCbMap_.find(pid) != audioDataTransferCbMap_.end(),
536             "pid:%{public}d no callback in CbMap", pid);
537         callback = audioDataTransferCbMap_[pid];
538     }
539     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is null");
540     callback->OnMuteStateChange(callbackId, uid, sessionId, isMuted);
541 }
542 
RegisterDataTransferStateChangeCallback()543 void AudioServer::RegisterDataTransferStateChangeCallback()
544 {
545     DataTransferMonitorParam param;
546     param.clientUID = CHECK_ALL_RENDER_UID;
547     param.badDataTransferTypeBitMap = (1 << NO_DATA_TRANS);
548     param.timeInterval = RENDER_DETECTION_CYCLE_NS;
549     param.badFramesRatio = RENDER_BAD_FRAMES_RATIO;
550 
551     std::lock_guard<std::mutex> lock(audioDataTransferMutex_);
552 
553     std::shared_ptr<DataTransferStateChangeCallbackInnerImpl> callback =
554         std::make_shared<DataTransferStateChangeCallbackInnerImpl>();
555     CHECK_AND_RETURN_LOG(callback != nullptr, "AudioPolicyServer: failed to  create cb obj");
556 
557     int32_t pid = IPCSkeleton::GetCallingPid();
558     callback->SetDataTransferMonitorParam(param);
559     audioDataTransferCbMap_[pid] = callback;
560     int32_t ret = AudioStreamMonitor::GetInstance().RegisterAudioRendererDataTransferStateListener(
561         param, pid, -1);
562     CHECK_AND_RETURN_LOG(ret == SUCCESS, "register fail");
563     AUDIO_INFO_LOG("pid: %{public}d RegisterDataTransferStateChangeCallback done", pid);
564 }
565 
SetDataTransferMonitorParam(const DataTransferMonitorParam & param)566 void DataTransferStateChangeCallbackInnerImpl::SetDataTransferMonitorParam(
567     const DataTransferMonitorParam &param)
568 {
569     param_.clientUID = param.clientUID;
570     param_.badDataTransferTypeBitMap = param.badDataTransferTypeBitMap;
571     param_.timeInterval = param.timeInterval;
572     param_.badFramesRatio = param.badFramesRatio;
573 }
574 
OnDataTransferStateChange(const int32_t & callbackId,const AudioRendererDataTransferStateChangeInfo & info)575 void DataTransferStateChangeCallbackInnerImpl::OnDataTransferStateChange(
576     const int32_t &callbackId, const AudioRendererDataTransferStateChangeInfo &info)
577 {
578     if (info.stateChangeType == DATA_TRANS_STOP) {
579         ReportEvent(info);
580         std::string bundleName = AppBundleManager::GetBundleNameFromUid(info.clientUID);
581         CHECK_AND_RETURN_LOG(AudioService::GetInstance()->InRenderWhitelist(bundleName),
582             "%{public}s not in whitelist", bundleName.c_str());
583         if (((info.streamUsage == STREAM_USAGE_VOICE_COMMUNICATION) ||
584             (info.streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION) ||
585             (info.streamUsage == STREAM_USAGE_NOTIFICATION_RINGTONE) ||
586             (info.streamUsage == STREAM_USAGE_RINGTONE) ||
587             (info.streamUsage == STREAM_USAGE_NOTIFICATION)) && info.isBackground) {
588             int32_t ret = PolicyHandler::GetInstance().ClearAudioFocusBySessionID(info.sessionId);
589             CHECK_AND_RETURN_LOG(ret == SUCCESS, "focus clear fail");
590         }
591     }
592 }
593 
ReportEvent(const AudioRendererDataTransferStateChangeInfo & info)594 void DataTransferStateChangeCallbackInnerImpl::ReportEvent(
595     const AudioRendererDataTransferStateChangeInfo &info)
596 {
597     std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
598         Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::STREAM_OCCUPANCY,
599         Media::MediaMonitor::EventType::DURATION_AGGREGATION_EVENT);
600     CHECK_AND_RETURN_LOG(bean != nullptr, "bean is nullptr");
601 
602     bean->Add("IS_PLAYBACK", 1);
603     bean->Add("SESSIONID", static_cast<int32_t>(info.sessionId));
604     bean->Add("UID", info.clientUID);
605     bean->Add("STREAM_OR_SOURCE_TYPE", info.streamUsage);
606     bean->Add("START_TIME", static_cast<uint64_t>(0));
607     bean->Add("UPLOAD_TIME", static_cast<uint64_t>(0));
608     Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
609 }
610 
InitMaxRendererStreamCntPerUid()611 void AudioServer::InitMaxRendererStreamCntPerUid()
612 {
613     bool result = GetSysPara("const.multimedia.audio.stream_cnt_uid", maxRendererStreamCntPerUid_);
614     if (!result || maxRendererStreamCntPerUid_ <= 0) {
615         maxRendererStreamCntPerUid_ = MAX_RENDERER_STREAM_CNT_PER_UID;
616     }
617 }
618 
OnStart()619 void AudioServer::OnStart()
620 {
621     AUDIO_INFO_LOG("OnStart uid:%{public}d", getuid());
622     DlopenUtils::Init();
623     InitMaxRendererStreamCntPerUid();
624     AudioInnerCall::GetInstance()->RegisterAudioServer(this);
625     bool res = Publish(this);
626     if (!res) {
627         AUDIO_ERR_LOG("start err");
628         WriteServiceStartupError();
629     }
630     int32_t fastControlFlag = 1; // default 1, set isFastControlled_ true
631     GetSysPara("persist.multimedia.audioflag.fastcontrolled", fastControlFlag);
632     if (fastControlFlag == 0) {
633         isFastControlled_ = false;
634     }
635     int32_t audioCacheState = 0;
636     GetSysPara("persist.multimedia.audio.audioCacheState", audioCacheState);
637     if (audioCacheState != 0) {
638         AudioCacheMgr::GetInstance().Init();
639     }
640     AddSystemAbilityListener(AUDIO_POLICY_SERVICE_ID);
641     AddSystemAbilityListener(RES_SCHED_SYS_ABILITY_ID);
642 #ifdef SUPPORT_OLD_ENGINE
643     int32_t engineFlag = GetEngineFlag();
644     if (engineFlag == 1) {
645         HPAE::IHpaeManager::GetHpaeManager().Init();
646         AUDIO_INFO_LOG("IHpaeManager Init\n");
647     } else {
648 #ifdef PA
649         int32_t ret = pthread_create(&m_paDaemonThread, nullptr, AudioServer::paDaemonThread, nullptr);
650         pthread_setname_np(m_paDaemonThread, "OS_PaDaemon");
651         if (ret != 0) {
652             AUDIO_ERR_LOG("pthread_create failed %d", ret);
653             WriteServiceStartupError();
654         }
655         AUDIO_DEBUG_LOG("Created paDaemonThread\n");
656 #endif // PA
657     }
658 #else
659     HPAE::IHpaeManager::GetHpaeManager().Init();
660     AUDIO_INFO_LOG("IHpaeManager Init\n");
661 #endif // SUPPORT_OLD_ENGINE
662     RegisterAudioCapturerSourceCallback();
663     RegisterAudioRendererSinkCallback();
664     ParseAudioParameter();
665     NotifyProcessStatus();
666     DlopenUtils::DeInit();
667     RegisterDataTransferStateChangeCallback();
668 }
669 
ParseAudioParameter()670 void AudioServer::ParseAudioParameter()
671 {
672     std::unique_ptr<AudioParamParser> audioParamParser = make_unique<AudioParamParser>();
673     if (audioParamParser == nullptr) {
674         WriteServiceStartupError();
675     }
676     CHECK_AND_RETURN_LOG(audioParamParser != nullptr, "Failed to create audio extra parameters parser");
677     if (audioParamParser->LoadConfiguration(audioParameterKeys)) {
678         AUDIO_INFO_LOG("Audio extra parameters load configuration successfully.");
679     }
680     isAudioParameterParsed_.store(true);
681 
682     {
683         std::unique_lock<std::mutex> lock(audioParameterCacheMutex_);
684         for (const auto &pair : audioExtraParameterCacheVector_) {
685             std::vector<StringPair> params = ConvertStringPair(pair.second);
686             SetExtraParameters(pair.first, params);
687         }
688         audioExtraParameterCacheVector_.clear();
689     }
690     AUDIO_INFO_LOG("Audio extra parameters replay cached successfully.");
691     PermissionUtil::UpdateBGSet();
692 }
693 
WriteServiceStartupError()694 void AudioServer::WriteServiceStartupError()
695 {
696     Trace trace("SYSEVENT FAULT EVENT AUDIO_SERVICE_STARTUP_ERROR, SERVICE_ID: "
697             + std::to_string(Media::MediaMonitor::AUDIO_SERVER_ID) + ", ERROR_CODE: "
698             + std::to_string(Media::MediaMonitor::AUDIO_SERVER));
699     std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
700         Media::MediaMonitor::AUDIO, Media::MediaMonitor::AUDIO_SERVICE_STARTUP_ERROR,
701         Media::MediaMonitor::FAULT_EVENT);
702     bean->Add("SERVICE_ID", static_cast<int32_t>(Media::MediaMonitor::AUDIO_SERVER_ID));
703     bean->Add("ERROR_CODE", static_cast<int32_t>(Media::MediaMonitor::AUDIO_SERVER));
704     Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
705 }
706 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)707 void AudioServer::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
708 {
709     AUDIO_DEBUG_LOG("systemAbilityId:%{public}d", systemAbilityId);
710     switch (systemAbilityId) {
711         case AUDIO_POLICY_SERVICE_ID:
712             AUDIO_INFO_LOG("input service start");
713             RegisterPolicyServerDeathRecipient();
714             break;
715         case RES_SCHED_SYS_ABILITY_ID:
716             AUDIO_INFO_LOG("ressched service start");
717             OnAddResSchedService(getpid());
718             break;
719         default:
720             AUDIO_ERR_LOG("unhandled sysabilityId:%{public}d", systemAbilityId);
721             break;
722     }
723 }
724 
OnStop()725 void AudioServer::OnStop()
726 {
727     AUDIO_DEBUG_LOG("OnStop");
728 }
729 
SetPcmDumpParameter(const std::vector<std::pair<std::string,std::string>> & params)730 bool AudioServer::SetPcmDumpParameter(const std::vector<std::pair<std::string, std::string>> &params)
731 {
732     bool ret = VerifyClientPermission(DUMP_AUDIO_PERMISSION);
733     CHECK_AND_RETURN_RET_LOG(ret, false, "set audiodump parameters failed: no permission.");
734     CHECK_AND_RETURN_RET_LOG(params.size() > 0, false, "params is empty!");
735     return AudioCacheMgr::GetInstance().SetDumpParameter(params);
736 }
737 
738 // LCOV_EXCL_START
SetEffectLiveParameter(const std::vector<std::pair<std::string,std::string>> & params)739 bool AudioServer::SetEffectLiveParameter(const std::vector<std::pair<std::string, std::string>> &params)
740 {
741     CHECK_AND_RETURN_RET_LOG(params.size() > 0, false, "params is empty!");
742     int32_t engineFlag = GetEngineFlag();
743     if (engineFlag == 1) {
744         return HPAE::IHpaeManager::GetHpaeManager().SetEffectLiveParameter(params);
745     }
746     AUDIO_INFO_LOG("SetEffectLiveParameter not support");
747     return false;
748 }
749 
SetExtraParameters(const std::string & key,const std::vector<StringPair> & kvpairs)750 int32_t AudioServer::SetExtraParameters(const std::string &key,
751     const std::vector<StringPair> &kvpairs)
752 {
753     CHECK_AND_RETURN_RET_LOG(kvpairs.size() >= 0 && kvpairs.size() <= AUDIO_EXTRA_PARAMETERS_COUNT_UPPER_LIMIT,
754         AUDIO_ERR, "Set extra audio parameters failed");
755     bool ret = PermissionUtil::VerifySystemPermission();
756     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "set extra parameters failed: not system app.");
757     ret = VerifyClientPermission(MODIFY_AUDIO_SETTINGS_PERMISSION);
758     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "set extra parameters failed: no permission.");
759     std::vector<std::pair<std::string, std::string>> newPair = ConvertStringPair(kvpairs);
760     if (key == EFFECT_LIVE_KEY) {
761         ret = SetEffectLiveParameter(newPair);
762         CHECK_AND_RETURN_RET_LOG(ret, ERROR, "set effect live parameters failed.");
763         return SUCCESS;
764     }
765 
766     if (key == PCM_DUMP_KEY) {
767         ret = SetPcmDumpParameter(newPair);
768         CHECK_AND_RETURN_RET_LOG(ret, ERROR, "set audiodump parameters failed");
769         return SUCCESS;
770     }
771 
772     CHECK_AND_RETURN_RET_LOG(!CacheExtraParameters(key, newPair), ERROR, "cached");
773 
774     if (audioParameterKeys.empty()) {
775         AUDIO_ERR_LOG("audio extra parameters mainKey and subKey is empty");
776         return ERROR;
777     }
778 
779     auto mainKeyIt = audioParameterKeys.find(key);
780     if (mainKeyIt == audioParameterKeys.end()) {
781         return ERR_INVALID_PARAM;
782     }
783 
784     std::string value;
785     bool isParamValid = ProcessKeyValuePairs(key, newPair, mainKeyIt->second, value);
786     CHECK_AND_RETURN_RET_LOG(isParamValid, ERR_INVALID_PARAM, "invalid subkey or value");
787 
788     HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
789     std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
790     CHECK_AND_RETURN_RET_LOG(deviceManager != nullptr, ERROR, "local device manager is nullptr");
791     deviceManager->SetAudioParameter("primary", AudioParamKey::NONE, "", value);
792     return SUCCESS;
793 }
794 // LCOV_EXCL_STOP
795 
ProcessKeyValuePairs(const std::string & key,const std::vector<std::pair<std::string,std::string>> & kvpairs,const std::unordered_map<std::string,std::set<std::string>> & subKeyMap,std::string & value)796 bool AudioServer::ProcessKeyValuePairs(const std::string &key,
797     const std::vector<std::pair<std::string, std::string>> &kvpairs,
798     const std::unordered_map<std::string, std::set<std::string>> &subKeyMap, std::string &value)
799 {
800     for (auto it = kvpairs.begin(); it != kvpairs.end(); it++) {
801         auto subKeyIt = subKeyMap.find(it->first);
802         if (subKeyIt != subKeyMap.end()) {
803             value += it->first + "=" + it->second + ";";
804             if (it->first == "unprocess_audio_effect") {
805                 int appUid = IPCSkeleton::GetCallingUid();
806                 AUDIO_INFO_LOG("add unprocess UID [%{public}d]", appUid);
807                 IStreamManager::GetRecorderManager().AddUnprocessStream(appUid);
808                 continue;
809             }
810             auto valueIter = subKeyIt->second.find("effect");
811             if (valueIter != subKeyIt->second.end()) {
812                 RecognizeAudioEffectType(key, it->first, it->second);
813             }
814         } else {
815             return false;
816         }
817     }
818     return true;
819 }
820 
CacheExtraParameters(const std::string & key,const std::vector<std::pair<std::string,std::string>> & kvpairs)821 bool AudioServer::CacheExtraParameters(const std::string &key,
822     const std::vector<std::pair<std::string, std::string>> &kvpairs)
823 {
824     if (!isAudioParameterParsed_.load()) {
825         std::unique_lock<std::mutex> lock(audioParameterCacheMutex_);
826         if (!isAudioParameterParsed_.load()) {
827             AUDIO_INFO_LOG("Audio extra parameters will be cached");
828             std::pair<std::string,
829                 std::vector<std::pair<std::string, std::string>>> cache(key, kvpairs);
830             audioExtraParameterCacheVector_.push_back(cache);
831 
832             return true;
833         }
834     }
835 
836     return false;
837 }
838 
SetA2dpAudioParameter(const std::string & renderValue)839 void AudioServer::SetA2dpAudioParameter(const std::string &renderValue)
840 {
841     auto parmKey = AudioParamKey::A2DP_SUSPEND_STATE;
842 
843     std::shared_ptr<IAudioRenderSink> btSink = GetSinkByProp(HDI_ID_TYPE_BLUETOOTH);
844     CHECK_AND_RETURN_LOG(btSink != nullptr, "has no valid sink");
845     btSink->SetAudioParameter(parmKey, "", renderValue);
846 
847     if (AudioService::GetInstance()->HasBluetoothEndpoint()) {
848         std::shared_ptr<IAudioRenderSink> btFastSink = GetSinkByProp(HDI_ID_TYPE_BLUETOOTH, HDI_ID_INFO_MMAP);
849         CHECK_AND_RETURN_LOG(btFastSink != nullptr, "has no valid fast sink");
850         btFastSink->SetAudioParameter(parmKey, "", renderValue);
851         AUDIO_INFO_LOG("HasBlueToothEndpoint");
852     }
853 }
854 
SetAudioParameter(const std::string & key,const std::string & value)855 int32_t AudioServer::SetAudioParameter(const std::string &key, const std::string &value)
856 {
857     std::lock_guard<std::mutex> lockSet(audioParameterMutex_);
858     AudioXCollie audioXCollie("AudioServer::SetAudioParameter", TIME_OUT_SECONDS,
859          nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY);
860     AUDIO_DEBUG_LOG("server: set audio parameter");
861     if (key != "AUDIO_EXT_PARAM_KEY_A2DP_OFFLOAD_CONFIG") {
862         bool ret = VerifyClientPermission(MODIFY_AUDIO_SETTINGS_PERMISSION);
863         CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "MODIFY_AUDIO_SETTINGS permission denied");
864     } else {
865         CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
866             "A2dp offload modify audio settings permission denied");
867     }
868 
869     CHECK_AND_RETURN_RET_LOG(audioParameters.size() < PARAMETER_SET_LIMIT, ERR_INVALID_PARAM,
870         "SetAudioParameter failed! audioParameters_map is too large!");
871     AudioServer::audioParameters[key] = value;
872 
873     // send it to hal
874     if (key == "A2dpSuspended") {
875         std::string renderValue = key + "=" + value + ";";
876         SetA2dpAudioParameter(renderValue);
877         return SUCCESS;
878     }
879 
880     HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
881     std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
882     CHECK_AND_RETURN_RET_LOG(deviceManager != nullptr, ERROR, "local device manager is nullptr");
883 
884     AudioParamKey parmKey = AudioParamKey::NONE;
885     if (key == "AUDIO_EXT_PARAM_KEY_LOWPOWER") {
886         parmKey = AudioParamKey::PARAM_KEY_LOWPOWER;
887         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::AUDIO, "SMARTPA_LOWPOWER",
888             HiviewDFX::HiSysEvent::EventType::BEHAVIOR, "STATE", value == "SmartPA_lowpower=on" ? 1 : 0);
889     } else if (key == "bt_headset_nrec") {
890         parmKey = AudioParamKey::BT_HEADSET_NREC;
891     } else if (key == "bt_wbs") {
892         parmKey = AudioParamKey::BT_WBS;
893     } else if (key == "AUDIO_EXT_PARAM_KEY_A2DP_OFFLOAD_CONFIG") {
894         parmKey = AudioParamKey::A2DP_OFFLOAD_STATE;
895         std::string value_new = "a2dpOffloadConfig=" + value;
896         deviceManager->SetAudioParameter("primary", parmKey, "", value_new);
897         return SUCCESS;
898     } else if (key == "mmi") {
899         parmKey = AudioParamKey::MMI;
900     } else if (key == "perf_info") {
901         parmKey = AudioParamKey::PERF_INFO;
902     } else if (key == "mute_call") {
903         deviceManager->SetAudioParameter("primary", parmKey, "", key + "=" + value);
904         return SUCCESS;
905     } else {
906         AUDIO_ERR_LOG("key %{public}s is invalid for hdi interface", key.c_str());
907         return SUCCESS;
908     }
909     deviceManager->SetAudioParameter("primary", parmKey, "", value);
910     return SUCCESS;
911 }
912 
SuspendRenderSink(const std::string & sinkName)913 int32_t AudioServer::SuspendRenderSink(const std::string &sinkName)
914 {
915     if (!PermissionUtil::VerifyIsAudio()) {
916         AUDIO_ERR_LOG("not audio calling!");
917         return ERR_OPERATION_FAILED;
918     }
919     uint32_t id = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(sinkName.c_str());
920     std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(id);
921     CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "get sink fail, sinkName: %{public}s", sinkName.c_str());
922     return sink->SuspendRenderSink();
923 }
924 
RestoreRenderSink(const std::string & sinkName)925 int32_t AudioServer::RestoreRenderSink(const std::string &sinkName)
926 {
927     if (!PermissionUtil::VerifyIsAudio()) {
928         AUDIO_ERR_LOG("not audio calling!");
929         return ERR_OPERATION_FAILED;
930     }
931     uint32_t id = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(sinkName.c_str());
932     std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(id);
933     CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "get sink fail, sinkName: %{public}s", sinkName.c_str());
934     return sink->RestoreRenderSink();
935 }
936 
SetAudioParameter(const std::string & networkId,int32_t key,const std::string & condition,const std::string & value)937 int32_t AudioServer::SetAudioParameter(const std::string& networkId, int32_t key, const std::string& condition,
938     const std::string& value)
939 {
940     int32_t callingUid = IPCSkeleton::GetCallingUid();
941     bool ret = VerifyClientPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION);
942     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio() || ret, ERR_PERMISSION_DENIED,
943         "refused for %{public}d", callingUid);
944 
945     HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
946     std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_REMOTE);
947     CHECK_AND_RETURN_RET_LOG(deviceManager != nullptr, ERROR, "device manager is nullptr");
948     deviceManager->SetAudioParameter(networkId.c_str(), static_cast<AudioParamKey>(key), condition, value);
949     return SUCCESS;
950 }
951 
GetPcmDumpParameter(const std::vector<std::string> & subKeys,std::vector<std::pair<std::string,std::string>> & result)952 bool AudioServer::GetPcmDumpParameter(const std::vector<std::string> &subKeys,
953     std::vector<std::pair<std::string, std::string>> &result)
954 {
955     bool ret = VerifyClientPermission(DUMP_AUDIO_PERMISSION);
956     CHECK_AND_RETURN_RET_LOG(ret, false, "get audiodump parameters no permission");
957     CHECK_AND_RETURN_RET_LOG(subKeys.size() > 0, false, "subKeys is empty!");
958     return AudioCacheMgr::GetInstance().GetDumpParameter(subKeys, result);
959 }
960 
GetEffectLiveParameter(const std::vector<std::string> & subKeys,std::vector<std::pair<std::string,std::string>> & result)961 bool AudioServer::GetEffectLiveParameter(const std::vector<std::string> &subKeys,
962     std::vector<std::pair<std::string, std::string>> &result)
963 {
964     int32_t engineFlag = GetEngineFlag();
965     if (engineFlag == 1) {
966         return HPAE::IHpaeManager::GetHpaeManager().GetEffectLiveParameter(subKeys, result);
967     }
968     AUDIO_INFO_LOG("GetEffectLiveParameter not support");
969     return false;
970 }
971 
GetExtraParameters(const std::string & mainKey,const std::vector<std::string> & subKeys,std::vector<StringPair> & parameters)972 int32_t AudioServer::GetExtraParameters(const std::string &mainKey,
973     const std::vector<std::string> &subKeys, std::vector<StringPair> &parameters)
974 {
975     CHECK_AND_RETURN_RET_LOG(subKeys.size() >= 0 && subKeys.size() <= AUDIO_EXTRA_PARAMETERS_COUNT_UPPER_LIMIT,
976         AUDIO_ERR, "Get extra audio parameters failed");
977     std::vector<std::pair<std::string, std::string>> result;
978     int32_t res = GetExtraParametersInner(mainKey, subKeys, result);
979     if (res == SUCCESS) {
980         parameters = ConvertStringPair(result);
981     }
982     return res;
983 }
984 
GetExtraParametersInner(const std::string & mainKey,const std::vector<std::string> & subKeys,std::vector<std::pair<std::string,std::string>> & result)985 int32_t AudioServer::GetExtraParametersInner(const std::string &mainKey,
986     const std::vector<std::string> &subKeys, std::vector<std::pair<std::string, std::string>> &result)
987 {
988     if (mainKey == EFFECT_LIVE_KEY) {
989         bool ret = GetEffectLiveParameter(subKeys, result);
990         CHECK_AND_RETURN_RET_LOG(ret, ERROR, "get effect live parameters failed.");
991         return SUCCESS;
992     }
993     if (mainKey == PCM_DUMP_KEY) {
994         bool ret = GetPcmDumpParameter(subKeys, result);
995         CHECK_AND_RETURN_RET_LOG(ret, ERROR, "get audiodump parameters failed");
996         return SUCCESS;
997     }
998 
999     CHECK_AND_RETURN_RET_LOG(isAudioParameterParsed_.load(), ERROR, "audioParameterKeys is not ready");
1000 
1001     if (audioParameterKeys.empty()) {
1002         AUDIO_ERR_LOG("audio extra parameters mainKey and subKey is empty");
1003         return ERROR;
1004     }
1005 
1006     auto mainKeyIt = audioParameterKeys.find(mainKey);
1007     if (mainKeyIt == audioParameterKeys.end()) {
1008         return ERR_INVALID_PARAM;
1009     }
1010 
1011     HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
1012     std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
1013     CHECK_AND_RETURN_RET_LOG(deviceManager != nullptr, ERROR, "device manager is nullptr");
1014     std::unordered_map<std::string, std::set<std::string>> subKeyMap = mainKeyIt->second;
1015     if (subKeys.empty()) {
1016         for (auto it = subKeyMap.begin(); it != subKeyMap.end(); it++) {
1017             std::string value = deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, it->first);
1018             result.emplace_back(std::make_pair(it->first, value));
1019         }
1020         return SUCCESS;
1021     }
1022 
1023     bool match = true;
1024     for (auto it = subKeys.begin(); it != subKeys.end(); it++) {
1025         auto subKeyIt = subKeyMap.find(*it);
1026         if (subKeyIt != subKeyMap.end()) {
1027             std::string value = deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, *it);
1028             result.emplace_back(std::make_pair(*it, value));
1029         } else {
1030             match = false;
1031             break;
1032         }
1033     }
1034     if (!match) {
1035         result.clear();
1036         return ERR_INVALID_PARAM;
1037     }
1038     return SUCCESS;
1039 }
1040 
GetAudioParameter(const std::string & key,std::string & value)1041 int32_t AudioServer::GetAudioParameter(const std::string &key, std::string &value)
1042 {
1043     value = GetAudioParameterInner(key);
1044     return SUCCESS;
1045 }
1046 
GetAudioParameterInner(const std::string & key)1047 const std::string AudioServer::GetAudioParameterInner(const std::string &key)
1048 {
1049     if (IPCSkeleton::GetCallingUid() == MEDIA_SERVICE_UID) {
1050         return "";
1051     }
1052     std::lock_guard<std::mutex> lockSet(audioParameterMutex_);
1053     AudioXCollie audioXCollie("GetAudioParameter", TIME_OUT_SECONDS,
1054          nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY);
1055 
1056     HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
1057     std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
1058 
1059     if (deviceManager != nullptr) {
1060         AudioParamKey parmKey = AudioParamKey::NONE;
1061         if (key == "AUDIO_EXT_PARAM_KEY_LOWPOWER") {
1062             parmKey = AudioParamKey::PARAM_KEY_LOWPOWER;
1063             return deviceManager->GetAudioParameter("primary", AudioParamKey(parmKey), "");
1064         }
1065         if (key.find("need_change_usb_device#C", 0) == 0) {
1066             parmKey = AudioParamKey::USB_DEVICE;
1067             return deviceManager->GetAudioParameter("primary", AudioParamKey(parmKey), key);
1068         }
1069         if (key == "getSmartPAPOWER" || key == "show_RealTime_ChipModel") {
1070             return deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, key);
1071         }
1072         if (key == "perf_info") {
1073             return deviceManager->GetAudioParameter("primary", AudioParamKey::PERF_INFO, key);
1074         }
1075         if (key == "concurrent_capture_stream_info") {
1076             return deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, key);
1077         }
1078         if (key.size() < BUNDLENAME_LENGTH_LIMIT && key.size() > CHECK_FAST_BLOCK_PREFIX.size() &&
1079             key.substr(0, CHECK_FAST_BLOCK_PREFIX.size()) == CHECK_FAST_BLOCK_PREFIX) {
1080             return deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, key);
1081         }
1082 
1083         const std::string mmiPre = "mmi_";
1084         if (key.size() > mmiPre.size()) {
1085             if (key.substr(0, mmiPre.size()) == mmiPre) {
1086                 parmKey = AudioParamKey::MMI;
1087                 return deviceManager->GetAudioParameter("primary", AudioParamKey(parmKey),
1088                     key.substr(mmiPre.size(), key.size() - mmiPre.size()));
1089             }
1090         }
1091     }
1092 
1093     if (AudioServer::audioParameters.count(key)) {
1094         return AudioServer::audioParameters[key];
1095     } else {
1096         return "";
1097     }
1098 }
1099 
GetDPParameter(const std::string & condition)1100 const std::string AudioServer::GetDPParameter(const std::string &condition)
1101 {
1102     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DP, true);
1103     CHECK_AND_RETURN_RET_LOG(sink != nullptr, "", "get dp sink fail");
1104 
1105     return sink->GetAudioParameter(AudioParamKey::GET_DP_DEVICE_INFO, condition);
1106 }
1107 
GetUsbParameter(const std::string & condition)1108 const std::string AudioServer::GetUsbParameter(const std::string &condition)
1109 {
1110     AUDIO_INFO_LOG("AudioServer::GetUsbParameter Entry. condition=%{public}s", condition.c_str());
1111     string address = GetField(condition, "address", ' ');
1112     int32_t deviceRoleNum = static_cast<int32_t>(DEVICE_ROLE_NONE);
1113     std::string usbInfoStr;
1114     CHECK_AND_RETURN_RET_LOG(StringConverter(GetField(condition, "role", ' '), deviceRoleNum), usbInfoStr,
1115         "convert invalid value: %{public}s", GetField(condition, "role", ' ').c_str());
1116     DeviceRole role = static_cast<DeviceRole>(deviceRoleNum);
1117 
1118     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB, true);
1119     CHECK_AND_RETURN_RET_LOG(sink, "", "rendererSink is nullptr");
1120     std::string infoCond = std::string("get_usb_info#C") + GetField(address, "card", ';') + "D0";
1121     if (role == OUTPUT_DEVICE) {
1122         sink->SetAddress(address);
1123         auto it = usbInfoMap_.find(address);
1124         if (it == usbInfoMap_.end()) {
1125             usbInfoStr = sink->GetAudioParameter(USB_DEVICE, infoCond);
1126             usbInfoMap_[address] = usbInfoStr;
1127         } else {
1128             usbInfoStr = it->second;
1129         }
1130     } else if (role == INPUT_DEVICE) {
1131         std::shared_ptr<IAudioCaptureSource> source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB, true);
1132         CHECK_AND_RETURN_RET_LOG(source, "", "capturerSource is nullptr");
1133         source->SetAddress(address);
1134         auto it = usbInfoMap_.find(address);
1135         if (it == usbInfoMap_.end()) {
1136             usbInfoStr = sink->GetAudioParameter(USB_DEVICE, infoCond);
1137             usbInfoMap_[address] = usbInfoStr;
1138         } else {
1139             usbInfoStr = it->second;
1140         }
1141     } else {
1142         usbInfoMap_.erase(address);
1143     }
1144     AUDIO_INFO_LOG("infoCond=%{public}s, usbInfoStr=%{public}s", infoCond.c_str(), usbInfoStr.c_str());
1145     return usbInfoStr;
1146 }
1147 
GetAudioParameter(const std::string & networkId,int32_t key,const std::string & condition,std::string & value)1148 int32_t AudioServer::GetAudioParameter(const std::string& networkId, int32_t key,
1149     const std::string& condition, std::string& value)
1150 {
1151     int32_t callingUid = IPCSkeleton::GetCallingUid();
1152     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio() ||
1153         VerifyClientPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION), ERR_PERMISSION_DENIED,
1154         "refused for %{public}d", callingUid);
1155     value = GetAudioParameterInner(networkId, static_cast<AudioParamKey>(key), condition);
1156     return SUCCESS;
1157 }
1158 
GetAudioParameterInner(const std::string & networkId,const AudioParamKey key,const std::string & condition)1159 const std::string AudioServer::GetAudioParameterInner(const std::string& networkId, const AudioParamKey key,
1160     const std::string& condition)
1161 {
1162     if (networkId == LOCAL_NETWORK_ID) {
1163         AudioXCollie audioXCollie("GetAudioParameter", TIME_OUT_SECONDS,
1164             nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY);
1165         if (key == AudioParamKey::USB_DEVICE) {
1166             return GetUsbParameter(condition);
1167         }
1168         if (key == AudioParamKey::GET_DP_DEVICE_INFO) {
1169             return GetDPParameter(condition);
1170         }
1171     } else {
1172         std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_REMOTE, networkId);
1173         CHECK_AND_RETURN_RET_LOG(sink != nullptr, "", "get remote sink fail");
1174         return sink->GetAudioParameter(key, condition);
1175     }
1176     return "";
1177 }
1178 
GetTransactionId(int32_t deviceType,int32_t deviceRole,uint64_t & transactionId)1179 int32_t AudioServer::GetTransactionId(int32_t deviceType, int32_t deviceRole, uint64_t& transactionId)
1180 {
1181     AUDIO_DEBUG_LOG("device type: %{public}d, device role: %{public}d", deviceType, deviceRole);
1182     if (deviceRole != INPUT_DEVICE && deviceRole != OUTPUT_DEVICE) {
1183         AUDIO_ERR_LOG("AudioServer::GetTransactionId: error device role");
1184         transactionId =  static_cast<uint64_t>(ERR_INVALID_PARAM);
1185         return SUCCESS;
1186     }
1187     std::shared_ptr<IAudioCaptureSource> source = nullptr;
1188     if (deviceRole == INPUT_DEVICE) {
1189         if (deviceType == DEVICE_TYPE_USB_ARM_HEADSET) {
1190             source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
1191         } else {
1192             source = GetSourceByProp(HDI_ID_TYPE_PRIMARY);
1193         }
1194         if (source) {
1195             transactionId = source->GetTransactionId();
1196         }
1197         return SUCCESS;
1198     }
1199 
1200     // deviceRole OUTPUT_DEVICE
1201     std::shared_ptr<IAudioRenderSink> sink = nullptr;
1202     if (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP) {
1203         sink = GetSinkByProp(HDI_ID_TYPE_BLUETOOTH);
1204     } else if (deviceType == DEVICE_TYPE_USB_ARM_HEADSET) {
1205         sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
1206     } else {
1207         sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
1208     }
1209     int32_t ret = ERROR;
1210     if (sink != nullptr) {
1211         ret = sink->GetTransactionId(transactionId);
1212     }
1213 
1214     CHECK_AND_RETURN_RET_LOG(!ret, SUCCESS, "Get transactionId failed.");
1215 
1216     AUDIO_DEBUG_LOG("Transaction Id: %{public}" PRIu64, transactionId);
1217     return SUCCESS;
1218 }
1219 
1220 // LCOV_EXCL_START
SetMicrophoneMute(bool isMute)1221 int32_t AudioServer::SetMicrophoneMute(bool isMute)
1222 {
1223     int32_t callingUid = IPCSkeleton::GetCallingUid();
1224     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED, "refused for %{public}d",
1225         callingUid);
1226     auto limitFunc = [](uint32_t captureId) -> bool {
1227         std::string info = IdHandler::GetInstance().ParseInfo(captureId);
1228 #ifdef DAUDIO_ENABLE
1229         if (IdHandler::GetInstance().ParseType(captureId) == HDI_ID_TYPE_REMOTE) {
1230             return true;
1231         }
1232 #endif
1233         if (IdHandler::GetInstance().ParseType(captureId) == HDI_ID_TYPE_PRIMARY) {
1234             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_USB;
1235         }
1236         if (IdHandler::GetInstance().ParseType(captureId) == HDI_ID_TYPE_BLUETOOTH) {
1237             return info == HDI_ID_INFO_DEFAULT;
1238         }
1239         return false;
1240     };
1241     auto processFunc = [isMute, limitFunc](uint32_t captureId, std::shared_ptr<IAudioCaptureSource> source) -> int32_t {
1242         CHECK_AND_RETURN_RET(limitFunc(captureId), SUCCESS);
1243         CHECK_AND_RETURN_RET(source != nullptr, SUCCESS);
1244 
1245         source->SetMute(isMute);
1246         return SUCCESS;
1247     };
1248     (void)HdiAdapterManager::GetInstance().ProcessSource(processFunc);
1249     std::shared_ptr<IDeviceManager> deviceManager = HdiAdapterManager::GetInstance().GetDeviceManager(
1250         HDI_DEVICE_MANAGER_TYPE_LOCAL);
1251     if (deviceManager != nullptr) {
1252         deviceManager->AllAdapterSetMicMute(isMute);
1253     }
1254 
1255     int32_t ret = SetMicrophoneMuteForEnhanceChain(isMute);
1256     if (ret != SUCCESS) {
1257         AUDIO_WARNING_LOG("SetMicrophoneMuteForEnhanceChain failed.");
1258     }
1259     return SUCCESS;
1260 }
1261 
SetVoiceVolume(float volume)1262 int32_t AudioServer::SetVoiceVolume(float volume)
1263 {
1264     int32_t callingUid = IPCSkeleton::GetCallingUid();
1265     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
1266         callingUid);
1267     HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
1268     std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
1269 
1270     if (deviceManager == nullptr) {
1271         AUDIO_WARNING_LOG("device manager is null.");
1272     } else {
1273         return deviceManager->SetVoiceVolume("primary", volume);
1274     }
1275     return ERROR;
1276 }
1277 
OffloadSetVolume(float volume,const std::string & deviceClass,const std::string & networkId)1278 int32_t AudioServer::OffloadSetVolume(float volume, const std::string &deviceClass, const std::string &networkId)
1279 {
1280     int32_t callingUid = IPCSkeleton::GetCallingUid();
1281     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1282     std::string info = networkId == LOCAL_NETWORK_ID ? HDI_ID_INFO_DEFAULT : networkId;
1283     uint32_t id = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(deviceClass, info);
1284     std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(id);
1285     if (sink == nullptr) {
1286         AUDIO_ERR_LOG("Renderer is null.");
1287         return ERROR;
1288     }
1289     return sink->SetVolume(volume, volume);
1290 }
1291 
SetAudioScene(int32_t audioScene,int32_t a2dpOffloadFlag,bool scoExcludeFlag)1292 int32_t AudioServer::SetAudioScene(int32_t audioScene, int32_t a2dpOffloadFlag, bool scoExcludeFlag)
1293 {
1294     AUDIO_INFO_LOG("Scene: %{public}d, a2dpOffloadFlag: %{public}d, scoExcludeFlag: %{public}d",
1295         audioScene, a2dpOffloadFlag, scoExcludeFlag);
1296     int32_t callingUid = IPCSkeleton::GetCallingUid();
1297     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1298 
1299     return SetAudioSceneInner(static_cast<AudioScene>(audioScene), static_cast<BluetoothOffloadState>(a2dpOffloadFlag),
1300         scoExcludeFlag);
1301 }
1302 
SetAudioSceneInner(AudioScene audioScene,BluetoothOffloadState a2dpOffloadFlag,bool scoExcludeFlag)1303 int32_t AudioServer::SetAudioSceneInner(AudioScene audioScene, BluetoothOffloadState a2dpOffloadFlag,
1304     bool scoExcludeFlag)
1305 {
1306     std::lock_guard<std::mutex> lock(audioSceneMutex_);
1307     AudioXCollie audioXCollie("AudioServer::SetAudioScene", TIME_OUT_SECONDS,
1308          nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY);
1309 
1310     SetAudioSceneForAllSource(audioScene);
1311     SetAudioSceneForAllSink(audioScene, scoExcludeFlag);
1312 
1313     audioScene_ = audioScene;
1314     return SUCCESS;
1315 }
1316 // LCOV_EXCL_STOP
1317 
SetIORoutes(std::vector<std::pair<DeviceType,DeviceFlag>> & activeDevices,BluetoothOffloadState a2dpOffloadFlag,const std::string & deviceName)1318 int32_t AudioServer::SetIORoutes(std::vector<std::pair<DeviceType, DeviceFlag>> &activeDevices,
1319     BluetoothOffloadState a2dpOffloadFlag, const std::string &deviceName)
1320 {
1321     CHECK_AND_RETURN_RET_LOG(!activeDevices.empty() && activeDevices.size() <= AUDIO_CONCURRENT_ACTIVE_DEVICES_LIMIT,
1322         ERR_INVALID_PARAM, "Invalid audio devices.");
1323     DeviceType type = activeDevices.front().first;
1324     DeviceFlag flag = activeDevices.front().second;
1325 
1326     std::vector<DeviceType> deviceTypes;
1327     for (auto activeDevice : activeDevices) {
1328         deviceTypes.push_back(activeDevice.first);
1329     }
1330     AUDIO_INFO_LOG("SetIORoutes 1st deviceType: %{public}d, deviceSize : %{public}zu, flag: %{public}d",
1331         type, deviceTypes.size(), flag);
1332     int32_t ret = SetIORoutes(type, flag, deviceTypes, a2dpOffloadFlag, deviceName);
1333     return ret;
1334 }
1335 
SetIORoutes(DeviceType type,DeviceFlag flag,std::vector<DeviceType> deviceTypes,BluetoothOffloadState a2dpOffloadFlag,const std::string & deviceName)1336 int32_t AudioServer::SetIORoutes(DeviceType type, DeviceFlag flag, std::vector<DeviceType> deviceTypes,
1337     BluetoothOffloadState a2dpOffloadFlag, const std::string &deviceName)
1338 {
1339     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DEFAULT, true);
1340     std::shared_ptr<IAudioCaptureSource> source = nullptr;
1341 
1342     if (type == DEVICE_TYPE_USB_ARM_HEADSET) {
1343         UpdateArmInstance(sink, source);
1344     } else if (type == DEVICE_TYPE_ACCESSORY) {
1345         source = GetSourceByProp(HDI_ID_TYPE_ACCESSORY, HDI_ID_INFO_ACCESSORY, true);
1346     } else {
1347         source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DEFAULT, true);
1348         if (type == DEVICE_TYPE_BLUETOOTH_A2DP && a2dpOffloadFlag != A2DP_OFFLOAD) {
1349             deviceTypes[0] = DEVICE_TYPE_NONE;
1350         }
1351     }
1352     CHECK_AND_RETURN_RET_LOG(sink != nullptr || source != nullptr,
1353         ERR_INVALID_PARAM, "SetIORoutes failed for null instance!");
1354 
1355     std::lock_guard<std::mutex> lock(audioSceneMutex_);
1356     if (flag == DeviceFlag::INPUT_DEVICES_FLAG) {
1357         UpdateDeviceForAllSource(source, type);
1358     } else if (flag == DeviceFlag::OUTPUT_DEVICES_FLAG) {
1359         sink->UpdateActiveDevice(deviceTypes);
1360         PolicyHandler::GetInstance().SetActiveOutputDevice(type);
1361     } else if (flag == DeviceFlag::ALL_DEVICES_FLAG) {
1362         UpdateDeviceForAllSource(source, type);
1363         sink->UpdateActiveDevice(deviceTypes);
1364         PolicyHandler::GetInstance().SetActiveOutputDevice(type);
1365     } else {
1366         AUDIO_ERR_LOG("SetIORoutes invalid device flag");
1367         return ERR_INVALID_PARAM;
1368     }
1369 
1370     return SUCCESS;
1371 }
1372 
UpdateActiveDeviceRoute(int32_t type,int32_t flag,int32_t a2dpOffloadFlag)1373 int32_t AudioServer::UpdateActiveDeviceRoute(int32_t type, int32_t flag, int32_t a2dpOffloadFlag)
1374 {
1375     int32_t callingUid = IPCSkeleton::GetCallingUid();
1376     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1377 
1378     std::vector<IntPair> activeDevices;
1379     activeDevices.push_back({type, flag});
1380     return UpdateActiveDevicesRoute(activeDevices, a2dpOffloadFlag, "");
1381 }
1382 
UpdateActiveDevicesRoute(const std::vector<IntPair> & activeDevices,int32_t a2dpOffloadFlag,const std::string & deviceName)1383 int32_t AudioServer::UpdateActiveDevicesRoute(const std::vector<IntPair> &activeDevices,
1384     int32_t a2dpOffloadFlag, const std::string &deviceName)
1385 {
1386     CHECK_AND_RETURN_RET_LOG(!activeDevices.empty() && activeDevices.size() <= AUDIO_CONCURRENT_ACTIVE_DEVICES_LIMIT,
1387         ERR_INVALID_PARAM, "Invalid audio devices.");
1388     int32_t callingUid = IPCSkeleton::GetCallingUid();
1389     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1390     std::vector<std::pair<DeviceType, DeviceFlag>> activeOutputDevices;
1391     for (auto activeDevice : activeDevices) {
1392         DeviceType type = static_cast<DeviceType>(activeDevice.firstParam);
1393         DeviceFlag flag = static_cast<DeviceFlag>(activeDevice.secondParam);
1394         activeOutputDevices.push_back({type, flag});
1395     }
1396     return SetIORoutes(activeOutputDevices, static_cast<BluetoothOffloadState>(a2dpOffloadFlag), deviceName);
1397 }
1398 
SetDmDeviceType(uint16_t dmDeviceType,int32_t deviceType)1399 int32_t AudioServer::SetDmDeviceType(uint16_t dmDeviceType, int32_t deviceType)
1400 {
1401     int32_t callingUid = IPCSkeleton::GetCallingUid();
1402     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
1403         "refused for %{public}d", callingUid);
1404 
1405     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
1406     CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "has no valid sink");
1407     sink->SetDmDeviceType(dmDeviceType, static_cast<DeviceType>(deviceType));
1408 
1409     std::shared_ptr<IAudioCaptureSource> source;
1410     if (static_cast<DeviceType>(deviceType) == DEVICE_TYPE_NEARLINK_IN) {
1411         source = GetSourceByProp(HDI_ID_TYPE_PRIMARY);
1412     } else {
1413         source = GetSourceByProp(HDI_ID_TYPE_ACCESSORY, HDI_ID_INFO_ACCESSORY, true);
1414     }
1415     CHECK_AND_RETURN_RET_LOG(source != nullptr, ERROR, "has no valid source");
1416 
1417     source->SetDmDeviceType(dmDeviceType, static_cast<DeviceType>(deviceType));
1418     return SUCCESS;
1419 }
1420 
SetAudioMonoState(bool audioMono)1421 int32_t AudioServer::SetAudioMonoState(bool audioMono)
1422 {
1423     AUDIO_INFO_LOG("AudioMonoState = [%{public}s]", audioMono ? "true": "false");
1424     int32_t callingUid = IPCSkeleton::GetCallingUid();
1425     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
1426         "refused for %{public}d", callingUid);
1427 
1428     auto limitFunc = [](uint32_t renderId) -> bool {
1429         uint32_t type = IdHandler::GetInstance().ParseType(renderId);
1430         std::string info = IdHandler::GetInstance().ParseInfo(renderId);
1431         if (type == HDI_ID_TYPE_PRIMARY) {
1432             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_DIRECT || info == HDI_ID_INFO_VOIP;
1433         }
1434         if (type == HDI_ID_TYPE_BLUETOOTH) {
1435             return info == HDI_ID_INFO_DEFAULT;
1436         }
1437         if (type == HDI_ID_TYPE_OFFLOAD) {
1438             return info == HDI_ID_INFO_DEFAULT;
1439         }
1440         return false;
1441     };
1442     auto processFunc = [audioMono, limitFunc](uint32_t renderId, std::shared_ptr<IAudioRenderSink> sink) -> int32_t {
1443         CHECK_AND_RETURN_RET(limitFunc(renderId), SUCCESS);
1444         CHECK_AND_RETURN_RET(sink != nullptr, SUCCESS);
1445 
1446         sink->SetAudioMonoState(audioMono);
1447         return SUCCESS;
1448     };
1449     (void)HdiAdapterManager::GetInstance().ProcessSink(processFunc);
1450     HdiAdapterManager::GetInstance().UpdateSinkPrestoreInfo<bool>(PRESTORE_INFO_AUDIO_MONO, audioMono);
1451     return SUCCESS;
1452 }
1453 
SetAudioBalanceValue(float audioBalance)1454 int32_t AudioServer::SetAudioBalanceValue(float audioBalance)
1455 {
1456     AUDIO_INFO_LOG("AudioBalanceValue = [%{public}f]", audioBalance);
1457     int32_t callingUid = IPCSkeleton::GetCallingUid();
1458     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
1459         "refused for %{public}d", callingUid);
1460     CHECK_AND_RETURN_RET_LOG(audioBalance >= -1.0f && audioBalance <= 1.0f, ERR_INVALID_PARAM,
1461         "audioBalance value %{public}f is out of range [-1.0, 1.0]", audioBalance);
1462 
1463     auto limitFunc = [](uint32_t renderId) -> bool {
1464         uint32_t type = IdHandler::GetInstance().ParseType(renderId);
1465         std::string info = IdHandler::GetInstance().ParseInfo(renderId);
1466         if (type == HDI_ID_TYPE_PRIMARY) {
1467             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_DIRECT || info == HDI_ID_INFO_VOIP;
1468         }
1469         if (type == HDI_ID_TYPE_BLUETOOTH) {
1470             return info == HDI_ID_INFO_DEFAULT;
1471         }
1472         if (type == HDI_ID_TYPE_OFFLOAD) {
1473             return info == HDI_ID_INFO_DEFAULT;
1474         }
1475         return false;
1476     };
1477     auto processFunc = [audioBalance, limitFunc](uint32_t renderId, std::shared_ptr<IAudioRenderSink> sink) -> int32_t {
1478         CHECK_AND_RETURN_RET(limitFunc(renderId), SUCCESS);
1479         CHECK_AND_RETURN_RET(sink != nullptr, SUCCESS);
1480 
1481         sink->SetAudioBalanceValue(audioBalance);
1482         return SUCCESS;
1483     };
1484     (void)HdiAdapterManager::GetInstance().ProcessSink(processFunc);
1485     HdiAdapterManager::GetInstance().UpdateSinkPrestoreInfo<float>(PRESTORE_INFO_AUDIO_BALANCE, audioBalance);
1486     return SUCCESS;
1487 }
1488 
NotifyDeviceInfo(const std::string & networkId,bool connected)1489 int32_t AudioServer::NotifyDeviceInfo(const std::string &networkId, bool connected)
1490 {
1491     int32_t callingUid = IPCSkeleton::GetCallingUid();
1492     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
1493         "refused for %{public}d", callingUid);
1494     AUDIO_INFO_LOG("notify device info: networkId(%{public}s), connected(%{public}d)",
1495         GetEncryptStr(networkId).c_str(), connected);
1496     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_REMOTE, networkId.c_str());
1497     if (sink != nullptr && connected) {
1498         sink->RegistCallback(HDI_CB_RENDER_PARAM, this);
1499     }
1500     return SUCCESS;
1501 }
1502 // LCOV_EXCL_STOP
1503 
IsParamEnabled(std::string key,bool & isEnabled)1504 inline bool IsParamEnabled(std::string key, bool &isEnabled)
1505 {
1506     int32_t policyFlag = 0;
1507     if (GetSysPara(key.c_str(), policyFlag) && policyFlag == 1) {
1508         isEnabled = true;
1509         return true;
1510     }
1511     isEnabled = false;
1512     return false;
1513 }
1514 
RegiestPolicyProvider(const sptr<IRemoteObject> & object)1515 int32_t AudioServer::RegiestPolicyProvider(const sptr<IRemoteObject> &object)
1516 {
1517     int32_t callingUid = IPCSkeleton::GetCallingUid();
1518     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1519     sptr<IPolicyProviderIpc> policyProvider = iface_cast<IPolicyProviderIpc>(object);
1520     CHECK_AND_RETURN_RET_LOG(policyProvider != nullptr, ERR_INVALID_PARAM,
1521         "policyProvider obj cast failed");
1522     bool ret = PolicyHandler::GetInstance().ConfigPolicyProvider(policyProvider);
1523     CHECK_AND_RETURN_RET_LOG(ret, ERR_OPERATION_FAILED, "ConfigPolicyProvider failed!");
1524     return SUCCESS;
1525 }
1526 
RegistCoreServiceProvider(const sptr<IRemoteObject> & object)1527 int32_t AudioServer::RegistCoreServiceProvider(const sptr<IRemoteObject> &object)
1528 {
1529     int32_t callingUid = IPCSkeleton::GetCallingUid();
1530     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1531     sptr<ICoreServiceProviderIpc> coreServiceProvider = iface_cast<ICoreServiceProviderIpc>(object);
1532     CHECK_AND_RETURN_RET_LOG(coreServiceProvider != nullptr, ERR_INVALID_PARAM,
1533         "coreServiceProvider obj cast failed");
1534     int32_t ret = CoreServiceHandler::GetInstance().ConfigCoreServiceProvider(coreServiceProvider);
1535     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "ConfigCoreServiceProvider failed!");
1536     return SUCCESS;
1537 }
1538 
GetHapBuildApiVersion(int32_t callerUid)1539 int32_t AudioServer::GetHapBuildApiVersion(int32_t callerUid)
1540 {
1541     AudioXCollie audioXCollie("AudioPolicyServer::PerStateChangeCbCustomizeCallback::getUidByBundleName",
1542         GET_BUNDLE_TIME_OUT_SECONDS, nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY);
1543     std::string bundleName {""};
1544     AppExecFwk::BundleInfo bundleInfo;
1545     WatchTimeout guard("SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager():GetHapBuildApiVersion");
1546     auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1547     CHECK_AND_RETURN_RET_LOG(saManager != nullptr, 0, "failed: saManager is nullptr");
1548     guard.CheckCurrTimeout();
1549 
1550     sptr<IRemoteObject> remoteObject = saManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1551     CHECK_AND_RETURN_RET_LOG(remoteObject != nullptr, 0, "failed: remoteObject is nullptr");
1552 
1553     sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = OHOS::iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
1554     CHECK_AND_RETURN_RET_LOG(bundleMgrProxy != nullptr, 0, "failed: bundleMgrProxy is nullptr");
1555 
1556     WatchTimeout reguard("bundleMgrProxy->GetNameForUid:GetHapBuildApiVersion");
1557     bundleMgrProxy->GetNameForUid(callerUid, bundleName);
1558     bundleMgrProxy->GetBundleInfoV9(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT |
1559         AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES |
1560         AppExecFwk::BundleFlag::GET_BUNDLE_WITH_REQUESTED_PERMISSION |
1561         AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO |
1562         AppExecFwk::BundleFlag::GET_BUNDLE_WITH_HASH_VALUE,
1563         bundleInfo,
1564         AppExecFwk::Constants::ALL_USERID);
1565     reguard.CheckCurrTimeout();
1566     int32_t hapApiVersion = bundleInfo.applicationInfo.apiTargetVersion % API_VERSION_REMAINDER;
1567     AUDIO_INFO_LOG("callerUid %{public}d, version %{public}d", callerUid, hapApiVersion);
1568     return hapApiVersion;
1569 }
1570 
ResetRecordConfig(AudioProcessConfig & config)1571 void AudioServer::ResetRecordConfig(AudioProcessConfig &config)
1572 {
1573     if (config.capturerInfo.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
1574         config.isInnerCapturer = true;
1575         config.innerCapMode = LEGACY_INNER_CAP;
1576         if (PermissionUtil::VerifyPermission(CAPTURE_PLAYBACK_PERMISSION, IPCSkeleton::GetCallingTokenID())) {
1577             AUDIO_INFO_LOG("CAPTURE_PLAYBACK permission granted");
1578             config.innerCapMode = MODERN_INNER_CAP;
1579         } else if (config.callerUid == MEDIA_SERVICE_UID || config.callerUid == VASSISTANT_UID) {
1580             config.innerCapMode = MODERN_INNER_CAP;
1581         } else if (GetHapBuildApiVersion(config.callerUid) >= MODERN_INNER_API_VERSION) { // check build api-version
1582             config.innerCapMode = LEGACY_MUTE_CAP;
1583         }
1584         AUDIO_INFO_LOG("callerUid %{public}d, innerCapMode %{public}d", config.callerUid, config.innerCapMode);
1585     } else {
1586         config.isInnerCapturer = false;
1587     }
1588 #ifdef AUDIO_BUILD_VARIANT_ROOT
1589     if (config.callerUid == ROOT_UID) {
1590         config.innerCapMode = MODERN_INNER_CAP;
1591     }
1592 #endif
1593     if (config.capturerInfo.sourceType == SourceType::SOURCE_TYPE_WAKEUP) {
1594         config.isWakeupCapturer = true;
1595     } else {
1596         config.isWakeupCapturer = false;
1597     }
1598 }
1599 
ResetProcessConfig(const AudioProcessConfig & config)1600 AudioProcessConfig AudioServer::ResetProcessConfig(const AudioProcessConfig &config)
1601 {
1602     AudioProcessConfig resetConfig(config);
1603 
1604     int32_t callerUid = IPCSkeleton::GetCallingUid();
1605     int32_t callerPid = IPCSkeleton::GetCallingPid();
1606 
1607     resetConfig.callerUid = callerUid;
1608 
1609     // client pid uid check.
1610     if (RECORD_PASS_APPINFO_LIST.count(callerUid)) {
1611         AUDIO_INFO_LOG("Create process for %{public}d, clientUid:%{public}d.", callerUid, config.appInfo.appUid);
1612     } else if (RECORD_CHECK_FORWARD_LIST.count(callerUid)) {
1613         AUDIO_INFO_LOG("Check forward calling for uid:%{public}d", callerUid);
1614         resetConfig.appInfo.appTokenId = IPCSkeleton::GetFirstTokenID();
1615         resetConfig.appInfo.appFullTokenId = IPCSkeleton::GetFirstFullTokenID();
1616     } else {
1617         AUDIO_INFO_LOG("Use true client appInfo instead for pid:%{public}d uid:%{public}d", callerPid, callerUid);
1618         resetConfig.appInfo.appPid = callerPid;
1619         resetConfig.appInfo.appUid = callerUid;
1620         resetConfig.appInfo.appTokenId = IPCSkeleton::GetCallingTokenID();
1621         resetConfig.appInfo.appFullTokenId = IPCSkeleton::GetCallingFullTokenID();
1622     }
1623 
1624     if (resetConfig.audioMode == AUDIO_MODE_RECORD) {
1625         ResetRecordConfig(resetConfig);
1626     }
1627     return resetConfig;
1628 }
1629 
CheckStreamInfoFormat(const AudioProcessConfig & config)1630 bool AudioServer::CheckStreamInfoFormat(const AudioProcessConfig &config)
1631 {
1632     if (NotContain(AUDIO_SUPPORTED_SAMPLING_RATES, config.streamInfo.samplingRate)) {
1633         AUDIO_ERR_LOG("Check format failed invalid samplingRate:%{public}d", config.streamInfo.samplingRate);
1634         return false;
1635     }
1636 
1637     if (NotContain(AUDIO_SUPPORTED_FORMATS, config.streamInfo.format)) {
1638         AUDIO_ERR_LOG("Check format failed invalid format:%{public}d", config.streamInfo.format);
1639         return false;
1640     }
1641 
1642     if (NotContain(AUDIO_SUPPORTED_ENCODING_TYPES, config.streamInfo.encoding)) {
1643         AUDIO_ERR_LOG("Check format failed invalid encoding:%{public}d", config.streamInfo.encoding);
1644         return false;
1645     }
1646 
1647     // both renderer and capturer check RENDERER_SUPPORTED_CHANNELLAYOUTS, should we rename it?
1648     if (NotContain(RENDERER_SUPPORTED_CHANNELLAYOUTS, config.streamInfo.channelLayout)) {
1649         AUDIO_ERR_LOG("Check format failed invalid channelLayout:%{public}" PRId64".", config.streamInfo.channelLayout);
1650         return false;
1651     }
1652 
1653     if (config.audioMode == AUDIO_MODE_PLAYBACK && NotContain(RENDERER_SUPPORTED_CHANNELS,
1654         config.streamInfo.channels)) {
1655         AUDIO_ERR_LOG("Check format failed invalid renderer channels:%{public}d", config.streamInfo.channels);
1656         return false;
1657     }
1658 
1659     if (config.audioMode == AUDIO_MODE_RECORD && NotContain(CAPTURER_SUPPORTED_CHANNELS, config.streamInfo.channels)) {
1660         AUDIO_ERR_LOG("Check format failed invalid capturer channels:%{public}d", config.streamInfo.channels);
1661         return false;
1662     }
1663 
1664     return true;
1665 }
1666 
CheckRendererFormat(const AudioProcessConfig & config)1667 bool AudioServer::CheckRendererFormat(const AudioProcessConfig &config)
1668 {
1669     if (NotContain(AUDIO_SUPPORTED_STREAM_USAGES, config.rendererInfo.streamUsage)) {
1670         AUDIO_ERR_LOG("Check format failed invalid streamUsage:%{public}d", config.rendererInfo.streamUsage);
1671         SendCreateErrorInfo(config, ERR_INVALID_PARAM);
1672         return false;
1673     }
1674     return true;
1675 }
1676 
CheckRecorderFormat(const AudioProcessConfig & config)1677 bool AudioServer::CheckRecorderFormat(const AudioProcessConfig &config)
1678 {
1679     if (NotContain(AUDIO_SUPPORTED_SOURCE_TYPES, config.capturerInfo.sourceType)) {
1680         AUDIO_ERR_LOG("Check format failed invalid sourceType:%{public}d", config.capturerInfo.sourceType);
1681         SendCreateErrorInfo(config, ERR_INVALID_PARAM);
1682         return false;
1683     }
1684     if (config.capturerInfo.capturerFlags != AUDIO_FLAG_NORMAL && NotContain(AUDIO_FAST_STREAM_SUPPORTED_SOURCE_TYPES,
1685         config.capturerInfo.sourceType)) {
1686         AUDIO_ERR_LOG("Check format failed invalid fast sourceType:%{public}d", config.capturerInfo.sourceType);
1687         SendCreateErrorInfo(config, ERR_INVALID_PARAM);
1688         return false;
1689     }
1690     return true;
1691 }
1692 
CheckConfigFormat(const AudioProcessConfig & config)1693 bool AudioServer::CheckConfigFormat(const AudioProcessConfig &config)
1694 {
1695     if (!CheckStreamInfoFormat(config)) {
1696         SendCreateErrorInfo(config, ERR_INVALID_PARAM);
1697         return false;
1698     }
1699     if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1700         return CheckRendererFormat(config);
1701     }
1702 
1703     if (config.audioMode == AUDIO_MODE_RECORD) {
1704         return CheckRecorderFormat(config);
1705     }
1706 
1707     SendCreateErrorInfo(config, ERR_INVALID_PARAM);
1708     AUDIO_ERR_LOG("Check format failed invalid mode.");
1709     return false;
1710 }
1711 
IsFastBlocked(int32_t uid,PlayerType playerType)1712 bool AudioServer::IsFastBlocked(int32_t uid, PlayerType playerType)
1713 {
1714     // if call from soundpool without the need for check.
1715     if (playerType == PLAYER_TYPE_SOUND_POOL) {
1716         return false;
1717     }
1718     std::string bundleName = AppBundleManager::GetBundleNameFromUid(uid);
1719     std::string result;
1720     GetAudioParameter(CHECK_FAST_BLOCK_PREFIX + bundleName, result);
1721     return result == "true";
1722 }
1723 
SendCreateErrorInfo(const AudioProcessConfig & config,int32_t errorCode)1724 void AudioServer::SendCreateErrorInfo(const AudioProcessConfig &config, int32_t errorCode)
1725 {
1726     std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1727         Media::MediaMonitor::AUDIO, Media::MediaMonitor::AUDIO_STREAM_CREATE_ERROR_STATS,
1728         Media::MediaMonitor::FREQUENCY_AGGREGATION_EVENT);
1729     bool isPlayBack = config.audioMode == AUDIO_MODE_PLAYBACK ? 1 : 0;
1730     bean->Add("IS_PLAYBACK", (isPlayBack ? 1 : 0));
1731     bean->Add("CLIENT_UID", config.appInfo.appUid);
1732     bean->Add("STREAM_TYPE", isPlayBack ? static_cast<int32_t>(config.rendererInfo.streamUsage) :
1733         static_cast<int32_t>(config.capturerInfo.sourceType));
1734     bean->Add("ERROR_CODE", errorCode);
1735     Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1736 }
1737 
CheckMaxRendererInstances()1738 int32_t AudioServer::CheckMaxRendererInstances()
1739 {
1740     int32_t maxRendererInstances = PolicyHandler::GetInstance().GetMaxRendererInstances();
1741     if (maxRendererInstances <= 0) {
1742         maxRendererInstances = DEFAULT_MAX_RENDERER_INSTANCES;
1743     }
1744     if (AudioService::GetInstance()->GetCurrentRendererStreamCnt() >= maxRendererInstances) {
1745         AUDIO_ERR_LOG("Current audio renderer stream num is greater than the maximum num of configured instances");
1746         return ERR_EXCEED_MAX_STREAM_CNT;
1747     }
1748     return SUCCESS;
1749 }
1750 
CheckMaxLoopbackInstances(AudioMode audioMode)1751 int32_t AudioServer::CheckMaxLoopbackInstances(AudioMode audioMode)
1752 {
1753     if (AudioService::GetInstance()->GetCurrentLoopbackStreamCnt(audioMode) >= DEFAULT_MAX_LOOPBACK_INSTANCES) {
1754         AUDIO_ERR_LOG("Current Loopback stream num is greater than the maximum num of configured instances");
1755         return ERR_EXCEED_MAX_STREAM_CNT;
1756     }
1757     return SUCCESS;
1758 }
1759 
CreateAudioStream(const AudioProcessConfig & config,int32_t callingUid,std::shared_ptr<PipeInfoGuard> & pipeInfoGuard)1760 sptr<IRemoteObject> AudioServer::CreateAudioStream(const AudioProcessConfig &config, int32_t callingUid,
1761     std::shared_ptr<PipeInfoGuard> &pipeInfoGuard)
1762 {
1763     CHECK_AND_RETURN_RET_LOG(pipeInfoGuard != nullptr, nullptr, "PipeInfoGuard is nullptr");
1764     int32_t appUid = config.appInfo.appUid;
1765     if (callingUid != MEDIA_SERVICE_UID) {
1766         appUid = callingUid;
1767     }
1768     if (IsNormalIpcStream(config)) {
1769         AUDIO_INFO_LOG("Create normal ipc stream, isFastControlled: %{public}d", isFastControlled_);
1770         int32_t ret = 0;
1771         sptr<IpcStreamInServer> ipcStream = AudioService::GetInstance()->GetIpcStream(config, ret);
1772         if (ipcStream == nullptr) {
1773             if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1774                 AudioService::GetInstance()->CleanAppUseNumMap(appUid);
1775             }
1776             AUDIO_ERR_LOG("GetIpcStream failed.");
1777             return nullptr;
1778         }
1779         AudioService::GetInstance()->SetIncMaxRendererStreamCnt(config.audioMode);
1780         sptr<IRemoteObject> remoteObject= ipcStream->AsObject();
1781         pipeInfoGuard->SetReleaseFlag(false);
1782         return remoteObject;
1783     }
1784 
1785 #ifdef SUPPORT_LOW_LATENCY
1786     sptr<IAudioProcess> process = AudioService::GetInstance()->GetAudioProcess(config);
1787     if (process == nullptr) {
1788         if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1789             AudioService::GetInstance()->CleanAppUseNumMap(appUid);
1790         }
1791         AUDIO_ERR_LOG("GetAudioProcess failed.");
1792         return nullptr;
1793     }
1794     AudioService::GetInstance()->SetIncMaxRendererStreamCnt(config.audioMode);
1795     if (config.capturerInfo.isLoopback || config.rendererInfo.isLoopback) {
1796         AudioService::GetInstance()->SetIncMaxLoopbackStreamCnt(config.audioMode);
1797     }
1798     sptr<IRemoteObject> remoteObject= process->AsObject();
1799     pipeInfoGuard->SetReleaseFlag(false);
1800     return remoteObject;
1801 #else
1802     AUDIO_ERR_LOG("GetAudioProcess failed.");
1803     return nullptr;
1804 #endif
1805 }
1806 
CheckAndWaitAudioPolicyReady()1807 int32_t AudioServer::CheckAndWaitAudioPolicyReady()
1808 {
1809     if (!isAudioPolicyReady_) {
1810         std::unique_lock lock(isAudioPolicyReadyMutex_);
1811         if (waitCreateStreamInServerCount_ > MAX_WAIT_IN_SERVER_COUNT) {
1812             AUDIO_WARNING_LOG("let client retry");
1813             return ERR_RETRY_IN_CLIENT;
1814         }
1815         waitCreateStreamInServerCount_++;
1816         isAudioPolicyReadyCv_.wait_for(lock, std::chrono::seconds(WAIT_AUDIO_POLICY_READY_TIMEOUT_SECONDS), [this] () {
1817             return isAudioPolicyReady_.load();
1818         });
1819         waitCreateStreamInServerCount_--;
1820     }
1821 
1822     return SUCCESS;
1823 }
1824 
NotifyProcessStatus()1825 void AudioServer::NotifyProcessStatus()
1826 {
1827     // when audio_server start, set audio_server rssThresHold
1828     void *libMemMgrClientHandle = dlopen("libmemmgrclient.z.so", RTLD_NOW);
1829     if (!libMemMgrClientHandle) {
1830         AUDIO_INFO_LOG("dlopen libmemmgrclient library failed");
1831         return;
1832     }
1833     void *notifyProcessStatusFunc = dlsym(libMemMgrClientHandle, "notify_process_status");
1834     if (!notifyProcessStatusFunc) {
1835         AUDIO_INFO_LOG("dlsm notify_process_status failed");
1836 #ifndef TEST_COVERAGE
1837         dlclose(libMemMgrClientHandle);
1838 #endif
1839         return;
1840     }
1841     auto notifyProcessStatus = reinterpret_cast<int(*)(int, int, int, int)>(notifyProcessStatusFunc);
1842     AUDIO_INFO_LOG("notify to memmgr when audio_server is started");
1843     int pid = getpid();
1844     notifyProcessStatus(pid, 1, RSS_THRESHOLD, 0);
1845 #ifndef TEST_COVERAGE
1846     dlclose(libMemMgrClientHandle);
1847 #endif
1848 }
1849 
CreateAudioProcess(const AudioProcessConfig & config,int32_t & errorCode,const AudioPlaybackCaptureConfig & filterConfig,sptr<IRemoteObject> & client)1850 int32_t AudioServer::CreateAudioProcess(const AudioProcessConfig &config, int32_t &errorCode,
1851     const AudioPlaybackCaptureConfig &filterConfig, sptr<IRemoteObject>& client)
1852 {
1853     client = CreateAudioProcessInner(config, errorCode, filterConfig);
1854     if (client == nullptr) {
1855         AUDIO_ERR_LOG("CreateAudioProcessInner failed");
1856         if (errorCode == 0) {
1857             errorCode = AUDIO_ERR;
1858         }
1859     }
1860     return SUCCESS;
1861 }
1862 
IsSatellite(const AudioProcessConfig & config,int32_t callingUid)1863 bool AudioServer::IsSatellite(const AudioProcessConfig &config, int32_t callingUid)
1864 {
1865     return config.rendererInfo.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION &&
1866         callingUid == UID_FOUNDATION_SA && config.rendererInfo.isSatellite;
1867 }
1868 
CreateAudioProcessInner(const AudioProcessConfig & config,int32_t & errorCode,const AudioPlaybackCaptureConfig & filterConfig)1869 sptr<IRemoteObject> AudioServer::CreateAudioProcessInner(const AudioProcessConfig &config, int32_t &errorCode,
1870     const AudioPlaybackCaptureConfig &filterConfig)
1871 {
1872     Trace trace("AudioServer::CreateAudioProcess");
1873     std::shared_ptr<PipeInfoGuard> pipeinfoGuard = std::make_shared<PipeInfoGuard>(config.originalSessionId);
1874 
1875     errorCode = CheckAndWaitAudioPolicyReady();
1876     CHECK_AND_RETURN_RET(errorCode == SUCCESS, nullptr);
1877 
1878     AudioProcessConfig resetConfig = ResetProcessConfig(config);
1879     CHECK_AND_RETURN_RET_LOG(CheckConfigFormat(resetConfig), nullptr, "AudioProcessConfig format is wrong, please check"
1880         ":%{public}s", ProcessConfig::DumpProcessConfig(resetConfig).c_str());
1881     CHECK_AND_RETURN_RET_LOG(PermissionChecker(resetConfig), nullptr, "Create audio process failed, no permission");
1882 
1883     std::lock_guard<std::mutex> lock(streamLifeCycleMutex_);
1884     int32_t callingUid = IPCSkeleton::GetCallingUid();
1885     if (resetConfig.audioMode == AUDIO_MODE_PLAYBACK &&
1886         !IsVoiceModemCommunication(resetConfig.rendererInfo.streamUsage, callingUid)) {
1887         errorCode = CheckMaxRendererInstances();
1888         CHECK_AND_RETURN_RET(errorCode == SUCCESS, nullptr);
1889         if (AudioService::GetInstance()->IsExceedingMaxStreamCntPerUid(callingUid, resetConfig.appInfo.appUid,
1890             maxRendererStreamCntPerUid_)) {
1891             errorCode = ERR_EXCEED_MAX_STREAM_CNT_PER_UID;
1892             AUDIO_ERR_LOG("Current audio renderer stream num exceeds maxRendererStreamCntPerUid");
1893             return nullptr;
1894         }
1895     }
1896     if (resetConfig.rendererInfo.isLoopback || resetConfig.capturerInfo.isLoopback) {
1897         errorCode = CheckMaxLoopbackInstances(resetConfig.audioMode);
1898         CHECK_AND_RETURN_RET(errorCode == SUCCESS, nullptr);
1899     }
1900     if (IsSatellite(resetConfig, callingUid)) {
1901         bool isSupportSate = OHOS::system::GetBoolParameter(TEL_SATELLITE_SUPPORT, false);
1902         CHECK_AND_RETURN_RET_LOG(isSupportSate, nullptr, "Do not support satellite");
1903         HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
1904         std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
1905         if (deviceManager != nullptr) {
1906             deviceManager->SetAudioParameter("primary", AudioParamKey::NONE, "", SATEMODEM_PARAMETER);
1907         }
1908     }
1909 #ifdef FEATURE_APPGALLERY
1910     PolicyHandler::GetInstance().GetAndSaveClientType(resetConfig.appInfo.appUid,
1911         AppBundleManager::GetBundleNameFromUid(resetConfig.appInfo.appUid));
1912 #endif
1913 #ifdef HAS_FEATURE_INNERCAPTURER
1914     if (!HandleCheckCaptureLimit(resetConfig, filterConfig)) {
1915         return nullptr;
1916     }
1917 #endif
1918     return CreateAudioStream(resetConfig, callingUid, pipeinfoGuard);
1919 }
1920 
1921 #ifdef HAS_FEATURE_INNERCAPTURER
HandleCheckCaptureLimit(AudioProcessConfig & resetConfig,const AudioPlaybackCaptureConfig & filterConfig)1922 bool AudioServer::HandleCheckCaptureLimit(AudioProcessConfig &resetConfig,
1923     const AudioPlaybackCaptureConfig &filterConfig)
1924 {
1925     if (resetConfig.capturerInfo.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
1926         int32_t innerCapId = 0;
1927         if (InnerCheckCaptureLimit(filterConfig, innerCapId) == SUCCESS) {
1928             resetConfig.innerCapId = innerCapId;
1929         } else {
1930             AUDIO_ERR_LOG("CheckCaptureLimit fail!");
1931             return false;
1932         }
1933     }
1934     return true;
1935 }
1936 
InnerCheckCaptureLimit(const AudioPlaybackCaptureConfig & config,int32_t & innerCapId)1937 int32_t AudioServer::InnerCheckCaptureLimit(const AudioPlaybackCaptureConfig &config, int32_t &innerCapId)
1938 {
1939     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
1940     int32_t ret = playbackCapturerMgr->CheckCaptureLimit(config, innerCapId);
1941     if (ret == SUCCESS) {
1942         PolicyHandler::GetInstance().LoadModernInnerCapSink(innerCapId);
1943     }
1944     return ret;
1945 }
1946 #endif
1947 
IsNormalIpcStream(const AudioProcessConfig & config) const1948 bool AudioServer::IsNormalIpcStream(const AudioProcessConfig &config) const
1949 {
1950     if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1951         return config.rendererInfo.rendererFlags == AUDIO_FLAG_NORMAL ||
1952             config.rendererInfo.rendererFlags == AUDIO_FLAG_VOIP_DIRECT ||
1953             config.rendererInfo.rendererFlags == AUDIO_FLAG_DIRECT;
1954     } else if (config.audioMode == AUDIO_MODE_RECORD) {
1955         return config.capturerInfo.capturerFlags == AUDIO_FLAG_NORMAL;
1956     }
1957 
1958     return false;
1959 }
1960 
CheckRemoteDeviceState(const std::string & networkId,int32_t deviceRole,bool isStartDevice)1961 int32_t AudioServer::CheckRemoteDeviceState(const std::string &networkId, int32_t deviceRole, bool isStartDevice)
1962 {
1963     AUDIO_INFO_LOG("CheckRemoteDeviceState: device[%{public}s] deviceRole[%{public}d] isStartDevice[%{public}s]",
1964         GetEncryptStr(networkId).c_str(), static_cast<int32_t>(deviceRole), (isStartDevice ? "true" : "false"));
1965 
1966     int32_t callingUid = IPCSkeleton::GetCallingUid();
1967     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1968     CHECK_AND_RETURN_RET(isStartDevice, SUCCESS);
1969 
1970     int32_t ret = SUCCESS;
1971     switch (deviceRole) {
1972         case OUTPUT_DEVICE:
1973             {
1974                 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_REMOTE, networkId.c_str());
1975                 if (sink == nullptr || !sink->IsInited()) {
1976                     AUDIO_ERR_LOG("Remote renderer[%{public}s] is uninit.", networkId.c_str());
1977                     return ERR_ILLEGAL_STATE;
1978                 }
1979                 ret = sink->Start();
1980                 break;
1981             }
1982         case INPUT_DEVICE:
1983             {
1984                 std::shared_ptr<IAudioCaptureSource> source = GetSourceByProp(HDI_ID_TYPE_REMOTE, networkId.c_str());
1985                 if (source == nullptr || !source->IsInited()) {
1986                     AUDIO_ERR_LOG("Remote capturer[%{public}s] is uninit.", networkId.c_str());
1987                     return ERR_ILLEGAL_STATE;
1988                 }
1989                 ret = source->Start();
1990                 break;
1991             }
1992         default:
1993             AUDIO_ERR_LOG("Remote device role %{public}d is not supported.", deviceRole);
1994             return ERR_NOT_SUPPORTED;
1995     }
1996     if (ret != SUCCESS) {
1997         AUDIO_ERR_LOG("Check remote device[%{public}s] fail, ret %{public}d.", networkId.c_str(), ret);
1998     }
1999     return ret;
2000 }
2001 // LCOV_EXCL_STOP
2002 
OnRenderSinkParamChange(const std::string & networkId,const AudioParamKey key,const std::string & condition,const std::string & value)2003 void AudioServer::OnRenderSinkParamChange(const std::string &networkId, const AudioParamKey key,
2004     const std::string &condition, const std::string &value)
2005 {
2006     std::shared_ptr<AudioParameterCallback> callback = nullptr;
2007     {
2008         std::lock_guard<std::mutex> lockSet(audioParamCbMtx_);
2009         AUDIO_INFO_LOG("OnRenderSinkParamChange Callback from networkId: %s", networkId.c_str());
2010         CHECK_AND_RETURN_LOG(audioParamCb_ != nullptr, "OnRenderSinkParamChange: audio param allback is null.");
2011         callback = audioParamCb_;
2012     }
2013     callback->OnAudioParameterChange(networkId, key, condition, value);
2014 }
2015 
OnCaptureSourceParamChange(const std::string & networkId,const AudioParamKey key,const std::string & condition,const std::string & value)2016 void AudioServer::OnCaptureSourceParamChange(const std::string &networkId, const AudioParamKey key,
2017     const std::string &condition, const std::string &value)
2018 {
2019     std::shared_ptr<AudioParameterCallback> callback = nullptr;
2020     {
2021         std::lock_guard<std::mutex> lockSet(audioParamCbMtx_);
2022         AUDIO_INFO_LOG("OnCaptureSourceParamChange Callback from networkId: %s", networkId.c_str());
2023         CHECK_AND_RETURN_LOG(audioParamCb_ != nullptr, "OnCaptureSourceParamChange: audio param allback is null.");
2024         callback = audioParamCb_;
2025     }
2026     callback->OnAudioParameterChange(networkId, key, condition, value);
2027 }
2028 
OnWakeupClose()2029 void AudioServer::OnWakeupClose()
2030 {
2031     AUDIO_INFO_LOG("OnWakeupClose Callback start");
2032     std::shared_ptr<WakeUpSourceCallback> callback = nullptr;
2033     {
2034         std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
2035         CHECK_AND_RETURN_LOG(wakeupCallback_ != nullptr, "OnWakeupClose callback is nullptr.");
2036         callback = wakeupCallback_;
2037     }
2038     callback->OnWakeupClose();
2039 }
2040 
OnCapturerState(bool isActive,size_t preNum,size_t curNum)2041 void AudioServer::OnCapturerState(bool isActive, size_t preNum, size_t curNum)
2042 {
2043     AUDIO_DEBUG_LOG("OnCapturerState Callback start");
2044     std::shared_ptr<WakeUpSourceCallback> callback = nullptr;
2045     {
2046         std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
2047         callback = wakeupCallback_;
2048     }
2049 
2050     // Ensure that the send callback is not executed concurrently
2051     std::lock_guard<std::mutex> lockCb(onCapturerStateCbMutex_);
2052     bool previousState = preNum;
2053     bool currentState = curNum;
2054 
2055     if (previousState == currentState) {
2056         // state not change, need not trigger callback
2057         return;
2058     }
2059 
2060     CHECK_AND_RETURN_LOG(callback != nullptr, "OnCapturerState callback is nullptr.");
2061     Trace traceCb("callbackToIntelligentVoice");
2062     int64_t stamp = ClockTime::GetCurNano();
2063     callback->OnCapturerState(isActive);
2064     stamp = (ClockTime::GetCurNano() - stamp) / AUDIO_US_PER_SECOND;
2065     AUDIO_INFO_LOG("isActive:%{public}d cb cost[%{public}" PRId64 "]", isActive, stamp);
2066 }
2067 
SetParameterCallback(const sptr<IRemoteObject> & object)2068 int32_t AudioServer::SetParameterCallback(const sptr<IRemoteObject>& object)
2069 {
2070     int32_t callingUid = IPCSkeleton::GetCallingUid();
2071     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
2072     std::lock_guard<std::mutex> lock(audioParamCbMtx_);
2073     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "AudioServer:set listener object is nullptr");
2074 
2075     sptr<IStandardAudioServerManagerListener> listener = iface_cast<IStandardAudioServerManagerListener>(object);
2076 
2077     CHECK_AND_RETURN_RET_LOG(listener != nullptr, ERR_INVALID_PARAM, "AudioServer: listener obj cast failed");
2078 
2079     std::shared_ptr<AudioParameterCallback> callback = std::make_shared<AudioManagerListenerCallback>(listener);
2080     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "AudioPolicyServer: failed to  create cb obj");
2081 
2082     audioParamCb_ = callback;
2083     AUDIO_INFO_LOG("AudioServer:: SetParameterCallback  done");
2084 
2085     return SUCCESS;
2086 }
2087 
SetWakeupSourceCallback(const sptr<IRemoteObject> & object)2088 int32_t AudioServer::SetWakeupSourceCallback(const sptr<IRemoteObject>& object)
2089 {
2090     int32_t callingUid = IPCSkeleton::GetCallingUid();
2091     CHECK_AND_RETURN_RET_LOG(callingUid == INTELL_VOICE_SERVICR_UID, false,
2092         "SetWakeupSourceCallback refused for %{public}d", callingUid);
2093 
2094     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM,
2095         "SetWakeupCloseCallback set listener object is nullptr");
2096 
2097     sptr<IStandardAudioServerManagerListener> listener = iface_cast<IStandardAudioServerManagerListener>(object);
2098 
2099     CHECK_AND_RETURN_RET_LOG(listener != nullptr, ERR_INVALID_PARAM,
2100         "SetWakeupCloseCallback listener obj cast failed");
2101 
2102     std::shared_ptr<AudioManagerListenerCallback> wakeupCallback
2103         = std::make_shared<AudioManagerListenerCallback>(listener);
2104     CHECK_AND_RETURN_RET_LOG(wakeupCallback != nullptr, ERR_INVALID_PARAM,
2105         "SetWakeupCloseCallback failed to create cb obj");
2106 
2107     {
2108         std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
2109         wakeupCallback_ = wakeupCallback;
2110     }
2111 
2112     std::thread([this, wakeupCallback] {
2113         std::lock_guard<std::mutex> lockCb(onCapturerStateCbMutex_);
2114         wakeupCallback->TrigerFirstOnCapturerStateCallback(capturerStateFlag_);
2115     }).detach();
2116 
2117     AUDIO_INFO_LOG("SetWakeupCloseCallback done");
2118 
2119     return SUCCESS;
2120 }
2121 
VerifyClientPermission(const std::string & permissionName,Security::AccessToken::AccessTokenID tokenId)2122 bool AudioServer::VerifyClientPermission(const std::string &permissionName,
2123     Security::AccessToken::AccessTokenID tokenId)
2124 {
2125     auto callerUid = IPCSkeleton::GetCallingUid();
2126     AUDIO_INFO_LOG("[%{public}s] for uid:%{public}d tokenId:%{public}u", permissionName.c_str(), callerUid, tokenId);
2127 
2128 #ifdef AUDIO_BUILD_VARIANT_ROOT
2129     // Root users should be whitelisted
2130     if (callerUid == ROOT_UID) {
2131         AUDIO_INFO_LOG("Root user. Permission GRANTED!!!");
2132         return true;
2133     }
2134 #endif
2135     Security::AccessToken::AccessTokenID clientTokenId = tokenId;
2136     if (clientTokenId == Security::AccessToken::INVALID_TOKENID) {
2137         clientTokenId = IPCSkeleton::GetCallingTokenID();
2138     }
2139     int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(clientTokenId, permissionName);
2140     CHECK_AND_RETURN_RET_LOG(res == Security::AccessToken::PermissionState::PERMISSION_GRANTED,
2141         false, "Permission denied [tid:%{public}d]", clientTokenId);
2142 
2143     return true;
2144 }
2145 
PermissionChecker(const AudioProcessConfig & config)2146 bool AudioServer::PermissionChecker(const AudioProcessConfig &config)
2147 {
2148     if (config.audioMode == AUDIO_MODE_PLAYBACK) {
2149         return CheckPlaybackPermission(config);
2150     }
2151 
2152     if (config.audioMode == AUDIO_MODE_RECORD) {
2153         return CheckRecorderPermission(config);
2154     }
2155 
2156     AUDIO_ERR_LOG("Check failed invalid mode.");
2157     return false;
2158 }
2159 
CheckPlaybackPermission(const AudioProcessConfig & config)2160 bool AudioServer::CheckPlaybackPermission(const AudioProcessConfig &config)
2161 {
2162     StreamUsage streamUsage = config.rendererInfo.streamUsage;
2163 
2164     bool needVerifyPermission = false;
2165     for (const auto& item : STREAMS_NEED_VERIFY_SYSTEM_PERMISSION) {
2166         if (streamUsage == item) {
2167             needVerifyPermission = true;
2168             break;
2169         }
2170     }
2171     if (needVerifyPermission == false) {
2172         return true;
2173     }
2174 
2175     if (streamUsage == STREAM_USAGE_ULTRASONIC && config.callerUid != UID_MSDP_SA) {
2176         AUDIO_ERR_LOG("not msdp using ultrasonic uid:%{public}d", config.callerUid);
2177         return false;
2178     }
2179 
2180     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), false,
2181         "Check playback permission failed, no system permission");
2182     return true;
2183 }
2184 
CheckInnerRecorderPermission(const AudioProcessConfig & config)2185 int32_t AudioServer::CheckInnerRecorderPermission(const AudioProcessConfig &config)
2186 {
2187     SourceType sourceType = config.capturerInfo.sourceType;
2188     if (sourceType != SOURCE_TYPE_REMOTE_CAST && sourceType != SOURCE_TYPE_PLAYBACK_CAPTURE) {
2189         return PERMISSION_UNKNOWN;
2190     }
2191 #ifdef HAS_FEATURE_INNERCAPTURER
2192     Security::AccessToken::AccessTokenID tokenId = config.appInfo.appTokenId;
2193     if (sourceType == SOURCE_TYPE_REMOTE_CAST) {
2194         bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
2195         CHECK_AND_RETURN_RET_LOG(hasSystemPermission, PERMISSION_DENIED,
2196             "Create source remote cast failed: no system permission.");
2197 
2198         bool hasCastAudioOutputPermission = VerifyClientPermission(CAST_AUDIO_OUTPUT_PERMISSION, tokenId);
2199         CHECK_AND_RETURN_RET_LOG(hasCastAudioOutputPermission, PERMISSION_DENIED, "No cast audio output permission");
2200         return PERMISSION_GRANTED;
2201     }
2202 
2203     if (sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE && config.innerCapMode == MODERN_INNER_CAP) {
2204         AUDIO_INFO_LOG("modern inner-cap source, no need to check.");
2205         return PERMISSION_GRANTED;
2206     }
2207     return PERMISSION_UNKNOWN;
2208 #else
2209     return PERMISSION_DENIED;
2210 #endif
2211 }
2212 
2213 // LCOV_EXCL_START
CheckRecorderPermission(const AudioProcessConfig & config)2214 bool AudioServer::CheckRecorderPermission(const AudioProcessConfig &config)
2215 {
2216     Security::AccessToken::AccessTokenID tokenId = config.appInfo.appTokenId;
2217     SourceType sourceType = config.capturerInfo.sourceType;
2218     CHECK_AND_RETURN_RET_LOG(VALID_SOURCE_TYPE.count(sourceType), false, "invalid source type:%{public}d", sourceType);
2219 
2220 #ifdef AUDIO_BUILD_VARIANT_ROOT
2221     int32_t appUid = config.appInfo.appUid;
2222     if (appUid == ROOT_UID) {
2223         return true;
2224     }
2225 #endif
2226 
2227     AUDIO_INFO_LOG("check for uid:%{public}d source type:%{public}d", config.callerUid, sourceType);
2228 
2229     if (sourceType == SOURCE_TYPE_VOICE_CALL) {
2230         bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
2231         CHECK_AND_RETURN_RET_LOG(hasSystemPermission, false, "VOICE_CALL failed: no system permission.");
2232 
2233         bool res = CheckVoiceCallRecorderPermission(tokenId);
2234         return res;
2235     }
2236 
2237     int32_t permission = CheckInnerRecorderPermission(config);
2238     AUDIO_INFO_LOG("CheckInnerRecorderPermission return %{public}d", permission);
2239     if (permission == PERMISSION_GRANTED) {
2240         return true;
2241     } else if (permission == PERMISSION_DENIED) {
2242         return false;
2243     }
2244 
2245     // All record streams should be checked for MICROPHONE_PERMISSION
2246     bool res = VerifyClientPermission(MICROPHONE_PERMISSION, tokenId);
2247     CHECK_AND_RETURN_RET_LOG(res, false, "Check record permission failed: No permission.");
2248 
2249     if (sourceType == SOURCE_TYPE_ULTRASONIC && config.callerUid != UID_MSDP_SA) {
2250         return false;
2251     }
2252 
2253     if (sourceType == SOURCE_TYPE_WAKEUP) {
2254         bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
2255         bool hasIntelVoicePermission = VerifyClientPermission(MANAGE_INTELLIGENT_VOICE_PERMISSION, tokenId);
2256         CHECK_AND_RETURN_RET_LOG(hasSystemPermission && hasIntelVoicePermission, false,
2257             "Create wakeup record stream failed: no permission.");
2258         return true;
2259     }
2260 
2261     CHECK_AND_RETURN_RET(HandleCheckRecorderBackgroundCapture(config), false,
2262         "VerifyBackgroundCapture failed for callerUid:%{public}d", config.callerUid);
2263     return true;
2264 }
2265 // LCOV_EXCL_STOP
2266 
HandleCheckRecorderBackgroundCapture(const AudioProcessConfig & config)2267 bool AudioServer::HandleCheckRecorderBackgroundCapture(const AudioProcessConfig &config)
2268 {
2269     if (!PermissionUtil::NeedVerifyBackgroundCapture(config.callerUid, config.capturerInfo.sourceType)) {
2270         // no need to check
2271         return true;
2272     }
2273 
2274     AppInfo appInfo = config.appInfo;
2275     if (PermissionUtil::VerifyBackgroundCapture(appInfo.appTokenId, appInfo.appFullTokenId)) {
2276         // check success
2277         return true;
2278     }
2279 
2280     SwitchStreamInfo info = {
2281         config.originalSessionId,
2282         config.callerUid,
2283         config.appInfo.appUid,
2284         config.appInfo.appPid,
2285         config.appInfo.appTokenId,
2286         CAPTURER_PREPARED,
2287     };
2288     if (SwitchStreamUtil::IsSwitchStreamSwitching(info, SWITCH_STATE_CREATED)) {
2289         AUDIO_INFO_LOG("Recreating stream for callerUid:%{public}d need not VerifyBackgroundCapture",
2290             config.callerUid);
2291         SwitchStreamUtil::UpdateSwitchStreamRecord(info, SWITCH_STATE_CREATED);
2292         return true;
2293     }
2294 
2295     std::string bundleName = AppBundleManager::GetBundleNameFromUid(config.appInfo.appUid);
2296     if (AudioService::GetInstance()->MatchForegroundList(bundleName, config.appInfo.appUid) &&
2297         config.capturerInfo.sourceType == SOURCE_TYPE_VOICE_COMMUNICATION) {
2298         AudioService::GetInstance()->UpdateForegroundState(config.appInfo.appTokenId, true);
2299         bool res = PermissionUtil::VerifyBackgroundCapture(appInfo.appTokenId, appInfo.appFullTokenId);
2300         AUDIO_INFO_LOG("Retry for %{public}s, result:%{public}s", bundleName.c_str(), (res ? "success" : "fail"));
2301         AudioService::GetInstance()->UpdateForegroundState(config.appInfo.appTokenId, false);
2302         return res;
2303     }
2304 
2305     AUDIO_WARNING_LOG("failed for %{public}s", bundleName.c_str());
2306     return false;
2307 }
2308 
SetForegroundList(const std::vector<std::string> & list)2309 int32_t AudioServer::SetForegroundList(const std::vector<std::string> &list)
2310 {
2311     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
2312         IPCSkeleton::GetCallingUid());
2313     AudioService::GetInstance()->SaveForegroundList(list);
2314     return SUCCESS;
2315 }
2316 
SetRenderWhitelist(const std::vector<std::string> & list)2317 int32_t AudioServer::SetRenderWhitelist(const std::vector<std::string> &list)
2318 {
2319     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
2320         IPCSkeleton::GetCallingUid());
2321     AudioService::GetInstance()->SaveRenderWhitelist(list);
2322     return SUCCESS;
2323 }
2324 
CheckVoiceCallRecorderPermission(Security::AccessToken::AccessTokenID tokenId)2325 bool AudioServer::CheckVoiceCallRecorderPermission(Security::AccessToken::AccessTokenID tokenId)
2326 {
2327     bool hasRecordVoiceCallPermission = VerifyClientPermission(RECORD_VOICE_CALL_PERMISSION, tokenId);
2328     CHECK_AND_RETURN_RET_LOG(hasRecordVoiceCallPermission, false, "No permission");
2329     return true;
2330 }
2331 
AudioServerDied(pid_t pid,pid_t uid)2332 void AudioServer::AudioServerDied(pid_t pid, pid_t uid)
2333 {
2334     AUDIO_INFO_LOG("Policy server died: restart pulse audio");
2335     _Exit(0);
2336 }
2337 
RegisterPolicyServerDeathRecipient()2338 void AudioServer::RegisterPolicyServerDeathRecipient()
2339 {
2340     AUDIO_INFO_LOG("Register policy server death recipient");
2341     pid_t pid = IPCSkeleton::GetCallingPid();
2342     pid_t uid = IPCSkeleton::GetCallingUid();
2343     sptr<AudioServerDeathRecipient> deathRecipient_ = new(std::nothrow) AudioServerDeathRecipient(pid, uid);
2344     if (deathRecipient_ != nullptr) {
2345         auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
2346         CHECK_AND_RETURN_LOG(samgr != nullptr, "Failed to obtain system ability manager");
2347         sptr<IRemoteObject> object = samgr->GetSystemAbility(OHOS::AUDIO_POLICY_SERVICE_ID);
2348         CHECK_AND_RETURN_LOG(object != nullptr, "Policy service unavailable");
2349         deathRecipient_->SetNotifyCb([this] (pid_t pid, pid_t uid) { this->AudioServerDied(pid, uid); });
2350         bool result = object->AddDeathRecipient(deathRecipient_);
2351         if (!result) {
2352             AUDIO_ERR_LOG("Failed to add deathRecipient");
2353         }
2354     }
2355 }
2356 
CreatePlaybackCapturerManager(bool & isSuccess)2357 int32_t AudioServer::CreatePlaybackCapturerManager(bool &isSuccess)
2358 {
2359 #ifdef HAS_FEATURE_INNERCAPTURER
2360     if (!PermissionUtil::VerifyIsAudio()) {
2361         AUDIO_ERR_LOG("not audio calling!");
2362         isSuccess = false;
2363         return ERR_PERMISSION_DENIED;
2364     }
2365     std::vector<int32_t> usage;
2366     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
2367     playbackCapturerMgr->SetSupportStreamUsage(usage);
2368     isSuccess = true;
2369     return SUCCESS;
2370 #else
2371     isSuccess = false;
2372     return ERR_NOT_SUPPORTED;
2373 #endif
2374 }
2375 // LCOV_EXCL_STOP
2376 
RegisterAudioCapturerSourceCallback()2377 void AudioServer::RegisterAudioCapturerSourceCallback()
2378 {
2379     IdHandler &idHandler = IdHandler::GetInstance();
2380     std::function<bool(uint32_t)> limitFunc = [&idHandler] (uint32_t id) -> bool {
2381         return idHandler.ParseType(id) == HDI_ID_TYPE_WAKEUP && idHandler.ParseInfo(id) == "Built_in_wakeup";
2382     };
2383     HdiAdapterManager::GetInstance().RegistSourceCallback(HDI_CB_CAPTURE_WAKEUP, this, limitFunc);
2384 
2385     limitFunc = [&idHandler] (uint32_t id) -> bool {
2386         uint32_t type = idHandler.ParseType(id);
2387         std::string info = idHandler.ParseInfo(id);
2388         if (type == HDI_ID_TYPE_PRIMARY) {
2389             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_USB;
2390         }
2391 #ifdef SUPPORT_LOW_LATENCY
2392         if (type == HDI_ID_TYPE_FAST) {
2393             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_VOIP;
2394         }
2395 #endif
2396         if (type == HDI_ID_TYPE_BLUETOOTH) {
2397             return info == HDI_ID_INFO_DEFAULT;
2398         }
2399         return false;
2400     };
2401     std::function<std::shared_ptr<IAudioSourceCallback>(uint32_t)> callbackGenerator = [this](uint32_t captureId) ->
2402         std::shared_ptr<IAudioSourceCallback> {
2403         return std::make_shared<CapturerStateOb>(captureId,
2404             [this] (bool isActive, size_t preNum, size_t curNum) {
2405                 this->OnCapturerState(isActive, preNum, curNum);
2406             }
2407         );
2408     };
2409     HdiAdapterManager::GetInstance().RegistSourceCallbackGenerator(HDI_CB_CAPTURE_STATE, callbackGenerator, limitFunc);
2410 }
2411 
RegisterAudioRendererSinkCallback()2412 void AudioServer::RegisterAudioRendererSinkCallback()
2413 {
2414     // Only watch primary and fast sink for now, watch other sinks later.
2415     IdHandler &idHandler = IdHandler::GetInstance();
2416     std::function<bool(uint32_t)> limitFunc = [&idHandler] (uint32_t id) -> bool {
2417         uint32_t type = idHandler.ParseType(id);
2418         std::string info = idHandler.ParseInfo(id);
2419         if (type == HDI_ID_TYPE_PRIMARY) {
2420             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_USB ||
2421                 info == HDI_ID_INFO_DIRECT || info == HDI_ID_INFO_DP ||
2422                 info == HDI_ID_INFO_VOIP;
2423         }
2424         if (type == HDI_ID_TYPE_OFFLOAD) {
2425             return info == HDI_ID_INFO_DEFAULT;
2426         }
2427         if (type == HDI_ID_TYPE_MULTICHANNEL) {
2428             return info == HDI_ID_INFO_DEFAULT;
2429         }
2430         if (type == HDI_ID_TYPE_BLUETOOTH) {
2431 #ifdef SUPPORT_LOW_LATENCY
2432             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_MMAP;
2433 #else
2434             return info == HDI_ID_INFO_DEFAULT;
2435 #endif
2436         }
2437 #ifdef SUPPORT_LOW_LATENCY
2438         if (type == HDI_ID_TYPE_FAST) {
2439             return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_VOIP;
2440         }
2441 #endif
2442         return false;
2443     };
2444     HdiAdapterManager::GetInstance().RegistSinkCallback(HDI_CB_RENDER_STATE, this, limitFunc);
2445 }
2446 
NotifyStreamVolumeChanged(int32_t streamType,float volume)2447 int32_t AudioServer::NotifyStreamVolumeChanged(int32_t streamType, float volume)
2448 {
2449     int32_t callingUid = IPCSkeleton::GetCallingUid();
2450     if (!PermissionUtil::VerifyIsAudio()) {
2451         AUDIO_ERR_LOG("NotifyStreamVolumeChanged refused for %{public}d", callingUid);
2452         return ERR_NOT_SUPPORTED;
2453     }
2454     AudioStreamType streamTypeTmp = static_cast<AudioStreamType>(streamType);
2455     SetSystemVolumeToEffect(streamTypeTmp, volume);
2456 
2457     int32_t ret = AudioService::GetInstance()->NotifyStreamVolumeChanged(streamTypeTmp, volume);
2458     if (ret != SUCCESS) {
2459         AUDIO_WARNING_LOG("NotifyStreamVolumeChanged failed");
2460     }
2461     ret = SetVolumeInfoForEnhanceChain(streamTypeTmp);
2462     if (ret != SUCCESS) {
2463         AUDIO_WARNING_LOG("SetVolumeInfoForEnhanceChain failed");
2464     }
2465     return SUCCESS;
2466 }
2467 
ResetRouteForDisconnect(int32_t type)2468 int32_t AudioServer::ResetRouteForDisconnect(int32_t type)
2469 {
2470     int32_t callingUid = IPCSkeleton::GetCallingUid();
2471     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
2472 
2473     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
2474     if (sink == nullptr) {
2475         AUDIO_ERR_LOG("audioRendererSinkInstance is null!");
2476         return ERROR;
2477     }
2478     sink->ResetActiveDeviceForDisconnect(static_cast<DeviceType>(type));
2479 
2480     // todo reset capturer
2481 
2482     return SUCCESS;
2483 }
2484 
GetMaxAmplitude(bool isOutputDevice,const std::string & deviceClass,int32_t sourceType,float & maxAmplitude)2485 int32_t AudioServer::GetMaxAmplitude(bool isOutputDevice, const std::string &deviceClass, int32_t sourceType,
2486     float &maxAmplitude)
2487 {
2488     maxAmplitude = 0;
2489     int32_t callingUid = IPCSkeleton::GetCallingUid();
2490     AUDIO_DEBUG_LOG("GetMaxAmplitude in audio server deviceClass %{public}s", deviceClass.c_str());
2491     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2492         "GetMaxAmplitude refused for %{public}d", callingUid);
2493 
2494     float fastMaxAmplitude = AudioService::GetInstance()->GetMaxAmplitude(isOutputDevice);
2495     std::shared_ptr<IAudioRenderSink> sink = nullptr;
2496     std::shared_ptr<IAudioCaptureSource> source = nullptr;
2497     if (isOutputDevice) {
2498         uint32_t renderId = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(deviceClass);
2499         sink = HdiAdapterManager::GetInstance().GetRenderSink(renderId, false);
2500         if (sink != nullptr) {
2501             float normalMaxAmplitude = sink->GetMaxAmplitude();
2502             maxAmplitude = (normalMaxAmplitude > fastMaxAmplitude) ? normalMaxAmplitude : fastMaxAmplitude;
2503         }
2504     } else {
2505         uint32_t sourceId = HdiAdapterManager::GetInstance().GetCaptureIdByDeviceClass(deviceClass,
2506             static_cast<SourceType>(sourceType));
2507         source = HdiAdapterManager::GetInstance().GetCaptureSource(sourceId, false);
2508         if (source != nullptr) {
2509             float normalMaxAmplitude = source->GetMaxAmplitude();
2510             maxAmplitude = (normalMaxAmplitude > fastMaxAmplitude) ? normalMaxAmplitude : fastMaxAmplitude;
2511         }
2512     }
2513 
2514     return SUCCESS;
2515 }
2516 
GetVolumeDataCount(const std::string & sinkName,int64_t & volumeDataCount)2517 int32_t AudioServer::GetVolumeDataCount(const std::string &sinkName, int64_t &volumeDataCount)
2518 {
2519     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED, "refused for %{public}d",
2520         IPCSkeleton::GetCallingUid());
2521     uint32_t renderId = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(sinkName);
2522     std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(renderId, false);
2523     if (sink != nullptr) {
2524         volumeDataCount = sink->GetVolumeDataCount();
2525     } else {
2526         volumeDataCount = 0;
2527         AUDIO_WARNING_LOG("can not find: %{public}s", sinkName.c_str());
2528     }
2529     return SUCCESS;
2530 }
2531 
ResetAudioEndpoint()2532 int32_t AudioServer::ResetAudioEndpoint()
2533 {
2534 #ifdef SUPPORT_LOW_LATENCY
2535     int32_t callingUid = IPCSkeleton::GetCallingUid();
2536     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2537         "Refused for %{public}d", callingUid);
2538     AudioService::GetInstance()->ResetAudioEndpoint();
2539     return SUCCESS;
2540 #endif
2541     return ERR_NOT_SUPPORTED;
2542 }
2543 // LCOV_EXCL_STOP
2544 
UpdateLatencyTimestamp(const std::string & timestamp,bool isRenderer)2545 int32_t AudioServer::UpdateLatencyTimestamp(const std::string &timestamp, bool isRenderer)
2546 {
2547     std::string stringTimestamp = timestamp;
2548     if (isRenderer) {
2549         LatencyMonitor::GetInstance().UpdateClientTime(true, stringTimestamp);
2550     } else {
2551         LatencyMonitor::GetInstance().UpdateClientTime(false, stringTimestamp);
2552         LatencyMonitor::GetInstance().ShowTimestamp(false);
2553     }
2554     return SUCCESS;
2555 }
2556 
2557 // LCOV_EXCL_START
UpdateDualToneState(bool enable,int32_t sessionId)2558 int32_t AudioServer::UpdateDualToneState(bool enable, int32_t sessionId)
2559 {
2560     int32_t callingUid = IPCSkeleton::GetCallingUid();
2561     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
2562 
2563     if (enable) {
2564         return AudioService::GetInstance()->EnableDualToneList(static_cast<uint32_t>(sessionId));
2565     } else {
2566         return AudioService::GetInstance()->DisableDualToneList(static_cast<uint32_t>(sessionId));
2567     }
2568 }
2569 // LCOV_EXCL_STOP
2570 
SetSinkRenderEmpty(const std::string & devceClass,int32_t durationUs)2571 int32_t AudioServer::SetSinkRenderEmpty(const std::string &devceClass, int32_t durationUs)
2572 {
2573     if (durationUs <= 0) {
2574         return SUCCESS;
2575     }
2576     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
2577     CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "has no valid sink");
2578 
2579     return sink->SetRenderEmpty(durationUs);
2580 }
2581 
2582 // LCOV_EXCL_START
SetSinkMuteForSwitchDevice(const std::string & devceClass,int32_t durationUs,bool mute)2583 int32_t AudioServer::SetSinkMuteForSwitchDevice(const std::string &devceClass, int32_t durationUs, bool mute)
2584 {
2585     int32_t callingUid = IPCSkeleton::GetCallingUid();
2586     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED, "refused for %{public}d",
2587         callingUid);
2588 
2589     if (durationUs <= 0) {
2590         return SUCCESS;
2591     }
2592 
2593     uint32_t id = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(devceClass);
2594     std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(id);
2595     CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "has no valid sink");
2596     return sink->SetSinkMuteForSwitchDevice(mute);
2597 }
2598 
UpdateSessionConnectionState(int32_t sessionId,int32_t state)2599 int32_t AudioServer::UpdateSessionConnectionState(int32_t sessionId, int32_t state)
2600 {
2601     AUDIO_INFO_LOG("Server get sessionID: %{public}d, state: %{public}d", sessionId, state);
2602     int32_t callingUid = IPCSkeleton::GetCallingUid();
2603     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2604         "Update session connection state refused for %{public}d", callingUid);
2605     std::shared_ptr<RendererInServer> renderer =
2606         AudioService::GetInstance()->GetRendererBySessionID(static_cast<uint32_t>(sessionId));
2607 
2608     if (renderer == nullptr) {
2609         AUDIO_ERR_LOG("No render in server has sessionID");
2610         return ERROR;
2611     }
2612     renderer->OnDataLinkConnectionUpdate(static_cast<IOperation>(state));
2613     std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
2614     CHECK_AND_RETURN_RET_LOG(sink, ERROR, "sink is nullptr");
2615     int32_t ret = sink->UpdatePrimaryConnectionState(state);
2616     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "sink do not support UpdatePrimaryConnectionState");
2617     return SUCCESS;
2618 }
2619 
SetLatestMuteState(uint32_t sessionId,bool muteFlag)2620 int32_t AudioServer::SetLatestMuteState(uint32_t sessionId, bool muteFlag)
2621 {
2622     AUDIO_INFO_LOG("sessionId_: %{public}u, muteFlag: %{public}d", sessionId, muteFlag);
2623     int32_t callingUid = IPCSkeleton::GetCallingUid();
2624     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2625         "Refused for %{public}d", callingUid);
2626     AudioService::GetInstance()->SetLatestMuteState(sessionId, muteFlag);
2627     return SUCCESS;
2628 }
2629 
SetSessionMuteState(uint32_t sessionId,bool insert,bool muteFlag)2630 int32_t AudioServer::SetSessionMuteState(uint32_t sessionId, bool insert, bool muteFlag)
2631 {
2632     AUDIO_INFO_LOG("sessionId_: %{public}u, muteFlag: %{public}d", sessionId, muteFlag);
2633     int32_t callingUid = IPCSkeleton::GetCallingUid();
2634     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2635         "Refused for %{public}d", callingUid);
2636     AudioService::GetInstance()->SetSessionMuteState(sessionId, insert, muteFlag);
2637     return SUCCESS;
2638 }
2639 
SetNonInterruptMute(uint32_t sessionId,bool muteFlag)2640 int32_t AudioServer::SetNonInterruptMute(uint32_t sessionId, bool muteFlag)
2641 {
2642     AUDIO_INFO_LOG("sessionId_: %{public}u, muteFlag: %{public}d", sessionId, muteFlag);
2643     int32_t callingUid = IPCSkeleton::GetCallingUid();
2644     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2645         "Refused for %{public}d", callingUid);
2646     AudioService::GetInstance()->SetNonInterruptMute(sessionId, muteFlag);
2647     return SUCCESS;
2648 }
2649 
RestoreSession(uint32_t sessionID,const RestoreInfoIpc & restoreInfoIpc)2650 int32_t AudioServer::RestoreSession(uint32_t sessionID, const RestoreInfoIpc &restoreInfoIpc)
2651 {
2652     const RestoreInfo &restoreInfo = restoreInfoIpc.restoreInfo;
2653     AUDIO_INFO_LOG("restore session: %{public}u, reason: %{public}d, device change reason %{public}d, "
2654         "target flag %{public}d", sessionID, restoreInfo.restoreReason, restoreInfo.deviceChangeReason,
2655         restoreInfo.targetStreamFlag);
2656     int32_t callingUid = IPCSkeleton::GetCallingUid();
2657     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2658         "Update session connection state refused for %{public}d", callingUid);
2659     int32_t tryCount = RESTORE_SESSION_TRY_COUNT;
2660     RestoreStatus restoreStatus;
2661     while (tryCount > 0) {
2662         restoreStatus = AudioService::GetInstance()->RestoreSession(sessionID, restoreInfo);
2663         if (restoreStatus == NEED_RESTORE) {
2664             return SUCCESS;
2665         }
2666         if (restoreStatus == RESTORING) {
2667             AUDIO_WARNING_LOG("Session %{public}u is restoring, wait 50ms, tryCount %{public}d", sessionID, tryCount);
2668             usleep(RESTORE_SESSION_RETRY_WAIT_TIME_IN_MS); // Sleep for 50ms and try restore again.
2669         }
2670         tryCount--;
2671     }
2672 
2673     if (restoreStatus != NEED_RESTORE) {
2674         AUDIO_WARNING_LOG("Restore session in server failed, restore status %{public}d", restoreStatus);
2675     }
2676     return SUCCESS;
2677 }
2678 
SetOffloadMode(uint32_t sessionId,int32_t state,bool isAppBack)2679 int32_t AudioServer::SetOffloadMode(uint32_t sessionId, int32_t state, bool isAppBack)
2680 {
2681     int32_t callingUid = IPCSkeleton::GetCallingUid();
2682     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
2683         callingUid);
2684     return AudioService::GetInstance()->SetOffloadMode(sessionId, state, isAppBack);
2685 }
2686 
UnsetOffloadMode(uint32_t sessionId)2687 int32_t AudioServer::UnsetOffloadMode(uint32_t sessionId)
2688 {
2689     int32_t callingUid = IPCSkeleton::GetCallingUid();
2690     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
2691         callingUid);
2692     return AudioService::GetInstance()->UnsetOffloadMode(sessionId);
2693 }
2694 // LCOV_EXCL_STOP
2695 
OnRenderSinkStateChange(uint32_t sinkId,bool started)2696 void AudioServer::OnRenderSinkStateChange(uint32_t sinkId, bool started)
2697 {
2698     AudioService::GetInstance()->UpdateAudioSinkState(sinkId, started);
2699     return;
2700 }
2701 
CheckHibernateState(bool hibernate)2702 int32_t AudioServer::CheckHibernateState(bool hibernate)
2703 {
2704     int32_t callingUid = IPCSkeleton::GetCallingUid();
2705     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2706         "refused for %{public}d", callingUid);
2707     AudioService::GetInstance()->CheckHibernateState(hibernate);
2708     return SUCCESS;
2709 }
2710 
CreateIpcOfflineStream(int32_t & errorCode,sptr<IRemoteObject> & client)2711 int32_t AudioServer::CreateIpcOfflineStream(int32_t &errorCode, sptr<IRemoteObject>& client)
2712 {
2713     client = nullptr;
2714     int32_t callingUid = IPCSkeleton::GetCallingUid();
2715     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
2716         "refused for %{public}d", callingUid);
2717     sptr<OfflineStreamInServer> stream = OfflineStreamInServer::GetOfflineStream(errorCode);
2718     CHECK_AND_RETURN_RET_LOG(stream, ERROR, "Create IIpcOfflineStream failed.");
2719     client = stream->AsObject();
2720     return SUCCESS;
2721 }
2722 
GetOfflineAudioEffectChains(std::vector<std::string> & effectChains)2723 int32_t AudioServer::GetOfflineAudioEffectChains(std::vector<std::string> &effectChains)
2724 {
2725     int32_t callingUid = IPCSkeleton::GetCallingUid();
2726     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
2727         "refused for %{public}d", callingUid);
2728 #ifdef FEATURE_OFFLINE_EFFECT
2729     return OfflineStreamInServer::GetOfflineAudioEffectChains(effectChains);
2730 #endif
2731     return ERR_NOT_SUPPORTED;
2732 }
2733 
GetStandbyStatus(uint32_t sessionId,bool & isStandby,int64_t & enterStandbyTime)2734 int32_t AudioServer::GetStandbyStatus(uint32_t sessionId, bool &isStandby, int64_t &enterStandbyTime)
2735 {
2736     Trace trace("AudioServer::GetStandbyStatus:" + std::to_string(sessionId));
2737 
2738     // only for native sa calling
2739     auto type = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID());
2740     bool isAllowed = type == Security::AccessToken::TOKEN_NATIVE;
2741 #ifdef AUDIO_BUILD_VARIANT_ROOT
2742     isAllowed = isAllowed || type == Security::AccessToken::TOKEN_SHELL; // for DT
2743 #endif
2744     CHECK_AND_RETURN_RET_LOG(isAllowed, ERR_INVALID_OPERATION, "not allowed");
2745 
2746     return AudioService::GetInstance()->GetStandbyStatus(sessionId, isStandby, enterStandbyTime);
2747 }
2748 
GenerateSessionId(uint32_t & sessionId)2749 int32_t AudioServer::GenerateSessionId(uint32_t &sessionId)
2750 {
2751     int32_t uid = IPCSkeleton::GetCallingUid();
2752     CHECK_AND_RETURN_RET_LOG(GENERATE_SESSIONID_UID_SET.count(uid) == 1, ERROR, "uid is %{public}d, not mcu uid", uid);
2753     sessionId = PolicyHandler::GetInstance().GenerateSessionId(uid);
2754     return SUCCESS;
2755 }
2756 
GetAllSinkInputs(std::vector<SinkInput> & sinkInputs)2757 int32_t AudioServer::GetAllSinkInputs(std::vector<SinkInput> &sinkInputs)
2758 {
2759     int32_t callingUid = IPCSkeleton::GetCallingUid();
2760     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2761         "Refused for %{public}d", callingUid);
2762     AudioService::GetInstance()->GetAllSinkInputs(sinkInputs);
2763     return SUCCESS;
2764 }
2765 
SetDefaultAdapterEnable(bool isEnable)2766 int32_t AudioServer::SetDefaultAdapterEnable(bool isEnable)
2767 {
2768     int32_t callingUid = IPCSkeleton::GetCallingUid();
2769     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2770         "Refused for %{public}d", callingUid);
2771     AudioService::GetInstance()->SetDefaultAdapterEnable(isEnable);
2772     return SUCCESS;
2773 }
2774 
NotifyAudioPolicyReady()2775 int32_t AudioServer::NotifyAudioPolicyReady()
2776 {
2777     int32_t callingUid = IPCSkeleton::GetCallingUid();
2778     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2779         "refused for %{public}d", callingUid);
2780 
2781     std::lock_guard lock(isAudioPolicyReadyMutex_);
2782     isAudioPolicyReady_ = true;
2783     isAudioPolicyReadyCv_.notify_all();
2784     AUDIO_INFO_LOG("out");
2785     return SUCCESS;
2786 }
2787 
2788 // LCOV_EXCL_START
CheckCaptureLimit(const AudioPlaybackCaptureConfig & config,int32_t & innerCapId)2789 int32_t AudioServer::CheckCaptureLimit(const AudioPlaybackCaptureConfig &config, int32_t &innerCapId)
2790 {
2791 #if defined(AUDIO_BUILD_VARIANT_ROOT) && defined(HAS_FEATURE_INNERCAPTURER)
2792     // root user case for auto test
2793     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2794     if (callingUid == ROOT_UID) {
2795         return InnerCheckCaptureLimit(config, innerCapId);
2796     }
2797 #endif
2798     return ERR_NOT_SUPPORTED;
2799 }
2800 
SetInnerCapLimit(uint32_t innerCapLimit)2801 int32_t AudioServer::SetInnerCapLimit(uint32_t innerCapLimit)
2802 {
2803 #ifdef HAS_FEATURE_INNERCAPTURER
2804     int32_t callingUid = IPCSkeleton::GetCallingUid();
2805     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED,
2806         "refused for %{public}d", callingUid);
2807     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
2808     int32_t ret = playbackCapturerMgr->SetInnerCapLimit(innerCapLimit);
2809     if (ret != SUCCESS) {
2810         AUDIO_ERR_LOG("SetInnerCapLimit error");
2811     }
2812     return ret;
2813 #endif
2814     return ERR_NOT_SUPPORTED;
2815 }
2816 // LCOV_EXCL_STOP
2817 
ReleaseCaptureLimit(int32_t innerCapId)2818 int32_t AudioServer::ReleaseCaptureLimit(int32_t innerCapId)
2819 {
2820 #if defined(AUDIO_BUILD_VARIANT_ROOT) && defined(HAS_FEATURE_INNERCAPTURER)
2821     // root user case for auto test
2822     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2823     if (callingUid == ROOT_UID) {
2824         PlaybackCapturerManager::GetInstance()->CheckReleaseUnloadModernInnerCapSink(innerCapId);
2825         return SUCCESS;
2826     }
2827 #endif
2828     return ERR_NOT_SUPPORTED;
2829 }
2830 
LoadHdiAdapter(uint32_t devMgrType,const std::string & adapterName)2831 int32_t AudioServer::LoadHdiAdapter(uint32_t devMgrType, const std::string &adapterName)
2832 {
2833     int32_t callingUid = IPCSkeleton::GetCallingUid();
2834     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
2835 
2836     return HdiAdapterManager::GetInstance().LoadAdapter(static_cast<HdiDeviceManagerType>(devMgrType), adapterName);
2837 }
2838 
UnloadHdiAdapter(uint32_t devMgrType,const std::string & adapterName,bool force)2839 int32_t AudioServer::UnloadHdiAdapter(uint32_t devMgrType, const std::string &adapterName, bool force)
2840 {
2841     int32_t callingUid = IPCSkeleton::GetCallingUid();
2842     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2843         "refused for %{public}d", callingUid);
2844 
2845     HdiAdapterManager::GetInstance().UnloadAdapter(static_cast<HdiDeviceManagerType>(devMgrType), adapterName, force);
2846     return SUCCESS;
2847 }
2848 
CreateHdiSinkPort(const std::string & deviceClass,const std::string & idInfo,const IAudioSinkAttr & attr,uint32_t & renderId)2849 int32_t AudioServer::CreateHdiSinkPort(const std::string &deviceClass, const std::string &idInfo,
2850     const IAudioSinkAttr &attr, uint32_t &renderId)
2851 {
2852     renderId = HDI_INVALID_ID;
2853     int32_t callingUid = IPCSkeleton::GetCallingUid();
2854     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), SUCCESS,
2855         "refused for %{public}d", callingUid);
2856 
2857     renderId = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(deviceClass, idInfo, true);
2858     CHECK_AND_RETURN_RET(renderId != HDI_INVALID_ID, SUCCESS);
2859     std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(renderId, true);
2860     if (sink == nullptr) {
2861         HdiAdapterManager::GetInstance().ReleaseId(renderId);
2862         renderId = HDI_INVALID_ID;
2863         return SUCCESS;
2864     }
2865     if (!sink->IsInited()) {
2866         sink->Init(attr);
2867     }
2868     return SUCCESS;
2869 }
2870 
CreateSinkPort(uint32_t idBase,uint32_t idType,const std::string & idInfo,const IAudioSinkAttr & attr,uint32_t & renderId)2871 int32_t AudioServer::CreateSinkPort(uint32_t idBase, uint32_t idType, const std::string &idInfo,
2872     const IAudioSinkAttr &attr, uint32_t &renderId)
2873 {
2874     renderId = HDI_INVALID_ID;
2875     int32_t callingUid = IPCSkeleton::GetCallingUid();
2876     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), SUCCESS,
2877         "refused for %{public}d", callingUid);
2878 
2879     AUDIO_INFO_LOG("In, idBase: %{public}u, idType: %{public}u, info: %{public}s", idBase, idType, idInfo.c_str());
2880     renderId = HdiAdapterManager::GetInstance().GetId(static_cast<HdiIdBase>(idBase),
2881         static_cast<HdiIdType>(idType), idInfo, true);
2882     CHECK_AND_RETURN_RET(renderId != HDI_INVALID_ID, SUCCESS);
2883     if (idInfo.find("InnerCapturerSink") != string::npos) {
2884         AUDIO_INFO_LOG("Inner-cap stream return");
2885         return SUCCESS;
2886     }
2887 
2888     // if stream is fast, create when endpoint config to reduce power
2889     if (idBase == HDI_ID_BASE_RENDER && (HDI_ID_TYPE_FAST == idType || HDI_ID_INFO_MMAP == idInfo)) {
2890         AUDIO_INFO_LOG("Fast stream delay create");
2891         return SUCCESS;
2892     }
2893     std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(renderId, true);
2894     if (sink == nullptr) {
2895         AUDIO_WARNING_LOG("Sink is nullptr");
2896         HdiAdapterManager::GetInstance().ReleaseId(renderId);
2897         renderId = HDI_INVALID_ID;
2898         return SUCCESS;
2899     }
2900     if (!sink->IsInited()) {
2901         sink->Init(attr);
2902     }
2903     return SUCCESS;
2904 }
2905 
CreateSourcePort(uint32_t idBase,uint32_t idType,const std::string & idInfo,const IAudioSourceAttr & attr,uint32_t & captureId)2906 int32_t AudioServer::CreateSourcePort(uint32_t idBase, uint32_t idType, const std::string &idInfo,
2907     const IAudioSourceAttr &attr, uint32_t &captureId)
2908 {
2909     captureId = HDI_INVALID_ID;
2910     int32_t callingUid = IPCSkeleton::GetCallingUid();
2911     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), SUCCESS,
2912         "refused for %{public}d", callingUid);
2913     AUDIO_INFO_LOG("In, idBase: %{public}u, idType: %{public}u, info: %{public}s", idBase, idType, idInfo.c_str());
2914     captureId = HdiAdapterManager::GetInstance().GetId(static_cast<HdiIdBase>(idBase),
2915         static_cast<HdiIdType>(idType), idInfo, true);
2916     CHECK_AND_RETURN_RET(captureId != HDI_INVALID_ID, SUCCESS);
2917 
2918     // if stream is fast, create when endpoint config to reduce power
2919     if (idBase == HDI_ID_BASE_CAPTURE && HDI_ID_TYPE_FAST == idType) {
2920         AUDIO_INFO_LOG("Fast stream delay create");
2921         return SUCCESS;
2922     }
2923     std::shared_ptr<IAudioCaptureSource> source = HdiAdapterManager::GetInstance().GetCaptureSource(captureId, true);
2924     if (source == nullptr) {
2925         AUDIO_WARNING_LOG("Source is nullptr");
2926         HdiAdapterManager::GetInstance().ReleaseId(captureId);
2927         captureId = HDI_INVALID_ID;
2928         return SUCCESS;
2929     }
2930     if (!source->IsInited()) {
2931         source->Init(attr);
2932     }
2933     return SUCCESS;
2934 }
2935 
CreateHdiSourcePort(const std::string & deviceClass,const std::string & idInfo,const IAudioSourceAttr & attr,uint32_t & captureId)2936 int32_t AudioServer::CreateHdiSourcePort(const std::string &deviceClass, const std::string &idInfo,
2937     const IAudioSourceAttr &attr, uint32_t &captureId)
2938 {
2939     captureId = HDI_INVALID_ID;
2940     int32_t callingUid = IPCSkeleton::GetCallingUid();
2941     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), SUCCESS,
2942         "refused for %{public}d", callingUid);
2943 
2944     captureId = HdiAdapterManager::GetInstance().GetCaptureIdByDeviceClass(deviceClass,
2945         static_cast<SourceType>(attr.sourceType), idInfo, true);
2946     CHECK_AND_RETURN_RET(captureId != HDI_INVALID_ID, SUCCESS);
2947     std::shared_ptr<IAudioCaptureSource> source = HdiAdapterManager::GetInstance().GetCaptureSource(captureId, true);
2948     if (source == nullptr) {
2949         AUDIO_WARNING_LOG("Source is nullptr");
2950         HdiAdapterManager::GetInstance().ReleaseId(captureId);
2951         captureId = HDI_INVALID_ID;
2952         return SUCCESS;
2953     }
2954     if (!source->IsInited()) {
2955         source->Init(attr);
2956     }
2957     return SUCCESS;
2958 }
2959 
DestroyHdiPort(uint32_t id)2960 int32_t AudioServer::DestroyHdiPort(uint32_t id)
2961 {
2962     int32_t callingUid = IPCSkeleton::GetCallingUid();
2963     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2964         "refused for %{public}d", callingUid);
2965 
2966     HdiAdapterManager::GetInstance().ReleaseId(id);
2967     return SUCCESS;
2968 }
2969 
SetDeviceConnectedFlag(bool flag)2970 int32_t AudioServer::SetDeviceConnectedFlag(bool flag)
2971 {
2972     int32_t callingUid = IPCSkeleton::GetCallingUid();
2973     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
2974         "refused for %{public}d", callingUid);
2975 
2976     std::shared_ptr<IAudioRenderSink> primarySink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DEFAULT, true);
2977     CHECK_AND_RETURN_RET_LOG(primarySink, ERROR, "primarySink is nullptr");
2978     primarySink->SetDeviceConnectedFlag(flag);
2979     return SUCCESS;
2980 }
2981 
CreateAudioWorkgroup(int32_t pid,const sptr<IRemoteObject> & object,int32_t & workgroupId)2982 int32_t AudioServer::CreateAudioWorkgroup(int32_t pid, const sptr<IRemoteObject> &object, int32_t &workgroupId)
2983 {
2984     CHECK_AND_RETURN_RET_LOG(AudioResourceService::GetInstance() != nullptr, ERROR, "AudioResourceService is nullptr");
2985     workgroupId = AudioResourceService::GetInstance()->CreateAudioWorkgroup(pid, object);
2986     return SUCCESS;
2987 }
2988 
ReleaseAudioWorkgroup(int32_t pid,int32_t workgroupId)2989 int32_t AudioServer::ReleaseAudioWorkgroup(int32_t pid, int32_t workgroupId)
2990 {
2991     return AudioResourceService::GetInstance()->ReleaseAudioWorkgroup(pid, workgroupId);
2992 }
2993 
AddThreadToGroup(int32_t pid,int32_t workgroupId,int32_t tokenId)2994 int32_t AudioServer::AddThreadToGroup(int32_t pid, int32_t workgroupId, int32_t tokenId)
2995 {
2996     return AudioResourceService::GetInstance()->AddThreadToGroup(pid, workgroupId, tokenId);
2997 }
2998 
RemoveThreadFromGroup(int32_t pid,int32_t workgroupId,int32_t tokenId)2999 int32_t AudioServer::RemoveThreadFromGroup(int32_t pid, int32_t workgroupId, int32_t tokenId)
3000 {
3001     return AudioResourceService::GetInstance()->RemoveThreadFromGroup(pid, workgroupId, tokenId);
3002 }
3003 
StartGroup(int32_t pid,int32_t workgroupId,uint64_t startTime,uint64_t deadlineTime)3004 int32_t AudioServer::StartGroup(int32_t pid, int32_t workgroupId, uint64_t startTime, uint64_t deadlineTime)
3005 {
3006     return AudioResourceService::GetInstance()->StartGroup(pid, workgroupId, startTime, deadlineTime);
3007 }
3008 
StopGroup(int32_t pid,int32_t workgroupId)3009 int32_t AudioServer::StopGroup(int32_t pid, int32_t workgroupId)
3010 {
3011     return AudioResourceService::GetInstance()->StopGroup(pid, workgroupId);
3012 }
3013 
SetBtHdiInvalidState()3014 int32_t AudioServer::SetBtHdiInvalidState()
3015 {
3016     int32_t callingUid = IPCSkeleton::GetCallingUid();
3017     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED,
3018         "refused for %{public}d", callingUid);
3019     auto limitFunc = [](uint32_t id) -> bool {
3020         std::string info = IdHandler::GetInstance().ParseInfo(id);
3021         if (IdHandler::GetInstance().ParseType(id) == HDI_ID_TYPE_BLUETOOTH &&
3022             IdHandler::GetInstance().ParseInfo(id) != HDI_ID_INFO_HEARING_AID) {
3023             return true;
3024         }
3025         return false;
3026     };
3027     auto sinkProcessFunc = [limitFunc](uint32_t renderId, std::shared_ptr<IAudioRenderSink> sink) -> int32_t {
3028         CHECK_AND_RETURN_RET(limitFunc(renderId), SUCCESS);
3029         CHECK_AND_RETURN_RET(sink != nullptr, SUCCESS);
3030 
3031         sink->SetInvalidState();
3032         return SUCCESS;
3033     };
3034     (void)HdiAdapterManager::GetInstance().ProcessSink(sinkProcessFunc);
3035     auto sourceProcessFunc = [limitFunc](uint32_t captureId, std::shared_ptr<IAudioCaptureSource> source) -> int32_t {
3036         CHECK_AND_RETURN_RET(limitFunc(captureId), SUCCESS);
3037         CHECK_AND_RETURN_RET(source != nullptr, SUCCESS);
3038 
3039         source->SetInvalidState();
3040         return SUCCESS;
3041     };
3042     (void)HdiAdapterManager::GetInstance().ProcessSource(sourceProcessFunc);
3043     return SUCCESS;
3044 }
3045 
SetActiveOutputDevice(int32_t deviceType)3046 int32_t AudioServer::SetActiveOutputDevice(int32_t deviceType)
3047 {
3048     CHECK_AND_RETURN_RET_LOG(deviceType >= DEVICE_TYPE_NONE && deviceType <= DEVICE_TYPE_MAX, AUDIO_ERR,
3049         "Set active output device failed, please check log");
3050     Trace trace("AudioServer::SetActiveOutputDevice:" + std::to_string(deviceType));
3051     if (!PermissionUtil::VerifyIsAudio()) {
3052         AUDIO_ERR_LOG("not audio calling!");
3053         return ERR_PERMISSION_DENIED;
3054     }
3055 
3056     PolicyHandler::GetInstance().SetActiveOutputDevice(static_cast<DeviceType>(deviceType));
3057     return SUCCESS;
3058 }
3059 
ForceStopAudioStream(int32_t audioType)3060 int32_t AudioServer::ForceStopAudioStream(int32_t audioType)
3061 {
3062     CHECK_AND_RETURN_RET_LOG(audioType >= STOP_ALL && audioType <= STOP_RECORD,
3063         ERR_INVALID_PARAM, "Invalid audioType");
3064     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_SYSTEM_PERMISSION_DENIED, "not audio calling!");
3065     CHECK_AND_RETURN_RET_LOG(AudioService::GetInstance() != nullptr, ERR_INVALID_OPERATION, "AudioService is nullptr");
3066     return AudioService::GetInstance()->ForceStopAudioStream(static_cast<StopAudioType>(audioType));
3067 }
3068 
ImproveAudioWorkgroupPrio(int32_t pid,const std::unordered_map<int32_t,bool> & threads)3069 int32_t AudioServer::ImproveAudioWorkgroupPrio(int32_t pid, const std::unordered_map<int32_t, bool> &threads)
3070 {
3071     return AudioResourceService::GetInstance()->ImproveAudioWorkgroupPrio(pid, threads);
3072 }
3073 
RestoreAudioWorkgroupPrio(int32_t pid,const std::unordered_map<int32_t,int32_t> & threads)3074 int32_t AudioServer::RestoreAudioWorkgroupPrio(int32_t pid, const std::unordered_map<int32_t, int32_t> &threads)
3075 {
3076     return AudioResourceService::GetInstance()->RestoreAudioWorkgroupPrio(pid, threads);
3077 }
3078 } // namespace AudioStandard
3079 } // namespace OHOS
3080