• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "av_router.h"
17 #include "avsession_service.h"
18 #include "avcontroller_item.h"
19 #include "avsession_log.h"
20 #include "avsession_errors.h"
21 #include "avsession_descriptor.h"
22 #include "avsession_trace.h"
23 #include "avsession_sysevent.h"
24 #include "avsession_utils.h"
25 #include "remote_session_sink.h"
26 #include "remote_session_source.h"
27 #include "remote_session_source_proxy.h"
28 #include "remote_session_sink_proxy.h"
29 #include "permission_checker.h"
30 #include "avsession_item.h"
31 
32 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
33 #include "avcast_controller_proxy.h"
34 #include "avcast_controller_item.h"
35 #endif
36 
37 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
38 #include <malloc.h>
39 #endif
40 
41 namespace OHOS::AVSession {
AVSessionItem(const AVSessionDescriptor & descriptor)42 AVSessionItem::AVSessionItem(const AVSessionDescriptor& descriptor)
43     : descriptor_(descriptor)
44 {
45     SLOGD("constructor id=%{public}s", descriptor_.sessionId_.c_str());
46 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
47     cssListener_ = std::make_shared<CssListener>(this);
48 #endif
49 }
50 
~AVSessionItem()51 AVSessionItem::~AVSessionItem()
52 {
53     SLOGD("destroy id=%{public}s", descriptor_.sessionId_.c_str());
54 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
55     if (descriptor_.sessionTag_ != "RemoteCast") {
56         SLOGW("Session destroy at source, release cast");
57         ReleaseCast();
58     }
59 #endif
60 }
61 
GetSessionId()62 std::string AVSessionItem::GetSessionId()
63 {
64     return descriptor_.sessionId_;
65 }
66 
GetSessionType()67 std::string AVSessionItem::GetSessionType()
68 {
69     if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO) {
70         return "video";
71     }
72     return "audio";
73 }
74 
Destroy()75 int32_t AVSessionItem::Destroy()
76 {
77     {
78         std::lock_guard lockGuard(callbackLock_);
79         if (callback_) {
80             callback_.clear();
81         }
82     }
83     std::string sessionId = descriptor_.sessionId_;
84     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
85     AVSessionUtils::DeleteFile(fileName);
86 
87     {
88         std::lock_guard controllerLockGuard(controllersLock_);
89         SLOGI("size=%{public}d", static_cast<int>(controllers_.size()));
90         for (auto it = controllers_.begin(); it != controllers_.end();) {
91             SLOGI("pid=%{public}d", it->first);
92             it->second->HandleSessionDestroy();
93             controllers_.erase(it++);
94         }
95     }
96     SLOGI("AVSessionItem send service destroy event to service, check serviceCallback exist");
97     if (serviceCallback_) {
98         SLOGI("AVSessionItem send service destroy event to service");
99         serviceCallback_(*this);
100     }
101     SLOGI("Destroy success");
102     return AVSESSION_SUCCESS;
103 }
104 
GetAVMetaData(AVMetaData & meta)105 int32_t AVSessionItem::GetAVMetaData(AVMetaData& meta)
106 {
107     std::string sessionId = GetSessionId();
108     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
109     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
110     AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
111     meta = metaData_;
112     return AVSESSION_SUCCESS;
113 }
114 
SetAVMetaData(const AVMetaData & meta)115 int32_t AVSessionItem::SetAVMetaData(const AVMetaData& meta)
116 {
117     CHECK_AND_RETURN_RET_LOG(metaData_.CopyFrom(meta), AVSESSION_ERROR, "AVMetaData set error");
118     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
119     if (innerPixelMap != nullptr) {
120         std::string sessionId = GetSessionId();
121         std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
122         AVSessionUtils::WriteImageToFile(innerPixelMap, fileName);
123         innerPixelMap->Clear();
124         metaData_.SetMediaImage(innerPixelMap);
125     }
126 
127     {
128         std::lock_guard controllerLockGuard(controllersLock_);
129         for (const auto& [pid, controller] : controllers_) {
130             controller->HandleMetaDataChange(meta);
131         }
132     }
133     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
134     if (remoteSource_ != nullptr) {
135         SLOGI("set remote AVMetaData");
136         auto ret = remoteSource_->SetAVMetaData(meta);
137         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
138     }
139     return AVSESSION_SUCCESS;
140 }
141 
GetAVQueueItems(std::vector<AVQueueItem> & items)142 int32_t AVSessionItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
143 {
144     std::lock_guard queueItemsLockGuard(queueItemsLock_);
145     items = queueItems_;
146     return AVSESSION_SUCCESS;
147 }
148 
SetAVQueueItems(const std::vector<AVQueueItem> & items)149 int32_t AVSessionItem::SetAVQueueItems(const std::vector<AVQueueItem>& items)
150 {
151     {
152         std::lock_guard queueItemsLockGuard(queueItemsLock_);
153         queueItems_ = items;
154     }
155     {
156         std::lock_guard controllerLockGuard(controllersLock_);
157         for (const auto& [pid, controller] : controllers_) {
158             controller->HandleQueueItemsChange(items);
159         }
160     }
161     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
162     if (remoteSource_ != nullptr) {
163         SLOGI("set remote AVQueueItems");
164         auto ret = remoteSource_->SetAVQueueItems(items);
165         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueItems failed");
166     }
167     return AVSESSION_SUCCESS;
168 }
169 
GetAVQueueTitle(std::string & title)170 int32_t AVSessionItem::GetAVQueueTitle(std::string& title)
171 {
172     title = queueTitle_;
173     return AVSESSION_SUCCESS;
174 }
175 
SetAVQueueTitle(const std::string & title)176 int32_t AVSessionItem::SetAVQueueTitle(const std::string& title)
177 {
178     queueTitle_ = title;
179 
180     {
181         std::lock_guard controllerLockGuard(controllersLock_);
182         for (const auto& [pid, controller] : controllers_) {
183             controller->HandleQueueTitleChange(title);
184         }
185     }
186     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
187     if (remoteSource_ != nullptr) {
188         SLOGI("set remote AVQueueTitle");
189         auto ret = remoteSource_->SetAVQueueTitle(title);
190         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueTitle failed");
191     }
192     return AVSESSION_SUCCESS;
193 }
194 
SetAVPlaybackState(const AVPlaybackState & state)195 int32_t AVSessionItem::SetAVPlaybackState(const AVPlaybackState& state)
196 {
197     CHECK_AND_RETURN_RET_LOG(playbackState_.CopyFrom(state), AVSESSION_ERROR, "AVPlaybackState set error");
198 
199     {
200         std::lock_guard controllerLockGuard(controllersLock_);
201         for (const auto& [pid, controller] : controllers_) {
202             SLOGI("pid=%{public}d", pid);
203             controller->HandlePlaybackStateChange(state);
204         }
205     }
206     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
207     if (remoteSource_ != nullptr) {
208         SLOGI("set remote AVPlaybackState");
209         remoteSource_->SetAVPlaybackState(state);
210     }
211     return AVSESSION_SUCCESS;
212 }
213 
GetAVPlaybackState(AVPlaybackState & state)214 int32_t AVSessionItem::GetAVPlaybackState(AVPlaybackState& state)
215 {
216     state = playbackState_;
217     return AVSESSION_SUCCESS;
218 }
219 
SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent & ability)220 int32_t AVSessionItem::SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent& ability)
221 {
222     launchAbility_ = ability;
223     return AVSESSION_SUCCESS;
224 }
225 
GetExtras(AAFwk::WantParams & extras)226 int32_t AVSessionItem::GetExtras(AAFwk::WantParams& extras)
227 {
228     extras = extras_;
229     return AVSESSION_SUCCESS;
230 }
231 
SetExtras(const AAFwk::WantParams & extras)232 int32_t AVSessionItem::SetExtras(const AAFwk::WantParams& extras)
233 {
234     extras_ = extras;
235 
236     {
237         std::lock_guard controllerLockGuard(controllersLock_);
238         for (const auto& [pid, controller] : controllers_) {
239             controller->HandleExtrasChange(extras);
240         }
241     }
242     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
243     if (remoteSource_ != nullptr) {
244         SLOGI("Set remote session extras");
245         auto ret = remoteSource_->SetExtrasRemote(extras);
246         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetRemoteExtras failed");
247     }
248     return AVSESSION_SUCCESS;
249 }
250 
GetControllerInner()251 sptr<IRemoteObject> AVSessionItem::GetControllerInner()
252 {
253     std::lock_guard controllerLockGuard(controllersLock_);
254     auto iter = controllers_.find(GetPid());
255     if (iter != controllers_.end()) {
256         return iter->second;
257     }
258 
259     sptr<AVSessionItem> session(this);
260     sptr<AVControllerItem> result = new(std::nothrow) AVControllerItem(GetPid(), session);
261     CHECK_AND_RETURN_RET_LOG(result != nullptr, nullptr, "malloc controller failed");
262     controllers_.insert({GetPid(), result});
263     return result;
264 }
265 
266 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
GetAVCastControllerInner()267 sptr<IRemoteObject> AVSessionItem::GetAVCastControllerInner()
268 {
269     SLOGI("Start get avcast controller inner");
270     if (castControllerProxy_ == nullptr) {
271         SLOGI("CastControllerProxy is null, start get new proxy");
272         {
273             std::lock_guard lockGuard(castHandleLock_);
274             castControllerProxy_ = AVRouter::GetInstance().GetRemoteController(castHandle_);
275         }
276     }
277     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, nullptr, "Get castController proxy failed");
278 
279     sptr<AVCastControllerItem> castController = new (std::nothrow) AVCastControllerItem();
280     CHECK_AND_RETURN_RET_LOG(castController != nullptr, nullptr, "malloc AVCastController failed");
281     std::shared_ptr<AVCastControllerItem> sharedPtr = std::shared_ptr<AVCastControllerItem>(castController.GetRefPtr(),
282         [holder = castController](const auto*) {});
283 
284     sharedPtr->Init(castControllerProxy_);
285     castControllers_.emplace_back(sharedPtr);
286 
287     sptr<IRemoteObject> remoteObject = castController;
288 
289     return remoteObject;
290 }
291 
ReleaseAVCastControllerInner()292 void AVSessionItem::ReleaseAVCastControllerInner()
293 {
294     SLOGI("Release AVCastControllerInner");
295     for (auto controller : castControllers_) {
296         controller->Destroy();
297     }
298     castControllerProxy_ = nullptr;
299 }
300 #endif
301 
RegisterCallbackInner(const sptr<IAVSessionCallback> & callback)302 int32_t AVSessionItem::RegisterCallbackInner(const sptr<IAVSessionCallback>& callback)
303 {
304     std::lock_guard callbackLockGuard(callbackLock_);
305     callback_ = callback;
306     return AVSESSION_SUCCESS;
307 }
308 
Activate()309 int32_t AVSessionItem::Activate()
310 {
311     descriptor_.isActive_ = true;
312     std::lock_guard controllerLockGuard(controllersLock_);
313     for (const auto& [pid, controller] : controllers_) {
314         SLOGI("pid=%{pubic}d", pid);
315         controller->HandleActiveStateChange(true);
316     }
317     return AVSESSION_SUCCESS;
318 }
319 
Deactivate()320 int32_t AVSessionItem::Deactivate()
321 {
322     descriptor_.isActive_ = false;
323     std::lock_guard controllerLockGuard(controllersLock_);
324     for (const auto& [pid, controller] : controllers_) {
325         SLOGI("pid=%{pubic}d", pid);
326         controller->HandleActiveStateChange(false);
327     }
328     return AVSESSION_SUCCESS;
329 }
330 
IsActive()331 bool AVSessionItem::IsActive()
332 {
333     return descriptor_.isActive_;
334 }
335 
AddSupportCommand(int32_t cmd)336 int32_t AVSessionItem::AddSupportCommand(int32_t cmd)
337 {
338     CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
339     CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
340     auto iter = std::find(supportedCmd_.begin(), supportedCmd_.end(), cmd);
341     CHECK_AND_RETURN_RET_LOG(iter == supportedCmd_.end(), AVSESSION_SUCCESS, "cmd already been added");
342     supportedCmd_.push_back(cmd);
343     std::lock_guard controllerLockGuard(controllersLock_);
344     for (const auto& [pid, controller] : controllers_) {
345         SLOGI("pid=%{pubic}d", pid);
346         controller->HandleValidCommandChange(supportedCmd_);
347     }
348     return AVSESSION_SUCCESS;
349 }
350 
DeleteSupportCommand(int32_t cmd)351 int32_t AVSessionItem::DeleteSupportCommand(int32_t cmd)
352 {
353     CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
354     CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
355     auto iter = std::remove(supportedCmd_.begin(), supportedCmd_.end(), cmd);
356     supportedCmd_.erase(iter, supportedCmd_.end());
357     std::lock_guard controllerLockGuard(controllersLock_);
358     for (const auto& [pid, controller] : controllers_) {
359         SLOGI("pid=%{pubic}d", pid);
360         controller->HandleValidCommandChange(supportedCmd_);
361     }
362     return AVSESSION_SUCCESS;
363 }
364 
SetSessionEvent(const std::string & event,const AAFwk::WantParams & args)365 int32_t AVSessionItem::SetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
366 {
367     {
368         std::lock_guard controllerLockGuard(controllersLock_);
369         for (const auto& [pid, controller] : controllers_) {
370             controller->HandleSetSessionEvent(event, args);
371         }
372     }
373     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
374     if (remoteSource_ != nullptr) {
375         SLOGI("Set remote session event");
376         auto ret = remoteSource_->SetSessionEventRemote(event, args);
377         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetSessionEvent failed");
378     }
379     return AVSESSION_SUCCESS;
380 }
381 
382 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
ReleaseCast()383 int32_t AVSessionItem::ReleaseCast()
384 {
385     SLOGI("Release cast process");
386     return StopCast();
387 }
388 
StartCast(const OutputDeviceInfo & outputDeviceInfo)389 int32_t AVSessionItem::StartCast(const OutputDeviceInfo& outputDeviceInfo)
390 {
391     SLOGI("Start cast process");
392     std::lock_guard castHandleLockGuard(castHandleLock_);
393 
394     int64_t castHandle = AVRouter::GetInstance().StartCast(outputDeviceInfo);
395     CHECK_AND_RETURN_RET_LOG(castHandle != AVSESSION_ERROR, AVSESSION_ERROR, "StartCast failed");
396 
397     std::lock_guard lockGuard(castHandleLock_);
398     castHandle_ = castHandle;
399 
400     AddDevice(static_cast<int32_t>(castHandle), outputDeviceInfo);
401 
402     return AVSESSION_SUCCESS;
403 }
404 
AddDevice(const int64_t castHandle,const OutputDeviceInfo & outputDeviceInfo)405 int32_t AVSessionItem::AddDevice(const int64_t castHandle, const OutputDeviceInfo& outputDeviceInfo)
406 {
407     SLOGI("Add device process");
408     std::lock_guard lockGuard(castHandleLock_);
409     AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_);
410     int32_t castId = static_cast<int32_t>(castHandle_);
411     AVRouter::GetInstance().AddDevice(castId, outputDeviceInfo);
412     return AVSESSION_SUCCESS;
413 }
414 
IsCastSinkSession(int32_t castState)415 bool AVSessionItem::IsCastSinkSession(int32_t castState)
416 {
417     SLOGI("IsCastSinkSession for castState %{public}d, sessionTag is %{public}s", castState,
418         descriptor_.sessionTag_.c_str());
419     if (castState == ConnectionState::STATE_DISCONNECTED && descriptor_.sessionTag_ == "RemoteCast") {
420         SLOGI("A cast sink session is being disconnected");
421         return Destroy() == true;
422     }
423     return false;
424 }
425 
OnCastStateChange(int32_t castState,DeviceInfo deviceInfo)426 void AVSessionItem::OnCastStateChange(int32_t castState, DeviceInfo deviceInfo)
427 {
428     SLOGI("OnCastStateChange");
429     OutputDeviceInfo outputDeviceInfo;
430     if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
431         outputDeviceInfo.deviceInfos_.emplace_back(castDeviceInfoMap_[deviceInfo.deviceId_]);
432     } else {
433         outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
434     }
435     if (castState == 6) { // 6 is connected status (stream)
436         castState = 1; // 1 is connected status (local)
437         descriptor_.outputDeviceInfo_ = outputDeviceInfo;
438         SLOGI("Start get remote controller");
439     }
440 
441     if (castState == 5) { // 5 is disconnected status
442         castState = 6; // 6 is disconnected status of AVSession
443         SLOGI("Is remotecast, received disconnect event");
444         AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_);
445         AVRouter::GetInstance().StopCastSession(castHandle_);
446         castControllerProxy_ = nullptr;
447 
448         OutputDeviceInfo localDevice;
449         DeviceInfo localInfo;
450         localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
451         localInfo.deviceId_ = "0";
452         localInfo.deviceName_ = "LocalDevice";
453         localDevice.deviceInfos_.emplace_back(localInfo);
454         descriptor_.outputDeviceInfo_ = localDevice;
455     }
456 
457     HandleOutputDeviceChange(castState, outputDeviceInfo);
458     std::lock_guard controllersLockGuard(controllersLock_);
459     for (const auto& controller : controllers_) {
460         controller.second->HandleOutputDeviceChange(castState, outputDeviceInfo);
461     }
462     SLOGI("Start check is cast sink session for state");
463     if (IsCastSinkSession(castState)) {
464         SLOGE("Cast sink session start to disconnect");
465         return;
466     }
467 }
468 
StopCast()469 int32_t AVSessionItem::StopCast()
470 {
471     if (descriptor_.sessionTag_ == "RemoteCast") {
472         return AVRouter::GetInstance().StopCastSession(castHandle_);
473     }
474     SLOGI("Stop cast process");
475     {
476         std::lock_guard lockGuard(castHandleLock_);
477         CHECK_AND_RETURN_RET_LOG(castHandle_ != 0, AVSESSION_SUCCESS, "Not cast session, return");
478         int64_t ret = AVRouter::GetInstance().StopCast(castHandle_);
479         SLOGI("StopCast the castHandle is %{public}ld", castHandle_);
480         CHECK_AND_RETURN_RET_LOG(ret != AVSESSION_ERROR, AVSESSION_ERROR, "StopCast failed");
481     }
482 
483     OutputDeviceInfo outputDeviceInfo;
484     DeviceInfo deviceInfo;
485     deviceInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
486     deviceInfo.deviceId_ = "0";
487     deviceInfo.deviceName_ = "LocalDevice";
488     outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
489     SetOutputDevice(outputDeviceInfo);
490     return AVSESSION_SUCCESS;
491 }
492 
SetCastHandle(const int64_t castHandle)493 void AVSessionItem::SetCastHandle(const int64_t castHandle)
494 {
495     castHandle_ = castHandle;
496     SLOGI("Cast handle is %{public}ld", castHandle_);
497 }
498 
RegisterDeviceStateCallback()499 void AVSessionItem::RegisterDeviceStateCallback()
500 {
501     SLOGI("Start register callback for device state change");
502     AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_);
503     OutputDeviceInfo localDevice;
504     DeviceInfo localInfo;
505     localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
506     localInfo.deviceId_ = "0";
507     localInfo.deviceName_ = "LocalDevice";
508     localDevice.deviceInfos_.emplace_back(localInfo);
509     descriptor_.outputDeviceInfo_ = localDevice;
510 }
511 
UnRegisterDeviceStateCallback()512 void AVSessionItem::UnRegisterDeviceStateCallback()
513 {
514     SLOGI("Stop unregister callback for device state change");
515     AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_);
516 }
517 
StopCastSession()518 void AVSessionItem::StopCastSession()
519 {
520     SLOGI("Stop cast session process");
521     AVRouter::GetInstance().StopCastSession(castHandle_);
522 }
523 #endif
524 
GetDescriptor()525 AVSessionDescriptor AVSessionItem::GetDescriptor()
526 {
527     return descriptor_;
528 }
529 
GetPlaybackState()530 AVPlaybackState AVSessionItem::GetPlaybackState()
531 {
532     return playbackState_;
533 }
534 
GetMetaData()535 AVMetaData AVSessionItem::GetMetaData()
536 {
537     std::string sessionId = GetSessionId();
538     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
539     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
540     AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
541     return metaData_;
542 }
543 
GetQueueItems()544 std::vector<AVQueueItem> AVSessionItem::GetQueueItems()
545 {
546     return queueItems_;
547 }
548 
GetQueueTitle()549 std::string AVSessionItem::GetQueueTitle()
550 {
551     return queueTitle_;
552 }
553 
GetSupportCommand()554 std::vector<int32_t> AVSessionItem::GetSupportCommand()
555 {
556     return supportedCmd_;
557 }
558 
GetLaunchAbility()559 AbilityRuntime::WantAgent::WantAgent AVSessionItem::GetLaunchAbility()
560 {
561     return launchAbility_;
562 }
563 
GetExtras()564 AAFwk::WantParams AVSessionItem::GetExtras()
565 {
566     return extras_;
567 }
568 
HandleMediaKeyEvent(const MMI::KeyEvent & keyEvent)569 void AVSessionItem::HandleMediaKeyEvent(const MMI::KeyEvent& keyEvent)
570 {
571     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnMediaKeyEvent");
572     std::lock_guard callbackLockGuard(callbackLock_);
573     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
574     CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactive");
575     callback_->OnMediaKeyEvent(keyEvent);
576 }
577 
ExecuteControllerCommand(const AVControlCommand & cmd)578 void AVSessionItem::ExecuteControllerCommand(const AVControlCommand& cmd)
579 {
580     HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_ALL_CTRL_COMMAND);
581     int32_t code = cmd.GetCommand();
582     if (code < 0 || code >= SESSION_CMD_MAX) {
583         SLOGE("controlCommand invalid");
584         return;
585     }
586 
587     {
588         std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
589         if (remoteSink_ != nullptr) {
590             SLOGI("set remote ControlCommand");
591             CHECK_AND_RETURN_LOG(remoteSink_->SetControlCommand(cmd) == AVSESSION_SUCCESS, "SetControlCommand failed");
592         }
593     }
594     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
595     CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactivate");
596 
597     HISYSEVENT_ADD_OPERATION_COUNT(static_cast<Operation>(cmd.GetCommand()));
598     HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_SUCCESS_CTRL_COMMAND);
599     HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(descriptor_.elementName_.GetBundleName(), GetPid(),
600         cmd.GetCommand(), descriptor_.sessionType_);
601     return (this->*cmdHandlers[code])(cmd);
602 
603     HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "INVALID_COMMAND", "CMD", code,
604         "ERROR_INFO", "avsessionitem executecontrollercommand, invaild command");
605 }
606 
ExecueCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)607 void AVSessionItem::ExecueCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
608 {
609     AVSESSION_TRACE_SYNC_START("AVSessionItem::ExecueCommonCommand");
610 
611     {
612         std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
613         if (remoteSink_ != nullptr) {
614             SLOGI("Send remote CommonCommand");
615             CHECK_AND_RETURN_LOG(remoteSink_->SetCommonCommand(commonCommand, commandArgs) == AVSESSION_SUCCESS,
616                 "SetCommonCommand failed");
617         }
618     }
619     std::lock_guard callbackLockGuard(callbackLock_);
620     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
621     callback_->OnCommonCommand(commonCommand, commandArgs);
622 }
623 
HandleSkipToQueueItem(const int32_t & itemId)624 void AVSessionItem::HandleSkipToQueueItem(const int32_t& itemId)
625 {
626     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSkipToQueueItem");
627     std::lock_guard callbackLockGuard(callbackLock_);
628     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
629     callback_->OnSkipToQueueItem(itemId);
630 }
631 
HandleOnPlay(const AVControlCommand & cmd)632 void AVSessionItem::HandleOnPlay(const AVControlCommand& cmd)
633 {
634     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlay");
635     std::lock_guard callbackLockGuard(callbackLock_);
636     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
637     callback_->OnPlay();
638 }
639 
HandleOnPause(const AVControlCommand & cmd)640 void AVSessionItem::HandleOnPause(const AVControlCommand& cmd)
641 {
642     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPause");
643     std::lock_guard callbackLockGuard(callbackLock_);
644     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
645     callback_->OnPause();
646 }
647 
HandleOnStop(const AVControlCommand & cmd)648 void AVSessionItem::HandleOnStop(const AVControlCommand& cmd)
649 {
650     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnStop");
651     std::lock_guard callbackLockGuard(callbackLock_);
652     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
653     callback_->OnStop();
654 }
655 
HandleOnPlayNext(const AVControlCommand & cmd)656 void AVSessionItem::HandleOnPlayNext(const AVControlCommand& cmd)
657 {
658     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayNext");
659     std::lock_guard callbackLockGuard(callbackLock_);
660     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
661     callback_->OnPlayNext();
662 }
663 
HandleOnPlayPrevious(const AVControlCommand & cmd)664 void AVSessionItem::HandleOnPlayPrevious(const AVControlCommand& cmd)
665 {
666     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayPrevious");
667     std::lock_guard callbackLockGuard(callbackLock_);
668     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
669     callback_->OnPlayPrevious();
670 }
671 
HandleOnFastForward(const AVControlCommand & cmd)672 void AVSessionItem::HandleOnFastForward(const AVControlCommand& cmd)
673 {
674     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnFastForward");
675     std::lock_guard callbackLockGuard(callbackLock_);
676     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
677     callback_->OnFastForward();
678 }
679 
HandleOnRewind(const AVControlCommand & cmd)680 void AVSessionItem::HandleOnRewind(const AVControlCommand& cmd)
681 {
682     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnRewind");
683     std::lock_guard callbackLockGuard(callbackLock_);
684     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
685     callback_->OnRewind();
686 }
687 
HandleOnSeek(const AVControlCommand & cmd)688 void AVSessionItem::HandleOnSeek(const AVControlCommand& cmd)
689 {
690     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSeek");
691     std::lock_guard callbackLockGuard(callbackLock_);
692     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
693     int64_t time = 0;
694     CHECK_AND_RETURN_LOG(cmd.GetSeekTime(time) == AVSESSION_SUCCESS, "GetSeekTime failed");
695     callback_->OnSeek(time);
696 }
697 
HandleOnSetSpeed(const AVControlCommand & cmd)698 void AVSessionItem::HandleOnSetSpeed(const AVControlCommand& cmd)
699 {
700     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetSpeed");
701     std::lock_guard callbackLockGuard(callbackLock_);
702     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
703     double speed = 0.0;
704     CHECK_AND_RETURN_LOG(cmd.GetSpeed(speed) == AVSESSION_SUCCESS, "GetSpeed failed");
705     callback_->OnSetSpeed(speed);
706 }
707 
HandleOnSetLoopMode(const AVControlCommand & cmd)708 void AVSessionItem::HandleOnSetLoopMode(const AVControlCommand& cmd)
709 {
710     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetLoopMode");
711     std::lock_guard callbackLockGuard(callbackLock_);
712     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
713     int32_t loopMode = AVSESSION_ERROR;
714     CHECK_AND_RETURN_LOG(cmd.GetLoopMode(loopMode) == AVSESSION_SUCCESS, "GetLoopMode failed");
715     callback_->OnSetLoopMode(loopMode);
716 }
717 
HandleOnToggleFavorite(const AVControlCommand & cmd)718 void AVSessionItem::HandleOnToggleFavorite(const AVControlCommand& cmd)
719 {
720     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnToggleFavorite");
721     std::lock_guard callbackLockGuard(callbackLock_);
722     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
723     std::string assetId;
724     CHECK_AND_RETURN_LOG(cmd.GetAssetId(assetId) == AVSESSION_SUCCESS, "GetMediaId failed");
725     callback_->OnToggleFavorite(assetId);
726 }
727 
AddController(pid_t pid,sptr<AVControllerItem> & controller)728 int32_t AVSessionItem::AddController(pid_t pid, sptr<AVControllerItem>& controller)
729 {
730     std::lock_guard controllersLockGuard(controllersLock_);
731     controllers_.insert({pid, controller});
732     return AVSESSION_SUCCESS;
733 }
734 
SetPid(pid_t pid)735 void AVSessionItem::SetPid(pid_t pid)
736 {
737     descriptor_.pid_ = pid;
738 }
739 
SetUid(pid_t uid)740 void AVSessionItem::SetUid(pid_t uid)
741 {
742     descriptor_.uid_ = uid;
743 }
744 
GetPid() const745 pid_t AVSessionItem::GetPid() const
746 {
747     return descriptor_.pid_;
748 }
749 
GetUid() const750 pid_t AVSessionItem::GetUid() const
751 {
752     return descriptor_.uid_;
753 }
754 
GetAbilityName() const755 std::string AVSessionItem::GetAbilityName() const
756 {
757     return descriptor_.elementName_.GetAbilityName();
758 }
759 
GetBundleName() const760 std::string AVSessionItem::GetBundleName() const
761 {
762     return descriptor_.elementName_.GetBundleName();
763 }
764 
SetTop(bool top)765 void AVSessionItem::SetTop(bool top)
766 {
767     descriptor_.isTopSession_ = top;
768 }
769 
GetRemoteSource()770 std::shared_ptr<RemoteSessionSource> AVSessionItem::GetRemoteSource()
771 {
772     return remoteSource_;
773 }
774 
HandleControllerRelease(pid_t pid)775 void AVSessionItem::HandleControllerRelease(pid_t pid)
776 {
777     std::lock_guard controllersLockGuard(controllersLock_);
778     controllers_.erase(pid);
779 }
780 
SetServiceCallbackForRelease(const std::function<void (AVSessionItem &)> & callback)781 void AVSessionItem::SetServiceCallbackForRelease(const std::function<void(AVSessionItem&)>& callback)
782 {
783     SLOGI("SetServiceCallbackForRelease in");
784     serviceCallback_ = callback;
785 }
786 
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)787 void AVSessionItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
788 {
789     SLOGI("Connection state %{public}d", connectionState);
790     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnOutputDeviceChange");
791     std::lock_guard callbackLockGuard(callbackLock_);
792     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
793     callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
794 }
795 
SetOutputDevice(const OutputDeviceInfo & info)796 void AVSessionItem::SetOutputDevice(const OutputDeviceInfo& info)
797 {
798     descriptor_.outputDeviceInfo_ = info;
799     int32_t connectionStateConnected = 1;
800     HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
801     std::lock_guard controllersLockGuard(controllersLock_);
802     for (const auto& controller : controllers_) {
803         controller.second->HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
804     }
805     SLOGI("OutputDeviceInfo device size is %{public}d", static_cast<int32_t>(info.deviceInfos_.size()));
806 }
807 
GetOutputDevice(OutputDeviceInfo & info)808 void AVSessionItem::GetOutputDevice(OutputDeviceInfo& info)
809 {
810     info = GetDescriptor().outputDeviceInfo_;
811 }
812 
CastAudioToRemote(const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sinkCapability)813 int32_t AVSessionItem::CastAudioToRemote(const std::string& sourceDevice, const std::string& sinkDevice,
814                                          const std::string& sinkCapability)
815 {
816     SLOGI("start cast audio to remote");
817     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
818     remoteSource_ = std::make_shared<RemoteSessionSourceProxy>();
819     CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
820     int32_t ret = remoteSource_->CastSessionToRemote(this, sourceDevice, sinkDevice, sinkCapability);
821     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionToRemote failed");
822     ret = remoteSource_->SetAVMetaData(GetMetaData());
823     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
824     ret = remoteSource_->SetAVPlaybackState(GetPlaybackState());
825     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVPlaybackState failed");
826     SLOGI("success");
827     return AVSESSION_SUCCESS;
828 }
829 
SourceCancelCastAudio(const std::string & sinkDevice)830 int32_t AVSessionItem::SourceCancelCastAudio(const std::string& sinkDevice)
831 {
832     SLOGI("start cancel cast audio");
833     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
834     CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
835     int32_t ret = remoteSource_->CancelCastAudio(sinkDevice);
836     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioToLocal failed");
837     SLOGI("success");
838     return AVSESSION_SUCCESS;
839 }
840 
CastAudioFromRemote(const std::string & sourceSessionId,const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sourceCapability)841 int32_t AVSessionItem::CastAudioFromRemote(const std::string& sourceSessionId, const std::string& sourceDevice,
842                                            const std::string& sinkDevice, const std::string& sourceCapability)
843 {
844     SLOGI("start cast audio from remote");
845 
846     std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
847     remoteSink_ = std::make_shared<RemoteSessionSinkProxy>();
848     CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
849     int32_t ret = remoteSink_->CastSessionFromRemote(this, sourceSessionId, sourceDevice, sinkDevice,
850         sourceCapability);
851     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionFromRemote failed");
852 
853     OutputDeviceInfo outputDeviceInfo;
854     GetOutputDevice(outputDeviceInfo);
855     int32_t castCategoryStreaming = ProtocolType::TYPE_CAST_PLUS_STREAM;
856     for (size_t i = 0; i < outputDeviceInfo.deviceInfos_.size(); i++) {
857         outputDeviceInfo.deviceInfos_[i].castCategory_ = castCategoryStreaming;
858     }
859     SetOutputDevice(outputDeviceInfo);
860 
861     CHECK_AND_RETURN_RET_LOG(Activate() == AVSESSION_SUCCESS, AVSESSION_ERROR, "Activate failed");
862 
863     std::vector<std::vector<int32_t>> value(SESSION_DATA_CATEGORY_MAX);
864     ret = JsonUtils::GetVectorCapability(sourceCapability, value);
865     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetVectorCapability error");
866     for (auto cmd : value[SESSION_DATA_CONTROL_COMMAND]) {
867         SLOGI("add support cmd : %{public}d", cmd);
868         ret = AddSupportCommand(cmd);
869         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "AddSupportCommand failed");
870     }
871     SLOGI("success");
872     return AVSESSION_SUCCESS;
873 }
874 
SinkCancelCastAudio()875 int32_t AVSessionItem::SinkCancelCastAudio()
876 {
877     std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
878     CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
879     int32_t ret = remoteSink_->CancelCastSession();
880     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CancelCastSession failed");
881     GetDescriptor().outputDeviceInfo_.deviceInfos_.clear();
882     DeviceInfo deviceInfo;
883     GetDescriptor().outputDeviceInfo_.deviceInfos_.emplace_back(deviceInfo);
884     SLOGI("SinkCancelCastAudio");
885     return AVSESSION_SUCCESS;
886 }
887 
888 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
UpdateCastDeviceMap(DeviceInfo deviceInfo)889 void AVSessionItem::UpdateCastDeviceMap(DeviceInfo deviceInfo)
890 {
891     castDeviceInfoMap_[deviceInfo.deviceId_] = deviceInfo;
892 }
893 #endif
894 } // namespace OHOS::AVSession
895