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