4 * Copyright 1993 Martin Ayotte
6 /* FIXME: I think there are some segmented vs. linear pointer weirdnesses
7 * and long term pointers to 16 bit space in here
16 #include <sys/ioctl.h>
29 static int InstalledCount
;
30 static int InstalledListLen
;
31 static LPSTR lpInstallNames
= NULL
;
33 struct LINUX_MCIDRIVER mciDrv
[MAXMCIDRIVERS
];
35 UINT16
midiGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
);
36 static UINT16
waveGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
);
37 LONG WINAPI
DrvDefDriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
38 DWORD dwParam1
, DWORD dwParam2
);
40 LONG
WAVE_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
41 DWORD dwParam1
, DWORD dwParam2
);
42 LONG
MIDI_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
43 DWORD dwParam1
, DWORD dwParam2
);
44 LONG
CDAUDIO_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
45 DWORD dwParam1
, DWORD dwParam2
);
46 LONG
ANIM_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
47 DWORD dwParam1
, DWORD dwParam2
);
50 #define GetDrv(wDevID) (&mciDrv[MMSYSTEM_DevIDToIndex(wDevID)])
51 #define GetOpenDrv(wDevID) (&(GetDrv(wDevID)->mop))
53 /* The wDevID's returned by wine were originally in the range
54 * 0 - (MAXMCIDRIVERS - 1) and used directly as array indices.
55 * Unfortunately, ms-windows uses wDevID of zero to indicate
56 * errors. Now, multimedia drivers must pass the wDevID through
57 * MMSYSTEM_DevIDToIndex to get an index in that range. An
58 * aribtrary value, MMSYSTEM_MAGIC is added to the wDevID seen
59 * by the windows programs.
62 #define MMSYSTEM_MAGIC 0x0F00
64 /**************************************************************************
65 * MMSYSTEM_DevIDToIndex [internal]
67 int MMSYSTEM_DevIDToIndex(UINT16 wDevID
) {
68 return wDevID
- MMSYSTEM_MAGIC
;
71 /**************************************************************************
72 * MMSYSTEM_FirstDevId [internal]
74 UINT16
MMSYSTEM_FirstDevID(void)
76 return MMSYSTEM_MAGIC
;
79 /**************************************************************************
80 * MMSYSTEM_NextDevId [internal]
82 UINT16
MMSYSTEM_NextDevID(UINT16 wDevID
) {
86 /**************************************************************************
87 * MMSYSTEM_DevIdValid [internal]
89 BOOL32
MMSYSTEM_DevIDValid(UINT16 wDevID
) {
90 return wDevID
>= 0x0F00 && wDevID
< (0x0F00 + MAXMCIDRIVERS
);
93 /**************************************************************************
94 * MMSYSTEM_WEP [MMSYSTEM.1]
96 int WINAPI
MMSYSTEM_WEP(HINSTANCE16 hInstance
, WORD wDataSeg
,
97 WORD cbHeapSize
, LPSTR lpCmdLine
)
99 fprintf(stderr
, "STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance
);
104 MMSYSTEM_MMTIME32to16(LPMMTIME16 mmt16
,LPMMTIME32 mmt32
) {
105 mmt16
->wType
= mmt32
->wType
;
106 /* layout of rest is the same for 32/16 */
107 memcpy(&(mmt32
->u
),&(mmt16
->u
),sizeof(mmt16
->u
));
111 MMSYSTEM_MMTIME16to32(LPMMTIME32 mmt32
,LPMMTIME16 mmt16
) {
112 mmt32
->wType
= mmt16
->wType
;
113 /* layout of rest is the same for 32/16,
114 * Note: mmt16->u is 2 bytes smaller than mmt32->u
116 memcpy(&(mmt16
->u
),&(mmt32
->u
),sizeof(mmt16
->u
));
119 /**************************************************************************
120 * PlaySoundA [WINMM.1]
122 BOOL32 WINAPI
PlaySound32A(LPCSTR pszSound
, HMODULE32 hmod
, DWORD fdwSound
)
124 TRACE(mmsys
, "pszSound='%p' hmod=%04X fdwSound=%08lX\n",
125 pszSound
, hmod
, fdwSound
);
126 if(hmod
!= 0 || !(fdwSound
& SND_FILENAME
)) {
127 fprintf(stderr
, "PlaySoundA: only disk sound files are supported\n");
130 return sndPlaySound(pszSound
, (UINT16
) fdwSound
);
133 /**************************************************************************
134 * PlaySoundW [WINMM.18]
136 BOOL32 WINAPI
PlaySound32W(LPCWSTR pszSound
, HMODULE32 hmod
, DWORD fdwSound
)
138 LPSTR pszSoundA
= HEAP_strdupWtoA(GetProcessHeap(),0,pszSound
);
141 bSound
= PlaySound32A(pszSoundA
, hmod
, fdwSound
);
142 HeapFree(GetProcessHeap(),0,pszSoundA
);
146 /**************************************************************************
147 * sndPlaySound [MMSYSTEM.2]
149 BOOL16 WINAPI
sndPlaySound(LPCSTR lpszSoundName
, UINT16 uFlags
)
157 TRACE(mmsys
, "SoundName='%s' uFlags=%04X !\n",
158 lpszSoundName
, uFlags
);
159 if (lpszSoundName
== NULL
) {
160 TRACE(mmsys
, "Stop !\n");
163 hmmio
= mmioOpen16((LPSTR
)lpszSoundName
, NULL
,
164 MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
166 if (uFlags
& SND_MEMORY
) {
167 FIXME(mmsys
, "SND_MEMORY flag not implemented!\n");
173 TRACE(mmsys
, "searching in SystemSound List !\n");
174 GetProfileString32A("Sounds", (LPSTR
)lpszSoundName
, "", str
, sizeof(str
));
175 if (strlen(str
) == 0) return FALSE
;
176 if ( (ptr
= (LPSTR
)strchr(str
, ',')) != NULL
) *ptr
= '\0';
177 hmmio
= mmioOpen16(str
, NULL
, MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
180 WARN(mmsys
, "can't find SystemSound='%s' !\n", str
);
185 if (mmioDescend(hmmio
, &ckMainRIFF
, NULL
, 0) == 0)
187 TRACE(mmsys
, "ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
188 (LPSTR
)&ckMainRIFF
.ckid
, (LPSTR
)&ckMainRIFF
.fccType
, ckMainRIFF
.cksize
);
190 if ((ckMainRIFF
.ckid
== FOURCC_RIFF
) &&
191 (ckMainRIFF
.fccType
== mmioFOURCC('W', 'A', 'V', 'E')))
195 mmckInfo
.ckid
= mmioFOURCC('f', 'm', 't', ' ');
197 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
199 PCMWAVEFORMAT pcmWaveFormat
;
201 TRACE(mmsys
, "Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
202 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
204 if (mmioRead(hmmio
, (HPSTR
) &pcmWaveFormat
,
205 (long) sizeof(PCMWAVEFORMAT
)) == (long) sizeof(PCMWAVEFORMAT
))
208 TRACE(mmsys
, "wFormatTag=%04X !\n", pcmWaveFormat
.wf
.wFormatTag
);
209 TRACE(mmsys
, "nChannels=%d \n", pcmWaveFormat
.wf
.nChannels
);
210 TRACE(mmsys
, "nSamplesPerSec=%ld\n", pcmWaveFormat
.wf
.nSamplesPerSec
);
211 TRACE(mmsys
, "nAvgBytesPerSec=%ld\n", pcmWaveFormat
.wf
.nAvgBytesPerSec
);
212 TRACE(mmsys
, "nBlockAlign=%d \n", pcmWaveFormat
.wf
.nBlockAlign
);
213 TRACE(mmsys
, "wBitsPerSample=%u !\n", pcmWaveFormat
.wBitsPerSample
);
215 mmckInfo
.ckid
= mmioFOURCC('d', 'a', 't', 'a');
216 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
218 WAVEOPENDESC waveDesc
;
221 TRACE(mmsys
, "Chunk Found \
222 ckid=%.4s fccType=%.4s cksize=%08lX \n", (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
224 pcmWaveFormat
.wf
.nAvgBytesPerSec
= pcmWaveFormat
.wf
.nSamplesPerSec
*
225 pcmWaveFormat
.wf
.nBlockAlign
;
227 waveDesc
.lpFormat
= (LPWAVEFORMAT
)&pcmWaveFormat
;
229 dwRet
= wodMessage( 0, WODM_OPEN
, 0, (DWORD
)&waveDesc
, CALLBACK_NULL
);
230 if (dwRet
== MMSYSERR_NOERROR
)
234 INT32 count
, bufsize
;
237 hData
= GlobalAlloc16(GMEM_MOVEABLE
, bufsize
);
238 waveHdr
.lpData
= (LPSTR
)GlobalLock16(hData
);
239 waveHdr
.dwBufferLength
= bufsize
;
241 waveHdr
.dwFlags
= 0L;
242 waveHdr
.dwLoops
= 0L;
244 dwRet
= wodMessage(0,WODM_PREPARE
,0,(DWORD
)&waveHdr
,sizeof(WAVEHDR
));
245 if (dwRet
== MMSYSERR_NOERROR
)
249 count
= mmioRead(hmmio
, waveHdr
.lpData
, bufsize
);
250 if (count
< 1) break;
251 waveHdr
.dwBufferLength
= count
;
252 /* waveHdr.dwBytesRecorded = count; */
253 /* FIXME: doesn't expect async ops */
254 wodMessage( 0, WODM_WRITE
, 0, (DWORD
)&waveHdr
, sizeof(WAVEHDR
));
256 wodMessage( 0, WODM_UNPREPARE
, 0, (DWORD
)&waveHdr
, sizeof(WAVEHDR
));
257 wodMessage( 0, WODM_CLOSE
, 0, 0L, 0L);
261 else WARN(mmsys
, "can't prepare WaveOut device !\n");
263 GlobalUnlock16(hData
);
272 if (hmmio
!= 0) mmioClose(hmmio
, 0);
276 /**************************************************************************
277 * mmsystemGetVersion [WINMM.134]
279 UINT32 WINAPI
mmsystemGetVersion32()
281 return mmsystemGetVersion16();
284 /**************************************************************************
285 * mmsystemGetVersion [MMSYSTEM.5]
286 * return value borrowed from Win95 winmm.dll ;)
288 UINT16 WINAPI
mmsystemGetVersion16()
290 TRACE(mmsys
, "3.10 (Win95?)\n");
294 /**************************************************************************
295 * DriverProc [MMSYSTEM.6]
297 LRESULT WINAPI
DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
298 DWORD dwParam1
, DWORD dwParam2
)
300 return DrvDefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
303 /**************************************************************************
304 * DriverCallback [MMSYSTEM.31]
306 BOOL16 WINAPI
DriverCallback(DWORD dwCallBack
, UINT16 uFlags
, HANDLE16 hDev
,
307 WORD wMsg
, DWORD dwUser
, DWORD dwParam1
, DWORD dwParam2
)
309 LPWAVEOPENDESC lpDesc
;
311 TRACE(mmsys
, "(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
312 dwCallBack
, uFlags
, hDev
, wMsg
, dwUser
, dwParam1
, dwParam2
);
313 switch(uFlags
& DCB_TYPEMASK
) {
315 TRACE(mmsys
, "CALLBACK_NULL !\n");
318 TRACE(mmsys
, "CALLBACK_WINDOW = %04lX handle = %04X!\n",dwCallBack
,hDev
);
319 if (!IsWindow32(dwCallBack
)) return FALSE
;
320 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hDev
);
321 if (lpDesc
== NULL
) return FALSE
;
323 PostMessage16((HWND16
)dwCallBack
, wMsg
, hDev
, dwParam1
);
326 TRACE(mmsys
, "CALLBACK_TASK !\n");
329 TRACE(mmsys
, "CALLBACK_FUNCTION !\n");
330 Callbacks
->CallDriverCallback( (FARPROC16
)dwCallBack
,
332 dwParam1
, dwParam2
);
338 /**************************************************************************
339 * Mixer devices. New to Win95
341 /**************************************************************************
342 * find out the real mixer ID depending on hmix (depends on dwFlags)
343 * FIXME: also fix dwInstance passing to mixMessage
345 static UINT32
_get_mixerID_from_handle(HMIXEROBJ32 hmix
,DWORD dwFlags
) {
346 /* FIXME: Check dwFlags for MIXER_OBJECTF_xxxx entries and modify hmix
347 * accordingly. For now we always use mixerdevice 0.
351 /**************************************************************************
352 * mixerGetNumDevs [WINMM.108]
354 UINT32 WINAPI
mixerGetNumDevs32()
356 return mixerGetNumDevs16();
359 /**************************************************************************
362 UINT16 WINAPI
mixerGetNumDevs16()
366 count
= mixMessage(0,MXDM_GETNUMDEVS
,0L,0L,0L);
367 TRACE(mmaux
,"mixerGetNumDevs returns %d\n",count
);
371 /**************************************************************************
372 * mixerGetDevCapsW [WINMM.102]
374 UINT32 WINAPI
mixerGetDevCaps32W(UINT32 devid
,LPMIXERCAPS32W mixcaps
,UINT32 size
)
377 UINT32 ret
= mixerGetDevCaps16(devid
,&mic16
,sizeof(mic16
));
379 mixcaps
->wMid
= mic16
.wMid
;
380 mixcaps
->wPid
= mic16
.wPid
;
381 mixcaps
->vDriverVersion
= mic16
.vDriverVersion
;
382 lstrcpyAtoW(mixcaps
->szPname
,mic16
.szPname
);
383 mixcaps
->fdwSupport
= mic16
.fdwSupport
;
384 mixcaps
->cDestinations
= mic16
.cDestinations
;
387 /**************************************************************************
388 * mixerGetDevCaps [WINMM.101]
390 UINT32 WINAPI
mixerGetDevCaps32A(UINT32 devid
,LPMIXERCAPS32A mixcaps
,UINT32 size
)
393 UINT32 ret
= mixerGetDevCaps16(devid
,&mic16
,sizeof(mic16
));
395 mixcaps
->wMid
= mic16
.wMid
;
396 mixcaps
->wPid
= mic16
.wPid
;
397 mixcaps
->vDriverVersion
= mic16
.vDriverVersion
;
398 strcpy(mixcaps
->szPname
,mic16
.szPname
);
399 mixcaps
->fdwSupport
= mic16
.fdwSupport
;
400 mixcaps
->cDestinations
= mic16
.cDestinations
;
404 /**************************************************************************
407 UINT16 WINAPI
mixerGetDevCaps16(UINT16 devid
,LPMIXERCAPS16 mixcaps
,UINT16 size
)
409 fprintf(stderr
,"mixerGetDevCaps!\n");
410 return mixMessage(devid
,MXDM_GETDEVCAPS
,0L,(DWORD
)mixcaps
,(DWORD
)size
);
413 /**************************************************************************
414 * mixerOpen [WINMM.110]
416 UINT32 WINAPI
mixerOpen32(LPHMIXER32 lphmix
,UINT32 uDeviceID
,DWORD dwCallback
,
417 DWORD dwInstance
,DWORD fdwOpen
)
422 fprintf(stderr
,"mixerOpen32(%p,%d,%08lx,%08lx,%08lx)\n",
423 lphmix
,uDeviceID
,dwCallback
,dwInstance
,fdwOpen
425 ret
= mixerOpen16(&hmix16
,uDeviceID
,dwCallback
,dwInstance
,fdwOpen
);
426 if (lphmix
) *lphmix
= hmix16
;
430 /**************************************************************************
433 UINT16 WINAPI
mixerOpen16(LPHMIXER16 lphmix
,UINT16 uDeviceID
,DWORD dwCallback
,
434 DWORD dwInstance
,DWORD fdwOpen
)
437 LPMIXEROPENDESC lpmod
;
438 BOOL32 mapperflag
= (uDeviceID
==0);
441 fprintf(stderr
,"mixerOpen(%p,%d,%08lx,%08lx,%08lx)\n",
442 lphmix
,uDeviceID
,dwCallback
,dwInstance
,fdwOpen
444 hmix
= USER_HEAP_ALLOC(sizeof(MIXEROPENDESC
));
445 if (lphmix
) *lphmix
= hmix
;
446 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
448 lpmod
->dwCallback
= dwCallback
;
449 lpmod
->dwInstance
= dwInstance
;
450 if (uDeviceID
>= MAXMIXERDRIVERS
)
452 while(uDeviceID
< MAXMIXERDRIVERS
) {
453 dwRet
=mixMessage(uDeviceID
,MXDM_OPEN
,dwInstance
,(DWORD
)lpmod
,fdwOpen
);
454 if (dwRet
== MMSYSERR_NOERROR
) break;
455 if (!mapperflag
) break;
458 lpmod
->uDeviceID
= uDeviceID
;
462 /**************************************************************************
463 * mixerClose [WINMM.98]
465 UINT32 WINAPI
mixerClose32(HMIXER32 hmix
) {
466 return mixerClose16(hmix
);
469 /**************************************************************************
472 UINT16 WINAPI
mixerClose16(HMIXER16 hmix
) {
473 LPMIXEROPENDESC lpmod
;
475 fprintf(stderr
,"mixerClose(%04x)\n",hmix
);
476 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
477 return mixMessage(lpmod
->uDeviceID
,MXDM_CLOSE
,lpmod
->dwInstance
,0L,0L);
480 /**************************************************************************
481 * mixerGetID [WINMM.103]
483 UINT32 WINAPI
mixerGetID32(HMIXEROBJ32 hmix
,LPUINT32 lpid
,DWORD fdwID
) {
486 UINT32 ret
= mixerGetID16(hmix
,&xid
,fdwID
);
487 if (*lpid
) *lpid
= xid
;
491 /**************************************************************************
494 UINT16 WINAPI
mixerGetID16(HMIXEROBJ16 hmix
,LPUINT16 lpid
,DWORD fdwID
) {
495 fprintf(stderr
,"mixerGetID(%04x)\n",hmix
);
496 return _get_mixerID_from_handle(hmix
,fdwID
);
499 /**************************************************************************
500 * mixerGetControlDetailsA [WINMM.99]
502 UINT32
mixerGetControlDetails32A(HMIXEROBJ32 hmix
,LPMIXERCONTROLDETAILS32 lpmcd
,DWORD fdwDetails
) {
503 fprintf(stderr
,"mixerGetControlDetails(%04x,%p,%08lx),stub!\n",
504 hmix
,lpmcd
,fdwDetails
506 return MMSYSERR_NOTENABLED
;
509 /**************************************************************************
510 * mixerGetControlDetailsW [WINMM.100]
512 UINT32
mixerGetControlDetails32W(HMIXEROBJ32 hmix
,LPMIXERCONTROLDETAILS32 lpmcd
,DWORD fdwDetails
) {
513 fprintf(stderr
,"mixerGetControlDetails(%04x,%p,%08lx),stub!\n",
514 hmix
,lpmcd
,fdwDetails
516 return MMSYSERR_NOTENABLED
;
519 /**************************************************************************
520 * mixerGetControlDetails [MMSYSTEM.808]
522 UINT16
mixerGetControlDetails16(HMIXEROBJ16 hmix
,LPMIXERCONTROLDETAILS16 lpmcd
,DWORD fdwDetails
) {
523 fprintf(stderr
,"mixerGetControlDetails(%04x,%p,%08lx),stub!\n",
524 hmix
,lpmcd
,fdwDetails
526 return MMSYSERR_NOTENABLED
;
529 /**************************************************************************
530 * mixerGetLineControlsA [WINMM.104]
532 UINT32 WINAPI
mixerGetLineControls32A(HMIXEROBJ32 hmix
,LPMIXERLINECONTROLS32A lpmlc
,DWORD fdwControls
) {
533 fprintf(stderr
,"mixerGetLineControlsA(%04x,%p,%08lx),stub!\n",
534 hmix
,lpmlc
,fdwControls
536 return MMSYSERR_NOTENABLED
;
539 /**************************************************************************
540 * mixerGetLineControlsW [WINMM.105]
542 UINT32 WINAPI
mixerGetLineControls32W(HMIXEROBJ32 hmix
,LPMIXERLINECONTROLS32W lpmlc
,DWORD fdwControls
) {
543 fprintf(stderr
,"mixerGetLineControlsA(%04x,%p,%08lx),stub!\n",
544 hmix
,lpmlc
,fdwControls
546 return MMSYSERR_NOTENABLED
;
549 /**************************************************************************
550 * mixerGetLineControls [MMSYSTEM.807]
552 UINT16 WINAPI
mixerGetLineControls16(HMIXEROBJ16 hmix
,LPMIXERLINECONTROLS16 lpmlc
,DWORD fdwControls
) {
553 fprintf(stderr
,"mixerGetLineControls(%04x,%p,%08lx),stub!\n",
554 hmix
,lpmlc
,fdwControls
556 return MMSYSERR_NOTENABLED
;
559 /**************************************************************************
560 * mixerGetLineInfoA [WINMM.106]
562 UINT32 WINAPI
mixerGetLineInfo32A(HMIXEROBJ32 hmix
,LPMIXERLINE32A lpml
,DWORD fdwInfo
) {
566 ml16
.dwDestination
= lpml
->dwDestination
;
567 fprintf(stderr
,"mixerGetLineInfoA(%04x,%p,%08lx),stub!\n",
570 ret
= mixerGetLineInfo16(hmix
,&ml16
,fdwInfo
);
571 lpml
->cbStruct
= sizeof(*lpml
);
572 lpml
->dwSource
= ml16
.dwSource
;
573 lpml
->dwLineID
= ml16
.dwLineID
;
574 lpml
->fdwLine
= ml16
.fdwLine
;
575 lpml
->dwUser
= ml16
.dwUser
;
576 lpml
->dwComponentType
= ml16
.dwComponentType
;
577 lpml
->cChannels
= ml16
.cChannels
;
578 lpml
->cConnections
= ml16
.cConnections
;
579 lpml
->cControls
= ml16
.cControls
;
580 strcpy(lpml
->szShortName
,ml16
.szShortName
);
581 strcpy(lpml
->szName
,ml16
.szName
);
582 lpml
->Target
.dwType
= ml16
.Target
.dwType
;
583 lpml
->Target
.dwDeviceID
= ml16
.Target
.dwDeviceID
;
584 lpml
->Target
.wMid
= ml16
.Target
.wMid
;
585 lpml
->Target
.wPid
= ml16
.Target
.wPid
;
586 lpml
->Target
.vDriverVersion
= ml16
.Target
.vDriverVersion
;
587 strcpy(lpml
->Target
.szPname
,ml16
.Target
.szPname
);
591 /**************************************************************************
592 * mixerGetLineInfoW [WINMM.107]
594 UINT32 WINAPI
mixerGetLineInfo32W(HMIXEROBJ32 hmix
,LPMIXERLINE32W lpml
,DWORD fdwInfo
) {
598 ml16
.dwDestination
= lpml
->dwDestination
;
599 fprintf(stderr
,"mixerGetLineInfoW(%04x,%p,%08lx),stub!\n",
602 ret
= mixerGetLineInfo16(hmix
,&ml16
,fdwInfo
);
603 lpml
->cbStruct
= sizeof(*lpml
);
604 lpml
->dwSource
= ml16
.dwSource
;
605 lpml
->dwLineID
= ml16
.dwLineID
;
606 lpml
->fdwLine
= ml16
.fdwLine
;
607 lpml
->dwUser
= ml16
.dwUser
;
608 lpml
->dwComponentType
= ml16
.dwComponentType
;
609 lpml
->cChannels
= ml16
.cChannels
;
610 lpml
->cConnections
= ml16
.cConnections
;
611 lpml
->cControls
= ml16
.cControls
;
612 lstrcpyAtoW(lpml
->szShortName
,ml16
.szShortName
);
613 lstrcpyAtoW(lpml
->szName
,ml16
.szName
);
614 lpml
->Target
.dwType
= ml16
.Target
.dwType
;
615 lpml
->Target
.dwDeviceID
= ml16
.Target
.dwDeviceID
;
616 lpml
->Target
.wMid
= ml16
.Target
.wMid
;
617 lpml
->Target
.wPid
= ml16
.Target
.wPid
;
618 lpml
->Target
.vDriverVersion
= ml16
.Target
.vDriverVersion
;
619 /*lstrcpyAtoW(lpml->Target.szPname,ml16.Target.szPname);*/
623 /**************************************************************************
624 * mixerGetLineInfo [MMSYSTEM.805]
626 UINT16 WINAPI
mixerGetLineInfo16(HMIXEROBJ16 hmix
,LPMIXERLINE16 lpml
,DWORD fdwInfo
) {
627 UINT16 devid
= _get_mixerID_from_handle(hmix
,fdwInfo
);
629 fprintf(stderr
,"mixerGetLineInfo16(%04x,%p[line %08lx],%08lx)\n",
630 hmix
,lpml
,lpml
->dwDestination
,fdwInfo
632 return mixMessage(devid
,MXDM_GETLINEINFO
,0,(DWORD
)lpml
,fdwInfo
);
635 /**************************************************************************
636 * mixerSetControlDetails [WINMM.111]
638 UINT32 WINAPI
mixerSetControlDetails32(HMIXEROBJ32 hmix
,LPMIXERCONTROLDETAILS32 lpmcd
,DWORD fdwDetails
) {
639 fprintf(stderr
,"mixerSetControlDetails32(%04x,%p,%08lx),stub!\n",
640 hmix
,lpmcd
,fdwDetails
642 return MMSYSERR_NOTENABLED
;
645 /**************************************************************************
646 * mixerSetControlDetails [MMSYSTEM.809]
648 UINT16 WINAPI
mixerSetControlDetails16(HMIXEROBJ16 hmix
,LPMIXERCONTROLDETAILS16 lpmcd
,DWORD fdwDetails
) {
649 fprintf(stderr
,"mixerSetControlDetails16(%04x,%p,%08lx),stub!\n",
650 hmix
,lpmcd
,fdwDetails
652 return MMSYSERR_NOTENABLED
;
655 /**************************************************************************
656 * mixerMessage [WINMM.109]
658 UINT32 WINAPI
mixerMessage32(HMIXER32 hmix
,UINT32 uMsg
,DWORD dwParam1
,DWORD dwParam2
) {
659 LPMIXEROPENDESC lpmod
;
662 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
664 uDeviceID
= lpmod
->uDeviceID
;
667 fprintf(stderr
,"mixerMessage(%04lx,%d,%08lx,%08lx)\n",(DWORD
)hmix
,uMsg
,dwParam1
,dwParam2
);
668 return mixMessage(uDeviceID
,uMsg
,0L,dwParam1
,dwParam2
);
671 /**************************************************************************
672 * mixerMessage [MMSYSTEM.804]
674 UINT16 WINAPI
mixerMessage16(HMIXER16 hmix
,UINT16 uMsg
,DWORD dwParam1
,DWORD dwParam2
) {
675 LPMIXEROPENDESC lpmod
;
678 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
680 uDeviceID
= lpmod
->uDeviceID
;
683 fprintf(stderr
,"mixerMessage(%04x,%d,%08lx,%08lx)\n",hmix
,uMsg
,dwParam1
,dwParam2
);
684 return mixMessage(uDeviceID
,uMsg
,0L,dwParam1
,dwParam2
);
687 /**************************************************************************
688 * auxGetNumDevs [WINMM.22]
690 UINT32 WINAPI
auxGetNumDevs32()
692 return auxGetNumDevs16();
695 /**************************************************************************
696 * auxGetNumDevs [MMSYSTEM.350]
698 UINT16 WINAPI
auxGetNumDevs16()
701 TRACE(mmsys
, "auxGetNumDevs !\n");
702 count
+= auxMessage(0, AUXDM_GETNUMDEVS
, 0L, 0L, 0L);
703 TRACE(mmsys
, "auxGetNumDevs return %u \n", count
);
707 /**************************************************************************
708 * auxGetDevCaps [WINMM.20]
710 UINT32 WINAPI
auxGetDevCaps32W(UINT32 uDeviceID
,LPAUXCAPS32W lpCaps
,UINT32 uSize
)
713 UINT32 ret
= auxGetDevCaps16(uDeviceID
,&ac16
,sizeof(ac16
));
715 lpCaps
->wMid
= ac16
.wMid
;
716 lpCaps
->wPid
= ac16
.wPid
;
717 lpCaps
->vDriverVersion
= ac16
.vDriverVersion
;
718 lstrcpyAtoW(lpCaps
->szPname
,ac16
.szPname
);
719 lpCaps
->wTechnology
= ac16
.wTechnology
;
720 lpCaps
->dwSupport
= ac16
.dwSupport
;
724 /**************************************************************************
725 * auxGetDevCaps [WINMM.21]
727 UINT32 WINAPI
auxGetDevCaps32A(UINT32 uDeviceID
,LPAUXCAPS32A lpCaps
,UINT32 uSize
)
730 UINT32 ret
= auxGetDevCaps16(uDeviceID
,&ac16
,sizeof(ac16
));
732 lpCaps
->wMid
= ac16
.wMid
;
733 lpCaps
->wPid
= ac16
.wPid
;
734 lpCaps
->vDriverVersion
= ac16
.vDriverVersion
;
735 strcpy(lpCaps
->szPname
,ac16
.szPname
);
736 lpCaps
->wTechnology
= ac16
.wTechnology
;
737 lpCaps
->dwSupport
= ac16
.dwSupport
;
741 /**************************************************************************
742 * auxGetDevCaps [MMSYSTEM.351]
744 UINT16 WINAPI
auxGetDevCaps16(UINT16 uDeviceID
,LPAUXCAPS16 lpCaps
, UINT16 uSize
)
746 TRACE(mmsys
, "(%04X, %p, %d) !\n",
747 uDeviceID
, lpCaps
, uSize
);
748 return auxMessage(uDeviceID
, AUXDM_GETDEVCAPS
,
749 0L, (DWORD
)lpCaps
, (DWORD
)uSize
);
752 /**************************************************************************
753 * auxGetVolume [WINM.23]
755 UINT32 WINAPI
auxGetVolume32(UINT32 uDeviceID
, DWORD
* lpdwVolume
)
757 return auxGetVolume16(uDeviceID
,lpdwVolume
);
760 /**************************************************************************
761 * auxGetVolume [MMSYSTEM.352]
763 UINT16 WINAPI
auxGetVolume16(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
765 TRACE(mmsys
, "(%04X, %p) !\n", uDeviceID
, lpdwVolume
);
766 return auxMessage(uDeviceID
, AUXDM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
769 /**************************************************************************
770 * auxSetVolume [WINMM.25]
772 UINT32 WINAPI
auxSetVolume32(UINT32 uDeviceID
, DWORD dwVolume
)
774 return auxSetVolume16(uDeviceID
,dwVolume
);
777 /**************************************************************************
778 * auxSetVolume [MMSYSTEM.353]
780 UINT16 WINAPI
auxSetVolume16(UINT16 uDeviceID
, DWORD dwVolume
)
782 TRACE(mmsys
, "(%04X, %08lX) !\n", uDeviceID
, dwVolume
);
783 return auxMessage(uDeviceID
, AUXDM_SETVOLUME
, 0L, dwVolume
, 0L);
786 /**************************************************************************
787 * auxOutMessage [MMSYSTEM.354]
789 DWORD WINAPI
auxOutMessage32(UINT32 uDeviceID
,UINT32 uMessage
,DWORD dw1
,DWORD dw2
)
792 case AUXDM_GETNUMDEVS
:
793 case AUXDM_GETVOLUME
:
794 case AUXDM_SETVOLUME
:
795 /* no argument conversion needed */
797 case AUXDM_GETDEVCAPS
:
798 return auxGetDevCaps32A(uDeviceID
,(LPAUXCAPS32A
)dw1
,dw2
);
800 fprintf(stderr
,"unhandled auxMessage32(%04x,%04x,%08lx,%08lx)\n",
801 uDeviceID
,uMessage
,dw1
,dw2
805 return auxMessage(uDeviceID
,uMessage
,0L,dw1
,dw2
);
808 /**************************************************************************
809 * auxOutMessage [MMSYSTEM.354]
811 DWORD WINAPI
auxOutMessage16(UINT16 uDeviceID
, UINT16 uMessage
, DWORD dw1
, DWORD dw2
)
813 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
814 uDeviceID
, uMessage
, dw1
, dw2
);
816 case AUXDM_GETNUMDEVS
:
817 case AUXDM_SETVOLUME
:
818 /* no argument conversion needed */
820 case AUXDM_GETVOLUME
:
821 return auxGetVolume16(uDeviceID
,(LPDWORD
)PTR_SEG_TO_LIN(dw1
));
822 case AUXDM_GETDEVCAPS
:
823 return auxGetDevCaps16(uDeviceID
,(LPAUXCAPS16
)PTR_SEG_TO_LIN(dw1
),dw2
);
825 fprintf(stderr
,"unhandled auxMessage32(%04x,%04x,%08lx,%08lx)\n",
826 uDeviceID
,uMessage
,dw1
,dw2
830 return auxMessage(uDeviceID
, uMessage
, 0L, dw1
, dw2
);
833 /**************************************************************************
834 * mciGetErrorStringW [WINMM.46]
836 BOOL32 WINAPI
mciGetErrorString32W(DWORD wError
,LPWSTR lpstrBuffer
,UINT32 uLength
)
838 LPSTR bufstr
= HeapAlloc(GetProcessHeap(),0,uLength
);
839 BOOL32 ret
= mciGetErrorString32A(wError
,bufstr
,uLength
);
841 lstrcpyAtoW(lpstrBuffer
,bufstr
);
842 HeapFree(GetProcessHeap(),0,bufstr
);
846 /**************************************************************************
847 * mciGetErrorStringA [WINMM.45]
849 BOOL32 WINAPI
mciGetErrorString32A(DWORD wError
,LPSTR lpstrBuffer
,UINT32 uLength
)
851 return mciGetErrorString16(wError
,lpstrBuffer
,uLength
);
854 /**************************************************************************
855 * mciGetErrorString [MMSYSTEM.706]
857 BOOL16 WINAPI
mciGetErrorString16(DWORD wError
,LPSTR lpstrBuffer
,UINT16 uLength
)
860 TRACE(mmsys
, "(%08lX, %p, %d);\n",
861 wError
, lpstrBuffer
, uLength
);
862 if ((lpstrBuffer
== NULL
) || (uLength
< 1)) return(FALSE
);
863 lpstrBuffer
[0] = '\0';
865 case MCIERR_INVALID_DEVICE_ID
:
866 msgptr
= "Invalid MCI device ID. Use the ID returned when opening the MCI device.";
868 case MCIERR_UNRECOGNIZED_KEYWORD
:
869 msgptr
= "The driver cannot recognize the specified command parameter.";
871 case MCIERR_UNRECOGNIZED_COMMAND
:
872 msgptr
= "The driver cannot recognize the specified command.";
874 case MCIERR_HARDWARE
:
875 msgptr
= "There is a problem with your media device. Make sure it is working correctly or contact the device manufacturer.";
877 case MCIERR_INVALID_DEVICE_NAME
:
878 msgptr
= "The specified device is not open or is not recognized by MCI.";
880 case MCIERR_OUT_OF_MEMORY
:
881 msgptr
= "Not enough memory available for this task. \nQuit one or more applications to increase available memory, and then try again.";
883 case MCIERR_DEVICE_OPEN
:
884 msgptr
= "The device name is already being used as an alias by this application. Use a unique alias.";
886 case MCIERR_CANNOT_LOAD_DRIVER
:
887 msgptr
= "There is an undetectable problem in loading the specified device driver.";
889 case MCIERR_MISSING_COMMAND_STRING
:
890 msgptr
= "No command was specified.";
892 case MCIERR_PARAM_OVERFLOW
:
893 msgptr
= "The output string was to large to fit in the return buffer. Increase the size of the buffer.";
895 case MCIERR_MISSING_STRING_ARGUMENT
:
896 msgptr
= "The specified command requires a character-string parameter. Please provide one.";
898 case MCIERR_BAD_INTEGER
:
899 msgptr
= "The specified integer is invalid for this command.";
901 case MCIERR_PARSER_INTERNAL
:
902 msgptr
= "The device driver returned an invalid return type. Check with the device manufacturer about obtaining a new driver.";
904 case MCIERR_DRIVER_INTERNAL
:
905 msgptr
= "There is a problem with the device driver. Check with the device manufacturer about obtaining a new driver.";
907 case MCIERR_MISSING_PARAMETER
:
908 msgptr
= "The specified command requires a parameter. Please supply one.";
910 case MCIERR_UNSUPPORTED_FUNCTION
:
911 msgptr
= "The MCI device you are using does not support the specified command.";
913 case MCIERR_FILE_NOT_FOUND
:
914 msgptr
= "Cannot find the specified file. Make sure the path and filename are correct.";
916 case MCIERR_DEVICE_NOT_READY
:
917 msgptr
= "The device driver is not ready.";
919 case MCIERR_INTERNAL
:
920 msgptr
= "A problem occurred in initializing MCI. Try restarting Windows.";
923 msgptr
= "There is a problem with the device driver. The driver has closed. Cannot access error.";
925 case MCIERR_CANNOT_USE_ALL
:
926 msgptr
= "Cannot use 'all' as the device name with the specified command.";
928 case MCIERR_MULTIPLE
:
929 msgptr
= "Errors occurred in more than one device. Specify each command and device separately to determine which devices caused the error";
931 case MCIERR_EXTENSION_NOT_FOUND
:
932 msgptr
= "Cannot determine the device type from the given filename extension.";
934 case MCIERR_OUTOFRANGE
:
935 msgptr
= "The specified parameter is out of range for the specified command.";
937 case MCIERR_FLAGS_NOT_COMPATIBLE
:
938 msgptr
= "The specified parameters cannot be used together.";
940 case MCIERR_FILE_NOT_SAVED
:
941 msgptr
= "Cannot save the specified file. Make sure you have enough disk space or are still connected to the network.";
943 case MCIERR_DEVICE_TYPE_REQUIRED
:
944 msgptr
= "Cannot find the specified device. Make sure it is installed or that the device name is spelled correctly.";
946 case MCIERR_DEVICE_LOCKED
:
947 msgptr
= "The specified device is now being closed. Wait a few seconds, and then try again.";
949 case MCIERR_DUPLICATE_ALIAS
:
950 msgptr
= "The specified alias is already being used in this application. Use a unique alias.";
952 case MCIERR_BAD_CONSTANT
:
953 msgptr
= "The specified parameter is invalid for this command.";
955 case MCIERR_MUST_USE_SHAREABLE
:
956 msgptr
= "The device driver is already in use. To share it, use the 'shareable' parameter with each 'open' command.";
958 case MCIERR_MISSING_DEVICE_NAME
:
959 msgptr
= "The specified command requires an alias, file, driver, or device name. Please supply one.";
961 case MCIERR_BAD_TIME_FORMAT
:
962 msgptr
= "The specified value for the time format is invalid. Refer to the MCI documentation for valid formats.";
964 case MCIERR_NO_CLOSING_QUOTE
:
965 msgptr
= "A closing double-quotation mark is missing from the parameter value. Please supply one.";
967 case MCIERR_DUPLICATE_FLAGS
:
968 msgptr
= "A parameter or value was specified twice. Only specify it once.";
970 case MCIERR_INVALID_FILE
:
971 msgptr
= "The specified file cannot be played on the specified MCI device. The file may be corrupt, or not in the correct format.";
973 case MCIERR_NULL_PARAMETER_BLOCK
:
974 msgptr
= "A null parameter block was passed to MCI.";
976 case MCIERR_UNNAMED_RESOURCE
:
977 msgptr
= "Cannot save an unnamed file. Supply a filename.";
979 case MCIERR_NEW_REQUIRES_ALIAS
:
980 msgptr
= "You must specify an alias when using the 'new' parameter.";
982 case MCIERR_NOTIFY_ON_AUTO_OPEN
:
983 msgptr
= "Cannot use the 'notify' flag with auto-opened devices.";
985 case MCIERR_NO_ELEMENT_ALLOWED
:
986 msgptr
= "Cannot use a filename with the specified device.";
988 case MCIERR_NONAPPLICABLE_FUNCTION
:
989 msgptr
= "Cannot carry out the commands in the order specified. Correct the command sequence, and then try again.";
991 case MCIERR_ILLEGAL_FOR_AUTO_OPEN
:
992 msgptr
= "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again.";
994 case MCIERR_FILENAME_REQUIRED
:
995 msgptr
= "The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension.";
997 case MCIERR_EXTRA_CHARACTERS
:
998 msgptr
= "Cannot specify extra characters after a string enclosed in quotation marks.";
1000 case MCIERR_DEVICE_NOT_INSTALLED
:
1001 msgptr
= "The specified device is not installed on the system. Use the Drivers option in Control Panel to install the device.";
1004 msgptr
= "Cannot access the specified file or MCI device. Try changing directories or restarting your computer.";
1007 msgptr
= "Cannot access the specified file or MCI device because the application cannot change directories.";
1009 case MCIERR_SET_DRIVE
:
1010 msgptr
= "Cannot access specified file or MCI device because the application cannot change drives.";
1012 case MCIERR_DEVICE_LENGTH
:
1013 msgptr
= "Specify a device or driver name that is less than 79 characters.";
1015 case MCIERR_DEVICE_ORD_LENGTH
:
1016 msgptr
= "Specify a device or driver name that is less than 69 characters.";
1018 case MCIERR_NO_INTEGER
:
1019 msgptr
= "The specified command requires an integer parameter. Please provide one.";
1021 case MCIERR_WAVE_OUTPUTSINUSE
:
1022 msgptr
= "All wave devices that can play files in the current format are in use. Wait until a wave device is free, and then try again.";
1024 case MCIERR_WAVE_SETOUTPUTINUSE
:
1025 msgptr
= "Cannot set the current wave device for play back because it is in use. Wait until the device is free, and then try again.";
1027 case MCIERR_WAVE_INPUTSINUSE
:
1028 msgptr
= "All wave devices that can record files in the current format are in use. Wait until a wave device is free, and then try again.";
1030 case MCIERR_WAVE_SETINPUTINUSE
:
1031 msgptr
= "Cannot set the current wave device for recording because it is in use. Wait until the device is free, and then try again.";
1033 case MCIERR_WAVE_OUTPUTUNSPECIFIED
:
1034 msgptr
= "Any compatible waveform playback device may be used.";
1036 case MCIERR_WAVE_INPUTUNSPECIFIED
:
1037 msgptr
= "Any compatible waveform recording device may be used.";
1039 case MCIERR_WAVE_OUTPUTSUNSUITABLE
:
1040 msgptr
= "No wave device that can play files in the current format is installed. Use the Drivers option to install the wave device.";
1042 case MCIERR_WAVE_SETOUTPUTUNSUITABLE
:
1043 msgptr
= "The device you are trying to play to cannot recognize the current file format.";
1045 case MCIERR_WAVE_INPUTSUNSUITABLE
:
1046 msgptr
= "No wave device that can record files in the current format is installed. Use the Drivers option to install the wave device.";
1048 case MCIERR_WAVE_SETINPUTUNSUITABLE
:
1049 msgptr
= "The device you are trying to record from cannot recognize the current file format.";
1051 case MCIERR_NO_WINDOW
:
1052 msgptr
= "There is no display window.";
1054 case MCIERR_CREATEWINDOW
:
1055 msgptr
= "Could not create or use window.";
1057 case MCIERR_FILE_READ
:
1058 msgptr
= "Cannot read the specified file. Make sure the file is still present, or check your disk or network connection.";
1060 case MCIERR_FILE_WRITE
:
1061 msgptr
= "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network.";
1063 case MCIERR_SEQ_DIV_INCOMPATIBLE
:
1064 msgptr
= "The time formats of the \"song pointer\" and SMPTE are mutually exclusive. You can't use them together.";
1066 case MCIERR_SEQ_NOMIDIPRESENT
:
1067 msgptr
= "The system has no installed MIDI devices. Use the Drivers option from the Control Panel to install a MIDI driver.";
1069 case MCIERR_SEQ_PORT_INUSE
:
1070 msgptr
= "The specified MIDI port is already in use. Wait until it is free; the try again.";
1072 case MCIERR_SEQ_PORT_MAPNODEVICE
:
1073 msgptr
= "The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use the MIDI Mapper option from the Control Panel to edit the setup.";
1075 case MCIERR_SEQ_PORT_MISCERROR
:
1076 msgptr
= "An error occurred with the specified port.";
1078 case MCIERR_SEQ_PORT_NONEXISTENT
:
1079 msgptr
= "The specified MIDI device is not installed on the system. Use the Drivers option from the Control Panel to install a MIDI device.";
1081 case MCIERR_SEQ_PORTUNSPECIFIED
:
1082 msgptr
= "The system doesnot have a current MIDI port specified.";
1084 case MCIERR_SEQ_TIMER
:
1085 msgptr
= "All multimedia timers are being used by other applications. Quit one of these applications; then, try again.";
1090 msg# 514 : videodisc
1095 msg# 519 : animation
1096 msg# 520 : digitalvideo
1098 msg# 522 : waveaudio
1099 msg# 523 : sequencer
1100 msg# 524 : not ready
1103 msg# 527 : recording
1109 msg# 533 : milliseconds
1116 msg# 540 : smpte 30 drop
1122 msgptr
= "Unknown MCI Error !\n";
1125 lstrcpyn32A(lpstrBuffer
, msgptr
, uLength
);
1126 TRACE(mmsys
, "msg = %s;\n", msgptr
);
1131 /**************************************************************************
1132 * mciDriverNotify [MMSYSTEM.711]
1134 BOOL16 WINAPI
mciDriverNotify(HWND16 hWndCallBack
, UINT16 wDevID
, UINT16 wStatus
)
1136 TRACE(mmsys
, "(%04X, %u, %04X)\n", hWndCallBack
, wDevID
, wStatus
);
1137 if (!IsWindow32(hWndCallBack
)) return FALSE
;
1138 TRACE(mmsys
, "before PostMessage\n");
1139 PostMessage16( hWndCallBack
, MM_MCINOTIFY
, wStatus
,
1140 MAKELONG(wDevID
, 0));
1144 /**************************************************************************
1145 * mciOpen [internal]
1148 DWORD
mciOpen(DWORD dwParam
, LPMCI_OPEN_PARMS16 lp16Parms
)
1151 LPMCI_OPEN_PARMS16 lpParms
;
1153 UINT16 wDevID
= MMSYSTEM_FirstDevID();
1156 lpParms
= PTR_SEG_TO_LIN(lp16Parms
);
1157 TRACE(mmsys
, "(%08lX, %p (%p))\n", dwParam
, lp16Parms
, lpParms
);
1158 if (lp16Parms
== NULL
) return MCIERR_INTERNAL
;
1160 while(GetDrv(wDevID
)->modp
.wType
!= 0) {
1161 wDevID
= MMSYSTEM_NextDevID(wDevID
);
1162 if (!MMSYSTEM_DevIDValid(wDevID
)) {
1163 TRACE(mmsys
, "MAXMCIDRIVERS reached !\n");
1164 return MCIERR_INTERNAL
;
1167 TRACE(mmsys
, "wDevID=%04X \n", wDevID
);
1168 memcpy(GetOpenDrv(wDevID
),lpParms
,sizeof(*lpParms
));
1170 if (dwParam
& MCI_OPEN_ELEMENT
) {
1173 TRACE(mmsys
,"lpstrElementName='%s'\n",
1174 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
)
1176 s
=(char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
);
1179 GetProfileString32A("mci extensions",t
+1,"*",str
,sizeof(str
));
1181 TRACE(mmsys
, "str = %s \n", str
);
1182 if (strcmp(str
, "CDAUDIO") == 0) {
1183 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
1185 if (strcmp(str
, "WAVEAUDIO") == 0) {
1186 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
1188 if (strcmp(str
, "SEQUENCER") == 0) {
1189 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
1191 if (strcmp(str
, "ANIMATION1") == 0) {
1192 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
1194 if (strcmp(str
, "AVIVIDEO") == 0) {
1195 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
1197 if (strcmp(str
,"*") == 0) {
1198 TRACE(mmsys
,"No [mci extensions] entry for %s found.\n",t
);
1199 return MCIERR_EXTENSION_NOT_FOUND
;
1202 HDRVR16 hdrv
= OpenDriver(str
,"mci",NULL
);
1206 hmod
= GetDriverModuleHandle(hdrv
);
1207 GetDrv(wDevID
)->hdrv
= hdrv
;
1208 GetDrv(wDevID
)->driverproc
= GetProcAddress16(hmod
,SEGPTR_GET(SEGPTR_STRDUP("DRIVERPROC")));
1209 uDevTyp
= MCI_DEVTYPE_OTHER
;
1211 FIXME(mmsys
, "[mci extensions] entry %s for %s not supported.\n",str
,t
);
1212 return MCIERR_DEVICE_NOT_INSTALLED
;
1217 return MCIERR_EXTENSION_NOT_FOUND
;
1220 if (dwParam
& MCI_OPEN_ALIAS
) {
1221 TRACE(mmsys
, "Alias='%s' !\n",
1222 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
));
1223 GetOpenDrv(wDevID
)->lpstrAlias
= (LPSTR
)SEGPTR_GET(
1224 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
)));
1225 /* mplayer does allocate alias to CDAUDIO */
1227 if (dwParam
& MCI_OPEN_TYPE
) {
1228 if (dwParam
& MCI_OPEN_TYPE_ID
) {
1229 TRACE(mmsys
, "Dev=%08lx!\n", (DWORD
)lpParms
->lpstrDeviceType
);
1230 uDevTyp
= LOWORD((DWORD
)lpParms
->lpstrDeviceType
);
1231 GetOpenDrv(wDevID
)->lpstrDeviceType
=(LPSTR
)lpParms
->lpstrDeviceType
;
1233 if (lpParms
->lpstrDeviceType
== NULL
) return MCIERR_INTERNAL
;
1234 TRACE(mmsys
, "Dev='%s' !\n",
1235 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
1236 GetOpenDrv(wDevID
)->lpstrDeviceType
=(LPSTR
)SEGPTR_GET(
1237 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
)));
1238 strcpy(str
, PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
1240 if (strcmp(str
, "CDAUDIO") == 0) {
1241 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
1243 if (strcmp(str
, "WAVEAUDIO") == 0) {
1244 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
1246 if (strcmp(str
, "SEQUENCER") == 0) {
1247 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
1249 if (strcmp(str
, "ANIMATION1") == 0) {
1250 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
1252 if (strcmp(str
, "AVIVIDEO") == 0) {
1253 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
1257 fprintf(stderr
,"trying to load driver...\n");
1258 hdrv
= OpenDriver(str
,"mci",NULL
);
1262 hmod
= GetDriverModuleHandle(hdrv
);
1263 GetDrv(wDevID
)->hdrv
= hdrv
;
1264 GetDrv(wDevID
)->driverproc
= GetProcAddress16(hmod
,SEGPTR_GET(SEGPTR_STRDUP("DRIVERPROC")));
1265 uDevTyp
= MCI_DEVTYPE_OTHER
;
1268 return MCIERR_DEVICE_NOT_INSTALLED
;
1272 GetDrv(wDevID
)->modp
.wType
= uDevTyp
;
1273 GetDrv(wDevID
)->modp
.wDeviceID
= 0; /* FIXME? for multiple devices */
1274 lpParms
->wDeviceID
= wDevID
;
1275 TRACE(mmsys
, "mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
1276 wDevID
, uDevTyp
, lpParms
->wDeviceID
);
1279 case MCI_DEVTYPE_CD_AUDIO
:
1280 dwret
= CDAUDIO_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1281 dwParam
, (DWORD
)lp16Parms
);
1283 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
1284 dwret
= WAVE_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1285 dwParam
, (DWORD
)lp16Parms
);
1287 case MCI_DEVTYPE_SEQUENCER
:
1288 dwret
= MIDI_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1289 dwParam
, (DWORD
)lp16Parms
);
1291 case MCI_DEVTYPE_ANIMATION
:
1292 dwret
= ANIM_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1293 dwParam
, (DWORD
)lp16Parms
);
1295 case MCI_DEVTYPE_DIGITAL_VIDEO
:
1296 TRACE(mmsys
, "No DIGITAL_VIDEO yet !\n");
1297 return MCIERR_DEVICE_NOT_INSTALLED
;
1300 dwret
= Callbacks
->CallDriverProc(GetDrv(wDevID
)->driverproc
,0,GetDrv(wDevID
)->hdrv
,MCI_OPEN_DRIVER
,dwParam
,(DWORD
)lp16Parms
);
1301 WARN(mmsys
, "Invalid Device Name '%08lx' !\n", (DWORD
)lpParms
->lpstrDeviceType
);
1303 return MCIERR_INVALID_DEVICE_NAME
;
1307 if (dwParam
&MCI_NOTIFY
)
1308 mciDriverNotify(lpParms
->dwCallback
,wDevID
,
1309 (dwret
==0?MCI_NOTIFY_SUCCESSFUL
:MCI_NOTIFY_FAILURE
));
1311 /* only handled devices fall through */
1312 TRACE(mmsys
, "wDevID = %04X wDeviceID = %d dwret = %ld\n",wDevID
, lpParms
->wDeviceID
, dwret
);
1316 /**************************************************************************
1317 * mciGetDriverData [MMSYSTEM.708]
1319 DWORD WINAPI
mciGetDriverData16(HDRVR16 hdrv
) {
1320 fprintf(stderr
,"mciGetDriverData(%04x),stub!\n",hdrv
);
1324 /**************************************************************************
1325 * mciSetDriverData [MMSYSTEM.707]
1327 DWORD WINAPI
mciSetDriverData16(HDRVR16 hdrv
,DWORD data
) {
1328 fprintf(stderr
,"mciSetDriverData(%04x,%08lx),stub!\n",hdrv
,data
);
1332 /**************************************************************************
1333 * mciClose [internal]
1335 DWORD
mciClose(UINT16 wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
1337 DWORD dwRet
= MCIERR_INTERNAL
;
1339 TRACE(mmsys
, "(%04x, %08lX, %p)\n", wDevID
, dwParam
, lpParms
);
1340 switch(GetDrv(wDevID
)->modp
.wType
) {
1341 case MCI_DEVTYPE_CD_AUDIO
:
1342 dwRet
= CDAUDIO_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
,0,
1343 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
1345 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
1346 dwRet
= WAVE_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, 0,
1350 case MCI_DEVTYPE_SEQUENCER
:
1351 dwRet
= MIDI_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, 0,
1356 case MCI_DEVTYPE_ANIMATION:
1357 dwRet = ANIM_DriverProc(GetDrv(wDevID)->modp.wDeviceID, 0,
1363 dwRet
= Callbacks
->CallDriverProc(GetDrv(wDevID
)->driverproc
,GetDrv(wDevID
)->modp
.wDeviceID
,GetDrv(wDevID
)->hdrv
,MCI_CLOSE
,dwParam
,(DWORD
)lpParms
);
1365 GetDrv(wDevID
)->modp
.wType
= 0;
1367 if (dwParam
&MCI_NOTIFY
)
1368 mciDriverNotify(lpParms
->dwCallback
,wDevID
,
1369 (dwRet
==0?MCI_NOTIFY_SUCCESSFUL
:MCI_NOTIFY_FAILURE
));
1371 TRACE(mmsys
, "returns %ld\n",dwRet
);
1376 /**************************************************************************
1377 * mciSysinfo [internal]
1379 DWORD
mciSysInfo(DWORD dwFlags
, LPMCI_SYSINFO_PARMS16 lpParms
)
1385 LPSTR SysFile
= "SYSTEM.INI";
1386 TRACE(mci
, "(%08lX, %08lX)\n", dwFlags
, (DWORD
)lpParms
);
1387 lpstrReturn
= PTR_SEG_TO_LIN(lpParms
->lpstrReturn
);
1389 case MCI_SYSINFO_QUANTITY
:
1390 TRACE(mci
, "MCI_SYSINFO_QUANTITY \n");
1391 lpdwRet
= (DWORD
*)lpstrReturn
;
1392 *(lpdwRet
) = InstalledCount
;
1394 case MCI_SYSINFO_INSTALLNAME
:
1395 TRACE(mci
, "MCI_SYSINFO_INSTALLNAME \n");
1396 if (lpInstallNames
== NULL
) {
1398 InstalledListLen
= 0;
1399 ptr
= lpInstallNames
= xmalloc(2048);
1400 GetPrivateProfileString32A("mci", NULL
, "", lpInstallNames
, 2000, SysFile
);
1401 while(strlen(ptr
) > 0) {
1402 TRACE(mci
, "---> '%s' \n", ptr
);
1403 len
= strlen(ptr
) + 1;
1405 InstalledListLen
+= len
;
1409 if (lpParms
->dwRetSize
< InstalledListLen
)
1410 lstrcpyn32A(lpstrReturn
, lpInstallNames
, lpParms
->dwRetSize
- 1);
1412 strcpy(lpstrReturn
, lpInstallNames
);
1414 case MCI_SYSINFO_NAME
:
1415 TRACE(mci
, "MCI_SYSINFO_NAME \n");
1417 case MCI_SYSINFO_OPEN
:
1418 TRACE(mci
, "MCI_SYSINFO_OPEN \n");
1421 return MMSYSERR_INVALPARAM
;
1424 /**************************************************************************
1425 * mciLoadCommandResource
1427 UINT16
mciLoadCommandResource16(HANDLE16 hinst
,LPCSTR resname
,UINT16 type
)
1437 static mcidevtype
= 0;
1439 fprintf(stderr
,"mciLoadCommandResource16(%04x,%s,%d),stub!\n",
1442 if (!lstrcmpi32A(resname
,"core")) {
1443 fprintf(stderr
,"mciLoadCommandResource(...,\"core\",...), have to use internal tables... (not there yet)\n");
1446 /* if file exists "resname.mci", then load resource "resname" from it
1447 * otherwise directly from driver
1449 strcpy(buf
,resname
);
1451 if (OpenFile32(buf
,&ofs
,OF_EXIST
)!=HFILE_ERROR32
) {
1452 xhinst
= LoadLibrary16(buf
);
1455 } /* else use passed hinst */
1456 segstr
= SEGPTR_STRDUP(resname
);
1457 hrsrc
= FindResource16(hinst
,SEGPTR_GET(segstr
),type
);
1458 SEGPTR_FREE(segstr
);
1460 fprintf(stderr
,"mciLoadCommandResource:no special commandlist found in resource\n");
1461 return MCI_NO_COMMAND_TABLE
;
1463 hmem
= LoadResource16(hinst
,hrsrc
);
1465 fprintf(stderr
,"mciLoadCommandResource:couldn't load resource??\n");
1466 return MCI_NO_COMMAND_TABLE
;
1468 xmem
= WIN16_LockResource16(hmem
);
1470 fprintf(stderr
,"mciLoadCommandResource:couldn't lock resource??\n");
1471 FreeResource16(hmem
);
1472 return MCI_NO_COMMAND_TABLE
;
1474 lmem
= PTR_SEG_TO_LIN(xmem
);
1475 fprintf(stderr
,"first resource entry is %s\n",(char*)lmem
);
1476 /* parse resource, register stuff, return unique id */
1477 return ++mcidevtype
;
1481 /**************************************************************************
1482 * mciSound [internal]
1483 * not used anymore ??
1485 DWORD mciSound(UINT16 wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
1487 if (lpParms == NULL) return MCIERR_INTERNAL;
1488 if (dwParam & MCI_SOUND_NAME)
1489 TRACE(mci, "file='%s' !\n", lpParms->lpstrSoundName);
1490 return MCIERR_INVALID_DEVICE_ID;
1495 static const char *_mciCommandToString(UINT16 wMsg
)
1497 static char buffer
[100];
1499 #define CASE(s) case (s): return #s
1510 CASE(MCI_GETDEVCAPS
);
1534 sprintf(buffer
, "%04X", wMsg
);
1540 /**************************************************************************
1541 * mciSendCommandA [WINMM.49]
1543 DWORD WINAPI
mciSendCommand32A(UINT32 wDevID
, UINT32 wMsg
, DWORD dwParam1
,
1546 fprintf(stderr
,"mciSendCommand32A(%08x,%s,%08lx,%08lx),stub!\n",
1547 wDevID
,_mciCommandToString(wMsg
),dwParam1
,dwParam2
1551 LPMCI_OPEN_PARMS32A lpmop
= (LPMCI_OPEN_PARMS32A
)dwParam2
;
1552 fprintf(stderr
," MCI_OPEN(%s,%s,%s)\n",
1553 (dwParam1
&MCI_OPEN_TYPE
) ?lpmop
->lpstrDeviceType
:"<null>",
1554 (dwParam1
&MCI_OPEN_ELEMENT
)?(HIWORD(lpmop
->lpstrElementName
)?lpmop
->lpstrElementName
:"<id>"):"<null>",
1555 (dwParam1
&MCI_OPEN_ALIAS
) ?lpmop
->lpstrAlias
:"<null>"
1560 return 0x1; /* !ok */
1562 /**************************************************************************
1563 * mciSendCommand [MMSYSTEM.701]
1565 DWORD WINAPI
mciSendCommand(UINT16 wDevID
, UINT16 wMsg
, DWORD dwParam1
,
1569 TRACE(mci
, "(%04X, %s, %08lX, %08lX)\n",
1570 wDevID
, _mciCommandToString(wMsg
), dwParam1
, dwParam2
);
1574 return mciOpen(dwParam1
, (LPMCI_OPEN_PARMS16
)dwParam2
);
1576 return mciClose( wDevID
, dwParam1
,
1577 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
1579 return mciSysInfo( dwParam1
,
1580 (LPMCI_SYSINFO_PARMS16
)PTR_SEG_TO_LIN(dwParam2
));
1582 switch(GetDrv(wDevID
)->modp
.wType
)
1584 case MCI_DEVTYPE_CD_AUDIO
:
1585 return CDAUDIO_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, hDrv
,
1586 wMsg
, dwParam1
, dwParam2
);
1587 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
1588 return WAVE_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, hDrv
,
1589 wMsg
, dwParam1
, dwParam2
);
1590 case MCI_DEVTYPE_SEQUENCER
:
1591 return MIDI_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, hDrv
,
1592 wMsg
, dwParam1
, dwParam2
);
1594 case MCI_DEVTYPE_ANIMATION:
1595 return ANIM_DriverProc(GetDrv(wDevID)->modp.wDeviceID, hDrv,
1596 wMsg, dwParam1, dwParam2);
1599 return Callbacks
->CallDriverProc(GetDrv(wDevID
)->driverproc
,GetDrv(wDevID
)->modp
.wDeviceID
,GetDrv(wDevID
)->hdrv
,MCI_CLOSE
,dwParam1
,dwParam2
);
1601 WARN(mci
, "unknown device type=%04X !\n",
1602 GetDrv(wDevID
)->modp
.wType
);
1605 return MMSYSERR_INVALPARAM
;
1608 /**************************************************************************
1609 * mciGetDeviceID [MMSYSTEM.703]
1611 UINT16 WINAPI
mciGetDeviceID (LPCSTR lpstrName
)
1615 TRACE(mci
, "(\"%s\")\n", lpstrName
);
1616 if (lpstrName
&& !lstrcmpi32A(lpstrName
, "ALL"))
1617 return MCI_ALL_DEVICE_ID
;
1622 wDevID
= MMSYSTEM_FirstDevID();
1623 while(MMSYSTEM_DevIDValid(wDevID
) && GetDrv(wDevID
)->modp
.wType
) {
1624 if (GetOpenDrv(wDevID
)->lpstrDeviceType
&&
1625 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrDeviceType
), lpstrName
) == 0)
1628 if (GetOpenDrv(wDevID
)->lpstrAlias
&&
1629 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrAlias
), lpstrName
) == 0)
1632 wDevID
= MMSYSTEM_NextDevID(wDevID
);
1638 /**************************************************************************
1639 * mciSetYieldProc [MMSYSTEM.714]
1641 BOOL16 WINAPI
mciSetYieldProc (UINT16 uDeviceID
,
1642 YIELDPROC fpYieldProc
, DWORD dwYieldData
)
1647 /**************************************************************************
1648 * mciGetDeviceIDFromElementID [MMSYSTEM.715]
1650 UINT16 WINAPI
mciGetDeviceIDFromElementID(DWORD dwElementID
, LPCSTR lpstrType
)
1655 /**************************************************************************
1656 * mciGetYieldProc [MMSYSTEM.716]
1658 YIELDPROC WINAPI
mciGetYieldProc(UINT16 uDeviceID
, DWORD
* lpdwYieldData
)
1663 /**************************************************************************
1664 * mciGetCreatorTask [MMSYSTEM.717]
1666 HTASK16 WINAPI
mciGetCreatorTask(UINT16 uDeviceID
)
1671 /**************************************************************************
1672 * midiOutGetNumDevs [WINMM.80]
1674 UINT32 WINAPI
midiOutGetNumDevs32(void)
1676 return midiOutGetNumDevs16();
1678 /**************************************************************************
1679 * midiOutGetNumDevs [MMSYSTEM.201]
1681 UINT16 WINAPI
midiOutGetNumDevs16(void)
1684 TRACE(mmsys
, "midiOutGetNumDevs\n");
1685 count
+= modMessage(0, MODM_GETNUMDEVS
, 0L, 0L, 0L);
1686 TRACE(mmsys
, "midiOutGetNumDevs return %u \n", count
);
1690 /**************************************************************************
1691 * midiOutGetDevCapsW [WINMM.76]
1693 UINT32 WINAPI
midiOutGetDevCaps32W(UINT32 uDeviceID
,LPMIDIOUTCAPS32W lpCaps
, UINT32 uSize
)
1695 MIDIOUTCAPS16 moc16
;
1698 ret
= midiOutGetDevCaps16(uDeviceID
,&moc16
,sizeof(moc16
));
1699 lpCaps
->wMid
= moc16
.wMid
;
1700 lpCaps
->wPid
= moc16
.wPid
;
1701 lpCaps
->vDriverVersion
= moc16
.vDriverVersion
;
1702 lstrcpyAtoW(lpCaps
->szPname
,moc16
.szPname
);
1703 lpCaps
->wTechnology
= moc16
.wTechnology
;
1704 lpCaps
->wVoices
= moc16
.wVoices
;
1705 lpCaps
->wNotes
= moc16
.wNotes
;
1706 lpCaps
->wChannelMask
= moc16
.wChannelMask
;
1707 lpCaps
->dwSupport
= moc16
.dwSupport
;
1710 /**************************************************************************
1711 * midiOutGetDevCapsA [WINMM.75]
1713 UINT32 WINAPI
midiOutGetDevCaps32A(UINT32 uDeviceID
,LPMIDIOUTCAPS32A lpCaps
, UINT32 uSize
)
1715 MIDIOUTCAPS16 moc16
;
1718 ret
= midiOutGetDevCaps16(uDeviceID
,&moc16
,sizeof(moc16
));
1719 lpCaps
->wMid
= moc16
.wMid
;
1720 lpCaps
->wPid
= moc16
.wPid
;
1721 lpCaps
->vDriverVersion
= moc16
.vDriverVersion
;
1722 strcpy(lpCaps
->szPname
,moc16
.szPname
);
1723 lpCaps
->wTechnology
= moc16
.wTechnology
;
1724 lpCaps
->wVoices
= moc16
.wVoices
;
1725 lpCaps
->wNotes
= moc16
.wNotes
;
1726 lpCaps
->wChannelMask
= moc16
.wChannelMask
;
1727 lpCaps
->dwSupport
= moc16
.dwSupport
;
1731 /**************************************************************************
1732 * midiOutGetDevCaps [MMSYSTEM.202]
1734 UINT16 WINAPI
midiOutGetDevCaps16(UINT16 uDeviceID
,LPMIDIOUTCAPS16 lpCaps
, UINT16 uSize
)
1736 TRACE(mmsys
, "midiOutGetDevCaps\n");
1737 return modMessage(uDeviceID
,MODM_GETDEVCAPS
,0,(DWORD
)lpCaps
,uSize
);
1740 /**************************************************************************
1741 * midiOutGetErrorTextA [WINMM.77]
1743 UINT32 WINAPI
midiOutGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
1745 TRACE(mmsys
, "midiOutGetErrorText\n");
1746 return midiGetErrorText(uError
, lpText
, uSize
);
1749 /**************************************************************************
1750 * midiOutGetErrorTextW [WINMM.78]
1752 UINT32 WINAPI
midiOutGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
1754 LPSTR xstr
= HeapAlloc(GetProcessHeap(),0,uSize
);
1757 TRACE(mmsys
, "midiOutGetErrorText\n");
1758 ret
= midiGetErrorText(uError
, xstr
, uSize
);
1759 lstrcpyAtoW(lpText
,xstr
);
1760 HeapFree(GetProcessHeap(),0,xstr
);
1763 /**************************************************************************
1764 * midiOutGetErrorText [MMSYSTEM.203]
1766 UINT16 WINAPI
midiOutGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1768 TRACE(mmsys
, "midiOutGetErrorText\n");
1769 return midiGetErrorText(uError
, lpText
, uSize
);
1772 /**************************************************************************
1773 * midiGetErrorText [internal]
1775 UINT16 WINAPI
midiGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1778 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1781 case MIDIERR_UNPREPARED
:
1782 msgptr
= "The MIDI header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1784 case MIDIERR_STILLPLAYING
:
1785 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1788 msgptr
= "A MIDI map was not found. There may be a problem with the driver, or the MIDIMAP.CFG file may be corrupt or missing.";
1790 case MIDIERR_NOTREADY
:
1791 msgptr
= "The port is transmitting data to the device. Wait until the data has been transmitted, and then try again.";
1793 case MIDIERR_NODEVICE
:
1794 msgptr
= "The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use MIDI Mapper to edit the setup.";
1796 case MIDIERR_INVALIDSETUP
:
1797 msgptr
= "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the Windows SYSTEM directory, and then try again.";
1800 msg# 336 : Cannot use the song-pointer time format and the SMPTE time-format together.
1801 msg# 337 : The specified MIDI device is already in use. Wait until it is free, and then try again.
1802 msg# 338 : The specified MIDI device is not installed on the system. Use the Drivers option in Control Panel to install the driver.
1803 msg# 339 : The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use MIDI Mapper to edit the setup.
1804 msg# 340 : An error occurred using the specified port.
1805 msg# 341 : All multimedia timers are being used by other applications. Quit one of these applications, and then try again.
1806 msg# 342 : There is no current MIDI port.
1807 msg# 343 : There are no MIDI devices installed on the system. Use the Drivers option in Control Panel to install the driver.
1810 msgptr
= "Unknown MIDI Error !\n";
1813 lstrcpyn32A(lpText
, msgptr
, uSize
);
1817 /**************************************************************************
1818 * midiOutOpen [WINM.84]
1820 UINT32 WINAPI
midiOutOpen32(HMIDIOUT32
* lphMidiOut
, UINT32 uDeviceID
,
1821 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1826 ret
= midiOutOpen16(&hmo16
,uDeviceID
,dwCallback
,dwInstance
,dwFlags
);
1827 if (lphMidiOut
) *lphMidiOut
= hmo16
;
1830 /**************************************************************************
1831 * midiOutOpen [MMSYSTEM.204]
1833 UINT16 WINAPI
midiOutOpen16(HMIDIOUT16
* lphMidiOut
, UINT16 uDeviceID
,
1834 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1837 LPMIDIOPENDESC lpDesc
;
1839 BOOL32 bMapperFlg
= FALSE
;
1840 if (lphMidiOut
!= NULL
) *lphMidiOut
= 0;
1841 TRACE(mmsys
, "(%p, %d, %08lX, %08lX, %08lX);\n",
1842 lphMidiOut
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1843 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
1844 TRACE(mmsys
, "MIDI_MAPPER mode requested !\n");
1848 hMidiOut
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1849 if (lphMidiOut
!= NULL
) *lphMidiOut
= hMidiOut
;
1850 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1852 return MMSYSERR_NOMEM
;
1853 lpDesc
->hMidi
= hMidiOut
;
1854 lpDesc
->dwCallback
= dwCallback
;
1855 lpDesc
->dwInstance
= dwInstance
;
1856 while(uDeviceID
< MAXMIDIDRIVERS
) {
1857 dwRet
= modMessage(uDeviceID
, MODM_OPEN
,
1858 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
1859 if (dwRet
== MMSYSERR_NOERROR
) break;
1860 if (!bMapperFlg
) break;
1862 TRACE(mmsys
, "MIDI_MAPPER mode ! try next driver...\n");
1867 /**************************************************************************
1868 * midiOutClose [WINMM.74]
1870 UINT32 WINAPI
midiOutClose32(HMIDIOUT32 hMidiOut
)
1872 return midiOutClose16(hMidiOut
);
1875 /**************************************************************************
1876 * midiOutClose [MMSYSTEM.205]
1878 UINT16 WINAPI
midiOutClose16(HMIDIOUT16 hMidiOut
)
1880 LPMIDIOPENDESC lpDesc
;
1881 TRACE(mmsys
, "(%04X)\n", hMidiOut
);
1882 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1883 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1884 return modMessage(0, MODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1887 /**************************************************************************
1888 * midiOutPrepareHeader [WINMM.85]
1890 UINT32 WINAPI
midiOutPrepareHeader32(HMIDIOUT32 hMidiOut
,
1891 MIDIHDR
* lpMidiOutHdr
, UINT32 uSize
)
1893 return midiOutPrepareHeader16(hMidiOut
,lpMidiOutHdr
,uSize
);
1896 /**************************************************************************
1897 * midiOutPrepareHeader [MMSYSTEM.206]
1899 UINT16 WINAPI
midiOutPrepareHeader16(HMIDIOUT16 hMidiOut
,
1900 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1902 LPMIDIOPENDESC lpDesc
;
1903 TRACE(mmsys
, "(%04X, %p, %d)\n",
1904 hMidiOut
, lpMidiOutHdr
, uSize
);
1905 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1906 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1907 return modMessage(0, MODM_PREPARE
, lpDesc
->dwInstance
,
1908 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1911 /**************************************************************************
1912 * midiOutUnprepareHeader [WINMM.89]
1914 UINT32 WINAPI
midiOutUnprepareHeader32(HMIDIOUT32 hMidiOut
,
1915 MIDIHDR
* lpMidiOutHdr
, UINT32 uSize
)
1917 return midiOutUnprepareHeader16(hMidiOut
,lpMidiOutHdr
,uSize
);
1919 /**************************************************************************
1920 * midiOutUnprepareHeader [MMSYSTEM.207]
1922 UINT16 WINAPI
midiOutUnprepareHeader16(HMIDIOUT16 hMidiOut
,
1923 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1925 LPMIDIOPENDESC lpDesc
;
1926 TRACE(mmsys
, "(%04X, %p, %d)\n",
1927 hMidiOut
, lpMidiOutHdr
, uSize
);
1928 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1929 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1930 return modMessage(0, MODM_UNPREPARE
, lpDesc
->dwInstance
,
1931 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1934 /**************************************************************************
1935 * midiOutShortMsg [WINMM.88]
1937 UINT32 WINAPI
midiOutShortMsg32(HMIDIOUT32 hMidiOut
, DWORD dwMsg
)
1939 return midiOutShortMsg16(hMidiOut
,dwMsg
);
1941 /**************************************************************************
1942 * midiOutShortMsg [MMSYSTEM.208]
1944 UINT16 WINAPI
midiOutShortMsg16(HMIDIOUT16 hMidiOut
, DWORD dwMsg
)
1946 LPMIDIOPENDESC lpDesc
;
1947 TRACE(mmsys
, "(%04X, %08lX)\n", hMidiOut
, dwMsg
);
1948 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1949 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1950 return modMessage(0, MODM_DATA
, lpDesc
->dwInstance
, dwMsg
, 0L);
1953 /**************************************************************************
1954 * midiOutLongMsg [WINMM.82]
1956 UINT32 WINAPI
midiOutLongMsg32(HMIDIOUT32 hMidiOut
,
1957 MIDIHDR
* lpMidiOutHdr
, UINT32 uSize
)
1959 return midiOutLongMsg16(hMidiOut
,lpMidiOutHdr
,uSize
);
1962 /**************************************************************************
1963 * midiOutLongMsg [MMSYSTEM.209]
1965 UINT16 WINAPI
midiOutLongMsg16(HMIDIOUT16 hMidiOut
,
1966 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1968 LPMIDIOPENDESC lpDesc
;
1969 TRACE(mmsys
, "(%04X, %p, %d)\n",
1970 hMidiOut
, lpMidiOutHdr
, uSize
);
1971 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1972 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1973 return modMessage(0, MODM_LONGDATA
, lpDesc
->dwInstance
,
1974 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1977 /**************************************************************************
1978 * midiOutReset [WINMM.86]
1980 UINT32 WINAPI
midiOutReset32(HMIDIOUT32 hMidiOut
)
1982 return midiOutReset16(hMidiOut
);
1985 /**************************************************************************
1986 * midiOutReset [MMSYSTEM.210]
1988 UINT16 WINAPI
midiOutReset16(HMIDIOUT16 hMidiOut
)
1990 LPMIDIOPENDESC lpDesc
;
1991 TRACE(mmsys
, "(%04X)\n", hMidiOut
);
1992 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1993 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1994 return modMessage(0, MODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1997 /**************************************************************************
1998 * midiOutGetVolume [WINM.81]
2000 UINT32 WINAPI
midiOutGetVolume32(UINT32 uDeviceID
, DWORD
* lpdwVolume
)
2002 return midiOutGetVolume16(uDeviceID
,lpdwVolume
);
2004 /**************************************************************************
2005 * midiOutGetVolume [MMSYSTEM.211]
2007 UINT16 WINAPI
midiOutGetVolume16(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
2009 TRACE(mmsys
, "(%04X, %p);\n", uDeviceID
, lpdwVolume
);
2010 return modMessage(uDeviceID
, MODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
2013 /**************************************************************************
2014 * midiOutSetVolume [WINMM.87]
2016 UINT32 WINAPI
midiOutSetVolume32(UINT32 uDeviceID
, DWORD dwVolume
)
2018 return midiOutSetVolume16(uDeviceID
,dwVolume
);
2021 /**************************************************************************
2022 * midiOutSetVolume [MMSYSTEM.212]
2024 UINT16 WINAPI
midiOutSetVolume16(UINT16 uDeviceID
, DWORD dwVolume
)
2026 TRACE(mmsys
, "(%04X, %08lX);\n", uDeviceID
, dwVolume
);
2027 return modMessage(uDeviceID
, MODM_SETVOLUME
, 0L, dwVolume
, 0L);
2030 /**************************************************************************
2031 * midiOutCachePatches [WINMM.73]
2033 UINT32 WINAPI
midiOutCachePatches32(HMIDIOUT32 hMidiOut
, UINT32 uBank
,
2034 WORD
* lpwPatchArray
, UINT32 uFlags
)
2036 return midiOutCachePatches16(hMidiOut
,uBank
,lpwPatchArray
,uFlags
);
2039 /**************************************************************************
2040 * midiOutCachePatches [MMSYSTEM.213]
2042 UINT16 WINAPI
midiOutCachePatches16(HMIDIOUT16 hMidiOut
, UINT16 uBank
,
2043 WORD
* lpwPatchArray
, UINT16 uFlags
)
2045 /* not really necessary to support this */
2046 fprintf(stdnimp
, "midiOutCachePatches: not supported yet\n");
2047 return MMSYSERR_NOTSUPPORTED
;
2050 /**************************************************************************
2051 * midiOutCacheDrumPatches [WINMM.72]
2053 UINT32 WINAPI
midiOutCacheDrumPatches32(HMIDIOUT32 hMidiOut
, UINT32 uPatch
,
2054 WORD
* lpwKeyArray
, UINT32 uFlags
)
2056 return midiOutCacheDrumPatches16(hMidiOut
,uPatch
,lpwKeyArray
,uFlags
);
2059 /**************************************************************************
2060 * midiOutCacheDrumPatches [MMSYSTEM.214]
2062 UINT16 WINAPI
midiOutCacheDrumPatches16(HMIDIOUT16 hMidiOut
, UINT16 uPatch
,
2063 WORD
* lpwKeyArray
, UINT16 uFlags
)
2065 fprintf(stdnimp
, "midiOutCacheDrumPatchesi: not supported yet\n");
2066 return MMSYSERR_NOTSUPPORTED
;
2069 /**************************************************************************
2070 * midiOutGetID [WINMM.79]
2072 UINT32 WINAPI
midiOutGetID32(HMIDIOUT32 hMidiOut
, UINT32
* lpuDeviceID
)
2077 ret
= midiOutGetID16(hMidiOut
,&xid
);
2082 /**************************************************************************
2083 * midiOutGetID [MMSYSTEM.215]
2085 UINT16 WINAPI
midiOutGetID16(HMIDIOUT16 hMidiOut
, UINT16
* lpuDeviceID
)
2087 TRACE(mmsys
, "midiOutGetID\n");
2091 /**************************************************************************
2092 * midiOutMessage [WINMM.83]
2094 DWORD WINAPI
midiOutMessage32(HMIDIOUT32 hMidiOut
, UINT32 uMessage
,
2095 DWORD dwParam1
, DWORD dwParam2
)
2097 LPMIDIOPENDESC lpDesc
;
2099 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2100 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
2101 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
2102 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2105 fprintf(stderr
,"midiOutMessage32: can't handle MODM_OPEN!\n");
2107 case MODM_GETDEVCAPS
:
2108 return midiOutGetDevCaps32A(hMidiOut
,(LPMIDIOUTCAPS32A
)dwParam1
,dwParam2
);
2109 case MODM_GETNUMDEVS
:
2112 case MODM_GETVOLUME
:
2113 case MODM_SETVOLUME
:
2116 case MODM_UNPREPARE
:
2117 /* no argument conversion needed */
2120 fprintf(stderr
,"unhandled midiOutMessage32(%04x,%04x,%08lx,%08lx)\n",
2121 hMidiOut
,uMessage
,dwParam1
,dwParam2
2125 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2128 /**************************************************************************
2129 * midiOutMessage [MMSYSTEM.216]
2131 DWORD WINAPI
midiOutMessage16(HMIDIOUT16 hMidiOut
, UINT16 uMessage
,
2132 DWORD dwParam1
, DWORD dwParam2
)
2134 LPMIDIOPENDESC lpDesc
;
2136 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2137 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
2138 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
2139 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2142 fprintf(stderr
,"midiOutMessage16: can't handle MODM_OPEN!\n");
2144 case MODM_GETNUMDEVS
:
2147 case MODM_SETVOLUME
:
2148 /* no argument conversion needed */
2150 case MODM_GETVOLUME
:
2151 return midiOutGetVolume16(hMidiOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
2153 return midiOutLongMsg16(hMidiOut
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2155 return midiOutPrepareHeader16(hMidiOut
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2156 case MODM_UNPREPARE
:
2157 return midiOutUnprepareHeader16(hMidiOut
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2159 fprintf(stderr
,"unhandled midiOutMessage16(%04x,%04x,%08lx,%08lx)\n",
2160 hMidiOut
,uMessage
,dwParam1
,dwParam2
2164 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2167 /**************************************************************************
2168 * midiInGetNumDevs [WINMM.64]
2170 UINT32 WINAPI
midiInGetNumDevs32(void)
2172 return midiInGetNumDevs16();
2175 /**************************************************************************
2176 * midiInGetNumDevs [MMSYSTEM.301]
2178 UINT16 WINAPI
midiInGetNumDevs16(void)
2181 TRACE(mmsys
, "midiInGetNumDevs\n");
2182 count
+= midMessage(0, MIDM_GETNUMDEVS
, 0L, 0L, 0L);
2183 TRACE(mmsys
, "midiInGetNumDevs return %u \n", count
);
2187 /**************************************************************************
2188 * midiInGetDevCaps [WINMM.60]
2190 UINT32 WINAPI
midiInGetDevCaps32W(UINT32 uDeviceID
,
2191 LPMIDIINCAPS32W lpCaps
, UINT32 uSize
)
2194 UINT32 ret
= midiInGetDevCaps16(uDeviceID
,&mic16
,uSize
);
2196 lpCaps
->wMid
= mic16
.wMid
;
2197 lpCaps
->wPid
= mic16
.wPid
;
2198 lpCaps
->vDriverVersion
= mic16
.vDriverVersion
;
2199 lstrcpyAtoW(lpCaps
->szPname
,mic16
.szPname
);
2200 lpCaps
->dwSupport
= mic16
.dwSupport
;
2204 /**************************************************************************
2205 * midiInGetDevCaps [WINMM.59]
2207 UINT32 WINAPI
midiInGetDevCaps32A(UINT32 uDeviceID
,
2208 LPMIDIINCAPS32A lpCaps
, UINT32 uSize
)
2211 UINT32 ret
= midiInGetDevCaps16(uDeviceID
,&mic16
,uSize
);
2213 lpCaps
->wMid
= mic16
.wMid
;
2214 lpCaps
->wPid
= mic16
.wPid
;
2215 lpCaps
->vDriverVersion
= mic16
.vDriverVersion
;
2216 strcpy(lpCaps
->szPname
,mic16
.szPname
);
2217 lpCaps
->dwSupport
= mic16
.dwSupport
;
2221 /**************************************************************************
2222 * midiInGetDevCaps [MMSYSTEM.302]
2224 UINT16 WINAPI
midiInGetDevCaps16(UINT16 uDeviceID
,
2225 LPMIDIINCAPS16 lpCaps
, UINT16 uSize
)
2227 TRACE(mmsys
, "midiInGetDevCaps\n");
2228 return midMessage(uDeviceID
,MIDM_GETDEVCAPS
,0,(DWORD
)lpCaps
,uSize
);;
2231 /**************************************************************************
2232 * midiInGetErrorText [WINMM.62]
2234 UINT32 WINAPI
midiInGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
2236 LPSTR xstr
= HeapAlloc(GetProcessHeap(),0,uSize
);
2237 UINT32 ret
= midiInGetErrorText16(uError
,xstr
,uSize
);
2238 lstrcpyAtoW(lpText
,xstr
);
2239 HeapFree(GetProcessHeap(),0,xstr
);
2242 /**************************************************************************
2243 * midiInGetErrorText [WINMM.61]
2245 UINT32 WINAPI
midiInGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
2247 return midiInGetErrorText16(uError
,lpText
,uSize
);
2250 /**************************************************************************
2251 * midiInGetErrorText [MMSYSTEM.303]
2253 UINT16 WINAPI
midiInGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
2255 TRACE(mmsys
, "midiInGetErrorText\n");
2256 return (midiGetErrorText(uError
, lpText
, uSize
));
2259 /**************************************************************************
2260 * midiInOpen [WINMM.66]
2262 UINT32 WINAPI
midiInOpen32(HMIDIIN32
* lphMidiIn
, UINT32 uDeviceID
,
2263 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
2266 UINT32 ret
= midiInOpen16(&xhmid16
,uDeviceID
,dwCallback
,dwInstance
,dwFlags
);
2267 if (lphMidiIn
) *lphMidiIn
= xhmid16
;
2271 /**************************************************************************
2272 * midiInOpen [MMSYSTEM.304]
2274 UINT16 WINAPI
midiInOpen16(HMIDIIN16
* lphMidiIn
, UINT16 uDeviceID
,
2275 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
2278 LPMIDIOPENDESC lpDesc
;
2280 BOOL32 bMapperFlg
= FALSE
;
2282 if (lphMidiIn
!= NULL
) *lphMidiIn
= 0;
2283 TRACE(mmsys
, "(%p, %d, %08lX, %08lX, %08lX);\n",
2284 lphMidiIn
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
2285 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
2286 TRACE(mmsys
, "MIDI_MAPPER mode requested !\n");
2290 hMidiIn
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
2291 if (lphMidiIn
!= NULL
) *lphMidiIn
= hMidiIn
;
2292 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2293 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
2294 lpDesc
->hMidi
= hMidiIn
;
2295 lpDesc
->dwCallback
= dwCallback
;
2296 lpDesc
->dwInstance
= dwInstance
;
2297 while(uDeviceID
< MAXMIDIDRIVERS
) {
2298 dwRet
= midMessage(uDeviceID
, MIDM_OPEN
,
2299 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
2300 if (dwRet
== MMSYSERR_NOERROR
) break;
2301 if (!bMapperFlg
) break;
2303 TRACE(mmsys
, "MIDI_MAPPER mode ! try next driver...\n");
2308 /**************************************************************************
2309 * midiInClose [WINMM.58]
2311 UINT32 WINAPI
midiInClose32(HMIDIIN32 hMidiIn
)
2313 return midiInClose16(hMidiIn
);
2316 /**************************************************************************
2317 * midiInClose [MMSYSTEM.305]
2319 UINT16 WINAPI
midiInClose16(HMIDIIN16 hMidiIn
)
2321 LPMIDIOPENDESC lpDesc
;
2322 TRACE(mmsys
, "(%04X)\n", hMidiIn
);
2323 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2324 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2325 return midMessage(0, MIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
2328 /**************************************************************************
2329 * midiInPrepareHeader [WINMM.67]
2331 UINT32 WINAPI
midiInPrepareHeader32(HMIDIIN32 hMidiIn
,
2332 MIDIHDR
* lpMidiInHdr
, UINT32 uSize
)
2334 return midiInPrepareHeader16(hMidiIn
,lpMidiInHdr
,uSize
);
2337 /**************************************************************************
2338 * midiInPrepareHeader [MMSYSTEM.306]
2340 UINT16 WINAPI
midiInPrepareHeader16(HMIDIIN16 hMidiIn
,
2341 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
2343 LPMIDIOPENDESC lpDesc
;
2344 TRACE(mmsys
, "(%04X, %p, %d)\n",
2345 hMidiIn
, lpMidiInHdr
, uSize
);
2346 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2347 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2348 return midMessage(0, MIDM_PREPARE
, lpDesc
->dwInstance
,
2349 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
2352 /**************************************************************************
2353 * midiInUnprepareHeader [WINMM.71]
2355 UINT32 WINAPI
midiInUnprepareHeader32(HMIDIIN32 hMidiIn
,
2356 MIDIHDR
* lpMidiInHdr
, UINT32 uSize
)
2358 return midiInUnprepareHeader16(hMidiIn
,lpMidiInHdr
,uSize
);
2361 /**************************************************************************
2362 * midiInUnprepareHeader [MMSYSTEM.307]
2364 UINT16 WINAPI
midiInUnprepareHeader16(HMIDIIN16 hMidiIn
,
2365 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
2367 LPMIDIOPENDESC lpDesc
;
2368 TRACE(mmsys
, "(%04X, %p, %d)\n",
2369 hMidiIn
, lpMidiInHdr
, uSize
);
2370 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2371 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2372 return midMessage(0, MIDM_UNPREPARE
, lpDesc
->dwInstance
,
2373 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
2376 /**************************************************************************
2377 * midiInAddBuffer [WINMM.57]
2379 UINT32 WINAPI
midiInAddBuffer32(HMIDIIN32 hMidiIn
,
2380 MIDIHDR
* lpMidiInHdr
, UINT32 uSize
)
2382 return midiInAddBuffer16(hMidiIn
,lpMidiInHdr
,uSize
);
2385 /**************************************************************************
2386 * midiInAddBuffer [MMSYSTEM.308]
2388 UINT16 WINAPI
midiInAddBuffer16(HMIDIIN16 hMidiIn
,
2389 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
2391 TRACE(mmsys
, "midiInAddBuffer\n");
2395 /**************************************************************************
2396 * midiInStart [WINMM.69]
2398 UINT32 WINAPI
midiInStart32(HMIDIIN32 hMidiIn
)
2400 return midiInStart16(hMidiIn
);
2403 /**************************************************************************
2404 * midiInStart [MMSYSTEM.309]
2406 UINT16 WINAPI
midiInStart16(HMIDIIN16 hMidiIn
)
2408 TRACE(mmsys
, "midiInStart\n");
2412 /**************************************************************************
2413 * midiInStop [WINMM.70]
2415 UINT32 WINAPI
midiInStop32(HMIDIIN32 hMidiIn
)
2417 return midiInStop16(hMidiIn
);
2420 /**************************************************************************
2421 * midiInStop [MMSYSTEM.310]
2423 UINT16 WINAPI
midiInStop16(HMIDIIN16 hMidiIn
)
2425 TRACE(mmsys
, "midiInStop\n");
2429 /**************************************************************************
2430 * midiInReset [WINMM.68]
2432 UINT32 WINAPI
midiInReset32(HMIDIIN32 hMidiIn
)
2434 return midiInReset16(hMidiIn
);
2437 /**************************************************************************
2438 * midiInReset [MMSYSTEM.311]
2440 UINT16 WINAPI
midiInReset16(HMIDIIN16 hMidiIn
)
2442 TRACE(mmsys
, "midiInReset\n");
2446 /**************************************************************************
2447 * midiInGetID [WINMM.63]
2449 UINT32 WINAPI
midiInGetID32(HMIDIIN32 hMidiIn
, UINT32
* lpuDeviceID
)
2451 TRACE(mmsys
, "midiInGetID\n");
2455 /**************************************************************************
2456 * midiInGetID [MMSYSTEM.312]
2458 UINT16 WINAPI
midiInGetID16(HMIDIIN16 hMidiIn
, UINT16
* lpuDeviceID
)
2460 TRACE(mmsys
, "midiInGetID\n");
2464 /**************************************************************************
2465 * midiInMessage [WINMM.65]
2467 DWORD WINAPI
midiInMessage32(HMIDIIN32 hMidiIn
, UINT32 uMessage
,
2468 DWORD dwParam1
, DWORD dwParam2
)
2470 LPMIDIOPENDESC lpDesc
;
2471 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2472 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
2473 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2474 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2477 fprintf(stderr
,"midiInMessage32: can't handle MIDM_OPEN!\n");
2479 case MIDM_GETDEVCAPS
:
2480 return midiInGetDevCaps32A(hMidiIn
,(LPMIDIINCAPS32A
)dwParam1
,dwParam2
);
2481 case MIDM_GETNUMDEVS
:
2486 /* no argument conversion needed */
2489 return midiInPrepareHeader32(hMidiIn
,(LPMIDIHDR
)dwParam1
,dwParam2
);
2490 case MIDM_UNPREPARE
:
2491 return midiInUnprepareHeader32(hMidiIn
,(LPMIDIHDR
)dwParam1
,dwParam2
);
2492 case MIDM_ADDBUFFER
:
2493 return midiInAddBuffer32(hMidiIn
,(LPMIDIHDR
)dwParam1
,dwParam2
);
2495 fprintf(stderr
,"unhandled midiInMessage32(%04x,%04x,%08lx,%08lx)\n",
2496 hMidiIn
,uMessage
,dwParam1
,dwParam2
2500 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2503 /**************************************************************************
2504 * midiInMessage [MMSYSTEM.313]
2506 DWORD WINAPI
midiInMessage16(HMIDIIN16 hMidiIn
, UINT16 uMessage
,
2507 DWORD dwParam1
, DWORD dwParam2
)
2509 LPMIDIOPENDESC lpDesc
;
2510 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2511 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
2512 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2513 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2516 fprintf(stderr
,"midiInMessage16: can't handle MIDM_OPEN!\n");
2518 case MIDM_GETDEVCAPS
:
2519 return midiInGetDevCaps16(hMidiIn
,(LPMIDIINCAPS16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2520 case MIDM_GETNUMDEVS
:
2525 /* no argument conversion needed */
2528 return midiInPrepareHeader16(hMidiIn
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2529 case MIDM_UNPREPARE
:
2530 return midiInUnprepareHeader16(hMidiIn
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2531 case MIDM_ADDBUFFER
:
2532 return midiInAddBuffer16(hMidiIn
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2534 fprintf(stderr
,"unhandled midiInMessage16(%04x,%04x,%08lx,%08lx)\n",
2535 hMidiIn
,uMessage
,dwParam1
,dwParam2
2539 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2543 /**************************************************************************
2544 * waveOutGetNumDevs [MMSYSTEM.401]
2546 UINT32 WINAPI
waveOutGetNumDevs32() {
2547 return waveOutGetNumDevs16();
2550 /**************************************************************************
2551 * waveOutGetNumDevs [WINMM.167]
2553 UINT16 WINAPI
waveOutGetNumDevs16()
2556 TRACE(mmsys
, "waveOutGetNumDevs\n");
2557 count
+= wodMessage( MMSYSTEM_FirstDevID(), WODM_GETNUMDEVS
, 0L, 0L, 0L);
2558 TRACE(mmsys
, "waveOutGetNumDevs return %u \n", count
);
2562 /**************************************************************************
2563 * waveOutGetDevCaps [MMSYSTEM.402]
2565 UINT16 WINAPI
waveOutGetDevCaps16(UINT16 uDeviceID
, WAVEOUTCAPS16
* lpCaps
,
2568 if (uDeviceID
> waveOutGetNumDevs16() - 1) return MMSYSERR_BADDEVICEID
;
2569 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) return MMSYSERR_BADDEVICEID
; /* FIXME: do we have a wave mapper ? */
2570 TRACE(mmsys
, "waveOutGetDevCaps\n");
2571 return wodMessage(uDeviceID
, WODM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
2574 /**************************************************************************
2575 * waveOutGetDevCapsA [WINMM.162]
2577 UINT32 WINAPI
waveOutGetDevCaps32A(UINT32 uDeviceID
, LPWAVEOUTCAPS32A lpCaps
,
2580 WAVEOUTCAPS16 woc16
;
2581 UINT16 ret
= waveOutGetDevCaps16(uDeviceID
,&woc16
,sizeof(woc16
));
2583 lpCaps
->wMid
= woc16
.wMid
;
2584 lpCaps
->wPid
= woc16
.wPid
;
2585 lpCaps
->vDriverVersion
= woc16
.vDriverVersion
;
2586 strcpy(lpCaps
->szPname
,woc16
.szPname
);
2587 lpCaps
->dwFormats
= woc16
.dwFormats
;
2588 lpCaps
->wChannels
= woc16
.wChannels
;
2589 lpCaps
->dwSupport
= woc16
.dwSupport
;
2593 /**************************************************************************
2594 * waveOutGetDevCapsW [WINMM.163]
2596 UINT32 WINAPI
waveOutGetDevCaps32W(UINT32 uDeviceID
, LPWAVEOUTCAPS32W lpCaps
,
2599 WAVEOUTCAPS16 woc16
;
2600 UINT32 ret
= waveOutGetDevCaps16(uDeviceID
,&woc16
,sizeof(woc16
));
2602 lpCaps
->wMid
= woc16
.wMid
;
2603 lpCaps
->wPid
= woc16
.wPid
;
2604 lpCaps
->vDriverVersion
= woc16
.vDriverVersion
;
2605 lstrcpyAtoW(lpCaps
->szPname
,woc16
.szPname
);
2606 lpCaps
->dwFormats
= woc16
.dwFormats
;
2607 lpCaps
->wChannels
= woc16
.wChannels
;
2608 lpCaps
->dwSupport
= woc16
.dwSupport
;
2612 /**************************************************************************
2613 * waveOutGetErrorText [MMSYSTEM.403]
2615 UINT16 WINAPI
waveOutGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
2617 TRACE(mmsys
, "waveOutGetErrorText\n");
2618 return(waveGetErrorText(uError
, lpText
, uSize
));
2621 /**************************************************************************
2622 * waveOutGetErrorTextA [WINMM.164]
2624 UINT32 WINAPI
waveOutGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
2626 return(waveOutGetErrorText16(uError
, lpText
, uSize
));
2629 /**************************************************************************
2630 * waveOutGetErrorTextW [WINMM.165]
2632 UINT32 WINAPI
waveOutGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
2634 LPSTR xstr
= HeapAlloc(GetProcessHeap(),0,uSize
);
2635 UINT32 ret
= waveOutGetErrorText32A(uError
, xstr
, uSize
);
2637 lstrcpyAtoW(lpText
,xstr
);
2638 HeapFree(GetProcessHeap(),0,xstr
);
2643 /**************************************************************************
2644 * waveGetErrorText [internal]
2646 static UINT16
waveGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
2649 TRACE(mmsys
, "(%04X, %p, %d);\n",
2650 uError
, lpText
, uSize
);
2651 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
2654 case MMSYSERR_NOERROR
:
2655 msgptr
= "The specified command was carried out.";
2657 case MMSYSERR_ERROR
:
2658 msgptr
= "Undefined external error.";
2660 case MMSYSERR_BADDEVICEID
:
2661 msgptr
= "A device ID has been used that is out of range for your system.";
2663 case MMSYSERR_NOTENABLED
:
2664 msgptr
= "The driver was not enabled.";
2666 case MMSYSERR_ALLOCATED
:
2667 msgptr
= "The specified device is already in use. Wait until it is free, and then try again.";
2669 case MMSYSERR_INVALHANDLE
:
2670 msgptr
= "The specified device handle is invalid.";
2672 case MMSYSERR_NODRIVER
:
2673 msgptr
= "There is no driver installed on your system !\n";
2675 case MMSYSERR_NOMEM
:
2676 msgptr
= "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
2678 case MMSYSERR_NOTSUPPORTED
:
2679 msgptr
= "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
2681 case MMSYSERR_BADERRNUM
:
2682 msgptr
= "An error number was specified that is not defined in the system.";
2684 case MMSYSERR_INVALFLAG
:
2685 msgptr
= "An invalid flag was passed to a system function.";
2687 case MMSYSERR_INVALPARAM
:
2688 msgptr
= "An invalid parameter was passed to a system function.";
2690 case WAVERR_BADFORMAT
:
2691 msgptr
= "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
2693 case WAVERR_STILLPLAYING
:
2694 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
2696 case WAVERR_UNPREPARED
:
2697 msgptr
= "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
2700 msgptr
= "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
2703 msgptr
= "Unknown MMSYSTEM Error !\n";
2706 lstrcpyn32A(lpText
, msgptr
, uSize
);
2710 /**************************************************************************
2711 * waveOutOpen [WINMM.173]
2712 * All the args/structs have the same layout as the win16 equivalents
2714 UINT32 WINAPI
waveOutOpen32(HWAVEOUT32
* lphWaveOut
, UINT32 uDeviceID
,
2715 const LPWAVEFORMATEX lpFormat
, DWORD dwCallback
,
2716 DWORD dwInstance
, DWORD dwFlags
)
2719 UINT32 ret
=waveOutOpen16(&hwo16
,uDeviceID
,lpFormat
,dwCallback
,dwInstance
,dwFlags
);
2720 if (lphWaveOut
) *lphWaveOut
=hwo16
;
2723 /**************************************************************************
2724 * waveOutOpen [MMSYSTEM.404]
2726 UINT16 WINAPI
waveOutOpen16(HWAVEOUT16
* lphWaveOut
, UINT16 uDeviceID
,
2727 const LPWAVEFORMATEX lpFormat
, DWORD dwCallback
,
2728 DWORD dwInstance
, DWORD dwFlags
)
2730 HWAVEOUT16 hWaveOut
;
2731 LPWAVEOPENDESC lpDesc
;
2733 BOOL32 bMapperFlg
= FALSE
;
2735 TRACE(mmsys
, "(%p, %d, %p, %08lX, %08lX, %08lX);\n",
2736 lphWaveOut
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
2737 if (dwFlags
& WAVE_FORMAT_QUERY
)
2738 TRACE(mmsys
, "WAVE_FORMAT_QUERY requested !\n");
2739 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
2740 TRACE(mmsys
, "WAVE_MAPPER mode requested !\n");
2744 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
2746 hWaveOut
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
2747 if (lphWaveOut
!= NULL
) *lphWaveOut
= hWaveOut
;
2748 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2749 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
2750 lpDesc
->hWave
= hWaveOut
;
2751 lpDesc
->lpFormat
= (LPWAVEFORMAT
)lpFormat
; /* should the struct be copied iso pointer? */
2752 lpDesc
->dwCallBack
= dwCallback
;
2753 lpDesc
->dwInstance
= dwInstance
;
2754 if (uDeviceID
>= MAXWAVEDRIVERS
)
2756 while(uDeviceID
< MAXWAVEDRIVERS
) {
2757 dwRet
= wodMessage(uDeviceID
, WODM_OPEN
,
2758 lpDesc
->dwInstance
, (DWORD
)lpDesc
, dwFlags
);
2759 if (dwRet
== MMSYSERR_NOERROR
) break;
2760 if (!bMapperFlg
) break;
2762 TRACE(mmsys
, "WAVE_MAPPER mode ! try next driver...\n");
2764 lpDesc
->uDeviceID
= uDeviceID
; /* save physical Device ID */
2765 if (dwFlags
& WAVE_FORMAT_QUERY
) {
2766 TRACE(mmsys
, "End of WAVE_FORMAT_QUERY !\n");
2767 dwRet
= waveOutClose32(hWaveOut
);
2772 /**************************************************************************
2773 * waveOutClose [WINMM.161]
2775 UINT32 WINAPI
waveOutClose32(HWAVEOUT32 hWaveOut
)
2777 return waveOutClose16(hWaveOut
);
2779 /**************************************************************************
2780 * waveOutClose [MMSYSTEM.405]
2782 UINT16 WINAPI
waveOutClose16(HWAVEOUT16 hWaveOut
)
2784 LPWAVEOPENDESC lpDesc
;
2786 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2787 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2788 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2789 return wodMessage( lpDesc
->uDeviceID
, WODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
2792 /**************************************************************************
2793 * waveOutPrepareHeader [WINMM.175]
2795 UINT32 WINAPI
waveOutPrepareHeader32(HWAVEOUT32 hWaveOut
,
2796 WAVEHDR
* lpWaveOutHdr
, UINT32 uSize
)
2798 LPWAVEOPENDESC lpDesc
;
2800 TRACE(mmsys
, "(%04X, %p, %u);\n",
2801 hWaveOut
, lpWaveOutHdr
, uSize
);
2802 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2803 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2804 return wodMessage( lpDesc
->uDeviceID
, WODM_PREPARE
, lpDesc
->dwInstance
,
2805 (DWORD
)lpWaveOutHdr
,uSize
);
2807 /**************************************************************************
2808 * waveOutPrepareHeader [MMSYSTEM.406]
2810 UINT16 WINAPI
waveOutPrepareHeader16(HWAVEOUT16 hWaveOut
,
2811 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
2813 LPWAVEOPENDESC lpDesc
;
2814 LPBYTE saveddata
= lpWaveOutHdr
->lpData
;
2817 TRACE(mmsys
, "(%04X, %p, %u);\n",
2818 hWaveOut
, lpWaveOutHdr
, uSize
);
2819 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2820 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2821 lpWaveOutHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveOutHdr
->lpData
);
2822 ret
= wodMessage( lpDesc
->uDeviceID
, WODM_PREPARE
, lpDesc
->dwInstance
,
2823 (DWORD
)lpWaveOutHdr
,uSize
);
2824 lpWaveOutHdr
->lpData
= saveddata
;
2828 /**************************************************************************
2829 * waveOutUnprepareHeader [WINMM.181]
2831 UINT32 WINAPI
waveOutUnprepareHeader32(HWAVEOUT32 hWaveOut
,
2832 WAVEHDR
* lpWaveOutHdr
, UINT32 uSize
)
2834 LPWAVEOPENDESC lpDesc
;
2836 TRACE(mmsys
, "(%04X, %p, %u);\n",
2837 hWaveOut
, lpWaveOutHdr
, uSize
);
2838 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2839 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2840 return wodMessage(lpDesc
->uDeviceID
,WODM_UNPREPARE
,lpDesc
->dwInstance
,
2841 (DWORD
)lpWaveOutHdr
, uSize
);
2843 /**************************************************************************
2844 * waveOutUnprepareHeader [MMSYSTEM.407]
2846 UINT16 WINAPI
waveOutUnprepareHeader16(HWAVEOUT16 hWaveOut
,
2847 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
2849 LPWAVEOPENDESC lpDesc
;
2850 LPBYTE saveddata
= lpWaveOutHdr
->lpData
;
2853 TRACE(mmsys
, "(%04X, %p, %u);\n",
2854 hWaveOut
, lpWaveOutHdr
, uSize
);
2855 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2856 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2857 lpWaveOutHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveOutHdr
->lpData
);
2858 ret
= wodMessage(lpDesc
->uDeviceID
,WODM_UNPREPARE
,lpDesc
->dwInstance
,
2859 (DWORD
)lpWaveOutHdr
, uSize
);
2860 lpWaveOutHdr
->lpData
= saveddata
;
2864 /**************************************************************************
2865 * waveOutWrite [MMSYSTEM.408]
2867 UINT32 WINAPI
waveOutWrite32(HWAVEOUT32 hWaveOut
, WAVEHDR
* lpWaveOutHdr
,
2870 LPWAVEOPENDESC lpDesc
;
2871 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
2872 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2873 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2874 lpWaveOutHdr
->reserved
= (DWORD
)lpWaveOutHdr
->lpData
;
2875 return wodMessage( lpDesc
->uDeviceID
, WODM_WRITE
, lpDesc
->dwInstance
, (DWORD
)lpWaveOutHdr
, uSize
);
2877 /**************************************************************************
2878 * waveOutWrite [MMSYSTEM.408]
2880 UINT16 WINAPI
waveOutWrite16(HWAVEOUT16 hWaveOut
, WAVEHDR
* lpWaveOutHdr
,
2883 LPWAVEOPENDESC lpDesc
;
2886 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
2887 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2888 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2889 lpWaveOutHdr
->reserved
=(DWORD
)lpWaveOutHdr
->lpData
;/*save original ptr*/
2890 lpWaveOutHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveOutHdr
->lpData
);
2891 ret
= wodMessage( lpDesc
->uDeviceID
, WODM_WRITE
, lpDesc
->dwInstance
, (DWORD
)lpWaveOutHdr
, uSize
);
2892 lpWaveOutHdr
->lpData
= (LPBYTE
)lpWaveOutHdr
->reserved
;
2896 /**************************************************************************
2897 * waveOutPause [WINMM.174]
2899 UINT32 WINAPI
waveOutPause32(HWAVEOUT32 hWaveOut
)
2901 return waveOutPause16(hWaveOut
);
2904 /**************************************************************************
2905 * waveOutPause [MMSYSTEM.409]
2907 UINT16 WINAPI
waveOutPause16(HWAVEOUT16 hWaveOut
)
2909 LPWAVEOPENDESC lpDesc
;
2911 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2912 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2913 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2914 return wodMessage( lpDesc
->uDeviceID
, WODM_PAUSE
, lpDesc
->dwInstance
, 0L, 0L);
2917 /**************************************************************************
2918 * waveOutRestart [WINMM.177]
2920 UINT32 WINAPI
waveOutRestart32(HWAVEOUT32 hWaveOut
)
2922 return waveOutRestart16(hWaveOut
);
2924 /**************************************************************************
2925 * waveOutRestart [MMSYSTEM.410]
2927 UINT16 WINAPI
waveOutRestart16(HWAVEOUT16 hWaveOut
)
2929 LPWAVEOPENDESC lpDesc
;
2931 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2932 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2933 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2934 return wodMessage( lpDesc
->uDeviceID
, WODM_RESTART
, lpDesc
->dwInstance
, 0L, 0L);
2937 /**************************************************************************
2938 * waveOutReset [WINMM.176]
2940 UINT32 WINAPI
waveOutReset32(HWAVEOUT32 hWaveOut
)
2942 return waveOutReset16(hWaveOut
);
2945 /**************************************************************************
2946 * waveOutReset [MMSYSTEM.411]
2948 UINT16 WINAPI
waveOutReset16(HWAVEOUT16 hWaveOut
)
2950 LPWAVEOPENDESC lpDesc
;
2951 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2952 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2953 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2954 return wodMessage( lpDesc
->uDeviceID
, WODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
2957 /**************************************************************************
2958 * waveOutGetPosition [WINMM.170]
2960 UINT32 WINAPI
waveOutGetPosition32(HWAVEOUT32 hWaveOut
, LPMMTIME32 lpTime
,
2966 mmt16
.wType
= lpTime
->wType
;
2967 ret
= waveOutGetPosition16(hWaveOut
,&mmt16
,sizeof(mmt16
));
2968 MMSYSTEM_MMTIME16to32(lpTime
,&mmt16
);
2971 /**************************************************************************
2972 * waveOutGetPosition [MMSYSTEM.412]
2974 UINT16 WINAPI
waveOutGetPosition16(HWAVEOUT16 hWaveOut
,LPMMTIME16 lpTime
,
2977 LPWAVEOPENDESC lpDesc
;
2978 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveOut
, lpTime
, uSize
);
2979 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2980 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2981 return wodMessage( lpDesc
->uDeviceID
, WODM_GETPOS
, lpDesc
->dwInstance
,
2982 (DWORD
)lpTime
, (DWORD
)uSize
);
2985 #define WAVEOUT_SHORTCUT_1(xx,XX,atype) \
2986 UINT32 WINAPI waveOut##xx##32(HWAVEOUT32 hWaveOut, atype x) \
2988 return waveOut##xx##16(hWaveOut,x); \
2990 UINT16 WINAPI waveOut##xx##16(HWAVEOUT16 hWaveOut, atype x) \
2992 LPWAVEOPENDESC lpDesc; \
2993 TRACE(mmsys, "waveOut"#xx"(%04X, %08lx);\n", hWaveOut,(DWORD)x);\
2994 lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); \
2995 if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; \
2996 return wodMessage(lpDesc->uDeviceID, WODM_##XX, lpDesc->dwInstance,\
3000 WAVEOUT_SHORTCUT_1(GetPitch
,GETPITCH
,DWORD
*)
3001 WAVEOUT_SHORTCUT_1(SetPitch
,SETPITCH
,DWORD
)
3002 WAVEOUT_SHORTCUT_1(GetPlaybackRate
,GETPLAYBACKRATE
,DWORD
*)
3003 WAVEOUT_SHORTCUT_1(SetPlaybackRate
,SETPLAYBACKRATE
,DWORD
)
3005 #define WAVEOUT_SHORTCUT_2(xx,XX,atype) \
3006 UINT32 WINAPI waveOut##xx##32(UINT32 devid, atype x) \
3008 return waveOut##xx##16(devid,x); \
3010 UINT16 WINAPI waveOut##xx##16(UINT16 devid, atype x) \
3012 TRACE(mmsys, "waveOut"#xx"(%04X, %08lx);\n", devid,(DWORD)x); \
3013 return wodMessage(devid, WODM_##XX, 0L, (DWORD)x, 0L); \
3017 WAVEOUT_SHORTCUT_2(GetVolume
,GETVOLUME
,DWORD
*)
3018 WAVEOUT_SHORTCUT_2(SetVolume
,SETVOLUME
,DWORD
)
3021 /**************************************************************************
3022 * waveOutBreakLoop [MMSYSTEM.419]
3024 UINT32 WINAPI
waveOutBreakLoop32(HWAVEOUT32 hWaveOut
)
3026 return waveOutBreakLoop16(hWaveOut
);
3028 /**************************************************************************
3029 * waveOutBreakLoop [MMSYSTEM.419]
3031 UINT16 WINAPI
waveOutBreakLoop16(HWAVEOUT16 hWaveOut
)
3033 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
3034 return MMSYSERR_INVALHANDLE
;
3037 /**************************************************************************
3038 * waveOutGetID [MMSYSTEM.420]
3040 UINT32 WINAPI
waveOutGetID32(HWAVEOUT32 hWaveOut
, UINT32
* lpuDeviceID
)
3042 LPWAVEOPENDESC lpDesc
;
3043 TRACE(mmsys
, "(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
3044 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3045 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3046 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3047 *lpuDeviceID
= lpDesc
->uDeviceID
;
3050 /**************************************************************************
3051 * waveOutGetID [MMSYSTEM.420]
3053 UINT16 WINAPI
waveOutGetID16(HWAVEOUT16 hWaveOut
, UINT16
* lpuDeviceID
)
3055 LPWAVEOPENDESC lpDesc
;
3056 TRACE(mmsys
, "(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
3057 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3058 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3059 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3060 *lpuDeviceID
= lpDesc
->uDeviceID
;
3064 /**************************************************************************
3065 * waveOutMessage [MMSYSTEM.421]
3067 DWORD WINAPI
waveOutMessage32(HWAVEOUT32 hWaveOut
, UINT32 uMessage
,
3068 DWORD dwParam1
, DWORD dwParam2
)
3070 LPWAVEOPENDESC lpDesc
;
3072 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3073 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3075 case WODM_GETNUMDEVS
:
3077 case WODM_GETVOLUME
:
3079 case WODM_GETPLAYBACKRATE
:
3080 case WODM_SETVOLUME
:
3082 case WODM_SETPLAYBACKRATE
:
3086 case WODM_UNPREPARE
:
3089 /* no argument conversion needed */
3092 return waveOutWrite32(hWaveOut
,(LPWAVEHDR
)dwParam1
,dwParam2
);
3093 case WODM_GETDEVCAPS
:
3094 /* FIXME: UNICODE/ANSI? */
3095 return waveOutGetDevCaps32A(hWaveOut
,(LPWAVEOUTCAPS32A
)dwParam1
,dwParam2
);
3097 fprintf(stderr
,"waveOutMessage32 can't handle WODM_OPEN, please report.\n");
3100 fprintf(stderr
,"unhandled waveOutMessage32(0x%04x,0x%04x,%08lx,%08lx)\n",
3101 hWaveOut
,uMessage
,dwParam1
,dwParam2
3105 return wodMessage( lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3108 /**************************************************************************
3109 * waveOutMessage [MMSYSTEM.421]
3111 DWORD WINAPI
waveOutMessage16(HWAVEOUT16 hWaveOut
, UINT16 uMessage
,
3112 DWORD dwParam1
, DWORD dwParam2
)
3114 LPWAVEOPENDESC lpDesc
;
3116 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3117 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3119 case WODM_GETNUMDEVS
:
3120 case WODM_SETVOLUME
:
3122 case WODM_SETPLAYBACKRATE
:
3127 /* no argument conversion needed */
3130 return waveOutGetPosition16(hWaveOut
,(LPMMTIME16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3131 case WODM_GETVOLUME
:
3132 return waveOutGetVolume16(hWaveOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
3134 return waveOutGetPitch16(hWaveOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
3135 case WODM_GETPLAYBACKRATE
:
3136 return waveOutGetPlaybackRate16(hWaveOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
3137 case WODM_GETDEVCAPS
:
3138 return waveOutGetDevCaps16(hWaveOut
,(LPWAVEOUTCAPS16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3140 return waveOutPrepareHeader16(hWaveOut
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3141 case WODM_UNPREPARE
:
3142 return waveOutUnprepareHeader16(hWaveOut
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3144 return waveOutWrite16(hWaveOut
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3146 fprintf(stderr
,"waveOutMessage16 can't handle WODM_OPEN, please report.\n");
3149 fprintf(stderr
,"unhandled waveOutMessage16(0x%04x,0x%04x,%08lx,%08lx)\n",
3150 hWaveOut
,uMessage
,dwParam1
,dwParam2
3153 return wodMessage( lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3156 /**************************************************************************
3157 * waveInGetNumDevs [WINMM.151]
3159 UINT32 WINAPI
waveInGetNumDevs32()
3161 return waveInGetNumDevs16();
3164 /**************************************************************************
3165 * waveInGetNumDevs [MMSYSTEM.501]
3167 UINT16 WINAPI
waveInGetNumDevs16()
3170 TRACE(mmsys
, "waveInGetNumDevs\n");
3171 count
+= widMessage(0, WIDM_GETNUMDEVS
, 0L, 0L, 0L);
3172 TRACE(mmsys
, "waveInGetNumDevs return %u \n", count
);
3176 /**************************************************************************
3177 * waveInGetDevCapsA [WINMM.147]
3179 UINT32 WINAPI
waveInGetDevCaps32W(UINT32 uDeviceID
, LPWAVEINCAPS32W lpCaps
, UINT32 uSize
)
3182 UINT32 ret
= waveInGetDevCaps16(uDeviceID
,&wic16
,uSize
);
3184 lpCaps
->wMid
= wic16
.wMid
;
3185 lpCaps
->wPid
= wic16
.wPid
;
3186 lpCaps
->vDriverVersion
= wic16
.vDriverVersion
;
3187 lstrcpyAtoW(lpCaps
->szPname
,wic16
.szPname
);
3188 lpCaps
->dwFormats
= wic16
.dwFormats
;
3189 lpCaps
->wChannels
= wic16
.wChannels
;
3193 /**************************************************************************
3194 * waveInGetDevCapsA [WINMM.146]
3196 UINT32 WINAPI
waveInGetDevCaps32A(UINT32 uDeviceID
, LPWAVEINCAPS32A lpCaps
, UINT32 uSize
)
3199 UINT32 ret
= waveInGetDevCaps16(uDeviceID
,&wic16
,uSize
);
3201 lpCaps
->wMid
= wic16
.wMid
;
3202 lpCaps
->wPid
= wic16
.wPid
;
3203 lpCaps
->vDriverVersion
= wic16
.vDriverVersion
;
3204 strcpy(lpCaps
->szPname
,wic16
.szPname
);
3205 lpCaps
->dwFormats
= wic16
.dwFormats
;
3206 lpCaps
->wChannels
= wic16
.wChannels
;
3209 /**************************************************************************
3210 * waveInGetDevCaps [MMSYSTEM.502]
3212 UINT16 WINAPI
waveInGetDevCaps16(UINT16 uDeviceID
, LPWAVEINCAPS16 lpCaps
, UINT16 uSize
)
3214 TRACE(mmsys
, "waveInGetDevCaps\n");
3215 return widMessage(uDeviceID
, WIDM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
3218 /**************************************************************************
3219 * waveInGetErrorTextA [WINMM.148]
3221 UINT32 WINAPI
waveInGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
3223 TRACE(mmsys
, "waveInGetErrorText\n");
3224 return(waveGetErrorText(uError
, lpText
, uSize
));
3227 /**************************************************************************
3228 * waveInGetErrorTextW [WINMM.149]
3230 UINT32 WINAPI
waveInGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
3232 LPSTR txt
= HeapAlloc(GetProcessHeap(),0,uSize
);
3233 UINT32 ret
= waveGetErrorText(uError
, txt
, uSize
);
3235 lstrcpyAtoW(lpText
,txt
);
3236 HeapFree(GetProcessHeap(),0,txt
);
3240 /**************************************************************************
3241 * waveInGetErrorText [MMSYSTEM.503]
3243 UINT16 WINAPI
waveInGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
3245 TRACE(mmsys
, "waveInGetErrorText\n");
3246 return(waveGetErrorText(uError
, lpText
, uSize
));
3250 /**************************************************************************
3251 * waveInOpen [WINMM.154]
3253 UINT32 WINAPI
waveInOpen32(HWAVEIN32
* lphWaveIn
, UINT32 uDeviceID
,
3254 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
,
3255 DWORD dwInstance
, DWORD dwFlags
)
3258 UINT32 ret
=waveInOpen16(&hwin16
,uDeviceID
,lpFormat
,dwCallback
,dwInstance
,dwFlags
);
3259 if (lphWaveIn
) *lphWaveIn
= hwin16
;
3263 /**************************************************************************
3264 * waveInOpen [MMSYSTEM.504]
3266 UINT16 WINAPI
waveInOpen16(HWAVEIN16
* lphWaveIn
, UINT16 uDeviceID
,
3267 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
,
3268 DWORD dwInstance
, DWORD dwFlags
)
3271 LPWAVEOPENDESC lpDesc
;
3273 BOOL32 bMapperFlg
= FALSE
;
3274 TRACE(mmsys
, "(%p, %d, %p, %08lX, %08lX, %08lX);\n",
3275 lphWaveIn
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
3276 if (dwFlags
& WAVE_FORMAT_QUERY
)
3277 TRACE(mmsys
, "WAVE_FORMAT_QUERY requested !\n");
3278 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
3279 TRACE(mmsys
, "WAVE_MAPPER mode requested !\n");
3283 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
3284 hWaveIn
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
3285 if (lphWaveIn
!= NULL
) *lphWaveIn
= hWaveIn
;
3286 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3287 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
3288 lpDesc
->hWave
= hWaveIn
;
3289 lpDesc
->lpFormat
= lpFormat
;
3290 lpDesc
->dwCallBack
= dwCallback
;
3291 lpDesc
->dwInstance
= dwInstance
;
3292 while(uDeviceID
< MAXWAVEDRIVERS
) {
3293 dwRet
= widMessage(uDeviceID
, WIDM_OPEN
,
3294 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
3295 if (dwRet
== MMSYSERR_NOERROR
) break;
3296 if (!bMapperFlg
) break;
3298 TRACE(mmsys
, "WAVE_MAPPER mode ! try next driver...\n");
3300 lpDesc
->uDeviceID
= uDeviceID
;
3301 if (dwFlags
& WAVE_FORMAT_QUERY
) {
3302 TRACE(mmsys
, "End of WAVE_FORMAT_QUERY !\n");
3303 dwRet
= waveInClose16(hWaveIn
);
3308 /**************************************************************************
3309 * waveInClose [WINMM.145]
3311 UINT32 WINAPI
waveInClose32(HWAVEIN32 hWaveIn
)
3313 return waveInClose16(hWaveIn
);
3315 /**************************************************************************
3316 * waveInClose [MMSYSTEM.505]
3318 UINT16 WINAPI
waveInClose16(HWAVEIN16 hWaveIn
)
3320 LPWAVEOPENDESC lpDesc
;
3322 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3323 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3324 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3325 return widMessage(lpDesc
->uDeviceID
, WIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
3328 /**************************************************************************
3329 * waveInPrepareHeader [WINMM.155]
3331 UINT32 WINAPI
waveInPrepareHeader32(HWAVEIN32 hWaveIn
,
3332 WAVEHDR
* lpWaveInHdr
, UINT32 uSize
)
3334 LPWAVEOPENDESC lpDesc
;
3336 TRACE(mmsys
, "(%04X, %p, %u);\n",
3337 hWaveIn
, lpWaveInHdr
, uSize
);
3338 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3339 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3340 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3341 lpWaveInHdr
= lpWaveInHdr
;
3342 lpWaveInHdr
->lpNext
= NULL
;
3343 lpWaveInHdr
->dwBytesRecorded
= 0;
3344 TRACE(mmsys
, "lpData=%p size=%lu \n",
3345 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3346 return widMessage(lpDesc
->uDeviceID
,WIDM_PREPARE
,lpDesc
->dwInstance
,
3347 (DWORD
)lpWaveInHdr
, uSize
);
3349 /**************************************************************************
3350 * waveInPrepareHeader [MMSYSTEM.506]
3352 UINT16 WINAPI
waveInPrepareHeader16(HWAVEIN16 hWaveIn
,
3353 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
3355 LPWAVEOPENDESC lpDesc
;
3356 LPBYTE saveddata
= lpWaveInHdr
->lpData
;
3359 TRACE(mmsys
, "(%04X, %p, %u);\n",
3360 hWaveIn
, lpWaveInHdr
, uSize
);
3361 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3362 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3363 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3364 lpWaveInHdr
= lpWaveInHdr
;
3365 lpWaveInHdr
->lpNext
= NULL
;
3366 lpWaveInHdr
->dwBytesRecorded
= 0;
3368 TRACE(mmsys
, "lpData=%p size=%lu \n",
3369 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3370 lpWaveInHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveInHdr
->lpData
);
3371 ret
= widMessage(lpDesc
->uDeviceID
,WIDM_PREPARE
,lpDesc
->dwInstance
,
3372 (DWORD
)lpWaveInHdr
,uSize
);
3373 lpWaveInHdr
->lpData
= saveddata
;
3378 /**************************************************************************
3379 * waveInUnprepareHeader [WINMM.159]
3381 UINT32 WINAPI
waveInUnprepareHeader32(HWAVEIN32 hWaveIn
,
3382 WAVEHDR
* lpWaveInHdr
, UINT32 uSize
)
3384 LPWAVEOPENDESC lpDesc
;
3386 TRACE(mmsys
, "(%04X, %p, %u);\n",
3387 hWaveIn
, lpWaveInHdr
, uSize
);
3388 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3389 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3390 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3391 /*USER_HEAP_FREE(HIWORD((DWORD)lpWaveInHdr->lpData)); FIXME */
3392 lpWaveInHdr
->lpData
= NULL
;
3393 lpWaveInHdr
->lpNext
= NULL
;
3394 return widMessage(lpDesc
->uDeviceID
,WIDM_UNPREPARE
,lpDesc
->dwInstance
,
3395 (DWORD
)lpWaveInHdr
, uSize
);
3397 /**************************************************************************
3398 * waveInUnprepareHeader [MMSYSTEM.507]
3400 UINT16 WINAPI
waveInUnprepareHeader16(HWAVEIN16 hWaveIn
,
3401 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
3403 LPWAVEOPENDESC lpDesc
;
3405 TRACE(mmsys
, "(%04X, %p, %u);\n",
3406 hWaveIn
, lpWaveInHdr
, uSize
);
3407 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3408 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3409 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3410 /*USER_HEAP_FREE(HIWORD((DWORD)lpWaveInHdr->lpData)); FIXME */
3411 lpWaveInHdr
->lpData
= NULL
;
3412 lpWaveInHdr
->lpNext
= NULL
;
3413 return widMessage(lpDesc
->uDeviceID
,WIDM_UNPREPARE
,lpDesc
->dwInstance
,
3414 (DWORD
)lpWaveInHdr
, uSize
);
3417 /**************************************************************************
3418 * waveInAddBuffer [WINMM.144]
3420 UINT32 WINAPI
waveInAddBuffer32(HWAVEIN32 hWaveIn
,
3421 WAVEHDR
* lpWaveInHdr
, UINT32 uSize
)
3423 LPWAVEOPENDESC lpDesc
;
3425 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
3426 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3427 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3428 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3429 lpWaveInHdr
->lpNext
= NULL
;
3430 lpWaveInHdr
->dwBytesRecorded
= 0;
3431 TRACE(mmsys
, "lpData=%p size=%lu \n",
3432 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3433 return widMessage(lpDesc
->uDeviceID
, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
3434 (DWORD
)lpWaveInHdr
, uSize
);
3438 /**************************************************************************
3439 * waveInAddBuffer [MMSYSTEM.508]
3441 UINT16 WINAPI
waveInAddBuffer16(HWAVEIN16 hWaveIn
,
3442 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
3444 LPWAVEOPENDESC lpDesc
;
3447 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
3448 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3449 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3450 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3451 lpWaveInHdr
->lpNext
= NULL
;
3452 lpWaveInHdr
->dwBytesRecorded
= 0;
3453 lpWaveInHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveInHdr
->lpData
);
3454 TRACE(mmsys
, "lpData=%p size=%lu \n",
3455 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3456 ret
= widMessage(lpDesc
->uDeviceID
, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
3457 (DWORD
)lpWaveInHdr
, uSize
);
3458 /*lpWaveInHdr->lpData = saveddata;*/
3462 /**************************************************************************
3463 * waveInStart [WINMM.157]
3465 UINT32 WINAPI
waveInStart32(HWAVEIN32 hWaveIn
)
3467 return waveInStart16(hWaveIn
);
3470 /**************************************************************************
3471 * waveInStart [MMSYSTEM.509]
3473 UINT16 WINAPI
waveInStart16(HWAVEIN16 hWaveIn
)
3475 LPWAVEOPENDESC lpDesc
;
3477 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3478 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3479 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3480 return widMessage(lpDesc
->uDeviceID
,WIDM_START
,lpDesc
->dwInstance
,0,0);
3483 /**************************************************************************
3484 * waveInStop [WINMM.158]
3486 UINT32 WINAPI
waveInStop32(HWAVEIN32 hWaveIn
)
3488 return waveInStop16(hWaveIn
);
3491 /**************************************************************************
3492 * waveInStop [MMSYSTEM.510]
3494 UINT16 WINAPI
waveInStop16(HWAVEIN16 hWaveIn
)
3496 LPWAVEOPENDESC lpDesc
;
3498 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3499 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3500 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3501 return widMessage(lpDesc
->uDeviceID
, WIDM_STOP
, lpDesc
->dwInstance
, 0L, 0L);
3504 /**************************************************************************
3505 * waveInReset [WINMM.156]
3507 UINT32 WINAPI
waveInReset32(HWAVEIN32 hWaveIn
)
3509 return waveInReset16(hWaveIn
);
3512 /**************************************************************************
3513 * waveInReset [MMSYSTEM.511]
3515 UINT16 WINAPI
waveInReset16(HWAVEIN16 hWaveIn
)
3517 LPWAVEOPENDESC lpDesc
;
3519 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3520 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3521 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3522 return widMessage(lpDesc
->uDeviceID
,WIDM_RESET
,lpDesc
->dwInstance
,0,0);
3525 /**************************************************************************
3526 * waveInGetPosition [WINMM.152]
3528 UINT32 WINAPI
waveInGetPosition32(HWAVEIN32 hWaveIn
, LPMMTIME32 lpTime
,
3532 UINT32 ret
= waveInGetPosition16(hWaveIn
,&mmt16
,uSize
);
3534 MMSYSTEM_MMTIME16to32(lpTime
,&mmt16
);
3538 /**************************************************************************
3539 * waveInGetPosition [MMSYSTEM.512]
3541 UINT16 WINAPI
waveInGetPosition16(HWAVEIN16 hWaveIn
,LPMMTIME16 lpTime
,
3544 LPWAVEOPENDESC lpDesc
;
3546 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveIn
, lpTime
, uSize
);
3547 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3548 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3549 return widMessage(lpDesc
->uDeviceID
, WIDM_GETPOS
, lpDesc
->dwInstance
,
3550 (DWORD
)lpTime
, (DWORD
)uSize
);
3553 /**************************************************************************
3554 * waveInGetID [WINMM.150]
3556 UINT32 WINAPI
waveInGetID32(HWAVEIN32 hWaveIn
, UINT32
* lpuDeviceID
)
3558 LPWAVEOPENDESC lpDesc
;
3560 TRACE(mmsys
, "waveInGetID\n");
3561 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3562 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3563 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3564 *lpuDeviceID
= lpDesc
->uDeviceID
;
3569 /**************************************************************************
3570 * waveInGetID [MMSYSTEM.513]
3572 UINT16 WINAPI
waveInGetID16(HWAVEIN16 hWaveIn
, UINT16
* lpuDeviceID
)
3574 LPWAVEOPENDESC lpDesc
;
3576 TRACE(mmsys
, "waveInGetID\n");
3577 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3578 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3579 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3580 *lpuDeviceID
= lpDesc
->uDeviceID
;
3584 /**************************************************************************
3585 * waveInMessage [WINMM.153]
3587 DWORD WINAPI
waveInMessage32(HWAVEIN32 hWaveIn
, UINT32 uMessage
,
3588 DWORD dwParam1
, DWORD dwParam2
)
3590 LPWAVEOPENDESC lpDesc
;
3592 fprintf(stderr
, "waveInMessage32(%04X, %04X, %08lX, %08lX),FIXME!\n",
3593 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
3594 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3595 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3598 fprintf(stderr
,"waveInMessage32: cannot handle WIDM_OPEN, please report.\n");
3600 case WIDM_GETNUMDEVS
:
3607 case WIDM_UNPREPARE
:
3608 case WIDM_ADDBUFFER
:
3610 /* no argument conversion needed */
3612 case WIDM_GETDEVCAPS
:
3613 /*FIXME: ANSI/UNICODE */
3614 return waveInGetDevCaps32A(hWaveIn
,(LPWAVEINCAPS32A
)dwParam1
,dwParam2
);
3616 fprintf(stderr
,"unhandled waveInMessage32(%04x,%04x,%08lx,%08lx)\n",hWaveIn
,uMessage
,dwParam1
,dwParam2
);
3619 return widMessage(lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3622 /**************************************************************************
3623 * waveInMessage [MMSYSTEM.514]
3625 DWORD WINAPI
waveInMessage16(HWAVEIN16 hWaveIn
, UINT16 uMessage
,
3626 DWORD dwParam1
, DWORD dwParam2
)
3628 LPWAVEOPENDESC lpDesc
;
3630 fprintf(stderr
, "waveInMessage(%04X, %04X, %08lX, %08lX),FIXME!\n",
3631 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
3632 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3633 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3636 fprintf(stderr
,"waveInMessage16: cannot handle WIDM_OPEN, please report.\n");
3638 case WIDM_GETNUMDEVS
:
3644 /* no argument conversion needed */
3646 case WIDM_GETDEVCAPS
:
3647 return waveInGetDevCaps16(hWaveIn
,(LPWAVEINCAPS16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3649 return waveInGetPosition16(hWaveIn
,(LPMMTIME16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3651 return waveInPrepareHeader16(hWaveIn
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3652 case WIDM_UNPREPARE
:
3653 return waveInUnprepareHeader16(hWaveIn
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3654 case WIDM_ADDBUFFER
:
3655 return waveInAddBuffer16(hWaveIn
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3657 fprintf(stderr
,"unhandled waveInMessage16(%04x,%04x,%08lx,%08lx)\n",hWaveIn
,uMessage
,dwParam1
,dwParam2
);
3660 return widMessage(lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3663 /**************************************************************************
3664 * DrvOpen [MMSYSTEM.1100]
3666 HDRVR16 WINAPI
DrvOpen(LPSTR lpDriverName
, LPSTR lpSectionName
, LPARAM lParam
)
3668 TRACE(mmsys
, "('%s', '%s', %08lX);\n",
3669 lpDriverName
, lpSectionName
, lParam
);
3670 return OpenDriver(lpDriverName
, lpSectionName
, lParam
);
3674 /**************************************************************************
3675 * DrvClose [MMSYSTEM.1101]
3677 LRESULT WINAPI
DrvClose(HDRVR16 hDrvr
, LPARAM lParam1
, LPARAM lParam2
)
3679 TRACE(mmsys
, "(%04X, %08lX, %08lX);\n", hDrvr
, lParam1
, lParam2
);
3680 return CloseDriver(hDrvr
, lParam1
, lParam2
);
3684 /**************************************************************************
3685 * DrvSendMessage [MMSYSTEM.1102]
3687 LRESULT WINAPI
DrvSendMessage(HDRVR16 hDriver
, WORD msg
, LPARAM lParam1
,
3690 DWORD dwDriverID
= 0;
3691 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX);\n",
3692 hDriver
, msg
, lParam1
, lParam2
);
3693 return CDAUDIO_DriverProc(dwDriverID
, hDriver
, msg
, lParam1
, lParam2
);
3696 /**************************************************************************
3697 * DrvGetModuleHandle [MMSYSTEM.1103]
3699 HANDLE16 WINAPI
DrvGetModuleHandle(HDRVR16 hDrvr
)
3701 TRACE(mmsys
, "(%04X);\n", hDrvr
);
3706 /**************************************************************************
3707 * DrvDefDriverProc [MMSYSTEM.1104]
3709 LRESULT WINAPI
DrvDefDriverProc(DWORD dwDriverID
, HDRVR16 hDriv
, WORD wMsg
,
3710 DWORD dwParam1
, DWORD dwParam2
)
3712 return DefDriverProc(dwDriverID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
3715 /**************************************************************************
3716 * mmThreadCreate [MMSYSTEM.1120]
3718 LRESULT WINAPI
mmThreadCreate16(LPVOID x1
, LPWORD x2
, DWORD x3
, DWORD x4
) {
3719 fprintf(stderr
,"mmThreadCreate16(%p,%p,%08lx,%08lx),stub!\n",
3726 /**************************************************************************
3727 * mmThreadGetTask [MMSYSTEM.1125]
3729 LRESULT WINAPI
mmThreadGetTask16(WORD hnd
) {
3730 fprintf(stderr
,"mmThreadGetTask16(%04x),stub!\n",hnd
);
3731 return GetCurrentTask();
3734 /**************************************************************************
3735 * mmThreadSignal [MMSYSTEM.1121]
3737 LRESULT WINAPI
mmThreadSignal16(WORD hnd
) {
3738 fprintf(stderr
,"mmThreadSignal16(%04x), stub!\n",hnd
);
3742 /**************************************************************************
3743 * mmTaskCreate [MMSYSTEM.900]
3745 LRESULT WINAPI
mmTaskCreate16(LPWORD lphnd
,DWORD x1
,DWORD x2
) {
3746 fprintf(stderr
,"mmTaskCreate16(%p,%08lx,%08lx),stub!\n",lphnd
,x1
,x2
);
3751 /**************************************************************************
3752 * mmTaskSignal [MMSYSTEM.903]
3754 LRESULT WINAPI
mmTaskSignal16(HTASK16 ht
) {
3755 fprintf(stderr
,"mmTaskSignal(%04x),stub!\n",ht
);
3756 return PostAppMessage16(ht
,0x400,0,0);
3759 /**************************************************************************
3760 * mciDriverYield [MMSYSTEM.710]
3762 LRESULT WINAPI
mciDriverYield16(HANDLE16 hnd
) {
3763 fprintf(stderr
,"mciDriverYield16(%04x),stub!\n",hnd
);