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