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