1 /*
2 * Copyright (c) 2022 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 <sstream>
17 #include <iomanip>
18
19 #include "accesstoken_kit.h"
20 #include "app_manager_adapter.h"
21 #include "audio_adapter.h"
22 #include "avsession_errors.h"
23 #include "avsession_log.h"
24 #include "avsession_info.h"
25 #include "device_manager.h"
26 #include "remote_session_capability_set.h"
27 #include "remote_session_source_proxy.h"
28 #include "remote_session_sink_proxy.h"
29 #include "file_ex.h"
30 #include "iservice_registry.h"
31 #include "key_event_adapter.h"
32 #include "nlohmann/json.hpp"
33 #include "permission_checker.h"
34 #include "system_ability_definition.h"
35 #include "session_stack.h"
36 #include "avsession_trace.h"
37 #include "hash_calculator.h"
38 #include "avsession_dumper.h"
39 #include "command_send_limit.h"
40 #include "avsession_sysevent.h"
41 #include "json_utils.h"
42 #include "avsession_utils.h"
43 #include "avcontrol_command.h"
44 #include "avsession_event_handler.h"
45 #include "avsession_service.h"
46
47 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
48 #include <malloc.h>
49 #endif
50
51 using namespace nlohmann;
52 using namespace OHOS::AudioStandard;
53 namespace OHOS::AVSession {
54 REGISTER_SYSTEM_ABILITY_BY_ID(AVSessionService, AVSESSION_SERVICE_ID, true);
55
AVSessionService(int32_t systemAbilityId,bool runOnCreate)56 AVSessionService::AVSessionService(int32_t systemAbilityId, bool runOnCreate)
57 : SystemAbility(systemAbilityId, runOnCreate)
58 {
59 SLOGD("construct");
60 }
61
~AVSessionService()62 AVSessionService::~AVSessionService()
63 {
64 std::string cachePath(AVSessionUtils::GetCachePathName());
65 AVSessionUtils::DeleteCacheFiles(cachePath);
66 SLOGD("destroy");
67 }
68
OnStart()69 void AVSessionService::OnStart()
70 {
71 std::string cachePath(AVSessionUtils::GetCachePathName());
72 AVSessionUtils::DeleteCacheFiles(cachePath);
73 CHECK_AND_RETURN_LOG(Publish(this), "publish avsession service failed");
74 dumpHelper_ = std::make_unique<AVSessionDumper>();
75 CHECK_AND_RETURN_LOG(dumpHelper_ != nullptr, "no memory");
76 CommandSendLimit::GetInstance().StartTimer();
77
78 #ifdef ENABLE_BACKGROUND_AUDIO_CONTROL
79 backgroundAudioController_.Init();
80 AddInnerSessionListener(&backgroundAudioController_);
81 #endif
82 AddSystemAbilityListener(MULTIMODAL_INPUT_SERVICE_ID);
83 AddSystemAbilityListener(AUDIO_POLICY_SERVICE_ID);
84 AddSystemAbilityListener(APP_MGR_SERVICE_ID);
85 AddSystemAbilityListener(DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID);
86 HISYSEVENT_REGITER;
87 HISYSEVENT_BEHAVIOR("SESSION_SERVICE_START", "SERVICE_NAME", "AVSessionService",
88 "SERVICE_ID", AVSESSION_SERVICE_ID, "DETAILED_MSG", "avsession service start success");
89 }
90
OnDump()91 void AVSessionService::OnDump()
92 {
93 }
94
OnStop()95 void AVSessionService::OnStop()
96 {
97 CommandSendLimit::GetInstance().StopTimer();
98 }
99
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)100 void AVSessionService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
101 {
102 switch (systemAbilityId) {
103 case MULTIMODAL_INPUT_SERVICE_ID:
104 InitKeyEvent();
105 break;
106 case AUDIO_POLICY_SERVICE_ID:
107 InitAudio();
108 break;
109 case APP_MGR_SERVICE_ID:
110 InitAMS();
111 break;
112 case DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID:
113 InitDM();
114 break;
115 default:
116 SLOGE("undefined system ability %{public}d", systemAbilityId);
117 }
118 }
119
InitKeyEvent()120 void AVSessionService::InitKeyEvent()
121 {
122 SLOGI("enter");
123 std::vector<int32_t> keyCodes = {
124 MMI::KeyEvent::KEYCODE_MEDIA_PLAY_PAUSE,
125 MMI::KeyEvent::KEYCODE_MEDIA_STOP,
126 MMI::KeyEvent::KEYCODE_MEDIA_NEXT,
127 MMI::KeyEvent::KEYCODE_MEDIA_PREVIOUS,
128 MMI::KeyEvent::KEYCODE_MEDIA_REWIND,
129 MMI::KeyEvent::KEYCODE_MEDIA_FAST_FORWARD,
130 MMI::KeyEvent::KEYCODE_HEADSETHOOK,
131 };
132
133 KeyEventAdapter::GetInstance().SubscribeKeyEvent(
134 keyCodes, [this](const auto& keyEvent) { SendSystemAVKeyEvent(*keyEvent); });
135 }
136
UpdateTopSession(const sptr<AVSessionItem> & newTopSession)137 void AVSessionService::UpdateTopSession(const sptr<AVSessionItem>& newTopSession)
138 {
139 if (newTopSession == nullptr) {
140 std::lock_guard lockGuard(sessionAndControllerLock_);
141 if (topSession_ != nullptr) {
142 topSession_->SetTop(false);
143 }
144 topSession_ = nullptr;
145 SLOGI("set topSession to nullptr");
146 HISYSEVENT_BEHAVIOR("FOCUS_CHANGE", "DETAILED_MSG", "avsessionservice set topsession to nullptr");
147 return;
148 }
149
150 SLOGI("uid=%{public}d sessionId=%{public}s", newTopSession->GetUid(), newTopSession->GetSessionId().c_str());
151 AVSessionDescriptor descriptor;
152 {
153 std::lock_guard lockGuard(sessionAndControllerLock_);
154 if (topSession_ != nullptr) {
155 topSession_->SetTop(false);
156 HISYSEVENT_BEHAVIOR("FOCUS_CHANGE",
157 "OLD_BUNDLE_NAME", topSession_->GetDescriptor().elementName_.GetBundleName(),
158 "OLD_MODULE_NAME", topSession_->GetDescriptor().elementName_.GetModuleName(),
159 "OLD_ABILITY_NAME", topSession_->GetAbilityName(), "OLD_SESSION_PID", topSession_->GetPid(),
160 "OLD_SESSION_UID", topSession_->GetUid(), "OLD_SESSION_ID", topSession_->GetSessionId(),
161 "OLD_SESSION_TAG", topSession_->GetDescriptor().sessionTag_,
162 "OLD_SESSION_TYPE", topSession_->GetDescriptor().sessionType_,
163 "BUNDLE_NAME", newTopSession->GetDescriptor().elementName_.GetBundleName(),
164 "MODULE_NAME", newTopSession->GetDescriptor().elementName_.GetModuleName(),
165 "ABILITY_NAME", newTopSession->GetAbilityName(), "SESSION_PID", newTopSession->GetPid(),
166 "SESSION_UID", newTopSession->GetUid(), "SESSION_ID", newTopSession->GetSessionId(),
167 "SESSION_TAG", newTopSession->GetDescriptor().sessionTag_,
168 "SESSION_TYPE", newTopSession->GetDescriptor().sessionType_,
169 "DETAILED_MSG", "avsessionservice handlefocussession, updatetopsession");
170 }
171 topSession_ = newTopSession;
172 topSession_->SetTop(true);
173 descriptor = topSession_->GetDescriptor();
174 }
175 NotifyTopSessionChanged(descriptor);
176 }
177
HandleFocusSession(const FocusSessionStrategy::FocusSessionChangeInfo & info)178 void AVSessionService::HandleFocusSession(const FocusSessionStrategy::FocusSessionChangeInfo& info)
179 {
180 std::lock_guard lockGuard(sessionAndControllerLock_);
181 if (topSession_ && topSession_->GetUid() == info.uid) {
182 SLOGI("same session");
183 return;
184 }
185 for (const auto& session : GetContainer().GetAllSessions()) {
186 if (session->GetUid() == info.uid) {
187 UpdateTopSession(session);
188 return;
189 }
190 }
191 }
192
SelectFocusSession(const FocusSessionStrategy::FocusSessionChangeInfo & info)193 bool AVSessionService::SelectFocusSession(const FocusSessionStrategy::FocusSessionChangeInfo& info)
194 {
195 for (const auto& session : GetContainer().GetAllSessions()) {
196 if (session->GetUid() == info.uid) {
197 SLOGI("true");
198 return true;
199 }
200 }
201 SLOGI("false");
202 return false;
203 }
204
InitAudio()205 void AVSessionService::InitAudio()
206 {
207 SLOGI("enter");
208 AudioAdapter::GetInstance().Init();
209 focusSessionStrategy_.Init();
210 focusSessionStrategy_.RegisterFocusSessionChangeCallback([this] (const auto& info) {
211 HandleFocusSession(info);
212 });
213 focusSessionStrategy_.RegisterFocusSessionSelector([this] (const auto& info) {
214 return SelectFocusSession(info);
215 });
216 AudioAdapter::GetInstance().AddStreamRendererStateListener([this] (const AudioRendererChangeInfos& infos) {
217 OutputDeviceChangeListener(infos);
218 });
219 }
220
SelectSessionByUid(const AudioRendererChangeInfo & info)221 sptr <AVSessionItem> AVSessionService::SelectSessionByUid(const AudioRendererChangeInfo& info)
222 {
223 for (const auto& session : GetContainer().GetAllSessions()) {
224 if (session->GetUid() == info.clientUID) {
225 return session;
226 }
227 }
228 SLOGI("has no session");
229 return nullptr;
230 }
231
OutputDeviceChangeListener(const AudioRendererChangeInfos & infos)232 void AVSessionService::OutputDeviceChangeListener(const AudioRendererChangeInfos& infos)
233 {
234 for (const auto& info : infos) {
235 SLOGI("clientUID is %{public}d, rendererState is %{public}d, deviceId is %{public}d", info->clientUID,
236 static_cast<int32_t>(info->rendererState), info->outputDeviceInfo.deviceId);
237 }
238 }
239
InitAMS()240 void AVSessionService::InitAMS()
241 {
242 SLOGI("enter");
243 AppManagerAdapter::GetInstance().Init();
244 }
245
InitDM()246 void AVSessionService::InitDM()
247 {
248 SLOGI("enter");
249 auto callback = std::make_shared<AVSessionInitDMCallback>();
250 CHECK_AND_RETURN_LOG(callback != nullptr, "no memory");
251 int32_t ret = OHOS::DistributedHardware::DeviceManager::GetInstance().InitDeviceManager("av_session", callback);
252 CHECK_AND_RETURN_LOG(ret == 0, "InitDeviceManager error ret is %{public}d", ret);
253 }
254
GetContainer()255 SessionContainer& AVSessionService::GetContainer()
256 {
257 static SessionStack sessionStack;
258 return sessionStack;
259 }
260
AllocSessionId()261 std::string AVSessionService::AllocSessionId()
262 {
263 auto curNum = sessionSeqNum_++;
264 std::string id = std::to_string(GetCallingPid()) + "-" + std::to_string(GetCallingUid()) + "-" +
265 std::to_string(curNum);
266 SLOGI("%{public}s", id.c_str());
267
268 HashCalculator hashCalculator;
269 CHECK_AND_RETURN_RET_LOG(hashCalculator.Init() == AVSESSION_SUCCESS, "", "hash init failed");
270 CHECK_AND_RETURN_RET_LOG(hashCalculator.Update(std::vector<uint8_t>(id.begin(), id.end())) == AVSESSION_SUCCESS,
271 "", "hash update failed");
272 std::vector<uint8_t> hash;
273 CHECK_AND_RETURN_RET_LOG(hashCalculator.GetResult(hash) == AVSESSION_SUCCESS, "", "hash get result failed");
274
275 std::stringstream stream;
276 for (const auto byte : hash) {
277 stream << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(byte);
278 }
279 return stream.str();
280 }
281
AbilityHasSession(pid_t pid,const std::string & abilityName)282 bool AVSessionService::AbilityHasSession(pid_t pid, const std::string& abilityName)
283 {
284 std::lock_guard lockGuard(sessionAndControllerLock_);
285 return GetContainer().GetSession(pid, abilityName) != nullptr;
286 }
287
GetPresentController(pid_t pid,const std::string & sessionId)288 sptr<AVControllerItem> AVSessionService::GetPresentController(pid_t pid, const std::string& sessionId)
289 {
290 std::lock_guard lockGuard(sessionAndControllerLock_);
291 auto it = controllers_.find(pid);
292 if (it != controllers_.end()) {
293 for (const auto& controller: it->second) {
294 if (controller->HasSession(sessionId)) {
295 return controller;
296 }
297 }
298 }
299 SLOGI("not found");
300 return nullptr;
301 }
302
NotifySessionCreate(const AVSessionDescriptor & descriptor)303 void AVSessionService::NotifySessionCreate(const AVSessionDescriptor& descriptor)
304 {
305 std::lock_guard lockGuard(sessionListenersLock_);
306 for (const auto& listener : innerSessionListeners_) {
307 listener->OnSessionCreate(descriptor);
308 }
309 for (const auto& [pid, listener] : sessionListeners_) {
310 AVSESSION_TRACE_SYNC_START("AVSessionService::OnSessionCreate");
311 listener->OnSessionCreate(descriptor);
312 }
313 }
314
NotifySessionRelease(const AVSessionDescriptor & descriptor)315 void AVSessionService::NotifySessionRelease(const AVSessionDescriptor& descriptor)
316 {
317 std::lock_guard lockGuard(sessionListenersLock_);
318 for (const auto& listener : innerSessionListeners_) {
319 listener->OnSessionRelease(descriptor);
320 }
321 for (const auto& [pid, listener] : sessionListeners_) {
322 listener->OnSessionRelease(descriptor);
323 }
324 }
325
NotifyTopSessionChanged(const AVSessionDescriptor & descriptor)326 void AVSessionService::NotifyTopSessionChanged(const AVSessionDescriptor& descriptor)
327 {
328 std::lock_guard lockGuard(sessionListenersLock_);
329 for (const auto& listener : innerSessionListeners_) {
330 listener->OnTopSessionChange(descriptor);
331 }
332 for (const auto& [pid, listener] : sessionListeners_) {
333 AVSESSION_TRACE_SYNC_START("AVSessionService::OnTopSessionChange");
334 listener->OnTopSessionChange(descriptor);
335 }
336 }
337
CreateNewSession(const std::string & tag,int32_t type,bool thirdPartyApp,const AppExecFwk::ElementName & elementName)338 sptr<AVSessionItem> AVSessionService::CreateNewSession(const std::string& tag, int32_t type, bool thirdPartyApp,
339 const AppExecFwk::ElementName& elementName)
340 {
341 SLOGI("%{public}s %{public}d %{public}s %{public}s", tag.c_str(), type,
342 elementName.GetBundleName().c_str(), elementName.GetAbilityName().c_str());
343 AVSessionDescriptor descriptor;
344 descriptor.sessionId_ = AllocSessionId();
345 if (descriptor.sessionId_.empty()) {
346 SLOGE("alloc session id failed");
347 return nullptr;
348 }
349 descriptor.sessionTag_ = tag;
350 descriptor.sessionType_ = type;
351 descriptor.elementName_ = elementName;
352 descriptor.isThirdPartyApp_ = thirdPartyApp;
353
354 sptr<AVSessionItem> result = new(std::nothrow) AVSessionItem(descriptor);
355 if (result == nullptr) {
356 return nullptr;
357 }
358 result->SetPid(GetCallingPid());
359 result->SetUid(GetCallingUid());
360 result->SetServiceCallbackForRelease([this](AVSessionItem& session) { HandleSessionRelease(session); });
361 SLOGI("success sessionId=%{public}s", result->GetSessionId().c_str());
362 {
363 std::lock_guard lockGuard(sessionAndControllerLock_);
364 if (topSession_ == nullptr) {
365 UpdateTopSession(result);
366 }
367 }
368
369 OutputDeviceInfo deviceInfo {};
370 deviceInfo.isRemote_ = false;
371 deviceInfo.deviceIds_.push_back("0");
372 deviceInfo.deviceNames_.push_back("LocalDevice");
373 result->SetOutputDevice(deviceInfo);
374
375 return result;
376 }
377
CreateSessionInner(const std::string & tag,int32_t type,bool thirdPartyApp,const AppExecFwk::ElementName & elementName)378 sptr <AVSessionItem> AVSessionService::CreateSessionInner(const std::string& tag, int32_t type, bool thirdPartyApp,
379 const AppExecFwk::ElementName& elementName)
380 {
381 SLOGI("enter");
382 CHECK_AND_RETURN_RET_LOG(!tag.empty(), nullptr, "tag is empty");
383 CHECK_AND_RETURN_RET_LOG(type == AVSession::SESSION_TYPE_AUDIO || type == AVSession::SESSION_TYPE_VIDEO,
384 nullptr, "type is invalid");
385 CHECK_AND_RETURN_RET_LOG(!elementName.GetBundleName().empty() && !elementName.GetAbilityName().empty(),
386 nullptr, "element is invalid");
387 auto pid = GetCallingPid();
388 std::lock_guard lockGuard(sessionAndControllerLock_);
389 if (AbilityHasSession(pid, elementName.GetAbilityName())) {
390 SLOGI("process %{public}d %{public}s already has one session", pid, elementName.GetAbilityName().c_str());
391 return nullptr;
392 }
393
394 auto result = CreateNewSession(tag, type, thirdPartyApp, elementName);
395 if (result == nullptr) {
396 SLOGE("create new session failed");
397 dumpHelper_->SetErrorInfo(" AVSessionService::CreateSessionInner create new session failed");
398 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "CALLER_PID", pid, "TAG", tag, "TYPE", type, "BUNDLE_NAME",
399 elementName.GetBundleName(), "ERROR_MSG", "avsessionservice createsessioninner create new session failed");
400 return nullptr;
401 }
402 if (GetContainer().AddSession(pid, elementName.GetAbilityName(), result) != AVSESSION_SUCCESS) {
403 SLOGI("session num exceed max");
404 return nullptr;
405 }
406 HISYSEVENT_ADD_LIFE_CYCLE_INFO(elementName.GetBundleName(),
407 AppManagerAdapter::GetInstance().IsAppBackground(GetCallingUid()), type, true);
408
409 NotifySessionCreate(result->GetDescriptor());
410 SLOGI("success");
411 return result;
412 }
413
CreateSessionInner(const std::string & tag,int32_t type,const AppExecFwk::ElementName & elementName)414 sptr <IRemoteObject> AVSessionService::CreateSessionInner(const std::string& tag, int32_t type,
415 const AppExecFwk::ElementName& elementName)
416 {
417 auto session = CreateSessionInner(tag, type, !PermissionChecker::GetInstance().CheckSystemPermission(),
418 elementName);
419 CHECK_AND_RETURN_RET_LOG(session != nullptr, session, "session is nullptr");
420
421 {
422 std::lock_guard lockGuard1(abilityManagerLock_);
423 std::string bundleName = session->GetDescriptor().elementName_.GetBundleName();
424 std::string abilityName = session->GetDescriptor().elementName_.GetAbilityName();
425 auto it = abilityManager_.find(bundleName + abilityName);
426 if (it != abilityManager_.end()) {
427 it->second->StartAbilityByCallDone(session->GetDescriptor().sessionId_);
428 }
429 }
430
431 {
432 std::lock_guard lockGuard(isAllSessionCastLock_);
433 SLOGI("isAllSessionCast_ is %{public}d", isAllSessionCast_);
434 CHECK_AND_RETURN_RET_LOG(isAllSessionCast_, session, "no need to cast");
435 }
436 CHECK_AND_RETURN_RET_LOG(CastAudioForNewSession(session) == AVSESSION_SUCCESS, session, "cast new session error");
437 return session;
438 }
439
GetAllSessionDescriptors(std::vector<AVSessionDescriptor> & descriptors)440 int32_t AVSessionService::GetAllSessionDescriptors(std::vector<AVSessionDescriptor>& descriptors)
441 {
442 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
443 SLOGE("CheckSystemPermission failed");
444 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(), "CALLER_PID", GetCallingPid(),
445 "ERROR_MSG", "avsessionservice getallsessiondescriptors checksystempermission failed");
446 return ERR_NO_PERMISSION;
447 }
448
449 std::lock_guard lockGuard(sessionAndControllerLock_);
450 for (const auto& session: GetContainer().GetAllSessions()) {
451 descriptors.push_back(session->GetDescriptor());
452 }
453 SLOGI("size=%{public}d", static_cast<int32_t>(descriptors.size()));
454 return AVSESSION_SUCCESS;
455 }
456
GetSessionDescriptorsBySessionId(const std::string & sessionId,AVSessionDescriptor & descriptor)457 int32_t AVSessionService::GetSessionDescriptorsBySessionId(const std::string& sessionId,
458 AVSessionDescriptor& descriptor)
459 {
460 std::lock_guard lockGuard(sessionAndControllerLock_);
461 sptr<AVSessionItem> session = GetContainer().GetSessionById(sessionId);
462 CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_ERROR, "session not exist");
463
464 auto pid = GetCallingPid();
465 if (pid == session->GetPid()) {
466 descriptor = session->GetDescriptor();
467 return AVSESSION_SUCCESS;
468 }
469 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
470 SLOGE("CheckSystemPermission failed");
471 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(),
472 "CALLER_PID", pid, "SESSION_ID", sessionId,
473 "ERROR_MSG", "avsessionservice getsessiondescriptors by sessionid checksystempermission failed");
474 return ERR_NO_PERMISSION;
475 }
476 descriptor = session->GetDescriptor();
477 return AVSESSION_SUCCESS;
478 }
479
CreateNewControllerForSession(pid_t pid,sptr<AVSessionItem> & session)480 sptr<AVControllerItem> AVSessionService::CreateNewControllerForSession(pid_t pid, sptr<AVSessionItem>& session)
481 {
482 SLOGI("pid=%{public}d sessionId=%{public}s", pid, session->GetSessionId().c_str());
483 sptr<AVControllerItem> result = new(std::nothrow) AVControllerItem(pid, session);
484 if (result == nullptr) {
485 SLOGE("malloc controller failed");
486 return nullptr;
487 }
488 result->SetServiceCallbackForRelease([this](AVControllerItem& controller) { HandleControllerRelease(controller); });
489 session->AddController(pid, result);
490 return result;
491 }
492
GetSubNode(const nlohmann::json & node,const std::string & name)493 const nlohmann::json& AVSessionService::GetSubNode(const nlohmann::json& node, const std::string& name)
494 {
495 static const nlohmann::json jsonNull = nlohmann::json::value_t::null;
496 if (node.is_discarded() || node.is_null()) {
497 SLOGE("json node is invalid");
498 return jsonNull;
499 }
500
501 if (name.empty()) {
502 SLOGE("name is invalid");
503 return node;
504 }
505
506 auto it = node.find(name);
507 if (it == node.end()) {
508 SLOGE("%{public}s is not exist in json", name.c_str());
509 return jsonNull;
510 }
511 return *it;
512 }
513
StartDefaultAbilityByCall(std::string & sessionId)514 int32_t AVSessionService::StartDefaultAbilityByCall(std::string& sessionId)
515 {
516 std::string content;
517 if (!LoadStringFromFile(AVSESSION_FILE_DIR + ABILITY_FILE_NAME, content)) {
518 SLOGE("LoadStringFromFile failed, filename=%{public}s", ABILITY_FILE_NAME);
519 }
520 std::string bundleName = DEFAULT_BUNDLE_NAME;
521 std::string abilityName = DEFAULT_ABILITY_NAME;
522
523 nlohmann::json value = json::parse(content, nullptr, false);
524 CHECK_AND_RETURN_RET_LOG(!value.is_discarded() && !value.is_null(), AVSESSION_ERROR, "json object is null");
525 auto& node1 = GetSubNode(value, "bundleName");
526 auto& node2 = GetSubNode(value, "abilityName");
527 if (!node1.is_null() && !node2.is_null() && node1.is_string() && node2.is_string()) {
528 bundleName = node1;
529 abilityName = node2;
530 }
531
532 std::shared_ptr<AbilityManagerAdapter> ability = nullptr;
533 {
534 std::lock_guard lockGuard(abilityManagerLock_);
535 auto it = abilityManager_.find(bundleName + abilityName);
536 if (it != abilityManager_.end()) {
537 ability = it->second;
538 } else {
539 ability = std::make_shared<AbilityManagerAdapter>(bundleName, abilityName);
540 if (ability == nullptr) {
541 return ERR_NO_MEMORY;
542 }
543 abilityManager_[bundleName + abilityName] = ability;
544 }
545 }
546 int32_t ret = ability->StartAbilityByCall(sessionId);
547
548 std::lock_guard lockGuard(abilityManagerLock_);
549 if (ret != ERR_START_ABILITY_IS_RUNNING) {
550 abilityManager_.erase(bundleName + abilityName);
551 }
552 return ret;
553 }
554
CreateControllerInner(const std::string & sessionId,sptr<IRemoteObject> & object)555 int32_t AVSessionService::CreateControllerInner(const std::string& sessionId, sptr<IRemoteObject>& object)
556 {
557 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
558 SLOGE("CheckSystemPermission failed");
559 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(),
560 "CALLER_PID", GetCallingPid(), "SESSION_ID", sessionId,
561 "ERROR_MSG", "avsessionservice createcontrollerinner checksystempermission failed");
562 return ERR_NO_PERMISSION;
563 }
564 std::string sessionIdInner;
565 if (sessionId == "default") {
566 auto ret = StartDefaultAbilityByCall(sessionIdInner);
567 if (ret != AVSESSION_SUCCESS) {
568 SLOGE("StartDefaultAbilityByCall failed: %{public}d", ret);
569 return ret;
570 }
571 } else {
572 sessionIdInner = sessionId;
573 }
574 auto pid = GetCallingPid();
575 std::lock_guard lockGuard(sessionAndControllerLock_);
576 if (GetPresentController(pid, sessionIdInner) != nullptr) {
577 SLOGI("controller already exist");
578 return ERR_CONTROLLER_IS_EXIST;
579 }
580
581 auto session = GetContainer().GetSessionById(sessionIdInner);
582 if (session == nullptr) {
583 SLOGE("no session id %{public}s", sessionIdInner.c_str());
584 return ERR_SESSION_NOT_EXIST;
585 }
586
587 auto result = CreateNewControllerForSession(pid, session);
588 if (result == nullptr) {
589 SLOGE("create new controller failed");
590 return ERR_NO_MEMORY;
591 }
592
593 controllers_[pid].push_back(result);
594 object = result;
595 SLOGI("success");
596 return AVSESSION_SUCCESS;
597 }
598
AddSessionListener(pid_t pid,const sptr<ISessionListener> & listener)599 void AVSessionService::AddSessionListener(pid_t pid, const sptr<ISessionListener>& listener)
600 {
601 std::lock_guard lockGuard(sessionListenersLock_);
602 sessionListeners_[pid] = listener;
603 }
604
RemoveSessionListener(pid_t pid)605 void AVSessionService::RemoveSessionListener(pid_t pid)
606 {
607 std::lock_guard lockGuard(sessionListenersLock_);
608 sessionListeners_.erase(pid);
609 }
610
AddInnerSessionListener(SessionListener * listener)611 void AVSessionService::AddInnerSessionListener(SessionListener* listener)
612 {
613 std::lock_guard lockGuard(sessionListenersLock_);
614 innerSessionListeners_.push_back(listener);
615 }
616
RegisterSessionListener(const sptr<ISessionListener> & listener)617 int32_t AVSessionService::RegisterSessionListener(const sptr<ISessionListener>& listener)
618 {
619 SLOGI("enter");
620 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
621 SLOGE("CheckSystemPermission failed");
622 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(), "CALLER_PID", GetCallingPid(),
623 "ERROR_MSG", "avsessionservice registersessionlistener checksystempermission failed");
624 return ERR_NO_PERMISSION;
625 }
626 AddSessionListener(GetCallingPid(), listener);
627 return AVSESSION_SUCCESS;
628 }
629
HandleEventHandlerCallBack()630 void AVSessionService::HandleEventHandlerCallBack()
631 {
632 SLOGI("handle eventHandler callback");
633 AVControlCommand cmd;
634 if (pressCount_ >= THREE_CLICK && topSession_) {
635 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS);
636 topSession_->ExecuteControllerCommand(cmd);
637 } else if (pressCount_ == DOUBLE_CLICK && topSession_) {
638 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_NEXT);
639 topSession_->ExecuteControllerCommand(cmd);
640 } else if (pressCount_ == ONE_CLICK && topSession_) {
641 auto playbackState = topSession_->GetPlaybackState();
642 if (playbackState.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAYING) {
643 cmd.SetCommand(AVControlCommand::SESSION_CMD_PAUSE);
644 } else {
645 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY);
646 }
647 topSession_->ExecuteControllerCommand(cmd);
648 } else {
649 SLOGI("press invalid");
650 }
651 pressCount_ = 0;
652 isFirstPress_ = true;
653 }
654
SendSystemAVKeyEvent(const MMI::KeyEvent & keyEvent)655 int32_t AVSessionService::SendSystemAVKeyEvent(const MMI::KeyEvent& keyEvent)
656 {
657 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
658 SLOGE("CheckSystemPermission failed");
659 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(), "CALLER_PID", GetCallingPid(),
660 "KEY_CODE", keyEvent.GetKeyCode(), "KEY_ACTION", keyEvent.GetKeyAction(),
661 "ERROR_MSG", "avsessionservice sendsystemavkeyevent checksystempermission failed");
662 return ERR_NO_PERMISSION;
663 }
664 SLOGI("key=%{public}d", keyEvent.GetKeyCode());
665 if (keyEvent.GetKeyCode() == MMI::KeyEvent::KEYCODE_HEADSETHOOK) {
666 pressCount_++;
667 if (isFirstPress_) {
668 auto ret = AVSessionEventHandler::GetInstance().AVSessionPostTask([this]() {
669 HandleEventHandlerCallBack();
670 }, "SendSystemAVKeyEvent", CLICK_TIMEOUT);
671 CHECK_AND_RETURN_RET_LOG(ret, AVSESSION_ERROR, "init eventHandler failed");
672 isFirstPress_ = false;
673 }
674 return AVSESSION_SUCCESS;
675 }
676 if (topSession_) {
677 topSession_->HandleMediaKeyEvent(keyEvent);
678 } else {
679 SLOGI("topSession is nullptr");
680 }
681 return AVSESSION_SUCCESS;
682 }
683
SendSystemControlCommand(const AVControlCommand & command)684 int32_t AVSessionService::SendSystemControlCommand(const AVControlCommand &command)
685 {
686 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
687 SLOGE("CheckSystemPermission failed");
688 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(),
689 "CALLER_PID", GetCallingPid(), "CMD", command.GetCommand(),
690 "ERROR_MSG", "avsessionservice sendsystemcontrolcommand checksystempermission failed");
691 return ERR_NO_PERMISSION;
692 }
693 SLOGI("cmd=%{public}d", command.GetCommand());
694 if (topSession_) {
695 CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(GetCallingPid()),
696 ERR_COMMAND_SEND_EXCEED_MAX, "command excuted number exceed max");
697 topSession_->ExecuteControllerCommand(command);
698 }
699 return AVSESSION_SUCCESS;
700 }
701
AddClientDeathObserver(pid_t pid,const sptr<IClientDeath> & observer)702 void AVSessionService::AddClientDeathObserver(pid_t pid, const sptr<IClientDeath>& observer)
703 {
704 std::lock_guard lockGuard(clientDeathObserversLock_);
705 clientDeathObservers_[pid] = observer;
706 }
707
RemoveClientDeathObserver(pid_t pid)708 void AVSessionService::RemoveClientDeathObserver(pid_t pid)
709 {
710 std::lock_guard lockGuard(clientDeathObserversLock_);
711 clientDeathObservers_.erase(pid);
712 }
713
RegisterClientDeathObserver(const sptr<IClientDeath> & observer)714 int32_t AVSessionService::RegisterClientDeathObserver(const sptr<IClientDeath>& observer)
715 {
716 SLOGI("enter");
717 auto pid = GetCallingPid();
718 auto* recipient = new(std::nothrow) ClientDeathRecipient([this, pid]() { OnClientDied(pid); });
719 if (recipient == nullptr) {
720 SLOGE("malloc failed");
721 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "RGS_CLIENT_DEATH_OBSERVER_FAILED",
722 "ERROR_INFO", "avsession service register client death observer malloc failed");
723 return AVSESSION_ERROR;
724 }
725
726 if (!observer->AsObject()->AddDeathRecipient(recipient)) {
727 SLOGE("add death recipient for %{public}d failed", pid);
728 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "RGS_CLIENT_DEATH_FAILED", "CALLING_PID", pid,
729 "ERROR_INFO", "avsession service register client death observer, add death recipient failed");
730 return AVSESSION_ERROR;
731 }
732
733 AddClientDeathObserver(pid, observer);
734 return AVSESSION_SUCCESS;
735 }
736
OnClientDied(pid_t pid)737 void AVSessionService::OnClientDied(pid_t pid)
738 {
739 SLOGI("pid=%{public}d", pid);
740 RemoveSessionListener(pid);
741 RemoveClientDeathObserver(pid);
742
743 std::lock_guard lockGuard(sessionAndControllerLock_);
744 ClearSessionForClientDiedNoLock(pid);
745 ClearControllerForClientDiedNoLock(pid);
746 }
747
HandleSessionRelease(AVSessionItem & session)748 void AVSessionService::HandleSessionRelease(AVSessionItem& session)
749 {
750 SLOGI("sessionId=%{public}s", session.GetSessionId().c_str());
751 NotifySessionRelease(session.GetDescriptor());
752 std::lock_guard lockGuard(sessionAndControllerLock_);
753 GetContainer().RemoveSession(session.GetPid(), session.GetAbilityName());
754 if (topSession_.GetRefPtr() == &session) {
755 UpdateTopSession(nullptr);
756 }
757
758 if (session.GetRemoteSource() != nullptr) {
759 auto sessionPtr = GetContainer().GetSessionById(session.GetSessionId());
760 if (sessionPtr != nullptr) {
761 int32_t ret = CancelCastAudioForClientExit(session.GetPid(), sessionPtr);
762 SLOGI("CancelCastAudioForClientExit ret is %{public}d", ret);
763 }
764 } else {
765 nlohmann::json value;
766 value["bundleName"] = session.GetDescriptor().elementName_.GetBundleName();
767 value["abilityName"] = session.GetDescriptor().elementName_.GetAbilityName();
768 std::string content = value.dump();
769 if (!SaveStringToFile(AVSESSION_FILE_DIR + ABILITY_FILE_NAME, content)) {
770 SLOGE("SaveStringToFile failed, filename=%{public}s", ABILITY_FILE_NAME);
771 }
772 }
773
774 HISYSEVENT_ADD_LIFE_CYCLE_INFO(session.GetDescriptor().elementName_.GetBundleName(),
775 AppManagerAdapter::GetInstance().IsAppBackground(GetCallingUid()),
776 session.GetDescriptor().sessionType_, false);
777 }
778
HandleControllerRelease(AVControllerItem & controller)779 void AVSessionService::HandleControllerRelease(AVControllerItem& controller)
780 {
781 auto pid = controller.GetPid();
782 std::lock_guard lockGuard(sessionAndControllerLock_);
783 auto it = controllers_.find(pid);
784 if (it == controllers_.end()) {
785 return;
786 }
787 SLOGI("remove controller");
788 it->second.remove(&controller);
789 if (it->second.empty()) {
790 controllers_.erase(pid);
791 }
792 }
793
Dump(std::int32_t fd,const std::vector<std::u16string> & args)794 std::int32_t AVSessionService::Dump(std::int32_t fd, const std::vector<std::u16string>& args)
795 {
796 if (fd < 0) {
797 SLOGE("dump fd invalid");
798 return ERR_INVALID_PARAM;
799 }
800
801 if (dumpHelper_ == nullptr) {
802 SLOGE("dumpHelper_ is nullptr!");
803 return ERR_INVALID_PARAM;
804 }
805
806 std::vector<std::string> argsInStr;
807 for (const auto& arg : args) {
808 SLOGI("Dump args: %s", Str16ToStr8(arg).c_str());
809 argsInStr.emplace_back(Str16ToStr8(arg));
810 }
811
812 std::string result;
813 dumpHelper_->Dump(argsInStr, result, *this);
814 std::int32_t ret = dprintf(fd, "%s", result.c_str());
815 if (ret < 0) {
816 SLOGI("dprintf to dump fd failed");
817 return ERR_INVALID_PARAM;
818 }
819 return AVSESSION_SUCCESS;
820 }
821
GetService(const std::string & deviceId)822 sptr <RemoteSessionCommandProcess> AVSessionService::GetService(const std::string& deviceId)
823 {
824 SLOGI("enter");
825 auto mgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
826 if (mgr == nullptr) {
827 SLOGE("failed to get sa mgr");
828 return nullptr;
829 }
830 auto object = mgr->GetSystemAbility(AVSESSION_SERVICE_ID, deviceId);
831 if (object == nullptr) {
832 SLOGE("failed to get service");
833 return nullptr;
834 }
835 auto remoteService = iface_cast<RemoteSessionCommandProcess>(object);
836 return remoteService;
837 }
838
IsLocalDevice(const std::string & networkId)839 bool AVSessionService::IsLocalDevice(const std::string& networkId)
840 {
841 std::string localNetworkId;
842 CHECK_AND_RETURN_RET_LOG(GetLocalNetworkId(localNetworkId) == AVSESSION_SUCCESS, AVSESSION_ERROR,
843 "GetLocalNetworkId error");
844 if (networkId == localNetworkId || networkId == "LocalDevice") {
845 SLOGI("local device");
846 return true;
847 }
848 SLOGI("not local device");
849 return false;
850 }
851
GetLocalNetworkId(std::string & networkId)852 int32_t AVSessionService::GetLocalNetworkId(std::string& networkId)
853 {
854 SLOGI("GetLocalNetworkId");
855 DistributedHardware::DmDeviceInfo deviceInfo;
856 int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetLocalDeviceInfo("av_session", deviceInfo);
857 CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "get local deviceInfo failed");
858 networkId = deviceInfo.networkId;
859 return AVSESSION_SUCCESS;
860 }
861
GetTrustedDeviceName(const std::string & networkId,std::string & deviceName)862 int32_t AVSessionService::GetTrustedDeviceName(const std::string& networkId, std::string& deviceName)
863 {
864 SLOGI("GetTrustedDeviceName");
865 std::vector<OHOS::DistributedHardware::DmDeviceInfo> deviceList {};
866 if (IsLocalDevice(networkId)) {
867 deviceName = "LocalDevice";
868 return AVSESSION_SUCCESS;
869 }
870 int32_t ret = GetTrustedDevicesInfo(deviceList);
871 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "get devicesInfo failed");
872 SLOGI("deviceList size is %{public}d", static_cast<int32_t>(deviceList.size()));
873 for (const auto& device : deviceList) {
874 SLOGI("device networkId is %{public}.6s", device.networkId);
875 ret = strcmp(device.networkId, networkId.c_str());
876 if (ret == 0) {
877 deviceName = device.deviceName;
878 SLOGI("deviceName is %{public}s", deviceName.c_str());
879 return AVSESSION_SUCCESS;
880 }
881 }
882 SLOGI("can not find this device %{public}.6s", networkId.c_str());
883 return AVSESSION_ERROR;
884 }
885
GetTrustedDevicesInfo(std::vector<OHOS::DistributedHardware::DmDeviceInfo> & deviceList)886 int32_t AVSessionService::GetTrustedDevicesInfo(std::vector<OHOS::DistributedHardware::DmDeviceInfo>& deviceList)
887 {
888 SLOGI("GetTrustedDevicesInfo");
889 int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetTrustedDeviceList("av_session", "", deviceList);
890 CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "get trusted device list failed");
891 return AVSESSION_SUCCESS;
892 }
893
SetBasicInfo(std::string & sessionInfo)894 int32_t AVSessionService::SetBasicInfo(std::string& sessionInfo)
895 {
896 AVSessionBasicInfo basicInfo;
897 basicInfo.metaDataCap_ = AVMetaData::localCapability;
898 basicInfo.playBackStateCap_ = AVPlaybackState::localCapability;
899 basicInfo.controlCommandCap_ = AVControlCommand::localCapability;
900 int32_t ret = GetLocalNetworkId(basicInfo.networkId_);
901 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "GetLocalNetworkId failed");
902
903 ret = JsonUtils::SetSessionBasicInfo(sessionInfo, basicInfo);
904 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "SetDeviceId failed");
905 return AVSESSION_SUCCESS;
906 }
907
SetCastDeviceInfo(const std::vector<AudioStandard::AudioDeviceDescriptor> & castAudioDescriptors,sptr<AVSessionItem> & session)908 void AVSessionService::SetCastDeviceInfo(const std::vector<AudioStandard::AudioDeviceDescriptor>& castAudioDescriptors,
909 sptr <AVSessionItem>& session)
910 {
911 CHECK_AND_RETURN_LOG(session != nullptr && castAudioDescriptors.size() > 0, "invalid argument");
912 SLOGI("castAudioDescriptors size is %{public}d", static_cast<int32_t>(castAudioDescriptors.size()));
913 SLOGI("session id is %{public}s", session->GetSessionId().c_str());
914
915 OutputDeviceInfo outputDeviceInfo;
916
917 outputDeviceInfo.deviceNames_.clear();
918 outputDeviceInfo.deviceIds_.clear();
919
920 for (const auto &audioDescriptor : castAudioDescriptors) {
921 outputDeviceInfo.deviceNames_.push_back(audioDescriptor.deviceName_);
922 outputDeviceInfo.deviceIds_.push_back(std::to_string(audioDescriptor.deviceId_));
923 SLOGI("deviceName is %{public}s", audioDescriptor.deviceName_.c_str());
924 SLOGI("deviceId is %{public}d", audioDescriptor.deviceId_);
925 }
926 outputDeviceInfo.isRemote_ = false;
927 if (!IsLocalDevice(castAudioDescriptors[0].networkId_)) {
928 outputDeviceInfo.isRemote_ = true;
929 }
930 session->SetOutputDevice(outputDeviceInfo);
931 }
932
GetAudioDescriptorByDeviceId(const std::vector<sptr<AudioStandard::AudioDeviceDescriptor>> & descriptors,const std::string & deviceId,AudioStandard::AudioDeviceDescriptor & audioDescriptor)933 bool AVSessionService::GetAudioDescriptorByDeviceId(const std::vector<sptr<AudioStandard::AudioDeviceDescriptor>>&
934 descriptors, const std::string& deviceId,
935 AudioStandard::AudioDeviceDescriptor& audioDescriptor)
936 {
937 for (const auto& descriptor : descriptors) {
938 if (std::to_string(descriptor->deviceId_) == deviceId) {
939 audioDescriptor = *descriptor;
940 SLOGI("deviceId is %{public}d, networkId is %{public}.6s", audioDescriptor.deviceId_,
941 audioDescriptor.networkId_.c_str());
942 return true;
943 }
944 }
945 SLOGI("deviceId is %{public}s, not found in all audio descriptor", deviceId.c_str());
946 return false;
947 }
948
GetCastDeviceInfo(const sptr<AVSessionItem> & session,const std::vector<AudioStandard::AudioDeviceDescriptor> & descriptors,std::vector<AudioStandard::AudioDeviceDescriptor> & castSinkDescriptors,std::vector<AudioStandard::AudioDeviceDescriptor> & cancelSinkDescriptors)949 void AVSessionService::GetCastDeviceInfo(const sptr <AVSessionItem>& session,
950 const std::vector<AudioStandard::AudioDeviceDescriptor>& descriptors,
951 std::vector<AudioStandard::AudioDeviceDescriptor>& castSinkDescriptors,
952 std::vector<AudioStandard::AudioDeviceDescriptor>& cancelSinkDescriptors)
953 {
954 if (descriptors.size() != 1) {
955 SLOGI("descriptor size is %{public}d, not support", static_cast<int32_t>(descriptors.size()));
956 return;
957 }
958 castSinkDescriptors.push_back(descriptors[0]);
959 SLOGI("cast to deviceId %{public}d, networkId_ is %{public}.6s", descriptors[0].deviceId_,
960 descriptors[0].networkId_.c_str());
961
962 OutputDeviceInfo deviceInfo;
963 session->GetOutputDevice(deviceInfo);
964 if (!deviceInfo.isRemote_) {
965 SLOGI("isRemote_ is %{public}d, no need to cancel", deviceInfo.isRemote_);
966 return;
967 }
968 int32_t ret = GetAudioDescriptor(session->GetDescriptor().outputDeviceInfo_.deviceIds_[0],
969 cancelSinkDescriptors);
970 CHECK_AND_RETURN_LOG(ret == AVSESSION_SUCCESS, "get cancelSinkDescriptors failed");
971 }
972
SelectOutputDevice(const int32_t uid,const AudioDeviceDescriptor & descriptor)973 int32_t AVSessionService::SelectOutputDevice(const int32_t uid, const AudioDeviceDescriptor& descriptor)
974 {
975 SLOGI("uid is %{public}d", uid);
976 sptr <AudioStandard::AudioRendererFilter> audioFilter = new(std::nothrow) AudioRendererFilter();
977 CHECK_AND_RETURN_RET_LOG(audioFilter != nullptr, ERR_NO_MEMORY, "new AudioRendererFilter failed");
978 audioFilter->uid = uid;
979 audioFilter->rendererInfo.contentType = ContentType::CONTENT_TYPE_MUSIC;
980 audioFilter->rendererInfo.streamUsage = StreamUsage::STREAM_USAGE_MEDIA;
981
982 std::vector<sptr<AudioDeviceDescriptor>> audioDescriptor;
983 auto audioDeviceDescriptor = new(std::nothrow) AudioDeviceDescriptor(descriptor);
984 CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptor != nullptr, ERR_NO_MEMORY, "audioDeviceDescriptor is nullptr");
985 audioDescriptor.push_back(audioDeviceDescriptor);
986 SLOGI("select the device %{public}s id %{public}d role is %{public}d, networkId is %{public}.6s",
987 descriptor.deviceName_.c_str(), descriptor.deviceId_, static_cast<int32_t>(descriptor.deviceRole_),
988 descriptor.networkId_.c_str());
989
990 AudioSystemManager *audioSystemMgr = AudioSystemManager::GetInstance();
991 CHECK_AND_RETURN_RET_LOG(audioSystemMgr != nullptr, AVSESSION_ERROR, "get AudioSystemManager instance failed");
992 int32_t ret = audioSystemMgr->SelectOutputDevice(audioFilter, audioDescriptor);
993 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "SelectOutputDevice failed");
994
995 return AVSESSION_SUCCESS;
996 }
997
CastAudio(const SessionToken & token,const std::vector<AudioStandard::AudioDeviceDescriptor> & sinkAudioDescriptors)998 int32_t AVSessionService::CastAudio(const SessionToken& token,
999 const std::vector<AudioStandard::AudioDeviceDescriptor>& sinkAudioDescriptors)
1000 {
1001 SLOGI("sessionId is %{public}s", token.sessionId.c_str());
1002 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
1003 SLOGE("CheckSystemPermission failed");
1004 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(), "CALLER_PID", GetCallingPid(),
1005 "ERROR_MSG", "avsessionservice CastAudio checksystempermission failed");
1006 return ERR_NO_PERMISSION;
1007 }
1008
1009 std::string sourceSessionInfo;
1010 int32_t ret = SetBasicInfo(sourceSessionInfo);
1011 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetBasicInfo failed");
1012 sptr<AVSessionItem> session = GetContainer().GetSessionById(token.sessionId);
1013 CHECK_AND_RETURN_RET_LOG(session != nullptr, ERR_SESSION_NOT_EXIST, "session %{public}s not exist",
1014 token.sessionId.c_str());
1015 ret = JsonUtils::SetSessionDescriptor(sourceSessionInfo, session->GetDescriptor());
1016 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetDescriptorInfo failed");
1017 ret = CastAudioProcess(sinkAudioDescriptors, sourceSessionInfo, session);
1018 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioProcess failed");
1019 return AVSESSION_SUCCESS;
1020 }
1021
CastAudioProcess(const std::vector<AudioStandard::AudioDeviceDescriptor> & descriptors,const std::string & sourceSessionInfo,sptr<AVSessionItem> & session)1022 int32_t AVSessionService::CastAudioProcess(const std::vector<AudioStandard::AudioDeviceDescriptor>& descriptors,
1023 const std::string& sourceSessionInfo,
1024 sptr <AVSessionItem>& session)
1025 {
1026 SLOGI("start");
1027 std::vector<AudioDeviceDescriptor> castSinkDescriptors;
1028 std::vector<AudioDeviceDescriptor> cancelSinkDescriptors;
1029 GetCastDeviceInfo(session, descriptors, castSinkDescriptors, cancelSinkDescriptors);
1030
1031 if (cancelSinkDescriptors.size() > 0) {
1032 int32_t ret = CancelCastAudioInner(cancelSinkDescriptors, sourceSessionInfo, session);
1033 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CancelCastAudioInner failed");
1034 }
1035
1036 if (castSinkDescriptors.size() > 0) {
1037 int32_t ret = CastAudioInner(castSinkDescriptors, sourceSessionInfo, session);
1038 if (ret != AVSESSION_SUCCESS) {
1039 SLOGE("CastAudioInner failed, try cancel it. ret is %{public}d",
1040 CancelCastAudioInner(castSinkDescriptors, sourceSessionInfo, session));
1041 return ret;
1042 }
1043 }
1044
1045 SetCastDeviceInfo(descriptors, session);
1046 return AVSESSION_SUCCESS;
1047 }
1048
CastAudioInner(const std::vector<AudioStandard::AudioDeviceDescriptor> & sinkAudioDescriptors,const std::string & sourceSessionInfo,const sptr<AVSessionItem> & session)1049 int32_t AVSessionService::CastAudioInner(const std::vector<AudioStandard::AudioDeviceDescriptor>& sinkAudioDescriptors,
1050 const std::string& sourceSessionInfo,
1051 const sptr <AVSessionItem>& session)
1052 {
1053 SLOGI("start");
1054 CHECK_AND_RETURN_RET_LOG(sinkAudioDescriptors.size() > 0, AVSESSION_ERROR, "sinkDescriptors is empty");
1055 std::string sourceDevice;
1056 CHECK_AND_RETURN_RET_LOG(GetLocalNetworkId(sourceDevice) == AVSESSION_SUCCESS, AVSESSION_ERROR,
1057 "GetLocalNetworkId failed");
1058 SLOGI("networkId_: %{public}.6s, role %{public}d", sinkAudioDescriptors[0].networkId_.c_str(),
1059 static_cast<int32_t>(sinkAudioDescriptors[0].deviceRole_));
1060 if (IsLocalDevice(sinkAudioDescriptors[0].networkId_)) {
1061 int32_t ret = SelectOutputDevice(session->GetUid(), sinkAudioDescriptors[0]);
1062 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "selectOutputDevice failed");
1063 return AVSESSION_SUCCESS;
1064 }
1065
1066 SLOGI("sinkAudioDescriptors size is %{public}d", static_cast<int32_t>(sinkAudioDescriptors.size()));
1067 for (const auto& sinkAudioDescriptor : sinkAudioDescriptors) {
1068 std::string sinkSessionInfo;
1069 auto service = GetService(sinkAudioDescriptor.networkId_);
1070 CHECK_AND_RETURN_RET_LOG(service != nullptr, AVSESSION_ERROR, "GetService %{public}s failed",
1071 sinkAudioDescriptor.networkId_.c_str());
1072 int32_t ret = service->ProcessCastAudioCommand(RemoteServiceCommand::COMMAND_CAST_AUDIO, sourceSessionInfo,
1073 sinkSessionInfo);
1074 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "ProcessCastAudioCommand failed");
1075 std::string sinkCapability;
1076 ret = JsonUtils::GetAllCapability(sinkSessionInfo, sinkCapability);
1077 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetAllCapability failed");
1078 ret = session->CastAudioToRemote(sourceDevice, sinkAudioDescriptor.networkId_, sinkCapability);
1079 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioToRemote failed");
1080 HISYSEVENT_BEHAVIOR("SESSION_CAST",
1081 "BUNDLE_NAME", session->GetDescriptor().elementName_.GetBundleName(),
1082 "MODULE_NAME", session->GetDescriptor().elementName_.GetModuleName(),
1083 "ABILITY_NAME", session->GetDescriptor().elementName_.GetAbilityName(),
1084 "SESSION_PID", session->GetDescriptor().pid_,
1085 "SESSION_UID", session->GetDescriptor().uid_,
1086 "SESSION_ID", session->GetDescriptor().sessionId_,
1087 "SESSION_TAG", session->GetDescriptor().sessionTag_,
1088 "SESSION_TYPE", session->GetDescriptor().sessionType_,
1089 "CAST_TYPE", 0,
1090 "DEST_DEVICE_TYPE", sinkAudioDescriptor.deviceType_,
1091 "DEST_DEVICE_NAME", sinkAudioDescriptor.deviceName_.c_str(),
1092 "DEST_DEVICE_ID", sinkAudioDescriptor.deviceId_,
1093 "DETAILED_MSG", "avsession service cast audio");
1094 ret = SelectOutputDevice(session->GetUid(), sinkAudioDescriptor);
1095 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "selectOutputDevice failed");
1096 }
1097 SLOGI("success");
1098 return AVSESSION_SUCCESS;
1099 }
1100
CancelCastAudioInner(const std::vector<AudioStandard::AudioDeviceDescriptor> & sinkDevices,const std::string & sourceSessionInfo,const sptr<AVSessionItem> & session)1101 int32_t AVSessionService::CancelCastAudioInner(const std::vector<AudioStandard::AudioDeviceDescriptor>& sinkDevices,
1102 const std::string& sourceSessionInfo,
1103 const sptr <AVSessionItem>& session)
1104 {
1105 SLOGI("cancel sinkDevices size is %{public}d", static_cast<int32_t>(sinkDevices.size()));
1106 CHECK_AND_RETURN_RET_LOG(!sinkDevices.empty(), AVSESSION_ERROR, "sinkDevices is empty");
1107 for (const auto& sinkDevice : sinkDevices) {
1108 if (IsLocalDevice(sinkDevice.networkId_)) {
1109 SLOGI("cancel Local device %{public}.6s", sinkDevice.networkId_.c_str());
1110 continue;
1111 }
1112 std::string sinkSessionInfo;
1113 SLOGI("cancel sinkDevices sinkDevice.networkId_ is %{public}.6s", sinkDevice.networkId_.c_str());
1114 auto service = GetService(sinkDevice.networkId_);
1115 CHECK_AND_RETURN_RET_LOG(service != nullptr, AVSESSION_ERROR, "GetService %{public}s failed",
1116 sinkDevice.networkId_.c_str());
1117 int32_t ret = service->ProcessCastAudioCommand(RemoteServiceCommand::COMMAND_CANCEL_CAST_AUDIO,
1118 sourceSessionInfo, sinkSessionInfo);
1119 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "ProcessCastAudioCommand failed");
1120 ret = session->SourceCancelCastAudio(sinkDevice.networkId_);
1121 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SourceCancelCastAudio failed");
1122 }
1123 return AVSESSION_SUCCESS;
1124 }
1125
CastAudioForNewSession(const sptr<AVSessionItem> & session)1126 int32_t AVSessionService::CastAudioForNewSession(const sptr<AVSessionItem>& session)
1127 {
1128 SLOGI("new sessionId is %{public}s", session->GetSessionId().c_str());
1129 SessionToken token;
1130 token.sessionId = session->GetSessionId();
1131 token.pid = session->GetPid();
1132 token.uid = session->GetUid();
1133
1134 int32_t ret = AVSESSION_SUCCESS;
1135 std::vector<AudioStandard::AudioDeviceDescriptor> castSinkDevices;
1136 {
1137 std::lock_guard lockGuard(outputDeviceIdLock_);
1138 ret = GetAudioDescriptor(outputDeviceId_, castSinkDevices);
1139 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetAudioDescriptor failed");
1140 }
1141
1142 ret = CastAudio(token, castSinkDevices);
1143 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudio error, session Id is %{public}s",
1144 token.sessionId.c_str());
1145
1146 SLOGI("success");
1147 return AVSESSION_SUCCESS;
1148 }
1149
CastAudioForAll(const std::vector<AudioStandard::AudioDeviceDescriptor> & sinkAudioDescriptors)1150 int32_t AVSessionService::CastAudioForAll(const std::vector<AudioStandard::AudioDeviceDescriptor>& sinkAudioDescriptors)
1151 {
1152 CHECK_AND_RETURN_RET_LOG(sinkAudioDescriptors.size() > 0, ERR_INVALID_PARAM, "sinkAudioDescriptors is empty");
1153 if (!PermissionChecker::GetInstance().CheckSystemPermission()) {
1154 SLOGE("CheckSystemPermission failed");
1155 HISYSEVENT_SECURITY("CONTROL_PERMISSION_DENIED", "CALLER_UID", GetCallingUid(), "CALLER_PID", GetCallingPid(),
1156 "ERROR_MSG", "avsessionservice CastAudioForAll checksystempermission failed");
1157 return ERR_NO_PERMISSION;
1158 }
1159
1160 {
1161 std::lock_guard lockGuard(isAllSessionCastLock_);
1162 isAllSessionCast_ = false;
1163 if (!IsLocalDevice(sinkAudioDescriptors[0].networkId_)) {
1164 isAllSessionCast_ = true;
1165 }
1166 }
1167 for (const auto& session : GetContainer().GetAllSessions()) {
1168 SessionToken token;
1169 token.sessionId = session->GetSessionId();
1170 token.pid = session->GetPid();
1171 token.uid = session->GetUid();
1172 SLOGI("cast session %{public}s", token.sessionId.c_str());
1173 int32_t ret = CastAudio(token, sinkAudioDescriptors);
1174 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudio session %{public}s failed",
1175 token.sessionId.c_str());
1176 {
1177 std::lock_guard lockGuard(outputDeviceIdLock_);
1178 outputDeviceId_ = session->GetDescriptor().outputDeviceInfo_.deviceIds_[0];
1179 }
1180 }
1181
1182 SLOGI("isAllSessionCast_ %{public}d, outputDeviceId_ is %{public}s", isAllSessionCast_, outputDeviceId_.c_str());
1183 return AVSESSION_SUCCESS;
1184 }
1185
ProcessCastAudioCommand(const RemoteServiceCommand command,const std::string & input,std::string & output)1186 int32_t AVSessionService::ProcessCastAudioCommand(const RemoteServiceCommand command, const std::string& input,
1187 std::string& output)
1188 {
1189 SLOGI("ProcessCastAudioCommand is %{public}d", static_cast<int32_t>(command));
1190 CHECK_AND_RETURN_RET_LOG(command > COMMAND_INVALID && command < COMMAND_MAX, AVSESSION_ERROR, "invalid command");
1191 if (command == COMMAND_CAST_AUDIO) {
1192 int ret = RemoteCastAudioInner(input, output);
1193 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "RemoteCastAudioInner error");
1194 return AVSESSION_SUCCESS;
1195 }
1196
1197 int ret = RemoteCancelCastAudioInner(input);
1198 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "RemoteCancelCastAudioInner error");
1199 SLOGI("success");
1200 return AVSESSION_SUCCESS;
1201 }
1202
RemoteCastAudioInner(const std::string & sourceSessionInfo,std::string & sinkSessionInfo)1203 int32_t AVSessionService::RemoteCastAudioInner(const std::string& sourceSessionInfo, std::string& sinkSessionInfo)
1204 {
1205 SLOGI("sourceInfo : %{public}s", sourceSessionInfo.c_str());
1206 AVSessionDescriptor sourceDescriptor;
1207 int32_t ret = JsonUtils::GetSessionDescriptor(sourceSessionInfo, sourceDescriptor);
1208 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetSessionDescriptor failed");
1209
1210 ret = SetBasicInfo(sinkSessionInfo);
1211 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, AVSESSION_ERROR, "SetBasicInfo failed");
1212 AVSessionBasicInfo sinkDeviceInfo;
1213 ret = JsonUtils::GetSessionBasicInfo(sinkSessionInfo, sinkDeviceInfo);
1214 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetBasicInfo failed");
1215
1216 sptr <AVSessionItem> session = CreateSessionInner(sourceDescriptor.sessionTag_, sourceDescriptor.sessionType_,
1217 sourceDescriptor.isThirdPartyApp_,
1218 sourceDescriptor.elementName_);
1219 SLOGI("source sessionId_ %{public}s", sourceDescriptor.sessionId_.c_str());
1220 CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_ERROR, "CreateSession failed");
1221 SLOGI("sink deviceId %{public}s", session->GetSessionId().c_str());
1222
1223 {
1224 std::lock_guard lockGuard(castAudioSessionMapLock_);
1225 castAudioSessionMap_[sourceDescriptor.sessionId_] = session->GetSessionId();
1226 }
1227
1228 AVSessionBasicInfo sourceDeviceInfo;
1229 ret = JsonUtils::GetSessionBasicInfo(sourceSessionInfo, sourceDeviceInfo);
1230 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetBasicInfo failed");
1231 std::string sourceCapability;
1232 ret = JsonUtils::GetAllCapability(sourceSessionInfo, sourceCapability);
1233 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetAllCapability failed");
1234 ret = session->CastAudioFromRemote(sourceDescriptor.sessionId_, sourceDeviceInfo.networkId_,
1235 sinkDeviceInfo.networkId_, sourceCapability);
1236 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioFromRemote failed");
1237 SLOGI("CastAudioFromRemote success");
1238 JsonUtils::SetSessionDescriptor(sinkSessionInfo, session->GetDescriptor());
1239 SLOGI("sinkSessionInfo : %{public}s", sinkSessionInfo.c_str());
1240 return AVSESSION_SUCCESS;
1241 }
1242
RemoteCancelCastAudioInner(const std::string & sessionInfo)1243 int32_t AVSessionService::RemoteCancelCastAudioInner(const std::string& sessionInfo)
1244 {
1245 SLOGI("sessionInfo is %{public}s", sessionInfo.c_str());
1246 AVSessionBasicInfo sourceDeviceInfo;
1247 int32_t ret = JsonUtils::GetSessionBasicInfo(sessionInfo, sourceDeviceInfo);
1248 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetBasicInfo failed");
1249 AVSessionDescriptor sourceDescriptor;
1250 ret = JsonUtils::GetSessionDescriptor(sessionInfo, sourceDescriptor);
1251 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetSessionDescriptor failed");
1252
1253 std::lock_guard lockGuard(castAudioSessionMapLock_);
1254 auto iter = castAudioSessionMap_.find(sourceDescriptor.sessionId_);
1255 CHECK_AND_RETURN_RET_LOG(iter != castAudioSessionMap_.end(), AVSESSION_ERROR, "no source session %{public}s",
1256 sourceDescriptor.sessionId_.c_str());
1257 auto session = GetContainer().GetSessionById(iter->second);
1258 CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_ERROR, "no sink session %{public}s", iter->second.c_str());
1259
1260 ret = session->SinkCancelCastAudio();
1261 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SinkCancelCastAudio failed");
1262 ClearSessionNoLock(session->GetSessionId());
1263 castAudioSessionMap_.erase(sourceDescriptor.sessionId_);
1264 SLOGI("cancel source session %{public}s success", sourceDescriptor.sessionId_.c_str());
1265 return AVSESSION_SUCCESS;
1266 }
1267
CancelCastAudioForClientExit(pid_t pid,const sptr<AVSessionItem> & session)1268 int32_t AVSessionService::CancelCastAudioForClientExit(pid_t pid, const sptr<AVSessionItem>& session)
1269 {
1270 CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_ERROR, "session is nullptr");
1271 SLOGI("pid is %{public}d, sessionId is %{public}s", static_cast<int32_t>(pid), session->GetSessionId().c_str());
1272 std::string sourceSessionInfo;
1273 int32_t ret = SetBasicInfo(sourceSessionInfo);
1274 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetBasicInfo failed");
1275 ret = JsonUtils::SetSessionDescriptor(sourceSessionInfo, session->GetDescriptor());
1276 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetDescriptorInfo failed");
1277
1278 std::vector<AudioStandard::AudioDeviceDescriptor> cancelSinkDevices;
1279 ret = GetAudioDescriptor(session->GetDescriptor().outputDeviceInfo_.deviceIds_[0], cancelSinkDevices);
1280 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetAudioDescriptor failed");
1281
1282 ret = CancelCastAudioInner(cancelSinkDevices, sourceSessionInfo, session);
1283 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CancelCastAudioInner failed");
1284 return AVSESSION_SUCCESS;
1285 }
1286
GetAudioDescriptor(const std::string deviceId,std::vector<AudioStandard::AudioDeviceDescriptor> & audioDeviceDescriptors)1287 int32_t AVSessionService::GetAudioDescriptor(const std::string deviceId,
1288 std::vector<AudioStandard::AudioDeviceDescriptor>& audioDeviceDescriptors)
1289 {
1290 auto audioDescriptors = AudioSystemManager::GetInstance()->GetDevices(ALL_L_D_DEVICES_FLAG);
1291 AudioDeviceDescriptor audioDescriptor;
1292 if (GetAudioDescriptorByDeviceId(audioDescriptors, deviceId, audioDescriptor)) {
1293 audioDeviceDescriptors.push_back(audioDescriptor);
1294 SLOGI("get audio deviceId %{public}d, networkId_ is %{public}.6s", audioDescriptor.deviceId_,
1295 audioDescriptor.networkId_.c_str());
1296 return AVSESSION_SUCCESS;
1297 }
1298 SLOGI("can not get deviceId %{public}s info", deviceId.c_str());
1299 return AVSESSION_ERROR;
1300 }
1301
ClearSessionForClientDiedNoLock(pid_t pid)1302 void AVSessionService::ClearSessionForClientDiedNoLock(pid_t pid)
1303 {
1304 auto sessions = GetContainer().RemoveSession(pid);
1305 for (const auto& session : sessions) {
1306 if (topSession_ == session) {
1307 UpdateTopSession(nullptr);
1308 }
1309 if (session->GetRemoteSource() != nullptr) {
1310 int32_t ret = CancelCastAudioForClientExit(pid, session);
1311 SLOGI("CancelCastAudioForClientExit ret is %{public}d", ret);
1312 }
1313 SLOGI("remove sessionId=%{public}s", session->GetSessionId().c_str());
1314 session->Destroy();
1315 }
1316 }
1317
ClearSessionNoLock(const std::string & sessionId)1318 void AVSessionService::ClearSessionNoLock(const std::string& sessionId)
1319 {
1320 auto session = GetContainer().RemoveSession(sessionId);
1321 if (topSession_ == session) {
1322 UpdateTopSession(nullptr);
1323 }
1324 SLOGI("remove sessionId=%{public}s", session->GetSessionId().c_str());
1325 session->Destroy();
1326 }
1327
ClearControllerForClientDiedNoLock(pid_t pid)1328 void AVSessionService::ClearControllerForClientDiedNoLock(pid_t pid)
1329 {
1330 auto it = controllers_.find(pid);
1331 CHECK_AND_RETURN_LOG(it != controllers_.end(), "no find controller");
1332 controllers_.erase(it);
1333 auto controllers = std::move(it->second);
1334 SLOGI("remove controllers size=%{public}d", static_cast<int>(controllers.size()));
1335 if (!controllers.empty()) {
1336 for (const auto& controller : controllers) {
1337 controller->Destroy();
1338 }
1339 }
1340 }
1341
ClientDeathRecipient(const std::function<void ()> & callback)1342 ClientDeathRecipient::ClientDeathRecipient(const std::function<void()>& callback)
1343 : callback_(callback)
1344 {
1345 SLOGD("construct");
1346 }
1347
OnRemoteDied(const wptr<IRemoteObject> & object)1348 void ClientDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& object)
1349 {
1350 if (callback_) {
1351 callback_();
1352 }
1353 }
1354 } // namespace OHOS::AVSession