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 "OHAVSessionCallbackImpl.h"
17 #include "avcast_control_command.h"
18 
19 namespace OHOS::AVSession {
~OHAVSessionCallbackImpl()20 OHAVSessionCallbackImpl::~OHAVSessionCallbackImpl()
21 {
22 }
23 
OnPlay()24 void OHAVSessionCallbackImpl::OnPlay()
25 {
26     for (auto it = playCallbacks_.begin(); it != playCallbacks_.end(); ++it) {
27         it->first(avsession_, CONTROL_CMD_PLAY, it->second);
28     }
29 }
30 
OnPause()31 void OHAVSessionCallbackImpl::OnPause()
32 {
33     for (auto it = pauseCallbacks_.begin(); it != pauseCallbacks_.end(); ++it) {
34         it->first(avsession_, CONTROL_CMD_PAUSE, it->second);
35     }
36 }
37 
OnStop()38 void OHAVSessionCallbackImpl::OnStop()
39 {
40     for (auto it = stopCallbacks_.begin(); it != stopCallbacks_.end(); ++it) {
41         it->first(avsession_, CONTROL_CMD_STOP, it->second);
42     }
43 }
44 
OnPlayNext()45 void OHAVSessionCallbackImpl::OnPlayNext()
46 {
47     for (auto it = playNextCallbacks_.begin(); it != playNextCallbacks_.end(); ++it) {
48         it->first(avsession_, CONTROL_CMD_PLAY_NEXT, it->second);
49     }
50 }
51 
OnPlayPrevious()52 void OHAVSessionCallbackImpl::OnPlayPrevious()
53 {
54     for (auto it = playPreviousCallbacks_.begin(); it != playPreviousCallbacks_.end(); ++it) {
55         it->first(avsession_, CONTROL_CMD_PLAY_PREVIOUS, it->second);
56     }
57 }
58 
OnFastForward(int64_t time)59 void OHAVSessionCallbackImpl::OnFastForward(int64_t time)
60 {
61     for (auto it = forwardCallbacks_.begin(); it != forwardCallbacks_.end(); ++it) {
62         it->first(avsession_, time, it->second);
63     }
64 }
65 
OnRewind(int64_t time)66 void OHAVSessionCallbackImpl::OnRewind(int64_t time)
67 {
68     for (auto it = rewindCallbacks_.begin(); it != rewindCallbacks_.end(); ++it) {
69         it->first(avsession_, time, it->second);
70     }
71 }
72 
OnSeek(int64_t time)73 void OHAVSessionCallbackImpl::OnSeek(int64_t time)
74 {
75     for (auto it = seekCallbacks_.begin(); it != seekCallbacks_.end(); ++it) {
76         it->first(avsession_, time, it->second);
77     }
78 }
79 
OnSetLoopMode(int32_t loopMode)80 void OHAVSessionCallbackImpl::OnSetLoopMode(int32_t loopMode)
81 {
82     for (auto it = setLoopModeCallbacks_.begin(); it != setLoopModeCallbacks_.end(); ++it) {
83         it->first(avsession_, static_cast<AVSession_LoopMode>(loopMode), it->second);
84     }
85 }
86 
OnToggleFavorite(const std::string & mediald)87 void OHAVSessionCallbackImpl::OnToggleFavorite(const std::string& mediald)
88 {
89     for (auto it = toggleFavoriteCallbacks_.begin(); it != toggleFavoriteCallbacks_.end(); ++it) {
90         it->first(avsession_, mediald.c_str(), it->second);
91     }
92 }
93 
SetPlayCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback,void * userData)94 AVSession_ErrCode OHAVSessionCallbackImpl::SetPlayCallback(OH_AVSession* avsession,
95     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback, void*userData)
96 {
97     if (avsession_ == nullptr) {
98         avsession_ = avsession;
99     }
100     auto it = std::find_if (playCallbacks_.begin(), playCallbacks_.end(),
101         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
102             return element.first == callback;
103         });
104     if (it == playCallbacks_.end()) {
105         playCallbacks_.emplace_back(std::make_pair(callback, userData));
106     }
107     return AV_SESSION_ERR_SUCCESS;
108 }
109 
SetPauseCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback,void * userData)110 AVSession_ErrCode OHAVSessionCallbackImpl::SetPauseCallback(OH_AVSession* avsession,
111     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback, void*userData)
112 {
113     if (avsession_ == nullptr) {
114         avsession_ = avsession;
115     }
116     auto it = std::find_if (pauseCallbacks_.begin(), pauseCallbacks_.end(),
117         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
118             return element.first == callback;
119         });
120     if (it== pauseCallbacks_.end()) {
121         pauseCallbacks_.emplace_back(std::make_pair(callback, userData));
122     }
123     return AV_SESSION_ERR_SUCCESS;
124 }
125 
SetStopCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback,void * userData)126 AVSession_ErrCode OHAVSessionCallbackImpl::SetStopCallback(OH_AVSession* avsession,
127     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback, void*userData)
128 {
129     if (avsession_ == nullptr) {
130         avsession_ = avsession;
131     }
132     auto it = std::find_if (stopCallbacks_.begin(), stopCallbacks_.end(),
133         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
134             return element.first == callback;
135         });
136     if (it == stopCallbacks_.end()) {
137         stopCallbacks_.emplace_back(std::make_pair(callback, userData));
138     }
139     return AV_SESSION_ERR_SUCCESS;
140 }
141 
SetPlayNextCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback,void * userData)142 AVSession_ErrCode OHAVSessionCallbackImpl::SetPlayNextCallback(OH_AVSession* avsession,
143     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback, void*userData)
144 {
145     if (avsession_ == nullptr) {
146         avsession_ = avsession;
147     }
148     auto it = std::find_if (playNextCallbacks_.begin(), playNextCallbacks_.end(),
149         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
150             return element.first == callback;
151         });
152     if (it == playNextCallbacks_.end()) {
153         playNextCallbacks_.emplace_back(std::make_pair(callback, userData));
154     }
155     return AV_SESSION_ERR_SUCCESS;
156 }
157 
SetPlayPreviousCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback,void * userData)158 AVSession_ErrCode OHAVSessionCallbackImpl::SetPlayPreviousCallback(OH_AVSession* avsession,
159     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback, void*userData)
160 {
161     if (avsession_ == nullptr) {
162         avsession_ = avsession;
163     }
164     auto it = std::find_if (playPreviousCallbacks_.begin(), playPreviousCallbacks_.end(),
165         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
166             return element.first == callback;
167         });
168     if (it == playPreviousCallbacks_.end()) {
169         playPreviousCallbacks_.emplace_back(std::make_pair(callback, userData));
170     }
171     return AV_SESSION_ERR_SUCCESS;
172 }
173 
UnSetPlayCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback)174 AVSession_ErrCode OHAVSessionCallbackImpl::UnSetPlayCallback(OH_AVSession* avsession,
175     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback)
176 {
177     std::remove_if (playCallbacks_.begin(), playCallbacks_.end(),
178         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
179             return element.first == callback;
180         });
181     return AV_SESSION_ERR_SUCCESS;
182 }
183 
UnSetPauseCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback)184 AVSession_ErrCode OHAVSessionCallbackImpl::UnSetPauseCallback(OH_AVSession* avsession,
185     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback)
186 {
187     std::remove_if (pauseCallbacks_.begin(), pauseCallbacks_.end(),
188         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
189             return element.first == callback;
190         });
191     return AV_SESSION_ERR_SUCCESS;
192 }
193 
UnSetStopCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback)194 AVSession_ErrCode OHAVSessionCallbackImpl::UnSetStopCallback(OH_AVSession* avsession,
195     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback)
196 {
197     std::remove_if (stopCallbacks_.begin(), stopCallbacks_.end(),
198         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
199             return element.first == callback;
200         });
201     return AV_SESSION_ERR_SUCCESS;
202 }
203 
UnSetPlayNextCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback)204 AVSession_ErrCode OHAVSessionCallbackImpl::UnSetPlayNextCallback(OH_AVSession* avsession,
205     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback)
206 {
207     std::remove_if (playNextCallbacks_.begin(), playNextCallbacks_.end(),
208         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
209             return element.first == callback;
210         });
211     return AV_SESSION_ERR_SUCCESS;
212 }
213 
UnSetPlayPreviousCallback(OH_AVSession * avsession,AVSession_ControlCommand command,OH_AVSessionCallback_OnCommand callback)214 AVSession_ErrCode OHAVSessionCallbackImpl::UnSetPlayPreviousCallback(OH_AVSession* avsession,
215     AVSession_ControlCommand command, OH_AVSessionCallback_OnCommand callback)
216 {
217     std::remove_if (playPreviousCallbacks_.begin(), playPreviousCallbacks_.end(),
218         [callback](const std::pair<OH_AVSessionCallback_OnCommand, void*> &element) {
219             return element.first == callback;
220         });
221     return AV_SESSION_ERR_SUCCESS;
222 }
223 
RegisterForwardCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnFastForward callback,void * userData)224 AVSession_ErrCode OHAVSessionCallbackImpl::RegisterForwardCallback(OH_AVSession* avsession,
225     OH_AVSessionCallback_OnFastForward callback, void*userData)
226 {
227     if (avsession_ == nullptr) {
228         avsession_ = avsession;
229     }
230     auto it = std::find_if (forwardCallbacks_.begin(), forwardCallbacks_.end(),
231         [callback](const std::pair<OH_AVSessionCallback_OnFastForward, void*> &element) {
232             return element.first == callback;
233         });
234     if (it == forwardCallbacks_.end()) {
235         forwardCallbacks_.emplace_back(std::make_pair(callback, userData));
236     }
237     return AV_SESSION_ERR_SUCCESS;
238 }
239 
UnregisterForwardCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnFastForward callback)240 AVSession_ErrCode OHAVSessionCallbackImpl::UnregisterForwardCallback(OH_AVSession* avsession,
241     OH_AVSessionCallback_OnFastForward callback)
242 {
243     std::remove_if (forwardCallbacks_.begin(), forwardCallbacks_.end(),
244         [callback](const std::pair<OH_AVSessionCallback_OnFastForward, void*> &element) {
245             return element.first == callback;
246         });
247     return AV_SESSION_ERR_SUCCESS;
248 }
249 
RegisterRewindCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnRewind callback,void * userData)250 AVSession_ErrCode OHAVSessionCallbackImpl::RegisterRewindCallback(OH_AVSession* avsession,
251     OH_AVSessionCallback_OnRewind callback, void*userData)
252 {
253     if (avsession_ == nullptr) {
254         avsession_ = avsession;
255     }
256     auto it = std::find_if (rewindCallbacks_.begin(), rewindCallbacks_.end(),
257         [callback](const std::pair<OH_AVSessionCallback_OnRewind, void*> &element) {
258             return element.first == callback;
259         });
260     if (it == rewindCallbacks_.end()) {
261         rewindCallbacks_.emplace_back(std::make_pair(callback, userData));
262     }
263     return AV_SESSION_ERR_SUCCESS;
264 }
265 
UnregisterRewindCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnRewind callback)266 AVSession_ErrCode OHAVSessionCallbackImpl::UnregisterRewindCallback(OH_AVSession* avsession,
267     OH_AVSessionCallback_OnRewind callback)
268 {
269     std::remove_if (rewindCallbacks_.begin(), rewindCallbacks_.end(),
270         [callback](const std::pair<OH_AVSessionCallback_OnRewind, void*> &element) {
271             return element.first == callback;
272         });
273     return AV_SESSION_ERR_SUCCESS;
274 }
275 
RegisterSeekCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnSeek callback,void * userData)276 AVSession_ErrCode OHAVSessionCallbackImpl::RegisterSeekCallback(OH_AVSession* avsession,
277     OH_AVSessionCallback_OnSeek callback, void*userData)
278 {
279     if (avsession_ == nullptr) {
280         avsession_ = avsession;
281     }
282     auto it = std::find_if (seekCallbacks_.begin(), seekCallbacks_.end(),
283         [callback](const std::pair<OH_AVSessionCallback_OnSeek, void*> &element) {
284             return element.first == callback;
285         });
286     if (it == seekCallbacks_.end()) {
287         seekCallbacks_.emplace_back(std::make_pair(callback, userData));
288     }
289     return AV_SESSION_ERR_SUCCESS;
290 }
291 
UnregisterSeekCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnSeek callback)292 AVSession_ErrCode OHAVSessionCallbackImpl::UnregisterSeekCallback(OH_AVSession* avsession,
293     OH_AVSessionCallback_OnSeek callback)
294 {
295     std::remove_if (seekCallbacks_.begin(), seekCallbacks_.end(),
296         [callback](const std::pair<OH_AVSessionCallback_OnSeek, void*> &element) {
297             return element.first == callback;
298         });
299     return AV_SESSION_ERR_SUCCESS;
300 }
301 
RegisterSetLoopModeCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnSetLoopMode callback,void * userData)302 AVSession_ErrCode OHAVSessionCallbackImpl::RegisterSetLoopModeCallback(OH_AVSession* avsession,
303     OH_AVSessionCallback_OnSetLoopMode callback, void*userData)
304 {
305     if (avsession_ == nullptr) {
306         avsession_ = avsession;
307     }
308     auto it = std::find_if (setLoopModeCallbacks_.begin(), setLoopModeCallbacks_.end(),
309         [callback](const std::pair<OH_AVSessionCallback_OnSetLoopMode, void*> &element) {
310             return element.first == callback;
311         });
312     if (it == setLoopModeCallbacks_.end()) {
313         setLoopModeCallbacks_.emplace_back(std::make_pair(callback, userData));
314     }
315     return AV_SESSION_ERR_SUCCESS;
316 }
317 
UnregisterSetLoopModeCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnSetLoopMode callback)318 AVSession_ErrCode OHAVSessionCallbackImpl::UnregisterSetLoopModeCallback(OH_AVSession* avsession,
319     OH_AVSessionCallback_OnSetLoopMode callback)
320 {
321     std::remove_if (setLoopModeCallbacks_.begin(), setLoopModeCallbacks_.end(),
322         [callback](const std::pair<OH_AVSessionCallback_OnSetLoopMode, void*> &element) {
323             return element.first == callback;
324         });
325     return AV_SESSION_ERR_SUCCESS;
326 }
327 
RegisterToggleFavoriteCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnToggleFavorite callback,void * userData)328 AVSession_ErrCode OHAVSessionCallbackImpl::RegisterToggleFavoriteCallback(OH_AVSession* avsession,
329     OH_AVSessionCallback_OnToggleFavorite callback, void* userData)
330 {
331     if (avsession_ == nullptr) {
332         avsession_ = avsession;
333     }
334     auto it = std::find_if (toggleFavoriteCallbacks_.begin(), toggleFavoriteCallbacks_.end(),
335         [callback](const std::pair<OH_AVSessionCallback_OnToggleFavorite, void*> &element) {
336             return element.first == callback;
337         });
338     if (it == toggleFavoriteCallbacks_.end()) {
339         toggleFavoriteCallbacks_.emplace_back(std::make_pair(callback, userData));
340     }
341     return AV_SESSION_ERR_SUCCESS;
342 }
343 
UnregisterToggleFavoriteCallback(OH_AVSession * avsession,OH_AVSessionCallback_OnToggleFavorite callback)344 AVSession_ErrCode OHAVSessionCallbackImpl::UnregisterToggleFavoriteCallback(OH_AVSession* avsession,
345     OH_AVSessionCallback_OnToggleFavorite callback)
346 {
347     std::remove_if (toggleFavoriteCallbacks_.begin(), toggleFavoriteCallbacks_.end(),
348         [callback](const std::pair<OH_AVSessionCallback_OnToggleFavorite, void*> &element) {
349             return element.first == callback;
350         });
351     return AV_SESSION_ERR_SUCCESS;
352 }
353 }