• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "avsession_item.h"
17 #include "avsession_service.h"
18 #include "avcontroller_item.h"
19 #include "avsession_log.h"
20 #include "avsession_errors.h"
21 #include "avsession_descriptor.h"
22 #include "avsession_trace.h"
23 #include "avsession_sysevent.h"
24 #include "avsession_utils.h"
25 #include "remote_session_sink.h"
26 #include "remote_session_source.h"
27 #include "remote_session_source_proxy.h"
28 #include "remote_session_sink_proxy.h"
29 
30 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
31 #include <malloc.h>
32 #endif
33 
34 namespace OHOS::AVSession {
AVSessionItem(const AVSessionDescriptor & descriptor)35 AVSessionItem::AVSessionItem(const AVSessionDescriptor& descriptor)
36     : descriptor_(descriptor)
37 {
38     SLOGD("constructor id=%{public}s", descriptor_.sessionId_.c_str());
39 }
40 
~AVSessionItem()41 AVSessionItem::~AVSessionItem()
42 {
43     SLOGD("destroy id=%{public}s", descriptor_.sessionId_.c_str());
44 }
45 
GetSessionId()46 std::string AVSessionItem::GetSessionId()
47 {
48     return descriptor_.sessionId_;
49 }
50 
Destroy()51 int32_t AVSessionItem::Destroy()
52 {
53     if (callback_) {
54         callback_.clear();
55     }
56     std::string sessionId = descriptor_.sessionId_;
57     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
58     AVSessionUtils::DeleteFile(fileName);
59 
60     SLOGI("size=%{public}d", static_cast<int>(controllers_.size()));
61     {
62         std::lock_guard lockGuard(lock_);
63         for (auto it = controllers_.begin(); it != controllers_.end();) {
64             SLOGI("pid=%{public}d", it->first);
65             it->second->HandleSessionDestroy();
66             controllers_.erase(it++);
67         }
68     }
69 
70     if (serviceCallback_) {
71         serviceCallback_(*this);
72     }
73     SLOGI("Destroy success");
74     return AVSESSION_SUCCESS;
75 }
76 
GetAVMetaData(AVMetaData & meta)77 int32_t AVSessionItem::GetAVMetaData(AVMetaData& meta)
78 {
79     std::string sessionId = GetSessionId();
80     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
81     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
82     AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
83     meta = metaData_;
84     return AVSESSION_SUCCESS;
85 }
86 
SetAVMetaData(const AVMetaData & meta)87 int32_t AVSessionItem::SetAVMetaData(const AVMetaData& meta)
88 {
89     CHECK_AND_RETURN_RET_LOG(metaData_.CopyFrom(meta), AVSESSION_ERROR, "AVMetaData set error");
90     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
91     if (innerPixelMap != nullptr) {
92         std::string sessionId = GetSessionId();
93         std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
94         AVSessionUtils::WriteImageToFile(innerPixelMap, fileName);
95         innerPixelMap->Clear();
96         metaData_.SetMediaImage(innerPixelMap);
97     }
98     std::lock_guard lockGuard(lock_);
99     for (const auto& [pid, controller] : controllers_) {
100         controller->HandleMetaDataChange(meta);
101     }
102 
103     if (remoteSource_ != nullptr) {
104         SLOGI("set remote AVMetaData");
105         auto ret = remoteSource_->SetAVMetaData(meta);
106         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
107     }
108     return AVSESSION_SUCCESS;
109 }
110 
SetAVPlaybackState(const AVPlaybackState & state)111 int32_t AVSessionItem::SetAVPlaybackState(const AVPlaybackState& state)
112 {
113     CHECK_AND_RETURN_RET_LOG(playbackState_.CopyFrom(state), AVSESSION_ERROR, "AVPlaybackState set error");
114     std::lock_guard lockGuard(lock_);
115     for (const auto& [pid, controller] : controllers_) {
116         SLOGI("pid=%{public}d", pid);
117         controller->HandlePlaybackStateChange(state);
118     }
119 
120     if (remoteSource_ != nullptr) {
121         SLOGI("set remote AVPlaybackState");
122         remoteSource_->SetAVPlaybackState(state);
123     }
124     return AVSESSION_SUCCESS;
125 }
126 
GetAVPlaybackState(AVPlaybackState & state)127 int32_t AVSessionItem::GetAVPlaybackState(AVPlaybackState& state)
128 {
129     state = playbackState_;
130     return AVSESSION_SUCCESS;
131 }
132 
SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent & ability)133 int32_t AVSessionItem::SetLaunchAbility(const AbilityRuntime::WantAgent::WantAgent& ability)
134 {
135     launchAbility_ = ability;
136     return AVSESSION_SUCCESS;
137 }
138 
GetControllerInner()139 sptr<IRemoteObject> AVSessionItem::GetControllerInner()
140 {
141     std::lock_guard lockGuard(lock_);
142     auto iter = controllers_.find(GetPid());
143     if (iter != controllers_.end()) {
144         return iter->second;
145     }
146 
147     sptr<AVSessionItem> session(this);
148     sptr<AVControllerItem> result = new(std::nothrow) AVControllerItem(GetPid(), session);
149     CHECK_AND_RETURN_RET_LOG(result != nullptr, nullptr, "malloc controller failed");
150     controllers_.insert({GetPid(), result});
151     return result;
152 }
153 
RegisterCallbackInner(const sptr<IAVSessionCallback> & callback)154 int32_t AVSessionItem::RegisterCallbackInner(const sptr<IAVSessionCallback>& callback)
155 {
156     callback_ = callback;
157     return AVSESSION_SUCCESS;
158 }
159 
Activate()160 int32_t AVSessionItem::Activate()
161 {
162     descriptor_.isActive_ = true;
163     std::lock_guard lockGuard(lock_);
164     for (const auto& [pid, controller] : controllers_) {
165         SLOGI("pid=%{pubic}d", pid);
166         controller->HandleActiveStateChange(true);
167     }
168     return AVSESSION_SUCCESS;
169 }
170 
Deactivate()171 int32_t AVSessionItem::Deactivate()
172 {
173     descriptor_.isActive_ = false;
174     std::lock_guard lockGuard(lock_);
175     for (const auto& [pid, controller] : controllers_) {
176         SLOGI("pid=%{pubic}d", pid);
177         controller->HandleActiveStateChange(false);
178     }
179     return AVSESSION_SUCCESS;
180 }
181 
IsActive()182 bool AVSessionItem::IsActive()
183 {
184     return descriptor_.isActive_;
185 }
186 
AddSupportCommand(int32_t cmd)187 int32_t AVSessionItem::AddSupportCommand(int32_t cmd)
188 {
189     CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
190     CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
191     auto iter = std::find(supportedCmd_.begin(), supportedCmd_.end(), cmd);
192     CHECK_AND_RETURN_RET_LOG(iter == supportedCmd_.end(), AVSESSION_SUCCESS, "cmd already been added");
193     supportedCmd_.push_back(cmd);
194     std::lock_guard lockGuard(lock_);
195     for (const auto& [pid, controller] : controllers_) {
196         SLOGI("pid=%{pubic}d", pid);
197         controller->HandleValidCommandChange(supportedCmd_);
198     }
199     return AVSESSION_SUCCESS;
200 }
201 
DeleteSupportCommand(int32_t cmd)202 int32_t AVSessionItem::DeleteSupportCommand(int32_t cmd)
203 {
204     CHECK_AND_RETURN_RET_LOG(cmd > AVControlCommand::SESSION_CMD_INVALID, AVSESSION_ERROR, "invalid cmd");
205     CHECK_AND_RETURN_RET_LOG(cmd < AVControlCommand::SESSION_CMD_MAX, AVSESSION_ERROR, "invalid cmd");
206     auto iter = std::remove(supportedCmd_.begin(), supportedCmd_.end(), cmd);
207     supportedCmd_.erase(iter, supportedCmd_.end());
208     std::lock_guard lockGuard(lock_);
209     for (const auto& [pid, controller] : controllers_) {
210         SLOGI("pid=%{pubic}d", pid);
211         controller->HandleValidCommandChange(supportedCmd_);
212     }
213     return AVSESSION_SUCCESS;
214 }
215 
GetDescriptor()216 AVSessionDescriptor AVSessionItem::GetDescriptor()
217 {
218     return descriptor_;
219 }
220 
GetPlaybackState()221 AVPlaybackState AVSessionItem::GetPlaybackState()
222 {
223     return playbackState_;
224 }
225 
GetMetaData()226 AVMetaData AVSessionItem::GetMetaData()
227 {
228     std::string sessionId = GetSessionId();
229     std::string fileName = AVSessionUtils::GetCachePathName() + sessionId + AVSessionUtils::GetFileSuffix();
230     std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaData_.GetMediaImage();
231     AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
232     return metaData_;
233 }
234 
GetSupportCommand()235 std::vector<int32_t> AVSessionItem::GetSupportCommand()
236 {
237     return supportedCmd_;
238 }
239 
GetLaunchAbility()240 AbilityRuntime::WantAgent::WantAgent AVSessionItem::GetLaunchAbility()
241 {
242     return launchAbility_;
243 }
244 
HandleMediaKeyEvent(const MMI::KeyEvent & keyEvent)245 void AVSessionItem::HandleMediaKeyEvent(const MMI::KeyEvent& keyEvent)
246 {
247     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnMediaKeyEvent");
248     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
249     CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactive");
250     callback_->OnMediaKeyEvent(keyEvent);
251 }
252 
ExecuteControllerCommand(const AVControlCommand & cmd)253 void AVSessionItem::ExecuteControllerCommand(const AVControlCommand& cmd)
254 {
255     HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_ALL_CTRL_COMMAND);
256     int32_t code = cmd.GetCommand();
257     if (code < 0 || code >= SESSION_CMD_MAX) {
258         SLOGE("controlCommand invalid");
259         return;
260     }
261 
262     if (remoteSink_ != nullptr) {
263         SLOGI("set remote ControlCommand");
264         CHECK_AND_RETURN_LOG(remoteSink_->SetControlCommand(cmd) == AVSESSION_SUCCESS, "SetControlCommand failed");
265     }
266     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
267     CHECK_AND_RETURN_LOG(descriptor_.isActive_, "session is deactivate");
268 
269     HISYSEVENT_ADD_OPERATION_COUNT(static_cast<Operation>(cmd.GetCommand()));
270     HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_SUCCESS_CTRL_COMMAND);
271     HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(descriptor_.elementName_.GetBundleName(), GetPid(),
272         cmd.GetCommand(), descriptor_.sessionType_);
273     return (this->*cmdHandlers[code])(cmd);
274 
275     HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "INVALID_COMMAND", "CMD", code,
276         "ERROR_INFO", "avsessionitem executecontrollercommand, invaild command");
277 }
278 
HandleOnPlay(const AVControlCommand & cmd)279 void AVSessionItem::HandleOnPlay(const AVControlCommand& cmd)
280 {
281     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlay");
282     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
283     callback_->OnPlay();
284 }
285 
HandleOnPause(const AVControlCommand & cmd)286 void AVSessionItem::HandleOnPause(const AVControlCommand& cmd)
287 {
288     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPause");
289     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
290     callback_->OnPause();
291 }
292 
HandleOnStop(const AVControlCommand & cmd)293 void AVSessionItem::HandleOnStop(const AVControlCommand& cmd)
294 {
295     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnStop");
296     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
297     callback_->OnStop();
298 }
299 
HandleOnPlayNext(const AVControlCommand & cmd)300 void AVSessionItem::HandleOnPlayNext(const AVControlCommand& cmd)
301 {
302     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayNext");
303     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
304     callback_->OnPlayNext();
305 }
306 
HandleOnPlayPrevious(const AVControlCommand & cmd)307 void AVSessionItem::HandleOnPlayPrevious(const AVControlCommand& cmd)
308 {
309     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnPlayPrevious");
310     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
311     callback_->OnPlayPrevious();
312 }
313 
HandleOnFastForward(const AVControlCommand & cmd)314 void AVSessionItem::HandleOnFastForward(const AVControlCommand& cmd)
315 {
316     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnFastForward");
317     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
318     callback_->OnFastForward();
319 }
320 
HandleOnRewind(const AVControlCommand & cmd)321 void AVSessionItem::HandleOnRewind(const AVControlCommand& cmd)
322 {
323     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnRewind");
324     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
325     callback_->OnRewind();
326 }
327 
HandleOnSeek(const AVControlCommand & cmd)328 void AVSessionItem::HandleOnSeek(const AVControlCommand& cmd)
329 {
330     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSeek");
331     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
332     int64_t time = 0;
333     CHECK_AND_RETURN_LOG(cmd.GetSeekTime(time) == AVSESSION_SUCCESS, "GetSeekTime failed");
334     callback_->OnSeek(time);
335 }
336 
HandleOnSetSpeed(const AVControlCommand & cmd)337 void AVSessionItem::HandleOnSetSpeed(const AVControlCommand& cmd)
338 {
339     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetSpeed");
340     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
341     double speed = 0.0;
342     CHECK_AND_RETURN_LOG(cmd.GetSpeed(speed) == AVSESSION_SUCCESS, "GetSpeed failed");
343     callback_->OnSetSpeed(speed);
344 }
345 
HandleOnSetLoopMode(const AVControlCommand & cmd)346 void AVSessionItem::HandleOnSetLoopMode(const AVControlCommand& cmd)
347 {
348     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnSetLoopMode");
349     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
350     int32_t loopMode = AVSESSION_ERROR;
351     CHECK_AND_RETURN_LOG(cmd.GetLoopMode(loopMode) == AVSESSION_SUCCESS, "GetLoopMode failed");
352     callback_->OnSetLoopMode(loopMode);
353 }
354 
HandleOnToggleFavorite(const AVControlCommand & cmd)355 void AVSessionItem::HandleOnToggleFavorite(const AVControlCommand& cmd)
356 {
357     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnToggleFavorite");
358     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
359     std::string assetId;
360     CHECK_AND_RETURN_LOG(cmd.GetAssetId(assetId) == AVSESSION_SUCCESS, "GetMediaId failed");
361     callback_->OnToggleFavorite(assetId);
362 }
363 
AddController(pid_t pid,sptr<AVControllerItem> & controller)364 int32_t AVSessionItem::AddController(pid_t pid, sptr<AVControllerItem>& controller)
365 {
366     std::lock_guard lockGuard(lock_);
367     controllers_.insert({pid, controller});
368     return AVSESSION_SUCCESS;
369 }
370 
SetPid(pid_t pid)371 void AVSessionItem::SetPid(pid_t pid)
372 {
373     descriptor_.pid_ = pid;
374 }
375 
SetUid(pid_t uid)376 void AVSessionItem::SetUid(pid_t uid)
377 {
378     descriptor_.uid_ = uid;
379 }
380 
GetPid() const381 pid_t AVSessionItem::GetPid() const
382 {
383     return descriptor_.pid_;
384 }
385 
GetUid() const386 pid_t AVSessionItem::GetUid() const
387 {
388     return descriptor_.uid_;
389 }
390 
GetAbilityName() const391 std::string AVSessionItem::GetAbilityName() const
392 {
393     return descriptor_.elementName_.GetAbilityName();
394 }
395 
SetTop(bool top)396 void AVSessionItem::SetTop(bool top)
397 {
398     descriptor_.isTopSession_ = top;
399 }
400 
GetRemoteSource()401 std::shared_ptr<RemoteSessionSource> AVSessionItem::GetRemoteSource()
402 {
403     return remoteSource_;
404 }
405 
HandleControllerRelease(pid_t pid)406 void AVSessionItem::HandleControllerRelease(pid_t pid)
407 {
408     std::lock_guard lockGuard(lock_);
409     controllers_.erase(pid);
410 }
411 
SetServiceCallbackForRelease(const std::function<void (AVSessionItem &)> & callback)412 void AVSessionItem::SetServiceCallbackForRelease(const std::function<void(AVSessionItem&)>& callback)
413 {
414     serviceCallback_ = callback;
415 }
416 
HandleOutputDeviceChange(const OutputDeviceInfo & outputDeviceInfo)417 void AVSessionItem::HandleOutputDeviceChange(const OutputDeviceInfo& outputDeviceInfo)
418 {
419     AVSESSION_TRACE_SYNC_START("AVSessionItem::OnOutputDeviceChange");
420     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
421     callback_->OnOutputDeviceChange(outputDeviceInfo);
422 }
423 
SetOutputDevice(const OutputDeviceInfo & info)424 void AVSessionItem::SetOutputDevice(const OutputDeviceInfo& info)
425 {
426     descriptor_.outputDeviceInfo_.isRemote_ = info.isRemote_;
427     descriptor_.outputDeviceInfo_.deviceIds_ = info.deviceIds_;
428     descriptor_.outputDeviceInfo_.deviceNames_ = info.deviceNames_;
429     HandleOutputDeviceChange(descriptor_.outputDeviceInfo_);
430     for (const auto& controller : controllers_) {
431         controller.second->HandleOutputDeviceChange(descriptor_.outputDeviceInfo_);
432     }
433     SLOGI("OutputDeviceInfo device size is %{public}d", static_cast<int32_t>(info.deviceIds_.size()));
434 }
435 
GetOutputDevice(OutputDeviceInfo & info)436 void AVSessionItem::GetOutputDevice(OutputDeviceInfo& info)
437 {
438     info = GetDescriptor().outputDeviceInfo_;
439 }
440 
CastAudioToRemote(const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sinkCapability)441 int32_t AVSessionItem::CastAudioToRemote(const std::string& sourceDevice, const std::string& sinkDevice,
442                                          const std::string& sinkCapability)
443 {
444     SLOGI("start");
445     remoteSource_ = std::make_shared<RemoteSessionSourceProxy>();
446     CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
447     int32_t ret = remoteSource_->CastSessionToRemote(this, sourceDevice, sinkDevice, sinkCapability);
448     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionToRemote failed");
449     ret = remoteSource_->SetAVMetaData(GetMetaData());
450     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVMetaData failed");
451     ret = remoteSource_->SetAVPlaybackState(GetPlaybackState());
452     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetAVPlaybackState failed");
453     SLOGI("success");
454     return AVSESSION_SUCCESS;
455 }
456 
SourceCancelCastAudio(const std::string & sinkDevice)457 int32_t AVSessionItem::SourceCancelCastAudio(const std::string& sinkDevice)
458 {
459     SLOGI("start");
460     CHECK_AND_RETURN_RET_LOG(remoteSource_ != nullptr, AVSESSION_ERROR, "remoteSource_ is nullptr");
461     int32_t ret = remoteSource_->CancelCastAudio(sinkDevice);
462     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastAudioToLocal failed");
463     SLOGI("success");
464     return AVSESSION_SUCCESS;
465 }
466 
CastAudioFromRemote(const std::string & sourceSessionId,const std::string & sourceDevice,const std::string & sinkDevice,const std::string & sourceCapability)467 int32_t AVSessionItem::CastAudioFromRemote(const std::string& sourceSessionId, const std::string& sourceDevice,
468                                            const std::string& sinkDevice, const std::string& sourceCapability)
469 {
470     SLOGI("start");
471     remoteSink_ = std::make_shared<RemoteSessionSinkProxy>();
472     CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
473     int32_t ret = remoteSink_->CastSessionFromRemote(this, sourceSessionId, sourceDevice, sinkDevice,
474                                                      sourceCapability);
475     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CastSessionFromRemote failed");
476 
477     OutputDeviceInfo deviceInfo;
478     GetOutputDevice(deviceInfo);
479     deviceInfo.isRemote_ = true;
480     SetOutputDevice(deviceInfo);
481 
482     CHECK_AND_RETURN_RET_LOG(Activate() == AVSESSION_SUCCESS, AVSESSION_ERROR, "Activate failed");
483 
484     std::vector<std::vector<int32_t>> value(SESSION_DATA_CATEGORY_MAX);
485     ret = JsonUtils::GetVectorCapability(sourceCapability, value);
486     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetVectorCapability error");
487     for (auto cmd : value[SESSION_DATA_CONTROL_COMMAND]) {
488         SLOGI("add support cmd : %{public}d", cmd);
489         ret = AddSupportCommand(cmd);
490         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "AddSupportCommand failed");
491     }
492     SLOGI("success");
493     return AVSESSION_SUCCESS;
494 }
495 
SinkCancelCastAudio()496 int32_t AVSessionItem::SinkCancelCastAudio()
497 {
498     CHECK_AND_RETURN_RET_LOG(remoteSink_ != nullptr, AVSESSION_ERROR, "remoteSink_ is nullptr");
499     int32_t ret = remoteSink_->CancelCastSession();
500     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "CancelCastSession failed");
501     GetDescriptor().outputDeviceInfo_.deviceIds_.clear();
502     GetDescriptor().outputDeviceInfo_.deviceNames_.clear();
503     SLOGI("SinkCancelCastAudio");
504     return AVSESSION_SUCCESS;
505 }
506 } // namespace OHOS::AVSession