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 "manager/hdi_adapter_manager.h"
39 #include "sink/i_audio_render_sink.h"
40 #include "source/i_audio_capture_source.h"
41 #include "util/id_handler.h"
42 #include "audio_errors.h"
43 #include "audio_common_log.h"
44 #include "audio_asr.h"
45 #include "audio_manager_listener_proxy.h"
46 #include "audio_service.h"
47 #include "audio_schedule.h"
48 #include "audio_utils.h"
49 #include "i_standard_audio_server_manager_listener.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
59 #define PA
60 #ifdef PA
61 extern "C" {
62 extern int ohos_pa_main(int argc, char *argv[]);
63 }
64 #endif
65
66 using namespace std;
67
68 namespace OHOS {
69 namespace AudioStandard {
70 constexpr int32_t INTELL_VOICE_SERVICR_UID = 1042;
71 uint32_t AudioServer::paDaemonTid_;
72 std::map<std::string, std::string> AudioServer::audioParameters;
73 std::unordered_map<std::string, std::unordered_map<std::string, std::set<std::string>>> AudioServer::audioParameterKeys;
74 const string DEFAULT_COOKIE_PATH = "/data/data/.pulse_dir/state/cookie";
75 const std::string CHECK_FAST_BLOCK_PREFIX = "Is_Fast_Blocked_For_AppName#";
76 constexpr const char *TEL_SATELLITE_SUPPORT = "const.telephony.satellite.supported";
77 const std::string SATEMODEM_PARAMETER = "usedmodem=satemodem";
78 const std::string PCM_DUMP_KEY = "PCM_DUMP";
79 constexpr int32_t UID_FOUNDATION_SA = 5523;
80 const unsigned int TIME_OUT_SECONDS = 10;
81 const char* DUMP_AUDIO_PERMISSION = "ohos.permission.DUMP_AUDIO";
82 const char* MANAGE_INTELLIGENT_VOICE_PERMISSION = "ohos.permission.MANAGE_INTELLIGENT_VOICE";
83 const char* CAST_AUDIO_OUTPUT_PERMISSION = "ohos.permission.CAST_AUDIO_OUTPUT";
84 const char* CAPTURE_PLAYBACK_PERMISSION = "ohos.permission.CAPTURE_PLAYBACK";
85 static const std::vector<StreamUsage> STREAMS_NEED_VERIFY_SYSTEM_PERMISSION = {
86 STREAM_USAGE_SYSTEM,
87 STREAM_USAGE_DTMF,
88 STREAM_USAGE_ENFORCED_TONE,
89 STREAM_USAGE_ULTRASONIC,
90 STREAM_USAGE_VOICE_MODEM_COMMUNICATION
91 };
92 static const int32_t MODERN_INNER_API_VERSION = 12;
93 const int32_t API_VERSION_REMAINDER = 1000;
94 static constexpr int32_t VM_MANAGER_UID = 7700;
95 static const int32_t FAST_DUMPINFO_LEN = 2;
96 static const int32_t BUNDLENAME_LENGTH_LIMIT = 1024;
97 static const size_t PARAMETER_SET_LIMIT = 1024;
98 constexpr int32_t UID_CAMERA = 1047;
99 constexpr int32_t MAX_RENDERER_STREAM_CNT_PER_UID = 128;
100 const int32_t DEFAULT_MAX_RENDERER_INSTANCES = 128;
101 const int32_t MCU_UID = 7500;
102 static const std::set<int32_t> RECORD_CHECK_FORWARD_LIST = {
103 VM_MANAGER_UID,
104 UID_CAMERA
105 };
106 // using pass-in appInfo for uids:
107 constexpr int32_t UID_MEDIA_SA = 1013;
108 enum PermissionStatus {
109 PERMISSION_GRANTED = 0,
110 PERMISSION_DENIED = 1,
111 PERMISSION_UNKNOWN = 2,
112 };
113
114 const std::set<int32_t> RECORD_PASS_APPINFO_LIST = {
115 UID_MEDIA_SA
116 };
117
118 const std::set<SourceType> VALID_SOURCE_TYPE = {
119 SOURCE_TYPE_MIC,
120 SOURCE_TYPE_VOICE_RECOGNITION,
121 SOURCE_TYPE_PLAYBACK_CAPTURE,
122 SOURCE_TYPE_WAKEUP,
123 SOURCE_TYPE_VOICE_CALL,
124 SOURCE_TYPE_VOICE_COMMUNICATION,
125 SOURCE_TYPE_ULTRASONIC,
126 SOURCE_TYPE_VIRTUAL_CAPTURE,
127 SOURCE_TYPE_VOICE_MESSAGE,
128 SOURCE_TYPE_REMOTE_CAST,
129 SOURCE_TYPE_VOICE_TRANSCRIPTION,
130 SOURCE_TYPE_CAMCORDER,
131 SOURCE_TYPE_UNPROCESSED
132 };
133
134 static constexpr unsigned int GET_BUNDLE_TIME_OUT_SECONDS = 10;
135 static constexpr unsigned int WAIT_AUDIO_POLICY_READY_TIMEOUT_SECONDS = 5;
136 static constexpr int32_t MAX_WAIT_IN_SERVER_COUNT = 5;
137 static constexpr int32_t RESTORE_SESSION_TRY_COUNT = 10;
138 static constexpr uint32_t RESTORE_SESSION_RETRY_WAIT_TIME_IN_MS = 50000;
139
140 static const std::vector<SourceType> AUDIO_SUPPORTED_SOURCE_TYPES = {
141 SOURCE_TYPE_INVALID,
142 SOURCE_TYPE_MIC,
143 SOURCE_TYPE_VOICE_RECOGNITION,
144 SOURCE_TYPE_PLAYBACK_CAPTURE,
145 SOURCE_TYPE_WAKEUP,
146 SOURCE_TYPE_VOICE_CALL,
147 SOURCE_TYPE_VOICE_COMMUNICATION,
148 SOURCE_TYPE_ULTRASONIC,
149 SOURCE_TYPE_VIRTUAL_CAPTURE,
150 SOURCE_TYPE_VOICE_MESSAGE,
151 SOURCE_TYPE_REMOTE_CAST,
152 SOURCE_TYPE_VOICE_TRANSCRIPTION,
153 SOURCE_TYPE_CAMCORDER,
154 SOURCE_TYPE_UNPROCESSED,
155 };
156
157 static const std::vector<SourceType> AUDIO_FAST_STREAM_SUPPORTED_SOURCE_TYPES = {
158 SOURCE_TYPE_MIC,
159 SOURCE_TYPE_VOICE_RECOGNITION,
160 SOURCE_TYPE_VOICE_CALL,
161 SOURCE_TYPE_VOICE_COMMUNICATION,
162 SOURCE_TYPE_VIRTUAL_CAPTURE,
163 SOURCE_TYPE_VOICE_MESSAGE,
164 SOURCE_TYPE_VOICE_TRANSCRIPTION,
165 SOURCE_TYPE_CAMCORDER,
166 SOURCE_TYPE_UNPROCESSED,
167 };
168
IsNeedVerifyPermission(const StreamUsage streamUsage)169 static bool IsNeedVerifyPermission(const StreamUsage streamUsage)
170 {
171 for (const auto& item : STREAMS_NEED_VERIFY_SYSTEM_PERMISSION) {
172 if (streamUsage == item) {
173 return true;
174 }
175 }
176 return false;
177 }
178
IsVoiceModemCommunication(StreamUsage streamUsage,int32_t callingUid)179 static bool IsVoiceModemCommunication(StreamUsage streamUsage, int32_t callingUid)
180 {
181 return streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION && callingUid == UID_FOUNDATION_SA;
182 }
183
GetField(const std::string & src,const char * field,const char sep)184 static std::string GetField(const std::string &src, const char* field, const char sep)
185 {
186 auto str = std::string(field) + '=';
187 auto pos = src.find(str);
188 CHECK_AND_RETURN_RET(pos != std::string::npos, "");
189 pos += str.length();
190 auto end = src.find(sep, pos);
191 return end == std::string::npos ? src.substr(pos) : src.substr(pos, end - pos);
192 }
193
GetSinkByProp(HdiIdType type,const std::string & info=HDI_ID_INFO_DEFAULT,bool tryCreate=false)194 static inline std::shared_ptr<IAudioRenderSink> GetSinkByProp(HdiIdType type, const std::string &info =
195 HDI_ID_INFO_DEFAULT, bool tryCreate = false)
196 {
197 uint32_t id = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_RENDER, type, info);
198 return HdiAdapterManager::GetInstance().GetRenderSink(id, tryCreate);
199 }
200
GetSourceByProp(HdiIdType type,const std::string & info=HDI_ID_INFO_DEFAULT,bool tryCreate=false)201 static inline std::shared_ptr<IAudioCaptureSource> GetSourceByProp(HdiIdType type, const std::string &info =
202 HDI_ID_INFO_DEFAULT, bool tryCreate = false)
203 {
204 uint32_t id = HdiAdapterManager::GetInstance().GetId(HDI_ID_BASE_CAPTURE, type, info);
205 return HdiAdapterManager::GetInstance().GetCaptureSource(id, tryCreate);
206 }
207
UpdateArmInstance(std::shared_ptr<IAudioRenderSink> & sink,std::shared_ptr<IAudioCaptureSource> & source)208 static void UpdateArmInstance(std::shared_ptr<IAudioRenderSink> &sink,
209 std::shared_ptr<IAudioCaptureSource> &source)
210 {
211 sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB, true);
212 source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB, true);
213 std::shared_ptr<IAudioRenderSink> primarySink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
214 CHECK_AND_RETURN_LOG(primarySink, "primarySink is nullptr");
215 primarySink->ResetActiveDeviceForDisconnect(DEVICE_TYPE_NONE);
216 }
217
UpdatePrimaryInstance(std::shared_ptr<IAudioRenderSink> & sink,std::shared_ptr<IAudioCaptureSource> & source)218 static void UpdatePrimaryInstance(std::shared_ptr<IAudioRenderSink> &sink,
219 std::shared_ptr<IAudioCaptureSource> &source)
220 {
221 sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DEFAULT, true);
222 source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DEFAULT, true);
223 if (!source->IsInited()) {
224 #ifdef SUPPORT_LOW_LATENCY
225 AUDIO_INFO_LOG("Use fast capturer source instance");
226 source = GetSourceByProp(HDI_ID_TYPE_FAST, HDI_ID_INFO_DEFAULT, true);
227 #endif
228 }
229 }
230
231 class CapturerStateOb final : public IAudioSourceCallback {
232 public:
CapturerStateOb(std::function<void (bool,int32_t)> callback)233 explicit CapturerStateOb(std::function<void(bool, int32_t)> callback) : callback_(callback)
234 {
235 num_ = count_.fetch_add(1, std::memory_order_relaxed);
236 }
237
~CapturerStateOb()238 ~CapturerStateOb() override final
239 {
240 count_.fetch_sub(1, std::memory_order_relaxed);
241 }
242
OnCaptureState(bool isActive)243 void OnCaptureState(bool isActive) override final
244 {
245 callback_(isActive, num_);
246 }
247
248 private:
249 static inline std::atomic<int32_t> count_ = 0;
250 int32_t num_;
251
252 // callback to audioserver
253 std::function<void(bool, int32_t)> callback_;
254 };
255
256 REGISTER_SYSTEM_ABILITY_BY_ID(AudioServer, AUDIO_DISTRIBUTED_SERVICE_ID, true)
257
258 #ifdef PA
259 constexpr int PA_ARG_COUNT = 1;
260
paDaemonThread(void * arg)261 void *AudioServer::paDaemonThread(void *arg)
262 {
263 /* Load the mandatory pulseaudio modules at start */
264 char *argv[] = {
265 (char*)"pulseaudio",
266 };
267 // set audio thread priority
268 ScheduleThreadInServer(getpid(), gettid());
269 paDaemonTid_ = static_cast<uint32_t>(gettid());
270 AUDIO_INFO_LOG("Calling ohos_pa_main\n");
271 ohos_pa_main(PA_ARG_COUNT, argv);
272 AUDIO_INFO_LOG("Exiting ohos_pa_main\n");
273 UnscheduleThreadInServer(getpid(), gettid());
274 _exit(-1);
275 }
276 #endif
277
AudioServer(int32_t systemAbilityId,bool runOnCreate)278 AudioServer::AudioServer(int32_t systemAbilityId, bool runOnCreate)
279 : SystemAbility(systemAbilityId, runOnCreate),
280 audioEffectServer_(std::make_unique<AudioEffectServer>()) {}
281
OnDump()282 void AudioServer::OnDump() {}
283
Dump(int32_t fd,const std::vector<std::u16string> & args)284 int32_t AudioServer::Dump(int32_t fd, const std::vector<std::u16string> &args)
285 {
286 AUDIO_INFO_LOG("Dump Process Invoked");
287 if (args.size() == FAST_DUMPINFO_LEN && args[0] == u"-fb") {
288 std::string bundleName = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(args[1]);
289 std::string result = GetAudioParameter(CHECK_FAST_BLOCK_PREFIX + bundleName);
290 std::string dumpString = "check fast list :bundle name is" + bundleName + " result is " + result + "\n";
291 return write(fd, dumpString.c_str(), dumpString.size());
292 }
293
294 std::queue<std::u16string> argQue;
295 for (decltype(args.size()) index = 0; index < args.size(); ++index) {
296 argQue.push(args[index]);
297 }
298 std::string dumpString;
299
300 AudioServerDump dumpObj;
301 int32_t res = dumpObj.Initialize();
302 CHECK_AND_RETURN_RET_LOG(res == AUDIO_DUMP_SUCCESS, AUDIO_DUMP_INIT_ERR,
303 "Audio Service Dump Not initialised\n");
304 dumpObj.AudioDataDump(dumpString, argQue);
305 return write(fd, dumpString.c_str(), dumpString.size());
306 }
307
InitMaxRendererStreamCntPerUid()308 void AudioServer::InitMaxRendererStreamCntPerUid()
309 {
310 bool result = GetSysPara("const.multimedia.audio.stream_cnt_uid", maxRendererStreamCntPerUid_);
311 if (!result || maxRendererStreamCntPerUid_ <= 0) {
312 maxRendererStreamCntPerUid_ = MAX_RENDERER_STREAM_CNT_PER_UID;
313 }
314 }
315
OnStart()316 void AudioServer::OnStart()
317 {
318 AUDIO_INFO_LOG("OnStart uid:%{public}d", getuid());
319 DlopenUtils::Init();
320 InitMaxRendererStreamCntPerUid();
321 AudioInnerCall::GetInstance()->RegisterAudioServer(this);
322 bool res = Publish(this);
323 if (!res) {
324 AUDIO_ERR_LOG("start err");
325 WriteServiceStartupError();
326 }
327 int32_t fastControlFlag = 0; // default 0, set isFastControlled_ false
328 GetSysPara("persist.multimedia.audioflag.fastcontrolled", fastControlFlag);
329 if (fastControlFlag == 1) {
330 isFastControlled_ = true;
331 }
332 int32_t audioCacheState = 0;
333 GetSysPara("persist.multimedia.audio.audioCacheState", audioCacheState);
334 if (audioCacheState != 0) {
335 AudioCacheMgr::GetInstance().Init();
336 }
337 AddSystemAbilityListener(AUDIO_POLICY_SERVICE_ID);
338 AddSystemAbilityListener(RES_SCHED_SYS_ABILITY_ID);
339 #ifdef PA
340 int32_t ret = pthread_create(&m_paDaemonThread, nullptr, AudioServer::paDaemonThread, nullptr);
341 pthread_setname_np(m_paDaemonThread, "OS_PaDaemon");
342 if (ret != 0) {
343 AUDIO_ERR_LOG("pthread_create failed %d", ret);
344 WriteServiceStartupError();
345 }
346 AUDIO_DEBUG_LOG("Created paDaemonThread\n");
347 #endif
348
349 RegisterAudioCapturerSourceCallback();
350 RegisterAudioRendererSinkCallback();
351 ParseAudioParameter();
352 DlopenUtils::DeInit();
353 }
354
ParseAudioParameter()355 void AudioServer::ParseAudioParameter()
356 {
357 std::unique_ptr<AudioParamParser> audioParamParser = make_unique<AudioParamParser>();
358 if (audioParamParser == nullptr) {
359 WriteServiceStartupError();
360 }
361 CHECK_AND_RETURN_LOG(audioParamParser != nullptr, "Failed to create audio extra parameters parser");
362 std::unique_lock<std::shared_mutex> lock(audioParameterKeyMutex_);
363 if (audioParamParser->LoadConfiguration(audioParameterKeys)) {
364 AUDIO_INFO_LOG("Audio extra parameters load configuration successfully.");
365 }
366 isAudioParameterParsed_ = true;
367
368 for (const auto& pair : audioExtraParameterCacheVector_) {
369 SetExtraParameters(pair.first, pair.second);
370 }
371 audioExtraParameterCacheVector_.clear();
372 AUDIO_INFO_LOG("Audio extra parameters replay cached successfully.");
373 }
374
WriteServiceStartupError()375 void AudioServer::WriteServiceStartupError()
376 {
377 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
378 Media::MediaMonitor::AUDIO, Media::MediaMonitor::AUDIO_SERVICE_STARTUP_ERROR,
379 Media::MediaMonitor::FAULT_EVENT);
380 bean->Add("SERVICE_ID", static_cast<int32_t>(Media::MediaMonitor::AUDIO_SERVER_ID));
381 bean->Add("ERROR_CODE", static_cast<int32_t>(Media::MediaMonitor::AUDIO_SERVER));
382 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
383 }
384
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)385 void AudioServer::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
386 {
387 AUDIO_DEBUG_LOG("systemAbilityId:%{public}d", systemAbilityId);
388 switch (systemAbilityId) {
389 case AUDIO_POLICY_SERVICE_ID:
390 AUDIO_INFO_LOG("input service start");
391 RegisterPolicyServerDeathRecipient();
392 break;
393 case RES_SCHED_SYS_ABILITY_ID:
394 AUDIO_INFO_LOG("ressched service start");
395 OnAddResSchedService(getpid());
396 break;
397 default:
398 AUDIO_ERR_LOG("unhandled sysabilityId:%{public}d", systemAbilityId);
399 break;
400 }
401 }
402
OnStop()403 void AudioServer::OnStop()
404 {
405 AUDIO_DEBUG_LOG("OnStop");
406 }
407
SetPcmDumpParameter(const std::vector<std::pair<std::string,std::string>> & params)408 bool AudioServer::SetPcmDumpParameter(const std::vector<std::pair<std::string, std::string>> ¶ms)
409 {
410 bool ret = VerifyClientPermission(DUMP_AUDIO_PERMISSION);
411 CHECK_AND_RETURN_RET_LOG(ret, false, "set audiodump parameters failed: no permission.");
412 CHECK_AND_RETURN_RET_LOG(params.size() > 0, false, "params is empty!");
413 return AudioCacheMgr::GetInstance().SetDumpParameter(params);
414 }
415
SetExtraParameters(const std::string & key,const std::vector<std::pair<std::string,std::string>> & kvpairs)416 int32_t AudioServer::SetExtraParameters(const std::string& key,
417 const std::vector<std::pair<std::string, std::string>>& kvpairs)
418 {
419 bool ret = PermissionUtil::VerifySystemPermission();
420 CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "set extra parameters failed: not system app.");
421 ret = VerifyClientPermission(MODIFY_AUDIO_SETTINGS_PERMISSION);
422 CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "set extra parameters failed: no permission.");
423
424 if (key == PCM_DUMP_KEY) {
425 ret = SetPcmDumpParameter(kvpairs);
426 CHECK_AND_RETURN_RET_LOG(ret, ERROR, "set audiodump parameters failed");
427 return SUCCESS;
428 }
429
430 std::shared_lock<std::shared_mutex> lock(audioParameterKeyMutex_);
431 if (audioParameterKeys.empty()) {
432 CacheExtraParameters(key, kvpairs);
433 AUDIO_ERR_LOG("audio extra parameters mainKey and subKey is empty");
434 return ERROR;
435 }
436
437 auto mainKeyIt = audioParameterKeys.find(key);
438 if (mainKeyIt == audioParameterKeys.end()) {
439 return ERR_INVALID_PARAM;
440 }
441
442 std::unordered_map<std::string, std::set<std::string>> subKeyMap = mainKeyIt->second;
443 std::string value;
444 bool match = true;
445 for (auto it = kvpairs.begin(); it != kvpairs.end(); it++) {
446 auto subKeyIt = subKeyMap.find(it->first);
447 if (subKeyIt != subKeyMap.end()) {
448 value += it->first + "=" + it->second + ";";
449 if (it->first == "unprocess_audio_effect") {
450 int appUid = IPCSkeleton::GetCallingUid();
451 AUDIO_INFO_LOG("add unprocess UID [%{public}d]", appUid);
452 IStreamManager::GetRecorderManager().AddUnprocessStream(appUid);
453 continue;
454 }
455 auto valueIter = subKeyIt->second.find("effect");
456 if (valueIter != subKeyIt->second.end()) {
457 RecognizeAudioEffectType(key, it->first, it->second);
458 }
459 } else {
460 match = false;
461 break;
462 }
463 }
464 if (!match) { return ERR_INVALID_PARAM; }
465
466 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
467 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
468 CHECK_AND_RETURN_RET_LOG(deviceManager != nullptr, ERROR, "local device manager is nullptr");
469 deviceManager->SetAudioParameter("primary", AudioParamKey::NONE, "", value);
470 return SUCCESS;
471 }
472
CacheExtraParameters(const std::string & key,const std::vector<std::pair<std::string,std::string>> & kvpairs)473 void AudioServer::CacheExtraParameters(const std::string& key,
474 const std::vector<std::pair<std::string, std::string>>& kvpairs)
475 {
476 if (!isAudioParameterParsed_) {
477 AUDIO_INFO_LOG("Audio extra parameters will be cached");
478 std::pair<std::string,
479 std::vector<std::pair<std::string, std::string>>> cache(key, kvpairs);
480 audioExtraParameterCacheVector_.push_back(cache);
481 }
482 }
483
SetA2dpAudioParameter(const std::string & renderValue)484 void AudioServer::SetA2dpAudioParameter(const std::string &renderValue)
485 {
486 auto parmKey = AudioParamKey::A2DP_SUSPEND_STATE;
487
488 std::shared_ptr<IAudioRenderSink> btSink = GetSinkByProp(HDI_ID_TYPE_BLUETOOTH);
489 CHECK_AND_RETURN_LOG(btSink != nullptr, "has no valid sink");
490 btSink->SetAudioParameter(parmKey, "", renderValue);
491
492 if (AudioService::GetInstance()->HasBluetoothEndpoint()) {
493 std::shared_ptr<IAudioRenderSink> btFastSink = GetSinkByProp(HDI_ID_TYPE_BLUETOOTH, HDI_ID_INFO_MMAP);
494 CHECK_AND_RETURN_LOG(btFastSink != nullptr, "has no valid fast sink");
495 btFastSink->SetAudioParameter(parmKey, "", renderValue);
496 AUDIO_INFO_LOG("HasBlueToothEndpoint");
497 }
498 }
499
SetAudioParameter(const std::string & key,const std::string & value)500 void AudioServer::SetAudioParameter(const std::string &key, const std::string &value)
501 {
502 std::lock_guard<std::mutex> lockSet(audioParameterMutex_);
503 AudioXCollie audioXCollie("AudioServer::SetAudioParameter", TIME_OUT_SECONDS);
504 AUDIO_DEBUG_LOG("server: set audio parameter");
505 if (key != "AUDIO_EXT_PARAM_KEY_A2DP_OFFLOAD_CONFIG") {
506 bool ret = VerifyClientPermission(MODIFY_AUDIO_SETTINGS_PERMISSION);
507 CHECK_AND_RETURN_LOG(ret, "MODIFY_AUDIO_SETTINGS permission denied");
508 } else {
509 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "A2dp offload modify audio settings permission denied");
510 }
511
512 CHECK_AND_RETURN_LOG(audioParameters.size() < PARAMETER_SET_LIMIT,
513 "SetAudioParameter failed! audioParameters_map is too large!");
514 AudioServer::audioParameters[key] = value;
515
516 // send it to hal
517 if (key == "A2dpSuspended") {
518 std::string renderValue = key + "=" + value + ";";
519 SetA2dpAudioParameter(renderValue);
520 return;
521 }
522
523 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
524 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
525 CHECK_AND_RETURN_LOG(deviceManager != nullptr, "local device manager is nullptr");
526
527 AudioParamKey parmKey = AudioParamKey::NONE;
528 if (key == "AUDIO_EXT_PARAM_KEY_LOWPOWER") {
529 parmKey = AudioParamKey::PARAM_KEY_LOWPOWER;
530 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::AUDIO, "SMARTPA_LOWPOWER",
531 HiviewDFX::HiSysEvent::EventType::BEHAVIOR, "STATE", value == "SmartPA_lowpower=on" ? 1 : 0);
532 } else if (key == "bt_headset_nrec") {
533 parmKey = AudioParamKey::BT_HEADSET_NREC;
534 } else if (key == "bt_wbs") {
535 parmKey = AudioParamKey::BT_WBS;
536 } else if (key == "AUDIO_EXT_PARAM_KEY_A2DP_OFFLOAD_CONFIG") {
537 parmKey = AudioParamKey::A2DP_OFFLOAD_STATE;
538 std::string value_new = "a2dpOffloadConfig=" + value;
539 deviceManager->SetAudioParameter("primary", parmKey, "", value_new);
540 return;
541 } else if (key == "mmi") {
542 parmKey = AudioParamKey::MMI;
543 } else if (key == "perf_info") {
544 parmKey = AudioParamKey::PERF_INFO;
545 } else {
546 AUDIO_ERR_LOG("key %{public}s is invalid for hdi interface", key.c_str());
547 return;
548 }
549 deviceManager->SetAudioParameter("primary", parmKey, "", value);
550 }
551
SuspendRenderSink(const std::string & sinkName)552 int32_t AudioServer::SuspendRenderSink(const std::string &sinkName)
553 {
554 if (!PermissionUtil::VerifyIsAudio()) {
555 AUDIO_ERR_LOG("not audio calling!");
556 return ERR_OPERATION_FAILED;
557 }
558 uint32_t id = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(sinkName.c_str());
559 std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(id);
560 CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "get sink fail, sinkName: %{public}s", sinkName.c_str());
561 return sink->SuspendRenderSink();
562 }
563
RestoreRenderSink(const std::string & sinkName)564 int32_t AudioServer::RestoreRenderSink(const std::string &sinkName)
565 {
566 if (!PermissionUtil::VerifyIsAudio()) {
567 AUDIO_ERR_LOG("not audio calling!");
568 return ERR_OPERATION_FAILED;
569 }
570 uint32_t id = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(sinkName.c_str());
571 std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(id);
572 CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "get sink fail, sinkName: %{public}s", sinkName.c_str());
573 return sink->RestoreRenderSink();
574 }
575
SetAudioParameter(const std::string & networkId,const AudioParamKey key,const std::string & condition,const std::string & value)576 void AudioServer::SetAudioParameter(const std::string& networkId, const AudioParamKey key, const std::string& condition,
577 const std::string& value)
578 {
579 int32_t callingUid = IPCSkeleton::GetCallingUid();
580 bool ret = VerifyClientPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION);
581 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio() || ret, "refused for %{public}d", callingUid);
582
583 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
584 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_REMOTE);
585 CHECK_AND_RETURN_LOG(deviceManager != nullptr, "device manager is nullptr");
586 return deviceManager->SetAudioParameter(networkId.c_str(), key, condition, value);
587 }
588
GetPcmDumpParameter(const std::vector<std::string> & subKeys,std::vector<std::pair<std::string,std::string>> & result)589 bool AudioServer::GetPcmDumpParameter(const std::vector<std::string> &subKeys,
590 std::vector<std::pair<std::string, std::string>> &result)
591 {
592 bool ret = VerifyClientPermission(DUMP_AUDIO_PERMISSION);
593 CHECK_AND_RETURN_RET_LOG(ret, false, "get audiodump parameters no permission");
594 CHECK_AND_RETURN_RET_LOG(subKeys.size() > 0, false, "subKeys is empty!");
595 return AudioCacheMgr::GetInstance().GetDumpParameter(subKeys, result);
596 }
597
GetExtraParameters(const std::string & mainKey,const std::vector<std::string> & subKeys,std::vector<std::pair<std::string,std::string>> & result)598 int32_t AudioServer::GetExtraParameters(const std::string &mainKey,
599 const std::vector<std::string> &subKeys, std::vector<std::pair<std::string, std::string>> &result)
600 {
601 if (mainKey == PCM_DUMP_KEY) {
602 bool ret = GetPcmDumpParameter(subKeys, result);
603 CHECK_AND_RETURN_RET_LOG(ret, ERROR, "get audiodump parameters failed");
604 return SUCCESS;
605 }
606
607 std::shared_lock<std::shared_mutex> lock(audioParameterKeyMutex_);
608 if (audioParameterKeys.empty()) {
609 AUDIO_ERR_LOG("audio extra parameters mainKey and subKey is empty");
610 return ERROR;
611 }
612
613 auto mainKeyIt = audioParameterKeys.find(mainKey);
614 if (mainKeyIt == audioParameterKeys.end()) {
615 return ERR_INVALID_PARAM;
616 }
617
618 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
619 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
620 CHECK_AND_RETURN_RET_LOG(deviceManager != nullptr, ERROR, "device manager is nullptr");
621 std::unordered_map<std::string, std::set<std::string>> subKeyMap = mainKeyIt->second;
622 if (subKeys.empty()) {
623 for (auto it = subKeyMap.begin(); it != subKeyMap.end(); it++) {
624 std::string value = deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, it->first);
625 result.emplace_back(std::make_pair(it->first, value));
626 }
627 return SUCCESS;
628 }
629
630 bool match = true;
631 for (auto it = subKeys.begin(); it != subKeys.end(); it++) {
632 auto subKeyIt = subKeyMap.find(*it);
633 if (subKeyIt != subKeyMap.end()) {
634 std::string value = deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, *it);
635 result.emplace_back(std::make_pair(*it, value));
636 } else {
637 match = false;
638 break;
639 }
640 }
641 if (!match) {
642 result.clear();
643 return ERR_INVALID_PARAM;
644 }
645 return SUCCESS;
646 }
647
CheckAndPrintStacktrace(const std::string & key)648 bool AudioServer::CheckAndPrintStacktrace(const std::string &key)
649 {
650 AUDIO_WARNING_LOG("Start handle forced xcollie event for key %{public}s", key.c_str());
651 if (key == "dump_pulseaudio_stacktrace") {
652 AudioXCollie audioXCollie("AudioServer::PrintStackTrace", 1);
653 sleep(2); // sleep 2 seconds to dump stacktrace
654 return true;
655 } else if (key == "recovery_audio_server") {
656 AudioXCollie audioXCollie("AudioServer::Kill", 1, nullptr, nullptr, AUDIO_XCOLLIE_FLAG_RECOVERY);
657 sleep(2); // sleep 2 seconds to dump stacktrace
658 return true;
659 } else if (key == "dump_pa_stacktrace_and_kill") {
660 AudioXCollie audioXCollie("AudioServer::PrintStackTraceAndKill", 1, nullptr, nullptr,
661 AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY);
662 sleep(2); // sleep 2 seconds to dump stacktrace
663 return true;
664 }
665 return false;
666 }
667
GetAudioParameter(const std::string & key)668 const std::string AudioServer::GetAudioParameter(const std::string &key)
669 {
670 if (IPCSkeleton::GetCallingUid() == MEDIA_SERVICE_UID && CheckAndPrintStacktrace(key) == true) {
671 return "";
672 }
673 std::lock_guard<std::mutex> lockSet(audioParameterMutex_);
674 AudioXCollie audioXCollie("GetAudioParameter", TIME_OUT_SECONDS);
675
676 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
677 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
678
679 if (deviceManager != nullptr) {
680 AudioParamKey parmKey = AudioParamKey::NONE;
681 if (key == "AUDIO_EXT_PARAM_KEY_LOWPOWER") {
682 parmKey = AudioParamKey::PARAM_KEY_LOWPOWER;
683 return deviceManager->GetAudioParameter("primary", AudioParamKey(parmKey), "");
684 }
685 if (key.find("need_change_usb_device#C", 0) == 0) {
686 parmKey = AudioParamKey::USB_DEVICE;
687 return deviceManager->GetAudioParameter("primary", AudioParamKey(parmKey), key);
688 }
689 if (key == "getSmartPAPOWER" || key == "show_RealTime_ChipModel") {
690 return deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, key);
691 }
692 if (key == "perf_info") {
693 return deviceManager->GetAudioParameter("primary", AudioParamKey::PERF_INFO, key);
694 }
695 if (key.size() < BUNDLENAME_LENGTH_LIMIT && key.size() > CHECK_FAST_BLOCK_PREFIX.size() &&
696 key.substr(0, CHECK_FAST_BLOCK_PREFIX.size()) == CHECK_FAST_BLOCK_PREFIX) {
697 return deviceManager->GetAudioParameter("primary", AudioParamKey::NONE, key);
698 }
699
700 const std::string mmiPre = "mmi_";
701 if (key.size() > mmiPre.size()) {
702 if (key.substr(0, mmiPre.size()) == mmiPre) {
703 parmKey = AudioParamKey::MMI;
704 return deviceManager->GetAudioParameter("primary", AudioParamKey(parmKey),
705 key.substr(mmiPre.size(), key.size() - mmiPre.size()));
706 }
707 }
708 }
709
710 if (AudioServer::audioParameters.count(key)) {
711 return AudioServer::audioParameters[key];
712 } else {
713 return "";
714 }
715 }
716
GetDPParameter(const std::string & condition)717 const std::string AudioServer::GetDPParameter(const std::string &condition)
718 {
719 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DP, true);
720 CHECK_AND_RETURN_RET_LOG(sink != nullptr, "", "get dp sink fail");
721
722 return sink->GetAudioParameter(AudioParamKey::GET_DP_DEVICE_INFO, condition);
723 }
724
GetUsbParameter(const std::string & condition)725 const std::string AudioServer::GetUsbParameter(const std::string &condition)
726 {
727 AUDIO_INFO_LOG("AudioServer::GetUsbParameter Entry. condition=%{public}s", condition.c_str());
728 string address = GetField(condition, "address", ' ');
729 int32_t deviceRoleNum = static_cast<int32_t>(DEVICE_ROLE_NONE);
730 std::string usbInfoStr;
731 CHECK_AND_RETURN_RET_LOG(StringConverter(GetField(condition, "role", ' '), deviceRoleNum), usbInfoStr,
732 "convert invalid value: %{public}s", GetField(condition, "role", ' ').c_str());
733 DeviceRole role = static_cast<DeviceRole>(deviceRoleNum);
734
735 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
736 CHECK_AND_RETURN_RET_LOG(sink, "", "rendererSink is nullptr");
737 std::string infoCond = std::string("get_usb_info#C") + GetField(address, "card", ';') + "D0";
738 if (role == OUTPUT_DEVICE) {
739 sink->SetAddress(address);
740 auto it = usbInfoMap_.find(address);
741 if (it == usbInfoMap_.end()) {
742 usbInfoStr = sink->GetAudioParameter(USB_DEVICE, infoCond);
743 usbInfoMap_[address] = usbInfoStr;
744 } else {
745 usbInfoStr = it->second;
746 }
747 } else if (role == INPUT_DEVICE) {
748 std::shared_ptr<IAudioCaptureSource> source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
749 CHECK_AND_RETURN_RET_LOG(source, "", "capturerSource is nullptr");
750 source->SetAddress(address);
751 auto it = usbInfoMap_.find(address);
752 if (it == usbInfoMap_.end()) {
753 usbInfoStr = sink->GetAudioParameter(USB_DEVICE, infoCond);
754 usbInfoMap_[address] = usbInfoStr;
755 } else {
756 usbInfoStr = it->second;
757 }
758 } else {
759 usbInfoMap_.erase(address);
760 }
761 AUDIO_INFO_LOG("infoCond=%{public}s, usbInfoStr=%{public}s", infoCond.c_str(), usbInfoStr.c_str());
762 return usbInfoStr;
763 }
764
GetAudioParameter(const std::string & networkId,const AudioParamKey key,const std::string & condition)765 const std::string AudioServer::GetAudioParameter(const std::string& networkId, const AudioParamKey key,
766 const std::string& condition)
767 {
768 int32_t callingUid = IPCSkeleton::GetCallingUid();
769 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio() ||
770 VerifyClientPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION), "", "refused for %{public}d", callingUid);
771
772 if (networkId == LOCAL_NETWORK_ID) {
773 AudioXCollie audioXCollie("GetAudioParameter", TIME_OUT_SECONDS);
774 if (key == AudioParamKey::USB_DEVICE) {
775 return GetUsbParameter(condition);
776 }
777 if (key == AudioParamKey::GET_DP_DEVICE_INFO) {
778 return GetDPParameter(condition);
779 }
780 } else {
781 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_REMOTE, networkId);
782 CHECK_AND_RETURN_RET_LOG(sink != nullptr, "", "get remote sink fail");
783 return sink->GetAudioParameter(key, condition);
784 }
785 return "";
786 }
787
GetTransactionId(DeviceType deviceType,DeviceRole deviceRole)788 uint64_t AudioServer::GetTransactionId(DeviceType deviceType, DeviceRole deviceRole)
789 {
790 uint64_t transactionId = 0;
791 AUDIO_DEBUG_LOG("device type: %{public}d, device role: %{public}d", deviceType, deviceRole);
792 if (deviceRole != INPUT_DEVICE && deviceRole != OUTPUT_DEVICE) {
793 AUDIO_ERR_LOG("AudioServer::GetTransactionId: error device role");
794 return ERR_INVALID_PARAM;
795 }
796 std::shared_ptr<IAudioCaptureSource> source = nullptr;
797 if (deviceRole == INPUT_DEVICE) {
798 if (deviceType == DEVICE_TYPE_USB_ARM_HEADSET) {
799 source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
800 } else {
801 source = GetSourceByProp(HDI_ID_TYPE_PRIMARY);
802 }
803 if (source) {
804 transactionId = source->GetTransactionId();
805 }
806 return transactionId;
807 }
808
809 // deviceRole OUTPUT_DEVICE
810 std::shared_ptr<IAudioRenderSink> sink = nullptr;
811 if (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP) {
812 sink = GetSinkByProp(HDI_ID_TYPE_BLUETOOTH);
813 } else if (deviceType == DEVICE_TYPE_USB_ARM_HEADSET) {
814 sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
815 } else {
816 sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
817 }
818 int32_t ret = ERROR;
819 if (sink != nullptr) {
820 ret = sink->GetTransactionId(transactionId);
821 }
822
823 CHECK_AND_RETURN_RET_LOG(!ret, transactionId, "Get transactionId failed.");
824
825 AUDIO_DEBUG_LOG("Transaction Id: %{public}" PRIu64, transactionId);
826 return transactionId;
827 }
828
SetMicrophoneMute(bool isMute)829 int32_t AudioServer::SetMicrophoneMute(bool isMute)
830 {
831 int32_t callingUid = IPCSkeleton::GetCallingUid();
832 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED, "refused for %{public}d",
833 callingUid);
834 auto limitFunc = [](uint32_t captureId) -> bool {
835 std::string info = IdHandler::GetInstance().ParseInfo(captureId);
836 #ifdef DAUDIO_ENABLE
837 if (IdHandler::GetInstance().ParseType(captureId) == HDI_ID_TYPE_REMOTE) {
838 return true;
839 }
840 #endif
841 if (IdHandler::GetInstance().ParseType(captureId) == HDI_ID_TYPE_PRIMARY) {
842 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_USB;
843 }
844 if (IdHandler::GetInstance().ParseType(captureId) == HDI_ID_TYPE_BLUETOOTH) {
845 return info == HDI_ID_INFO_DEFAULT;
846 }
847 return false;
848 };
849 auto processFunc = [isMute, limitFunc](uint32_t captureId, std::shared_ptr<IAudioCaptureSource> source) -> int32_t {
850 CHECK_AND_RETURN_RET(limitFunc(captureId), SUCCESS);
851 CHECK_AND_RETURN_RET(source != nullptr, SUCCESS);
852
853 source->SetMute(isMute);
854 return SUCCESS;
855 };
856 (void)HdiAdapterManager::GetInstance().ProcessSource(processFunc);
857 std::shared_ptr<IDeviceManager> deviceManager = HdiAdapterManager::GetInstance().GetDeviceManager(
858 HDI_DEVICE_MANAGER_TYPE_LOCAL);
859 if (deviceManager != nullptr) {
860 deviceManager->AllAdapterSetMicMute(isMute);
861 }
862
863 int32_t ret = SetMicrophoneMuteForEnhanceChain(isMute);
864 if (ret != SUCCESS) {
865 AUDIO_WARNING_LOG("SetMicrophoneMuteForEnhanceChain failed.");
866 }
867 return SUCCESS;
868 }
869
SetVoiceVolume(float volume)870 int32_t AudioServer::SetVoiceVolume(float volume)
871 {
872 int32_t callingUid = IPCSkeleton::GetCallingUid();
873 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
874 callingUid);
875 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
876 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
877
878 if (deviceManager == nullptr) {
879 AUDIO_WARNING_LOG("device manager is null.");
880 } else {
881 return deviceManager->SetVoiceVolume("primary", volume);
882 }
883 return ERROR;
884 }
885
OffloadSetVolume(float volume)886 int32_t AudioServer::OffloadSetVolume(float volume)
887 {
888 int32_t callingUid = IPCSkeleton::GetCallingUid();
889 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
890 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_OFFLOAD);
891 if (sink == nullptr) {
892 AUDIO_ERR_LOG("Renderer is null.");
893 return ERROR;
894 }
895 return sink->SetVolume(volume, volume);
896 }
897
SetAudioScene(AudioScene audioScene,std::vector<DeviceType> & activeOutputDevices,DeviceType activeInputDevice,BluetoothOffloadState a2dpOffloadFlag)898 int32_t AudioServer::SetAudioScene(AudioScene audioScene, std::vector<DeviceType> &activeOutputDevices,
899 DeviceType activeInputDevice, BluetoothOffloadState a2dpOffloadFlag)
900 {
901 std::lock_guard<std::mutex> lock(audioSceneMutex_);
902
903 DeviceType activeOutputDevice = activeOutputDevices.front();
904 int32_t callingUid = IPCSkeleton::GetCallingUid();
905 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
906 AudioXCollie audioXCollie("AudioServer::SetAudioScene", TIME_OUT_SECONDS);
907 std::shared_ptr<IAudioRenderSink> sink = nullptr;
908 if (activeOutputDevice == DEVICE_TYPE_USB_ARM_HEADSET) {
909 sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
910 std::shared_ptr<IAudioRenderSink> primarySink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
911 CHECK_AND_RETURN_RET_LOG(primarySink, ERROR, "primarySink is nullptr");
912 primarySink->ResetActiveDeviceForDisconnect(DEVICE_TYPE_NONE);
913 } else {
914 sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
915 }
916 std::shared_ptr<IAudioCaptureSource> source = nullptr;
917 if (activeInputDevice == DEVICE_TYPE_USB_ARM_HEADSET) {
918 source = GetSourceByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_USB);
919 } else {
920 source = GetSourceByProp(HDI_ID_TYPE_PRIMARY);
921 }
922
923 if (source == nullptr || !source->IsInited()) {
924 AUDIO_WARNING_LOG("Capturer is not initialized.");
925 } else {
926 source->SetAudioScene(audioScene, activeInputDevice);
927 }
928
929 if (sink == nullptr || !sink->IsInited()) {
930 AUDIO_WARNING_LOG("Renderer is not initialized.");
931 } else {
932 if (activeOutputDevice == DEVICE_TYPE_BLUETOOTH_A2DP && a2dpOffloadFlag != A2DP_OFFLOAD) {
933 activeOutputDevices[0] = DEVICE_TYPE_NONE;
934 }
935 sink->SetAudioScene(audioScene, activeOutputDevices);
936 }
937
938 audioScene_ = audioScene;
939 return SUCCESS;
940 }
941
SetIORoutes(std::vector<std::pair<DeviceType,DeviceFlag>> & activeDevices,BluetoothOffloadState a2dpOffloadFlag,const std::string & deviceName)942 int32_t AudioServer::SetIORoutes(std::vector<std::pair<DeviceType, DeviceFlag>> &activeDevices,
943 BluetoothOffloadState a2dpOffloadFlag, const std::string &deviceName)
944 {
945 CHECK_AND_RETURN_RET_LOG(!activeDevices.empty() && activeDevices.size() <= AUDIO_CONCURRENT_ACTIVE_DEVICES_LIMIT,
946 ERR_INVALID_PARAM, "Invalid audio devices.");
947 DeviceType type = activeDevices.front().first;
948 DeviceFlag flag = activeDevices.front().second;
949
950 std::vector<DeviceType> deviceTypes;
951 for (auto activeDevice : activeDevices) {
952 AUDIO_INFO_LOG("SetIORoutes device type:%{public}d", activeDevice.first);
953 deviceTypes.push_back(activeDevice.first);
954 }
955 AUDIO_INFO_LOG("SetIORoutes 1st deviceType: %{public}d, flag: %{public}d deviceName:%{public}s",
956 type, flag, deviceName.c_str());
957 int32_t ret = SetIORoutes(type, flag, deviceTypes, a2dpOffloadFlag, deviceName);
958 return ret;
959 }
960
SetIORoutes(DeviceType type,DeviceFlag flag,std::vector<DeviceType> deviceTypes,BluetoothOffloadState a2dpOffloadFlag,const std::string & deviceName)961 int32_t AudioServer::SetIORoutes(DeviceType type, DeviceFlag flag, std::vector<DeviceType> deviceTypes,
962 BluetoothOffloadState a2dpOffloadFlag, const std::string &deviceName)
963 {
964 std::shared_ptr<IAudioRenderSink> sink = nullptr;
965 std::shared_ptr<IAudioCaptureSource> source = nullptr;
966
967 if (type == DEVICE_TYPE_USB_ARM_HEADSET) {
968 UpdateArmInstance(sink, source);
969 } else {
970 UpdatePrimaryInstance(sink, source);
971 if (type == DEVICE_TYPE_BLUETOOTH_A2DP && a2dpOffloadFlag != A2DP_OFFLOAD &&
972 deviceTypes.size() == 1 && deviceTypes[0] == DEVICE_TYPE_BLUETOOTH_A2DP) {
973 deviceTypes[0] = DEVICE_TYPE_NONE;
974 }
975 }
976 CHECK_AND_RETURN_RET_LOG(sink != nullptr || source != nullptr,
977 ERR_INVALID_PARAM, "SetIORoutes failed for null instance!");
978
979 std::lock_guard<std::mutex> lock(audioSceneMutex_);
980 if (flag == DeviceFlag::INPUT_DEVICES_FLAG) {
981 if (audioScene_ != AUDIO_SCENE_DEFAULT) {
982 source->SetAudioScene(audioScene_, type);
983 } else {
984 source->UpdateActiveDevice(type);
985 }
986 } else if (flag == DeviceFlag::OUTPUT_DEVICES_FLAG) {
987 if (audioScene_ != AUDIO_SCENE_DEFAULT) {
988 sink->SetAudioScene(audioScene_, deviceTypes);
989 } else {
990 sink->UpdateActiveDevice(deviceTypes);
991 }
992 PolicyHandler::GetInstance().SetActiveOutputDevice(type);
993 } else if (flag == DeviceFlag::ALL_DEVICES_FLAG) {
994 if (audioScene_ != AUDIO_SCENE_DEFAULT) {
995 source->SetAudioScene(audioScene_, type);
996 sink->SetAudioScene(audioScene_, deviceTypes);
997 } else {
998 source->UpdateActiveDevice(type);
999 sink->UpdateActiveDevice(deviceTypes);
1000 }
1001 PolicyHandler::GetInstance().SetActiveOutputDevice(type);
1002 } else {
1003 AUDIO_ERR_LOG("SetIORoutes invalid device flag");
1004 return ERR_INVALID_PARAM;
1005 }
1006
1007 return SUCCESS;
1008 }
1009
UpdateActiveDeviceRoute(DeviceType type,DeviceFlag flag,BluetoothOffloadState a2dpOffloadFlag)1010 int32_t AudioServer::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag, BluetoothOffloadState a2dpOffloadFlag)
1011 {
1012 int32_t callingUid = IPCSkeleton::GetCallingUid();
1013 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1014
1015 std::vector<std::pair<DeviceType, DeviceFlag>> activeDevices;
1016 activeDevices.push_back(make_pair(type, flag));
1017 return UpdateActiveDevicesRoute(activeDevices, a2dpOffloadFlag);
1018 }
1019
UpdateActiveDevicesRoute(std::vector<std::pair<DeviceType,DeviceFlag>> & activeDevices,BluetoothOffloadState a2dpOffloadFlag,const std::string & deviceName)1020 int32_t AudioServer::UpdateActiveDevicesRoute(std::vector<std::pair<DeviceType, DeviceFlag>> &activeDevices,
1021 BluetoothOffloadState a2dpOffloadFlag, const std::string &deviceName)
1022 {
1023 int32_t callingUid = IPCSkeleton::GetCallingUid();
1024 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1025 return SetIORoutes(activeDevices, a2dpOffloadFlag, deviceName);
1026 }
1027
SetAudioMonoState(bool audioMono)1028 void AudioServer::SetAudioMonoState(bool audioMono)
1029 {
1030 AUDIO_INFO_LOG("AudioMonoState = [%{public}s]", audioMono ? "true": "false");
1031 int32_t callingUid = IPCSkeleton::GetCallingUid();
1032 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "refused for %{public}d", callingUid);
1033
1034 auto limitFunc = [](uint32_t renderId) -> bool {
1035 uint32_t type = IdHandler::GetInstance().ParseType(renderId);
1036 std::string info = IdHandler::GetInstance().ParseInfo(renderId);
1037 if (type == HDI_ID_TYPE_PRIMARY) {
1038 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_DIRECT || info == HDI_ID_INFO_VOIP;
1039 }
1040 if (type == HDI_ID_TYPE_BLUETOOTH) {
1041 return info == HDI_ID_INFO_DEFAULT;
1042 }
1043 if (type == HDI_ID_TYPE_OFFLOAD) {
1044 return info == HDI_ID_INFO_DEFAULT;
1045 }
1046 return false;
1047 };
1048 auto processFunc = [audioMono, limitFunc](uint32_t renderId, std::shared_ptr<IAudioRenderSink> sink) -> int32_t {
1049 CHECK_AND_RETURN_RET(limitFunc(renderId), SUCCESS);
1050 CHECK_AND_RETURN_RET(sink != nullptr, SUCCESS);
1051
1052 sink->SetAudioMonoState(audioMono);
1053 return SUCCESS;
1054 };
1055 (void)HdiAdapterManager::GetInstance().ProcessSink(processFunc);
1056 }
1057
SetAudioBalanceValue(float audioBalance)1058 void AudioServer::SetAudioBalanceValue(float audioBalance)
1059 {
1060 AUDIO_INFO_LOG("AudioBalanceValue = [%{public}f]", audioBalance);
1061 int32_t callingUid = IPCSkeleton::GetCallingUid();
1062 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "refused for %{public}d", callingUid);
1063 CHECK_AND_RETURN_LOG(audioBalance >= -1.0f && audioBalance <= 1.0f,
1064 "audioBalance value %{public}f is out of range [-1.0, 1.0]", audioBalance);
1065
1066 auto limitFunc = [](uint32_t renderId) -> bool {
1067 uint32_t type = IdHandler::GetInstance().ParseType(renderId);
1068 std::string info = IdHandler::GetInstance().ParseInfo(renderId);
1069 if (type == HDI_ID_TYPE_PRIMARY) {
1070 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_DIRECT || info == HDI_ID_INFO_VOIP;
1071 }
1072 if (type == HDI_ID_TYPE_BLUETOOTH) {
1073 return info == HDI_ID_INFO_DEFAULT;
1074 }
1075 if (type == HDI_ID_TYPE_OFFLOAD) {
1076 return info == HDI_ID_INFO_DEFAULT;
1077 }
1078 return false;
1079 };
1080 auto processFunc = [audioBalance, limitFunc](uint32_t renderId, std::shared_ptr<IAudioRenderSink> sink) -> int32_t {
1081 CHECK_AND_RETURN_RET(limitFunc(renderId), SUCCESS);
1082 CHECK_AND_RETURN_RET(sink != nullptr, SUCCESS);
1083
1084 sink->SetAudioBalanceValue(audioBalance);
1085 return SUCCESS;
1086 };
1087 (void)HdiAdapterManager::GetInstance().ProcessSink(processFunc);
1088 }
1089
NotifyDeviceInfo(std::string networkId,bool connected)1090 void AudioServer::NotifyDeviceInfo(std::string networkId, bool connected)
1091 {
1092 int32_t callingUid = IPCSkeleton::GetCallingUid();
1093 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "refused for %{public}d", callingUid);
1094 AUDIO_INFO_LOG("notify device info: networkId(%{public}s), connected(%{public}d)",
1095 GetEncryptStr(networkId).c_str(), connected);
1096 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_REMOTE, networkId.c_str());
1097 if (sink != nullptr && connected) {
1098 sink->RegistCallback(HDI_CB_RENDER_PARAM, this);
1099 }
1100 }
1101
IsParamEnabled(std::string key,bool & isEnabled)1102 inline bool IsParamEnabled(std::string key, bool &isEnabled)
1103 {
1104 int32_t policyFlag = 0;
1105 if (GetSysPara(key.c_str(), policyFlag) && policyFlag == 1) {
1106 isEnabled = true;
1107 return true;
1108 }
1109 isEnabled = false;
1110 return false;
1111 }
1112
RegiestPolicyProvider(const sptr<IRemoteObject> & object)1113 int32_t AudioServer::RegiestPolicyProvider(const sptr<IRemoteObject> &object)
1114 {
1115 int32_t callingUid = IPCSkeleton::GetCallingUid();
1116 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1117 sptr<IPolicyProviderIpc> policyProvider = iface_cast<IPolicyProviderIpc>(object);
1118 CHECK_AND_RETURN_RET_LOG(policyProvider != nullptr, ERR_INVALID_PARAM,
1119 "policyProvider obj cast failed");
1120 bool ret = PolicyHandler::GetInstance().ConfigPolicyProvider(policyProvider);
1121 CHECK_AND_RETURN_RET_LOG(ret, ERR_OPERATION_FAILED, "ConfigPolicyProvider failed!");
1122 return SUCCESS;
1123 }
1124
GetHapBuildApiVersion(int32_t callerUid)1125 int32_t AudioServer::GetHapBuildApiVersion(int32_t callerUid)
1126 {
1127 AudioXCollie audioXCollie("AudioPolicyServer::PerStateChangeCbCustomizeCallback::getUidByBundleName",
1128 GET_BUNDLE_TIME_OUT_SECONDS);
1129 std::string bundleName {""};
1130 AppExecFwk::BundleInfo bundleInfo;
1131 WatchTimeout guard("SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager():GetHapBuildApiVersion");
1132 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1133 CHECK_AND_RETURN_RET_LOG(saManager != nullptr, 0, "failed: saManager is nullptr");
1134 guard.CheckCurrTimeout();
1135
1136 sptr<IRemoteObject> remoteObject = saManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1137 CHECK_AND_RETURN_RET_LOG(remoteObject != nullptr, 0, "failed: remoteObject is nullptr");
1138
1139 sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = OHOS::iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
1140 CHECK_AND_RETURN_RET_LOG(bundleMgrProxy != nullptr, 0, "failed: bundleMgrProxy is nullptr");
1141
1142 WatchTimeout reguard("bundleMgrProxy->GetNameForUid:GetHapBuildApiVersion");
1143 bundleMgrProxy->GetNameForUid(callerUid, bundleName);
1144 bundleMgrProxy->GetBundleInfoV9(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT |
1145 AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES |
1146 AppExecFwk::BundleFlag::GET_BUNDLE_WITH_REQUESTED_PERMISSION |
1147 AppExecFwk::BundleFlag::GET_BUNDLE_WITH_EXTENSION_INFO |
1148 AppExecFwk::BundleFlag::GET_BUNDLE_WITH_HASH_VALUE,
1149 bundleInfo,
1150 AppExecFwk::Constants::ALL_USERID);
1151 reguard.CheckCurrTimeout();
1152 int32_t hapApiVersion = bundleInfo.applicationInfo.apiTargetVersion % API_VERSION_REMAINDER;
1153 AUDIO_INFO_LOG("callerUid %{public}d, version %{public}d", callerUid, hapApiVersion);
1154 return hapApiVersion;
1155 }
1156
ResetRecordConfig(AudioProcessConfig & config)1157 void AudioServer::ResetRecordConfig(AudioProcessConfig &config)
1158 {
1159 if (config.capturerInfo.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
1160 config.isInnerCapturer = true;
1161 config.innerCapMode = LEGACY_INNER_CAP;
1162 if (PermissionUtil::VerifyPermission(CAPTURE_PLAYBACK_PERMISSION, IPCSkeleton::GetCallingTokenID())) {
1163 AUDIO_INFO_LOG("CAPTURE_PLAYBACK permission granted");
1164 config.innerCapMode = MODERN_INNER_CAP;
1165 } else if (config.callerUid == MEDIA_SERVICE_UID || config.callerUid == VASSISTANT_UID) {
1166 config.innerCapMode = MODERN_INNER_CAP;
1167 } else if (GetHapBuildApiVersion(config.callerUid) >= MODERN_INNER_API_VERSION) { // check build api-version
1168 config.innerCapMode = LEGACY_MUTE_CAP;
1169 }
1170 AUDIO_INFO_LOG("callerUid %{public}d, innerCapMode %{public}d", config.callerUid, config.innerCapMode);
1171 } else {
1172 config.isInnerCapturer = false;
1173 }
1174 #ifdef AUDIO_BUILD_VARIANT_ROOT
1175 if (config.callerUid == ROOT_UID) {
1176 config.innerCapMode = MODERN_INNER_CAP;
1177 }
1178 #endif
1179 if (config.capturerInfo.sourceType == SourceType::SOURCE_TYPE_WAKEUP) {
1180 config.isWakeupCapturer = true;
1181 } else {
1182 config.isWakeupCapturer = false;
1183 }
1184 }
1185
ResetProcessConfig(const AudioProcessConfig & config)1186 AudioProcessConfig AudioServer::ResetProcessConfig(const AudioProcessConfig &config)
1187 {
1188 AudioProcessConfig resetConfig(config);
1189
1190 int32_t callerUid = IPCSkeleton::GetCallingUid();
1191 int32_t callerPid = IPCSkeleton::GetCallingPid();
1192
1193 resetConfig.callerUid = callerUid;
1194
1195 // client pid uid check.
1196 if (RECORD_PASS_APPINFO_LIST.count(callerUid)) {
1197 AUDIO_INFO_LOG("Create process for %{public}d, clientUid:%{public}d.", callerUid, config.appInfo.appUid);
1198 } else if (RECORD_CHECK_FORWARD_LIST.count(callerUid)) {
1199 AUDIO_INFO_LOG("Check forward calling for uid:%{public}d", callerUid);
1200 resetConfig.appInfo.appTokenId = IPCSkeleton::GetFirstTokenID();
1201 resetConfig.appInfo.appFullTokenId = IPCSkeleton::GetFirstFullTokenID();
1202 } else {
1203 AUDIO_INFO_LOG("Use true client appInfo instead for pid:%{public}d uid:%{public}d", callerPid, callerUid);
1204 resetConfig.appInfo.appPid = callerPid;
1205 resetConfig.appInfo.appUid = callerUid;
1206 resetConfig.appInfo.appTokenId = IPCSkeleton::GetCallingTokenID();
1207 resetConfig.appInfo.appFullTokenId = IPCSkeleton::GetCallingFullTokenID();
1208 }
1209
1210 if (resetConfig.audioMode == AUDIO_MODE_RECORD) {
1211 ResetRecordConfig(resetConfig);
1212 }
1213 return resetConfig;
1214 }
1215
CheckStreamInfoFormat(const AudioProcessConfig & config)1216 bool AudioServer::CheckStreamInfoFormat(const AudioProcessConfig &config)
1217 {
1218 if (NotContain(AUDIO_SUPPORTED_SAMPLING_RATES, config.streamInfo.samplingRate)) {
1219 AUDIO_ERR_LOG("Check format failed invalid samplingRate:%{public}d", config.streamInfo.samplingRate);
1220 return false;
1221 }
1222
1223 if (NotContain(AUDIO_SUPPORTED_FORMATS, config.streamInfo.format)) {
1224 AUDIO_ERR_LOG("Check format failed invalid format:%{public}d", config.streamInfo.format);
1225 return false;
1226 }
1227
1228 if (NotContain(AUDIO_SUPPORTED_ENCODING_TYPES, config.streamInfo.encoding)) {
1229 AUDIO_ERR_LOG("Check format failed invalid encoding:%{public}d", config.streamInfo.encoding);
1230 return false;
1231 }
1232
1233 // both renderer and capturer check RENDERER_SUPPORTED_CHANNELLAYOUTS, should we rename it?
1234 if (NotContain(RENDERER_SUPPORTED_CHANNELLAYOUTS, config.streamInfo.channelLayout)) {
1235 AUDIO_ERR_LOG("Check format failed invalid channelLayout:%{public}" PRId64".", config.streamInfo.channelLayout);
1236 return false;
1237 }
1238
1239 if (config.audioMode == AUDIO_MODE_PLAYBACK && NotContain(RENDERER_SUPPORTED_CHANNELS,
1240 config.streamInfo.channels)) {
1241 AUDIO_ERR_LOG("Check format failed invalid renderer channels:%{public}d", config.streamInfo.channels);
1242 return false;
1243 }
1244
1245 if (config.audioMode == AUDIO_MODE_RECORD && NotContain(CAPTURER_SUPPORTED_CHANNELS, config.streamInfo.channels)) {
1246 AUDIO_ERR_LOG("Check format failed invalid capturer channels:%{public}d", config.streamInfo.channels);
1247 return false;
1248 }
1249
1250 return true;
1251 }
1252
CheckRendererFormat(const AudioProcessConfig & config)1253 bool AudioServer::CheckRendererFormat(const AudioProcessConfig &config)
1254 {
1255 if (NotContain(AUDIO_SUPPORTED_STREAM_USAGES, config.rendererInfo.streamUsage)) {
1256 AUDIO_ERR_LOG("Check format failed invalid streamUsage:%{public}d", config.rendererInfo.streamUsage);
1257 return false;
1258 }
1259 return true;
1260 }
1261
CheckRecorderFormat(const AudioProcessConfig & config)1262 bool AudioServer::CheckRecorderFormat(const AudioProcessConfig &config)
1263 {
1264 if (NotContain(AUDIO_SUPPORTED_SOURCE_TYPES, config.capturerInfo.sourceType)) {
1265 AUDIO_ERR_LOG("Check format failed invalid sourceType:%{public}d", config.capturerInfo.sourceType);
1266 return false;
1267 }
1268 if (config.capturerInfo.capturerFlags != AUDIO_FLAG_NORMAL && NotContain(AUDIO_FAST_STREAM_SUPPORTED_SOURCE_TYPES,
1269 config.capturerInfo.sourceType)) {
1270 AUDIO_ERR_LOG("Check format failed invalid fast sourceType:%{public}d", config.capturerInfo.sourceType);
1271 return false;
1272 }
1273 return true;
1274 }
1275
CheckConfigFormat(const AudioProcessConfig & config)1276 bool AudioServer::CheckConfigFormat(const AudioProcessConfig &config)
1277 {
1278 if (!CheckStreamInfoFormat(config)) {
1279 return false;
1280 }
1281 if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1282 return CheckRendererFormat(config);
1283 }
1284
1285 if (config.audioMode == AUDIO_MODE_RECORD) {
1286 return CheckRecorderFormat(config);
1287 }
1288
1289 AUDIO_ERR_LOG("Check format failed invalid mode.");
1290 return false;
1291 }
1292
GetBundleNameFromUid(int32_t uid)1293 const std::string AudioServer::GetBundleNameFromUid(int32_t uid)
1294 {
1295 AudioXCollie audioXCollie("AudioServer::GetBundleNameFromUid",
1296 GET_BUNDLE_TIME_OUT_SECONDS);
1297 std::string bundleName {""};
1298 WatchTimeout guard("SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager():GetBundleNameFromUid");
1299 auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1300 CHECK_AND_RETURN_RET_LOG(systemAbilityManager != nullptr, "", "systemAbilityManager is nullptr");
1301 guard.CheckCurrTimeout();
1302
1303 sptr<IRemoteObject> remoteObject = systemAbilityManager->CheckSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1304 CHECK_AND_RETURN_RET_LOG(remoteObject != nullptr, "", "remoteObject is nullptr");
1305
1306 sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = OHOS::iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
1307 CHECK_AND_RETURN_RET_LOG(bundleMgrProxy != nullptr, "", "bundleMgrProxy is nullptr");
1308
1309 WatchTimeout reguard("bundleMgrProxy->GetNameForUid:GetBundleNameFromUid");
1310 bundleMgrProxy->GetNameForUid(uid, bundleName);
1311 reguard.CheckCurrTimeout();
1312
1313 return bundleName;
1314 }
1315
IsFastBlocked(int32_t uid,PlayerType playerType)1316 bool AudioServer::IsFastBlocked(int32_t uid, PlayerType playerType)
1317 {
1318 // if call from soundpool without the need for check.
1319 if (playerType == PLAYER_TYPE_SOUND_POOL) {
1320 return false;
1321 }
1322 std::string bundleName = GetBundleNameFromUid(uid);
1323 std::string result = GetAudioParameter(CHECK_FAST_BLOCK_PREFIX + bundleName);
1324 return result == "true";
1325 }
1326
SendRendererCreateErrorInfo(const StreamUsage & sreamUsage,const int32_t & errorCode)1327 void AudioServer::SendRendererCreateErrorInfo(const StreamUsage &sreamUsage,
1328 const int32_t &errorCode)
1329 {
1330 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1331 Media::MediaMonitor::AUDIO, Media::MediaMonitor::AUDIO_STREAM_CREATE_ERROR_STATS,
1332 Media::MediaMonitor::FREQUENCY_AGGREGATION_EVENT);
1333 bean->Add("IS_PLAYBACK", 1);
1334 bean->Add("CLIENT_UID", static_cast<int32_t>(getuid()));
1335 bean->Add("STREAM_TYPE", sreamUsage);
1336 bean->Add("ERROR_CODE", errorCode);
1337 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1338 }
1339
CheckParam(const AudioProcessConfig & config)1340 int32_t AudioServer::CheckParam(const AudioProcessConfig &config)
1341 {
1342 ContentType contentType = config.rendererInfo.contentType;
1343 if (contentType < CONTENT_TYPE_UNKNOWN || contentType > CONTENT_TYPE_ULTRASONIC) {
1344 SendRendererCreateErrorInfo(config.rendererInfo.streamUsage,
1345 ERR_INVALID_PARAM);
1346 AUDIO_ERR_LOG("Invalid content type");
1347 return ERR_INVALID_PARAM;
1348 }
1349
1350 StreamUsage streamUsage = config.rendererInfo.streamUsage;
1351 if (streamUsage < STREAM_USAGE_UNKNOWN || streamUsage > STREAM_USAGE_MAX) {
1352 SendRendererCreateErrorInfo(config.rendererInfo.streamUsage,
1353 ERR_INVALID_PARAM);
1354 AUDIO_ERR_LOG("Invalid stream usage");
1355 return ERR_INVALID_PARAM;
1356 }
1357
1358 if (contentType == CONTENT_TYPE_ULTRASONIC || IsNeedVerifyPermission(streamUsage)) {
1359 if (!PermissionUtil::VerifySystemPermission()) {
1360 SendRendererCreateErrorInfo(config.rendererInfo.streamUsage,
1361 ERR_PERMISSION_DENIED);
1362 AUDIO_ERR_LOG("CreateAudioRenderer failed! CONTENT_TYPE_ULTRASONIC or STREAM_USAGE_SYSTEM or "\
1363 "STREAM_USAGE_VOICE_MODEM_COMMUNICATION: No system permission");
1364 return ERR_PERMISSION_DENIED;
1365 }
1366 }
1367 return SUCCESS;
1368 }
1369
CheckMaxRendererInstances()1370 int32_t AudioServer::CheckMaxRendererInstances()
1371 {
1372 int32_t maxRendererInstances = PolicyHandler::GetInstance().GetMaxRendererInstances();
1373 if (maxRendererInstances <= 0) {
1374 maxRendererInstances = DEFAULT_MAX_RENDERER_INSTANCES;
1375 }
1376 if (AudioService::GetInstance()->GetCurrentRendererStreamCnt() >= maxRendererInstances) {
1377 AUDIO_ERR_LOG("Current audio renderer stream num is greater than the maximum num of configured instances");
1378 return ERR_EXCEED_MAX_STREAM_CNT;
1379 }
1380 return SUCCESS;
1381 }
1382
CreateAudioStream(const AudioProcessConfig & config,int32_t callingUid)1383 sptr<IRemoteObject> AudioServer::CreateAudioStream(const AudioProcessConfig &config, int32_t callingUid)
1384 {
1385 int32_t appUid = config.appInfo.appUid;
1386 if (callingUid != MEDIA_SERVICE_UID) {
1387 appUid = callingUid;
1388 }
1389 if (IsNormalIpcStream(config) ||
1390 (isFastControlled_ && IsFastBlocked(config.appInfo.appUid, config.rendererInfo.playerType))) {
1391 AUDIO_INFO_LOG("Create normal ipc stream, isFastControlled: %{public}d", isFastControlled_);
1392 int32_t ret = 0;
1393 sptr<IpcStreamInServer> ipcStream = AudioService::GetInstance()->GetIpcStream(config, ret);
1394 if (ipcStream == nullptr) {
1395 if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1396 AudioService::GetInstance()->CleanAppUseNumMap(appUid);
1397 }
1398 AUDIO_ERR_LOG("GetIpcStream failed.");
1399 return nullptr;
1400 }
1401 AudioService::GetInstance()->SetIncMaxRendererStreamCnt(config.audioMode);
1402 sptr<IRemoteObject> remoteObject= ipcStream->AsObject();
1403 return remoteObject;
1404 }
1405
1406 #ifdef SUPPORT_LOW_LATENCY
1407 sptr<IAudioProcess> process = AudioService::GetInstance()->GetAudioProcess(config);
1408 if (process == nullptr) {
1409 if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1410 AudioService::GetInstance()->CleanAppUseNumMap(appUid);
1411 }
1412 AUDIO_ERR_LOG("GetAudioProcess failed.");
1413 return nullptr;
1414 }
1415 AudioService::GetInstance()->SetIncMaxRendererStreamCnt(config.audioMode);
1416 sptr<IRemoteObject> remoteObject= process->AsObject();
1417 return remoteObject;
1418 #else
1419 AUDIO_ERR_LOG("GetAudioProcess failed.");
1420 return nullptr;
1421 #endif
1422 }
1423
CheckAndWaitAudioPolicyReady()1424 int32_t AudioServer::CheckAndWaitAudioPolicyReady()
1425 {
1426 if (!isAudioPolicyReady_) {
1427 std::unique_lock lock(isAudioPolicyReadyMutex_);
1428 if (waitCreateStreamInServerCount_ > MAX_WAIT_IN_SERVER_COUNT) {
1429 AUDIO_WARNING_LOG("let client retry");
1430 return ERR_RETRY_IN_CLIENT;
1431 }
1432 waitCreateStreamInServerCount_++;
1433 isAudioPolicyReadyCv_.wait_for(lock, std::chrono::seconds(WAIT_AUDIO_POLICY_READY_TIMEOUT_SECONDS), [this] () {
1434 return isAudioPolicyReady_.load();
1435 });
1436 waitCreateStreamInServerCount_--;
1437 }
1438
1439 return SUCCESS;
1440 }
1441
CreateAudioProcess(const AudioProcessConfig & config,int32_t & errorCode,const AudioPlaybackCaptureConfig & filterConfig)1442 sptr<IRemoteObject> AudioServer::CreateAudioProcess(const AudioProcessConfig &config, int32_t &errorCode,
1443 const AudioPlaybackCaptureConfig &filterConfig)
1444 {
1445 Trace trace("AudioServer::CreateAudioProcess");
1446
1447 errorCode = CheckAndWaitAudioPolicyReady();
1448 if (errorCode != SUCCESS) {
1449 return nullptr;
1450 }
1451
1452 AudioProcessConfig resetConfig = ResetProcessConfig(config);
1453 CHECK_AND_RETURN_RET_LOG(CheckConfigFormat(resetConfig), nullptr, "AudioProcessConfig format is wrong, please check"
1454 ":%{public}s", ProcessConfig::DumpProcessConfig(resetConfig).c_str());
1455 CHECK_AND_RETURN_RET_LOG(PermissionChecker(resetConfig), nullptr, "Create audio process failed, no permission");
1456
1457 std::lock_guard<std::mutex> lock(streamLifeCycleMutex_);
1458 int32_t ret = CheckParam(config);
1459 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, nullptr, "Check params failed");
1460 int32_t callingUid = IPCSkeleton::GetCallingUid();
1461 if (resetConfig.audioMode == AUDIO_MODE_PLAYBACK &&
1462 !IsVoiceModemCommunication(resetConfig.rendererInfo.streamUsage, callingUid)) {
1463 errorCode = CheckMaxRendererInstances();
1464 if (errorCode != SUCCESS) {
1465 return nullptr;
1466 }
1467 if (AudioService::GetInstance()->IsExceedingMaxStreamCntPerUid(callingUid, resetConfig.appInfo.appUid,
1468 maxRendererStreamCntPerUid_)) {
1469 errorCode = ERR_EXCEED_MAX_STREAM_CNT_PER_UID;
1470 AUDIO_ERR_LOG("Current audio renderer stream num exceeds maxRendererStreamCntPerUid");
1471 return nullptr;
1472 }
1473 }
1474
1475 if (config.rendererInfo.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION && callingUid == UID_FOUNDATION_SA
1476 && config.rendererInfo.isSatellite) {
1477 bool isSupportSate = OHOS::system::GetBoolParameter(TEL_SATELLITE_SUPPORT, false);
1478 CHECK_AND_RETURN_RET_LOG(isSupportSate, nullptr, "Do not support satellite");
1479 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
1480 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_LOCAL);
1481 if (deviceManager != nullptr) {
1482 deviceManager->SetAudioParameter("primary", AudioParamKey::NONE, "", SATEMODEM_PARAMETER);
1483 }
1484 }
1485 #ifdef FEATURE_APPGALLERY
1486 PolicyHandler::GetInstance().GetAndSaveClientType(resetConfig.appInfo.appUid,
1487 GetBundleNameFromUid(resetConfig.appInfo.appUid));
1488 #endif
1489 #ifdef HAS_FEATURE_INNERCAPTURER
1490 if (!HandleCheckCaptureLimit(resetConfig, filterConfig)) {
1491 return nullptr;
1492 }
1493 #endif
1494 return CreateAudioStream(resetConfig, callingUid);
1495 }
1496
1497 #ifdef HAS_FEATURE_INNERCAPTURER
HandleCheckCaptureLimit(AudioProcessConfig & resetConfig,const AudioPlaybackCaptureConfig & filterConfig)1498 bool AudioServer::HandleCheckCaptureLimit(AudioProcessConfig &resetConfig,
1499 const AudioPlaybackCaptureConfig &filterConfig)
1500 {
1501 if (resetConfig.capturerInfo.sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE) {
1502 int32_t innerCapId = 0;
1503 if (InnerCheckCaptureLimit(filterConfig, innerCapId) == SUCCESS) {
1504 resetConfig.innerCapId = innerCapId;
1505 } else {
1506 AUDIO_ERR_LOG("CheckCaptureLimit fail!");
1507 return false;
1508 }
1509 }
1510 return true;
1511 }
1512
InnerCheckCaptureLimit(const AudioPlaybackCaptureConfig & config,int32_t & innerCapId)1513 int32_t AudioServer::InnerCheckCaptureLimit(const AudioPlaybackCaptureConfig &config, int32_t &innerCapId)
1514 {
1515 PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
1516 int32_t ret = playbackCapturerMgr->CheckCaptureLimit(config, innerCapId);
1517 if (ret == SUCCESS) {
1518 PolicyHandler::GetInstance().LoadModernInnerCapSink(innerCapId);
1519 }
1520 return ret;
1521 }
1522 #endif
1523
IsNormalIpcStream(const AudioProcessConfig & config) const1524 bool AudioServer::IsNormalIpcStream(const AudioProcessConfig &config) const
1525 {
1526 if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1527 return config.rendererInfo.rendererFlags == AUDIO_FLAG_NORMAL ||
1528 config.rendererInfo.rendererFlags == AUDIO_FLAG_VOIP_DIRECT;
1529 } else if (config.audioMode == AUDIO_MODE_RECORD) {
1530 return config.capturerInfo.capturerFlags == AUDIO_FLAG_NORMAL;
1531 }
1532
1533 return false;
1534 }
1535
CheckRemoteDeviceState(std::string networkId,DeviceRole deviceRole,bool isStartDevice)1536 int32_t AudioServer::CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice)
1537 {
1538 AUDIO_INFO_LOG("CheckRemoteDeviceState: device[%{public}s] deviceRole[%{public}d] isStartDevice[%{public}s]",
1539 GetEncryptStr(networkId).c_str(), static_cast<int32_t>(deviceRole), (isStartDevice ? "true" : "false"));
1540
1541 int32_t callingUid = IPCSkeleton::GetCallingUid();
1542 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1543 CHECK_AND_RETURN_RET(isStartDevice, SUCCESS);
1544
1545 int32_t ret = SUCCESS;
1546 switch (deviceRole) {
1547 case OUTPUT_DEVICE:
1548 {
1549 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_REMOTE, networkId.c_str());
1550 if (sink == nullptr || !sink->IsInited()) {
1551 AUDIO_ERR_LOG("Remote renderer[%{public}s] is uninit.", networkId.c_str());
1552 return ERR_ILLEGAL_STATE;
1553 }
1554 ret = sink->Start();
1555 break;
1556 }
1557 case INPUT_DEVICE:
1558 {
1559 std::shared_ptr<IAudioCaptureSource> source = GetSourceByProp(HDI_ID_TYPE_REMOTE, networkId.c_str());
1560 if (source == nullptr || !source->IsInited()) {
1561 AUDIO_ERR_LOG("Remote capturer[%{public}s] is uninit.", networkId.c_str());
1562 return ERR_ILLEGAL_STATE;
1563 }
1564 ret = source->Start();
1565 break;
1566 }
1567 default:
1568 AUDIO_ERR_LOG("Remote device role %{public}d is not supported.", deviceRole);
1569 return ERR_NOT_SUPPORTED;
1570 }
1571 if (ret != SUCCESS) {
1572 AUDIO_ERR_LOG("Check remote device[%{public}s] fail, ret %{public}d.", networkId.c_str(), ret);
1573 }
1574 return ret;
1575 }
1576
OnRenderSinkParamChange(const std::string & networkId,const AudioParamKey key,const std::string & condition,const std::string & value)1577 void AudioServer::OnRenderSinkParamChange(const std::string &networkId, const AudioParamKey key,
1578 const std::string &condition, const std::string &value)
1579 {
1580 std::shared_ptr<AudioParameterCallback> callback = nullptr;
1581 {
1582 std::lock_guard<std::mutex> lockSet(audioParamCbMtx_);
1583 AUDIO_INFO_LOG("OnRenderSinkParamChange Callback from networkId: %s", networkId.c_str());
1584 CHECK_AND_RETURN_LOG(audioParamCb_ != nullptr, "OnRenderSinkParamChange: audio param allback is null.");
1585 callback = audioParamCb_;
1586 }
1587 callback->OnAudioParameterChange(networkId, key, condition, value);
1588 }
1589
OnCaptureSourceParamChange(const std::string & networkId,const AudioParamKey key,const std::string & condition,const std::string & value)1590 void AudioServer::OnCaptureSourceParamChange(const std::string &networkId, const AudioParamKey key,
1591 const std::string &condition, const std::string &value)
1592 {
1593 std::shared_ptr<AudioParameterCallback> callback = nullptr;
1594 {
1595 std::lock_guard<std::mutex> lockSet(audioParamCbMtx_);
1596 AUDIO_INFO_LOG("OnCaptureSourceParamChange Callback from networkId: %s", networkId.c_str());
1597 CHECK_AND_RETURN_LOG(audioParamCb_ != nullptr, "OnCaptureSourceParamChange: audio param allback is null.");
1598 callback = audioParamCb_;
1599 }
1600 callback->OnAudioParameterChange(networkId, key, condition, value);
1601 }
1602
OnWakeupClose()1603 void AudioServer::OnWakeupClose()
1604 {
1605 AUDIO_INFO_LOG("OnWakeupClose Callback start");
1606 std::shared_ptr<WakeUpSourceCallback> callback = nullptr;
1607 {
1608 std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
1609 CHECK_AND_RETURN_LOG(wakeupCallback_ != nullptr, "OnWakeupClose callback is nullptr.");
1610 callback = wakeupCallback_;
1611 }
1612 callback->OnWakeupClose();
1613 }
1614
OnCapturerState(bool isActive,int32_t num)1615 void AudioServer::OnCapturerState(bool isActive, int32_t num)
1616 {
1617 AUDIO_DEBUG_LOG("OnCapturerState Callback start");
1618 std::shared_ptr<WakeUpSourceCallback> callback = nullptr;
1619 {
1620 std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
1621 callback = wakeupCallback_;
1622 }
1623
1624 // Ensure that the send callback is not executed concurrently
1625 std::lock_guard<std::mutex> lockCb(onCapturerStateCbMutex_);
1626
1627 uint64_t previousStateFlag;
1628 uint64_t currentStateFlag;
1629 if (isActive) {
1630 uint64_t tempFlag = static_cast<uint64_t>(1) << num;
1631 previousStateFlag = capturerStateFlag_.fetch_or(tempFlag);
1632 currentStateFlag = previousStateFlag | tempFlag;
1633 } else {
1634 uint64_t tempFlag = ~(static_cast<uint64_t>(1) << num);
1635 previousStateFlag = capturerStateFlag_.fetch_and(tempFlag);
1636 currentStateFlag = previousStateFlag & tempFlag;
1637 }
1638 bool previousState = previousStateFlag;
1639 bool currentState = currentStateFlag;
1640
1641 if (previousState == currentState) {
1642 // state not change, need not trigger callback
1643 return;
1644 }
1645
1646 CHECK_AND_RETURN_LOG(callback != nullptr, "OnCapturerState callback is nullptr.");
1647 Trace traceCb("callbackToIntelligentVoice");
1648 int64_t stamp = ClockTime::GetCurNano();
1649 callback->OnCapturerState(isActive);
1650 stamp = (ClockTime::GetCurNano() - stamp) / AUDIO_US_PER_SECOND;
1651 AUDIO_INFO_LOG("isActive:%{public}d num:%{public}d cb cost[%{public}" PRId64 "]", isActive, num, stamp);
1652 }
1653
SetParameterCallback(const sptr<IRemoteObject> & object)1654 int32_t AudioServer::SetParameterCallback(const sptr<IRemoteObject>& object)
1655 {
1656 int32_t callingUid = IPCSkeleton::GetCallingUid();
1657 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
1658 std::lock_guard<std::mutex> lock(audioParamCbMtx_);
1659 CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "AudioServer:set listener object is nullptr");
1660
1661 sptr<IStandardAudioServerManagerListener> listener = iface_cast<IStandardAudioServerManagerListener>(object);
1662
1663 CHECK_AND_RETURN_RET_LOG(listener != nullptr, ERR_INVALID_PARAM, "AudioServer: listener obj cast failed");
1664
1665 std::shared_ptr<AudioParameterCallback> callback = std::make_shared<AudioManagerListenerCallback>(listener);
1666 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "AudioPolicyServer: failed to create cb obj");
1667
1668 audioParamCb_ = callback;
1669 AUDIO_INFO_LOG("AudioServer:: SetParameterCallback done");
1670
1671 return SUCCESS;
1672 }
1673
SetWakeupSourceCallback(const sptr<IRemoteObject> & object)1674 int32_t AudioServer::SetWakeupSourceCallback(const sptr<IRemoteObject>& object)
1675 {
1676 int32_t callingUid = IPCSkeleton::GetCallingUid();
1677 CHECK_AND_RETURN_RET_LOG(callingUid == INTELL_VOICE_SERVICR_UID, false,
1678 "SetWakeupSourceCallback refused for %{public}d", callingUid);
1679
1680 CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM,
1681 "SetWakeupCloseCallback set listener object is nullptr");
1682
1683 sptr<IStandardAudioServerManagerListener> listener = iface_cast<IStandardAudioServerManagerListener>(object);
1684
1685 CHECK_AND_RETURN_RET_LOG(listener != nullptr, ERR_INVALID_PARAM,
1686 "SetWakeupCloseCallback listener obj cast failed");
1687
1688 std::shared_ptr<AudioManagerListenerCallback> wakeupCallback
1689 = std::make_shared<AudioManagerListenerCallback>(listener);
1690 CHECK_AND_RETURN_RET_LOG(wakeupCallback != nullptr, ERR_INVALID_PARAM,
1691 "SetWakeupCloseCallback failed to create cb obj");
1692
1693 {
1694 std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
1695 wakeupCallback_ = wakeupCallback;
1696 }
1697
1698 std::thread([this, wakeupCallback] {
1699 std::lock_guard<std::mutex> lockCb(onCapturerStateCbMutex_);
1700 wakeupCallback->TrigerFirstOnCapturerStateCallback(capturerStateFlag_);
1701 }).detach();
1702
1703 AUDIO_INFO_LOG("SetWakeupCloseCallback done");
1704
1705 return SUCCESS;
1706 }
1707
VerifyClientPermission(const std::string & permissionName,Security::AccessToken::AccessTokenID tokenId)1708 bool AudioServer::VerifyClientPermission(const std::string &permissionName,
1709 Security::AccessToken::AccessTokenID tokenId)
1710 {
1711 auto callerUid = IPCSkeleton::GetCallingUid();
1712 AUDIO_INFO_LOG("[%{public}s] for uid:%{public}d tokenId:%{public}u", permissionName.c_str(), callerUid, tokenId);
1713
1714 #ifdef AUDIO_BUILD_VARIANT_ROOT
1715 // Root users should be whitelisted
1716 if (callerUid == ROOT_UID) {
1717 AUDIO_INFO_LOG("Root user. Permission GRANTED!!!");
1718 return true;
1719 }
1720 #endif
1721 Security::AccessToken::AccessTokenID clientTokenId = tokenId;
1722 if (clientTokenId == Security::AccessToken::INVALID_TOKENID) {
1723 clientTokenId = IPCSkeleton::GetCallingTokenID();
1724 }
1725 int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(clientTokenId, permissionName);
1726 CHECK_AND_RETURN_RET_LOG(res == Security::AccessToken::PermissionState::PERMISSION_GRANTED,
1727 false, "Permission denied [tid:%{public}d]", clientTokenId);
1728
1729 return true;
1730 }
1731
PermissionChecker(const AudioProcessConfig & config)1732 bool AudioServer::PermissionChecker(const AudioProcessConfig &config)
1733 {
1734 if (config.audioMode == AUDIO_MODE_PLAYBACK) {
1735 return CheckPlaybackPermission(config);
1736 }
1737
1738 if (config.audioMode == AUDIO_MODE_RECORD) {
1739 return CheckRecorderPermission(config);
1740 }
1741
1742 AUDIO_ERR_LOG("Check failed invalid mode.");
1743 return false;
1744 }
1745
CheckPlaybackPermission(const AudioProcessConfig & config)1746 bool AudioServer::CheckPlaybackPermission(const AudioProcessConfig &config)
1747 {
1748 StreamUsage streamUsage = config.rendererInfo.streamUsage;
1749
1750 bool needVerifyPermission = false;
1751 for (const auto& item : STREAMS_NEED_VERIFY_SYSTEM_PERMISSION) {
1752 if (streamUsage == item) {
1753 needVerifyPermission = true;
1754 break;
1755 }
1756 }
1757 if (needVerifyPermission == false) {
1758 return true;
1759 }
1760 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), false,
1761 "Check playback permission failed, no system permission");
1762 return true;
1763 }
1764
CheckInnerRecorderPermission(const AudioProcessConfig & config)1765 int32_t AudioServer::CheckInnerRecorderPermission(const AudioProcessConfig &config)
1766 {
1767 SourceType sourceType = config.capturerInfo.sourceType;
1768 if (sourceType != SOURCE_TYPE_REMOTE_CAST && sourceType != SOURCE_TYPE_PLAYBACK_CAPTURE) {
1769 return PERMISSION_UNKNOWN;
1770 }
1771 #ifdef HAS_FEATURE_INNERCAPTURER
1772 Security::AccessToken::AccessTokenID tokenId = config.appInfo.appTokenId;
1773 if (sourceType == SOURCE_TYPE_REMOTE_CAST) {
1774 bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
1775 CHECK_AND_RETURN_RET_LOG(hasSystemPermission, PERMISSION_DENIED,
1776 "Create source remote cast failed: no system permission.");
1777
1778 bool hasCastAudioOutputPermission = VerifyClientPermission(CAST_AUDIO_OUTPUT_PERMISSION, tokenId);
1779 CHECK_AND_RETURN_RET_LOG(hasCastAudioOutputPermission, PERMISSION_DENIED, "No cast audio output permission");
1780 return PERMISSION_GRANTED;
1781 }
1782
1783 if (sourceType == SOURCE_TYPE_PLAYBACK_CAPTURE && config.innerCapMode == MODERN_INNER_CAP) {
1784 AUDIO_INFO_LOG("modern inner-cap source, no need to check.");
1785 return PERMISSION_GRANTED;
1786 }
1787 return PERMISSION_UNKNOWN;
1788 #else
1789 return PERMISSION_DENIED;
1790 #endif
1791 }
1792
CheckRecorderPermission(const AudioProcessConfig & config)1793 bool AudioServer::CheckRecorderPermission(const AudioProcessConfig &config)
1794 {
1795 Security::AccessToken::AccessTokenID tokenId = config.appInfo.appTokenId;
1796 SourceType sourceType = config.capturerInfo.sourceType;
1797 CHECK_AND_RETURN_RET_LOG(VALID_SOURCE_TYPE.count(sourceType), false, "invalid source type:%{public}d", sourceType);
1798
1799 #ifdef AUDIO_BUILD_VARIANT_ROOT
1800 int32_t appUid = config.appInfo.appUid;
1801 if (appUid == ROOT_UID) {
1802 return true;
1803 }
1804 #endif
1805
1806 AUDIO_INFO_LOG("check for uid:%{public}d source type:%{public}d", config.callerUid, sourceType);
1807
1808 if (sourceType == SOURCE_TYPE_VOICE_CALL) {
1809 bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
1810 CHECK_AND_RETURN_RET_LOG(hasSystemPermission, false, "VOICE_CALL failed: no system permission.");
1811
1812 bool res = CheckVoiceCallRecorderPermission(tokenId);
1813 return res;
1814 }
1815
1816 int32_t permission = CheckInnerRecorderPermission(config);
1817 AUDIO_INFO_LOG("CheckInnerRecorderPermission return %{public}d", permission);
1818 if (permission == PERMISSION_GRANTED) {
1819 return true;
1820 } else if (permission == PERMISSION_DENIED) {
1821 return false;
1822 }
1823
1824 // All record streams should be checked for MICROPHONE_PERMISSION
1825 bool res = VerifyClientPermission(MICROPHONE_PERMISSION, tokenId);
1826 CHECK_AND_RETURN_RET_LOG(res, false, "Check record permission failed: No permission.");
1827
1828 if (sourceType == SOURCE_TYPE_WAKEUP) {
1829 bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
1830 bool hasIntelVoicePermission = VerifyClientPermission(MANAGE_INTELLIGENT_VOICE_PERMISSION, tokenId);
1831 CHECK_AND_RETURN_RET_LOG(hasSystemPermission && hasIntelVoicePermission, false,
1832 "Create wakeup record stream failed: no permission.");
1833 return true;
1834 }
1835
1836 CHECK_AND_RETURN_RET(HandleCheckRecorderBackgroundCapture(config), false,
1837 "VerifyBackgroundCapture failed for callerUid:%{public}d", config.callerUid);
1838 return true;
1839 }
1840
HandleCheckRecorderBackgroundCapture(const AudioProcessConfig & config)1841 bool AudioServer::HandleCheckRecorderBackgroundCapture(const AudioProcessConfig &config)
1842 {
1843 SwitchStreamInfo info = {
1844 config.originalSessionId,
1845 config.callerUid,
1846 config.appInfo.appUid,
1847 config.appInfo.appPid,
1848 config.appInfo.appTokenId,
1849 CAPTURER_PREPARED,
1850 };
1851 if (PermissionUtil::NeedVerifyBackgroundCapture(config.callerUid, config.capturerInfo.sourceType) &&
1852 !PermissionUtil::VerifyBackgroundCapture(info.appTokenId, config.appInfo.appFullTokenId)) {
1853 if (SwitchStreamUtil::IsSwitchStreamSwitching(info, SWITCH_STATE_CREATED)) {
1854 AUDIO_INFO_LOG("Recreating stream for callerUid:%{public}d need not VerifyBackgroundCapture",
1855 config.callerUid);
1856 SwitchStreamUtil::UpdateSwitchStreamRecord(info, SWITCH_STATE_CREATED);
1857 return true;
1858 }
1859
1860 return false;
1861 }
1862 return true;
1863 }
1864
CheckVoiceCallRecorderPermission(Security::AccessToken::AccessTokenID tokenId)1865 bool AudioServer::CheckVoiceCallRecorderPermission(Security::AccessToken::AccessTokenID tokenId)
1866 {
1867 bool hasRecordVoiceCallPermission = VerifyClientPermission(RECORD_VOICE_CALL_PERMISSION, tokenId);
1868 CHECK_AND_RETURN_RET_LOG(hasRecordVoiceCallPermission, false, "No permission");
1869 return true;
1870 }
1871
AudioServerDied(pid_t pid,pid_t uid)1872 void AudioServer::AudioServerDied(pid_t pid, pid_t uid)
1873 {
1874 AUDIO_INFO_LOG("Policy server died: restart pulse audio");
1875 _Exit(0);
1876 }
1877
RegisterPolicyServerDeathRecipient()1878 void AudioServer::RegisterPolicyServerDeathRecipient()
1879 {
1880 AUDIO_INFO_LOG("Register policy server death recipient");
1881 pid_t pid = IPCSkeleton::GetCallingPid();
1882 pid_t uid = IPCSkeleton::GetCallingUid();
1883 sptr<AudioServerDeathRecipient> deathRecipient_ = new(std::nothrow) AudioServerDeathRecipient(pid, uid);
1884 if (deathRecipient_ != nullptr) {
1885 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1886 CHECK_AND_RETURN_LOG(samgr != nullptr, "Failed to obtain system ability manager");
1887 sptr<IRemoteObject> object = samgr->GetSystemAbility(OHOS::AUDIO_POLICY_SERVICE_ID);
1888 CHECK_AND_RETURN_LOG(object != nullptr, "Policy service unavailable");
1889 deathRecipient_->SetNotifyCb([this] (pid_t pid, pid_t uid) { this->AudioServerDied(pid, uid); });
1890 bool result = object->AddDeathRecipient(deathRecipient_);
1891 if (!result) {
1892 AUDIO_ERR_LOG("Failed to add deathRecipient");
1893 }
1894 }
1895 }
1896
CreatePlaybackCapturerManager()1897 bool AudioServer::CreatePlaybackCapturerManager()
1898 {
1899 #ifdef HAS_FEATURE_INNERCAPTURER
1900 if (!PermissionUtil::VerifyIsAudio()) {
1901 AUDIO_ERR_LOG("not audio calling!");
1902 return false;
1903 }
1904 std::vector<int32_t> usage;
1905 PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
1906 playbackCapturerMgr->SetSupportStreamUsage(usage);
1907 return true;
1908 #else
1909 return false;
1910 #endif
1911 }
1912
RegisterAudioCapturerSourceCallback()1913 void AudioServer::RegisterAudioCapturerSourceCallback()
1914 {
1915 IdHandler &idHandler = IdHandler::GetInstance();
1916 std::function<bool(uint32_t)> limitFunc = [&idHandler] (uint32_t id) -> bool {
1917 return idHandler.ParseType(id) == HDI_ID_TYPE_WAKEUP && idHandler.ParseInfo(id) == "Built_in_wakeup";
1918 };
1919 HdiAdapterManager::GetInstance().RegistSourceCallback(HDI_CB_CAPTURE_WAKEUP, this, limitFunc);
1920
1921 limitFunc = [&idHandler] (uint32_t id) -> bool {
1922 uint32_t type = idHandler.ParseType(id);
1923 std::string info = idHandler.ParseInfo(id);
1924 if (type == HDI_ID_TYPE_PRIMARY) {
1925 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_USB;
1926 }
1927 #ifdef SUPPORT_LOW_LATENCY
1928 if (type == HDI_ID_TYPE_FAST) {
1929 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_VOIP;
1930 }
1931 #endif
1932 if (type == HDI_ID_TYPE_BLUETOOTH) {
1933 return info == HDI_ID_INFO_DEFAULT;
1934 }
1935 return false;
1936 };
1937 std::shared_ptr<CapturerStateOb> callback = make_shared<CapturerStateOb>(
1938 [this] (bool isActive, int32_t num) {
1939 this->OnCapturerState(isActive, num);
1940 }
1941 );
1942 HdiAdapterManager::GetInstance().RegistSourceCallback(HDI_CB_CAPTURE_STATE, callback, limitFunc);
1943 }
1944
RegisterAudioRendererSinkCallback()1945 void AudioServer::RegisterAudioRendererSinkCallback()
1946 {
1947 // Only watch primary and fast sink for now, watch other sinks later.
1948 IdHandler &idHandler = IdHandler::GetInstance();
1949 std::function<bool(uint32_t)> limitFunc = [&idHandler] (uint32_t id) -> bool {
1950 uint32_t type = idHandler.ParseType(id);
1951 std::string info = idHandler.ParseInfo(id);
1952 if (type == HDI_ID_TYPE_PRIMARY) {
1953 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_USB ||
1954 info == HDI_ID_INFO_DIRECT || info == HDI_ID_INFO_DP ||
1955 info == HDI_ID_INFO_VOIP;
1956 }
1957 if (type == HDI_ID_TYPE_OFFLOAD) {
1958 return info == HDI_ID_INFO_DEFAULT;
1959 }
1960 if (type == HDI_ID_TYPE_MULTICHANNEL) {
1961 return info == HDI_ID_INFO_DEFAULT;
1962 }
1963 if (type == HDI_ID_TYPE_BLUETOOTH) {
1964 #ifdef SUPPORT_LOW_LATENCY
1965 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_MMAP;
1966 #else
1967 return info == HDI_ID_INFO_DEFAULT;
1968 #endif
1969 }
1970 #ifdef SUPPORT_LOW_LATENCY
1971 if (type == HDI_ID_TYPE_FAST) {
1972 return info == HDI_ID_INFO_DEFAULT || info == HDI_ID_INFO_VOIP;
1973 }
1974 #endif
1975 return false;
1976 };
1977 HdiAdapterManager::GetInstance().RegistSinkCallback(HDI_CB_RENDER_STATE, this, limitFunc);
1978 }
1979
NotifyStreamVolumeChanged(AudioStreamType streamType,float volume)1980 int32_t AudioServer::NotifyStreamVolumeChanged(AudioStreamType streamType, float volume)
1981 {
1982 AUDIO_INFO_LOG("Enter the notifyStreamVolumeChanged interface");
1983 int32_t callingUid = IPCSkeleton::GetCallingUid();
1984 if (!PermissionUtil::VerifyIsAudio()) {
1985 AUDIO_ERR_LOG("NotifyStreamVolumeChanged refused for %{public}d", callingUid);
1986 return ERR_NOT_SUPPORTED;
1987 }
1988
1989 SetSystemVolumeToEffect(streamType, volume);
1990
1991 int32_t ret = AudioService::GetInstance()->NotifyStreamVolumeChanged(streamType, volume);
1992 if (ret != SUCCESS) {
1993 AUDIO_WARNING_LOG("NotifyStreamVolumeChanged failed");
1994 }
1995 ret = SetVolumeInfoForEnhanceChain(streamType);
1996 if (ret != SUCCESS) {
1997 AUDIO_WARNING_LOG("SetVolumeInfoForEnhanceChain failed");
1998 }
1999 return SUCCESS;
2000 }
2001
ResetRouteForDisconnect(DeviceType type)2002 int32_t AudioServer::ResetRouteForDisconnect(DeviceType type)
2003 {
2004 int32_t callingUid = IPCSkeleton::GetCallingUid();
2005 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
2006
2007 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
2008 if (sink == nullptr) {
2009 AUDIO_ERR_LOG("audioRendererSinkInstance is null!");
2010 return ERROR;
2011 }
2012 sink->ResetActiveDeviceForDisconnect(type);
2013
2014 // todo reset capturer
2015
2016 return SUCCESS;
2017 }
2018
GetMaxAmplitude(bool isOutputDevice,std::string deviceClass,SourceType sourceType)2019 float AudioServer::GetMaxAmplitude(bool isOutputDevice, std::string deviceClass, SourceType sourceType)
2020 {
2021 int32_t callingUid = IPCSkeleton::GetCallingUid();
2022 AUDIO_INFO_LOG("GetMaxAmplitude in audio server deviceClass %{public}s", deviceClass.c_str());
2023 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), 0, "GetMaxAmplitude refused for %{public}d", callingUid);
2024
2025 float fastMaxAmplitude = AudioService::GetInstance()->GetMaxAmplitude(isOutputDevice);
2026 std::shared_ptr<IAudioRenderSink> sink = nullptr;
2027 std::shared_ptr<IAudioCaptureSource> source = nullptr;
2028 if (isOutputDevice) {
2029 uint32_t renderId = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(deviceClass);
2030 sink = HdiAdapterManager::GetInstance().GetRenderSink(renderId, false);
2031 if (sink != nullptr) {
2032 float normalMaxAmplitude = sink->GetMaxAmplitude();
2033 return (normalMaxAmplitude > fastMaxAmplitude) ? normalMaxAmplitude : fastMaxAmplitude;
2034 }
2035 } else {
2036 uint32_t sourceId = HdiAdapterManager::GetInstance().GetCaptureIdByDeviceClass(deviceClass, sourceType);
2037 source = HdiAdapterManager::GetInstance().GetCaptureSource(sourceId, false);
2038 if (source != nullptr) {
2039 float normalMaxAmplitude = source->GetMaxAmplitude();
2040 return (normalMaxAmplitude > fastMaxAmplitude) ? normalMaxAmplitude : fastMaxAmplitude;
2041 }
2042 }
2043
2044 return 0;
2045 }
2046
ResetAudioEndpoint()2047 void AudioServer::ResetAudioEndpoint()
2048 {
2049 #ifdef SUPPORT_LOW_LATENCY
2050 int32_t callingUid = IPCSkeleton::GetCallingUid();
2051 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "Refused for %{public}d", callingUid);
2052 AudioService::GetInstance()->ResetAudioEndpoint();
2053 #endif
2054 }
2055
UpdateLatencyTimestamp(std::string & timestamp,bool isRenderer)2056 void AudioServer::UpdateLatencyTimestamp(std::string ×tamp, bool isRenderer)
2057 {
2058 if (isRenderer) {
2059 LatencyMonitor::GetInstance().UpdateClientTime(true, timestamp);
2060 } else {
2061 LatencyMonitor::GetInstance().UpdateClientTime(false, timestamp);
2062 LatencyMonitor::GetInstance().ShowTimestamp(false);
2063 }
2064 }
2065
UpdateDualToneState(bool enable,int32_t sessionId)2066 int32_t AudioServer::UpdateDualToneState(bool enable, int32_t sessionId)
2067 {
2068 int32_t callingUid = IPCSkeleton::GetCallingUid();
2069 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
2070
2071 if (enable) {
2072 return AudioService::GetInstance()->EnableDualToneList(static_cast<uint32_t>(sessionId));
2073 } else {
2074 return AudioService::GetInstance()->DisableDualToneList(static_cast<uint32_t>(sessionId));
2075 }
2076 }
2077
SetSinkRenderEmpty(const std::string & devceClass,int32_t durationUs)2078 int32_t AudioServer::SetSinkRenderEmpty(const std::string &devceClass, int32_t durationUs)
2079 {
2080 if (durationUs <= 0) {
2081 return SUCCESS;
2082 }
2083 std::shared_ptr<IAudioRenderSink> sink = GetSinkByProp(HDI_ID_TYPE_PRIMARY);
2084 CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "has no valid sink");
2085
2086 return sink->SetRenderEmpty(durationUs);
2087 }
2088
SetSinkMuteForSwitchDevice(const std::string & devceClass,int32_t durationUs,bool mute)2089 int32_t AudioServer::SetSinkMuteForSwitchDevice(const std::string &devceClass, int32_t durationUs, bool mute)
2090 {
2091 int32_t callingUid = IPCSkeleton::GetCallingUid();
2092 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_PERMISSION_DENIED, "refused for %{public}d",
2093 callingUid);
2094
2095 if (durationUs <= 0) {
2096 return SUCCESS;
2097 }
2098
2099 uint32_t id = HdiAdapterManager::GetInstance().GetRenderIdByDeviceClass(devceClass);
2100 std::shared_ptr<IAudioRenderSink> sink = HdiAdapterManager::GetInstance().GetRenderSink(id);
2101 CHECK_AND_RETURN_RET_LOG(sink != nullptr, ERROR, "has no valid sink");
2102 return sink->SetSinkMuteForSwitchDevice(mute);
2103 }
2104
UpdateSessionConnectionState(const int32_t & sessionId,const int32_t & state)2105 void AudioServer::UpdateSessionConnectionState(const int32_t &sessionId, const int32_t &state)
2106 {
2107 AUDIO_INFO_LOG("Server get sessionID: %{public}d, state: %{public}d", sessionId, state);
2108 int32_t callingUid = IPCSkeleton::GetCallingUid();
2109 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(),
2110 "Update session connection state refused for %{public}d", callingUid);
2111 std::shared_ptr<RendererInServer> renderer =
2112 AudioService::GetInstance()->GetRendererBySessionID(static_cast<uint32_t>(sessionId));
2113
2114 if (renderer == nullptr) {
2115 AUDIO_ERR_LOG("No render in server has sessionID");
2116 return;
2117 }
2118 renderer->OnDataLinkConnectionUpdate(static_cast<IOperation>(state));
2119 }
2120
SetNonInterruptMute(const uint32_t sessionId,const bool muteFlag)2121 void AudioServer::SetNonInterruptMute(const uint32_t sessionId, const bool muteFlag)
2122 {
2123 AUDIO_INFO_LOG("sessionId_: %{public}u, muteFlag: %{public}d", sessionId, muteFlag);
2124 int32_t callingUid = IPCSkeleton::GetCallingUid();
2125 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "Refused for %{public}d", callingUid);
2126 AudioService::GetInstance()->SetNonInterruptMute(sessionId, muteFlag);
2127 }
2128
RestoreSession(const uint32_t & sessionID,RestoreInfo restoreInfo)2129 void AudioServer::RestoreSession(const uint32_t &sessionID, RestoreInfo restoreInfo)
2130 {
2131 AUDIO_INFO_LOG("restore session: %{public}u, reason: %{public}d, device change reason %{public}d, "
2132 "target flag %{public}d", sessionID, restoreInfo.restoreReason, restoreInfo.deviceChangeReason,
2133 restoreInfo.targetStreamFlag);
2134 int32_t callingUid = IPCSkeleton::GetCallingUid();
2135 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(),
2136 "Update session connection state refused for %{public}d", callingUid);
2137 int32_t tryCount = RESTORE_SESSION_TRY_COUNT;
2138 RestoreStatus restoreStatus;
2139 while (tryCount > 0) {
2140 restoreStatus = AudioService::GetInstance()->RestoreSession(sessionID, restoreInfo);
2141 if (restoreStatus == NEED_RESTORE) {
2142 return;
2143 }
2144 if (restoreStatus == RESTORING) {
2145 AUDIO_WARNING_LOG("Session %{public}u is restoring, wait 50ms, tryCount %{public}d", sessionID, tryCount);
2146 usleep(RESTORE_SESSION_RETRY_WAIT_TIME_IN_MS); // Sleep for 50ms and try restore again.
2147 }
2148 tryCount--;
2149 }
2150
2151 if (restoreStatus != NEED_RESTORE) {
2152 AUDIO_WARNING_LOG("Restore session in server failed, restore status %{public}d", restoreStatus);
2153 }
2154 }
2155
SetOffloadMode(uint32_t sessionId,int32_t state,bool isAppBack)2156 int32_t AudioServer::SetOffloadMode(uint32_t sessionId, int32_t state, bool isAppBack)
2157 {
2158 int32_t callingUid = IPCSkeleton::GetCallingUid();
2159 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
2160 callingUid);
2161 return AudioService::GetInstance()->SetOffloadMode(sessionId, state, isAppBack);
2162 }
2163
UnsetOffloadMode(uint32_t sessionId)2164 int32_t AudioServer::UnsetOffloadMode(uint32_t sessionId)
2165 {
2166 int32_t callingUid = IPCSkeleton::GetCallingUid();
2167 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d",
2168 callingUid);
2169 return AudioService::GetInstance()->UnsetOffloadMode(sessionId);
2170 }
2171
OnRenderSinkStateChange(uint32_t sinkId,bool started)2172 void AudioServer::OnRenderSinkStateChange(uint32_t sinkId, bool started)
2173 {
2174 AudioService::GetInstance()->UpdateAudioSinkState(sinkId, started);
2175 return;
2176 }
2177
CheckHibernateState(bool hibernate)2178 void AudioServer::CheckHibernateState(bool hibernate)
2179 {
2180 int32_t callingUid = IPCSkeleton::GetCallingUid();
2181 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "refused for %{public}d", callingUid);
2182 return AudioService::GetInstance()->CheckHibernateState(hibernate);
2183 }
2184
CreateIpcOfflineStream(int32_t & errorCode)2185 sptr<IRemoteObject> AudioServer::CreateIpcOfflineStream(int32_t &errorCode)
2186 {
2187 int32_t callingUid = IPCSkeleton::GetCallingUid();
2188 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), nullptr, "refused for %{public}d", callingUid);
2189 sptr<OfflineStreamInServer> stream = OfflineStreamInServer::GetOfflineStream(errorCode);
2190 CHECK_AND_RETURN_RET_LOG(stream, nullptr, "Create IpcOfflineStream failed.");
2191 sptr<IRemoteObject> remoteObject = stream->AsObject();
2192 return remoteObject;
2193 }
2194
GetOfflineAudioEffectChains(std::vector<std::string> & effectChains)2195 int32_t AudioServer::GetOfflineAudioEffectChains(std::vector<std::string> &effectChains)
2196 {
2197 int32_t callingUid = IPCSkeleton::GetCallingUid();
2198 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
2199 "refused for %{public}d", callingUid);
2200 #ifdef FEATURE_OFFLINE_EFFECT
2201 return OfflineStreamInServer::GetOfflineAudioEffectChains(effectChains);
2202 #endif
2203 return ERR_NOT_SUPPORTED;
2204 }
2205
GetStandbyStatus(uint32_t sessionId,bool & isStandby,int64_t & enterStandbyTime)2206 int32_t AudioServer::GetStandbyStatus(uint32_t sessionId, bool &isStandby, int64_t &enterStandbyTime)
2207 {
2208 Trace trace("AudioServer::GetStandbyStatus:" + std::to_string(sessionId));
2209
2210 // only for native sa calling
2211 auto type = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(IPCSkeleton::GetCallingTokenID());
2212 bool isAllowed = type == Security::AccessToken::TOKEN_NATIVE;
2213 #ifdef AUDIO_BUILD_VARIANT_ROOT
2214 isAllowed = isAllowed || type == Security::AccessToken::TOKEN_SHELL; // for DT
2215 #endif
2216 CHECK_AND_RETURN_RET_LOG(isAllowed, ERR_INVALID_OPERATION, "not allowed");
2217
2218 return AudioService::GetInstance()->GetStandbyStatus(sessionId, isStandby, enterStandbyTime);
2219 }
2220
GenerateSessionId(uint32_t & sessionId)2221 int32_t AudioServer::GenerateSessionId(uint32_t &sessionId)
2222 {
2223 int32_t uid = IPCSkeleton::GetCallingUid();
2224 CHECK_AND_RETURN_RET_LOG(uid == MCU_UID, ERROR, "uid is %{public}d, not mcu uid", uid);
2225 sessionId = PolicyHandler::GetInstance().GenerateSessionId(uid);
2226 return SUCCESS;
2227 }
2228
GetAllSinkInputs(std::vector<SinkInput> & sinkInputs)2229 void AudioServer::GetAllSinkInputs(std::vector<SinkInput> &sinkInputs)
2230 {
2231 int32_t callingUid = IPCSkeleton::GetCallingUid();
2232 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "Refused for %{public}d", callingUid);
2233 AudioService::GetInstance()->GetAllSinkInputs(sinkInputs);
2234 }
2235
SetDefaultAdapterEnable(bool isEnable)2236 void AudioServer::SetDefaultAdapterEnable(bool isEnable)
2237 {
2238 int32_t callingUid = IPCSkeleton::GetCallingUid();
2239 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "Refused for %{public}d", callingUid);
2240 AudioService::GetInstance()->SetDefaultAdapterEnable(isEnable);
2241 }
2242
NotifyAudioPolicyReady()2243 void AudioServer::NotifyAudioPolicyReady()
2244 {
2245 int32_t callingUid = IPCSkeleton::GetCallingUid();
2246 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "refused for %{public}d", callingUid);
2247
2248 std::lock_guard lock(isAudioPolicyReadyMutex_);
2249 isAudioPolicyReady_ = true;
2250 isAudioPolicyReadyCv_.notify_all();
2251 AUDIO_INFO_LOG("out");
2252 }
2253
2254 #ifdef HAS_FEATURE_INNERCAPTURER
CheckCaptureLimit(const AudioPlaybackCaptureConfig & config,int32_t & innerCapId)2255 int32_t AudioServer::CheckCaptureLimit(const AudioPlaybackCaptureConfig &config, int32_t &innerCapId)
2256 {
2257 #ifdef AUDIO_BUILD_VARIANT_ROOT
2258 // root user case for auto test
2259 uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2260 if (callingUid == ROOT_UID) {
2261 return InnerCheckCaptureLimit(config, innerCapId);
2262 }
2263 return ERR_NOT_SUPPORTED;
2264 #endif
2265 return ERR_NOT_SUPPORTED;
2266 }
2267
SetInnerCapLimit(uint32_t innerCapLimit)2268 int32_t AudioServer::SetInnerCapLimit(uint32_t innerCapLimit)
2269 {
2270 int32_t callingUid = IPCSkeleton::GetCallingUid();
2271 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED,
2272 "refused for %{public}d", callingUid);
2273 PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
2274 int32_t ret = playbackCapturerMgr->SetInnerCapLimit(innerCapLimit);
2275 if (ret != SUCCESS) {
2276 AUDIO_ERR_LOG("SetInnerCapLimit error");
2277 }
2278 return ret;
2279 }
2280
ReleaseCaptureLimit(int32_t innerCapId)2281 int32_t AudioServer::ReleaseCaptureLimit(int32_t innerCapId)
2282 {
2283 #ifdef AUDIO_BUILD_VARIANT_ROOT
2284 // root user case for auto test
2285 uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2286 if (callingUid == ROOT_UID) {
2287 PlaybackCapturerManager::GetInstance()->CheckReleaseUnloadModernInnerCapSink(innerCapId);
2288 return SUCCESS;
2289 }
2290 return ERR_NOT_SUPPORTED;
2291 #endif
2292 return ERR_NOT_SUPPORTED;
2293 }
2294 #endif
2295
LoadHdiAdapter(uint32_t devMgrType,const std::string & adapterName)2296 int32_t AudioServer::LoadHdiAdapter(uint32_t devMgrType, const std::string &adapterName)
2297 {
2298 int32_t callingUid = IPCSkeleton::GetCallingUid();
2299 CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyIsAudio(), ERR_NOT_SUPPORTED, "refused for %{public}d", callingUid);
2300
2301 return HdiAdapterManager::GetInstance().LoadAdapter(static_cast<HdiDeviceManagerType>(devMgrType), adapterName);
2302 }
2303
UnloadHdiAdapter(uint32_t devMgrType,const std::string & adapterName,bool force)2304 void AudioServer::UnloadHdiAdapter(uint32_t devMgrType, const std::string &adapterName, bool force)
2305 {
2306 int32_t callingUid = IPCSkeleton::GetCallingUid();
2307 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "refused for %{public}d", callingUid);
2308
2309 HdiAdapterManager::GetInstance().UnloadAdapter(static_cast<HdiDeviceManagerType>(devMgrType), adapterName, force);
2310 }
2311
SetDeviceConnectedFlag(bool flag)2312 void AudioServer::SetDeviceConnectedFlag(bool flag)
2313 {
2314 int32_t callingUid = IPCSkeleton::GetCallingUid();
2315 CHECK_AND_RETURN_LOG(PermissionUtil::VerifyIsAudio(), "refused for %{public}d", callingUid);
2316
2317 std::shared_ptr<IAudioRenderSink> primarySink = GetSinkByProp(HDI_ID_TYPE_PRIMARY, HDI_ID_INFO_DEFAULT, true);
2318 CHECK_AND_RETURN_LOG(primarySink, "primarySink is nullptr");
2319 primarySink->SetDeviceConnectedFlag(flag);
2320 }
2321
2322 } // namespace AudioStandard
2323 } // namespace OHOS
2324