1 /*
2 * Copyright (c) 2021-2023 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
16 #include "audio_server.h"
17
18 #include <cinttypes>
19 #include <csignal>
20 #include <fstream>
21 #include <sstream>
22 #include <thread>
23 #include <unordered_map>
24
25 #include "iservice_registry.h"
26 #include "system_ability_definition.h"
27 #include "xcollie/xcollie.h"
28 #include "xcollie/xcollie_define.h"
29
30 #include "audio_capturer_source.h"
31 #include "audio_errors.h"
32 #include "audio_log.h"
33 #include "audio_manager_listener_proxy.h"
34 #include "audio_service.h"
35 #include "audio_schedule.h"
36 #include "audio_utils.h"
37 #include "i_audio_capturer_source.h"
38 #include "i_audio_renderer_sink.h"
39 #include "i_standard_audio_server_manager_listener.h"
40 #include "audio_effect_chain_manager.h"
41 #include "playback_capturer_manager.h"
42 #include "policy_handler.h"
43
44 #define PA
45 #ifdef PA
46 extern "C" {
47 extern int ohos_pa_main(int argc, char *argv[]);
48 }
49 #endif
50
51 using namespace std;
52
53 namespace OHOS {
54 namespace AudioStandard {
55 std::map<std::string, std::string> AudioServer::audioParameters;
56 const string DEFAULT_COOKIE_PATH = "/data/data/.pulse_dir/state/cookie";
57 const unsigned int TIME_OUT_SECONDS = 10;
58
59 REGISTER_SYSTEM_ABILITY_BY_ID(AudioServer, AUDIO_DISTRIBUTED_SERVICE_ID, true)
60
61 #ifdef PA
62 constexpr int PA_ARG_COUNT = 1;
63
paDaemonThread(void * arg)64 void *AudioServer::paDaemonThread(void *arg)
65 {
66 /* Load the mandatory pulseaudio modules at start */
67 char *argv[] = {
68 (char*)"pulseaudio",
69 };
70
71 AUDIO_INFO_LOG("Calling ohos_pa_main\n");
72 ohos_pa_main(PA_ARG_COUNT, argv);
73 AUDIO_INFO_LOG("Exiting ohos_pa_main\n");
74 exit(-1);
75 }
76 #endif
77
AudioServer(int32_t systemAbilityId,bool runOnCreate)78 AudioServer::AudioServer(int32_t systemAbilityId, bool runOnCreate)
79 : SystemAbility(systemAbilityId, runOnCreate),
80 audioEffectServer_(std::make_unique<AudioEffectServer>()) {}
81
OnDump()82 void AudioServer::OnDump() {}
83
Dump(int32_t fd,const std::vector<std::u16string> & args)84 int32_t AudioServer::Dump(int32_t fd, const std::vector<std::u16string> &args)
85 {
86 AUDIO_INFO_LOG("AudioServer: Dump Process Invoked");
87 std::stringstream dumpStringStream;
88 AudioService::GetInstance()->Dump(dumpStringStream);
89 std::string dumpString = dumpStringStream.str();
90 return write(fd, dumpString.c_str(), dumpString.size());
91 }
92
OnStart()93 void AudioServer::OnStart()
94 {
95 audioUid_ = getuid();
96 AUDIO_INFO_LOG("AudioServer OnStart uid:%{public}d", audioUid_);
97 bool res = Publish(this);
98 if (!res) {
99 AUDIO_ERR_LOG("AudioServer start err");
100 }
101 AddSystemAbilityListener(AUDIO_POLICY_SERVICE_ID);
102 #ifdef PA
103 int32_t ret = pthread_create(&m_paDaemonThread, nullptr, AudioServer::paDaemonThread, nullptr);
104 pthread_setname_np(m_paDaemonThread, "AudioServer");
105 if (ret != 0) {
106 AUDIO_ERR_LOG("pthread_create failed %d", ret);
107 }
108 AUDIO_INFO_LOG("Created paDaemonThread\n");
109 #endif
110
111 RegisterAudioCapturerSourceCallback();
112 }
113
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)114 void AudioServer::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
115 {
116 AUDIO_DEBUG_LOG("OnAddSystemAbility systemAbilityId:%{public}d", systemAbilityId);
117 switch (systemAbilityId) {
118 case AUDIO_POLICY_SERVICE_ID:
119 AUDIO_INFO_LOG("OnAddSystemAbility input service start");
120 RegisterPolicyServerDeathRecipient();
121 break;
122 default:
123 AUDIO_ERR_LOG("OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
124 break;
125 }
126 }
127
OnStop()128 void AudioServer::OnStop()
129 {
130 AUDIO_DEBUG_LOG("AudioService OnStop");
131 }
132
SetAudioParameter(const std::string & key,const std::string & value)133 void AudioServer::SetAudioParameter(const std::string &key, const std::string &value)
134 {
135 std::lock_guard<std::mutex> lockSet(audioParameterMutex_);
136 int32_t id = HiviewDFX::XCollie::GetInstance().SetTimer("AudioServer::SetAudioScene",
137 TIME_OUT_SECONDS, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
138 AUDIO_DEBUG_LOG("server: set audio parameter");
139 if (!VerifyClientPermission(MODIFY_AUDIO_SETTINGS_PERMISSION)) {
140 AUDIO_ERR_LOG("SetAudioParameter: MODIFY_AUDIO_SETTINGS permission denied");
141 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
142 return;
143 }
144
145 AudioServer::audioParameters[key] = value;
146
147 // send it to hal
148 AudioParamKey parmKey = AudioParamKey::NONE;
149 if (key == "A2dpSuspended") {
150 parmKey = AudioParamKey::A2DP_SUSPEND_STATE;
151 IAudioRendererSink* bluetoothSinkInstance = IAudioRendererSink::GetInstance("a2dp", "");
152 if (bluetoothSinkInstance == nullptr) {
153 AUDIO_ERR_LOG("has no valid sink");
154 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
155 return;
156 }
157 std::string renderValue = key + "=" + value + ";";
158 bluetoothSinkInstance->SetAudioParameter(parmKey, "", renderValue);
159 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
160 return;
161 }
162
163 IAudioRendererSink* audioRendererSinkInstance = IAudioRendererSink::GetInstance("primary", "");
164 if (audioRendererSinkInstance == nullptr) {
165 AUDIO_ERR_LOG("has no valid sink");
166 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
167 return;
168 }
169
170 if (key == "AUDIO_EXT_PARAM_KEY_LOWPOWER") {
171 parmKey = AudioParamKey::PARAM_KEY_LOWPOWER;
172 } else if (key == "bt_headset_nrec") {
173 parmKey = AudioParamKey::BT_HEADSET_NREC;
174 } else if (key == "bt_wbs") {
175 parmKey = AudioParamKey::BT_WBS;
176 } else {
177 AUDIO_ERR_LOG("SetAudioParameter: key %{publbic}s is invalid for hdi interface", key.c_str());
178 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
179 return;
180 }
181 audioRendererSinkInstance->SetAudioParameter(parmKey, "", value);
182 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
183 }
184
SetAudioParameter(const std::string & networkId,const AudioParamKey key,const std::string & condition,const std::string & value)185 void AudioServer::SetAudioParameter(const std::string& networkId, const AudioParamKey key, const std::string& condition,
186 const std::string& value)
187 {
188 int32_t callingUid = IPCSkeleton::GetCallingUid();
189 if (callingUid != audioUid_ && !VerifyClientPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION)) {
190 AUDIO_ERR_LOG("SetAudioParameter refused for %{public}d", callingUid);
191 return;
192 }
193 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("remote", networkId.c_str());
194 if (audioRendererSinkInstance == nullptr) {
195 AUDIO_ERR_LOG("has no valid sink");
196 return;
197 }
198
199 audioRendererSinkInstance->SetAudioParameter(key, condition, value);
200 }
201
GetAudioParameter(const std::string & key)202 const std::string AudioServer::GetAudioParameter(const std::string &key)
203 {
204 std::lock_guard<std::mutex> lockSet(audioParameterMutex_);
205 int32_t id = HiviewDFX::XCollie::GetInstance().SetTimer("AudioServer::SetAudioScene",
206 TIME_OUT_SECONDS, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
207 AUDIO_DEBUG_LOG("server: get audio parameter");
208 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("primary", "");
209 if (audioRendererSinkInstance != nullptr) {
210 AudioParamKey parmKey = AudioParamKey::NONE;
211 if (key == "AUDIO_EXT_PARAM_KEY_LOWPOWER") {
212 parmKey = AudioParamKey::PARAM_KEY_LOWPOWER;
213 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
214 return audioRendererSinkInstance->GetAudioParameter(AudioParamKey(parmKey), "");
215 }
216 }
217
218 if (AudioServer::audioParameters.count(key)) {
219 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
220 return AudioServer::audioParameters[key];
221 } else {
222 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
223 return "";
224 }
225 }
226
GetAudioParameter(const std::string & networkId,const AudioParamKey key,const std::string & condition)227 const std::string AudioServer::GetAudioParameter(const std::string& networkId, const AudioParamKey key,
228 const std::string& condition)
229 {
230 int32_t callingUid = IPCSkeleton::GetCallingUid();
231 if (callingUid != audioUid_ && !VerifyClientPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION)) {
232 AUDIO_ERR_LOG("GetAudioParameter refused for %{public}d", callingUid);
233 return "";
234 }
235 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("remote", networkId.c_str());
236 if (audioRendererSinkInstance == nullptr) {
237 AUDIO_ERR_LOG("has no valid sink");
238 return "";
239 }
240 return audioRendererSinkInstance->GetAudioParameter(key, condition);
241 }
242
RetrieveCookie(int32_t & size)243 const char *AudioServer::RetrieveCookie(int32_t &size)
244 {
245 char *cookieInfo = nullptr;
246 size = 0;
247 std::ifstream cookieFile(DEFAULT_COOKIE_PATH, std::ifstream::binary);
248 if (!cookieFile) {
249 return cookieInfo;
250 }
251
252 cookieFile.seekg (0, cookieFile.end);
253 size = cookieFile.tellg();
254 cookieFile.seekg (0, cookieFile.beg);
255
256 if ((size > 0) && (size < PATH_MAX)) {
257 cookieInfo = (char *)malloc(size * sizeof(char));
258 if (cookieInfo == nullptr) {
259 AUDIO_ERR_LOG("AudioServer::RetrieveCookie: No memory");
260 cookieFile.close();
261 return cookieInfo;
262 }
263 AUDIO_DEBUG_LOG("Reading: %{public}d characters...", size);
264 cookieFile.read(cookieInfo, size);
265 }
266 cookieFile.close();
267 return cookieInfo;
268 }
269
GetTransactionId(DeviceType deviceType,DeviceRole deviceRole)270 uint64_t AudioServer::GetTransactionId(DeviceType deviceType, DeviceRole deviceRole)
271 {
272 uint64_t transactionId = 0;
273 AUDIO_INFO_LOG("GetTransactionId in: device type: %{public}d, device role: %{public}d", deviceType, deviceRole);
274 if (deviceRole != INPUT_DEVICE && deviceRole != OUTPUT_DEVICE) {
275 AUDIO_ERR_LOG("AudioServer::GetTransactionId: error device role");
276 return ERR_INVALID_PARAM;
277 }
278 if (deviceRole == INPUT_DEVICE) {
279 AudioCapturerSource *audioCapturerSourceInstance = AudioCapturerSource::GetInstance();
280 if (audioCapturerSourceInstance) {
281 transactionId = audioCapturerSourceInstance->GetTransactionId();
282 }
283 AUDIO_INFO_LOG("Transaction Id: %{public}" PRIu64, transactionId);
284 return transactionId;
285 }
286
287 // deviceRole OUTPUT_DEVICE
288 IAudioRendererSink *iRendererInstance = nullptr;
289 if (deviceType == DEVICE_TYPE_BLUETOOTH_A2DP) {
290 iRendererInstance = IAudioRendererSink::GetInstance("a2dp", "");
291 } else {
292 iRendererInstance = IAudioRendererSink::GetInstance("primary", "");
293 }
294
295 int32_t ret = ERROR;
296 if (iRendererInstance != nullptr) {
297 ret = iRendererInstance->GetTransactionId(&transactionId);
298 }
299
300 if (ret) {
301 AUDIO_ERR_LOG("Get transactionId failed.");
302 return transactionId;
303 }
304
305 AUDIO_DEBUG_LOG("Transaction Id: %{public}" PRIu64, transactionId);
306 return transactionId;
307 }
308
LoadAudioEffectLibraries(const std::vector<Library> libraries,const std::vector<Effect> effects,std::vector<Effect> & successEffectList)309 bool AudioServer::LoadAudioEffectLibraries(const std::vector<Library> libraries, const std::vector<Effect> effects,
310 std::vector<Effect>& successEffectList)
311 {
312 int32_t callingUid = IPCSkeleton::GetCallingUid();
313 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
314 AUDIO_ERR_LOG("LoadAudioEffectLibraries refused for %{public}d", callingUid);
315 return false;
316 }
317 bool loadSuccess = audioEffectServer_->LoadAudioEffects(libraries, effects, successEffectList);
318 if (!loadSuccess) {
319 AUDIO_ERR_LOG("Load audio effect failed, please check log");
320 }
321 return loadSuccess;
322 }
323
CreateEffectChainManager(std::vector<EffectChain> & effectChains,std::unordered_map<std::string,std::string> & map)324 bool AudioServer::CreateEffectChainManager(std::vector<EffectChain> &effectChains,
325 std::unordered_map<std::string, std::string> &map)
326 {
327 int32_t audio_policy_server_id = 1041;
328 if (IPCSkeleton::GetCallingUid() != audio_policy_server_id) {
329 return false;
330 }
331 AudioEffectChainManager *audioEffectChainManager = AudioEffectChainManager::GetInstance();
332 audioEffectChainManager->InitAudioEffectChainManager(effectChains, map, audioEffectServer_->GetEffectEntries());
333 return true;
334 }
335
SetOutputDeviceSink(int32_t deviceType,std::string & sinkName)336 bool AudioServer::SetOutputDeviceSink(int32_t deviceType, std::string &sinkName)
337 {
338 Trace trace("AudioServer::SetOutputDeviceSink:" + std::to_string(deviceType) + " sink:" + sinkName);
339 int32_t audio_policy_server_id = 1041;
340 if (IPCSkeleton::GetCallingUid() != audio_policy_server_id) {
341 return false;
342 }
343 AudioEffectChainManager *audioEffectChainManager = AudioEffectChainManager::GetInstance();
344 if (audioEffectChainManager->SetOutputDeviceSink(deviceType, sinkName) != SUCCESS) {
345 return false;
346 }
347 return true;
348 }
349
SetMicrophoneMute(bool isMute)350 int32_t AudioServer::SetMicrophoneMute(bool isMute)
351 {
352 int32_t callingUid = IPCSkeleton::GetCallingUid();
353 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
354 AUDIO_ERR_LOG("SetMicrophoneMute refused for %{public}d", callingUid);
355 return ERR_PERMISSION_DENIED;
356 }
357 AudioCapturerSource *audioCapturerSourceInstance = AudioCapturerSource::GetInstance();
358
359 if (!audioCapturerSourceInstance->IsInited()) {
360 AUDIO_INFO_LOG("Capturer is not initialized. Set the flag mute state flag");
361 AudioCapturerSource::micMuteState_ = isMute;
362 return 0;
363 }
364
365 return audioCapturerSourceInstance->SetMute(isMute);
366 }
367
IsMicrophoneMute()368 bool AudioServer::IsMicrophoneMute()
369 {
370 int32_t callingUid = IPCSkeleton::GetCallingUid();
371 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
372 AUDIO_ERR_LOG("IsMicrophoneMute refused for %{public}d", callingUid);
373 return false;
374 }
375 AudioCapturerSource *audioCapturerSourceInstance = AudioCapturerSource::GetInstance();
376 bool isMute = false;
377
378 if (!audioCapturerSourceInstance->IsInited()) {
379 AUDIO_INFO_LOG("Capturer is not initialized. Get the mic mute state flag value!");
380 return AudioCapturerSource::micMuteState_;
381 }
382
383 if (audioCapturerSourceInstance->GetMute(isMute)) {
384 AUDIO_ERR_LOG("GetMute status in capturer returned Error !");
385 }
386
387 return isMute;
388 }
389
SetVoiceVolume(float volume)390 int32_t AudioServer::SetVoiceVolume(float volume)
391 {
392 int32_t callingUid = IPCSkeleton::GetCallingUid();
393 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
394 AUDIO_ERR_LOG("SetVoiceVolume refused for %{public}d", callingUid);
395 return ERR_NOT_SUPPORTED;
396 }
397 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("primary", "");
398
399 if (audioRendererSinkInstance == nullptr) {
400 AUDIO_WARNING_LOG("Renderer is null.");
401 } else {
402 return audioRendererSinkInstance->SetVoiceVolume(volume);
403 }
404 return ERROR;
405 }
406
SetAudioScene(AudioScene audioScene,DeviceType activeDevice)407 int32_t AudioServer::SetAudioScene(AudioScene audioScene, DeviceType activeDevice)
408 {
409 int32_t callingUid = IPCSkeleton::GetCallingUid();
410 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
411 AUDIO_ERR_LOG("UpdateActiveDeviceRoute refused for %{public}d", callingUid);
412 return ERR_NOT_SUPPORTED;
413 }
414 int32_t id = HiviewDFX::XCollie::GetInstance().SetTimer("AudioServer::SetAudioScene",
415 TIME_OUT_SECONDS, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
416 AudioCapturerSource *audioCapturerSourceInstance = AudioCapturerSource::GetInstance();
417 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("primary", "");
418
419 if (audioCapturerSourceInstance == nullptr || !audioCapturerSourceInstance->IsInited()) {
420 AUDIO_WARNING_LOG("Capturer is not initialized.");
421 } else {
422 audioCapturerSourceInstance->SetAudioScene(audioScene, activeDevice);
423 }
424
425 if (audioRendererSinkInstance == nullptr || !audioRendererSinkInstance->IsInited()) {
426 AUDIO_WARNING_LOG("Renderer is not initialized.");
427 } else {
428 audioRendererSinkInstance->SetAudioScene(audioScene, activeDevice);
429 }
430
431 audioScene_ = audioScene;
432 HiviewDFX::XCollie::GetInstance().CancelTimer(id);
433 return SUCCESS;
434 }
435
UpdateActiveDeviceRoute(DeviceType type,DeviceFlag flag)436 int32_t AudioServer::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag)
437 {
438 int32_t callingUid = IPCSkeleton::GetCallingUid();
439 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
440 AUDIO_ERR_LOG("UpdateActiveDeviceRoute refused for %{public}d", callingUid);
441 return ERR_NOT_SUPPORTED;
442 }
443 AUDIO_INFO_LOG("UpdateActiveDeviceRoute deviceType: %{public}d, flag: %{public}d", type, flag);
444 AudioCapturerSource *audioCapturerSourceInstance = AudioCapturerSource::GetInstance();
445 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("primary", "");
446
447 if (audioCapturerSourceInstance == nullptr || audioRendererSinkInstance == nullptr) {
448 AUDIO_ERR_LOG("UpdateActiveDeviceRoute null instance!");
449 return ERR_INVALID_PARAM;
450 }
451
452 switch (flag) {
453 case DeviceFlag::INPUT_DEVICES_FLAG: {
454 if (audioScene_ != AUDIO_SCENE_DEFAULT) {
455 audioCapturerSourceInstance->SetAudioScene(audioScene_, type);
456 } else {
457 audioCapturerSourceInstance->SetInputRoute(type);
458 }
459 break;
460 }
461 case DeviceFlag::OUTPUT_DEVICES_FLAG: {
462 if (audioScene_ != AUDIO_SCENE_DEFAULT) {
463 audioRendererSinkInstance->SetAudioScene(audioScene_, type);
464 } else {
465 audioRendererSinkInstance->SetOutputRoute(type);
466 }
467 break;
468 }
469 case DeviceFlag::ALL_DEVICES_FLAG: {
470 if (audioScene_ != AUDIO_SCENE_DEFAULT) {
471 SetAudioScene(audioScene_, type);
472 } else {
473 audioCapturerSourceInstance->SetInputRoute(type);
474 audioRendererSinkInstance->SetOutputRoute(type);
475 }
476 break;
477 }
478 default:
479 break;
480 }
481 if (flag == ALL_DEVICES_FLAG || flag == OUTPUT_DEVICES_FLAG) {
482 PolicyHandler::GetInstance().SetActiveOutputDevice(type);
483 }
484
485 return SUCCESS;
486 }
487
SetAudioMonoState(bool audioMono)488 void AudioServer::SetAudioMonoState(bool audioMono)
489 {
490 AUDIO_INFO_LOG("SetAudioMonoState: audioMono = %{public}s", audioMono? "true": "false");
491 int32_t callingUid = IPCSkeleton::GetCallingUid();
492 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
493 AUDIO_ERR_LOG("NotifyDeviceInfo refused for %{public}d", callingUid);
494 return;
495 }
496 // Set mono for audio_renderer_sink (primary)
497 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("primary", "");
498 if (audioRendererSinkInstance != nullptr) {
499 audioRendererSinkInstance->SetAudioMonoState(audioMono);
500 } else {
501 AUDIO_ERR_LOG("AudioServer::SetAudioBalanceValue: primary = null");
502 }
503
504 // Set mono for bluetooth_renderer_sink (a2dp)
505 IAudioRendererSink *a2dpIAudioRendererSink = IAudioRendererSink::GetInstance("a2dp", "");
506 if (a2dpIAudioRendererSink != nullptr) {
507 a2dpIAudioRendererSink->SetAudioMonoState(audioMono);
508 } else {
509 AUDIO_ERR_LOG("AudioServer::SetAudioBalanceValue: a2dp = null");
510 }
511 }
512
SetAudioBalanceValue(float audioBalance)513 void AudioServer::SetAudioBalanceValue(float audioBalance)
514 {
515 int32_t callingUid = IPCSkeleton::GetCallingUid();
516 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
517 AUDIO_ERR_LOG("NotifyDeviceInfo refused for %{public}d", callingUid);
518 return;
519 }
520 if (audioBalance < -1.0f || audioBalance > 1.0f) {
521 AUDIO_ERR_LOG("AudioServer:: audioBalance value %{public}f is out of range [-1.0, 1.0]", audioBalance);
522 return;
523 }
524 AUDIO_INFO_LOG("SetAudioBalanceValue: audioBalance = %{public}f", audioBalance);
525
526 // Set balance for audio_renderer_sink (primary)
527 IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance("primary", "");
528 if (audioRendererSinkInstance != nullptr) {
529 audioRendererSinkInstance->SetAudioBalanceValue(audioBalance);
530 } else {
531 AUDIO_ERR_LOG("AudioServer::SetAudioBalanceValue: primary = null");
532 }
533
534 // Set balance for bluetooth_renderer_sink (a2dp)
535 IAudioRendererSink *a2dpIAudioRendererSink = IAudioRendererSink::GetInstance("a2dp", "");
536 if (a2dpIAudioRendererSink != nullptr) {
537 a2dpIAudioRendererSink->SetAudioBalanceValue(audioBalance);
538 } else {
539 AUDIO_ERR_LOG("AudioServer::SetAudioBalanceValue: a2dp = null");
540 }
541 }
542
NotifyDeviceInfo(std::string networkId,bool connected)543 void AudioServer::NotifyDeviceInfo(std::string networkId, bool connected)
544 {
545 int32_t callingUid = IPCSkeleton::GetCallingUid();
546 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
547 AUDIO_ERR_LOG("NotifyDeviceInfo refused for %{public}d", callingUid);
548 return ;
549 }
550 AUDIO_INFO_LOG("notify device info: networkId(%{public}s), connected(%{public}d)", networkId.c_str(), connected);
551 IAudioRendererSink* audioRendererSinkInstance = IAudioRendererSink::GetInstance("remote", networkId.c_str());
552 if (audioRendererSinkInstance != nullptr && connected) {
553 audioRendererSinkInstance->RegisterParameterCallback(this);
554 }
555 }
556
IsParamEnabled(std::string key,bool & isEnabled)557 inline bool IsParamEnabled(std::string key, bool &isEnabled)
558 {
559 int32_t policyFlag = 0;
560 if (GetSysPara(key.c_str(), policyFlag) && policyFlag == 1) {
561 isEnabled = true;
562 return true;
563 }
564 isEnabled = false;
565 return false;
566 }
567
RegiestPolicyProvider(const sptr<IRemoteObject> & object)568 int32_t AudioServer::RegiestPolicyProvider(const sptr<IRemoteObject> &object)
569 {
570 int32_t callingUid = IPCSkeleton::GetCallingUid();
571 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
572 AUDIO_ERR_LOG("RegiestPolicyProvider refused for %{public}d", callingUid);
573 return ERR_NOT_SUPPORTED;
574 }
575 sptr<IPolicyProviderIpc> policyProvider = iface_cast<IPolicyProviderIpc>(object);
576 CHECK_AND_RETURN_RET_LOG(policyProvider != nullptr, ERR_INVALID_PARAM,
577 "AudioServer: policyProvider obj cast failed");
578 bool ret = PolicyHandler::GetInstance().ConfigPolicyProvider(policyProvider);
579 if (!ret) {
580 AUDIO_ERR_LOG("ConfigPolicyProvider failed!");
581 return ERR_OPERATION_FAILED;
582 }
583 return SUCCESS;
584 }
585
CreateAudioProcess(const AudioProcessConfig & config)586 sptr<IRemoteObject> AudioServer::CreateAudioProcess(const AudioProcessConfig &config)
587 {
588 if (!IsParamEnabled("persist.multimedia.audio.mmap.enable", isGetProcessEnabled_)) {
589 AUDIO_ERR_LOG("AudioServer::CreateAudioProcess is not enabled!");
590 return nullptr;
591 }
592
593 // client pid uid check.
594 int32_t callerUid = IPCSkeleton::GetCallingUid();
595 int32_t callerPid = IPCSkeleton::GetCallingPid();
596 AUDIO_DEBUG_LOG("Create process for uid:%{public}d pid:%{public}d", callerUid, callerPid);
597
598 AudioProcessConfig resetConfig(config);
599 if (callerUid == MEDIA_SERVICE_UID) {
600 AUDIO_INFO_LOG("Create process for media service.");
601 } else if (resetConfig.appInfo.appPid != callerPid || resetConfig.appInfo.appUid != callerUid ||
602 resetConfig.appInfo.appTokenId != IPCSkeleton::GetCallingTokenID()) {
603 AUDIO_INFO_LOG("Use true client appInfo instead.");
604 resetConfig.appInfo.appPid = callerPid;
605 resetConfig.appInfo.appUid = callerUid;
606 resetConfig.appInfo.appTokenId = IPCSkeleton::GetCallingTokenID();
607 }
608
609 // check MICROPHONE_PERMISSION
610 if (config.audioMode == AUDIO_MODE_RECORD &&
611 !VerifyClientPermission(MICROPHONE_PERMISSION, resetConfig.appInfo.appTokenId)) {
612 AUDIO_ERR_LOG("AudioServer::CreateAudioProcess for record failed:No permission.");
613 return nullptr;
614 }
615
616 sptr<IAudioProcess> process = AudioService::GetInstance()->GetAudioProcess(resetConfig);
617 CHECK_AND_RETURN_RET_LOG(process != nullptr, nullptr, "GetAudioProcess failed.");
618 sptr<IRemoteObject> remoteObject= process->AsObject();
619 return remoteObject;
620 }
621
CheckRemoteDeviceState(std::string networkId,DeviceRole deviceRole,bool isStartDevice)622 int32_t AudioServer::CheckRemoteDeviceState(std::string networkId, DeviceRole deviceRole, bool isStartDevice)
623 {
624 AUDIO_INFO_LOG("CheckRemoteDeviceState: device[%{public}s] deviceRole[%{public}d] isStartDevice[%{public}s]",
625 networkId.c_str(), static_cast<int32_t>(deviceRole), (isStartDevice ? "true" : "false"));
626
627 int32_t callingUid = IPCSkeleton::GetCallingUid();
628 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
629 AUDIO_ERR_LOG("CheckRemoteDeviceState refused for %{public}d", callingUid);
630 return ERR_NOT_SUPPORTED;
631 }
632 if (!isStartDevice) {
633 return SUCCESS;
634 }
635
636 int32_t ret = SUCCESS;
637 switch (deviceRole) {
638 case OUTPUT_DEVICE:
639 {
640 IAudioRendererSink* rendererInstance = IAudioRendererSink::GetInstance("remote", networkId.c_str());
641 if (rendererInstance == nullptr || !rendererInstance->IsInited()) {
642 AUDIO_ERR_LOG("Remote renderer[%{public}s] is uninit.", networkId.c_str());
643 return ERR_ILLEGAL_STATE;
644 }
645 ret = rendererInstance->Start();
646 break;
647 }
648 case INPUT_DEVICE:
649 {
650 IAudioCapturerSource *capturerInstance = IAudioCapturerSource::GetInstance("remote", networkId.c_str());
651 if (capturerInstance == nullptr || !capturerInstance->IsInited()) {
652 AUDIO_ERR_LOG("Remote capturer[%{public}s] is uninit.", networkId.c_str());
653 return ERR_ILLEGAL_STATE;
654 }
655 ret = capturerInstance->Start();
656 break;
657 }
658 default:
659 AUDIO_ERR_LOG("Remote device role %{public}d is not supported.", deviceRole);
660 return ERR_NOT_SUPPORTED;
661 }
662 if (ret != SUCCESS) {
663 AUDIO_ERR_LOG("Check remote device[%{public}s] fail, ret %{public}d.", networkId.c_str(), ret);
664 }
665 return ret;
666 }
667
OnAudioParameterChange(std::string netWorkId,const AudioParamKey key,const std::string & condition,const std::string & value)668 void AudioServer::OnAudioParameterChange(std::string netWorkId, const AudioParamKey key, const std::string& condition,
669 const std::string& value)
670 {
671 std::lock_guard<std::mutex> lockSet(setParameterCallbackMutex_);
672 AUDIO_INFO_LOG("OnAudioParameterChange Callback from networkId: %s", netWorkId.c_str());
673
674 if (audioParameterCallback_ != nullptr) {
675 audioParameterCallback_->OnAudioParameterChange(netWorkId, key, condition, value);
676 }
677 }
678
OnWakeupClose()679 void AudioServer::OnWakeupClose()
680 {
681 AUDIO_INFO_LOG("OnWakeupClose Callback start");
682 std::shared_ptr<WakeUpSourceCallback> callback = nullptr;
683 {
684 std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
685 if (wakeupCallback_ == nullptr) {
686 AUDIO_ERR_LOG("OnWakeupClose callback is nullptr.");
687 return;
688 } else {
689 callback = wakeupCallback_;
690 }
691 }
692 callback->OnWakeupClose();
693 }
694
OnCapturerState(bool isActive)695 void AudioServer::OnCapturerState(bool isActive)
696 {
697 AUDIO_INFO_LOG("OnCapturerState Callback start");
698 std::shared_ptr<WakeUpSourceCallback> callback = nullptr;
699 {
700 std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
701 if (wakeupCallback_ == nullptr) {
702 AUDIO_ERR_LOG("OnCapturerState callback is nullptr.");
703 return;
704 } else {
705 callback = wakeupCallback_;
706 }
707 }
708 callback->OnCapturerState(isActive);
709 }
710
SetParameterCallback(const sptr<IRemoteObject> & object)711 int32_t AudioServer::SetParameterCallback(const sptr<IRemoteObject>& object)
712 {
713 int32_t callingUid = IPCSkeleton::GetCallingUid();
714 if (callingUid != audioUid_ && callingUid != ROOT_UID) {
715 AUDIO_ERR_LOG("SetParameterCallback refused for %{public}d", callingUid);
716 return ERR_NOT_SUPPORTED;
717 }
718 std::lock_guard<std::mutex> lockSet(setParameterCallbackMutex_);
719 CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "AudioServer:set listener object is nullptr");
720
721 sptr<IStandardAudioServerManagerListener> listener = iface_cast<IStandardAudioServerManagerListener>(object);
722
723 CHECK_AND_RETURN_RET_LOG(listener != nullptr, ERR_INVALID_PARAM, "AudioServer: listener obj cast failed");
724
725 std::shared_ptr<AudioParameterCallback> callback = std::make_shared<AudioManagerListenerCallback>(listener);
726 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "AudioPolicyServer: failed to create cb obj");
727
728 audioParameterCallback_ = callback;
729 AUDIO_INFO_LOG("AudioServer:: SetParameterCallback done");
730
731 return SUCCESS;
732 }
733
SetWakeupSourceCallback(const sptr<IRemoteObject> & object)734 int32_t AudioServer::SetWakeupSourceCallback(const sptr<IRemoteObject>& object)
735 {
736 int32_t callingUid = IPCSkeleton::GetCallingUid();
737 if (callingUid != INTELL_VOICE_SERVICR_UID) {
738 AUDIO_ERR_LOG("SetWakeupSourceCallback refused for %{public}d", callingUid);
739 return false;
740 }
741
742 CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM,
743 "SetWakeupCloseCallback set listener object is nullptr");
744
745 sptr<IStandardAudioServerManagerListener> listener = iface_cast<IStandardAudioServerManagerListener>(object);
746
747 CHECK_AND_RETURN_RET_LOG(listener != nullptr, ERR_INVALID_PARAM,
748 "SetWakeupCloseCallback listener obj cast failed");
749
750 std::shared_ptr<WakeUpSourceCallback> wakeupCallback = std::make_shared<AudioManagerListenerCallback>(listener);
751 CHECK_AND_RETURN_RET_LOG(wakeupCallback != nullptr, ERR_INVALID_PARAM,
752 "SetWakeupCloseCallback failed to create cb obj");
753
754 {
755 std::lock_guard<std::mutex> lockSet(setWakeupCloseCallbackMutex_);
756 wakeupCallback_ = wakeupCallback;
757 }
758
759 AUDIO_INFO_LOG("SetWakeupCloseCallback done");
760
761 return SUCCESS;
762 }
763
VerifyClientPermission(const std::string & permissionName,Security::AccessToken::AccessTokenID tokenId)764 bool AudioServer::VerifyClientPermission(const std::string &permissionName,
765 Security::AccessToken::AccessTokenID tokenId)
766 {
767 auto callerUid = IPCSkeleton::GetCallingUid();
768 AUDIO_INFO_LOG("AudioServer: ==[%{public}s] [uid:%{public}d]==", permissionName.c_str(), callerUid);
769
770 // Root users should be whitelisted
771 if (callerUid == ROOT_UID) {
772 AUDIO_INFO_LOG("Root user. Permission GRANTED!!!");
773 return true;
774 }
775 Security::AccessToken::AccessTokenID clientTokenId = tokenId;
776 if (clientTokenId == Security::AccessToken::INVALID_TOKENID) {
777 clientTokenId = IPCSkeleton::GetCallingTokenID();
778 }
779 int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(clientTokenId, permissionName);
780 if (res != Security::AccessToken::PermissionState::PERMISSION_GRANTED) {
781 AUDIO_ERR_LOG("Permission denied [tid:%{public}d]", clientTokenId);
782 return false;
783 }
784
785 return true;
786 }
787
GetDevices(DeviceFlag deviceFlag)788 std::vector<sptr<AudioDeviceDescriptor>> AudioServer::GetDevices(DeviceFlag deviceFlag)
789 {
790 std::vector<sptr<AudioDeviceDescriptor>> audioDeviceDescriptor = {};
791 return audioDeviceDescriptor;
792 }
793
AudioServerDied(pid_t pid)794 void AudioServer::AudioServerDied(pid_t pid)
795 {
796 AUDIO_INFO_LOG("Policy server died: restart pulse audio");
797 _Exit(0);
798 }
799
RegisterPolicyServerDeathRecipient()800 void AudioServer::RegisterPolicyServerDeathRecipient()
801 {
802 AUDIO_INFO_LOG("Register policy server death recipient");
803 pid_t pid = IPCSkeleton::GetCallingPid();
804 sptr<AudioServerDeathRecipient> deathRecipient_ = new(std::nothrow) AudioServerDeathRecipient(pid);
805 if (deathRecipient_ != nullptr) {
806 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
807 CHECK_AND_RETURN_LOG(samgr != nullptr, "Failed to obtain system ability manager");
808 sptr<IRemoteObject> object = samgr->GetSystemAbility(OHOS::AUDIO_POLICY_SERVICE_ID);
809 CHECK_AND_RETURN_LOG(object != nullptr, "Policy service unavailable");
810 deathRecipient_->SetNotifyCb(std::bind(&AudioServer::AudioServerDied, this, std::placeholders::_1));
811 bool result = object->AddDeathRecipient(deathRecipient_);
812 if (!result) {
813 AUDIO_ERR_LOG("Failed to add deathRecipient");
814 }
815 }
816 }
817
RequestThreadPriority(uint32_t tid,string bundleName)818 void AudioServer::RequestThreadPriority(uint32_t tid, string bundleName)
819 {
820 AUDIO_INFO_LOG("RequestThreadPriority tid: %{public}u", tid);
821
822 uint32_t pid = IPCSkeleton::GetCallingPid();
823 ScheduleReportData(pid, tid, bundleName.c_str());
824 }
825
CreatePlaybackCapturerManager()826 bool AudioServer::CreatePlaybackCapturerManager()
827 {
828 int32_t audio_policy_server_id = 1041;
829 if (IPCSkeleton::GetCallingUid() != audio_policy_server_id) {
830 return false;
831 }
832 std::vector<int32_t> usage;
833 PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
834 playbackCapturerMgr->SetSupportStreamUsage(usage);
835 return true;
836 }
837
SetSupportStreamUsage(std::vector<int32_t> usage)838 int32_t AudioServer::SetSupportStreamUsage(std::vector<int32_t> usage)
839 {
840 AUDIO_INFO_LOG("SetSupportStreamUsage with usage num:%{public}zu", usage.size());
841
842 int32_t audio_policy_server_id = 1041;
843 if (IPCSkeleton::GetCallingUid() != audio_policy_server_id) {
844 return ERR_OPERATION_FAILED;
845 }
846 PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
847 playbackCapturerMgr->SetSupportStreamUsage(usage);
848 return SUCCESS;
849 }
850
RegisterAudioCapturerSourceCallback()851 void AudioServer::RegisterAudioCapturerSourceCallback()
852 {
853 IAudioCapturerSource* audioCapturerSourceWakeupInstance =
854 IAudioCapturerSource::GetInstance("primary", nullptr, SOURCE_TYPE_WAKEUP);
855 if (audioCapturerSourceWakeupInstance != nullptr) {
856 audioCapturerSourceWakeupInstance->RegisterWakeupCloseCallback(this);
857 }
858
859 IAudioCapturerSource* audioCapturerSourceInstance =
860 IAudioCapturerSource::GetInstance("primary", nullptr, SOURCE_TYPE_MIC);
861 if (audioCapturerSourceInstance != nullptr) {
862 audioCapturerSourceInstance->RegisterAudioCapturerSourceCallback(this);
863 }
864 }
865
SetCaptureSilentState(bool state)866 int32_t AudioServer::SetCaptureSilentState(bool state)
867 {
868 int32_t audio_policy_server_id = 1041;
869 if (IPCSkeleton::GetCallingUid() != audio_policy_server_id) {
870 return ERR_OPERATION_FAILED;
871 }
872
873 PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
874 playbackCapturerMgr->SetCaptureSilentState(state);
875 return SUCCESS;
876 }
877
878 } // namespace AudioStandard
879 } // namespace OHOS
880