1 /*
2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_manager_proxy.h"
17 #include "av_router.h"
18 #include "avsession_service.h"
19 #include "avcontroller_item.h"
20 #include "avsession_log.h"
21 #include "avsession_errors.h"
22 #include "avsession_descriptor.h"
23 #include "avsession_trace.h"
24 #include "avsession_sysevent.h"
25 #include "avsession_utils.h"
26 #include "remote_session_sink.h"
27 #include "remote_session_source.h"
28 #include "remote_session_source_proxy.h"
29 #include "remote_session_sink_proxy.h"
30 #include "permission_checker.h"
31 #include "session_xcollie.h"
32 #include "avsession_item.h"
33 #include "avsession_radar.h"
34 #include "avsession_event_handler.h"
35 #include "bundle_status_adapter.h"
36 #include "array_wrapper.h"
37 #include "bool_wrapper.h"
38 #include "string_wrapper.h"
39 #include "want_agent_helper.h"
40
41 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
42 #include "avcast_controller_proxy.h"
43 #include "avcast_controller_item.h"
44 #include "collaboration_manager.h"
45 #endif
46
47 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
48 #include <malloc.h>
49 #include <string>
50 #include <openssl/crypto.h>
51 #endif
52
53 using namespace OHOS::AudioStandard;
54
55 namespace OHOS::AVSession {
56
57 const std::map<int32_t, std::string> sessionTypeMap_ = {
58 {AVSession::SESSION_TYPE_VIDEO, "video"},
59 {AVSession::SESSION_TYPE_VOICE_CALL, "voice_call"},
60 {AVSession::SESSION_TYPE_VIDEO_CALL, "video_call"},
61 };
62
AVSessionItem(const AVSessionDescriptor & descriptor,int32_t userId)63 AVSessionItem::AVSessionItem(const AVSessionDescriptor& descriptor, int32_t userId)
64 : descriptor_(descriptor), userId_(userId)
65 {
66 SLOGI("constructor session id=%{public}s, userId=%{public}d",
67 AVSessionUtils::GetAnonySessionId(descriptor_.sessionId_).c_str(), userId_);
68 {
69 std::lock_guard aliveLockGuard(isAliveLock_);
70 isAlivePtr_ = std::make_shared<bool>(true);
71 }
72 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
73 cssListener_ = std::make_shared<CssListener>(this);
74 #endif
75 }
76
~AVSessionItem()77 AVSessionItem::~AVSessionItem()
78 {
79 SLOGI("destroy with activeCheck session id=%{public}s, userId=%{public}d",
80 AVSessionUtils::GetAnonySessionId(descriptor_.sessionId_).c_str(), userId_);
81 if (IsActive()) {
82 Deactivate();
83 }
84 {
85 std::lock_guard aliveLockGuard(isAliveLock_);
86 if (isAlivePtr_ != nullptr) {
87 *isAlivePtr_ = false;
88 }
89 }
90 }
91
92 // LCOV_EXCL_START
GetSessionId()93 std::string AVSessionItem::GetSessionId()
94 {
95 return descriptor_.sessionId_;
96 }
97
GetSessionType()98 std::string AVSessionItem::GetSessionType()
99 {
100 auto iter = sessionTypeMap_.find(descriptor_.sessionType_);
101 if (iter != sessionTypeMap_.end()) {
102 return iter->second;
103 } else {
104 return "audio";
105 }
106 }
107 // LCOV_EXCL_STOP
108
Destroy()109 int32_t AVSessionItem::Destroy()
110 {
111 SLOGI("AVSessionItem %{public}d check service destroy event with service, check serviceCallback exist",
112 static_cast<int>(GetPid()));
113 {
114 std::lock_guard lockGuard(destroyLock_);
115 if (isDestroyed_) {
116 SLOGE("AVSessionItem Destroy process but check already destroyed");
117 return AVSESSION_SUCCESS;
118 }
119 }
120 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
121 "API_NAME", "Destroy", "BUNDLE_NAME", GetBundleName(),
122 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
123 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
124 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
125 if (serviceCallback_) {
126 SLOGI("AVSessionItem send service destroy event to service");
127 serviceCallback_(*this);
128 }
129 return AVSESSION_SUCCESS;
130 }
131
DestroyTask(bool continuePlay)132 int32_t AVSessionItem::DestroyTask(bool continuePlay)
133 {
134 {
135 std::lock_guard lockGuard(destroyLock_);
136 if (isDestroyed_) {
137 SLOGI("session is already destroyed");
138 return AVSESSION_SUCCESS;
139 }
140 isDestroyed_ = true;
141 }
142
143 std::string sessionId = descriptor_.sessionId_;
144 std::string fileName = AVSessionUtils::GetCachePathName(userId_) + sessionId + AVSessionUtils::GetFileSuffix();
145 AVSessionUtils::DeleteFile(fileName);
146 std::list<sptr<AVControllerItem>> controllerList;
147 {
148 std::lock_guard controllerLockGuard(controllersLock_);
149 for (auto it = controllers_.begin(); it != controllers_.end();) {
150 if (it->second) {
151 controllerList.push_back(it->second);
152 }
153 it = controllers_.erase(it);
154 }
155 }
156 for (auto& controller : controllerList) {
157 controller->HandleSessionDestroy();
158 }
159 {
160 std::lock_guard lockGuard(callbackLock_);
161 if (callback_) {
162 callback_.clear();
163 }
164 }
165
166 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
167 SLOGI("Session destroy with castHandle: %{public}lld", (long long)castHandle_);
168 if (descriptor_.sessionTag_ != "RemoteCast" && castHandle_ > 0) {
169 if (!collaborationNeedNetworkId_.empty()) {
170 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
171 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
172 }
173 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
174 ReleaseCast(continuePlay);
175 StopCastSession();
176 }
177 ReleaseAVCastControllerInner();
178 StopCastDisplayListener();
179 #endif
180 return AVSESSION_SUCCESS;
181 }
182
SetAVCallMetaData(const AVCallMetaData & avCallMetaData)183 int32_t AVSessionItem::SetAVCallMetaData(const AVCallMetaData& avCallMetaData)
184 {
185 std::lock_guard lockGuard(avsessionItemLock_);
186 CHECK_AND_RETURN_RET_LOG(avCallMetaData_.CopyFrom(avCallMetaData), AVSESSION_ERROR, "AVCallMetaData set error");
187 std::shared_ptr<AVSessionPixelMap> innerPixelMap = avCallMetaData_.GetMediaImage();
188 if (innerPixelMap != nullptr) {
189 std::string sessionId = GetSessionId();
190 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
191 AVSessionUtils::WriteImageToFile(innerPixelMap, fileDir, sessionId + AVSessionUtils::GetFileSuffix());
192 innerPixelMap->Clear();
193 avCallMetaData_.SetMediaImage(innerPixelMap);
194 }
195
196 {
197 std::lock_guard controllerLockGuard(controllersLock_);
198 for (const auto& [pid, controller] : controllers_) {
199 if (controller != nullptr) {
200 controller->HandleAVCallMetaDataChange(avCallMetaData);
201 }
202 }
203 }
204 return AVSESSION_SUCCESS;
205 }
206
207 // LCOV_EXCL_START
SetAVCallState(const AVCallState & avCallState)208 int32_t AVSessionItem::SetAVCallState(const AVCallState& avCallState)
209 {
210 {
211 std::lock_guard lockGuard(avsessionItemLock_);
212 CHECK_AND_RETURN_RET_LOG(avCallState_.CopyFrom(avCallState), AVSESSION_ERROR, "AVCallState set error");
213 }
214
215 {
216 std::lock_guard controllerLockGuard(controllersLock_);
217 for (const auto& [pid, controller] : controllers_) {
218 if (controller != nullptr) {
219 controller->HandleAVCallStateChange(avCallState);
220 }
221 }
222 }
223 return AVSESSION_SUCCESS;
224 }
225 // LCOV_EXCL_STOP
226
GetAVMetaData(AVMetaData & meta)227 int32_t AVSessionItem::GetAVMetaData(AVMetaData& meta)
228 {
229 std::lock_guard lockGuard(avsessionItemLock_);
230 SessionXCollie sessionXCollie("avsession::GetAVMetaData");
231 std::string sessionId = GetSessionId();
232 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
233 std::string fileName = sessionId + AVSessionUtils::GetFileSuffix();
234 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
235 AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, fileName);
236
237 std::string avQueueFileDir = AVSessionUtils::GetFixedPathName(userId_);
238 std::string avQueueFileName = GetBundleName() + "_" + metaData_.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
239 std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaData_.GetAVQueueImage();
240 AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFileDir, avQueueFileName);
241
242 meta = metaData_;
243 return AVSESSION_SUCCESS;
244 }
245
246 // LCOV_EXCL_START
ProcessFrontSession(const std::string & source)247 int32_t AVSessionItem::ProcessFrontSession(const std::string& source)
248 {
249 SLOGI("ProcessFrontSession with directly handle %{public}s ", source.c_str());
250 HandleFrontSession();
251 return AVSESSION_SUCCESS;
252 }
253
HandleFrontSession()254 void AVSessionItem::HandleFrontSession()
255 {
256 bool isMetaEmpty;
257 {
258 std::lock_guard lockGuard(avsessionItemLock_);
259 isMetaEmpty = metaData_.GetTitle().empty() && metaData_.GetMediaImage() == nullptr &&
260 metaData_.GetMediaImageUri().empty();
261 SLOGI("frontSession bundle=%{public}s metaEmpty=%{public}d Cmd=%{public}d "
262 "castCmd=%{public}d firstAdd=%{public}d",
263 GetBundleName().c_str(), isMetaEmpty, static_cast<int32_t>(supportedCmd_.size()),
264 static_cast<int32_t>(supportedCastCmds_.size()), isFirstAddToFront_);
265 }
266 if (isMetaEmpty || (supportedCmd_.size() == 0 && supportedCastCmds_.size() == 0)) {
267 if (!isFirstAddToFront_ && serviceCallbackForUpdateSession_) {
268 serviceCallbackForUpdateSession_(GetSessionId(), false);
269 isFirstAddToFront_ = true;
270 }
271 } else {
272 if (isFirstAddToFront_ && serviceCallbackForUpdateSession_) {
273 serviceCallbackForUpdateSession_(GetSessionId(), true);
274 isFirstAddToFront_ = false;
275 }
276 }
277 }
278
HasAvQueueInfo()279 bool AVSessionItem::HasAvQueueInfo()
280 {
281 std::lock_guard lockGuard(avsessionItemLock_);
282 if (metaData_.GetAVQueueName().empty() || metaData_.GetAVQueueId().empty()) {
283 SLOGD("avqueuename or avqueueid is empty");
284 return false;
285 }
286 if (metaData_.GetAVQueueImage() == nullptr && metaData_.GetAVQueueImageUri().empty()) {
287 SLOGD("avqueue img is empty");
288 return false;
289 }
290 if (playbackState_.GetState() != AVPlaybackState::PLAYBACK_STATE_PLAY) {
291 SLOGD("current avqueueinfo is not playing");
292 return false;
293 }
294
295 return true;
296 }
297
ReportSetAVMetaDataInfo(const AVMetaData & meta)298 void AVSessionItem::ReportSetAVMetaDataInfo(const AVMetaData& meta)
299 {
300 std::string mediaImage = "false";
301 std::string avQueueImage = "false";
302 if (meta.GetMediaImage() != nullptr || !(meta.GetMediaImageUri().empty())) {
303 mediaImage = "true";
304 }
305 if (meta.GetAVQueueImage() != nullptr || !(meta.GetAVQueueImageUri().empty())) {
306 avQueueImage = "true";
307 }
308 std::string apiParamString = "assetId: " + meta.GetAssetId() + ", "
309 + "artist: " + meta.GetArtist() + ", "
310 + "title: " + meta.GetTitle() + ", "
311 + "subtitle: " + meta.GetSubTitle() + ", "
312 + "avQueueId: " + meta.GetAVQueueId() + ", "
313 + "duration: " + std::to_string(meta.GetDuration()) + ", "
314 + "avQueueName: " + meta.GetAVQueueName() + ", "
315 + "mediaImage: " + mediaImage + ", "
316 + "avqueueImage: " + avQueueImage;
317 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR", "API_NAME", "SetAVMetaData",
318 "BUNDLE_NAME", GetBundleName(), "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
319 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
320 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
321 }
322
CheckTitleChange(const AVMetaData & meta)323 bool AVSessionItem::CheckTitleChange(const AVMetaData& meta)
324 {
325 bool isTitleLyric = (GetBundleName() == defaultBundleName) && !meta.GetDescription().empty();
326 bool isTitleChange = metaData_.GetTitle() != meta.GetTitle();
327 SLOGI("CheckTitleChange isTitleLyric:%{public}d isTitleChange:%{public}d", isTitleLyric, isTitleChange);
328 return isTitleChange && !isTitleLyric;
329 }
330
SetAVMetaData(const AVMetaData & meta)331 int32_t AVSessionItem::SetAVMetaData(const AVMetaData& meta)
332 {
333 {
334 std::lock_guard lockGuard(avsessionItemLock_);
335 SessionXCollie sessionXCollie("avsession::SetAVMetaData");
336 ReportSetAVMetaDataInfo(meta);
337 if ((metaData_.GetAssetId() != meta.GetAssetId()) || CheckTitleChange(meta)) {
338 isMediaChange_ = true;
339 }
340 CHECK_AND_RETURN_RET_LOG(metaData_.CopyFrom(meta), AVSESSION_ERROR, "AVMetaData set error");
341 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
342 if (innerPixelMap != nullptr) {
343 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
344 AVSessionUtils::WriteImageToFile(innerPixelMap, fileDir, GetSessionId() + AVSessionUtils::GetFileSuffix());
345 innerPixelMap->Clear();
346 metaData_.SetMediaImage(innerPixelMap);
347 }
348 }
349 bool hasPixelMap = (meta.GetMediaImage() != nullptr);
350 SLOGI("MediaCapsule addLocalCapsule hasImage_:%{public}d isMediaChange_:%{public}d", hasPixelMap, isMediaChange_);
351 if (serviceCallbackForNtf_ && hasPixelMap && isMediaChange_) {
352 serviceCallbackForNtf_(GetSessionId(), isMediaChange_);
353 isMediaChange_ = false;
354 }
355 ProcessFrontSession("SetAVMetaData");
356 if (HasAvQueueInfo() && serviceCallbackForAddAVQueueInfo_) {
357 serviceCallbackForAddAVQueueInfo_(*this);
358 }
359 SLOGI("send metadata change event to controllers with title %{public}s from pid:%{public}d, isAlive:%{public}d",
360 meta.GetTitle().c_str(), static_cast<int>(GetPid()), (isAlivePtr_ == nullptr) ? -1 : *isAlivePtr_);
361 AVSessionEventHandler::GetInstance().AVSessionPostTask([this, meta, isAlivePtr = isAlivePtr_]() {
362 std::lock_guard aliveLockGuard(isAliveLock_);
363 CHECK_AND_RETURN_LOG(isAlivePtr != nullptr && *isAlivePtr, "handle metadatachange with session gone, return");
364 SLOGI("HandleMetaDataChange in postTask with title %{public}s and size %{public}d",
365 meta.GetTitle().c_str(), static_cast<int>(controllers_.size()));
366 std::lock_guard controllerLockGuard(controllersLock_);
367 CHECK_AND_RETURN_LOG(controllers_.size() > 0, "handle with no controller, return");
368 for (const auto& [pid, controller] : controllers_) {
369 if (controller != nullptr) {
370 controller->HandleMetaDataChange(meta);
371 }
372 }
373 }, "HandleMetaDataChange", 0);
374
375 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
376 if (remoteSource_ != nullptr) {
377 SLOGI("set remote AVMetaData");
378 auto ret = remoteSource_->SetAVMetaData(meta);
379 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
380 }
381 return AVSESSION_SUCCESS;
382 }
383
GetAVQueueItems(std::vector<AVQueueItem> & items)384 int32_t AVSessionItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
385 {
386 std::lock_guard lock_guard(avsessionItemLock_);
387 items = queueItems_;
388 return AVSESSION_SUCCESS;
389 }
390
SetAVQueueItems(const std::vector<AVQueueItem> & items)391 int32_t AVSessionItem::SetAVQueueItems(const std::vector<AVQueueItem>& items)
392 {
393 {
394 std::lock_guard lock_guard(avsessionItemLock_);
395 queueItems_ = items;
396 }
397
398 {
399 std::lock_guard controllerLockGuard(controllersLock_);
400 for (const auto& [pid, controller] : controllers_) {
401 if (controller != nullptr) {
402 controller->HandleQueueItemsChange(items);
403 }
404 }
405 }
406
407 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
408 if (remoteSource_ != nullptr) {
409 auto ret = remoteSource_->SetAVQueueItems(items);
410 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueItems failed");
411 }
412 return AVSESSION_SUCCESS;
413 }
414
GetAVQueueTitle(std::string & title)415 int32_t AVSessionItem::GetAVQueueTitle(std::string& title)
416 {
417 std::lock_guard lockGuard(avsessionItemLock_);
418 title = queueTitle_;
419 return AVSESSION_SUCCESS;
420 }
421
SetAVQueueTitle(const std::string & title)422 int32_t AVSessionItem::SetAVQueueTitle(const std::string& title)
423 {
424 {
425 std::lock_guard lockGuard(avsessionItemLock_);
426 queueTitle_ = title;
427 }
428
429 {
430 std::lock_guard controllerLockGuard(controllersLock_);
431 for (const auto& [pid, controller] : controllers_) {
432 if (controller != nullptr) {
433 controller->HandleQueueTitleChange(title);
434 }
435 }
436 }
437 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
438 if (remoteSource_ != nullptr) {
439 auto ret = remoteSource_->SetAVQueueTitle(title);
440 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueTitle failed");
441 }
442 return AVSESSION_SUCCESS;
443 }
444
SetAVPlaybackState(const AVPlaybackState & state)445 int32_t AVSessionItem::SetAVPlaybackState(const AVPlaybackState& state)
446 {
447 {
448 std::lock_guard lockGuard(avsessionItemLock_);
449 CHECK_AND_RETURN_RET_LOG(playbackState_.CopyFrom(state), AVSESSION_ERROR, "AVPlaybackState set error");
450 }
451 if (HasAvQueueInfo() && serviceCallbackForAddAVQueueInfo_) {
452 serviceCallbackForAddAVQueueInfo_(*this);
453 }
454 {
455 std::lock_guard controllerLockGuard(controllersLock_);
456 SLOGD("send HandlePlaybackStateChange in postTask with state %{public}d and controller size %{public}d",
457 state.GetState(), static_cast<int>(controllers_.size()));
458 if (controllers_.size() > 0) {
459 for (const auto& [pid, controller] : controllers_) {
460 if (controller != nullptr) {
461 controller->HandlePlaybackStateChange(state);
462 }
463 }
464 }
465 }
466
467 std::string isFavor = state.GetFavorite()? "true" : "false";
468 std::string apiParamString = "state: " + std::to_string(state.GetState()) + ", "
469 + "elapsedTime: " + std::to_string(state.GetPosition().elapsedTime_) + ", "
470 + "updateTime: " + std::to_string(state.GetPosition().updateTime_) + ", "
471 + "loopMode: " + std::to_string(state.GetLoopMode()) + ", "
472 + "isFavorite: " + isFavor;
473 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
474 "API_NAME", "SetAVPlaybackState", "BUNDLE_NAME", GetBundleName(),
475 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
476 "SESSION_TAG", descriptor_.sessionTag_,
477 "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
478 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
479 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
480 if (remoteSource_ != nullptr) {
481 remoteSource_->SetAVPlaybackState(state);
482 }
483 return AVSESSION_SUCCESS;
484 }
485
GetAVPlaybackState(AVPlaybackState & state)486 int32_t AVSessionItem::GetAVPlaybackState(AVPlaybackState& state)
487 {
488 std::lock_guard lockGuard(avsessionItemLock_);
489 state = playbackState_;
490 return AVSESSION_SUCCESS;
491 }
492 // LCOV_EXCL_STOP
493
SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent & ability)494 int32_t AVSessionItem::SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent& ability)
495 {
496 launchAbility_ = ability;
497 std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
498 std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> launWantAgent =
499 std::make_shared<AbilityRuntime::WantAgent::WantAgent>(ability);
500 int res = AVSESSION_SUCCESS;
501 if (want != nullptr && launWantAgent != nullptr) {
502 res = AbilityRuntime::WantAgent::WantAgentHelper::GetWant(launWantAgent, want);
503 }
504 std::string errMsg = "Get want failed.";
505 std::string bundleName = "";
506 std::string abilityName = "";
507 std::string moduleName = "";
508 if (res == AVSESSION_SUCCESS) {
509 bundleName = want->GetElement().GetBundleName().c_str();
510 abilityName = want->GetElement().GetAbilityName().c_str();
511 moduleName = want->GetElement().GetModuleName().c_str();
512 errMsg = "SUCCESS";
513 }
514 std::string apiParamString = "bundleName: " + bundleName + ", " +
515 "moduleName: " + moduleName + ", " + "abilityName: " + abilityName;
516 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
517 "API_NAME", "SetLaunchAbility", "BUNDLE_NAME", GetBundleName(),
518 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
519 "SESSION_TAG", descriptor_.sessionTag_,
520 "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
521 "ERROR_CODE", res, "ERROR_MSG", errMsg);
522 return AVSESSION_SUCCESS;
523 }
524
525 // LCOV_EXCL_START
GetExtras(AAFwk::WantParams & extras)526 int32_t AVSessionItem::GetExtras(AAFwk::WantParams& extras)
527 {
528 std::lock_guard lockGuard(avsessionItemLock_);
529 extras = extras_;
530 return AVSESSION_SUCCESS;
531 }
532
SetExtras(const AAFwk::WantParams & extras)533 int32_t AVSessionItem::SetExtras(const AAFwk::WantParams& extras)
534 {
535 {
536 std::lock_guard lockGuard(avsessionItemLock_);
537 extras_ = extras;
538 }
539
540 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
541 if (extras.HasParam("requireAbilityList")) {
542 auto value = extras.GetParam("requireAbilityList");
543 AAFwk::IArray* list = AAFwk::IArray::Query(value);
544 if (list != nullptr && AAFwk::Array::IsStringArray(list)) {
545 SetExtrasInner(list);
546 }
547 }
548 #endif
549
550 if (extras.HasParam("hw_live_view_hidden_when_keyguard")) {
551 auto value = extras.GetParam("hw_live_view_hidden_when_keyguard");
552 AAFwk::IArray* list = AAFwk::IArray::Query(value);
553 if (list != nullptr && AAFwk::Array::IsBooleanArray(list)) {
554 NotificationExtras(list);
555 }
556 }
557
558 if (extras.HasParam("support-keyevent")) {
559 auto value = extras.GetParam("support-keyevent");
560 AAFwk::IArray* list = AAFwk::IArray::Query(value);
561 if (list != nullptr && AAFwk::Array::IsBooleanArray(list)) {
562 KeyEventExtras(list);
563 }
564 }
565
566 {
567 std::lock_guard controllerLockGuard(controllersLock_);
568 for (const auto& [pid, controller] : controllers_) {
569 if (controller != nullptr) {
570 controller->HandleExtrasChange(extras);
571 }
572 }
573 }
574
575 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
576 if (remoteSource_ != nullptr) {
577 auto ret = remoteSource_->SetExtrasRemote(extras);
578 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetRemoteExtras failed");
579 }
580 return AVSESSION_SUCCESS;
581 }
582
GetControllerInner()583 sptr<IRemoteObject> AVSessionItem::GetControllerInner()
584 {
585 std::lock_guard controllerLockGuard(controllersLock_);
586 auto iter = controllers_.find(GetPid());
587 if (iter != controllers_.end()) {
588 return iter->second;
589 }
590
591 sptr<AVSessionItem> session(this);
592 sptr<AVControllerItem> result = new(std::nothrow) AVControllerItem(GetPid(), session, userId_);
593 CHECK_AND_RETURN_RET_LOG(result != nullptr, nullptr, "malloc controller failed");
594 result->isFromSession_ = true;
595 SLOGI("New controller from sessionItem when get controller.");
596 controllers_.insert({GetPid(), result});
597 return result;
598 }
599
600 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
InitAVCastControllerProxy()601 void AVSessionItem::InitAVCastControllerProxy()
602 {
603 if (castControllerProxy_ == nullptr) {
604 SLOGI("CastControllerProxy is null, start get new proxy");
605 {
606 std::lock_guard lockGuard(castLock_);
607 castControllerProxy_ = AVRouter::GetInstance().GetRemoteController(castHandle_);
608 }
609 }
610 }
611
ReportAVCastControllerInfo()612 void AVSessionItem::ReportAVCastControllerInfo()
613 {
614 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
615 "API_NAME", "getAVCastController", "BUNDLE_NAME", GetBundleName(),
616 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
617 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
618 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
619 }
620
dealValidCallback(int32_t cmd,std::vector<int32_t> & supportedCastCmds)621 void AVSessionItem::dealValidCallback(int32_t cmd, std::vector<int32_t>& supportedCastCmds)
622 {
623 {
624 std::lock_guard lockGuard(avsessionItemLock_);
625 SLOGI("process cast valid cmd: %{public}d", cmd);
626 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_INVALID) {
627 supportedCastCmds_.clear();
628 supportedCastCmds = supportedCastCmds_;
629 HandleCastValidCommandChange(supportedCastCmds_);
630 return;
631 }
632 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_MAX) {
633 supportedCastCmds = supportedCastCmds_;
634 return;
635 }
636 if (descriptor_.sessionTag_ == "RemoteCast") {
637 SLOGI("sink session should not modify valid cmds");
638 supportedCastCmds = {};
639 return;
640 }
641 }
642 if (cmd > removeCmdStep_) {
643 DeleteSupportCastCommand(cmd - removeCmdStep_);
644 } else {
645 AddSupportCastCommand(cmd);
646 }
647 supportedCastCmds = supportedCastCmds_;
648 return;
649 }
650
GetAVCastControllerInner()651 sptr<IRemoteObject> AVSessionItem::GetAVCastControllerInner()
652 {
653 InitAVCastControllerProxy();
654 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, nullptr,
655 "castControllerProxy_ is null when get avCastController");
656 sptr<AVCastControllerItem> castController = new (std::nothrow) AVCastControllerItem();
657 CHECK_AND_RETURN_RET_LOG(castController != nullptr, nullptr, "malloc avCastController failed");
658 std::shared_ptr<AVCastControllerItem> sharedPtr = std::shared_ptr<AVCastControllerItem>(castController.GetRefPtr(),
659 [holder = castController](const auto*) {});
660 CHECK_AND_RETURN_RET_LOG(sharedPtr != nullptr, nullptr, "malloc AVCastControllerItem failed");
661 ReportAVCastControllerInfo();
662
663 auto validCallback = [this](int32_t cmd, std::vector<int32_t>& supportedCastCmds) {
664 dealValidCallback(cmd, supportedCastCmds);
665 };
666
667 auto preparecallback = [this]() {
668 if (AVRouter::GetInstance().GetMirrorCastHandle() != -1 && isFirstCallback_) {
669 isFirstCallback_ = false;
670 AVRouter::GetInstance().DisconnectOtherSession(GetSessionId(),
671 GetDescriptor().outputDeviceInfo_.deviceInfos_[0]);
672 }
673 };
674
675 sharedPtr->Init(castControllerProxy_, validCallback, preparecallback);
676 {
677 std::lock_guard lockGuard(castControllersLock_);
678 castControllers_.emplace_back(sharedPtr);
679 }
680 sptr<IRemoteObject> remoteObject = castController;
681
682 sharedPtr->SetSessionTag(descriptor_.sessionTag_);
683 sharedPtr->SetSessionId(descriptor_.sessionId_);
684 sharedPtr->SetUserId(userId_);
685 if (descriptor_.sessionTag_ != "RemoteCast") {
686 sharedPtr->SetSessionCallbackForCastCap([this](std::string sessionId, bool isPlaying, bool isMediaChange) {
687 if (serviceCallbackForCastNtf_ && IsCasting()) {
688 SLOGI("MediaCapsule CastCapsule for service isPlaying %{public}d, isMediaChange %{public}d",
689 isPlaying, isMediaChange);
690 serviceCallbackForCastNtf_(sessionId, isPlaying, isMediaChange);
691 }
692 });
693 }
694
695 InitializeCastCommands();
696 return remoteObject;
697 }
698
ReleaseAVCastControllerInner()699 void AVSessionItem::ReleaseAVCastControllerInner()
700 {
701 SLOGI("Release AVCastControllerInner");
702 std::lock_guard lockGuard(castControllersLock_);
703 for (auto controller : castControllers_) {
704 if (controller != nullptr) {
705 controller->Destroy();
706 }
707 }
708 castControllerProxy_ = nullptr;
709 isFirstCallback_ = true;
710 }
711 #endif
712
RegisterAVSessionCallback(std::shared_ptr<AVSessionCallback> callbackOfMigrate)713 void AVSessionItem::RegisterAVSessionCallback(std::shared_ptr<AVSessionCallback> callbackOfMigrate)
714 {
715 std::lock_guard callbackLockGuard(callbackLock_);
716 callbackForMigrate_ = callbackOfMigrate;
717 }
718
RegisterCallbackInner(const sptr<IAVSessionCallback> & callback)719 int32_t AVSessionItem::RegisterCallbackInner(const sptr<IAVSessionCallback>& callback)
720 {
721 std::lock_guard callbackLockGuard(callbackLock_);
722 callback_ = callback;
723 return AVSESSION_SUCCESS;
724 }
725 // LCOV_EXCL_STOP
726
Activate()727 int32_t AVSessionItem::Activate()
728 {
729 descriptor_.isActive_ = true;
730 std::lock_guard controllerLockGuard(controllersLock_);
731 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
732 "API_NAME", "Activate", "BUNDLE_NAME", GetBundleName(),
733 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
734 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
735 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
736 for (const auto& [pid, controller] : controllers_) {
737 if (controller != nullptr) {
738 controller->HandleActiveStateChange(true);
739 }
740 }
741 if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VOICE_CALL ||
742 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO_CALL) {
743 SLOGI("set audio scene for voip start");
744 AudioSystemManager *audioManager = AudioSystemManager::GetInstance();
745 AudioScene audioScene = AudioScene::AUDIO_SCENE_CALL_START;
746 if (audioManager != nullptr) {
747 audioManager->SetAudioScene(audioScene);
748 }
749 }
750
751 return AVSESSION_SUCCESS;
752 }
753
754 // LCOV_EXCL_START
Deactivate()755 int32_t AVSessionItem::Deactivate()
756 {
757 descriptor_.isActive_ = false;
758 std::lock_guard controllerLockGuard(controllersLock_);
759 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
760 "API_NAME", "Deactivate", "BUNDLE_NAME", GetBundleName(),
761 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
762 "SESSION_TAG", descriptor_.sessionTag_, "SESSION_TYPE", GetSessionType(),
763 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
764 for (const auto& [pid, controller] : controllers_) {
765 if (controller != nullptr) {
766 controller->HandleActiveStateChange(false);
767 }
768 }
769 if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VOICE_CALL ||
770 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO_CALL) {
771 SLOGI("set audio scene for voip end");
772 AudioSystemManager *audioManager = AudioSystemManager::GetInstance();
773 AudioScene audioScene = AudioScene::AUDIO_SCENE_CALL_END;
774 if (audioManager != nullptr) {
775 audioManager->SetAudioScene(audioScene);
776 }
777 }
778
779 return AVSESSION_SUCCESS;
780 }
781 // LCOV_EXCL_STOP
782
IsActive()783 bool AVSessionItem::IsActive()
784 {
785 return descriptor_.isActive_ || GetSessionId() == "DEFAULT";
786 }
787
788 // LCOV_EXCL_START
AddSupportCommand(int32_t cmd)789 int32_t AVSessionItem::AddSupportCommand(int32_t cmd)
790 {
791 CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
792 CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
793 SLOGI("AddSupportCommand=%{public}d", cmd);
794 if (cmd == AVControlCommand::SESSION_CMD_MEDIA_KEY_SUPPORT) {
795 SLOGI("enable media key event listen");
796 isMediaKeySupport = true;
797 return AVSESSION_SUCCESS;
798 }
799 auto iter = std::find(supportedCmd_.begin(), supportedCmd_.end(), cmd);
800 CHECK_AND_RETURN_RET_LOG(iter == supportedCmd_.end(), AVSESSION_SUCCESS, "cmd already been added");
801 {
802 std::lock_guard lockGuard(avsessionItemLock_);
803 supportedCmd_.push_back(cmd);
804 }
805 std::string apiParamString = "cmd :" + std::to_string(cmd);
806 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
807 "API_NAME", "OnEvent", "BUNDLE_NAME", GetBundleName(),
808 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
809 "SESSION_TAG", descriptor_.sessionTag_,
810 "SESSION_TYPE", GetSessionType(), "API_PARAM", apiParamString,
811 "ERROR_CODE", AVSESSION_SUCCESS, "ERROR_MSG", "SUCCESS");
812 ProcessFrontSession("AddSupportCommand");
813
814 {
815 std::lock_guard controllerLockGuard(controllersLock_);
816 SLOGI("send add command event to controller, size:%{public}d", static_cast<int>(controllers_.size()));
817 for (const auto& [pid, controller] : controllers_) {
818 if (controller != nullptr) {
819 controller->HandleValidCommandChange(supportedCmd_);
820 }
821 }
822 }
823
824 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
825 AddSessionCommandToCast(cmd);
826 #endif
827 return AVSESSION_SUCCESS;
828 }
829
DeleteSupportCommand(int32_t cmd)830 int32_t AVSessionItem::DeleteSupportCommand(int32_t cmd)
831 {
832 CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
833 CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
834 SLOGI("DeleteSupportCommand=%{public}d", cmd);
835 if (cmd == AVControlCommand::SESSION_CMD_MEDIA_KEY_SUPPORT) {
836 SLOGI("disable media key event listen");
837 isMediaKeySupport = false;
838 return AVSESSION_SUCCESS;
839 }
840 auto iter = std::remove(supportedCmd_.begin(), supportedCmd_.end(), cmd);
841 {
842 std::lock_guard lockGuard(avsessionItemLock_);
843 supportedCmd_.erase(iter, supportedCmd_.end());
844 }
845 std::string apiParamString = "cmd :" + std::to_string(cmd);
846 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
847 "API_NAME", "OffEvent",
848 "BUNDLE_NAME", GetBundleName(),
849 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
850 "SESSION_TAG", descriptor_.sessionTag_,
851 "SESSION_TYPE", GetSessionType(),
852 "API_PARAM", apiParamString,
853 "ERROR_CODE", AVSESSION_SUCCESS,
854 "ERROR_MSG", "SUCCESS");
855 ProcessFrontSession("DeleteSupportCommand");
856
857 {
858 SLOGI("send delete command event to controller, size:%{public}d", static_cast<int>(controllers_.size()));
859 std::lock_guard controllerLockGuard(controllersLock_);
860 for (const auto& [pid, controller] : controllers_) {
861 if (controller != nullptr) {
862 controller->HandleValidCommandChange(supportedCmd_);
863 }
864 }
865 }
866
867 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
868 RemoveSessionCommandFromCast(cmd);
869 #endif
870 return AVSESSION_SUCCESS;
871 }
872 // LCOV_EXCL_STOP
873
SetSessionEvent(const std::string & event,const AAFwk::WantParams & args)874 int32_t AVSessionItem::SetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
875 {
876 {
877 std::lock_guard controllerLockGuard(controllersLock_);
878 for (const auto& [pid, controller] : controllers_) {
879 if (controller != nullptr) {
880 controller->HandleSetSessionEvent(event, args);
881 }
882 }
883 }
884 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
885 if (remoteSource_ != nullptr) {
886 auto ret = remoteSource_->SetSessionEventRemote(event, args);
887 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetSessionEvent failed");
888 }
889 return AVSESSION_SUCCESS;
890 }
891
GetAnonymousDeviceId(std::string deviceId)892 std::string AVSessionItem::GetAnonymousDeviceId(std::string deviceId)
893 {
894 if (deviceId.empty() || deviceId.length() < DEVICE_ID_MIN_LEN) {
895 return "unknown";
896 }
897 const uint32_t half = DEVICE_ID_MIN_LEN / 2;
898 return deviceId.substr(0, half) + "**" + deviceId.substr(deviceId.length() - half);
899 }
900
901 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
RegisterListenerStreamToCast(const std::pair<std::string,std::string> & serviceNameStatePair,DeviceInfo deviceInfo)902 int32_t AVSessionItem::RegisterListenerStreamToCast(const std::pair<std::string, std::string>& serviceNameStatePair,
903 DeviceInfo deviceInfo)
904 {
905 if (castHandle_ > 0) {
906 return AVSESSION_ERROR;
907 }
908 {
909 std::lock_guard displayListenerLockGuard(mirrorToStreamLock_);
910 mirrorToStreamFlag_ = true;
911 }
912 std::lock_guard lockGuard(castLock_);
913 castserviceNameStatePair_ = serviceNameStatePair;
914 OutputDeviceInfo outputDeviceInfo;
915 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
916 if (AVRouter::GetInstance().GetMirrorCastHandle() == -1) {
917 castHandle_ = AVRouter::GetInstance().StartCast(outputDeviceInfo, castserviceNameStatePair_, GetSessionId());
918 CHECK_AND_RETURN_RET_LOG(castHandle_ != AVSESSION_ERROR, AVSESSION_ERROR, "StartCast failed");
919 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_, GetSessionId(), deviceInfo);
920 AVRouter::GetInstance().SetServiceAllConnectState(castHandle_, deviceInfo);
921 InitAVCastControllerProxy();
922 } else {
923 castHandle_ = AVRouter::GetInstance().GetMirrorCastHandle();
924 InitAVCastControllerProxy();
925 if (castControllerProxy_ != nullptr && castControllerProxy_->GetCurrentItem().GetDescription() != nullptr) {
926 castHandle_ = -1;
927 castControllerProxy_ = nullptr;
928 return AVSESSION_ERROR;
929 }
930 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_, GetSessionId(), deviceInfo);
931 }
932 castHandleDeviceId_ = deviceInfo.deviceId_;
933 SLOGI("RegisterListenerStreamToCast check handle set to %{public}lld", (long long)castHandle_);
934 UpdateCastDeviceMap(deviceInfo);
935 DoContinuousTaskRegister();
936 HISYSEVENT_BEHAVIOR("SESSION_CAST_CONTROL",
937 "CONTROL_TYPE", "MirrorTostreamCast",
938 "PEER_DEVICE_ID", GetAnonymousDeviceId(deviceInfo.deviceId_),
939 "PEER_DEVICE_NAME", deviceInfo.deviceName_,
940 "PEER_DEVICE_TYPE", deviceInfo.deviceType_,
941 "PEER_NETWORK_ID", GetAnonymousDeviceId(deviceInfo.networkId_),
942 "PEER_SUPPORTED_PROTOCOL", deviceInfo.supportedProtocols_,
943 "BUNDLE_NAME", GetBundleName());
944 return AVSESSION_SUCCESS;
945 }
946
947 // LCOV_EXCL_START
InitializeCastCommands()948 void AVSessionItem::InitializeCastCommands()
949 {
950 std::lock_guard lockGuard(avsessionItemLock_);
951 // always support setVolume command
952 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(),
953 AVCastControlCommand::CAST_CONTROL_CMD_SET_VOLUME);
954 if (iter == supportedCastCmds_.end()) {
955 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_SET_VOLUME);
956 }
957
958 iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(),
959 AVCastControlCommand::CAST_CONTROL_CMD_SET_SPEED);
960 if (iter == supportedCastCmds_.end()) {
961 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_SET_SPEED);
962 }
963
964 iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(),
965 AVCastControlCommand::CAST_CONTROL_CMD_SEEK);
966 if (iter == supportedCastCmds_.end()) {
967 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_SEEK);
968 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD);
969 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_REWIND);
970 }
971
972 iter = std::find(supportedCmd_.begin(), supportedCmd_.end(), AVControlCommand::SESSION_CMD_SET_LOOP_MODE);
973 if (iter != supportedCmd_.end()) {
974 AddSessionCommandToCast(AVControlCommand::SESSION_CMD_SET_LOOP_MODE);
975 }
976 }
977
SessionCommandToCastCommand(int32_t cmd)978 int32_t AVSessionItem::SessionCommandToCastCommand(int32_t cmd)
979 {
980 if (cmd == AVControlCommand::SESSION_CMD_SET_LOOP_MODE) {
981 return AVCastControlCommand::CAST_CONTROL_CMD_SET_LOOP_MODE;
982 }
983 return AVCastControlCommand::CAST_CONTROL_CMD_INVALID;
984 }
985
AddSessionCommandToCast(int32_t cmd)986 void AVSessionItem::AddSessionCommandToCast(int32_t cmd)
987 {
988 if (cmd != AVControlCommand::SESSION_CMD_SET_LOOP_MODE) {
989 return;
990 }
991
992 if (castControllerProxy_ != nullptr) {
993 int32_t castCmd = SessionCommandToCastCommand(cmd);
994 std::lock_guard lockGuard(avsessionItemLock_);
995 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(), castCmd);
996 if (iter != supportedCastCmds_.end()) {
997 SLOGI("castCmd have already been added, cmd:%{public}d", castCmd);
998 return;
999 }
1000 supportedCastCmds_.push_back(castCmd);
1001 HandleCastValidCommandChange(supportedCastCmds_);
1002 }
1003 }
1004
RemoveSessionCommandFromCast(int32_t cmd)1005 void AVSessionItem::RemoveSessionCommandFromCast(int32_t cmd)
1006 {
1007 if (cmd != AVControlCommand::SESSION_CMD_SET_LOOP_MODE) {
1008 return;
1009 }
1010
1011 if (castControllerProxy_ != nullptr) {
1012 int32_t castCmd = SessionCommandToCastCommand(cmd);
1013 std::lock_guard lockGuard(avsessionItemLock_);
1014 SLOGI("remove castcmd:%{public}d", castCmd);
1015 auto iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(), castCmd);
1016 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1017 HandleCastValidCommandChange(supportedCastCmds_);
1018 }
1019 }
1020
AddSupportCastCommand(int32_t cmd)1021 int32_t AVSessionItem::AddSupportCastCommand(int32_t cmd)
1022 {
1023 if (cmd <= AVCastControlCommand::CAST_CONTROL_CMD_INVALID ||
1024 cmd >= AVCastControlCommand::CAST_CONTROL_CMD_MAX) {
1025 SLOGI("add invalid cmd: %{public}d", cmd);
1026 return AVSESSION_ERROR;
1027 }
1028 {
1029 std::lock_guard lockGuard(avsessionItemLock_);
1030 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_PLAY_STATE_CHANGE) {
1031 auto iter = std::find(
1032 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_PLAY);
1033 CHECK_AND_RETURN_RET_LOG(iter == supportedCastCmds_.end(), AVSESSION_SUCCESS, "cmd already been added");
1034 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_PLAY);
1035 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_PAUSE);
1036 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_STOP);
1037 } else if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_SEEK) {
1038 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1039 CHECK_AND_RETURN_RET_LOG(iter == supportedCastCmds_.end(), AVSESSION_SUCCESS, "cmd already been added");
1040 supportedCastCmds_.push_back(cmd);
1041 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD);
1042 supportedCastCmds_.push_back(AVCastControlCommand::CAST_CONTROL_CMD_REWIND);
1043 } else {
1044 auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1045 CHECK_AND_RETURN_RET_LOG(iter == supportedCastCmds_.end(), AVSESSION_SUCCESS, "cmd already been added");
1046 supportedCastCmds_.push_back(cmd);
1047 }
1048 }
1049 ProcessFrontSession("AddSupportCastCommand");
1050 HandleCastValidCommandChange(supportedCastCmds_);
1051 return AVSESSION_SUCCESS;
1052 }
1053
DeleteSupportCastCommand(int32_t cmd)1054 int32_t AVSessionItem::DeleteSupportCastCommand(int32_t cmd)
1055 {
1056 if (cmd <= AVCastControlCommand::CAST_CONTROL_CMD_INVALID ||
1057 cmd >= AVCastControlCommand::CAST_CONTROL_CMD_MAX) {
1058 SLOGI("delete invalid cmd: %{public}d", cmd);
1059 return AVSESSION_ERROR;
1060 }
1061 {
1062 std::lock_guard lockGuard(avsessionItemLock_);
1063 if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_PLAY_STATE_CHANGE) {
1064 auto iter = std::remove(
1065 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_PLAY);
1066 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1067
1068 iter = std::remove(
1069 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_PAUSE);
1070 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1071
1072 iter = std::remove(
1073 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_STOP);
1074 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1075 } else if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_SEEK) {
1076 auto iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1077 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1078
1079 iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(),
1080 AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD);
1081 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1082
1083 iter = std::remove(
1084 supportedCastCmds_.begin(), supportedCastCmds_.end(), AVCastControlCommand::CAST_CONTROL_CMD_REWIND);
1085 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1086 } else {
1087 auto iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
1088 supportedCastCmds_.erase(iter, supportedCastCmds_.end());
1089 }
1090 }
1091 ProcessFrontSession("DeleteSupportCastCommand");
1092 HandleCastValidCommandChange(supportedCastCmds_);
1093 return AVSESSION_SUCCESS;
1094 }
1095
HandleCastValidCommandChange(const std::vector<int32_t> & cmds)1096 void AVSessionItem::HandleCastValidCommandChange(const std::vector<int32_t> &cmds)
1097 {
1098 std::lock_guard lockGuard(castControllersLock_);
1099 SLOGI("send command change event to controller, controller size: %{public}d, cmds size is: %{public}d,",
1100 static_cast<int>(castControllers_.size()), static_cast<int>(cmds.size()));
1101 for (auto controller : castControllers_) {
1102 if (controller != nullptr) {
1103 controller->HandleCastValidCommandChange(cmds);
1104 }
1105 }
1106 }
1107
ReleaseCast(bool continuePlay)1108 int32_t AVSessionItem::ReleaseCast(bool continuePlay)
1109 {
1110 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1111 "API_NAME", "StopCasting",
1112 "BUNDLE_NAME", GetBundleName(),
1113 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1114 "SESSION_TAG", descriptor_.sessionTag_,
1115 "SESSION_TYPE", GetSessionType(),
1116 "ERROR_CODE", AVSESSION_SUCCESS,
1117 "ERROR_MSG", "SUCCESS");
1118 return StopCast(continuePlay);
1119 }
1120
CastAddToCollaboration(const OutputDeviceInfo & outputDeviceInfo)1121 int32_t AVSessionItem::CastAddToCollaboration(const OutputDeviceInfo& outputDeviceInfo)
1122 {
1123 SLOGI("enter CastAddToCollaboration");
1124 if (castDeviceInfoMap_.count(outputDeviceInfo.deviceInfos_[0].deviceId_) != 1) {
1125 SLOGE("deviceId map deviceinfo is not exit");
1126 return AVSESSION_ERROR;
1127 }
1128 ListenCollaborationApplyResult();
1129 DeviceInfo deviceInfo = castDeviceInfoMap_[outputDeviceInfo.deviceInfos_[0].deviceId_];
1130 CHECK_AND_RETURN_RET_LOG(deviceInfo.deviceId_ != "", AVSESSION_ERROR, "deviceid is empty");
1131 CollaborationManager::GetInstance().ApplyAdvancedResource(deviceInfo.deviceId_.c_str());
1132 //wait collaboration callback 10s
1133 std::unique_lock <std::mutex> applyResultLock(collaborationApplyResultMutex_);
1134 bool flag = connectWaitCallbackCond_.wait_for(applyResultLock, std::chrono::seconds(collaborationCallbackTimeOut_),
1135 [this]() {
1136 return applyResultFlag_;
1137 });
1138 //wait user decision collaboration callback 60s
1139 if (waitUserDecisionFlag_) {
1140 flag = connectWaitCallbackCond_.wait_for(applyResultLock,
1141 std::chrono::seconds(collaborationUserCallbackTimeOut_),
1142 [this]() {
1143 return applyUserResultFlag_;
1144 });
1145 }
1146 applyResultFlag_ = false;
1147 applyUserResultFlag_ = false;
1148 waitUserDecisionFlag_ = false;
1149 CHECK_AND_RETURN_RET_LOG(flag, ERR_WAIT_ALLCONNECT_TIMEOUT, "collaboration callback timeout");
1150 if (collaborationRejectFlag_) {
1151 collaborationRejectFlag_ = false;
1152 SLOGE("collaboration callback reject");
1153 return ERR_ALLCONNECT_CAST_REJECT;
1154 }
1155 return AVSESSION_SUCCESS;
1156 }
1157
StartCast(const OutputDeviceInfo & outputDeviceInfo)1158 int32_t AVSessionItem::StartCast(const OutputDeviceInfo& outputDeviceInfo)
1159 {
1160 std::lock_guard lockGuard(castLock_);
1161
1162 if (AVRouter::GetInstance().GetMirrorCastHandle() != -1 && castHandle_ <= 0 &&
1163 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO) {
1164 castHandle_ = AVRouter::GetInstance().GetMirrorCastHandle();
1165 InitAVCastControllerProxy();
1166 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_,
1167 GetSessionId(), outputDeviceInfo.deviceInfos_[0]);
1168 castHandleDeviceId_ = outputDeviceInfo.deviceInfos_[0].deviceId_;
1169 DoContinuousTaskRegister();
1170 SLOGI("RegisterListenerStreamToCast check handle set to %" PRId64 "", castHandle_);
1171 return AVSESSION_SUCCESS;
1172 }
1173
1174 // unregister pre castSession callback to avoid previous session timeout disconnect influence current session
1175 if (castHandle_ > 0) {
1176 if (castHandleDeviceId_ == outputDeviceInfo.deviceInfos_[0].deviceId_) {
1177 SLOGI("repeat startcast %{public}lld", (long long)castHandle_);
1178 return AVSESSION_ERROR;
1179 } else {
1180 SLOGI("cast check with pre cast alive %" PRId64 ", unregister callback", castHandle_);
1181 isSwitchNewDevice_ = true;
1182 newOutputDeviceInfo_ = outputDeviceInfo;
1183 StopCast();
1184 int32_t flag = CastAddToCollaboration(outputDeviceInfo);
1185 CHECK_AND_RETURN_RET_LOG(flag == AVSESSION_SUCCESS, AVSESSION_ERROR, "collaboration to start cast fail");
1186 return AVSESSION_SUCCESS;
1187 }
1188 } else {
1189 int32_t flag = CastAddToCollaboration(outputDeviceInfo);
1190 CHECK_AND_RETURN_RET_LOG(flag == AVSESSION_SUCCESS, AVSESSION_ERROR, "collaboration to start cast fail");
1191 }
1192 return SubStartCast(outputDeviceInfo);
1193 }
1194
SubStartCast(const OutputDeviceInfo & outputDeviceInfo)1195 int32_t AVSessionItem::SubStartCast(const OutputDeviceInfo& outputDeviceInfo)
1196 {
1197 int64_t castHandle = AVRouter::GetInstance().StartCast(outputDeviceInfo, castserviceNameStatePair_, GetSessionId());
1198 CHECK_AND_RETURN_RET_LOG(castHandle != AVSESSION_ERROR, AVSESSION_ERROR, "StartCast failed");
1199
1200 castHandle_ = castHandle;
1201 SLOGI("start cast check handle set to %{public}lld", (long long)castHandle_);
1202 int32_t ret = AddDevice(static_cast<int32_t>(castHandle), outputDeviceInfo);
1203 if (ret == AVSESSION_SUCCESS) {
1204 castHandleDeviceId_ = outputDeviceInfo.deviceInfos_[0].deviceId_;
1205 }
1206 DoContinuousTaskRegister();
1207 return ret;
1208 }
1209
AddDevice(const int64_t castHandle,const OutputDeviceInfo & outputDeviceInfo)1210 int32_t AVSessionItem::AddDevice(const int64_t castHandle, const OutputDeviceInfo& outputDeviceInfo)
1211 {
1212 SLOGI("Add device process");
1213 std::lock_guard lockGuard(castLock_);
1214 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_,
1215 GetSessionId(), outputDeviceInfo.deviceInfos_[0]);
1216 int32_t castId = static_cast<int32_t>(castHandle_);
1217 int32_t ret = AVRouter::GetInstance().AddDevice(castId, outputDeviceInfo);
1218 SLOGI("Add device process with ret %{public}d", ret);
1219 return ret;
1220 }
1221
DealDisconnect(DeviceInfo deviceInfo,bool isNeedRemove)1222 void AVSessionItem::DealDisconnect(DeviceInfo deviceInfo, bool isNeedRemove)
1223 {
1224 SLOGI("Is remotecast, received disconnect event for castHandle_: %{public}lld", (long long)castHandle_);
1225 if (isNeedRemove) {
1226 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
1227 AVRouter::GetInstance().StopCastSession(castHandle_);
1228 DoContinuousTaskUnregister();
1229 } else {
1230 // clear pre session cast info in streamplayer to avoid flash when cast compete
1231 if (castControllerProxy_ != nullptr) {
1232 castControllerProxy_->RefreshCurrentAVQueueItem(AVQueueItem {});
1233 }
1234 }
1235 castHandle_ = -1;
1236 castHandleDeviceId_ = "-100";
1237 castControllerProxy_ = nullptr;
1238 isFirstCallback_ = true;
1239 if (!isSwitchNewDevice_) {
1240 {
1241 std::lock_guard lockGuard(avsessionItemLock_);
1242 supportedCastCmds_.clear();
1243 }
1244 ProcessFrontSession("Disconnect");
1245 }
1246 SaveLocalDeviceInfo();
1247 if (serviceCallbackForCastNtf_) {
1248 serviceCallbackForCastNtf_(GetSessionId(), false, false);
1249 }
1250 ReportStopCastFinish("AVSessionItem::OnCastStateChange", deviceInfo);
1251 }
1252
DealCollaborationPublishState(int32_t castState,DeviceInfo deviceInfo)1253 void AVSessionItem::DealCollaborationPublishState(int32_t castState, DeviceInfo deviceInfo)
1254 {
1255 SLOGI("enter DealCollaborationPublishState");
1256 {
1257 std::lock_guard displayListenerLockGuard(mirrorToStreamLock_);
1258 if (mirrorToStreamFlag_) {
1259 mirrorToStreamFlag_ = false;
1260 SLOGI("cast not add to collaboration when mirror to stream cast");
1261 return;
1262 }
1263 }
1264 if (castState == connectStateFromCast_) { // 6 is connected status (stream)
1265 AVRouter::GetInstance().GetRemoteNetWorkId(
1266 castHandle_, deviceInfo.deviceId_, collaborationNeedNetworkId_);
1267 if (collaborationNeedNetworkId_.empty()) {
1268 SLOGI("networkId is empty, try use deviceId:%{public}s", deviceInfo.deviceId_.c_str());
1269 collaborationNeedNetworkId_ = deviceInfo.deviceId_;
1270 }
1271 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
1272 ServiceCollaborationManagerBussinessStatus::SCM_CONNECTED);
1273 }
1274 if (castState == disconnectStateFromCast_) { // 5 is disconnected status
1275 if (collaborationNeedNetworkId_.empty()) {
1276 SLOGI("networkId is empty, try use deviceId:%{public}s", deviceInfo.deviceId_.c_str());
1277 collaborationNeedNetworkId_ = deviceInfo.deviceId_;
1278 }
1279 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
1280 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
1281 }
1282 }
1283
DealLocalState(int32_t castState)1284 void AVSessionItem::DealLocalState(int32_t castState)
1285 {
1286 if (castState == ConnectionState::STATE_DISCONNECTED) {
1287 if (!isSwitchNewDevice_) {
1288 OutputDeviceInfo outputDeviceInfo;
1289 DeviceInfo deviceInfo;
1290 deviceInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
1291 deviceInfo.deviceId_ = "0";
1292 deviceInfo.deviceName_ = "LocalDevice";
1293 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
1294 SetOutputDevice(outputDeviceInfo);
1295 } else {
1296 if (newOutputDeviceInfo_.deviceInfos_.size() > 0) {
1297 std::this_thread::sleep_for(std::chrono::milliseconds(SWITCH_WAIT_TIME));
1298 SubStartCast(newOutputDeviceInfo_);
1299 }
1300 isSwitchNewDevice_ = false;
1301 }
1302 }
1303 }
1304
1305
ListenCollaborationOnStop()1306 void AVSessionItem::ListenCollaborationOnStop()
1307 {
1308 SLOGI("enter ListenCollaborationOnStop");
1309 CollaborationManager::GetInstance().SendCollaborationOnStop([this](void) {
1310 if (newCastState == connectStateFromCast_) {
1311 if (descriptor_.sessionTag_ == "RemoteCast") {
1312 SLOGI("notify controller avplayer cancle cast when pc recive onstop callback");
1313 AVRouter::GetInstance().StopCastSession(castHandle_);
1314 } else {
1315 StopCast();
1316 }
1317 }
1318 });
1319 }
1320
OnCastStateChange(int32_t castState,DeviceInfo deviceInfo,bool isNeedRemove)1321 void AVSessionItem::OnCastStateChange(int32_t castState, DeviceInfo deviceInfo, bool isNeedRemove)
1322 {
1323 SLOGI("OnCastStateChange in with state: %{public}d | id: %{public}s", static_cast<int32_t>(castState),
1324 deviceInfo.deviceId_.c_str());
1325 if (isNeedRemove) { //same device cast exchange no publish when hostpot scene
1326 DealCollaborationPublishState(castState, deviceInfo);
1327 }
1328 newCastState = castState;
1329 ListenCollaborationOnStop();
1330 OutputDeviceInfo outputDeviceInfo;
1331 if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
1332 outputDeviceInfo.deviceInfos_.emplace_back(castDeviceInfoMap_[deviceInfo.deviceId_]);
1333 } else {
1334 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
1335 }
1336 if (castState == connectStateFromCast_) { // 6 is connected status (stream)
1337 castState = 1; // 1 is connected status (local)
1338 descriptor_.outputDeviceInfo_ = outputDeviceInfo;
1339 ReportConnectFinish("AVSessionItem::OnCastStateChange", deviceInfo);
1340 if (callStartCallback_ && isNeedRemove && descriptor_.sessionTag_ == "RemoteCast") {
1341 SLOGI("AVSessionItem send callStart event to service for connected");
1342 callStartCallback_(*this);
1343 }
1344 }
1345 if (castState == disconnectStateFromCast_) { // 5 is disconnected status
1346 castState = 6; // 6 is disconnected status of AVSession
1347 DealDisconnect(deviceInfo, isNeedRemove);
1348 }
1349 HandleOutputDeviceChange(castState, outputDeviceInfo);
1350 {
1351 std::lock_guard aliveLockGuard(isAliveLock_);
1352 if (isAlivePtr_ != nullptr && *isAlivePtr_) {
1353 std::lock_guard controllersLockGuard(controllersLock_);
1354 for (const auto& controller : controllers_) {
1355 if (!controllers_.empty() && controller.second != nullptr) {
1356 controller.second->HandleOutputDeviceChange(castState, outputDeviceInfo);
1357 }
1358 }
1359 }
1360 }
1361 {
1362 if (castState == ConnectionState::STATE_DISCONNECTED &&
1363 descriptor_.sessionTag_ == "RemoteCast") {
1364 SLOGI("Sink cast session is disconnected, avsession item need be destroyed.");
1365 Destroy();
1366 } else {
1367 AVSessionEventHandler::GetInstance().AVSessionPostTask([this, castState]() {
1368 DealLocalState(castState);
1369 }, "DealLocalState", 0);
1370 }
1371 }
1372 }
1373
OnCastEventRecv(int32_t errorCode,std::string & errorMsg)1374 void AVSessionItem::OnCastEventRecv(int32_t errorCode, std::string& errorMsg)
1375 {
1376 SLOGI("OnCastEventRecv in with code and msg %{public}dm %{public}s", errorCode, errorMsg.c_str());
1377 std::lock_guard lockGuard(castControllersLock_);
1378 for (auto controller : castControllers_) {
1379 controller->OnPlayerError(errorCode, errorMsg);
1380 }
1381 }
1382
ListenCollaborationApplyResult()1383 void AVSessionItem::ListenCollaborationApplyResult()
1384 {
1385 SLOGI("enter ListenCollaborationApplyResult");
1386 CollaborationManager::GetInstance().SendCollaborationApplyResult([this](const int32_t code) {
1387 std::unique_lock <std::mutex> applyResultLock(collaborationApplyResultMutex_);
1388 if (code == ServiceCollaborationManagerResultCode::PASS) {
1389 SLOGI("ApplyResult can cast");
1390 applyResultFlag_ = true;
1391 applyUserResultFlag_ = true;
1392 connectWaitCallbackCond_.notify_one();
1393 }
1394 if (code == ServiceCollaborationManagerResultCode::REJECT) {
1395 SLOGI("ApplyResult can not cast");
1396 collaborationRejectFlag_ = true;
1397 applyResultFlag_ = true;
1398 applyUserResultFlag_ = true;
1399 connectWaitCallbackCond_.notify_one();
1400 }
1401 if (code == ServiceCollaborationManagerResultCode::USERTIP) {
1402 SLOGI("ApplyResult user tip");
1403 applyResultFlag_ = true;
1404 waitUserDecisionFlag_ = true;
1405 connectWaitCallbackCond_.notify_one();
1406 }
1407 if (code == ServiceCollaborationManagerResultCode::USERAGREE) {
1408 SLOGI("ApplyResult user agree cast");
1409 }
1410 });
1411 }
1412
StopCast(bool continuePlay)1413 int32_t AVSessionItem::StopCast(bool continuePlay)
1414 {
1415 std::lock_guard lockGuard(castLock_);
1416 if (descriptor_.sessionTag_ == "RemoteCast") {
1417 CollaborationManager::GetInstance().PublishServiceState(collaborationNeedNetworkId_.c_str(),
1418 ServiceCollaborationManagerBussinessStatus::SCM_IDLE);
1419 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
1420 int32_t ret = AVRouter::GetInstance().StopCastSession(castHandle_);
1421 castHandle_ = -1;
1422 castHandleDeviceId_ = "-100";
1423 SLOGI("Unregister and Stop cast process for sink with ret %{public}d", ret);
1424 return ret;
1425 }
1426 {
1427 CHECK_AND_RETURN_RET_LOG(castHandle_ != 0 && castHandle_ != -1, AVSESSION_SUCCESS, "Not cast session, return");
1428 SLOGI("Stop cast process %" PRId64 "", castHandle_);
1429 if (castHandle_ == AVRouter::GetInstance().GetMirrorCastHandle()) {
1430 if (castControllerProxy_ != nullptr) {
1431 AVCastControlCommand cmd;
1432 cmd.SetCommand(AVCastControlCommand::CAST_CONTROL_CMD_STOP);
1433 castControllerProxy_->SendControlCommand(cmd);
1434 }
1435 } else {
1436 AVSessionRadarInfo info("AVSessionItem::StopCast");
1437 AVSessionRadar::GetInstance().StopCastBegin(descriptor_.outputDeviceInfo_, info);
1438 int64_t ret = AVRouter::GetInstance().StopCast(castHandle_, continuePlay);
1439 AVSessionRadar::GetInstance().StopCastEnd(descriptor_.outputDeviceInfo_, info);
1440 SLOGI("StopCast with unchange castHandle is %{public}lld", (long long)castHandle_);
1441 CHECK_AND_RETURN_RET_LOG(ret != AVSESSION_ERROR, AVSESSION_ERROR, "StopCast failed");
1442 }
1443 }
1444 return AVSESSION_SUCCESS;
1445 }
1446
SetCastHandle(const int64_t castHandle)1447 void AVSessionItem::SetCastHandle(const int64_t castHandle)
1448 {
1449 castHandle_ = castHandle;
1450 }
1451
RegisterDeviceStateCallback()1452 void AVSessionItem::RegisterDeviceStateCallback()
1453 {
1454 OutputDeviceInfo localDevice;
1455 DeviceInfo localInfo;
1456 localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
1457 localInfo.deviceId_ = "0";
1458 localInfo.deviceName_ = "LocalDevice";
1459 localDevice.deviceInfos_.emplace_back(localInfo);
1460 descriptor_.outputDeviceInfo_ = localDevice;
1461 AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_, GetSessionId(), localInfo);
1462 SLOGI("register callback for device state change done");
1463 }
1464
UnRegisterDeviceStateCallback()1465 void AVSessionItem::UnRegisterDeviceStateCallback()
1466 {
1467 AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_, GetSessionId());
1468 }
1469
StopCastSession()1470 void AVSessionItem::StopCastSession()
1471 {
1472 SLOGI("Stop cast session process with castHandle: %{public}lld", (long long)castHandle_);
1473 int64_t ret = AVRouter::GetInstance().StopCastSession(castHandle_);
1474 DoContinuousTaskUnregister();
1475 if (ret != AVSESSION_ERROR) {
1476 castHandle_ = -1;
1477 castHandleDeviceId_ = "-100";
1478 } else {
1479 SLOGE("Stop cast session process error");
1480 }
1481 }
1482
StartCastDisplayListener()1483 int32_t AVSessionItem::StartCastDisplayListener()
1484 {
1485 SLOGI("StartCastDisplayListener in");
1486 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1487 "API_NAME", "onCastDisplayChange",
1488 "BUNDLE_NAME", GetBundleName(),
1489 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1490 "SESSION_TAG", descriptor_.sessionTag_,
1491 "SESSION_TYPE", GetSessionType(),
1492 "ERROR_CODE", AVSESSION_SUCCESS,
1493 "ERROR_MSG", "SUCCESS");
1494 sptr<IAVSessionCallback> callback;
1495 {
1496 std::lock_guard callbackLockGuard(callbackLock_);
1497 CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "callback_ is nullptr");
1498 callback = callback_;
1499 }
1500 GetDisplayListener(callback);
1501 return AVSESSION_SUCCESS;
1502 }
1503
StopCastDisplayListener()1504 int32_t AVSessionItem::StopCastDisplayListener()
1505 {
1506 SLOGI("StopCastDisplayListener in");
1507 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1508 "API_NAME", "offCastDisplayChange",
1509 "BUNDLE_NAME", GetBundleName(),
1510 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1511 "SESSION_TAG", descriptor_.sessionTag_,
1512 "SESSION_TYPE", GetSessionType(),
1513 "ERROR_CODE", AVSESSION_SUCCESS,
1514 "ERROR_MSG", "SUCCESS");
1515 std::lock_guard displayListenerLockGuard(displayListenerLock_);
1516 CHECK_AND_RETURN_RET_LOG(displayListener_ != nullptr, AVSESSION_ERROR, "displayListener_ is nullptr");
1517 Rosen::DMError ret = Rosen::ScreenManagerLite::GetInstance().UnregisterScreenListener(displayListener_);
1518 if (ret != Rosen::DMError::DM_OK) {
1519 SLOGE("UnregisterScreenListener failed, ret: %{public}d.", ret);
1520 }
1521 displayListener_ = nullptr;
1522 return AVSESSION_SUCCESS;
1523 }
1524
GetDisplayListener(sptr<IAVSessionCallback> callback)1525 void AVSessionItem::GetDisplayListener(sptr<IAVSessionCallback> callback)
1526 {
1527 SLOGI("GetDisplayListener in");
1528 std::lock_guard displayListenerLockGuard(displayListenerLock_);
1529 if (displayListener_ == nullptr) {
1530 SLOGI("displayListener_ is null, try to create new listener");
1531 displayListener_ = new HwCastDisplayListener(callback);
1532 CHECK_AND_RETURN_LOG(displayListener_ != nullptr, "Create displayListener failed");
1533 SLOGI("Start to register display listener");
1534 Rosen::DMError ret = Rosen::ScreenManagerLite::GetInstance().RegisterScreenListener(displayListener_);
1535 if (ret != Rosen::DMError::DM_OK) {
1536 SLOGE("UnregisterScreenListener failed, ret: %{public}d.", ret);
1537 }
1538 }
1539 return;
1540 }
1541
GetAllCastDisplays(std::vector<CastDisplayInfo> & castDisplays)1542 int32_t AVSessionItem::GetAllCastDisplays(std::vector<CastDisplayInfo>& castDisplays)
1543 {
1544 SLOGI("GetAllCastDisplays in");
1545 std::vector<Rosen::DisplayId> allDisplayIds = Rosen::DisplayManagerLite::GetInstance().GetAllDisplayIds();
1546 std::vector<CastDisplayInfo> displays;
1547 for (auto &displayId : allDisplayIds) {
1548 sptr<Rosen::DisplayLite> display = Rosen::DisplayManagerLite::GetInstance().GetDisplayById(displayId);
1549 CHECK_AND_RETURN_RET_LOG(display != nullptr, AVSESSION_ERROR, "display is nullptr");
1550 auto displayInfo = display->GetDisplayInfo();
1551 SLOGI("GetAllCastDisplays name: %{public}s, id: %{public}llu",
1552 displayInfo->GetName().c_str(), (unsigned long long)displayInfo->GetDisplayId());
1553 auto flag = Rosen::DisplayManagerLite::GetInstance().GetVirtualScreenFlag(displayInfo->GetDisplayId());
1554 if (flag == Rosen::VirtualScreenFlag::CAST) {
1555 SLOGI("ReportCastDisplay start in");
1556 CastDisplayInfo castDisplayInfo;
1557 castDisplayInfo.displayState = CastDisplayState::STATE_ON;
1558 castDisplayInfo.displayId = displayInfo->GetDisplayId();
1559 castDisplayInfo.name = displayInfo->GetName();
1560 castDisplayInfo.width = static_cast<int32_t>(displayInfo->GetWidth());
1561 castDisplayInfo.height = static_cast<int32_t>(displayInfo->GetHeight());
1562 displays.push_back(castDisplayInfo);
1563 std::lock_guard displayListenerLockGuard(displayListenerLock_);
1564 if (displayListener_ != nullptr) {
1565 displayListener_->SetDisplayInfo(displayInfo);
1566 }
1567 }
1568 }
1569 castDisplays = displays;
1570 SLOGI("GetAllCastDisplays out");
1571 return AVSESSION_SUCCESS;
1572 }
1573
SetExtrasInner(AAFwk::IArray * list)1574 void AVSessionItem::SetExtrasInner(AAFwk::IArray* list)
1575 {
1576 auto func = [this](AAFwk::IInterface* object) {
1577 if (object != nullptr) {
1578 AAFwk::IString* stringValue = AAFwk::IString::Query(object);
1579 if (stringValue != nullptr && AAFwk::String::Unbox(stringValue) == "url-cast" &&
1580 descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO && serviceCallbackForStream_) {
1581 SLOGI("AVSessionItem send mirrortostream event to service");
1582 serviceCallbackForStream_(GetSessionId());
1583 }
1584 }
1585 };
1586 AAFwk::Array::ForEach(list, func);
1587 }
1588
SetServiceCallbackForStream(const std::function<void (std::string)> & callback)1589 void AVSessionItem::SetServiceCallbackForStream(const std::function<void(std::string)>& callback)
1590 {
1591 SLOGI("SetServiceCallbackForStream in");
1592 serviceCallbackForStream_ = callback;
1593 }
1594
SetServiceCallbackForCastNtfCapsule(const std::function<void (std::string,bool,bool)> & callback)1595 void AVSessionItem::SetServiceCallbackForCastNtfCapsule(const std::function<void(std::string, bool, bool)>& callback)
1596 {
1597 SLOGI("SetServiceCallbackForCastNtfCapsule in");
1598 serviceCallbackForCastNtf_ = callback;
1599 }
1600 #endif
1601
SetServiceCallbackForUpdateExtras(const std::function<void (std::string)> & callback)1602 void AVSessionItem::SetServiceCallbackForUpdateExtras(const std::function<void(std::string)>& callback)
1603 {
1604 SLOGI("SetServiceCallbackForUpdateExtras in");
1605 updateExtrasCallback_ = callback;
1606 }
1607
GetDescriptor()1608 AVSessionDescriptor AVSessionItem::GetDescriptor()
1609 {
1610 return descriptor_;
1611 }
1612
GetAVCallState()1613 AVCallState AVSessionItem::GetAVCallState()
1614 {
1615 std::lock_guard lockGuard(avsessionItemLock_);
1616 return avCallState_;
1617 }
1618
GetAVCallMetaData()1619 AVCallMetaData AVSessionItem::GetAVCallMetaData()
1620 {
1621 std::lock_guard lockGuard(avsessionItemLock_);
1622 std::string sessionId = GetSessionId();
1623 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
1624 std::string fileName = sessionId + AVSessionUtils::GetFileSuffix();
1625 std::shared_ptr<AVSessionPixelMap> innerPixelMap = avCallMetaData_.GetMediaImage();
1626 AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, fileName);
1627 return avCallMetaData_;
1628 }
1629
1630
GetPlaybackState()1631 AVPlaybackState AVSessionItem::GetPlaybackState()
1632 {
1633 std::lock_guard lockGuard(avsessionItemLock_);
1634 return playbackState_;
1635 }
1636
GetMetaDataWithoutImg()1637 AVMetaData AVSessionItem::GetMetaDataWithoutImg()
1638 {
1639 std::lock_guard lockGuard(avsessionItemLock_);
1640 return metaData_;
1641 }
1642
GetMetaData()1643 AVMetaData AVSessionItem::GetMetaData()
1644 {
1645 std::lock_guard lockGuard(avsessionItemLock_);
1646 std::string sessionId = GetSessionId();
1647 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
1648 std::string fileName = sessionId + AVSessionUtils::GetFileSuffix();
1649 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
1650 AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, fileName);
1651
1652 std::string avQueueFileDir = AVSessionUtils::GetFixedPathName(userId_);
1653 std::string avQueueFileName = GetBundleName() + "_" + metaData_.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
1654 std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaData_.GetAVQueueImage();
1655 AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFileDir, avQueueFileName);
1656 return metaData_;
1657 }
1658
GetQueueItems()1659 std::vector<AVQueueItem> AVSessionItem::GetQueueItems()
1660 {
1661 std::lock_guard lock_guard(avsessionItemLock_);
1662 return queueItems_;
1663 }
1664
GetQueueTitle()1665 std::string AVSessionItem::GetQueueTitle()
1666 {
1667 std::lock_guard lockGuard(avsessionItemLock_);
1668 return queueTitle_;
1669 }
1670
GetSupportCommand()1671 std::vector<int32_t> AVSessionItem::GetSupportCommand()
1672 {
1673 std::lock_guard lockGuard(avsessionItemLock_);
1674 if (descriptor_.elementName_.GetBundleName() == "castBundleName"
1675 && descriptor_.elementName_.GetAbilityName() == "castAbilityName") {
1676 std::vector<int32_t> supportedCmdForCastSession {
1677 AVControlCommand::SESSION_CMD_PLAY,
1678 AVControlCommand::SESSION_CMD_PAUSE,
1679 AVControlCommand::SESSION_CMD_STOP,
1680 AVControlCommand::SESSION_CMD_PLAY_NEXT,
1681 AVControlCommand::SESSION_CMD_PLAY_PREVIOUS,
1682 AVControlCommand::SESSION_CMD_SEEK
1683 };
1684 return supportedCmdForCastSession;
1685 }
1686 return supportedCmd_;
1687 }
1688
SetSupportCommand(std::vector<int32_t> cmds)1689 void AVSessionItem::SetSupportCommand(std::vector<int32_t> cmds)
1690 {
1691 {
1692 std::lock_guard lockGuard(avsessionItemLock_);
1693 supportedCmd_ = cmds;
1694 }
1695 std::string apiParamString = "cmd num:" + std::to_string(cmds.size());
1696 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
1697 "API_NAME", "SetSupportCommand",
1698 "BUNDLE_NAME", GetBundleName(),
1699 "SESSION_ID", AVSessionUtils::GetAnonySessionId(GetSessionId()),
1700 "SESSION_TAG", descriptor_.sessionTag_,
1701 "SESSION_TYPE", GetSessionType(),
1702 "API_PARAM", apiParamString,
1703 "ERROR_CODE", AVSESSION_SUCCESS,
1704 "ERROR_MSG", "SUCCESS");
1705 ProcessFrontSession("SetSupportCommand");
1706
1707 {
1708 std::lock_guard controllerLockGuard(controllersLock_);
1709 SLOGI("send add command event to controller, size:%{public}d", static_cast<int>(controllers_.size()));
1710 for (const auto& [pid, controller] : controllers_) {
1711 if (controller != nullptr) {
1712 controller->HandleValidCommandChange(supportedCmd_);
1713 }
1714 }
1715 }
1716 }
1717
GetLaunchAbility()1718 AbilityRuntime::WantAgent::WantAgent AVSessionItem::GetLaunchAbility()
1719 {
1720 return launchAbility_;
1721 }
1722
GetExtras()1723 AAFwk::WantParams AVSessionItem::GetExtras()
1724 {
1725 std::lock_guard lockGuard(avsessionItemLock_);
1726 return extras_;
1727 }
1728
NotificationExtras(AAFwk::IArray * list)1729 void AVSessionItem::NotificationExtras(AAFwk::IArray* list)
1730 {
1731 auto func = [this](AAFwk::IInterface* object) {
1732 if (object != nullptr) {
1733 AAFwk::IBoolean* booleanValue = AAFwk::IBoolean::Query(object);
1734 if (booleanValue != nullptr && AAFwk::Boolean ::Unbox(booleanValue)) {
1735 isNotShowNotification_ = true;
1736 } else {
1737 isNotShowNotification_ = false;
1738 }
1739 }
1740 };
1741 AAFwk::Array::ForEach(list, func);
1742 if (updateExtrasCallback_) {
1743 updateExtrasCallback_(GetSessionId());
1744 }
1745 }
1746
KeyEventExtras(AAFwk::IArray * list)1747 void AVSessionItem::KeyEventExtras(AAFwk::IArray* list)
1748 {
1749 auto func = [this](AAFwk::IInterface* object) {
1750 if (object != nullptr) {
1751 AAFwk::IBoolean* booleanValue = AAFwk::IBoolean::Query(object);
1752 if (booleanValue != nullptr && AAFwk::Boolean::Unbox(booleanValue) &&
1753 serviceCallbackForKeyEvent_) {
1754 SLOGI("AVSessionItem send addkeyeventsession event to service");
1755 serviceCallbackForKeyEvent_(GetSessionId());
1756 }
1757 }
1758 };
1759 AAFwk::Array::ForEach(list, func);
1760 }
1761
IsNotShowNotification()1762 bool AVSessionItem::IsNotShowNotification()
1763 {
1764 return isNotShowNotification_;
1765 }
1766
HandleMediaKeyEvent(const MMI::KeyEvent & keyEvent)1767 void AVSessionItem::HandleMediaKeyEvent(const MMI::KeyEvent& keyEvent)
1768 {
1769 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnMediaKeyEvent");
1770 CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactive");
1771 SLOGI("HandleMediaKeyEvent check isMediaKeySupport %{public}d for %{public}d",
1772 static_cast<int>(isMediaKeySupport), static_cast<int>(keyEvent.GetKeyCode()));
1773 if (!isMediaKeySupport && keyEventCaller_.count(keyEvent.GetKeyCode()) > 0) {
1774 AVControlCommand cmd;
1775 cmd.SetRewindTime(metaData_.GetSkipIntervals());
1776 cmd.SetForwardTime(metaData_.GetSkipIntervals());
1777 keyEventCaller_[keyEvent.GetKeyCode()](cmd);
1778 } else {
1779 std::lock_guard callbackLockGuard(callbackLock_);
1780 if (callback_ != nullptr) {
1781 callback_->OnMediaKeyEvent(keyEvent);
1782 }
1783 }
1784 }
1785
ExecuteControllerCommand(const AVControlCommand & cmd)1786 void AVSessionItem::ExecuteControllerCommand(const AVControlCommand& cmd)
1787 {
1788 HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_ALL_CTRL_COMMAND);
1789 int32_t code = cmd.GetCommand();
1790 if (code < 0 || code >= SESSION_CMD_MAX) {
1791 SLOGE("controlCommand invalid");
1792 return;
1793 }
1794 SLOGI("ExecuteControllerCommand code %{public}d from pid %{public}d to pid %{public}d",
1795 code, static_cast<int>(GetCallingPid()), static_cast<int>(GetPid()));
1796 {
1797 std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
1798 if (remoteSink_ != nullptr) {
1799 SLOGI("set remote ControlCommand");
1800 CHECK_AND_RETURN_LOG(remoteSink_->SetControlCommand(cmd) == AVSESSION_SUCCESS, "SetControlCommand failed");
1801 }
1802 }
1803 CHECK_AND_RETURN_LOG(callback_ != nullptr || callbackForMigrate_ != nullptr,
1804 "callback_ or callbackForMigrate_ is nullptr");
1805 CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactivate");
1806
1807 HISYSEVENT_ADD_OPERATION_COUNT(static_cast<Operation>(cmd.GetCommand()));
1808 HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_SUCCESS_CTRL_COMMAND);
1809 HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(descriptor_.elementName_.GetBundleName(), GetPid(),
1810 cmd.GetCommand(), descriptor_.sessionType_);
1811 return cmdHandlers[code](cmd);
1812
1813 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "INVALID_COMMAND", "CMD", code,
1814 "ERROR_INFO", "avsessionitem executecontrollercommand, invaild command");
1815 }
1816 // LCOV_EXCL_STOP
1817
ExecueCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)1818 void AVSessionItem::ExecueCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
1819 {
1820 AVSESSION_TRACE_SYNC_START("AVSessionItem::ExecueCommonCommand");
1821 {
1822 std::lock_guard callbackLockGuard(callbackLock_);
1823 if (callbackForMigrate_) {
1824 callbackForMigrate_->OnCommonCommand(commonCommand, commandArgs);
1825 }
1826 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1827 callback_->OnCommonCommand(commonCommand, commandArgs);
1828 }
1829
1830 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
1831 if (remoteSink_ != nullptr) {
1832 CHECK_AND_RETURN_LOG(remoteSink_->SetCommonCommand(commonCommand, commandArgs) == AVSESSION_SUCCESS,
1833 "SetCommonCommand failed");
1834 }
1835 }
1836
1837 // LCOV_EXCL_START
HandleSkipToQueueItem(const int32_t & itemId)1838 void AVSessionItem::HandleSkipToQueueItem(const int32_t& itemId)
1839 {
1840 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSkipToQueueItem");
1841 std::lock_guard callbackLockGuard(callbackLock_);
1842 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1843 callback_->OnSkipToQueueItem(itemId);
1844 }
1845
HandleOnAVCallAnswer(const AVControlCommand & cmd)1846 void AVSessionItem::HandleOnAVCallAnswer(const AVControlCommand& cmd)
1847 {
1848 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallAnswer");
1849 std::lock_guard callbackLockGuard(callbackLock_);
1850 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1851 callback_->OnAVCallAnswer();
1852 }
1853
HandleOnAVCallHangUp(const AVControlCommand & cmd)1854 void AVSessionItem::HandleOnAVCallHangUp(const AVControlCommand& cmd)
1855 {
1856 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallHangUp");
1857 std::lock_guard callbackLockGuard(callbackLock_);
1858 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1859 callback_->OnAVCallHangUp();
1860 }
1861
HandleOnAVCallToggleCallMute(const AVControlCommand & cmd)1862 void AVSessionItem::HandleOnAVCallToggleCallMute(const AVControlCommand& cmd)
1863 {
1864 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallToggleCallMute");
1865 std::lock_guard callbackLockGuard(callbackLock_);
1866 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1867 callback_->OnAVCallToggleCallMute();
1868 }
1869
HandleOnPlay(const AVControlCommand & cmd)1870 void AVSessionItem::HandleOnPlay(const AVControlCommand& cmd)
1871 {
1872 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlay");
1873 std::lock_guard callbackLockGuard(callbackLock_);
1874 if (callbackForMigrate_) {
1875 callbackForMigrate_->OnPlay();
1876 }
1877 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1878 callback_->OnPlay();
1879 }
1880
HandleOnPause(const AVControlCommand & cmd)1881 void AVSessionItem::HandleOnPause(const AVControlCommand& cmd)
1882 {
1883 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPause");
1884 std::lock_guard callbackLockGuard(callbackLock_);
1885 if (callbackForMigrate_) {
1886 callbackForMigrate_->OnPause();
1887 }
1888 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1889 callback_->OnPause();
1890 }
1891
HandleOnPlayOrPause(const AVControlCommand & cmd)1892 void AVSessionItem::HandleOnPlayOrPause(const AVControlCommand& cmd)
1893 {
1894 std::lock_guard lockGuard(avsessionItemLock_);
1895 SLOGI("check current playstate : %{public}d", playbackState_.GetState());
1896 if (playbackState_.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAY) {
1897 HandleOnPause(cmd);
1898 } else {
1899 HandleOnPlay(cmd);
1900 }
1901 }
1902
HandleOnStop(const AVControlCommand & cmd)1903 void AVSessionItem::HandleOnStop(const AVControlCommand& cmd)
1904 {
1905 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnStop");
1906 std::lock_guard callbackLockGuard(callbackLock_);
1907 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1908 callback_->OnStop();
1909 }
1910
HandleOnPlayNext(const AVControlCommand & cmd)1911 void AVSessionItem::HandleOnPlayNext(const AVControlCommand& cmd)
1912 {
1913 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayNext");
1914 std::lock_guard callbackLockGuard(callbackLock_);
1915 if (callbackForMigrate_) {
1916 callbackForMigrate_->OnPlayNext();
1917 }
1918 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1919 callback_->OnPlayNext();
1920 }
1921
HandleOnPlayPrevious(const AVControlCommand & cmd)1922 void AVSessionItem::HandleOnPlayPrevious(const AVControlCommand& cmd)
1923 {
1924 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayPrevious");
1925 std::lock_guard callbackLockGuard(callbackLock_);
1926 if (callbackForMigrate_) {
1927 callbackForMigrate_->OnPlayPrevious();
1928 }
1929 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1930 callback_->OnPlayPrevious();
1931 }
1932
HandleOnFastForward(const AVControlCommand & cmd)1933 void AVSessionItem::HandleOnFastForward(const AVControlCommand& cmd)
1934 {
1935 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnFastForward");
1936 std::lock_guard callbackLockGuard(callbackLock_);
1937 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1938 int64_t time = 0;
1939 CHECK_AND_RETURN_LOG(cmd.GetForwardTime(time) == AVSESSION_SUCCESS, "GetForwardTime failed");
1940 callback_->OnFastForward(time);
1941 }
1942
HandleOnRewind(const AVControlCommand & cmd)1943 void AVSessionItem::HandleOnRewind(const AVControlCommand& cmd)
1944 {
1945 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnRewind");
1946 std::lock_guard callbackLockGuard(callbackLock_);
1947 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1948 int64_t time = 0;
1949 CHECK_AND_RETURN_LOG(cmd.GetRewindTime(time) == AVSESSION_SUCCESS, "GetForwardTime failed");
1950 callback_->OnRewind(time);
1951 }
1952
HandleOnSeek(const AVControlCommand & cmd)1953 void AVSessionItem::HandleOnSeek(const AVControlCommand& cmd)
1954 {
1955 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSeek");
1956 std::lock_guard callbackLockGuard(callbackLock_);
1957 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1958 int64_t time = 0;
1959 CHECK_AND_RETURN_LOG(cmd.GetSeekTime(time) == AVSESSION_SUCCESS, "GetSeekTime failed");
1960 callback_->OnSeek(time);
1961 }
1962
HandleOnSetSpeed(const AVControlCommand & cmd)1963 void AVSessionItem::HandleOnSetSpeed(const AVControlCommand& cmd)
1964 {
1965 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetSpeed");
1966 std::lock_guard callbackLockGuard(callbackLock_);
1967 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1968 double speed = 0.0;
1969 CHECK_AND_RETURN_LOG(cmd.GetSpeed(speed) == AVSESSION_SUCCESS, "GetSpeed failed");
1970 callback_->OnSetSpeed(speed);
1971 }
1972
HandleOnSetLoopMode(const AVControlCommand & cmd)1973 void AVSessionItem::HandleOnSetLoopMode(const AVControlCommand& cmd)
1974 {
1975 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetLoopMode");
1976 std::lock_guard callbackLockGuard(callbackLock_);
1977 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1978 int32_t loopMode = AVSESSION_ERROR;
1979 CHECK_AND_RETURN_LOG(cmd.GetLoopMode(loopMode) == AVSESSION_SUCCESS, "GetLoopMode failed");
1980 callback_->OnSetLoopMode(loopMode);
1981 }
1982
HandleOnSetTargetLoopMode(const AVControlCommand & cmd)1983 void AVSessionItem::HandleOnSetTargetLoopMode(const AVControlCommand& cmd)
1984 {
1985 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetTargetLoopMode");
1986 std::lock_guard callbackLockGuard(callbackLock_);
1987 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1988 int32_t targetLoopMode = AVSESSION_ERROR;
1989 CHECK_AND_RETURN_LOG(cmd.GetTargetLoopMode(targetLoopMode) == AVSESSION_SUCCESS, "GetTargetLoopMode failed");
1990 callback_->OnSetTargetLoopMode(targetLoopMode);
1991 }
1992
HandleOnToggleFavorite(const AVControlCommand & cmd)1993 void AVSessionItem::HandleOnToggleFavorite(const AVControlCommand& cmd)
1994 {
1995 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnToggleFavorite");
1996 std::lock_guard callbackLockGuard(callbackLock_);
1997 std::string assetId;
1998 CHECK_AND_RETURN_LOG(cmd.GetAssetId(assetId) == AVSESSION_SUCCESS, "GetMediaId failed");
1999 if (callbackForMigrate_) {
2000 callbackForMigrate_->OnToggleFavorite(assetId);
2001 }
2002 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2003 callback_->OnToggleFavorite(assetId);
2004 }
2005
HandleOnPlayFromAssetId(const AVControlCommand & cmd)2006 void AVSessionItem::HandleOnPlayFromAssetId(const AVControlCommand& cmd)
2007 {
2008 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayFromAssetId");
2009 std::lock_guard callbackLockGuard(callbackLock_);
2010 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2011 int64_t assetId = 0;
2012 CHECK_AND_RETURN_LOG(cmd.GetPlayFromAssetId(assetId) == AVSESSION_SUCCESS, "Get playFromAssetId failed");
2013 callback_->OnPlayFromAssetId(assetId);
2014 }
2015 // LCOV_EXCL_STOP
2016
AddController(pid_t pid,sptr<AVControllerItem> & controller)2017 int32_t AVSessionItem::AddController(pid_t pid, sptr<AVControllerItem>& controller)
2018 {
2019 std::lock_guard controllersLockGuard(controllersLock_);
2020 SLOGI("handle controller newup for pid: %{public}d", static_cast<int>(pid));
2021 controllers_.insert({pid, controller});
2022 return AVSESSION_SUCCESS;
2023 }
2024
SetPid(pid_t pid)2025 void AVSessionItem::SetPid(pid_t pid)
2026 {
2027 descriptor_.pid_ = pid;
2028 }
2029
SetUid(pid_t uid)2030 void AVSessionItem::SetUid(pid_t uid)
2031 {
2032 descriptor_.uid_ = uid;
2033 }
2034
GetPid() const2035 pid_t AVSessionItem::GetPid() const
2036 {
2037 return descriptor_.pid_;
2038 }
2039
GetUid() const2040 pid_t AVSessionItem::GetUid() const
2041 {
2042 return descriptor_.uid_;
2043 }
2044
GetUserId() const2045 int32_t AVSessionItem::GetUserId() const
2046 {
2047 return userId_;
2048 }
2049
GetAbilityName() const2050 std::string AVSessionItem::GetAbilityName() const
2051 {
2052 return descriptor_.elementName_.GetAbilityName();
2053 }
2054
2055 // LCOV_EXCL_START
GetBundleName() const2056 std::string AVSessionItem::GetBundleName() const
2057 {
2058 return descriptor_.elementName_.GetBundleName();
2059 }
2060 // LCOV_EXCL_STOP
2061
SetTop(bool top)2062 void AVSessionItem::SetTop(bool top)
2063 {
2064 descriptor_.isTopSession_ = top;
2065 }
2066
GetRemoteSource()2067 std::shared_ptr<RemoteSessionSource> AVSessionItem::GetRemoteSource()
2068 {
2069 return remoteSource_;
2070 }
2071
HandleControllerRelease(pid_t pid)2072 void AVSessionItem::HandleControllerRelease(pid_t pid)
2073 {
2074 std::lock_guard controllersLockGuard(controllersLock_);
2075 SLOGI("handle controller release for pid: %{public}d", static_cast<int>(pid));
2076 controllers_.erase(pid);
2077 }
2078
SetServiceCallbackForRelease(const std::function<void (AVSessionItem &)> & callback)2079 void AVSessionItem::SetServiceCallbackForRelease(const std::function<void(AVSessionItem&)>& callback)
2080 {
2081 SLOGI("SetServiceCallbackForRelease in");
2082 serviceCallback_ = callback;
2083 }
2084
SetServiceCallbackForAVQueueInfo(const std::function<void (AVSessionItem &)> & callback)2085 void AVSessionItem::SetServiceCallbackForAVQueueInfo(const std::function<void(AVSessionItem&)>& callback)
2086 {
2087 SLOGI("SetServiceCallbackForAVQueueInfo in");
2088 serviceCallbackForAddAVQueueInfo_ = callback;
2089 }
2090
SetServiceCallbackForCallStart(const std::function<void (AVSessionItem &)> & callback)2091 void AVSessionItem::SetServiceCallbackForCallStart(const std::function<void(AVSessionItem&)>& callback)
2092 {
2093 SLOGI("SetServiceCallbackForCallStart in");
2094 callStartCallback_ = callback;
2095 }
2096
SetServiceCallbackForUpdateSession(const std::function<void (std::string,bool)> & callback)2097 void AVSessionItem::SetServiceCallbackForUpdateSession(const std::function<void(std::string, bool)>& callback)
2098 {
2099 SLOGI("SetServiceCallbackForUpdateSession in");
2100 serviceCallbackForUpdateSession_ = callback;
2101 }
2102
SetServiceCallbackForKeyEvent(const std::function<void (std::string)> & callback)2103 void AVSessionItem::SetServiceCallbackForKeyEvent(const std::function<void(std::string)>& callback)
2104 {
2105 SLOGI("SetServiceCallbackForKeyEvent in");
2106 serviceCallbackForKeyEvent_ = callback;
2107 }
2108
SetServiceCallbackForNtfCapsule(const std::function<void (std::string,bool)> & callback)2109 void AVSessionItem::SetServiceCallbackForNtfCapsule(const std::function<void(std::string, bool)>& callback)
2110 {
2111 SLOGI("SetServiceCallbackForNtfCapsule in");
2112 serviceCallbackForNtf_ = callback;
2113 }
2114
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)2115 void AVSessionItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
2116 {
2117 SLOGI("output device change, connection state is %{public}d", connectionState);
2118 AVSESSION_TRACE_SYNC_START("AVSessionItem::OnOutputDeviceChange");
2119 std::lock_guard callbackLockGuard(callbackLock_);
2120 CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
2121 callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
2122 }
2123
SetOutputDevice(const OutputDeviceInfo & info)2124 void AVSessionItem::SetOutputDevice(const OutputDeviceInfo& info)
2125 {
2126 descriptor_.outputDeviceInfo_ = info;
2127 int32_t connectionStateConnected = 1;
2128 HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
2129 std::lock_guard controllersLockGuard(controllersLock_);
2130 CHECK_AND_RETURN_LOG(controllers_.size() > 0, "handle with no controller, return");
2131 for (const auto& controller : controllers_) {
2132 if (controller.second != nullptr) {
2133 (controller.second)->HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
2134 }
2135 }
2136 SLOGI("OutputDeviceInfo device size is %{public}d", static_cast<int32_t>(info.deviceInfos_.size()));
2137 }
2138
2139 // LCOV_EXCL_START
GetOutputDevice(OutputDeviceInfo & info)2140 void AVSessionItem::GetOutputDevice(OutputDeviceInfo& info)
2141 {
2142 info = GetDescriptor().outputDeviceInfo_;
2143 }
2144
CastAudioToRemote(const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sinkCapability)2145 int32_t AVSessionItem::CastAudioToRemote(const std::string& sourceDevice, const std::string& sinkDevice,
2146 const std::string& sinkCapability)
2147 {
2148 SLOGI("start cast audio to remote");
2149 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
2150 remoteSource_ = std::make_shared<RemoteSessionSourceProxy>();
2151 CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
2152 int32_t ret = remoteSource_->CastSessionToRemote(this, sourceDevice, sinkDevice, sinkCapability);
2153 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionToRemote failed");
2154 ret = remoteSource_->SetAVMetaData(GetMetaData());
2155 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
2156 ret = remoteSource_->SetAVPlaybackState(GetPlaybackState());
2157 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVPlaybackState failed");
2158 return AVSESSION_SUCCESS;
2159 }
2160
SourceCancelCastAudio(const std::string & sinkDevice)2161 int32_t AVSessionItem::SourceCancelCastAudio(const std::string& sinkDevice)
2162 {
2163 SLOGI("start cancel cast audio");
2164 std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
2165 CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
2166 int32_t ret = remoteSource_->CancelCastAudio(sinkDevice);
2167 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioToLocal failed");
2168 return AVSESSION_SUCCESS;
2169 }
2170
CastAudioFromRemote(const std::string & sourceSessionId,const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sourceCapability)2171 int32_t AVSessionItem::CastAudioFromRemote(const std::string& sourceSessionId, const std::string& sourceDevice,
2172 const std::string& sinkDevice, const std::string& sourceCapability)
2173 {
2174 SLOGI("start cast audio from remote");
2175 std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
2176 remoteSink_ = std::make_shared<RemoteSessionSinkProxy>();
2177 CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
2178 int32_t ret = remoteSink_->CastSessionFromRemote(this, sourceSessionId, sourceDevice, sinkDevice,
2179 sourceCapability);
2180 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionFromRemote failed");
2181
2182 OutputDeviceInfo outputDeviceInfo;
2183 GetOutputDevice(outputDeviceInfo);
2184 int32_t castCategoryStreaming = ProtocolType::TYPE_CAST_PLUS_STREAM;
2185 for (size_t i = 0; i < outputDeviceInfo.deviceInfos_.size(); i++) {
2186 outputDeviceInfo.deviceInfos_[i].castCategory_ = castCategoryStreaming;
2187 }
2188 SetOutputDevice(outputDeviceInfo);
2189
2190 CHECK_AND_RETURN_RET_LOG(Activate() == AVSESSION_SUCCESS, AVSESSION_ERROR, "Activate failed");
2191
2192 std::vector<std::vector<int32_t>> value(SESSION_DATA_CATEGORY_MAX);
2193 ret = JsonUtils::GetVectorCapability(sourceCapability, value);
2194 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetVectorCapability error");
2195 for (auto cmd : value[SESSION_DATA_CONTROL_COMMAND]) {
2196 ret = AddSupportCommand(cmd);
2197 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "AddSupportCommand failed");
2198 }
2199 return AVSESSION_SUCCESS;
2200 }
2201
SinkCancelCastAudio()2202 int32_t AVSessionItem::SinkCancelCastAudio()
2203 {
2204 std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
2205 CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
2206 int32_t ret = remoteSink_->CancelCastSession();
2207 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CancelCastSession failed");
2208 GetDescriptor().outputDeviceInfo_.deviceInfos_.clear();
2209 DeviceInfo deviceInfo;
2210 GetDescriptor().outputDeviceInfo_.deviceInfos_.emplace_back(deviceInfo);
2211 SLOGI("SinkCancelCastAudio");
2212 return AVSESSION_SUCCESS;
2213 }
2214
2215 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
UpdateCastDeviceMap(DeviceInfo deviceInfo)2216 void AVSessionItem::UpdateCastDeviceMap(DeviceInfo deviceInfo)
2217 {
2218 SLOGI("UpdateCastDeviceMap with id: %{public}s", deviceInfo.deviceId_.c_str());
2219 castDeviceInfoMap_[deviceInfo.deviceId_] = deviceInfo;
2220
2221 if (descriptor_.outputDeviceInfo_.deviceInfos_.size() > 0 &&
2222 descriptor_.outputDeviceInfo_.deviceInfos_[0].deviceId_ == deviceInfo.deviceId_) {
2223 OutputDeviceInfo outputDeviceInfo;
2224 outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
2225 descriptor_.outputDeviceInfo_ = outputDeviceInfo;
2226 }
2227 }
2228 #endif
2229
ReportConnectFinish(const std::string func,const DeviceInfo & deviceInfo)2230 void AVSessionItem::ReportConnectFinish(const std::string func, const DeviceInfo &deviceInfo)
2231 {
2232 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2233 AVSessionRadarInfo info(func);
2234 if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
2235 DeviceInfo cacheDeviceInfo = castDeviceInfoMap_[deviceInfo.deviceId_];
2236 AVSessionRadar::GetInstance().ConnectFinish(cacheDeviceInfo, info);
2237 } else {
2238 AVSessionRadar::GetInstance().ConnectFinish(deviceInfo, info);
2239 }
2240 #endif
2241 }
2242
ReportStopCastFinish(const std::string func,const DeviceInfo & deviceInfo)2243 void AVSessionItem::ReportStopCastFinish(const std::string func, const DeviceInfo &deviceInfo)
2244 {
2245 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2246 AVSessionRadarInfo info(func);
2247 if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
2248 DeviceInfo cacheDeviceInfo = castDeviceInfoMap_[deviceInfo.deviceId_];
2249 AVSessionRadar::GetInstance().StopCastFinish(cacheDeviceInfo, info);
2250 } else {
2251 AVSessionRadar::GetInstance().StopCastFinish(deviceInfo, info);
2252 }
2253 #endif
2254 }
2255
SaveLocalDeviceInfo()2256 void AVSessionItem::SaveLocalDeviceInfo()
2257 {
2258 OutputDeviceInfo localDevice;
2259 DeviceInfo localInfo;
2260 localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
2261 localInfo.deviceId_ = "0";
2262 localInfo.deviceName_ = "LocalDevice";
2263 localDevice.deviceInfos_.emplace_back(localInfo);
2264 descriptor_.outputDeviceInfo_ = localDevice;
2265 }
2266
DoContinuousTaskRegister()2267 int32_t AVSessionItem::DoContinuousTaskRegister()
2268 {
2269 #ifdef EFFICIENCY_MANAGER_ENABLE
2270 if (descriptor_.sessionTag_ == "RemoteCast") {
2271 SLOGI("sink session no need to register continuousTask");
2272 return AVSESSION_SUCCESS;
2273 }
2274 int32_t uid = GetUid();
2275 int32_t pid = GetPid();
2276 std::string bundleName = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
2277 CHECK_AND_RETURN_RET_LOG(bundleName != "", AVSESSION_ERROR, "GetBundleNameFromUid failed");
2278
2279 void *handle_ = dlopen("libsuspend_manager_client.z.so", RTLD_NOW);
2280 if (handle_ == nullptr) {
2281 SLOGE("failed to open library libsuspend_manager_client reaseon %{public}s", dlerror());
2282 return AVSESSION_ERROR;
2283 }
2284 typedef ErrCode (*handler) (int32_t eventType, int32_t uid, int32_t pid,
2285 const std::string bundleName, int32_t taskState, int32_t serviceId);
2286 handler reportContinuousTaskEventEx = reinterpret_cast<handler>(dlsym(handle_, "ReportContinuousTaskEventEx"));
2287 ErrCode errCode = reportContinuousTaskEventEx(0, uid, pid, bundleName, 1, AVSESSION_SERVICE_ID);
2288 SLOGI("reportContinuousTaskEventEx done, result: %{public}d", errCode);
2289 #ifndef TEST_COVERAGE
2290 if (handle_ != nullptr) {
2291 OPENSSL_thread_stop();
2292 }
2293 dlclose(handle_);
2294 #endif
2295 #endif
2296 return AVSESSION_SUCCESS;
2297 }
2298
DoContinuousTaskUnregister()2299 int32_t AVSessionItem::DoContinuousTaskUnregister()
2300 {
2301 #ifdef EFFICIENCY_MANAGER_ENABLE
2302 if (descriptor_.sessionTag_ == "RemoteCast") {
2303 SLOGI("sink session should not unregister ContinuousTask");
2304 return AVSESSION_SUCCESS;
2305 }
2306 int32_t uid = GetUid();
2307 int32_t pid = GetPid();
2308 std::string bundleName = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
2309 CHECK_AND_RETURN_RET_LOG(bundleName != "", AVSESSION_ERROR, "GetBundleNameFromUid failed");
2310
2311 void *handle_ = dlopen("libsuspend_manager_client.z.so", RTLD_NOW);
2312 if (handle_ == nullptr) {
2313 SLOGE("failed to open library libsuspend_manager_client when stop cast, reaseon %{public}s", dlerror());
2314 return AVSESSION_ERROR;
2315 }
2316 typedef ErrCode (*handler) (int32_t eventType, int32_t uid, int32_t pid,
2317 const std::string bundleName, int32_t taskState, int32_t serviceId);
2318 handler reportContinuousTaskEventEx = reinterpret_cast<handler>(dlsym(handle_, "ReportContinuousTaskEventEx"));
2319 ErrCode errCode = reportContinuousTaskEventEx(0, uid, pid, bundleName, 2, AVSESSION_SERVICE_ID);
2320 SLOGI("reportContinuousTaskEventEx done when stop cast, result: %{public}d", errCode);
2321 #ifndef TEST_COVERAGE
2322 if (handle_ != nullptr) {
2323 OPENSSL_thread_stop();
2324 }
2325 dlclose(handle_);
2326 #endif
2327 #endif
2328 return AVSESSION_SUCCESS;
2329 }
2330
IsCasting()2331 bool AVSessionItem::IsCasting()
2332 {
2333 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2334 if (descriptor_.sessionTag_ != "RemoteCast" && castHandle_ > 0) {
2335 return true;
2336 }
2337 #endif
2338 return false;
2339 }
2340
GetCurrentCastItem(AVQueueItem & currentItem)2341 void AVSessionItem::GetCurrentCastItem(AVQueueItem& currentItem)
2342 {
2343 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2344 CHECK_AND_RETURN_LOG(castControllerProxy_ != nullptr, "cast controller proxy is nullptr");
2345 currentItem = castControllerProxy_->GetCurrentItem();
2346 #endif
2347 return;
2348 }
2349
GetCastAVPlaybackState()2350 AVPlaybackState AVSessionItem::GetCastAVPlaybackState()
2351 {
2352 AVPlaybackState playbackState;
2353 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2354 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, playbackState, "cast controller proxy is nullptr");
2355 auto ret = castControllerProxy_->GetCastAVPlaybackState(playbackState);
2356 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, playbackState, "getstate error");
2357 #endif
2358 return playbackState;
2359 }
2360
SendControlCommandToCast(AVCastControlCommand cmd)2361 void AVSessionItem::SendControlCommandToCast(AVCastControlCommand cmd)
2362 {
2363 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
2364 CHECK_AND_RETURN_LOG(castControllerProxy_ != nullptr, "cast controller proxy is nullptr");
2365 castControllerProxy_->SendControlCommand(cmd);
2366 #endif
2367 }
2368 // LCOV_EXCL_STOP
2369 } // namespace OHOS::AVSession
2370