• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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