source: trunk/src/winmm/wavein.cpp@ 5273

Last change on this file since 5273 was 5273, checked in by sandervl, 24 years ago

* empty log message *

File size: 12.7 KB
Line 
1/* $Id: wavein.cpp,v 1.7 2001-02-27 21:17:01 sandervl Exp $ */
2
3/*
4 * Wave in MM apis
5 *
6 * Copyright 2001 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 * waveInGetPosition partly based on Wine code (dll\winmm\wineoss\audio.c)
9 * Copyright 1994 Martin Ayotte
10 *
11 *
12 * Project Odin Software License can be found in LICENSE.TXT
13 *
14 */
15
16
17/****************************************************************************
18 * Includes *
19 ****************************************************************************/
20
21#include <os2win.h>
22#include <mmsystem.h>
23#include <odinwrap.h>
24#include <stdio.h>
25#include <string.h>
26#include <misc.h>
27#include <unicode.h>
28
29#include "winmm.h"
30#include "dwavein.h"
31
32#define DBG_LOCALLOG DBG_wavein
33#include "dbglocal.h"
34
35
36ODINDEBUGCHANNEL(WINMM-WAVEIN)
37
38/******************************************************************************/
39/******************************************************************************/
40ODINFUNCTION6(MMRESULT, waveInOpen,
41 LPHWAVEIN, phwi,
42 UINT, uDeviceID,
43 const LPWAVEFORMATEX, pwfx,
44 DWORD, dwCallback,
45 DWORD, dwInstance,
46 DWORD, fdwOpen)
47{
48 MMRESULT rc;
49
50 if(pwfx == NULL)
51 return(WAVERR_BADFORMAT);
52
53 if(fdwOpen == WAVE_FORMAT_QUERY) {
54 if(DartWaveIn::queryFormat(pwfx->wFormatTag, pwfx->nChannels, pwfx->nSamplesPerSec,
55 pwfx->wBitsPerSample) == TRUE) {
56 return(MMSYSERR_NOERROR);
57 }
58 else return(WAVERR_BADFORMAT);
59 }
60
61 if(phwi == NULL)
62 return(MMSYSERR_INVALPARAM);
63
64 if(fdwOpen == CALLBACK_WINDOW) {
65 *phwi = (HWAVEOUT)new DartWaveIn(pwfx, (HWND)dwCallback);
66 }
67 else
68 if(fdwOpen == CALLBACK_FUNCTION)
69 {
70 //@@@PH 1999/12/28 save valid FS: to win32 TIB
71 *phwi = (HWAVEOUT)new DartWaveIn(pwfx, dwCallback, dwInstance, GetFS());
72 }
73 else *phwi = (HWAVEOUT)new DartWaveIn(pwfx);
74
75 if(*phwi == NULL) {
76 return(MMSYSERR_NODRIVER);
77 }
78
79 rc = ((DartWaveIn *)*phwi)->getError();
80 if(rc != MMSYSERR_NOERROR) {
81 delete (DartWaveIn *)*phwi;
82 return(rc);
83 }
84 return(MMSYSERR_NOERROR);
85}
86/******************************************************************************/
87/******************************************************************************/
88ODINFUNCTION1(MMRESULT, waveInClose,
89 HWAVEIN, hwi)
90{
91 DartWaveIn *dwave = (DartWaveIn *)hwi;
92
93 if(DartWaveIn::find(dwave) == TRUE)
94 {
95 if(dwave->getState() == STATE_RECORDING)
96 return(WAVERR_STILLPLAYING);
97
98 delete dwave;
99 return(MMSYSERR_NOERROR);
100 }
101 else return(MMSYSERR_INVALHANDLE);
102}
103/******************************************************************************/
104/******************************************************************************/
105ODINFUNCTION1(MMRESULT, waveInReset,
106 HWAVEIN, hwi)
107{
108 DartWaveIn *dwave = (DartWaveIn *)hwi;
109
110 if(DartWaveIn::find(dwave) == TRUE)
111 return(dwave->reset());
112 else return(MMSYSERR_INVALHANDLE);
113}
114/******************************************************************************/
115/******************************************************************************/
116ODINFUNCTION1(MMRESULT, waveInStart,
117 HWAVEIN, hwi)
118{
119 DartWaveIn *dwave = (DartWaveIn *)hwi;
120
121 if(DartWaveIn::find(dwave) == TRUE)
122 return(dwave->start());
123 else return(MMSYSERR_INVALHANDLE);
124}
125/******************************************************************************/
126/******************************************************************************/
127ODINFUNCTION1(MMRESULT, waveInStop,
128 HWAVEIN, hwi)
129{
130 DartWaveIn *dwave = (DartWaveIn *)hwi;
131
132 if(DartWaveIn::find(dwave) == TRUE)
133 return(dwave->stop());
134 else return(MMSYSERR_INVALHANDLE);
135}
136/******************************************************************************/
137/******************************************************************************/
138ODINFUNCTION3(MMRESULT, waveInGetPosition,
139 HWAVEIN, hwi,
140 LPMMTIME, pmmt,
141 UINT, cbmmt)
142{
143 DartWaveIn *dwave = (DartWaveIn *)hwi;
144
145 if(pmmt == NULL)
146 return MMSYSERR_INVALPARAM;
147
148 if(DartWaveIn::find(dwave) == TRUE)
149 {
150 ULONG position;
151
152 position = dwave->getPosition();
153 if(position == -1) {
154 return MMSYSERR_HANDLEBUSY; //todo correct error value
155 }
156 switch (pmmt->wType) {
157 case TIME_BYTES:
158 pmmt->u.cb = position;
159 break;
160 case TIME_SAMPLES:
161 pmmt->u.sample = position * 8 / dwave->getBitsPerSample();
162 break;
163 case TIME_SMPTE:
164 {
165 ULONG timeval = position / (dwave->getAvgBytesPerSecond() / 1000);
166 pmmt->u.smpte.hour = timeval / 108000;
167 timeval -= pmmt->u.smpte.hour * 108000;
168 pmmt->u.smpte.min = timeval / 1800;
169 timeval -= pmmt->u.smpte.min * 1800;
170 pmmt->u.smpte.sec = timeval / 30;
171 timeval -= pmmt->u.smpte.sec * 30;
172 pmmt->u.smpte.frame = timeval;
173 pmmt->u.smpte.fps = 30;
174 break;
175 }
176 default:
177 dprintf(("waveInGetPosition: Format %d not supported ! use TIME_MS !\n", pmmt->wType));
178 pmmt->wType = TIME_MS;
179 case TIME_MS:
180 pmmt->u.ms = position / (dwave->getAvgBytesPerSecond() / 1000);
181 dprintf(("WINMM:waveInGetPosition: TIME_MS pos=%d ms=%d time=%d", position, pmmt->u.ms, GetCurrentTime()));
182 break;
183 }
184 return MMSYSERR_NOERROR;
185 }
186 else return(MMSYSERR_INVALHANDLE);
187}
188/******************************************************************************/
189/******************************************************************************/
190ODINFUNCTION3(MMRESULT, waveInAddBuffer,
191 HWAVEIN, hwi,
192 LPWAVEHDR, pwh,
193 UINT, cbwh)
194{
195 DartWaveIn *dwave = (DartWaveIn *)hwi;
196
197 if(DartWaveIn::find(dwave) == TRUE)
198 {
199 if(!(pwh->dwFlags & WHDR_PREPARED) || pwh->lpData == NULL)
200 return WAVERR_UNPREPARED;
201
202 if(pwh->dwFlags & WHDR_INQUEUE)
203 return WAVERR_STILLPLAYING;
204
205 pwh->dwFlags |= WHDR_INQUEUE;
206 pwh->dwFlags &= ~WHDR_DONE;
207
208 dprintf(("waveInAddBuffer %x %d %x", pwh->lpData, pwh->dwBufferLength, pwh->dwFlags));
209 return(dwave->addBuffer(pwh, cbwh));
210 }
211 else return(MMSYSERR_INVALHANDLE);
212}
213/******************************************************************************/
214/******************************************************************************/
215ODINFUNCTION3(MMRESULT, waveInPrepareHeader,
216 HWAVEIN, hwi,
217 LPWAVEHDR, pwh,
218 UINT, cbwh)
219{
220 DartWaveIn *dwave = (DartWaveIn *)hwi;
221
222 if(DartWaveIn::find(dwave) == TRUE)
223 {
224 if(pwh->dwFlags & WHDR_INQUEUE)
225 return WAVERR_STILLPLAYING;
226
227 pwh->dwFlags |= WHDR_PREPARED;
228 pwh->dwFlags &= ~WHDR_DONE;
229 pwh->lpNext = NULL;
230 return(MMSYSERR_NOERROR);
231 }
232 else return(MMSYSERR_INVALHANDLE);
233}
234/******************************************************************************/
235/******************************************************************************/
236ODINFUNCTION3(MMRESULT, waveInUnprepareHeader,
237 HWAVEIN, hwi,
238 LPWAVEHDR, pwh,
239 UINT, cbwh)
240{
241 DartWaveIn *dwave = (DartWaveIn *)hwi;
242
243 if(DartWaveIn::find(dwave) == TRUE)
244 {
245 if(pwh->dwFlags & WHDR_INQUEUE)
246 return WAVERR_STILLPLAYING;
247
248 pwh->dwFlags &= ~WHDR_PREPARED;
249 pwh->dwFlags |= WHDR_DONE;
250 return(MMSYSERR_NOERROR);
251 }
252 else return(MMSYSERR_INVALHANDLE);
253}
254/******************************************************************************/
255/******************************************************************************/
256ODINFUNCTION3(MMRESULT, waveInGetDevCapsA,
257 UINT, uDeviceID,
258 LPWAVEINCAPSA, pwic,
259 UINT, cbwic)
260{
261 if(DartWaveIn::getNumDevices() == 0) {
262 memset(pwic, 0, sizeof(*pwic));
263 return MMSYSERR_NODRIVER;
264 }
265
266 // we have to fill in this thing
267 pwic->wMid = 0; /* manufacturer ID */
268 pwic->wPid = 0; /* product ID */
269 pwic->vDriverVersion = 0x0001; /* version of the driver */
270 strcpy( pwic->szPname, "OS/2 DART Wave In" ); /* product name */
271 pwic->dwFormats = WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 |
272 WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16 |
273 WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 |
274 WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 |
275 WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 |
276 WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16;
277
278 pwic->wChannels = 2; /* number of sources supported */
279 pwic->wReserved1 = 0; /* packing */
280
281 return MMSYSERR_NOERROR;
282}
283/******************************************************************************/
284/******************************************************************************/
285ODINFUNCTION3(MMRESULT, waveInGetDevCapsW,
286 UINT, uDeviceID,
287 LPWAVEINCAPSW, pwic,
288 UINT, cbwic)
289{
290 if(DartWaveIn::getNumDevices() == 0) {
291 memset(pwic, 0, sizeof(*pwic));
292 return MMSYSERR_NODRIVER;
293 }
294 // we have to fill in this thing
295 pwic->wMid = 0; /* manufacturer ID */
296 pwic->wPid = 0; /* product ID */
297 pwic->vDriverVersion = 0x0001; /* version of the driver */
298 lstrcpyW(pwic->szPname, (LPCWSTR)L"OS/2 DART Wave In"); /* product name */
299 pwic->dwFormats = WAVE_FORMAT_1M08 | WAVE_FORMAT_1S08 |
300 WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16 |
301 WAVE_FORMAT_2M08 | WAVE_FORMAT_2S08 |
302 WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 |
303 WAVE_FORMAT_4M08 | WAVE_FORMAT_4S08 |
304 WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16;
305
306 pwic->wChannels = 2; /* number of sources supported */
307 pwic->wReserved1 = 0; /* packing */
308
309 return MMSYSERR_NOERROR;
310}
311/******************************************************************************/
312/******************************************************************************/
313ODINFUNCTION3(MMRESULT, waveInGetErrorTextA,
314 MMRESULT, wError,
315 LPSTR, lpText,
316 UINT, cchText)
317{
318 dprintf(("WINMM:waveInGetErrorTextA(%d)\n", wError ));
319 char * theMsg = getWinmmMsg( wError );
320 if ( theMsg )
321 strncpy( lpText, theMsg, cchText );
322 else
323 {
324 char errMsg[100];
325 sprintf( errMsg, "Unknown error number %d", wError );
326 strncpy( lpText, errMsg, cchText );
327 }
328 return MMSYSERR_NOERROR;
329}
330/******************************************************************************/
331/******************************************************************************/
332ODINFUNCTION3(MMRESULT, waveInGetErrorTextW,
333 MMRESULT, wError,
334 LPWSTR, lpText,
335 UINT, cchText)
336{
337 dprintf(("WINMM:waveInGetErrorTextW(%d) - stub\n", wError ));
338 char * theMsg = getWinmmMsg( wError );
339 if ( theMsg )
340 AsciiToUnicode( theMsg, lpText );
341 else
342 {
343 char errMsg[100];
344 sprintf( errMsg, "Unknown error number %d", wError );
345 AsciiToUnicode( errMsg, lpText );
346 }
347 return MMSYSERR_NOERROR;
348}
349/******************************************************************************/
350/******************************************************************************/
351ODINFUNCTION2(MMRESULT, waveInGetID,
352 HWAVEIN, hwi,
353 LPUINT, puDeviceID)
354{
355 DartWaveIn *dwave = (DartWaveIn *)hwi;
356 if(DartWaveIn::find(dwave) == TRUE)
357 {
358 *puDeviceID = 1;
359 return MMSYSERR_NOERROR;
360 }
361 else return(MMSYSERR_INVALHANDLE);
362}
363/******************************************************************************/
364/******************************************************************************/
365ODINFUNCTION0(UINT, waveInGetNumDevs)
366{
367 return DartWaveIn::getNumDevices();
368}
369/******************************************************************************/
370/******************************************************************************/
371ODINFUNCTION4(MMRESULT, waveInMessage,
372 HWAVEIN, hwi,
373 UINT, uMsg,
374 DWORD, dw1,
375 DWORD, dw2)
376{
377 dprintf(("WINMM:waveInMessage - stub\n"));
378
379 DartWaveIn *dwave = (DartWaveIn *)hwi;
380 if(DartWaveIn::find(dwave) == TRUE)
381 {
382 return MMSYSERR_NOTSUPPORTED;
383 }
384 else
385 return(MMSYSERR_INVALHANDLE);
386}
387/******************************************************************************/
388/******************************************************************************/
389
Note: See TracBrowser for help on using the repository browser.