• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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 "avsession_item.h"
32 
33 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
34 #include "avcast_controller_proxy.h"
35 #include "avcast_controller_item.h"
36 #endif
37 
38 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
39 #include <malloc.h>
40 #endif
41 
42 using namespace OHOS::AudioStandard;
43 
44 namespace OHOS::AVSession {
AVSessionItem(const AVSessionDescriptor & descriptor)45 AVSessionItem::AVSessionItem(const AVSessionDescriptor& descriptor)
46     : descriptor_(descriptor)
47 {
48     SLOGD("constructor id=%{public}s", AVSessionUtils::GetAnonySessionId(descriptor_.sessionId_).c_str());
49 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
50     cssListener_ = std::make_shared<CssListener>(this);
51 #endif
52 }
53 
~AVSessionItem()54 AVSessionItem::~AVSessionItem()
55 {
56     SLOGD("destroy id=%{public}s", AVSessionUtils::GetAnonySessionId(descriptor_.sessionId_).c_str());
57     std::lock_guard lockGuard(destroyLock_);
58 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
59     SLOGI("Session destroy with castHandle: %{public}ld", castHandle_);
60     if (descriptor_.sessionTag_ != "RemoteCast" && castHandle_ > 0) {
61         SLOGW("Session destroy at source, release cast");
62         AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_);
63         ReleaseCast();
64     }
65 #endif
66 }
67 
GetSessionId()68 std::string AVSessionItem::GetSessionId()
69 {
70     return descriptor_.sessionId_;
71 }
72 
GetSessionType()73 std::string AVSessionItem::GetSessionType()
74 {
75     if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VIDEO) {
76         return "video";
77     }
78     if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VOICE_CALL) {
79         return "voice_call";
80     }
81     return "audio";
82 }
83 
Destroy()84 int32_t AVSessionItem::Destroy()
85 {
86     {
87         std::lock_guard lockGuard(callbackLock_);
88         if (callback_) {
89             callback_.clear();
90         }
91     }
92     std::lock_guard lockGuard(destroyLock_);
93     if (isDestroyed_) {
94         SLOGE("return for already in destroy");
95         return AVSESSION_SUCCESS;
96     }
97     isDestroyed_ = true;
98     std::string sessionId = descriptor_.sessionId_;
99     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
100     AVSessionUtils::DeleteFile(fileName);
101     std::list<sptr<AVControllerItem>> controllerList;
102     {
103         std::lock_guard controllerLockGuard(controllersLock_);
104         SLOGI("to release controller list size: %{public}d", static_cast<int>(controllers_.size()));
105         for (auto it = controllers_.begin(); it != controllers_.end();) {
106             SLOGI("controller for pid: %{public}d", it->first);
107             controllerList.push_back(it->second);
108             controllers_.erase(it++);
109         }
110     }
111     SLOGD("Send session destroy event to controller");
112     for (auto& controller : controllerList) {
113         controller->HandleSessionDestroy();
114     }
115     SLOGI("AVSessionItem send service destroy event to service, check serviceCallback exist");
116     if (serviceCallback_) {
117         SLOGI("AVSessionItem send service destroy event to service");
118         serviceCallback_(*this);
119     }
120     SLOGI("Destroy success");
121     return AVSESSION_SUCCESS;
122 }
123 
SetAVCallMetaData(const AVCallMetaData & avCallMetaData)124 int32_t AVSessionItem::SetAVCallMetaData(const AVCallMetaData& avCallMetaData)
125 {
126     CHECK_AND_RETURN_RET_LOG(avCallMetaData_.CopyFrom(avCallMetaData), AVSESSION_ERROR, "AVCallMetaData set error");
127     std::shared_ptr<AVSessionPixelMap> innerPixelMap = avCallMetaData_.GetMediaImage();
128     if (innerPixelMap != nullptr) {
129         std::string sessionId = GetSessionId();
130         std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
131         AVSessionUtils::WriteImageToFile(innerPixelMap, fileName);
132         innerPixelMap->Clear();
133         avCallMetaData_.SetMediaImage(innerPixelMap);
134     }
135 
136     {
137         std::lock_guard controllerLockGuard(controllersLock_);
138         for (const auto& [pid, controller] : controllers_) {
139             controller->HandleAVCallMetaDataChange(avCallMetaData);
140         }
141     }
142     return AVSESSION_SUCCESS;
143 }
144 
SetAVCallState(const AVCallState & avCallState)145 int32_t AVSessionItem::SetAVCallState(const AVCallState& avCallState)
146 {
147     CHECK_AND_RETURN_RET_LOG(avCallState_.CopyFrom(avCallState), AVSESSION_ERROR, "AVCallState set error");
148     {
149         std::lock_guard controllerLockGuard(controllersLock_);
150         for (const auto& [pid, controller] : controllers_) {
151             SLOGI("pid=%{public}d", pid);
152             controller->HandleAVCallStateChange(avCallState);
153         }
154     }
155     return AVSESSION_SUCCESS;
156 }
157 
158 
GetAVMetaData(AVMetaData & meta)159 int32_t AVSessionItem::GetAVMetaData(AVMetaData& meta)
160 {
161     std::lock_guard lockGuard(metaDataLock_);
162     std::string sessionId = GetSessionId();
163     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
164     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
165     AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
166 
167     std::string avQueueFile = AVSessionUtils::GetFixedPathName() + GetBundleName() + "_" +
168         metaData_.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
169     std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaData_.GetAVQueueImage();
170     AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFile);
171 
172     meta = metaData_;
173     return AVSESSION_SUCCESS;
174 }
175 
HasAvQueueInfo()176 bool AVSessionItem::HasAvQueueInfo()
177 {
178     return !metaData_.GetAVQueueName().empty() && !metaData_.GetAVQueueId().empty() &&
179         (metaData_.GetAVQueueImage() != nullptr || !metaData_.GetAVQueueImageUri().empty()) &&
180         playbackState_.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAY;
181 }
182 
SetAVMetaData(const AVMetaData & meta)183 int32_t AVSessionItem::SetAVMetaData(const AVMetaData& meta)
184 {
185     std::lock_guard lockGuard(metaDataLock_);
186     CHECK_AND_RETURN_RET_LOG(metaData_.CopyFrom(meta), AVSESSION_ERROR, "AVMetaData set error");
187     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
188     if (innerPixelMap != nullptr) {
189         std::string sessionId = GetSessionId();
190         std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
191         AVSessionUtils::WriteImageToFile(innerPixelMap, fileName);
192         innerPixelMap->Clear();
193         metaData_.SetMediaImage(innerPixelMap);
194     }
195 
196     if (HasAvQueueInfo() && serviceCallbackForAddAVQueueInfo_) {
197         SLOGD(" SetAVMetaData AVQueueName: %{public}s AVQueueId: %{public}s", metaData_.GetAVQueueName().c_str(),
198             metaData_.GetAVQueueId().c_str());
199         serviceCallbackForAddAVQueueInfo_(*this);
200     }
201 
202     SLOGD("send metadata change event to controllers");
203     {
204         std::lock_guard controllerLockGuard(controllersLock_);
205         for (const auto& [pid, controller] : controllers_) {
206             controller->HandleMetaDataChange(meta);
207         }
208     }
209     SLOGI("send metadata change event to controllers done");
210     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
211     if (remoteSource_ != nullptr) {
212         SLOGI("set remote AVMetaData");
213         auto ret = remoteSource_->SetAVMetaData(meta);
214         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
215     }
216     return AVSESSION_SUCCESS;
217 }
218 
GetAVQueueItems(std::vector<AVQueueItem> & items)219 int32_t AVSessionItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
220 {
221     std::lock_guard queueItemsLockGuard(queueItemsLock_);
222     items = queueItems_;
223     return AVSESSION_SUCCESS;
224 }
225 
SetAVQueueItems(const std::vector<AVQueueItem> & items)226 int32_t AVSessionItem::SetAVQueueItems(const std::vector<AVQueueItem>& items)
227 {
228     {
229         std::lock_guard queueItemsLockGuard(queueItemsLock_);
230         queueItems_ = items;
231     }
232     {
233         std::lock_guard controllerLockGuard(controllersLock_);
234         for (const auto& [pid, controller] : controllers_) {
235             controller->HandleQueueItemsChange(items);
236         }
237     }
238     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
239     if (remoteSource_ != nullptr) {
240         SLOGI("set remote AVQueueItems");
241         auto ret = remoteSource_->SetAVQueueItems(items);
242         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueItems failed");
243     }
244     return AVSESSION_SUCCESS;
245 }
246 
GetAVQueueTitle(std::string & title)247 int32_t AVSessionItem::GetAVQueueTitle(std::string& title)
248 {
249     title = queueTitle_;
250     return AVSESSION_SUCCESS;
251 }
252 
SetAVQueueTitle(const std::string & title)253 int32_t AVSessionItem::SetAVQueueTitle(const std::string& title)
254 {
255     queueTitle_ = title;
256 
257     {
258         std::lock_guard controllerLockGuard(controllersLock_);
259         for (const auto& [pid, controller] : controllers_) {
260             controller->HandleQueueTitleChange(title);
261         }
262     }
263     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
264     if (remoteSource_ != nullptr) {
265         SLOGI("set remote AVQueueTitle");
266         auto ret = remoteSource_->SetAVQueueTitle(title);
267         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVQueueTitle failed");
268     }
269     return AVSESSION_SUCCESS;
270 }
271 
SetAVPlaybackState(const AVPlaybackState & state)272 int32_t AVSessionItem::SetAVPlaybackState(const AVPlaybackState& state)
273 {
274     CHECK_AND_RETURN_RET_LOG(playbackState_.CopyFrom(state), AVSESSION_ERROR, "AVPlaybackState set error");
275 
276     if (HasAvQueueInfo() && serviceCallbackForAddAVQueueInfo_) {
277         SLOGD(" SetAVPlaybackState AVQueueName: %{public}s AVQueueId: %{public}s", metaData_.GetAVQueueName().c_str(),
278             metaData_.GetAVQueueId().c_str());
279         std::lock_guard lockGuard(metaDataLock_);
280         SLOGI("set metaDataLock for getmetadata in service");
281         serviceCallbackForAddAVQueueInfo_(*this);
282     }
283 
284     SLOGI("send playbackstate change event to controllers with state: %{public}d", state.GetState());
285     {
286         std::lock_guard controllerLockGuard(controllersLock_);
287         for (const auto& [pid, controller] : controllers_) {
288             SLOGI("pid=%{public}d", pid);
289             controller->HandlePlaybackStateChange(state);
290         }
291     }
292     SLOGI("send playbackstate change event to controllers done");
293 
294     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
295     if (remoteSource_ != nullptr) {
296         SLOGI("set remote AVPlaybackState");
297         remoteSource_->SetAVPlaybackState(state);
298     }
299     return AVSESSION_SUCCESS;
300 }
301 
GetAVPlaybackState(AVPlaybackState & state)302 int32_t AVSessionItem::GetAVPlaybackState(AVPlaybackState& state)
303 {
304     state = playbackState_;
305     return AVSESSION_SUCCESS;
306 }
307 
SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent & ability)308 int32_t AVSessionItem::SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent& ability)
309 {
310     launchAbility_ = ability;
311     return AVSESSION_SUCCESS;
312 }
313 
GetExtras(AAFwk::WantParams & extras)314 int32_t AVSessionItem::GetExtras(AAFwk::WantParams& extras)
315 {
316     extras = extras_;
317     return AVSESSION_SUCCESS;
318 }
319 
SetExtras(const AAFwk::WantParams & extras)320 int32_t AVSessionItem::SetExtras(const AAFwk::WantParams& extras)
321 {
322     extras_ = extras;
323 
324     {
325         std::lock_guard controllerLockGuard(controllersLock_);
326         for (const auto& [pid, controller] : controllers_) {
327             controller->HandleExtrasChange(extras);
328         }
329     }
330     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
331     if (remoteSource_ != nullptr) {
332         SLOGI("Set remote session extras");
333         auto ret = remoteSource_->SetExtrasRemote(extras);
334         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetRemoteExtras failed");
335     }
336     return AVSESSION_SUCCESS;
337 }
338 
GetControllerInner()339 sptr<IRemoteObject> AVSessionItem::GetControllerInner()
340 {
341     std::lock_guard controllerLockGuard(controllersLock_);
342     auto iter = controllers_.find(GetPid());
343     if (iter != controllers_.end()) {
344         return iter->second;
345     }
346 
347     sptr<AVSessionItem> session(this);
348     sptr<AVControllerItem> result = new(std::nothrow) AVControllerItem(GetPid(), session);
349     CHECK_AND_RETURN_RET_LOG(result != nullptr, nullptr, "malloc controller failed");
350     controllers_.insert({GetPid(), result});
351     return result;
352 }
353 
354 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
GetAVCastControllerInner()355 sptr<IRemoteObject> AVSessionItem::GetAVCastControllerInner()
356 {
357     SLOGI("Start get avcast controller inner");
358     if (castControllerProxy_ == nullptr) {
359         SLOGI("CastControllerProxy is null, start get new proxy");
360         {
361             std::lock_guard lockGuard(castHandleLock_);
362             castControllerProxy_ = AVRouter::GetInstance().GetRemoteController(castHandle_);
363         }
364     }
365     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, nullptr, "Get castController proxy failed");
366 
367     sptr<AVCastControllerItem> castController = new (std::nothrow) AVCastControllerItem();
368     CHECK_AND_RETURN_RET_LOG(castController != nullptr, nullptr, "malloc AVCastController failed");
369     std::shared_ptr<AVCastControllerItem> sharedPtr = std::shared_ptr<AVCastControllerItem>(castController.GetRefPtr(),
370         [holder = castController](const auto*) {});
371 
372     auto callback = [this](int32_t cmd, std::vector<int32_t>& supportedCastCmds) {
373         SLOGI("add cast valid command %{public}d", cmd);
374         if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_INVALID) {
375             supportedCastCmds_.clear();
376             supportedCastCmds = supportedCastCmds_;
377             return;
378         }
379         if (cmd == AVCastControlCommand::CAST_CONTROL_CMD_MAX) {
380             supportedCastCmds = supportedCastCmds_;
381             return;
382         }
383         if (descriptor_.sessionTag_ == "RemoteCast") {
384             SLOGE("sink session should mote modify valid cmds");
385             supportedCastCmds = {};
386             return;
387         }
388         if (cmd > removeCmdStep_) {
389             DeleteSupportCastCommand(cmd - removeCmdStep_);
390         } else {
391             AddSupportCastCommand(cmd);
392         }
393         supportedCastCmds = supportedCastCmds_;
394         return;
395     }
396 
397     sharedPtr->Init(castControllerProxy_, callback);
398     {
399         std::lock_guard lockGuard(castControllersLock_);
400         castControllers_.emplace_back(sharedPtr);
401     }
402     sptr<IRemoteObject> remoteObject = castController;
403 
404     return remoteObject;
405 }
406 
ReleaseAVCastControllerInner()407 void AVSessionItem::ReleaseAVCastControllerInner()
408 {
409     SLOGI("Release AVCastControllerInner");
410     std::lock_guard lockGuard(castControllersLock_);
411     for (auto controller : castControllers_) {
412         controller->Destroy();
413     }
414     castControllerProxy_ = nullptr;
415 }
416 #endif
417 
RegisterCallbackInner(const sptr<IAVSessionCallback> & callback)418 int32_t AVSessionItem::RegisterCallbackInner(const sptr<IAVSessionCallback>& callback)
419 {
420     std::lock_guard callbackLockGuard(callbackLock_);
421     callback_ = callback;
422     return AVSESSION_SUCCESS;
423 }
424 
Activate()425 int32_t AVSessionItem::Activate()
426 {
427     descriptor_.isActive_ = true;
428     std::lock_guard controllerLockGuard(controllersLock_);
429     for (const auto& [pid, controller] : controllers_) {
430         SLOGI("pid=%{pubic}d", pid);
431         controller->HandleActiveStateChange(true);
432     }
433     if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VOICE_CALL) {
434         SLOGI("set audio scene for phone chat start");
435         AudioSystemManager *audioManager = AudioSystemManager::GetInstance();
436         AudioScene audioScene = AudioScene::AUDIO_SCENE_CALL_START;
437         if (audioManager != nullptr) {
438             audioManager->SetAudioScene(audioScene);
439         }
440     }
441     return AVSESSION_SUCCESS;
442 }
443 
Deactivate()444 int32_t AVSessionItem::Deactivate()
445 {
446     descriptor_.isActive_ = false;
447     std::lock_guard controllerLockGuard(controllersLock_);
448     for (const auto& [pid, controller] : controllers_) {
449         SLOGI("pid=%{pubic}d", pid);
450         controller->HandleActiveStateChange(false);
451     }
452     if (descriptor_.sessionType_ == AVSession::SESSION_TYPE_VOICE_CALL) {
453         SLOGI("set audio scene for phone chat end");
454         AudioSystemManager *audioManager = AudioSystemManager::GetInstance();
455         AudioScene audioScene = AudioScene::AUDIO_SCENE_CALL_END;
456         if (audioManager != nullptr) {
457             audioManager->SetAudioScene(audioScene);
458         }
459     }
460     return AVSESSION_SUCCESS;
461 }
462 
IsActive()463 bool AVSessionItem::IsActive()
464 {
465     return descriptor_.isActive_;
466 }
467 
AddSupportCommand(int32_t cmd)468 int32_t AVSessionItem::AddSupportCommand(int32_t cmd)
469 {
470     CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
471     CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
472     auto iter = std::find(supportedCmd_.begin(), supportedCmd_.end(), cmd);
473     CHECK_AND_RETURN_RET_LOG(iter == supportedCmd_.end(), AVSESSION_SUCCESS, "cmd already been added");
474     supportedCmd_.push_back(cmd);
475     std::lock_guard controllerLockGuard(controllersLock_);
476     for (const auto& [pid, controller] : controllers_) {
477         SLOGI("pid=%{pubic}d", pid);
478         controller->HandleValidCommandChange(supportedCmd_);
479     }
480     return AVSESSION_SUCCESS;
481 }
482 
DeleteSupportCommand(int32_t cmd)483 int32_t AVSessionItem::DeleteSupportCommand(int32_t cmd)
484 {
485     CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
486     CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
487     auto iter = std::remove(supportedCmd_.begin(), supportedCmd_.end(), cmd);
488     supportedCmd_.erase(iter, supportedCmd_.end());
489     std::lock_guard controllerLockGuard(controllersLock_);
490     for (const auto& [pid, controller] : controllers_) {
491         SLOGI("pid=%{pubic}d", pid);
492         controller->HandleValidCommandChange(supportedCmd_);
493     }
494     return AVSESSION_SUCCESS;
495 }
496 
SetSessionEvent(const std::string & event,const AAFwk::WantParams & args)497 int32_t AVSessionItem::SetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
498 {
499     {
500         std::lock_guard controllerLockGuard(controllersLock_);
501         for (const auto& [pid, controller] : controllers_) {
502             controller->HandleSetSessionEvent(event, args);
503         }
504     }
505     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
506     if (remoteSource_ != nullptr) {
507         SLOGI("Set remote session event");
508         auto ret = remoteSource_->SetSessionEventRemote(event, args);
509         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetSessionEvent failed");
510     }
511     return AVSESSION_SUCCESS;
512 }
513 
514 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
515 
AddSupportCastCommand(int32_t cmd)516 int32_t AVSessionItem::AddSupportCastCommand(int32_t cmd)
517 {
518     CHECK_AND_RETURN_RET_LOG(cmd > AVCastControlCommand::CAST_CONTROL_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
519     CHECK_AND_RETURN_RET_LOG(cmd < AVCastControlCommand::CAST_CONTROL_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
520     auto iter = std::find(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
521     CHECK_AND_RETURN_RET_LOG(iter == supportedCastCmds_.end(), AVSESSION_SUCCESS, "cmd already been added");
522     supportedCastCmds_.push_back(cmd);
523     std::lock_guard controllerLockGuard(controllersLock_);
524     return AVSESSION_SUCCESS;
525 }
526 
DeleteSupportCastCommand(int32_t cmd)527 int32_t AVSessionItem::DeleteSupportCastCommand(int32_t cmd)
528 {
529     CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
530     CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
531     auto iter = std::remove(supportedCastCmds_.begin(), supportedCastCmds_.end(), cmd);
532     supportedCastCmds_.erase(iter, supportedCastCmds_.end());
533     std::lock_guard controllerLockGuard(controllersLock_);
534     return AVSESSION_SUCCESS;
535 }
536 
ReleaseCast()537 int32_t AVSessionItem::ReleaseCast()
538 {
539     SLOGI("Release cast process");
540     return StopCast();
541 }
542 
StartCast(const OutputDeviceInfo & outputDeviceInfo)543 int32_t AVSessionItem::StartCast(const OutputDeviceInfo& outputDeviceInfo)
544 {
545     SLOGI("Start cast process");
546     std::lock_guard castHandleLockGuard(castHandleLock_);
547 
548     int64_t castHandle = AVRouter::GetInstance().StartCast(outputDeviceInfo);
549     CHECK_AND_RETURN_RET_LOG(castHandle != AVSESSION_ERROR, AVSESSION_ERROR, "StartCast failed");
550 
551     std::lock_guard lockGuard(castHandleLock_);
552     castHandle_ = castHandle;
553     SLOGI("start cast handle is %{public}ld", castHandle_);
554 
555     int32_t ret = AddDevice(static_cast<int32_t>(castHandle), outputDeviceInfo);
556 
557     return ret;
558 }
559 
AddDevice(const int64_t castHandle,const OutputDeviceInfo & outputDeviceInfo)560 int32_t AVSessionItem::AddDevice(const int64_t castHandle, const OutputDeviceInfo& outputDeviceInfo)
561 {
562     SLOGI("Add device process");
563     std::lock_guard lockGuard(castHandleLock_);
564     AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_);
565     int32_t castId = static_cast<int32_t>(castHandle_);
566     int32_t ret = AVRouter::GetInstance().AddDevice(castId, outputDeviceInfo);
567     SLOGI("Add device process with ret %{public}d", ret);
568     return ret;
569 }
570 
IsCastSinkSession(int32_t castState)571 bool AVSessionItem::IsCastSinkSession(int32_t castState)
572 {
573     SLOGI("IsCastSinkSession for castState %{public}d, sessionTag is %{public}s", castState,
574         descriptor_.sessionTag_.c_str());
575     if (castState == ConnectionState::STATE_DISCONNECTED && descriptor_.sessionTag_ == "RemoteCast") {
576         SLOGI("A cast sink session is being disconnected");
577         if (!destroyLock_.try_lock()) {
578             SLOGE("check already in lock, return");
579             return true;
580         }
581         SLOGI("wait for lock to destroy");
582         std::lock_guard lockGuard(destroyLock_);
583         if (isDestroyed_) {
584             SLOGE("return for already in destroy");
585             return true;
586         }
587 
588         return Destroy() == true;
589     }
590     return false;
591 }
592 
OnCastStateChange(int32_t castState,DeviceInfo deviceInfo)593 void AVSessionItem::OnCastStateChange(int32_t castState, DeviceInfo deviceInfo)
594 {
595     SLOGI("OnCastStateChange in with state: %{public}d | id: %{public}s", static_cast<int32_t>(castState),
596         deviceInfo.deviceid_.c_str());
597     OutputDeviceInfo outputDeviceInfo;
598     if (castDeviceInfoMap_.count(deviceInfo.deviceId_) > 0) {
599         outputDeviceInfo.deviceInfos_.emplace_back(castDeviceInfoMap_[deviceInfo.deviceId_]);
600     } else {
601         outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
602     }
603     if (castState == castConnectStateForConnected_) { // 6 is connected status (stream)
604         castState = 1; // 1 is connected status (local)
605         descriptor_.outputDeviceInfo_ = outputDeviceInfo;
606         if (callStartCallback_) {
607             SLOGI("AVSessionItem send callStart event to service for connected");
608             callStartCallback_(*this);
609         }
610     }
611 
612     if (castState == castConnectStateForDisconnect_) { // 5 is disconnected status
613         castState = 6; // 6 is disconnected status of AVSession
614         SLOGI("Is remotecast, received disconnect event for castHandle_: %{public}ld", castHandle_);
615         AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_);
616         AVRouter::GetInstance().StopCastSession(castHandle_);
617         castHandle_ = -1;
618         castControllerProxy_ = nullptr;
619 
620         OutputDeviceInfo localDevice;
621         DeviceInfo localInfo;
622         localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
623         localInfo.deviceId_ = "0";
624         localInfo.deviceName_ = "LocalDevice";
625         localDevice.deviceInfos_.emplace_back(localInfo);
626         descriptor_.outputDeviceInfo_ = localDevice;
627     }
628 
629     HandleOutputDeviceChange(castState, outputDeviceInfo);
630     {
631         std::lock_guard controllersLockGuard(controllersLock_);
632         SLOGD("AVCastController map size is %{public}zu", controllers_.size());
633         for (const auto& controller : controllers_) {
634             if (controllers_.size() <= 0) {
635                 SLOGE("lopp in empty controllers, break");
636                 break;
637             }
638             CHECK_AND_RETURN_LOG(controller.second != nullptr, "Controller is nullptr, return");
639             controller.second->HandleOutputDeviceChange(castState, outputDeviceInfo);
640         }
641     }
642     if (IsCastSinkSession(castState)) {
643         SLOGE("Cast sink session start to disconnect");
644         return;
645     }
646 }
647 
OnCastEventRecv(int32_t errorCode,std::string & errorMsg)648 void AVSessionItem::OnCastEventRecv(int32_t errorCode, std::string& errorMsg)
649 {
650     SLOGI("OnCastEventRecv in with code and msg %{public}dm %{public}s", errorCode, errorMsg.c_str());
651     for (auto controller : castControllers_) {
652         SLOGI("pass error to cast controller with code %{public}d", errorCode);
653         controller->OnPlayerError(errorCode, errorMsg);
654     }
655 }
656 
StopCast()657 int32_t AVSessionItem::StopCast()
658 {
659     if (descriptor_.sessionTag_ == "RemoteCast") {
660         int32_t ret = AVRouter::GetInstance().StopCastSession(castHandle_);
661         castHandle_ = -1;
662         SLOGI("Stop cast process for sink with ret %{public}d", ret);
663         return ret;
664     }
665     SLOGI("Stop cast process");
666     {
667         std::lock_guard lockGuard(castHandleLock_);
668         CHECK_AND_RETURN_RET_LOG(castHandle_ != 0, AVSESSION_SUCCESS, "Not cast session, return");
669         int64_t ret = AVRouter::GetInstance().StopCast(castHandle_);
670         SLOGI("StopCast with unchange castHandle is %{public}ld", castHandle_);
671         CHECK_AND_RETURN_RET_LOG(ret != AVSESSION_ERROR, AVSESSION_ERROR, "StopCast failed");
672     }
673 
674     OutputDeviceInfo outputDeviceInfo;
675     DeviceInfo deviceInfo;
676     deviceInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
677     deviceInfo.deviceId_ = "0";
678     deviceInfo.deviceName_ = "LocalDevice";
679     outputDeviceInfo.deviceInfos_.emplace_back(deviceInfo);
680     SetOutputDevice(outputDeviceInfo);
681     return AVSESSION_SUCCESS;
682 }
683 
SetCastHandle(const int64_t castHandle)684 void AVSessionItem::SetCastHandle(const int64_t castHandle)
685 {
686     castHandle_ = castHandle;
687     SLOGI("set cast handle is %{public}ld", castHandle_);
688 }
689 
RegisterDeviceStateCallback()690 void AVSessionItem::RegisterDeviceStateCallback()
691 {
692     SLOGI("Start register callback for device state change");
693     AVRouter::GetInstance().RegisterCallback(castHandle_, cssListener_);
694     OutputDeviceInfo localDevice;
695     DeviceInfo localInfo;
696     localInfo.castCategory_ = AVCastCategory::CATEGORY_LOCAL;
697     localInfo.deviceId_ = "0";
698     localInfo.deviceName_ = "LocalDevice";
699     localDevice.deviceInfos_.emplace_back(localInfo);
700     descriptor_.outputDeviceInfo_ = localDevice;
701 }
702 
UnRegisterDeviceStateCallback()703 void AVSessionItem::UnRegisterDeviceStateCallback()
704 {
705     SLOGI("Stop unregister callback for device state change");
706     AVRouter::GetInstance().UnRegisterCallback(castHandle_, cssListener_);
707 }
708 
StopCastSession()709 void AVSessionItem::StopCastSession()
710 {
711     SLOGI("Stop cast session process with castHandle: %{public}ld", castHandle_);
712     int64_t ret = AVRouter::GetInstance().StopCastSession(castHandle_);
713     if (ret != AVSESSION_ERROR) {
714         castHandle_ = -1;
715     } else {
716         SLOGE("Stop cast session process error");
717     }
718 }
719 #endif
720 
GetDescriptor()721 AVSessionDescriptor AVSessionItem::GetDescriptor()
722 {
723     return descriptor_;
724 }
725 
GetAVCallState()726 AVCallState AVSessionItem::GetAVCallState()
727 {
728     return avCallState_;
729 }
730 
GetAVCallMetaData()731 AVCallMetaData AVSessionItem::GetAVCallMetaData()
732 {
733     std::string sessionId = GetSessionId();
734     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
735     std::shared_ptr<AVSessionPixelMap> innerPixelMap = avCallMetaData_.GetMediaImage();
736     AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
737     return avCallMetaData_;
738 }
739 
740 
GetPlaybackState()741 AVPlaybackState AVSessionItem::GetPlaybackState()
742 {
743     return playbackState_;
744 }
745 
GetMetaData()746 AVMetaData AVSessionItem::GetMetaData()
747 {
748     std::lock_guard lockGuard(metaDataLock_);
749     std::string sessionId = GetSessionId();
750     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
751     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
752     AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
753 
754     std::string avQueueFile = AVSessionUtils::GetFixedPathName() + GetBundleName() + "_" +
755         metaData_.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
756     std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaData_.GetAVQueueImage();
757     AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFile);
758     return metaData_;
759 }
760 
GetQueueItems()761 std::vector<AVQueueItem> AVSessionItem::GetQueueItems()
762 {
763     return queueItems_;
764 }
765 
GetQueueTitle()766 std::string AVSessionItem::GetQueueTitle()
767 {
768     return queueTitle_;
769 }
770 
GetSupportCommand()771 std::vector<int32_t> AVSessionItem::GetSupportCommand()
772 {
773     if (descriptor_.elementName_.GetBundleName() == "castBundleName"
774         && descriptor_.elementName_.GetAbilityName() == "castAbilityName") {
775         SLOGI("GetSupportCommand when cast session");
776         std::vector<int32_t> supportedCmdForCastSession {
777             AVControlCommand::SESSION_CMD_PLAY,
778             AVControlCommand::SESSION_CMD_PAUSE,
779             AVControlCommand::SESSION_CMD_STOP,
780             AVControlCommand::SESSION_CMD_PLAY_NEXT,
781             AVControlCommand::SESSION_CMD_PLAY_PREVIOUS,
782             AVControlCommand::SESSION_CMD_SEEK
783         };
784         return supportedCmdForCastSession;
785     }
786     return supportedCmd_;
787 }
788 
GetLaunchAbility()789 AbilityRuntime::WantAgent::WantAgent AVSessionItem::GetLaunchAbility()
790 {
791     return launchAbility_;
792 }
793 
GetExtras()794 AAFwk::WantParams AVSessionItem::GetExtras()
795 {
796     return extras_;
797 }
798 
HandleMediaKeyEvent(const MMI::KeyEvent & keyEvent)799 void AVSessionItem::HandleMediaKeyEvent(const MMI::KeyEvent& keyEvent)
800 {
801     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnMediaKeyEvent");
802     std::lock_guard callbackLockGuard(callbackLock_);
803     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
804     CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactive");
805     callback_->OnMediaKeyEvent(keyEvent);
806 }
807 
ExecuteControllerCommand(const AVControlCommand & cmd)808 void AVSessionItem::ExecuteControllerCommand(const AVControlCommand& cmd)
809 {
810     HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_ALL_CTRL_COMMAND);
811     int32_t code = cmd.GetCommand();
812     if (code < 0 || code >= SESSION_CMD_MAX) {
813         SLOGE("controlCommand invalid");
814         return;
815     }
816 
817     {
818         std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
819         if (remoteSink_ != nullptr) {
820             SLOGI("set remote ControlCommand");
821             CHECK_AND_RETURN_LOG(remoteSink_->SetControlCommand(cmd) == AVSESSION_SUCCESS, "SetControlCommand failed");
822         }
823     }
824     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
825     CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactivate");
826 
827     HISYSEVENT_ADD_OPERATION_COUNT(static_cast<Operation>(cmd.GetCommand()));
828     HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_SUCCESS_CTRL_COMMAND);
829     HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(descriptor_.elementName_.GetBundleName(), GetPid(),
830         cmd.GetCommand(), descriptor_.sessionType_);
831     return (this->*cmdHandlers[code])(cmd);
832 
833     HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "INVALID_COMMAND", "CMD", code,
834         "ERROR_INFO", "avsessionitem executecontrollercommand, invaild command");
835 }
836 
ExecueCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)837 void AVSessionItem::ExecueCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
838 {
839     AVSESSION_TRACE_SYNC_START("AVSessionItem::ExecueCommonCommand");
840 
841     {
842         std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
843         if (remoteSink_ != nullptr) {
844             SLOGI("Send remote CommonCommand");
845             CHECK_AND_RETURN_LOG(remoteSink_->SetCommonCommand(commonCommand, commandArgs) == AVSESSION_SUCCESS,
846                 "SetCommonCommand failed");
847         }
848     }
849     std::lock_guard callbackLockGuard(callbackLock_);
850     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
851     callback_->OnCommonCommand(commonCommand, commandArgs);
852 }
853 
HandleSkipToQueueItem(const int32_t & itemId)854 void AVSessionItem::HandleSkipToQueueItem(const int32_t& itemId)
855 {
856     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSkipToQueueItem");
857     std::lock_guard callbackLockGuard(callbackLock_);
858     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
859     callback_->OnSkipToQueueItem(itemId);
860 }
861 
HandleOnAVCallAnswer(const AVControlCommand & cmd)862 void AVSessionItem::HandleOnAVCallAnswer(const AVControlCommand& cmd)
863 {
864     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallAnswer");
865     std::lock_guard callbackLockGuard(callbackLock_);
866     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
867     callback_->OnAVCallAnswer();
868 }
869 
HandleOnAVCallHangUp(const AVControlCommand & cmd)870 void AVSessionItem::HandleOnAVCallHangUp(const AVControlCommand& cmd)
871 {
872     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallHangUp");
873     std::lock_guard callbackLockGuard(callbackLock_);
874     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
875     callback_->OnAVCallHangUp();
876 }
877 
HandleOnAVCallToggleCallMute(const AVControlCommand & cmd)878 void AVSessionItem::HandleOnAVCallToggleCallMute(const AVControlCommand& cmd)
879 {
880     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnAVCallToggleCallMute");
881     std::lock_guard callbackLockGuard(callbackLock_);
882     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
883     callback_->OnAVCallToggleCallMute();
884 }
885 
HandleOnPlay(const AVControlCommand & cmd)886 void AVSessionItem::HandleOnPlay(const AVControlCommand& cmd)
887 {
888     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlay");
889     std::lock_guard callbackLockGuard(callbackLock_);
890     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
891     callback_->OnPlay();
892 }
893 
HandleOnPause(const AVControlCommand & cmd)894 void AVSessionItem::HandleOnPause(const AVControlCommand& cmd)
895 {
896     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPause");
897     std::lock_guard callbackLockGuard(callbackLock_);
898     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
899     callback_->OnPause();
900 }
901 
HandleOnStop(const AVControlCommand & cmd)902 void AVSessionItem::HandleOnStop(const AVControlCommand& cmd)
903 {
904     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnStop");
905     std::lock_guard callbackLockGuard(callbackLock_);
906     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
907     callback_->OnStop();
908 }
909 
HandleOnPlayNext(const AVControlCommand & cmd)910 void AVSessionItem::HandleOnPlayNext(const AVControlCommand& cmd)
911 {
912     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayNext");
913     std::lock_guard callbackLockGuard(callbackLock_);
914     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
915     callback_->OnPlayNext();
916 }
917 
HandleOnPlayPrevious(const AVControlCommand & cmd)918 void AVSessionItem::HandleOnPlayPrevious(const AVControlCommand& cmd)
919 {
920     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayPrevious");
921     std::lock_guard callbackLockGuard(callbackLock_);
922     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
923     callback_->OnPlayPrevious();
924 }
925 
HandleOnFastForward(const AVControlCommand & cmd)926 void AVSessionItem::HandleOnFastForward(const AVControlCommand& cmd)
927 {
928     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnFastForward");
929     std::lock_guard callbackLockGuard(callbackLock_);
930     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
931     int64_t time = 0;
932     CHECK_AND_RETURN_LOG(cmd.GetForwardTime(time) == AVSESSION_SUCCESS, "GetForwardTime failed");
933     callback_->OnFastForward(time);
934 }
935 
HandleOnRewind(const AVControlCommand & cmd)936 void AVSessionItem::HandleOnRewind(const AVControlCommand& cmd)
937 {
938     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnRewind");
939     std::lock_guard callbackLockGuard(callbackLock_);
940     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
941     int64_t time = 0;
942     CHECK_AND_RETURN_LOG(cmd.GetRewindTime(time) == AVSESSION_SUCCESS, "GetForwardTime failed");
943     callback_->OnRewind(time);
944 }
945 
HandleOnSeek(const AVControlCommand & cmd)946 void AVSessionItem::HandleOnSeek(const AVControlCommand& cmd)
947 {
948     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSeek");
949     std::lock_guard callbackLockGuard(callbackLock_);
950     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
951     int64_t time = 0;
952     CHECK_AND_RETURN_LOG(cmd.GetSeekTime(time) == AVSESSION_SUCCESS, "GetSeekTime failed");
953     callback_->OnSeek(time);
954 }
955 
HandleOnSetSpeed(const AVControlCommand & cmd)956 void AVSessionItem::HandleOnSetSpeed(const AVControlCommand& cmd)
957 {
958     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetSpeed");
959     std::lock_guard callbackLockGuard(callbackLock_);
960     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
961     double speed = 0.0;
962     CHECK_AND_RETURN_LOG(cmd.GetSpeed(speed) == AVSESSION_SUCCESS, "GetSpeed failed");
963     callback_->OnSetSpeed(speed);
964 }
965 
HandleOnSetLoopMode(const AVControlCommand & cmd)966 void AVSessionItem::HandleOnSetLoopMode(const AVControlCommand& cmd)
967 {
968     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetLoopMode");
969     std::lock_guard callbackLockGuard(callbackLock_);
970     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
971     int32_t loopMode = AVSESSION_ERROR;
972     CHECK_AND_RETURN_LOG(cmd.GetLoopMode(loopMode) == AVSESSION_SUCCESS, "GetLoopMode failed");
973     callback_->OnSetLoopMode(loopMode);
974 }
975 
HandleOnToggleFavorite(const AVControlCommand & cmd)976 void AVSessionItem::HandleOnToggleFavorite(const AVControlCommand& cmd)
977 {
978     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnToggleFavorite");
979     std::lock_guard callbackLockGuard(callbackLock_);
980     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
981     std::string assetId;
982     CHECK_AND_RETURN_LOG(cmd.GetAssetId(assetId) == AVSESSION_SUCCESS, "GetMediaId failed");
983     callback_->OnToggleFavorite(assetId);
984 }
985 
HandleOnPlayFromAssetId(const AVControlCommand & cmd)986 void AVSessionItem::HandleOnPlayFromAssetId(const AVControlCommand& cmd)
987 {
988     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayFromAssetId");
989     std::lock_guard callbackLockGuard(callbackLock_);
990     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
991     int64_t assetId = 0;
992     CHECK_AND_RETURN_LOG(cmd.GetPlayFromAssetId(assetId) == AVSESSION_SUCCESS, "Get playFromAssetId failed");
993     callback_->OnPlayFromAssetId(assetId);
994 }
995 
AddController(pid_t pid,sptr<AVControllerItem> & controller)996 int32_t AVSessionItem::AddController(pid_t pid, sptr<AVControllerItem>& controller)
997 {
998     std::lock_guard controllersLockGuard(controllersLock_);
999     SLOGI("handle controller newup for pid: %{public}d", static_cast<int>(pid));
1000     controllers_.insert({pid, controller});
1001     return AVSESSION_SUCCESS;
1002 }
1003 
SetPid(pid_t pid)1004 void AVSessionItem::SetPid(pid_t pid)
1005 {
1006     descriptor_.pid_ = pid;
1007 }
1008 
SetUid(pid_t uid)1009 void AVSessionItem::SetUid(pid_t uid)
1010 {
1011     descriptor_.uid_ = uid;
1012 }
1013 
GetPid() const1014 pid_t AVSessionItem::GetPid() const
1015 {
1016     return descriptor_.pid_;
1017 }
1018 
GetUid() const1019 pid_t AVSessionItem::GetUid() const
1020 {
1021     return descriptor_.uid_;
1022 }
1023 
GetAbilityName() const1024 std::string AVSessionItem::GetAbilityName() const
1025 {
1026     return descriptor_.elementName_.GetAbilityName();
1027 }
1028 
GetBundleName() const1029 std::string AVSessionItem::GetBundleName() const
1030 {
1031     return descriptor_.elementName_.GetBundleName();
1032 }
1033 
SetTop(bool top)1034 void AVSessionItem::SetTop(bool top)
1035 {
1036     descriptor_.isTopSession_ = top;
1037 }
1038 
GetRemoteSource()1039 std::shared_ptr<RemoteSessionSource> AVSessionItem::GetRemoteSource()
1040 {
1041     return remoteSource_;
1042 }
1043 
HandleControllerRelease(pid_t pid)1044 void AVSessionItem::HandleControllerRelease(pid_t pid)
1045 {
1046     std::lock_guard controllersLockGuard(controllersLock_);
1047     SLOGI("handle controller release for pid: %{public}d", static_cast<int>(pid));
1048     controllers_.erase(pid);
1049 }
1050 
SetServiceCallbackForRelease(const std::function<void (AVSessionItem &)> & callback)1051 void AVSessionItem::SetServiceCallbackForRelease(const std::function<void(AVSessionItem&)>& callback)
1052 {
1053     SLOGI("SetServiceCallbackForRelease in");
1054     serviceCallback_ = callback;
1055 }
1056 
SetServiceCallbackForAVQueueInfo(const std::function<void (AVSessionItem &)> & callback)1057 void AVSessionItem::SetServiceCallbackForAVQueueInfo(const std::function<void(AVSessionItem&)>& callback)
1058 {
1059     SLOGI("SetServiceCallbackForAVQueueInfo in");
1060     serviceCallbackForAddAVQueueInfo_ = callback;
1061 }
1062 
SetServiceCallbackForCallStart(const std::function<void (AVSessionItem &)> & callback)1063 void AVSessionItem::SetServiceCallbackForCallStart(const std::function<void(AVSessionItem&)>& callback)
1064 {
1065     SLOGI("SetServiceCallbackForCallStart in");
1066     callStartCallback_ = callback;
1067 }
1068 
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)1069 void AVSessionItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
1070 {
1071     SLOGI("Connection state %{public}d", connectionState);
1072     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnOutputDeviceChange");
1073     std::lock_guard callbackLockGuard(callbackLock_);
1074     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
1075     callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
1076 }
1077 
SetOutputDevice(const OutputDeviceInfo & info)1078 void AVSessionItem::SetOutputDevice(const OutputDeviceInfo& info)
1079 {
1080     descriptor_.outputDeviceInfo_ = info;
1081     int32_t connectionStateConnected = 1;
1082     HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
1083     std::lock_guard controllersLockGuard(controllersLock_);
1084     for (const auto& controller : controllers_) {
1085         controller.second->HandleOutputDeviceChange(connectionStateConnected, descriptor_.outputDeviceInfo_);
1086     }
1087     SLOGI("OutputDeviceInfo device size is %{public}d", static_cast<int32_t>(info.deviceInfos_.size()));
1088 }
1089 
GetOutputDevice(OutputDeviceInfo & info)1090 void AVSessionItem::GetOutputDevice(OutputDeviceInfo& info)
1091 {
1092     info = GetDescriptor().outputDeviceInfo_;
1093 }
1094 
CastAudioToRemote(const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sinkCapability)1095 int32_t AVSessionItem::CastAudioToRemote(const std::string& sourceDevice, const std::string& sinkDevice,
1096                                          const std::string& sinkCapability)
1097 {
1098     SLOGI("start cast audio to remote");
1099     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
1100     remoteSource_ = std::make_shared<RemoteSessionSourceProxy>();
1101     CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
1102     int32_t ret = remoteSource_->CastSessionToRemote(this, sourceDevice, sinkDevice, sinkCapability);
1103     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionToRemote failed");
1104     ret = remoteSource_->SetAVMetaData(GetMetaData());
1105     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
1106     ret = remoteSource_->SetAVPlaybackState(GetPlaybackState());
1107     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVPlaybackState failed");
1108     SLOGI("success");
1109     return AVSESSION_SUCCESS;
1110 }
1111 
SourceCancelCastAudio(const std::string & sinkDevice)1112 int32_t AVSessionItem::SourceCancelCastAudio(const std::string& sinkDevice)
1113 {
1114     SLOGI("start cancel cast audio");
1115     std::lock_guard remoteSourceLockGuard(remoteSourceLock_);
1116     CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
1117     int32_t ret = remoteSource_->CancelCastAudio(sinkDevice);
1118     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioToLocal failed");
1119     SLOGI("success");
1120     return AVSESSION_SUCCESS;
1121 }
1122 
CastAudioFromRemote(const std::string & sourceSessionId,const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sourceCapability)1123 int32_t AVSessionItem::CastAudioFromRemote(const std::string& sourceSessionId, const std::string& sourceDevice,
1124                                            const std::string& sinkDevice, const std::string& sourceCapability)
1125 {
1126     SLOGI("start cast audio from remote");
1127 
1128     std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
1129     remoteSink_ = std::make_shared<RemoteSessionSinkProxy>();
1130     CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
1131     int32_t ret = remoteSink_->CastSessionFromRemote(this, sourceSessionId, sourceDevice, sinkDevice,
1132         sourceCapability);
1133     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionFromRemote failed");
1134 
1135     OutputDeviceInfo outputDeviceInfo;
1136     GetOutputDevice(outputDeviceInfo);
1137     int32_t castCategoryStreaming = ProtocolType::TYPE_CAST_PLUS_STREAM;
1138     for (size_t i = 0; i < outputDeviceInfo.deviceInfos_.size(); i++) {
1139         outputDeviceInfo.deviceInfos_[i].castCategory_ = castCategoryStreaming;
1140     }
1141     SetOutputDevice(outputDeviceInfo);
1142 
1143     CHECK_AND_RETURN_RET_LOG(Activate() == AVSESSION_SUCCESS, AVSESSION_ERROR, "Activate failed");
1144 
1145     std::vector<std::vector<int32_t>> value(SESSION_DATA_CATEGORY_MAX);
1146     ret = JsonUtils::GetVectorCapability(sourceCapability, value);
1147     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetVectorCapability error");
1148     for (auto cmd : value[SESSION_DATA_CONTROL_COMMAND]) {
1149         SLOGI("add support cmd : %{public}d", cmd);
1150         ret = AddSupportCommand(cmd);
1151         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "AddSupportCommand failed");
1152     }
1153     SLOGI("success");
1154     return AVSESSION_SUCCESS;
1155 }
1156 
SinkCancelCastAudio()1157 int32_t AVSessionItem::SinkCancelCastAudio()
1158 {
1159     std::lock_guard remoteSinkLockGuard(remoteSinkLock_);
1160     CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
1161     int32_t ret = remoteSink_->CancelCastSession();
1162     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CancelCastSession failed");
1163     GetDescriptor().outputDeviceInfo_.deviceInfos_.clear();
1164     DeviceInfo deviceInfo;
1165     GetDescriptor().outputDeviceInfo_.deviceInfos_.emplace_back(deviceInfo);
1166     SLOGI("SinkCancelCastAudio");
1167     return AVSESSION_SUCCESS;
1168 }
1169 
1170 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
UpdateCastDeviceMap(DeviceInfo deviceInfo)1171 void AVSessionItem::UpdateCastDeviceMap(DeviceInfo deviceInfo)
1172 {
1173     SLOGI("UpdateCastDeviceMap with id: %{public}s", deviceInfo.deviceid_.c_str());
1174     castDeviceInfoMap_[deviceInfo.deviceId_] = deviceInfo;
1175 }
1176 #endif
1177 } // namespace OHOS::AVSession
1178