1 /*
2 * Copyright (c) 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 "avcast_controller_item.h"
17 #include "avsession_radar.h"
18 #include "avsession_errors.h"
19 #include "avsession_log.h"
20 #include "avsession_trace.h"
21 #include "av_router.h"
22 #include "avsession_sysevent.h"
23 #include "avmedia_description.h"
24 #include "bundle_status_adapter.h"
25
26 #include <string>
27
28 namespace OHOS::AVSession {
AVCastControllerItem()29 AVCastControllerItem::AVCastControllerItem()
30 {
31 }
32
~AVCastControllerItem()33 AVCastControllerItem::~AVCastControllerItem()
34 {
35 }
36
Init(std::shared_ptr<IAVCastControllerProxy> castControllerProxy, const std::function<void(int32_t, std::vector<int32_t>&)>& validCommandsChangecallback)37 void AVCastControllerItem::Init(std::shared_ptr<IAVCastControllerProxy> castControllerProxy,
38 const std::function<void(int32_t, std::vector<int32_t>&)>& validCommandsChangecallback)
39 {
40 std::lock_guard lockGuard(castControllerLock_);
41 castControllerProxy_ = castControllerProxy;
42 if (castControllerProxy_ != nullptr) {
43 castControllerProxy_->RegisterControllerListener(shared_from_this());
44 }
45 validCommandsChangecallback_ = validCommandsChangecallback;
46 {
47 std::lock_guard<std::mutex> lock(callbackToSessionLock_);
48 isSessionCallbackAvailable_ = true;
49 }
50 }
51
OnCastPlaybackStateChange(const AVPlaybackState& state)52 void AVCastControllerItem::OnCastPlaybackStateChange(const AVPlaybackState& state)
53 {
54 SLOGI("OnCastPlaybackStateChange with state: %{public}d", state.GetState());
55 if (state.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAY) {
56 AVSessionRadarInfo info("AVCastControllerItem::OnCastPlaybackStateChange");
57 AVSessionRadar::GetInstance().PlayerStarted(info);
58 } else if (state.GetState() != currentState_) {
59 currentState_ = state.GetState();
60 AVSessionRadarInfo info("AVCastControllerItem::OnCastPlaybackStateChange");
61 AVSessionRadar::GetInstance().ControlCommandRespond(info);
62 }
63 AVPlaybackState stateOut;
64 std::lock_guard lockGuard(castControllerCallbackLock_);
65 if (state.CopyToByMask(castPlaybackMask_, stateOut)) {
66 SLOGI("update cast playback state");
67 AVSESSION_TRACE_SYNC_START("AVCastControllerItem::OnCastPlaybackStateChange");
68 if (callback_ != nullptr) {
69 callback_->OnCastPlaybackStateChange(stateOut);
70 }
71 }
72 }
73
OnMediaItemChange(const AVQueueItem& avQueueItem)74 void AVCastControllerItem::OnMediaItemChange(const AVQueueItem& avQueueItem)
75 {
76 SLOGI("Enter OnMediaItemChange in AVCastControllerItem.");
77 std::lock_guard lockGuard(castControllerCallbackLock_);
78 if (callback_ != nullptr) {
79 callback_->OnMediaItemChange(avQueueItem);
80 }
81 }
82
OnPlayNext()83 void AVCastControllerItem::OnPlayNext()
84 {
85 SLOGI("Enter OnPlayNext in AVCastControllerItem.");
86 AVSessionRadarInfo info("AVCastControllerItem::OnPlayNext");
87 AVSessionRadar::GetInstance().ControlCommandRespond(info);
88 std::lock_guard lockGuard(castControllerCallbackLock_);
89 if (callback_ != nullptr) {
90 callback_->OnPlayNext();
91 }
92 }
93
OnPlayPrevious()94 void AVCastControllerItem::OnPlayPrevious()
95 {
96 SLOGI("Enter OnPlayPrevious in AVCastControllerItem.");
97 AVSessionRadarInfo info("AVCastControllerItem::OnPlayPrevious");
98 AVSessionRadar::GetInstance().ControlCommandRespond(info);
99 std::lock_guard lockGuard(castControllerCallbackLock_);
100 if (callback_ != nullptr) {
101 callback_->OnPlayPrevious();
102 }
103 }
104
OnSeekDone(const int32_t seekNumber)105 void AVCastControllerItem::OnSeekDone(const int32_t seekNumber)
106 {
107 SLOGI("Enter OnSeekDone in AVCastControllerItem.");
108 AVSessionRadarInfo info("AVCastControllerItem::OnSeekDone");
109 AVSessionRadar::GetInstance().ControlCommandRespond(info);
110 std::lock_guard lockGuard(castControllerCallbackLock_);
111 if (callback_ != nullptr) {
112 callback_->OnSeekDone(seekNumber);
113 }
114 }
115
OnVideoSizeChange(const int32_t width, const int32_t height)116 void AVCastControllerItem::OnVideoSizeChange(const int32_t width, const int32_t height)
117 {
118 SLOGI("Enter OnVideoSizeChange in AVCastControllerItem.");
119 std::lock_guard lockGuard(castControllerCallbackLock_);
120 if (callback_ != nullptr) {
121 callback_->OnVideoSizeChange(width, height);
122 }
123 }
124
OnPlayerError(const int32_t errorCode, const std::string& errorMsg)125 void AVCastControllerItem::OnPlayerError(const int32_t errorCode, const std::string& errorMsg)
126 {
127 SLOGI("OnPlayerError error:%{public}d", errorCode);
128 AVSessionRadarInfo info("AVCastControllerItem::OnPlayerError");
129 info.errorCode_ = errorCode;
130 AVSessionRadar::GetInstance().ControlCommandError(info);
131 std::lock_guard lockGuard(castControllerCallbackLock_);
132 if (callback_ != nullptr) {
133 callback_->OnPlayerError(errorCode, errorMsg);
134 }
135 }
136
OnEndOfStream(const int32_t isLooping)137 void AVCastControllerItem::OnEndOfStream(const int32_t isLooping)
138 {
139 SLOGI("Enter OnEndOfStream in AVCastControllerItem.");
140 std::lock_guard lockGuard(castControllerCallbackLock_);
141 if (callback_ != nullptr) {
142 callback_->OnEndOfStream(isLooping);
143 }
144 }
145
OnPlayRequest(const AVQueueItem& avQueueItem)146 void AVCastControllerItem::OnPlayRequest(const AVQueueItem& avQueueItem)
147 {
148 SLOGI("Enter OnPlayRequest in AVCastControllerItem.");
149 AVSessionRadarInfo info("AVCastControllerItem::OnPlayRequest");
150 AVSessionRadar::GetInstance().ControlCommandRespond(info);
151 std::lock_guard lockGuard(castControllerCallbackLock_);
152 if (callback_ != nullptr) {
153 callback_->OnPlayRequest(avQueueItem);
154 }
155 }
156
OnKeyRequest(const std::string &assetId, const std::vector<uint8_t> &keyRequestData)157 void AVCastControllerItem::OnKeyRequest(const std::string &assetId, const std::vector<uint8_t> &keyRequestData)
158 {
159 SLOGI("Enter OnKeyRequest in AVCastControllerItem.");
160 std::lock_guard lockGuard(castControllerCallbackLock_);
161 if (callback_ != nullptr) {
162 callback_->OnKeyRequest(assetId, keyRequestData);
163 }
164 }
165
OnValidCommandChange(const std::vector<int32_t>& cmds)166 void AVCastControllerItem::OnValidCommandChange(const std::vector<int32_t>& cmds)
167 {
168 HandleCastValidCommandChange(cmds);
169 }
170
SendControlCommand(const AVCastControlCommand& cmd)171 int32_t AVCastControllerItem::SendControlCommand(const AVCastControlCommand& cmd)
172 {
173 SLOGI("Call SendControlCommand of cast controller proxy");
174 std::lock_guard lockGuard(castControllerLock_);
175 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
176 AVSessionRadarInfo info("AVCastControllerItem::SendControlCommand");
177 AVSessionRadar::GetInstance().SendControlCommandBegin(info);
178 castControllerProxy_->SendControlCommand(cmd);
179 AVSessionRadar::GetInstance().SendControlCommandEnd(info);
180 std::string API_PARAM_STRING = "cmd: " + std::to_string(cmd.GetCommand());
181 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
182 "API_NAME", "SendControlCommand",
183 "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
184 "API_PARAM", API_PARAM_STRING,
185 "ERROR_CODE", AVSESSION_SUCCESS,
186 "ERROR_MSG", "SUCCESS");
187 return AVSESSION_SUCCESS;
188 }
189
Start(const AVQueueItem& avQueueItem)190 int32_t AVCastControllerItem::Start(const AVQueueItem& avQueueItem)
191 {
192 std::lock_guard lockGuard(castControllerLock_);
193 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
194 AVSessionRadarInfo info("AVCastControllerItem::Start");
195 int32_t ret = castControllerProxy_->Start(avQueueItem);
196 std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "start failed";
197 std::string mediaIcon = "false";
198 std::string API_PARAM_STRING = "";
199 std::string startPosition = "";
200 std::string duration = "";
201 std::string mediauri = "";
202 if (avQueueItem.GetDescription() != nullptr) {
203 startPosition = std::to_string(avQueueItem.GetDescription()->GetStartPosition());
204 duration = std::to_string(avQueueItem.GetDescription()->GetDuration());
205 if (avQueueItem.GetDescription()->GetIcon() != nullptr ||
206 !(avQueueItem.GetDescription()->GetIconUri().empty())) {
207 mediaIcon = "true";
208 }
209 mediauri = avQueueItem.GetDescription()->GetMediaUri().empty() ? "false" : "true";
210 API_PARAM_STRING = "mediauri: " + mediauri + "," + "iconImage: " + mediaIcon + ","
211 + "mediaId: " + avQueueItem.GetDescription()->GetMediaId() + ","
212 + "title: " + avQueueItem.GetDescription()->GetTitle() + ","
213 + "subtitle: " + avQueueItem.GetDescription()->GetSubtitle() + ","
214 + "mediaType: " + avQueueItem.GetDescription()->GetMediaType() + ","
215 + "startPosition: " + startPosition + ","
216 + "duration: " + duration;
217 }
218 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
219 "API_NAME", "Start",
220 "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
221 "API_PARAM", API_PARAM_STRING,
222 "ERROR_CODE", ret,
223 "ERROR_MSG", errMsg);
224 if (ret != AVSESSION_SUCCESS) {
225 info.errorCode_ = AVSessionRadar::GetRadarErrorCode(ret);
226 AVSessionRadar::GetInstance().StartPlayFailed(info);
227 } else {
228 AVSessionRadar::GetInstance().StartPlayBegin(info);
229 }
230 return AVSESSION_SUCCESS;
231 }
232
Prepare(const AVQueueItem& avQueueItem)233 int32_t AVCastControllerItem::Prepare(const AVQueueItem& avQueueItem)
234 {
235 SLOGI("Call prepare of cast controller proxy");
236 std::lock_guard lockGuard(castControllerLock_);
237 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
238 auto ret = castControllerProxy_->Prepare(avQueueItem);
239 std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "prepare failed";
240 std::string mediaIcon = "false";
241 std::string API_PARAM_STRING = "";
242 std::string startPosition = "";
243 std::string duration = "";
244 std::string mediauri = "";
245 if (avQueueItem.GetDescription() != nullptr) {
246 startPosition = std::to_string(avQueueItem.GetDescription()->GetStartPosition());
247 duration = std::to_string(avQueueItem.GetDescription()->GetDuration());
248 if (avQueueItem.GetDescription()->GetIcon() != nullptr ||
249 !(avQueueItem.GetDescription()->GetIconUri().empty())) {
250 mediaIcon = "true";
251 }
252 mediauri = avQueueItem.GetDescription()->GetMediaUri().empty() ? "false" : "true";
253 API_PARAM_STRING = "mediauri: " + mediauri + "," + "iconImage: " + mediaIcon + ","
254 + "mediaId: " + avQueueItem.GetDescription()->GetMediaId() + ","
255 + "title: " + avQueueItem.GetDescription()->GetTitle() + ","
256 + "subtitle: " + avQueueItem.GetDescription()->GetSubtitle() + ","
257 + "mediaType: " + avQueueItem.GetDescription()->GetMediaType() + ","
258 + "startPosition: " + startPosition + ","
259 + "duration: " + duration;
260 }
261 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
262 "API_NAME", "Prepare",
263 "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
264 "API_PARAM", API_PARAM_STRING,
265 "ERROR_CODE", ret,
266 "ERROR_MSG", errMsg);
267 return AVSESSION_SUCCESS;
268 }
269
GetDuration(int32_t& duration)270 int32_t AVCastControllerItem::GetDuration(int32_t& duration)
271 {
272 std::lock_guard lockGuard(castControllerLock_);
273 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
274 return castControllerProxy_->GetDuration(duration);
275 }
276
GetCastAVPlaybackState(AVPlaybackState& avPlaybackState)277 int32_t AVCastControllerItem::GetCastAVPlaybackState(AVPlaybackState& avPlaybackState)
278 {
279 std::lock_guard lockGuard(castControllerLock_);
280 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
281 auto ret = castControllerProxy_->GetCastAVPlaybackState(avPlaybackState);
282 std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "GetCastAVPlaybackState failed";
283 int64_t avElapsedTime = avPlaybackState.GetPosition().elapsedTime_;
284 int64_t avUpdateTime = avPlaybackState.GetPosition().updateTime_;
285 std::string isFavor = avPlaybackState.GetFavorite() ? "true" : "false";
286 std::string API_PARAM_STRING = "state: " + std::to_string(avPlaybackState.GetState()) + ", "
287 + "elapsedTime: " + std::to_string(avElapsedTime) + ", "
288 + "updateTime: " + std::to_string(avUpdateTime) + ", "
289 + "loopMode: " + std::to_string(avPlaybackState.GetLoopMode()) + ", "
290 + "isFavorite: " + isFavor;
291 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
292 "API_NAME", "GetCastAVPlaybackState",
293 "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
294 "API_PARAM", API_PARAM_STRING,
295 "ERROR_CODE", ret,
296 "ERROR_MSG", errMsg);
297 return ret;
298 }
299
GetCurrentItem(AVQueueItem& currentItem)300 int32_t AVCastControllerItem::GetCurrentItem(AVQueueItem& currentItem)
301 {
302 std::lock_guard lockGuard(castControllerLock_);
303 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
304 "cast controller proxy is nullptr");
305 currentItem = castControllerProxy_->GetCurrentItem();
306 return AVSESSION_SUCCESS;
307 }
308
GetValidCommands(std::vector<int32_t>& cmds)309 int32_t AVCastControllerItem::GetValidCommands(std::vector<int32_t>& cmds)
310 {
311 if (sessionTag_ == "RemoteCast") {
312 std::lock_guard lockGuard(castControllerLock_);
313 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
314 "cast controller proxy is nullptr");
315 castControllerProxy_->GetValidAbility(cmds);
316 SLOGI("get available commands from cast with size %{public}zd", cmds.size());
317 return AVSESSION_SUCCESS;
318 }
319 {
320 std::lock_guard<std::mutex> lock(callbackToSessionLock_);
321 CHECK_AND_RETURN_RET_LOG(isSessionCallbackAvailable_, AVSESSION_ERROR, "sessionCallback not available");
322 }
323 validCommandsChangecallback_(AVCastControlCommand::CAST_CONTROL_CMD_MAX, cmds);
324 SLOGI("get available command with size %{public}zd", cmds.size());
325 return AVSESSION_SUCCESS;
326 }
327
SetDisplaySurface(std::string& surfaceId)328 int32_t AVCastControllerItem::SetDisplaySurface(std::string& surfaceId)
329 {
330 std::lock_guard lockGuard(castControllerLock_);
331 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
332 return castControllerProxy_->SetDisplaySurface(surfaceId);
333 }
334
SetCastPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType& filter)335 int32_t AVCastControllerItem::SetCastPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType& filter)
336 {
337 castPlaybackMask_ = filter;
338 return AVSESSION_SUCCESS;
339 }
340
ProcessMediaKeyResponse(const std::string &assetId, const std::vector<uint8_t> &response)341 int32_t AVCastControllerItem::ProcessMediaKeyResponse(const std::string &assetId, const std::vector<uint8_t> &response)
342 {
343 std::lock_guard lockGuard(castControllerLock_);
344 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
345 auto ret = castControllerProxy_->ProcessMediaKeyResponse(assetId, response);
346 std::string API_PARAM_STRING = "assetId: " + assetId;
347 std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "ProcessMediaKeyResponse failed";
348 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
349 "API_NAME", "ProcessMediaKeyResponse",
350 "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
351 "API_PARAM", API_PARAM_STRING,
352 "ERROR_CODE", ret,
353 "ERROR_MSG", errMsg);
354 return ret;
355 }
356
AddAvailableCommand(const int32_t cmd)357 int32_t AVCastControllerItem::AddAvailableCommand(const int32_t cmd)
358 {
359 SLOGI("add available command %{public}d with isSessionCallbackAvailable check %{public}d",
360 cmd, static_cast<int>(isSessionCallbackAvailable_));
361 std::vector<int32_t> cmds(AVCastControlCommand::CAST_CONTROL_CMD_MAX);
362 {
363 std::lock_guard<std::mutex> lock(callbackToSessionLock_);
364 CHECK_AND_RETURN_RET_LOG(isSessionCallbackAvailable_, AVSESSION_ERROR, "sessionCallback not available");
365 }
366 validCommandsChangecallback_(cmd, cmds);
367 SLOGI("add available command with size %{public}d", static_cast<int32_t>(cmds.size()));
368 if (cmds.empty()) {
369 SLOGI("check is sink session with empty, not set");
370 } else {
371 std::lock_guard lockGuard(castControllerLock_);
372 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
373 "cast controller proxy is nullptr");
374 auto ret = castControllerProxy_->SetValidAbility(cmds);
375 std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "onCastEvent failed";
376 std::string API_PARAM_STRING = "cmd: " + std::to_string(cmd);
377 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
378 "API_NAME", "onCastEvent",
379 "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
380 "API_PARAM", API_PARAM_STRING,
381 "ERROR_CODE", ret,
382 "ERROR_MSG", errMsg);
383 }
384 return AVSESSION_SUCCESS;
385 }
386
RemoveAvailableCommand(const int32_t cmd)387 int32_t AVCastControllerItem::RemoveAvailableCommand(const int32_t cmd)
388 {
389 SLOGI("remove available command %{public}d", cmd);
390 std::vector<int32_t> cmds(AVCastControlCommand::CAST_CONTROL_CMD_MAX);
391 {
392 std::lock_guard<std::mutex> lock(callbackToSessionLock_);
393 CHECK_AND_RETURN_RET_LOG(isSessionCallbackAvailable_, AVSESSION_ERROR, "sessionCallback not available");
394 }
395 validCommandsChangecallback_(cmd + removeCmdStep_, cmds);
396 SLOGI("remove available command with size %{public}d", static_cast<int32_t>(cmds.size()));
397 if (cmds.empty()) {
398 SLOGI("check is sink session with empty, not set");
399 } else {
400 std::lock_guard lockGuard(castControllerLock_);
401 CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
402 "cast controller proxy is nullptr");
403 auto ret = castControllerProxy_->SetValidAbility(cmds);
404 std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "offCastEvent failed";
405 std::string API_PARAM_STRING = "cmd: " + std::to_string(cmd);
406 HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
407 "API_NAME", "offCastEvent",
408 "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
409 "API_PARAM", API_PARAM_STRING,
410 "ERROR_CODE", ret,
411 "ERROR_MSG", errMsg);
412 }
413 return AVSESSION_SUCCESS;
414 }
415
HandleCastValidCommandChange(const std::vector<int32_t>& cmds)416 int32_t AVCastControllerItem::HandleCastValidCommandChange(const std::vector<int32_t>& cmds)
417 {
418 SLOGI("HandleCastValidCommandChange cmd size:%{public}zd", cmds.size());
419 CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "callback_ is nullptr");
420 std::lock_guard lockGuard(castControllerCallbackLock_);
421 callback_->OnCastValidCommandChanged(cmds);
422 return AVSESSION_SUCCESS;
423 }
424
SetSessionTag(const std::string tag)425 void AVCastControllerItem::SetSessionTag(const std::string tag)
426 {
427 sessionTag_ = tag;
428 }
429
RegisterControllerListener(std::shared_ptr<IAVCastControllerProxy> castControllerProxy)430 bool AVCastControllerItem::RegisterControllerListener(std::shared_ptr<IAVCastControllerProxy> castControllerProxy)
431 {
432 SLOGI("Call RegisterControllerListener of cast controller proxy");
433 CHECK_AND_RETURN_RET_LOG(castControllerProxy != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
434 return castControllerProxy->RegisterControllerListener(shared_from_this());
435 }
436
RegisterCallbackInner(const sptr<IRemoteObject>& callback)437 int32_t AVCastControllerItem::RegisterCallbackInner(const sptr<IRemoteObject>& callback)
438 {
439 SLOGI("call RegisterCallbackInner of cast controller proxy");
440 std::lock_guard lockGuard(castControllerCallbackLock_);
441 callback_ = iface_cast<AVCastControllerCallbackProxy>(callback);
442 CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "callback_ is nullptr");
443 return AVSESSION_SUCCESS;
444 }
445
Destroy()446 int32_t AVCastControllerItem::Destroy()
447 {
448 SLOGI("Start cast controller destroy process with sessionCallback available set");
449 {
450 std::lock_guard lockGuard(castControllerLock_);
451 if (castControllerProxy_) {
452 castControllerProxy_ = nullptr;
453 }
454 }
455 {
456 std::lock_guard lockGuard(castControllerCallbackLock_);
457 if (callback_) {
458 callback_ = nullptr;
459 }
460 }
461 {
462 std::lock_guard<std::mutex> lock(callbackToSessionLock_);
463 isSessionCallbackAvailable_ = false;
464 }
465 return AVSESSION_SUCCESS;
466 }
467 } // namespace OHOS::AVSession
468