• 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 #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 };