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

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

dynamically load MDM.DLL

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