• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef LOG_TAG
16 #define LOG_TAG "AudioServer"
17 #endif
18 
19 #include "audio_server.h"
20 
21 #include <cinttypes>
22 #include <codecvt>
23 #include <csignal>
24 #include <fstream>
25 #include <sstream>
26 #include <thread>
27 #include <unordered_map>
28 #include <vector>
29 #include <format>
30 
31 #include "bundle_mgr_interface.h"
32 #include "bundle_mgr_proxy.h"
33 #include "iservice_registry.h"
34 #include "system_ability_definition.h"
35 #include "hisysevent.h"
36 #include "parameters.h"
37 
38 #include "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>> &params)
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 &timestamp, 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