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 #include <string>
16
17 #include "cj_avsession_controller_callback.h"
18 #include "avsession_log.h"
19 #include "cj_lambda.h"
20 #include "cj_avsession_utils.h"
21
22 namespace OHOS::AVSession {
23 const int32_t SESSION_DESTROY = 0;
24 const int32_t PLAYBACK_STATE_CHANGE = 1;
25 const int32_t META_DATA_CHANGE = 2;
26 const int32_t ACTIVE_STATE_CHANGE = 3;
27 const int32_t VALID_COMMAND_CHANGE = 4;
28 const int32_t OUTPUT_DEVICE_CHANGE = 5;
29 const int32_t SESSION_EVENT_CHANGE = 6;
30 const int32_t QUEUE_ITEMS_CHANGE = 7;
31 const int32_t QUEUE_TITLE_CHANGE = 8;
32 const int32_t EXTRAS_CHANGE = 9;
33 const int32_t AVCALL_META_DATA_CHANGE = 10;
34 const int32_t AVCALL_STATE_CHANGE = 11;
35 const int32_t MAX_EVENT_NUM = 12;
36
CJAVControllerCallback()37 CJAVControllerCallback::CJAVControllerCallback()
38 {
39 typeToCallbackMap_[PLAYBACK_STATE_CHANGE] = &CJAVControllerCallback::InitOnPlaybackStateChange;
40 typeToCallbackMap_[META_DATA_CHANGE] = &CJAVControllerCallback::InitOnMetaDataChange;
41 typeToCallbackMap_[ACTIVE_STATE_CHANGE] = &CJAVControllerCallback::InitOnActiveStateChange;
42 typeToCallbackMap_[AVCALL_META_DATA_CHANGE] = &CJAVControllerCallback::InitOnAVCallMetaDataChange;
43 typeToCallbackMap_[AVCALL_STATE_CHANGE] = &CJAVControllerCallback::InitOnAVCallStateChange;
44 typeToCallbackMap_[SESSION_DESTROY] = &CJAVControllerCallback::InitOnSessionDestroy;
45 typeToCallbackMap_[VALID_COMMAND_CHANGE] = &CJAVControllerCallback::InitOnValidCommandChange;
46 typeToCallbackMap_[OUTPUT_DEVICE_CHANGE] = &CJAVControllerCallback::InitOnOutputDeviceChange;
47 typeToCallbackMap_[SESSION_EVENT_CHANGE] = &CJAVControllerCallback::InitOnSessionEventChange;
48 typeToCallbackMap_[QUEUE_ITEMS_CHANGE] = &CJAVControllerCallback::InitOnQueueItemsChange;
49 typeToCallbackMap_[QUEUE_TITLE_CHANGE] = &CJAVControllerCallback::InitOnQueueTitleChange;
50 typeToCallbackMap_[EXTRAS_CHANGE] = &CJAVControllerCallback::InitOnExtrasChange;
51 for (uint32_t i = 0; i < MAX_EVENT_NUM; i++) {
52 callbackMutexMap_.push_back(std::make_shared<std::recursive_mutex>());
53 }
54 }
55
RegisterCallback(int32_t type,int64_t id)56 void CJAVControllerCallback::RegisterCallback(int32_t type, int64_t id)
57 {
58 if (typeToCallbackMap_.count(type) > 0) {
59 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[type]);
60 (this->*(typeToCallbackMap_[type]))(id);
61 } else {
62 SLOGE("INVALID EVENT TYPE");
63 }
64 }
UnRegisterCallback(int32_t type)65 void CJAVControllerCallback::UnRegisterCallback(int32_t type)
66 {
67 if (typeToCallbackMap_.count(type) > 0) {
68 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[type]);
69 (this->*(typeToCallbackMap_[type]))(0);
70 } else {
71 SLOGE("INVALID EVENT TYPE");
72 }
73 }
InitOnAVCallMetaDataChange(int64_t id)74 void CJAVControllerCallback::InitOnAVCallMetaDataChange(int64_t id)
75 {
76 if (id == 0) {
77 onAVCallMetaDataChange = nullptr;
78 return;
79 }
80 auto callback = reinterpret_cast<void(*)(CAVCallMetaData)>(id);
81 onAVCallMetaDataChange = [lambda = CJLambda::Create(callback)](CAVCallMetaData cAvCallMetaData) -> void {
82 lambda(cAvCallMetaData);
83 };
84 }
85
InitOnAVCallStateChange(int64_t id)86 void CJAVControllerCallback::InitOnAVCallStateChange(int64_t id)
87 {
88 if (id == 0) {
89 onAVCallStateChange = nullptr;
90 return;
91 }
92 auto callback = reinterpret_cast<void(*)(CAVCallState)>(id);
93 onAVCallStateChange = [lambda = CJLambda::Create(callback)](CAVCallState cAvCallstate) -> void {
94 lambda(cAvCallstate);
95 };
96 }
97
InitOnSessionDestroy(int64_t id)98 void CJAVControllerCallback::InitOnSessionDestroy(int64_t id)
99 {
100 if (id == 0) {
101 onSessionDestroy = nullptr;
102 return;
103 }
104 auto callback = reinterpret_cast<void(*)(void)>(id);
105 onSessionDestroy = [lambda = CJLambda::Create(callback)]() -> void {
106 lambda();
107 };
108 }
109
InitOnPlaybackStateChange(int64_t id)110 void CJAVControllerCallback::InitOnPlaybackStateChange(int64_t id)
111 {
112 if (id == 0) {
113 onPlaybackStateChange = nullptr;
114 return;
115 }
116 auto callback = reinterpret_cast<void(*)(CAVPlaybackState)>(id);
117 onPlaybackStateChange = [lambda = CJLambda::Create(callback)](CAVPlaybackState cAvPlaybackState) -> void {
118 lambda(cAvPlaybackState);
119 };
120 }
121
InitOnMetaDataChange(int64_t id)122 void CJAVControllerCallback::InitOnMetaDataChange(int64_t id)
123 {
124 if (id == 0) {
125 onMetaDataChange = nullptr;
126 return;
127 }
128 auto callback = reinterpret_cast<void(*)(CAVMetaData)>(id);
129 onMetaDataChange = [lambda = CJLambda::Create(callback)](CAVMetaData cAvMetaData) -> void {
130 lambda(cAvMetaData);
131 };
132 }
InitOnActiveStateChange(int64_t id)133 void CJAVControllerCallback::InitOnActiveStateChange(int64_t id)
134 {
135 if (id == 0) {
136 onActiveStateChange = nullptr;
137 return;
138 }
139 auto callback = reinterpret_cast<void(*)(bool)>(id);
140 onActiveStateChange = [lambda = CJLambda::Create(callback)](bool isActive) -> void {
141 lambda(isActive);
142 };
143 }
InitOnValidCommandChange(int64_t id)144 void CJAVControllerCallback::InitOnValidCommandChange(int64_t id)
145 {
146 if (id == 0) {
147 onValidCommandChange = nullptr;
148 return;
149 }
150 auto callback = reinterpret_cast<void(*)(CArray)>(id);
151 onValidCommandChange = [lambda = CJLambda::Create(callback)](CArray cmds) -> void {
152 lambda(cmds);
153 };
154 }
155
InitOnOutputDeviceChange(int64_t id)156 void CJAVControllerCallback::InitOnOutputDeviceChange(int64_t id)
157 {
158 if (id == 0) {
159 onOutputDeviceChange = nullptr;
160 return;
161 }
162 auto callback = reinterpret_cast<void(*)(const int32_t, COutputDeviceInfo)>(id);
163 onOutputDeviceChange = [lambda = CJLambda::Create(callback)](
164 const int32_t connectionState, COutputDeviceInfo cOutputDeviceInfo) -> void {
165 lambda(connectionState, cOutputDeviceInfo);
166 };
167 }
168
InitOnSessionEventChange(int64_t id)169 void CJAVControllerCallback::InitOnSessionEventChange(int64_t id)
170 {
171 if (id == 0) {
172 onSessionEventChange = nullptr;
173 return;
174 }
175 auto callback = reinterpret_cast<void(*)(const char*, CArray)>(id);
176 onSessionEventChange = [lambda = CJLambda::Create(callback)](const char* event, CArray args) -> void {
177 lambda(event, args);
178 };
179 }
180
InitOnQueueItemsChange(int64_t id)181 void CJAVControllerCallback::InitOnQueueItemsChange(int64_t id)
182 {
183 if (id == 0) {
184 onQueueItemsChange = nullptr;
185 return;
186 }
187 auto callback = reinterpret_cast<void(*)(CArray)>(id);
188 onQueueItemsChange = [lambda = CJLambda::Create(callback)](CArray items) -> void {
189 lambda(items);
190 };
191 }
192
InitOnQueueTitleChange(int64_t id)193 void CJAVControllerCallback::InitOnQueueTitleChange(int64_t id)
194 {
195 if (id == 0) {
196 onQueueTitleChange = nullptr;
197 return;
198 }
199 auto callback = reinterpret_cast<void(*)(const char*)>(id);
200 onQueueTitleChange = [lambda = CJLambda::Create(callback)](const char* title) -> void {
201 lambda(title);
202 };
203 }
204
InitOnExtrasChange(int64_t id)205 void CJAVControllerCallback::InitOnExtrasChange(int64_t id)
206 {
207 if (id == 0) {
208 onExtrasChange = nullptr;
209 return;
210 }
211 auto callback = reinterpret_cast<void(*)(CArray)>(id);
212 onExtrasChange = [lambda = CJLambda::Create(callback)](CArray extras) -> void {
213 lambda(extras);
214 };
215 }
216
OnAVCallMetaDataChange(const AVCallMetaData & avCallMetaData)217 void CJAVControllerCallback::OnAVCallMetaDataChange(const AVCallMetaData& avCallMetaData)
218 {
219 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[AVCALL_META_DATA_CHANGE]);
220 if (onAVCallMetaDataChange == nullptr) {
221 SLOGD("onAVCallMetaDataChange null");
222 return;
223 }
224 CAVCallMetaData cAvCallMetaData {};
225 int ret = CJNO_ERROR;
226 ret = ConvertNativeToCJStruct(avCallMetaData, cAvCallMetaData);
227 if (ret != CJNO_ERROR) {
228 cjStructHeapFree(cAvCallMetaData);
229 return;
230 }
231 SLOGD("onAVCallMetaDataChange runs");
232 onAVCallMetaDataChange(cAvCallMetaData);
233 cjStructHeapFree(cAvCallMetaData);
234 }
235
OnAVCallStateChange(const AVCallState & avCallState)236 void CJAVControllerCallback::OnAVCallStateChange(const AVCallState& avCallState)
237 {
238 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[AVCALL_STATE_CHANGE]);
239 if (onAVCallStateChange == nullptr) {
240 SLOGD("onAVCallStateChange null");
241 return;
242 }
243 CAVCallState cAvCallState;
244 int ret = CJNO_ERROR;
245 ret = ConvertNativeToCJStruct(avCallState, cAvCallState);
246 if (ret != CJNO_ERROR) {
247 return;
248 }
249 SLOGD("onAVCallStateChange runs");
250 onAVCallStateChange(cAvCallState);
251 }
252
OnSessionDestroy()253 void CJAVControllerCallback::OnSessionDestroy()
254 {
255 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[SESSION_DESTROY]);
256 if (onSessionDestroy == nullptr) {
257 SLOGD("onSessionDestroy null");
258 return;
259 }
260 SLOGD("onSessionDestroy runs");
261 onSessionDestroy();
262 }
263
OnPlaybackStateChange(const AVPlaybackState & state)264 void CJAVControllerCallback::OnPlaybackStateChange(const AVPlaybackState& state)
265 {
266 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[PLAYBACK_STATE_CHANGE]);
267 if (onPlaybackStateChange == nullptr) {
268 SLOGD("onPlaybackStateChange null");
269 return;
270 }
271 CAVPlaybackState cAvPlaybackState {};
272 int ret = CJNO_ERROR;
273 ret = ConvertNativeToCJStruct(state, cAvPlaybackState);
274 if (ret != CJNO_ERROR) {
275 cjStructHeapFree(cAvPlaybackState);
276 return;
277 }
278 SLOGD("onPlaybackStateChange runs");
279 onPlaybackStateChange(cAvPlaybackState);
280 cjStructHeapFree(cAvPlaybackState);
281 }
282
OnMetaDataChange(const AVMetaData & data)283 void CJAVControllerCallback::OnMetaDataChange(const AVMetaData& data)
284 {
285 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[META_DATA_CHANGE]);
286 if (onMetaDataChange == nullptr) {
287 SLOGD("onMetaDataChange null");
288 return;
289 }
290 CAVMetaData cAvMetaData {};
291 int ret = CJNO_ERROR;
292 ret = ConvertNativeToCJStruct(data, cAvMetaData);
293 if (ret != CJNO_ERROR) {
294 cjStructHeapFree(cAvMetaData);
295 return;
296 }
297 SLOGD("onMetaDataChange runs");
298 onMetaDataChange(cAvMetaData);
299 cjStructHeapFree(cAvMetaData);
300 }
301
OnActiveStateChange(bool isActive)302 void CJAVControllerCallback::OnActiveStateChange(bool isActive)
303 {
304 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[ACTIVE_STATE_CHANGE]);
305 if (onActiveStateChange == nullptr) {
306 SLOGD("onActiveStateChange null");
307 return;
308 }
309 SLOGD("onActiveStateChange runs");
310 onActiveStateChange(isActive);
311 }
312
OnValidCommandChange(const std::vector<int32_t> & cmds)313 void CJAVControllerCallback::OnValidCommandChange(const std::vector<int32_t>& cmds)
314 {
315 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[VALID_COMMAND_CHANGE]);
316 if (onValidCommandChange == nullptr) {
317 SLOGD("onValidCommandChange null");
318 return;
319 }
320 CArray cCmds {};
321 int ret = CJNO_ERROR;
322 ret = ConvertNativeToCJStruct(cmds, cCmds);
323 if (ret != CJNO_ERROR) {
324 cjStructHeapFree(cCmds);
325 return;
326 }
327 SLOGD("onValidCommandChange runs");
328 onValidCommandChange(cCmds);
329 cjStructHeapFree(cCmds);
330 }
331
OnOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & info)332 void CJAVControllerCallback::OnOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& info)
333 {
334 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[OUTPUT_DEVICE_CHANGE]);
335 if (onOutputDeviceChange == nullptr) {
336 SLOGD("onOutputDeviceChange null");
337 return;
338 }
339 COutputDeviceInfo cOutputDeviceInfo {};
340 int ret = CJNO_ERROR;
341 ret = ConvertNativeToCJStruct(info, cOutputDeviceInfo);
342 if (ret != CJNO_ERROR) {
343 cjStructHeapFree(cOutputDeviceInfo);
344 return;
345 }
346 SLOGD("onOutputDeviceChange runs");
347 onOutputDeviceChange(connectionState, cOutputDeviceInfo);
348 cjStructHeapFree(cOutputDeviceInfo);
349 }
350
OnSessionEventChange(const std::string & event,const AAFwk::WantParams & args)351 void CJAVControllerCallback::OnSessionEventChange(const std::string& event, const AAFwk::WantParams& args)
352 {
353 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[SESSION_EVENT_CHANGE]);
354 SLOGD("session event changed");
355 if (onSessionEventChange == nullptr) {
356 SLOGD("onSessionEventChange null");
357 return;
358 }
359 int ret = CJNO_ERROR;
360 char* cEvent = nullptr;
361 ret = ConvertNativeToCJStruct(event, cEvent);
362 if (ret != CJNO_ERROR) {
363 SLOGD("std::string convert to c_str failed");
364 return ;
365 }
366
367 CArray cArgs {};
368 ret = ConvertNativeToCJStruct(args, cArgs);
369 if (ret != CJNO_ERROR) {
370 free(cEvent);
371 cjStructHeapFreeWant(cArgs);
372 SLOGD("AAFwk::WantParams convert to C Type failed");
373 return ;
374 }
375 onSessionEventChange(cEvent, cArgs);
376 free(cEvent);
377 cjStructHeapFreeWant(cArgs);
378 }
379
OnQueueItemsChange(const std::vector<AVQueueItem> & items)380 void CJAVControllerCallback::OnQueueItemsChange(const std::vector<AVQueueItem>& items)
381 {
382 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[QUEUE_ITEMS_CHANGE]);
383 if (onQueueItemsChange == nullptr) {
384 SLOGD("onQueueItemsChange null");
385 return;
386 }
387 CArray cQueueItems {};
388 int ret = CJNO_ERROR;
389 ret = ConvertNativeToCJStruct(items, cQueueItems);
390 if (ret != CJNO_ERROR) {
391 cjStructHeapFreeAVQueueItem(cQueueItems);
392 return;
393 }
394 SLOGD("onQueueItemsChange runs");
395 onQueueItemsChange(cQueueItems);
396 cjStructHeapFreeAVQueueItem(cQueueItems);
397 }
398
OnQueueTitleChange(const std::string & title)399 void CJAVControllerCallback::OnQueueTitleChange(const std::string& title)
400 {
401 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[QUEUE_TITLE_CHANGE]);
402 if (onQueueTitleChange == nullptr) {
403 SLOGD("onQueueTitleChange null");
404 return;
405 }
406 SLOGD("onQueueTitleChange runs");
407 onQueueTitleChange(title.c_str());
408 }
409
OnExtrasChange(const AAFwk::WantParams & extras)410 void CJAVControllerCallback::OnExtrasChange(const AAFwk::WantParams& extras)
411 {
412 std::lock_guard<std::recursive_mutex> lock(*callbackMutexMap_[EXTRAS_CHANGE]);
413 if (onExtrasChange == nullptr) {
414 SLOGD("onExtrasChange null");
415 return;
416 }
417 CArray cExtras {};
418 int ret = CJNO_ERROR;
419 ret = ConvertNativeToCJStruct(extras, cExtras);
420 if (ret != CJNO_ERROR) {
421 cjStructHeapFreeWant(cExtras);
422 return;
423 }
424 SLOGD("onExtrasChange runs");
425 onExtrasChange(cExtras);
426 cjStructHeapFreeWant(cExtras);
427 }
428 };