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