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