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

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

many wave playback & recording fixes

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