source: trunk/src/winmm/wavein.cpp

Last change on this file was 21916, checked in by dmik, 14 years ago

Merge branch gcc-kmk to trunk.

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