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