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

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

Rewrite for DirectAudio interface

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