• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "cj_avsession_cast_controller_callback.h"
17 
18 #include "avsession_errors.h"
19 #include "avsession_log.h"
20 #include "cj_avsession_utils.h"
21 namespace OHOS::AVSession {
convertToCallbackData(const T & native,int32_t eventType,bool convert=true)22 template<class T, class CT> CCallbackData* convertToCallbackData(
23     const T& native, int32_t eventType, bool convert = true)
24 {
25     CCallbackData *callbackData = static_cast<CCallbackData *>(malloc(sizeof(CCallbackData)));
26     if (callbackData != nullptr) {
27         callbackData->kind = eventType;
28         if (!convert) {
29             callbackData->error = CJNO_ERROR;
30             callbackData->data = nullptr;
31             return callbackData;
32         }
33         CT* cData = static_cast<CT *>(malloc(sizeof(CT)));
34         if (cData != nullptr) {
35             callbackData->error = ConvertNativeToCJStruct(native, *cData);
36             callbackData->data = static_cast<void *>(cData);
37         } else {
38             callbackData->error = ERR_NO_MEMORY;
39             callbackData->data = nullptr;
40         }
41     }
42     return callbackData;
43 }
44 
convertToCallbackData(const T & native,const T2 & native2,int32_t eventType)45 template<class T, class CT, class T2, class CT2> CCallbackData* convertToCallbackData(
46     const T& native, const T2& native2, int32_t eventType)
47 {
48     CCallbackData *callbackData = static_cast<CCallbackData *>(malloc(sizeof(CCallbackData)));
49     if (callbackData != nullptr) {
50         callbackData->kind = eventType;
51         CT* cData = static_cast<CT *>(malloc(sizeof(CT)));
52         if (cData != nullptr) {
53             callbackData->error = ConvertNativeToCJStruct(native, *cData);
54             callbackData->data = static_cast<void *>(cData);
55         } else {
56             callbackData->error = ERR_NO_MEMORY;
57             callbackData->data = nullptr;
58         }
59         CT2* cData2 = static_cast<CT2 *>(malloc(sizeof(CT2)));
60         if (cData2 != nullptr) {
61             callbackData->error = ConvertNativeToCJStruct(native2, *cData2);
62             callbackData->data2 = static_cast<void *>(cData2);
63         } else {
64             callbackData->error = ERR_NO_MEMORY;
65             callbackData->data2 = nullptr;
66         }
67     }
68     return callbackData;
69 }
70 
convertToCallbackData(int32_t eventType)71 CCallbackData* convertToCallbackData(int32_t eventType)
72 {
73     int32_t nothing = 0;
74     return convertToCallbackData<int32_t, int32_t>(nothing, eventType, false);
75 }
76 
freeCallbackData(CCallbackData * callbackData)77 template<class CT> void freeCallbackData(CCallbackData* callbackData)
78 {
79     if (callbackData == nullptr) {
80         return;
81     }
82     if (callbackData->data != nullptr) {
83         free(static_cast<CT *>(callbackData->data));
84     }
85     free(callbackData);
86 }
87 
freeCallbackData(CCallbackData * callbackData)88 template<class CT, class CT2> void freeCallbackData(CCallbackData* callbackData)
89 {
90     if (callbackData == nullptr) {
91         return;
92     }
93     if (callbackData->data != nullptr) {
94         free(static_cast<CT *>(callbackData->data));
95     }
96     if (callbackData->data2 != nullptr) {
97         free(static_cast<CT2 *>(callbackData->data2));
98     }
99     free(callbackData);
100 }
101 
CJAVCastControllerCallback()102 CJAVCastControllerCallback::CJAVCastControllerCallback()
103 {
104     doCall_ = [](CCallbackData* data) {
105         SLOGE("Callback of CJAVCastControllerCallback is not initialized yet!");
106     };
107 }
108 
AddCallback(DoCallFunc doCall)109 void CJAVCastControllerCallback::AddCallback(DoCallFunc doCall)
110 {
111     doCall_ = doCall;
112 }
113 
OnCastPlaybackStateChange(const AVPlaybackState & state)114 void CJAVCastControllerCallback::OnCastPlaybackStateChange(const AVPlaybackState& state)
115 {
116     CCallbackData* callbackData = convertToCallbackData<AVPlaybackState, CAVPlaybackState>(
117         state, EVENT_CAST_PLAYBACK_STATE_CHANGE);
118     doCall_(callbackData);
119     freeCallbackData<CAVPlaybackState>(callbackData);
120 }
121 
OnMediaItemChange(const AVQueueItem & avQueueItem)122 void CJAVCastControllerCallback::OnMediaItemChange(const AVQueueItem& avQueueItem)
123 {
124     CCallbackData* callbackData = convertToCallbackData<AVQueueItem, CAVQueueItem>(
125         avQueueItem, EVENT_CAST_MEDIA_ITEM_CHANGE);
126     doCall_(callbackData);
127     freeCallbackData<CAVQueueItem>(callbackData);
128 }
129 
OnPlayNext()130 void CJAVCastControllerCallback::OnPlayNext()
131 {
132     CCallbackData* callbackData = convertToCallbackData(EVENT_CAST_PLAY_NEXT);
133     doCall_(callbackData);
134     if (callbackData) { free(callbackData); }
135 }
136 
OnPlayPrevious()137 void CJAVCastControllerCallback::OnPlayPrevious()
138 {
139     CCallbackData* callbackData = convertToCallbackData(EVENT_CAST_PLAY_PREVIOUS);
140     doCall_(callbackData);
141     if (callbackData) { free(callbackData); }
142 }
143 
OnSeekDone(const int32_t seekNumber)144 void CJAVCastControllerCallback::OnSeekDone(const int32_t seekNumber)
145 {
146     CCallbackData* callbackData = convertToCallbackData<int32_t, int32_t>(
147         seekNumber, EVENT_CAST_SEEK_DONE);
148     doCall_(callbackData);
149     freeCallbackData<int32_t>(callbackData);
150 }
151 
OnVideoSizeChange(const int32_t width,const int32_t height)152 void CJAVCastControllerCallback::OnVideoSizeChange(const int32_t width, const int32_t height)
153 {}
154 
OnPlayerError(const int32_t errorCode,const std::string & errorMsg)155 void CJAVCastControllerCallback::OnPlayerError(const int32_t errorCode, const std::string& errorMsg)
156 {
157     CCallbackData* callbackData = convertToCallbackData<std::string, char*>(
158         errorMsg, EVENT_CAST_ERROR);
159     if (callbackData != nullptr) { callbackData->error = errorCode; }
160     doCall_(callbackData);
161     freeCallbackData<int32_t>(callbackData);
162 }
163 
OnEndOfStream(const int32_t isLooping)164 void CJAVCastControllerCallback::OnEndOfStream(const int32_t isLooping)
165 {
166     CCallbackData* callbackData = convertToCallbackData<int32_t, int32_t>(
167         isLooping, EVENT_CAST_END_OF_STREAM);
168     doCall_(callbackData);
169     freeCallbackData<int32_t>(callbackData);
170 }
171 
OnPlayRequest(const AVQueueItem & avQueueItem)172 void CJAVCastControllerCallback::OnPlayRequest(const AVQueueItem& avQueueItem)
173 {
174     CCallbackData* callbackData = convertToCallbackData<AVQueueItem, CAVQueueItem>(
175         avQueueItem, EVENT_CAST_REQUEST_PLAY);
176     doCall_(callbackData);
177     freeCallbackData<CAVQueueItem>(callbackData);
178 }
179 
OnKeyRequest(const std::string & assetId,const std::vector<uint8_t> & keyRequestData)180 void CJAVCastControllerCallback::OnKeyRequest(const std::string& assetId, const std::vector<uint8_t>& keyRequestData)
181 {
182     CCallbackData* callbackData = convertToCallbackData<std::string, char*, std::vector<uint8_t>, CArray>(
183         assetId, keyRequestData, EVENT_CAST_KEY_REQUEST);
184     doCall_(callbackData);
185     freeCallbackData<char*, CArray>(callbackData);
186 }
187 
OnCastValidCommandChanged(const std::vector<int32_t> & cmds)188 void CJAVCastControllerCallback::OnCastValidCommandChanged(const std::vector<int32_t> &cmds)
189 {
190     CCallbackData* callbackData = convertToCallbackData<std::vector<int32_t>, CArray>(
191         cmds, EVENT_CAST_VALID_COMMAND_CHANGED);
192     doCall_(callbackData);
193     freeCallbackData<CArray>(callbackData);
194 }
195 
196 } // namespace AVSession::OHOS