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 ¶m)
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 ¶m)
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>> ¶ms)
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>> ¶ms)
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> ¶meters)
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 ×tamp, 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