Line |
Branch |
Exec |
Source |
1 |
|
|
/* GATE PROJECT LICENSE: |
2 |
|
|
+----------------------------------------------------------------------------+ |
3 |
|
|
| Copyright(c) 2018-2025, Stefan Meislinger | |
4 |
|
|
| All rights reserved. | |
5 |
|
|
| | |
6 |
|
|
| Redistribution and use in source and binary forms, with or without | |
7 |
|
|
| modification, are permitted provided that the following conditions are met:| |
8 |
|
|
| | |
9 |
|
|
| 1. Redistributions of source code must retain the above copyright notice, | |
10 |
|
|
| this list of conditions and the following disclaimer. | |
11 |
|
|
| 2. Redistributions in binary form must reproduce the above copyright | |
12 |
|
|
| notice, this list of conditions and the following disclaimer in the | |
13 |
|
|
| documentation and/or other materials provided with the distribution. | |
14 |
|
|
| | |
15 |
|
|
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"| |
16 |
|
|
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
17 |
|
|
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
18 |
|
|
| ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |
19 |
|
|
| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
20 |
|
|
| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
21 |
|
|
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
22 |
|
|
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
23 |
|
|
| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
24 |
|
|
| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | |
25 |
|
|
| THE POSSIBILITY OF SUCH DAMAGE. | |
26 |
|
|
+----------------------------------------------------------------------------+ |
27 |
|
|
*/ |
28 |
|
|
|
29 |
|
|
#include "gate/tech/mediaplayers.h" |
30 |
|
|
#include "gate/results.h" |
31 |
|
|
|
32 |
|
|
#if defined(GATE_SYS_WIN) && !defined(GATE_SYS_WINSTORE) && !defined(GATE_SYS_WIN16) |
33 |
|
|
# define GATE_TECH_MEDIAPLAYER_WIN_MCI 1 |
34 |
|
|
#else |
35 |
|
|
# define GATE_TECH_MEDIAPLAYER_NO_IMPL 1 |
36 |
|
|
#endif |
37 |
|
|
|
38 |
|
|
|
39 |
|
|
|
40 |
|
|
#if defined(GATE_TECH_MEDIAPLAYER_WIN_MCI) |
41 |
|
|
|
42 |
|
|
#include "gate/platforms.h" |
43 |
|
|
#include <windows.h> |
44 |
|
|
#include <mmsystem.h> |
45 |
|
|
|
46 |
|
|
#if defined(GATE_SYS_WINCE) |
47 |
|
|
|
48 |
|
|
|
49 |
|
|
gate_result_t gate_mediaplayer_enum(gate_mediaplayer_enum_callback_t cb, void* cb_param, unsigned format_flags) |
50 |
|
|
{ |
51 |
|
|
return GATE_RESULT_NOTIMPLEMENTED; |
52 |
|
|
} |
53 |
|
|
gate_result_t gate_mediaplayer_open(gate_mediaplayer_id_t id, gate_mediaplayer_device_t* ptr_device) |
54 |
|
|
{ |
55 |
|
|
return GATE_RESULT_NOTIMPLEMENTED; |
56 |
|
|
} |
57 |
|
|
gate_result_t gate_mediaplayer_close(gate_mediaplayer_device_t* ptr_device) |
58 |
|
|
{ |
59 |
|
|
return GATE_RESULT_NOTIMPLEMENTED; |
60 |
|
|
} |
61 |
|
|
gate_result_t gate_mediaplayer_load_file(gate_mediaplayer_device_t* ptr_device, gate_string_t const* file_path) |
62 |
|
|
{ |
63 |
|
|
return GATE_RESULT_NOTIMPLEMENTED; |
64 |
|
|
} |
65 |
|
|
gate_result_t gate_mediaplayer_status(gate_mediaplayer_device_t* ptr_device, gate_mediaplayer_status_t* ptr_status) |
66 |
|
|
{ |
67 |
|
|
return GATE_RESULT_NOTIMPLEMENTED; |
68 |
|
|
} |
69 |
|
|
gate_result_t gate_mediaplayer_play(gate_mediaplayer_device_t* ptr_device) |
70 |
|
|
{ |
71 |
|
|
return GATE_RESULT_NOTIMPLEMENTED; |
72 |
|
|
} |
73 |
|
|
gate_result_t gate_mediaplayer_stop(gate_mediaplayer_device_t* ptr_device) |
74 |
|
|
{ |
75 |
|
|
return GATE_RESULT_NOTIMPLEMENTED; |
76 |
|
|
} |
77 |
|
|
|
78 |
|
|
|
79 |
|
|
#else /* GATE SYS_WINCE */ |
80 |
|
|
|
81 |
|
|
typedef UINT(CALLBACK* MCIYIELDPROC)(UINT mciId, DWORD dwYieldData); |
82 |
|
|
|
83 |
|
|
typedef struct win32_mci_api_class |
84 |
|
|
{ |
85 |
|
|
UINT(WINAPI* GetDeviceID) (LPCTSTR pszDevice); |
86 |
|
|
UINT(WINAPI* GetDeviceIDFromElementID) (DWORD dwElementID, LPTSTR lpstrType); |
87 |
|
|
DWORD(WINAPI* SendCommand) (UINT mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); |
88 |
|
|
HANDLE(WINAPI* GetCreatorTask) (UINT mciId); |
89 |
|
|
DWORD(WINAPI* SendString) (LPCTSTR lpstrCommand, LPTSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback); |
90 |
|
|
MCIYIELDPROC(WINAPI* GetYieldProc) (UINT mciId, LPDWORD pdwYieldData); |
91 |
|
|
BOOL(WINAPI* SetYieldProc) (UINT mciId, MCIYIELDPROC fpYieldProc, DWORD dwYieldData); |
92 |
|
|
} win32_mci_api_t; |
93 |
|
|
|
94 |
|
|
static win32_mci_api_t win32_mci; |
95 |
|
|
static gate_bool_t volatile win32_mci_loaded = false; |
96 |
|
|
|
97 |
|
|
static gate_result_t load_win32_mci_api() |
98 |
|
|
{ |
99 |
|
|
static HMODULE hmod_winmm = NULL; |
100 |
|
|
HMODULE hmod; |
101 |
|
|
gate_bool_t succeeded = true; |
102 |
|
|
|
103 |
|
|
if (hmod_winmm == NULL) |
104 |
|
|
{ |
105 |
|
|
hmod_winmm = gate_win32_load_library(_T("winmm.dll"), 0); |
106 |
|
|
if (hmod_winmm == NULL) |
107 |
|
|
{ |
108 |
|
|
return GATE_RESULT_NOTAVAILABLE; |
109 |
|
|
} |
110 |
|
|
} |
111 |
|
|
|
112 |
|
|
if (!win32_mci_loaded) |
113 |
|
|
{ |
114 |
|
|
hmod = hmod_winmm; |
115 |
|
|
succeeded &= gate_win32_get_proc_address(hmod, GATE_WINAPI_DUAL_NAME("mciGetDeviceID"), &win32_mci.GetDeviceID); |
116 |
|
|
succeeded &= gate_win32_get_proc_address(hmod, GATE_WINAPI_DUAL_NAME("mciGetDeviceIDFromElementID"), &win32_mci.GetDeviceIDFromElementID); |
117 |
|
|
succeeded &= gate_win32_get_proc_address(hmod, GATE_WINAPI_DUAL_NAME("mciSendCommand"), &win32_mci.SendCommand); |
118 |
|
|
succeeded &= gate_win32_get_proc_address(hmod, GATE_WINAPI_DUAL_NAME("mciSendString"), &win32_mci.SendString); |
119 |
|
|
succeeded &= gate_win32_get_proc_address(hmod, "mciGetCreatorTask", &win32_mci.GetCreatorTask); |
120 |
|
|
succeeded &= gate_win32_get_proc_address(hmod, "mciGetYieldProc", &win32_mci.GetYieldProc); |
121 |
|
|
succeeded &= gate_win32_get_proc_address(hmod, "mciSetYieldProc", &win32_mci.SetYieldProc); |
122 |
|
|
win32_mci_loaded = succeeded; |
123 |
|
|
} |
124 |
|
|
|
125 |
|
|
return succeeded ? GATE_RESULT_OK : GATE_RESULT_FAILED; |
126 |
|
|
} |
127 |
|
|
|
128 |
|
|
typedef struct gate_mediaplayer_impl_class |
129 |
|
|
{ |
130 |
|
|
UINT dev_type; |
131 |
|
|
UINT mci_device_id; |
132 |
|
|
} gate_mediaplayer_impl_t; |
133 |
|
|
|
134 |
|
|
|
135 |
|
|
gate_result_t gate_mediaplayer_enum(gate_mediaplayer_enum_callback_t cb, void* cb_param, unsigned format_flags) |
136 |
|
|
{ |
137 |
|
|
gate_result_t result; |
138 |
|
|
static gate_string_t const descr_audio = GATE_STRING_INIT_STATIC("Audio"); |
139 |
|
|
do |
140 |
|
|
{ |
141 |
|
|
result = load_win32_mci_api(); |
142 |
|
|
GATE_BREAK_IF_FAILED(result); |
143 |
|
|
|
144 |
|
|
if (cb) |
145 |
|
|
{ |
146 |
|
|
if (GATE_FLAG_ENABLED(format_flags, GATE_MEDIAPLAYER_FORMAT_AUDIOFILE)) |
147 |
|
|
{ |
148 |
|
|
cb((gate_mediaplayer_id_t)MCI_DEVTYPE_WAVEFORM_AUDIO, &descr_audio, cb_param); |
149 |
|
|
} |
150 |
|
|
} |
151 |
|
|
|
152 |
|
|
result = GATE_RESULT_OK; |
153 |
|
|
|
154 |
|
|
} while (0); |
155 |
|
|
|
156 |
|
|
return result; |
157 |
|
|
} |
158 |
|
|
|
159 |
|
|
gate_result_t gate_mediaplayer_open(gate_mediaplayer_id_t id, gate_mediaplayer_device_t* ptr_device) |
160 |
|
|
{ |
161 |
|
|
gate_result_t ret; |
162 |
|
|
gate_mediaplayer_impl_t* ptr_impl = NULL; |
163 |
|
|
UINT devid = (UINT)(gate_uintptr_t)id; |
164 |
|
|
|
165 |
|
|
do |
166 |
|
|
{ |
167 |
|
|
ret = load_win32_mci_api(); |
168 |
|
|
GATE_BREAK_IF_FAILED(ret); |
169 |
|
|
|
170 |
|
|
switch (devid) |
171 |
|
|
{ |
172 |
|
|
case MCI_DEVTYPE_WAVEFORM_AUDIO: |
173 |
|
|
{ |
174 |
|
|
/* OK */ |
175 |
|
|
devid = MCI_DEVTYPE_DIGITAL_VIDEO; |
176 |
|
|
break; |
177 |
|
|
} |
178 |
|
|
default: |
179 |
|
|
{ |
180 |
|
|
devid = 0; |
181 |
|
|
break; |
182 |
|
|
} |
183 |
|
|
} |
184 |
|
|
if (devid == 0) |
185 |
|
|
{ |
186 |
|
|
ret = GATE_RESULT_NOTSUPPORTED; |
187 |
|
|
break; |
188 |
|
|
} |
189 |
|
|
|
190 |
|
|
ptr_impl = (gate_mediaplayer_impl_t*)gate_mem_alloc(sizeof(gate_mediaplayer_impl_t)); |
191 |
|
|
if (NULL == ptr_impl) |
192 |
|
|
{ |
193 |
|
|
ret = GATE_RESULT_OUTOFMEMORY; |
194 |
|
|
break; |
195 |
|
|
} |
196 |
|
|
|
197 |
|
|
ptr_impl->dev_type = devid; |
198 |
|
|
ptr_impl->mci_device_id = 0; |
199 |
|
|
|
200 |
|
|
*ptr_device = (gate_mediaplayer_device_t)ptr_impl; |
201 |
|
|
ptr_impl = NULL; |
202 |
|
|
ret = GATE_RESULT_OK; |
203 |
|
|
} while (0); |
204 |
|
|
|
205 |
|
|
if (ptr_impl) |
206 |
|
|
{ |
207 |
|
|
gate_mem_dealloc(ptr_impl); |
208 |
|
|
} |
209 |
|
|
return ret; |
210 |
|
|
} |
211 |
|
|
|
212 |
|
|
gate_result_t gate_mediaplayer_close(gate_mediaplayer_device_t* ptr_device) |
213 |
|
|
{ |
214 |
|
|
gate_result_t ret = GATE_RESULT_FAILED; |
215 |
|
|
gate_mediaplayer_impl_t* impl = ptr_device ? (gate_mediaplayer_impl_t*)*ptr_device : NULL; |
216 |
|
|
MCI_GENERIC_PARMS gen_params = GATE_INIT_EMPTY; |
217 |
|
|
|
218 |
|
|
do |
219 |
|
|
{ |
220 |
|
|
if (!impl) |
221 |
|
|
{ |
222 |
|
|
ret = GATE_RESULT_INVALIDARG; |
223 |
|
|
break; |
224 |
|
|
} |
225 |
|
|
if (impl->mci_device_id != 0) |
226 |
|
|
{ |
227 |
|
|
gen_params.dwCallback = 0; |
228 |
|
|
win32_mci.SendCommand(impl->mci_device_id, MCI_CLOSE, MCI_WAIT, (DWORD_PTR)(void*)&gen_params); |
229 |
|
|
impl->mci_device_id = 0; |
230 |
|
|
} |
231 |
|
|
gate_mem_dealloc(impl); |
232 |
|
|
*ptr_device = NULL; |
233 |
|
|
ret = GATE_RESULT_OK; |
234 |
|
|
} while (0); |
235 |
|
|
|
236 |
|
|
return ret; |
237 |
|
|
} |
238 |
|
|
|
239 |
|
|
gate_result_t gate_mediaplayer_load_file(gate_mediaplayer_device_t* ptr_device, gate_string_t const* file_path) |
240 |
|
|
{ |
241 |
|
|
gate_result_t ret = GATE_RESULT_FAILED; |
242 |
|
|
gate_mediaplayer_impl_t* impl = ptr_device ? (gate_mediaplayer_impl_t*)*ptr_device : NULL; |
243 |
|
|
DWORD error; |
244 |
|
|
MCI_OPEN_PARMS open_params = GATE_INIT_EMPTY; |
245 |
|
|
MCI_GENERIC_PARMS gen_params = GATE_INIT_EMPTY; |
246 |
|
|
TCHAR path_buffer[GATE_MAX_FILEPATH_LENGTH] = GATE_INIT_EMPTY; |
247 |
|
|
|
248 |
|
|
do |
249 |
|
|
{ |
250 |
|
|
if (!impl) |
251 |
|
|
{ |
252 |
|
|
ret = GATE_RESULT_INVALIDARG; |
253 |
|
|
break; |
254 |
|
|
} |
255 |
|
|
|
256 |
|
|
if (impl->mci_device_id != 0) |
257 |
|
|
{ |
258 |
|
|
gen_params.dwCallback = 0; |
259 |
|
|
win32_mci.SendCommand(impl->mci_device_id, MCI_CLOSE, MCI_WAIT, (DWORD_PTR)(void*)&gen_params); |
260 |
|
|
impl->mci_device_id = 0; |
261 |
|
|
} |
262 |
|
|
|
263 |
|
|
gate_win32_utf8_2_winstr(gate_string_ptr(file_path, 0), gate_string_length(file_path), |
264 |
|
|
path_buffer, sizeof(path_buffer) / sizeof(path_buffer[0])); |
265 |
|
|
open_params.dwCallback = 0; |
266 |
|
|
open_params.lpstrElementName = path_buffer; |
267 |
|
|
open_params.wDeviceID = 0; |
268 |
|
|
//open_params.lpstrDeviceType = (LPCTSTR)(gate_uintptr_t)impl->dev_type; |
269 |
|
|
open_params.lpstrDeviceType = _T("MPEGVideo"); |
270 |
|
|
error = win32_mci.SendCommand(0, |
271 |
|
|
MCI_OPEN, |
272 |
|
|
MCI_WAIT | MCI_OPEN_SHAREABLE | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, |
273 |
|
|
(DWORD_PTR)(void*)&open_params); |
274 |
|
|
if (error) |
275 |
|
|
{ |
276 |
|
|
ret = GATE_RESULT_FAILED; |
277 |
|
|
break; |
278 |
|
|
} |
279 |
|
|
impl->mci_device_id = open_params.wDeviceID; |
280 |
|
|
ret = GATE_RESULT_OK; |
281 |
|
|
} while (0); |
282 |
|
|
|
283 |
|
|
return ret; |
284 |
|
|
} |
285 |
|
|
|
286 |
|
|
static gate_bool_t gate_mediaplayer_get_status(UINT device_id, DWORD query_item, DWORD_PTR* ptr_value, DWORD* ptr_track) |
287 |
|
|
{ |
288 |
|
|
MCI_STATUS_PARMS status_params = GATE_INIT_EMPTY; |
289 |
|
|
DWORD error; |
290 |
|
|
DWORD flags = MCI_WAIT | MCI_STATUS_ITEM; |
291 |
|
|
status_params.dwItem = query_item; |
292 |
|
|
status_params.dwCallback = 0; |
293 |
|
|
status_params.dwReturn = ptr_value ? *ptr_value : 0; |
294 |
|
|
status_params.dwTrack = ptr_track ? *ptr_track : 0; |
295 |
|
|
if (ptr_track) |
296 |
|
|
{ |
297 |
|
|
//status_params.dwItem |= MCI_TRACK; |
298 |
|
|
flags |= MCI_TRACK; |
299 |
|
|
} |
300 |
|
|
|
301 |
|
|
error = win32_mci.SendCommand(device_id, MCI_STATUS, flags, (DWORD_PTR)(void*)&status_params); |
302 |
|
|
if (error) |
303 |
|
|
{ |
304 |
|
|
return false; |
305 |
|
|
} |
306 |
|
|
if (ptr_value) |
307 |
|
|
{ |
308 |
|
|
*ptr_value = status_params.dwReturn; |
309 |
|
|
} |
310 |
|
|
if (ptr_track) |
311 |
|
|
{ |
312 |
|
|
*ptr_track = status_params.dwTrack; |
313 |
|
|
} |
314 |
|
|
return true; |
315 |
|
|
} |
316 |
|
|
|
317 |
|
|
gate_result_t gate_mediaplayer_status(gate_mediaplayer_device_t* ptr_device, gate_mediaplayer_status_t* ptr_status) |
318 |
|
|
{ |
319 |
|
|
gate_result_t ret = GATE_RESULT_FAILED; |
320 |
|
|
gate_mediaplayer_impl_t* impl = ptr_device ? (gate_mediaplayer_impl_t*)*ptr_device : NULL; |
321 |
|
|
MCI_STATUS_PARMS status_params = GATE_INIT_EMPTY; |
322 |
|
|
DWORD_PTR value, timeformat; |
323 |
|
|
DWORD track; |
324 |
|
|
|
325 |
|
|
do |
326 |
|
|
{ |
327 |
|
|
if (!impl || !ptr_status || (impl->mci_device_id == 0)) |
328 |
|
|
{ |
329 |
|
|
ret = GATE_RESULT_INVALIDARG; |
330 |
|
|
break; |
331 |
|
|
} |
332 |
|
|
|
333 |
|
|
gate_mem_clear(ptr_status, sizeof(gate_mediaplayer_status_t)); |
334 |
|
|
|
335 |
|
|
if (gate_mediaplayer_get_status(impl->mci_device_id, MCI_STATUS_MODE, &value, NULL)) |
336 |
|
|
{ |
337 |
|
|
switch (value) |
338 |
|
|
{ |
339 |
|
|
case MCI_MODE_OPEN: ptr_status->status = GATE_MEDIAPLAYER_STATUS_IDLE; break; |
340 |
|
|
case MCI_MODE_PLAY: ptr_status->status = GATE_MEDIAPLAYER_STATUS_PLAYING; break; |
341 |
|
|
case MCI_MODE_PAUSE: ptr_status->status = GATE_MEDIAPLAYER_STATUS_PAUSED; break; |
342 |
|
|
case MCI_MODE_STOP: ptr_status->status = GATE_MEDIAPLAYER_STATUS_STOPPED; break; |
343 |
|
|
case MCI_MODE_RECORD: ptr_status->status = GATE_MEDIAPLAYER_STATUS_RECORDING; break; |
344 |
|
|
case MCI_MODE_SEEK: ptr_status->status = GATE_MEDIAPLAYER_STATUS_SEEKING; break; |
345 |
|
|
case MCI_MODE_NOT_READY: ptr_status->status = GATE_MEDIAPLAYER_STATUS_ERROR; break; |
346 |
|
|
default: ptr_status->status = GATE_MEDIAPLAYER_STATUS_UNKONWN; break; |
347 |
|
|
} |
348 |
|
|
} |
349 |
|
|
if (gate_mediaplayer_get_status(impl->mci_device_id, MCI_STATUS_NUMBER_OF_TRACKS, &value, NULL)) |
350 |
|
|
{ |
351 |
|
|
ptr_status->step_count = (unsigned int)value; |
352 |
|
|
} |
353 |
|
|
if (gate_mediaplayer_get_status(impl->mci_device_id, MCI_STATUS_CURRENT_TRACK, &value, NULL)) |
354 |
|
|
{ |
355 |
|
|
track = (DWORD)value; |
356 |
|
|
ptr_status->step = (unsigned int)value; |
357 |
|
|
} |
358 |
|
|
if (gate_mediaplayer_get_status(impl->mci_device_id, MCI_STATUS_TIME_FORMAT, &value, NULL)) |
359 |
|
|
{ |
360 |
|
|
timeformat = value; |
361 |
|
|
} |
362 |
|
|
if (gate_mediaplayer_get_status(impl->mci_device_id, MCI_STATUS_LENGTH, &value, &track)) |
363 |
|
|
{ |
364 |
|
|
ptr_status->length = value; |
365 |
|
|
} |
366 |
|
|
|
367 |
|
|
if (gate_mediaplayer_get_status(impl->mci_device_id, MCI_STATUS_POSITION, &value, &track)) |
368 |
|
|
{ |
369 |
|
|
ptr_status->position = value; |
370 |
|
|
} |
371 |
|
|
|
372 |
|
|
ret = GATE_RESULT_OK; |
373 |
|
|
} while (0); |
374 |
|
|
return ret; |
375 |
|
|
} |
376 |
|
|
|
377 |
|
|
gate_result_t gate_mediaplayer_play(gate_mediaplayer_device_t* ptr_device) |
378 |
|
|
{ |
379 |
|
|
gate_result_t ret = GATE_RESULT_FAILED; |
380 |
|
|
gate_mediaplayer_impl_t* impl = ptr_device ? (gate_mediaplayer_impl_t*)*ptr_device : NULL; |
381 |
|
|
DWORD error; |
382 |
|
|
MCI_PLAY_PARMS play_params = GATE_INIT_EMPTY; |
383 |
|
|
|
384 |
|
|
do |
385 |
|
|
{ |
386 |
|
|
if (!impl || (impl->mci_device_id == 0)) |
387 |
|
|
{ |
388 |
|
|
ret = GATE_RESULT_INVALIDARG; |
389 |
|
|
break; |
390 |
|
|
} |
391 |
|
|
play_params.dwCallback = 0; |
392 |
|
|
play_params.dwFrom = 0; |
393 |
|
|
play_params.dwTo = 0; |
394 |
|
|
error = win32_mci.SendCommand(impl->mci_device_id, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)(void*)&play_params); |
395 |
|
|
if (error) |
396 |
|
|
{ |
397 |
|
|
ret = GATE_RESULT_FAILED; |
398 |
|
|
break; |
399 |
|
|
} |
400 |
|
|
|
401 |
|
|
ret = GATE_RESULT_OK; |
402 |
|
|
} while (0); |
403 |
|
|
return ret; |
404 |
|
|
} |
405 |
|
|
|
406 |
|
|
gate_result_t gate_mediaplayer_stop(gate_mediaplayer_device_t* ptr_device) |
407 |
|
|
{ |
408 |
|
|
gate_result_t ret = GATE_RESULT_FAILED; |
409 |
|
|
gate_mediaplayer_impl_t* impl = ptr_device ? (gate_mediaplayer_impl_t*)*ptr_device : NULL; |
410 |
|
|
DWORD error; |
411 |
|
|
MCI_GENERIC_PARMS stop_params = GATE_INIT_EMPTY; |
412 |
|
|
|
413 |
|
|
do |
414 |
|
|
{ |
415 |
|
|
if (!impl || (impl->mci_device_id == 0)) |
416 |
|
|
{ |
417 |
|
|
ret = GATE_RESULT_INVALIDARG; |
418 |
|
|
break; |
419 |
|
|
} |
420 |
|
|
stop_params.dwCallback = 0; |
421 |
|
|
error = win32_mci.SendCommand(impl->mci_device_id, MCI_STOP, MCI_WAIT, (DWORD_PTR)(void*)&stop_params); |
422 |
|
|
if (error) |
423 |
|
|
{ |
424 |
|
|
ret = GATE_RESULT_FAILED; |
425 |
|
|
break; |
426 |
|
|
} |
427 |
|
|
|
428 |
|
|
ret = GATE_RESULT_OK; |
429 |
|
|
} while (0); |
430 |
|
|
return ret; |
431 |
|
|
} |
432 |
|
|
|
433 |
|
|
#endif /* GATE SYS_WINCE */ |
434 |
|
|
|
435 |
|
|
#endif /* GATE_TECH_MEDIAPLAYER_WIN_MCI */ |
436 |
|
|
|
437 |
|
|
|
438 |
|
|
|
439 |
|
|
|
440 |
|
|
#if defined(GATE_TECH_MEDIAPLAYER_NO_IMPL) |
441 |
|
|
|
442 |
|
✗ |
gate_result_t gate_mediaplayer_enum(gate_mediaplayer_enum_callback_t cb, void* cb_param, unsigned format_flags) |
443 |
|
|
{ |
444 |
|
|
GATE_UNUSED_ARG(cb); |
445 |
|
|
GATE_UNUSED_ARG(cb_param); |
446 |
|
|
GATE_UNUSED_ARG(format_flags); |
447 |
|
✗ |
return GATE_RESULT_NOTIMPLEMENTED; |
448 |
|
|
} |
449 |
|
✗ |
gate_result_t gate_mediaplayer_open(gate_mediaplayer_id_t id, gate_mediaplayer_device_t* ptr_device) |
450 |
|
|
{ |
451 |
|
|
GATE_UNUSED_ARG(id); |
452 |
|
|
GATE_UNUSED_ARG(ptr_device); |
453 |
|
✗ |
return GATE_RESULT_NOTIMPLEMENTED; |
454 |
|
|
} |
455 |
|
✗ |
gate_result_t gate_mediaplayer_close(gate_mediaplayer_device_t* ptr_device) |
456 |
|
|
{ |
457 |
|
|
GATE_UNUSED_ARG(ptr_device); |
458 |
|
✗ |
return GATE_RESULT_NOTIMPLEMENTED; |
459 |
|
|
} |
460 |
|
✗ |
gate_result_t gate_mediaplayer_load_file(gate_mediaplayer_device_t* ptr_device, gate_string_t const* file_path) |
461 |
|
|
{ |
462 |
|
|
GATE_UNUSED_ARG(ptr_device); |
463 |
|
|
GATE_UNUSED_ARG(file_path); |
464 |
|
✗ |
return GATE_RESULT_NOTIMPLEMENTED; |
465 |
|
|
} |
466 |
|
✗ |
gate_result_t gate_mediaplayer_status(gate_mediaplayer_device_t* ptr_device, gate_mediaplayer_status_t* ptr_status) |
467 |
|
|
{ |
468 |
|
|
GATE_UNUSED_ARG(ptr_device); |
469 |
|
|
GATE_UNUSED_ARG(ptr_status); |
470 |
|
✗ |
return GATE_RESULT_NOTIMPLEMENTED; |
471 |
|
|
} |
472 |
|
✗ |
gate_result_t gate_mediaplayer_play(gate_mediaplayer_device_t* ptr_device) |
473 |
|
|
{ |
474 |
|
|
GATE_UNUSED_ARG(ptr_device); |
475 |
|
✗ |
return GATE_RESULT_NOTIMPLEMENTED; |
476 |
|
|
} |
477 |
|
✗ |
gate_result_t gate_mediaplayer_stop(gate_mediaplayer_device_t* ptr_device) |
478 |
|
|
{ |
479 |
|
|
GATE_UNUSED_ARG(ptr_device); |
480 |
|
✗ |
return GATE_RESULT_NOTIMPLEMENTED; |
481 |
|
|
} |
482 |
|
|
|
483 |
|
|
#endif |
484 |
|
|
|