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 FIXME(mmsys
, "STUB: Unloading MMSystem DLL ... hInst=%04X \n",
105 MMSYSTEM_MMTIME32to16(LPMMTIME16 mmt16
,LPMMTIME32 mmt32
) {
106 mmt16
->wType
= mmt32
->wType
;
107 /* layout of rest is the same for 32/16 */
108 memcpy(&(mmt32
->u
),&(mmt16
->u
),sizeof(mmt16
->u
));
112 MMSYSTEM_MMTIME16to32(LPMMTIME32 mmt32
,LPMMTIME16 mmt16
) {
113 mmt32
->wType
= mmt16
->wType
;
114 /* layout of rest is the same for 32/16,
115 * Note: mmt16->u is 2 bytes smaller than mmt32->u
117 memcpy(&(mmt16
->u
),&(mmt32
->u
),sizeof(mmt16
->u
));
120 /**************************************************************************
121 * PlaySoundA [WINMM.1]
123 BOOL32 WINAPI
PlaySound32A(LPCSTR pszSound
, HMODULE32 hmod
, DWORD fdwSound
)
125 TRACE(mmsys
, "pszSound='%p' hmod=%04X fdwSound=%08lX\n",
126 pszSound
, hmod
, fdwSound
);
127 if(hmod
!= 0 || !(fdwSound
& SND_FILENAME
)) {
128 FIXME(mmsys
, "only disk sound files are supported\n");
131 return sndPlaySound(pszSound
, (UINT16
) fdwSound
);
134 /**************************************************************************
135 * PlaySoundW [WINMM.18]
137 BOOL32 WINAPI
PlaySound32W(LPCWSTR pszSound
, HMODULE32 hmod
, DWORD fdwSound
)
139 LPSTR pszSoundA
= HEAP_strdupWtoA(GetProcessHeap(),0,pszSound
);
142 bSound
= PlaySound32A(pszSoundA
, hmod
, fdwSound
);
143 HeapFree(GetProcessHeap(),0,pszSoundA
);
147 /**************************************************************************
148 * sndPlaySound [MMSYSTEM.2]
150 BOOL16 WINAPI
sndPlaySound(LPCSTR lpszSoundName
, UINT16 uFlags
)
158 TRACE(mmsys
, "SoundName='%s' uFlags=%04X !\n",
159 lpszSoundName
, uFlags
);
160 if (lpszSoundName
== NULL
) {
161 TRACE(mmsys
, "Stop !\n");
164 hmmio
= mmioOpen16((LPSTR
)lpszSoundName
, NULL
,
165 MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
167 if (uFlags
& SND_MEMORY
) {
168 FIXME(mmsys
, "SND_MEMORY flag not implemented!\n");
174 TRACE(mmsys
, "searching in SystemSound List !\n");
175 GetProfileString32A("Sounds", (LPSTR
)lpszSoundName
, "", str
, sizeof(str
));
176 if (strlen(str
) == 0) return FALSE
;
177 if ( (ptr
= (LPSTR
)strchr(str
, ',')) != NULL
) *ptr
= '\0';
178 hmmio
= mmioOpen16(str
, NULL
, MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
181 WARN(mmsys
, "can't find SystemSound='%s' !\n", str
);
186 if (mmioDescend(hmmio
, &ckMainRIFF
, NULL
, 0) == 0)
188 TRACE(mmsys
, "ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
189 (LPSTR
)&ckMainRIFF
.ckid
, (LPSTR
)&ckMainRIFF
.fccType
, ckMainRIFF
.cksize
);
191 if ((ckMainRIFF
.ckid
== FOURCC_RIFF
) &&
192 (ckMainRIFF
.fccType
== mmioFOURCC('W', 'A', 'V', 'E')))
196 mmckInfo
.ckid
= mmioFOURCC('f', 'm', 't', ' ');
198 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
200 PCMWAVEFORMAT pcmWaveFormat
;
202 TRACE(mmsys
, "Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
203 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
205 if (mmioRead(hmmio
, (HPSTR
) &pcmWaveFormat
,
206 (long) sizeof(PCMWAVEFORMAT
)) == (long) sizeof(PCMWAVEFORMAT
))
209 TRACE(mmsys
, "wFormatTag=%04X !\n", pcmWaveFormat
.wf
.wFormatTag
);
210 TRACE(mmsys
, "nChannels=%d \n", pcmWaveFormat
.wf
.nChannels
);
211 TRACE(mmsys
, "nSamplesPerSec=%ld\n", pcmWaveFormat
.wf
.nSamplesPerSec
);
212 TRACE(mmsys
, "nAvgBytesPerSec=%ld\n", pcmWaveFormat
.wf
.nAvgBytesPerSec
);
213 TRACE(mmsys
, "nBlockAlign=%d \n", pcmWaveFormat
.wf
.nBlockAlign
);
214 TRACE(mmsys
, "wBitsPerSample=%u !\n", pcmWaveFormat
.wBitsPerSample
);
216 mmckInfo
.ckid
= mmioFOURCC('d', 'a', 't', 'a');
217 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
219 WAVEOPENDESC waveDesc
;
222 TRACE(mmsys
, "Chunk Found \
223 ckid=%.4s fccType=%.4s cksize=%08lX \n", (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
225 pcmWaveFormat
.wf
.nAvgBytesPerSec
= pcmWaveFormat
.wf
.nSamplesPerSec
*
226 pcmWaveFormat
.wf
.nBlockAlign
;
228 waveDesc
.lpFormat
= (LPWAVEFORMAT
)&pcmWaveFormat
;
230 dwRet
= wodMessage( 0, WODM_OPEN
, 0, (DWORD
)&waveDesc
, CALLBACK_NULL
);
231 if (dwRet
== MMSYSERR_NOERROR
)
235 INT32 count
, bufsize
;
238 hData
= GlobalAlloc16(GMEM_MOVEABLE
, bufsize
);
239 waveHdr
.lpData
= (LPSTR
)GlobalLock16(hData
);
240 waveHdr
.dwBufferLength
= bufsize
;
242 waveHdr
.dwFlags
= 0L;
243 waveHdr
.dwLoops
= 0L;
245 dwRet
= wodMessage(0,WODM_PREPARE
,0,(DWORD
)&waveHdr
,sizeof(WAVEHDR
));
246 if (dwRet
== MMSYSERR_NOERROR
)
250 count
= mmioRead(hmmio
, waveHdr
.lpData
, bufsize
);
251 if (count
< 1) break;
252 waveHdr
.dwBufferLength
= count
;
253 /* waveHdr.dwBytesRecorded = count; */
254 /* FIXME: doesn't expect async ops */
255 wodMessage( 0, WODM_WRITE
, 0, (DWORD
)&waveHdr
, sizeof(WAVEHDR
));
257 wodMessage( 0, WODM_UNPREPARE
, 0, (DWORD
)&waveHdr
, sizeof(WAVEHDR
));
258 wodMessage( 0, WODM_CLOSE
, 0, 0L, 0L);
262 else WARN(mmsys
, "can't prepare WaveOut device !\n");
264 GlobalUnlock16(hData
);
273 if (hmmio
!= 0) mmioClose(hmmio
, 0);
277 /**************************************************************************
278 * mmsystemGetVersion [WINMM.134]
280 UINT32 WINAPI
mmsystemGetVersion32()
282 return mmsystemGetVersion16();
285 /**************************************************************************
286 * mmsystemGetVersion [MMSYSTEM.5]
287 * return value borrowed from Win95 winmm.dll ;)
289 UINT16 WINAPI
mmsystemGetVersion16()
291 TRACE(mmsys
, "3.10 (Win95?)\n");
295 /**************************************************************************
296 * DriverProc [MMSYSTEM.6]
298 LRESULT WINAPI
DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
299 DWORD dwParam1
, DWORD dwParam2
)
301 return DrvDefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
304 /**************************************************************************
305 * DriverCallback [MMSYSTEM.31]
307 BOOL16 WINAPI
DriverCallback(DWORD dwCallBack
, UINT16 uFlags
, HANDLE16 hDev
,
308 WORD wMsg
, DWORD dwUser
, DWORD dwParam1
, DWORD dwParam2
)
310 LPWAVEOPENDESC lpDesc
;
312 TRACE(mmsys
, "(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
313 dwCallBack
, uFlags
, hDev
, wMsg
, dwUser
, dwParam1
, dwParam2
);
314 switch(uFlags
& DCB_TYPEMASK
) {
316 TRACE(mmsys
, "CALLBACK_NULL !\n");
319 TRACE(mmsys
, "CALLBACK_WINDOW = %04lX handle = %04X!\n",dwCallBack
,hDev
);
320 if (!IsWindow32(dwCallBack
)) return FALSE
;
321 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hDev
);
322 if (lpDesc
== NULL
) return FALSE
;
324 PostMessage16((HWND16
)dwCallBack
, wMsg
, hDev
, dwParam1
);
327 TRACE(mmsys
, "CALLBACK_TASK !\n");
330 TRACE(mmsys
, "CALLBACK_FUNCTION !\n");
331 Callbacks
->CallDriverCallback( (FARPROC16
)dwCallBack
,
333 dwParam1
, dwParam2
);
339 /**************************************************************************
340 * Mixer devices. New to Win95
342 /**************************************************************************
343 * find out the real mixer ID depending on hmix (depends on dwFlags)
344 * FIXME: also fix dwInstance passing to mixMessage
346 static UINT32
_get_mixerID_from_handle(HMIXEROBJ32 hmix
,DWORD dwFlags
) {
347 /* FIXME: Check dwFlags for MIXER_OBJECTF_xxxx entries and modify hmix
348 * accordingly. For now we always use mixerdevice 0.
352 /**************************************************************************
353 * mixerGetNumDevs [WINMM.108]
355 UINT32 WINAPI
mixerGetNumDevs32()
357 return mixerGetNumDevs16();
360 /**************************************************************************
363 UINT16 WINAPI
mixerGetNumDevs16()
367 count
= mixMessage(0,MXDM_GETNUMDEVS
,0L,0L,0L);
368 TRACE(mmaux
,"mixerGetNumDevs returns %d\n",count
);
372 /**************************************************************************
373 * mixerGetDevCapsW [WINMM.102]
375 UINT32 WINAPI
mixerGetDevCaps32W(UINT32 devid
,LPMIXERCAPS32W mixcaps
,UINT32 size
)
378 UINT32 ret
= mixerGetDevCaps16(devid
,&mic16
,sizeof(mic16
));
380 mixcaps
->wMid
= mic16
.wMid
;
381 mixcaps
->wPid
= mic16
.wPid
;
382 mixcaps
->vDriverVersion
= mic16
.vDriverVersion
;
383 lstrcpyAtoW(mixcaps
->szPname
,mic16
.szPname
);
384 mixcaps
->fdwSupport
= mic16
.fdwSupport
;
385 mixcaps
->cDestinations
= mic16
.cDestinations
;
388 /**************************************************************************
389 * mixerGetDevCaps [WINMM.101]
391 UINT32 WINAPI
mixerGetDevCaps32A(UINT32 devid
,LPMIXERCAPS32A mixcaps
,UINT32 size
)
394 UINT32 ret
= mixerGetDevCaps16(devid
,&mic16
,sizeof(mic16
));
396 mixcaps
->wMid
= mic16
.wMid
;
397 mixcaps
->wPid
= mic16
.wPid
;
398 mixcaps
->vDriverVersion
= mic16
.vDriverVersion
;
399 strcpy(mixcaps
->szPname
,mic16
.szPname
);
400 mixcaps
->fdwSupport
= mic16
.fdwSupport
;
401 mixcaps
->cDestinations
= mic16
.cDestinations
;
405 /**************************************************************************
408 UINT16 WINAPI
mixerGetDevCaps16(UINT16 devid
,LPMIXERCAPS16 mixcaps
,UINT16 size
)
410 FIXME(mmsys
,"should this be a fixme?\n");
411 return mixMessage(devid
,MXDM_GETDEVCAPS
,0L,(DWORD
)mixcaps
,(DWORD
)size
);
414 /**************************************************************************
415 * mixerOpen [WINMM.110]
417 UINT32 WINAPI
mixerOpen32(LPHMIXER32 lphmix
,UINT32 uDeviceID
,DWORD dwCallback
,
418 DWORD dwInstance
,DWORD fdwOpen
)
423 FIXME(mmsys
,"(%p,%d,%08lx,%08lx,%08lx): semi stub?\n",
424 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 TRACE(mmsys
,"(%p,%d,%08lx,%08lx,%08lx)\n",
442 lphmix
,uDeviceID
,dwCallback
,dwInstance
,fdwOpen
);
443 hmix
= USER_HEAP_ALLOC(sizeof(MIXEROPENDESC
));
444 if (lphmix
) *lphmix
= hmix
;
445 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
447 lpmod
->dwCallback
= dwCallback
;
448 lpmod
->dwInstance
= dwInstance
;
449 if (uDeviceID
>= MAXMIXERDRIVERS
)
451 while(uDeviceID
< MAXMIXERDRIVERS
) {
452 dwRet
=mixMessage(uDeviceID
,MXDM_OPEN
,dwInstance
,(DWORD
)lpmod
,fdwOpen
);
453 if (dwRet
== MMSYSERR_NOERROR
) break;
454 if (!mapperflag
) break;
457 lpmod
->uDeviceID
= uDeviceID
;
461 /**************************************************************************
462 * mixerClose [WINMM.98]
464 UINT32 WINAPI
mixerClose32(HMIXER32 hmix
) {
465 return mixerClose16(hmix
);
468 /**************************************************************************
471 UINT16 WINAPI
mixerClose16(HMIXER16 hmix
) {
472 LPMIXEROPENDESC lpmod
;
474 FIXME(mmsys
,"(%04x): semi-stub?\n",hmix
);
475 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
476 return mixMessage(lpmod
->uDeviceID
,MXDM_CLOSE
,lpmod
->dwInstance
,0L,0L);
479 /**************************************************************************
480 * mixerGetID [WINMM.103]
482 UINT32 WINAPI
mixerGetID32(HMIXEROBJ32 hmix
,LPUINT32 lpid
,DWORD fdwID
) {
485 UINT32 ret
= mixerGetID16(hmix
,&xid
,fdwID
);
486 if (*lpid
) *lpid
= xid
;
490 /**************************************************************************
493 UINT16 WINAPI
mixerGetID16(HMIXEROBJ16 hmix
,LPUINT16 lpid
,DWORD fdwID
) {
494 FIXME(mmsys
,"(%04x): semi-stub\n",hmix
);
495 return _get_mixerID_from_handle(hmix
,fdwID
);
498 /**************************************************************************
499 * mixerGetControlDetailsA [WINMM.99]
501 UINT32
mixerGetControlDetails32A(HMIXEROBJ32 hmix
,LPMIXERCONTROLDETAILS32 lpmcd
,DWORD fdwDetails
) {
502 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpmcd
,fdwDetails
);
503 return MMSYSERR_NOTENABLED
;
506 /**************************************************************************
507 * mixerGetControlDetailsW [WINMM.100]
509 UINT32
mixerGetControlDetails32W(HMIXEROBJ32 hmix
,LPMIXERCONTROLDETAILS32 lpmcd
,DWORD fdwDetails
) {
510 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n", hmix
,lpmcd
,fdwDetails
);
511 return MMSYSERR_NOTENABLED
;
514 /**************************************************************************
515 * mixerGetControlDetails [MMSYSTEM.808]
517 UINT16
mixerGetControlDetails16(HMIXEROBJ16 hmix
,LPMIXERCONTROLDETAILS16 lpmcd
,DWORD fdwDetails
) {
518 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpmcd
,fdwDetails
);
519 return MMSYSERR_NOTENABLED
;
522 /**************************************************************************
523 * mixerGetLineControlsA [WINMM.104]
525 UINT32 WINAPI
mixerGetLineControls32A(HMIXEROBJ32 hmix
,LPMIXERLINECONTROLS32A lpmlc
,DWORD fdwControls
) {
526 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpmlc
,fdwControls
);
527 return MMSYSERR_NOTENABLED
;
530 /**************************************************************************
531 * mixerGetLineControlsW [WINMM.105]
533 UINT32 WINAPI
mixerGetLineControls32W(HMIXEROBJ32 hmix
,LPMIXERLINECONTROLS32W lpmlc
,DWORD fdwControls
) {
534 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpmlc
,fdwControls
);
535 return MMSYSERR_NOTENABLED
;
538 /**************************************************************************
539 * mixerGetLineControls [MMSYSTEM.807]
541 UINT16 WINAPI
mixerGetLineControls16(HMIXEROBJ16 hmix
,LPMIXERLINECONTROLS16 lpmlc
,DWORD fdwControls
) {
542 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpmlc
,fdwControls
);
543 return MMSYSERR_NOTENABLED
;
546 /**************************************************************************
547 * mixerGetLineInfoA [WINMM.106]
549 UINT32 WINAPI
mixerGetLineInfo32A(HMIXEROBJ32 hmix
,LPMIXERLINE32A lpml
,DWORD fdwInfo
) {
553 ml16
.dwDestination
= lpml
->dwDestination
;
554 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpml
,fdwInfo
);
555 ret
= mixerGetLineInfo16(hmix
,&ml16
,fdwInfo
);
556 lpml
->cbStruct
= sizeof(*lpml
);
557 lpml
->dwSource
= ml16
.dwSource
;
558 lpml
->dwLineID
= ml16
.dwLineID
;
559 lpml
->fdwLine
= ml16
.fdwLine
;
560 lpml
->dwUser
= ml16
.dwUser
;
561 lpml
->dwComponentType
= ml16
.dwComponentType
;
562 lpml
->cChannels
= ml16
.cChannels
;
563 lpml
->cConnections
= ml16
.cConnections
;
564 lpml
->cControls
= ml16
.cControls
;
565 strcpy(lpml
->szShortName
,ml16
.szShortName
);
566 strcpy(lpml
->szName
,ml16
.szName
);
567 lpml
->Target
.dwType
= ml16
.Target
.dwType
;
568 lpml
->Target
.dwDeviceID
= ml16
.Target
.dwDeviceID
;
569 lpml
->Target
.wMid
= ml16
.Target
.wMid
;
570 lpml
->Target
.wPid
= ml16
.Target
.wPid
;
571 lpml
->Target
.vDriverVersion
= ml16
.Target
.vDriverVersion
;
572 strcpy(lpml
->Target
.szPname
,ml16
.Target
.szPname
);
576 /**************************************************************************
577 * mixerGetLineInfoW [WINMM.107]
579 UINT32 WINAPI
mixerGetLineInfo32W(HMIXEROBJ32 hmix
,LPMIXERLINE32W lpml
,DWORD fdwInfo
) {
583 ml16
.dwDestination
= lpml
->dwDestination
;
584 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpml
,fdwInfo
);
585 ret
= mixerGetLineInfo16(hmix
,&ml16
,fdwInfo
);
586 lpml
->cbStruct
= sizeof(*lpml
);
587 lpml
->dwSource
= ml16
.dwSource
;
588 lpml
->dwLineID
= ml16
.dwLineID
;
589 lpml
->fdwLine
= ml16
.fdwLine
;
590 lpml
->dwUser
= ml16
.dwUser
;
591 lpml
->dwComponentType
= ml16
.dwComponentType
;
592 lpml
->cChannels
= ml16
.cChannels
;
593 lpml
->cConnections
= ml16
.cConnections
;
594 lpml
->cControls
= ml16
.cControls
;
595 lstrcpyAtoW(lpml
->szShortName
,ml16
.szShortName
);
596 lstrcpyAtoW(lpml
->szName
,ml16
.szName
);
597 lpml
->Target
.dwType
= ml16
.Target
.dwType
;
598 lpml
->Target
.dwDeviceID
= ml16
.Target
.dwDeviceID
;
599 lpml
->Target
.wMid
= ml16
.Target
.wMid
;
600 lpml
->Target
.wPid
= ml16
.Target
.wPid
;
601 lpml
->Target
.vDriverVersion
= ml16
.Target
.vDriverVersion
;
602 /*lstrcpyAtoW(lpml->Target.szPname,ml16.Target.szPname);*/
606 /**************************************************************************
607 * mixerGetLineInfo [MMSYSTEM.805]
609 UINT16 WINAPI
mixerGetLineInfo16(HMIXEROBJ16 hmix
,LPMIXERLINE16 lpml
,DWORD fdwInfo
) {
610 UINT16 devid
= _get_mixerID_from_handle(hmix
,fdwInfo
);
612 FIXME(mmsys
,"(%04x,%p[line %08lx],%08lx) - semi-stub?\n",
613 hmix
,lpml
,lpml
->dwDestination
,fdwInfo
);
614 return mixMessage(devid
,MXDM_GETLINEINFO
,0,(DWORD
)lpml
,fdwInfo
);
617 /**************************************************************************
618 * mixerSetControlDetails [WINMM.111]
620 UINT32 WINAPI
mixerSetControlDetails32(HMIXEROBJ32 hmix
,LPMIXERCONTROLDETAILS32 lpmcd
,DWORD fdwDetails
) {
621 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpmcd
,fdwDetails
);
622 return MMSYSERR_NOTENABLED
;
625 /**************************************************************************
626 * mixerSetControlDetails [MMSYSTEM.809]
628 UINT16 WINAPI
mixerSetControlDetails16(HMIXEROBJ16 hmix
,LPMIXERCONTROLDETAILS16 lpmcd
,DWORD fdwDetails
) {
629 FIXME(mmsys
,"(%04x,%p,%08lx): stub!\n",hmix
,lpmcd
,fdwDetails
);
630 return MMSYSERR_NOTENABLED
;
633 /**************************************************************************
634 * mixerMessage [WINMM.109]
636 UINT32 WINAPI
mixerMessage32(HMIXER32 hmix
,UINT32 uMsg
,DWORD dwParam1
,DWORD dwParam2
) {
637 LPMIXEROPENDESC lpmod
;
640 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
642 uDeviceID
= lpmod
->uDeviceID
;
645 FIXME(mmsys
,"(%04lx,%d,%08lx,%08lx): semi-stub?\n",
646 (DWORD
)hmix
,uMsg
,dwParam1
,dwParam2
);
647 return mixMessage(uDeviceID
,uMsg
,0L,dwParam1
,dwParam2
);
650 /**************************************************************************
651 * mixerMessage [MMSYSTEM.804]
653 UINT16 WINAPI
mixerMessage16(HMIXER16 hmix
,UINT16 uMsg
,DWORD dwParam1
,DWORD dwParam2
) {
654 LPMIXEROPENDESC lpmod
;
657 lpmod
= (LPMIXEROPENDESC
)USER_HEAP_LIN_ADDR(hmix
);
659 uDeviceID
= lpmod
->uDeviceID
;
662 FIXME(mmsys
,"(%04x,%d,%08lx,%08lx) - semi-stub?\n",
663 hmix
,uMsg
,dwParam1
,dwParam2
);
664 return mixMessage(uDeviceID
,uMsg
,0L,dwParam1
,dwParam2
);
667 /**************************************************************************
668 * auxGetNumDevs [WINMM.22]
670 UINT32 WINAPI
auxGetNumDevs32()
672 return auxGetNumDevs16();
675 /**************************************************************************
676 * auxGetNumDevs [MMSYSTEM.350]
678 UINT16 WINAPI
auxGetNumDevs16()
681 TRACE(mmsys
, "auxGetNumDevs !\n");
682 count
+= auxMessage(0, AUXDM_GETNUMDEVS
, 0L, 0L, 0L);
683 TRACE(mmsys
, "auxGetNumDevs return %u \n", count
);
687 /**************************************************************************
688 * auxGetDevCaps [WINMM.20]
690 UINT32 WINAPI
auxGetDevCaps32W(UINT32 uDeviceID
,LPAUXCAPS32W lpCaps
,UINT32 uSize
)
693 UINT32 ret
= auxGetDevCaps16(uDeviceID
,&ac16
,sizeof(ac16
));
695 lpCaps
->wMid
= ac16
.wMid
;
696 lpCaps
->wPid
= ac16
.wPid
;
697 lpCaps
->vDriverVersion
= ac16
.vDriverVersion
;
698 lstrcpyAtoW(lpCaps
->szPname
,ac16
.szPname
);
699 lpCaps
->wTechnology
= ac16
.wTechnology
;
700 lpCaps
->dwSupport
= ac16
.dwSupport
;
704 /**************************************************************************
705 * auxGetDevCaps [WINMM.21]
707 UINT32 WINAPI
auxGetDevCaps32A(UINT32 uDeviceID
,LPAUXCAPS32A lpCaps
,UINT32 uSize
)
710 UINT32 ret
= auxGetDevCaps16(uDeviceID
,&ac16
,sizeof(ac16
));
712 lpCaps
->wMid
= ac16
.wMid
;
713 lpCaps
->wPid
= ac16
.wPid
;
714 lpCaps
->vDriverVersion
= ac16
.vDriverVersion
;
715 strcpy(lpCaps
->szPname
,ac16
.szPname
);
716 lpCaps
->wTechnology
= ac16
.wTechnology
;
717 lpCaps
->dwSupport
= ac16
.dwSupport
;
721 /**************************************************************************
722 * auxGetDevCaps [MMSYSTEM.351]
724 UINT16 WINAPI
auxGetDevCaps16(UINT16 uDeviceID
,LPAUXCAPS16 lpCaps
, UINT16 uSize
)
726 TRACE(mmsys
, "(%04X, %p, %d) !\n",
727 uDeviceID
, lpCaps
, uSize
);
728 return auxMessage(uDeviceID
, AUXDM_GETDEVCAPS
,
729 0L, (DWORD
)lpCaps
, (DWORD
)uSize
);
732 /**************************************************************************
733 * auxGetVolume [WINM.23]
735 UINT32 WINAPI
auxGetVolume32(UINT32 uDeviceID
, DWORD
* lpdwVolume
)
737 return auxGetVolume16(uDeviceID
,lpdwVolume
);
740 /**************************************************************************
741 * auxGetVolume [MMSYSTEM.352]
743 UINT16 WINAPI
auxGetVolume16(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
745 TRACE(mmsys
, "(%04X, %p) !\n", uDeviceID
, lpdwVolume
);
746 return auxMessage(uDeviceID
, AUXDM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
749 /**************************************************************************
750 * auxSetVolume [WINMM.25]
752 UINT32 WINAPI
auxSetVolume32(UINT32 uDeviceID
, DWORD dwVolume
)
754 return auxSetVolume16(uDeviceID
,dwVolume
);
757 /**************************************************************************
758 * auxSetVolume [MMSYSTEM.353]
760 UINT16 WINAPI
auxSetVolume16(UINT16 uDeviceID
, DWORD dwVolume
)
762 TRACE(mmsys
, "(%04X, %08lX) !\n", uDeviceID
, dwVolume
);
763 return auxMessage(uDeviceID
, AUXDM_SETVOLUME
, 0L, dwVolume
, 0L);
766 /**************************************************************************
767 * auxOutMessage [MMSYSTEM.354]
769 DWORD WINAPI
auxOutMessage32(UINT32 uDeviceID
,UINT32 uMessage
,DWORD dw1
,DWORD dw2
)
772 case AUXDM_GETNUMDEVS
:
773 case AUXDM_GETVOLUME
:
774 case AUXDM_SETVOLUME
:
775 /* no argument conversion needed */
777 case AUXDM_GETDEVCAPS
:
778 return auxGetDevCaps32A(uDeviceID
,(LPAUXCAPS32A
)dw1
,dw2
);
780 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
781 uDeviceID
,uMessage
,dw1
,dw2
);
784 return auxMessage(uDeviceID
,uMessage
,0L,dw1
,dw2
);
787 /**************************************************************************
788 * auxOutMessage [MMSYSTEM.354]
790 DWORD WINAPI
auxOutMessage16(UINT16 uDeviceID
, UINT16 uMessage
, DWORD dw1
, DWORD dw2
)
792 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
793 uDeviceID
, uMessage
, dw1
, dw2
);
795 case AUXDM_GETNUMDEVS
:
796 case AUXDM_SETVOLUME
:
797 /* no argument conversion needed */
799 case AUXDM_GETVOLUME
:
800 return auxGetVolume16(uDeviceID
,(LPDWORD
)PTR_SEG_TO_LIN(dw1
));
801 case AUXDM_GETDEVCAPS
:
802 return auxGetDevCaps16(uDeviceID
,(LPAUXCAPS16
)PTR_SEG_TO_LIN(dw1
),dw2
);
804 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
805 uDeviceID
,uMessage
,dw1
,dw2
);
808 return auxMessage(uDeviceID
, uMessage
, 0L, dw1
, dw2
);
811 /**************************************************************************
812 * mciGetErrorStringW [WINMM.46]
814 BOOL32 WINAPI
mciGetErrorString32W(DWORD wError
,LPWSTR lpstrBuffer
,UINT32 uLength
)
816 LPSTR bufstr
= HeapAlloc(GetProcessHeap(),0,uLength
);
817 BOOL32 ret
= mciGetErrorString32A(wError
,bufstr
,uLength
);
819 lstrcpyAtoW(lpstrBuffer
,bufstr
);
820 HeapFree(GetProcessHeap(),0,bufstr
);
824 /**************************************************************************
825 * mciGetErrorStringA [WINMM.45]
827 BOOL32 WINAPI
mciGetErrorString32A(DWORD wError
,LPSTR lpstrBuffer
,UINT32 uLength
)
829 return mciGetErrorString16(wError
,lpstrBuffer
,uLength
);
832 /**************************************************************************
833 * mciGetErrorString [MMSYSTEM.706]
835 BOOL16 WINAPI
mciGetErrorString16(DWORD wError
,LPSTR lpstrBuffer
,UINT16 uLength
)
838 TRACE(mmsys
, "(%08lX, %p, %d);\n",
839 wError
, lpstrBuffer
, uLength
);
840 if ((lpstrBuffer
== NULL
) || (uLength
< 1)) return(FALSE
);
841 lpstrBuffer
[0] = '\0';
843 case MCIERR_INVALID_DEVICE_ID
:
844 msgptr
= "Invalid MCI device ID. Use the ID returned when opening the MCI device.";
846 case MCIERR_UNRECOGNIZED_KEYWORD
:
847 msgptr
= "The driver cannot recognize the specified command parameter.";
849 case MCIERR_UNRECOGNIZED_COMMAND
:
850 msgptr
= "The driver cannot recognize the specified command.";
852 case MCIERR_HARDWARE
:
853 msgptr
= "There is a problem with your media device. Make sure it is working correctly or contact the device manufacturer.";
855 case MCIERR_INVALID_DEVICE_NAME
:
856 msgptr
= "The specified device is not open or is not recognized by MCI.";
858 case MCIERR_OUT_OF_MEMORY
:
859 msgptr
= "Not enough memory available for this task. \nQuit one or more applications to increase available memory, and then try again.";
861 case MCIERR_DEVICE_OPEN
:
862 msgptr
= "The device name is already being used as an alias by this application. Use a unique alias.";
864 case MCIERR_CANNOT_LOAD_DRIVER
:
865 msgptr
= "There is an undetectable problem in loading the specified device driver.";
867 case MCIERR_MISSING_COMMAND_STRING
:
868 msgptr
= "No command was specified.";
870 case MCIERR_PARAM_OVERFLOW
:
871 msgptr
= "The output string was to large to fit in the return buffer. Increase the size of the buffer.";
873 case MCIERR_MISSING_STRING_ARGUMENT
:
874 msgptr
= "The specified command requires a character-string parameter. Please provide one.";
876 case MCIERR_BAD_INTEGER
:
877 msgptr
= "The specified integer is invalid for this command.";
879 case MCIERR_PARSER_INTERNAL
:
880 msgptr
= "The device driver returned an invalid return type. Check with the device manufacturer about obtaining a new driver.";
882 case MCIERR_DRIVER_INTERNAL
:
883 msgptr
= "There is a problem with the device driver. Check with the device manufacturer about obtaining a new driver.";
885 case MCIERR_MISSING_PARAMETER
:
886 msgptr
= "The specified command requires a parameter. Please supply one.";
888 case MCIERR_UNSUPPORTED_FUNCTION
:
889 msgptr
= "The MCI device you are using does not support the specified command.";
891 case MCIERR_FILE_NOT_FOUND
:
892 msgptr
= "Cannot find the specified file. Make sure the path and filename are correct.";
894 case MCIERR_DEVICE_NOT_READY
:
895 msgptr
= "The device driver is not ready.";
897 case MCIERR_INTERNAL
:
898 msgptr
= "A problem occurred in initializing MCI. Try restarting Windows.";
901 msgptr
= "There is a problem with the device driver. The driver has closed. Cannot access error.";
903 case MCIERR_CANNOT_USE_ALL
:
904 msgptr
= "Cannot use 'all' as the device name with the specified command.";
906 case MCIERR_MULTIPLE
:
907 msgptr
= "Errors occurred in more than one device. Specify each command and device separately to determine which devices caused the error";
909 case MCIERR_EXTENSION_NOT_FOUND
:
910 msgptr
= "Cannot determine the device type from the given filename extension.";
912 case MCIERR_OUTOFRANGE
:
913 msgptr
= "The specified parameter is out of range for the specified command.";
915 case MCIERR_FLAGS_NOT_COMPATIBLE
:
916 msgptr
= "The specified parameters cannot be used together.";
918 case MCIERR_FILE_NOT_SAVED
:
919 msgptr
= "Cannot save the specified file. Make sure you have enough disk space or are still connected to the network.";
921 case MCIERR_DEVICE_TYPE_REQUIRED
:
922 msgptr
= "Cannot find the specified device. Make sure it is installed or that the device name is spelled correctly.";
924 case MCIERR_DEVICE_LOCKED
:
925 msgptr
= "The specified device is now being closed. Wait a few seconds, and then try again.";
927 case MCIERR_DUPLICATE_ALIAS
:
928 msgptr
= "The specified alias is already being used in this application. Use a unique alias.";
930 case MCIERR_BAD_CONSTANT
:
931 msgptr
= "The specified parameter is invalid for this command.";
933 case MCIERR_MUST_USE_SHAREABLE
:
934 msgptr
= "The device driver is already in use. To share it, use the 'shareable' parameter with each 'open' command.";
936 case MCIERR_MISSING_DEVICE_NAME
:
937 msgptr
= "The specified command requires an alias, file, driver, or device name. Please supply one.";
939 case MCIERR_BAD_TIME_FORMAT
:
940 msgptr
= "The specified value for the time format is invalid. Refer to the MCI documentation for valid formats.";
942 case MCIERR_NO_CLOSING_QUOTE
:
943 msgptr
= "A closing double-quotation mark is missing from the parameter value. Please supply one.";
945 case MCIERR_DUPLICATE_FLAGS
:
946 msgptr
= "A parameter or value was specified twice. Only specify it once.";
948 case MCIERR_INVALID_FILE
:
949 msgptr
= "The specified file cannot be played on the specified MCI device. The file may be corrupt, or not in the correct format.";
951 case MCIERR_NULL_PARAMETER_BLOCK
:
952 msgptr
= "A null parameter block was passed to MCI.";
954 case MCIERR_UNNAMED_RESOURCE
:
955 msgptr
= "Cannot save an unnamed file. Supply a filename.";
957 case MCIERR_NEW_REQUIRES_ALIAS
:
958 msgptr
= "You must specify an alias when using the 'new' parameter.";
960 case MCIERR_NOTIFY_ON_AUTO_OPEN
:
961 msgptr
= "Cannot use the 'notify' flag with auto-opened devices.";
963 case MCIERR_NO_ELEMENT_ALLOWED
:
964 msgptr
= "Cannot use a filename with the specified device.";
966 case MCIERR_NONAPPLICABLE_FUNCTION
:
967 msgptr
= "Cannot carry out the commands in the order specified. Correct the command sequence, and then try again.";
969 case MCIERR_ILLEGAL_FOR_AUTO_OPEN
:
970 msgptr
= "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again.";
972 case MCIERR_FILENAME_REQUIRED
:
973 msgptr
= "The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension.";
975 case MCIERR_EXTRA_CHARACTERS
:
976 msgptr
= "Cannot specify extra characters after a string enclosed in quotation marks.";
978 case MCIERR_DEVICE_NOT_INSTALLED
:
979 msgptr
= "The specified device is not installed on the system. Use the Drivers option in Control Panel to install the device.";
982 msgptr
= "Cannot access the specified file or MCI device. Try changing directories or restarting your computer.";
985 msgptr
= "Cannot access the specified file or MCI device because the application cannot change directories.";
987 case MCIERR_SET_DRIVE
:
988 msgptr
= "Cannot access specified file or MCI device because the application cannot change drives.";
990 case MCIERR_DEVICE_LENGTH
:
991 msgptr
= "Specify a device or driver name that is less than 79 characters.";
993 case MCIERR_DEVICE_ORD_LENGTH
:
994 msgptr
= "Specify a device or driver name that is less than 69 characters.";
996 case MCIERR_NO_INTEGER
:
997 msgptr
= "The specified command requires an integer parameter. Please provide one.";
999 case MCIERR_WAVE_OUTPUTSINUSE
:
1000 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.";
1002 case MCIERR_WAVE_SETOUTPUTINUSE
:
1003 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.";
1005 case MCIERR_WAVE_INPUTSINUSE
:
1006 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.";
1008 case MCIERR_WAVE_SETINPUTINUSE
:
1009 msgptr
= "Cannot set the current wave device for recording because it is in use. Wait until the device is free, and then try again.";
1011 case MCIERR_WAVE_OUTPUTUNSPECIFIED
:
1012 msgptr
= "Any compatible waveform playback device may be used.";
1014 case MCIERR_WAVE_INPUTUNSPECIFIED
:
1015 msgptr
= "Any compatible waveform recording device may be used.";
1017 case MCIERR_WAVE_OUTPUTSUNSUITABLE
:
1018 msgptr
= "No wave device that can play files in the current format is installed. Use the Drivers option to install the wave device.";
1020 case MCIERR_WAVE_SETOUTPUTUNSUITABLE
:
1021 msgptr
= "The device you are trying to play to cannot recognize the current file format.";
1023 case MCIERR_WAVE_INPUTSUNSUITABLE
:
1024 msgptr
= "No wave device that can record files in the current format is installed. Use the Drivers option to install the wave device.";
1026 case MCIERR_WAVE_SETINPUTUNSUITABLE
:
1027 msgptr
= "The device you are trying to record from cannot recognize the current file format.";
1029 case MCIERR_NO_WINDOW
:
1030 msgptr
= "There is no display window.";
1032 case MCIERR_CREATEWINDOW
:
1033 msgptr
= "Could not create or use window.";
1035 case MCIERR_FILE_READ
:
1036 msgptr
= "Cannot read the specified file. Make sure the file is still present, or check your disk or network connection.";
1038 case MCIERR_FILE_WRITE
:
1039 msgptr
= "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network.";
1041 case MCIERR_SEQ_DIV_INCOMPATIBLE
:
1042 msgptr
= "The time formats of the \"song pointer\" and SMPTE are mutually exclusive. You can't use them together.";
1044 case MCIERR_SEQ_NOMIDIPRESENT
:
1045 msgptr
= "The system has no installed MIDI devices. Use the Drivers option from the Control Panel to install a MIDI driver.";
1047 case MCIERR_SEQ_PORT_INUSE
:
1048 msgptr
= "The specified MIDI port is already in use. Wait until it is free; the try again.";
1050 case MCIERR_SEQ_PORT_MAPNODEVICE
:
1051 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.";
1053 case MCIERR_SEQ_PORT_MISCERROR
:
1054 msgptr
= "An error occurred with the specified port.";
1056 case MCIERR_SEQ_PORT_NONEXISTENT
:
1057 msgptr
= "The specified MIDI device is not installed on the system. Use the Drivers option from the Control Panel to install a MIDI device.";
1059 case MCIERR_SEQ_PORTUNSPECIFIED
:
1060 msgptr
= "The system doesnot have a current MIDI port specified.";
1062 case MCIERR_SEQ_TIMER
:
1063 msgptr
= "All multimedia timers are being used by other applications. Quit one of these applications; then, try again.";
1068 msg# 514 : videodisc
1073 msg# 519 : animation
1074 msg# 520 : digitalvideo
1076 msg# 522 : waveaudio
1077 msg# 523 : sequencer
1078 msg# 524 : not ready
1081 msg# 527 : recording
1087 msg# 533 : milliseconds
1094 msg# 540 : smpte 30 drop
1100 msgptr
= "Unknown MCI Error !\n";
1103 lstrcpyn32A(lpstrBuffer
, msgptr
, uLength
);
1104 TRACE(mmsys
, "msg = %s;\n", msgptr
);
1109 /**************************************************************************
1110 * mciDriverNotify [MMSYSTEM.711]
1112 BOOL16 WINAPI
mciDriverNotify(HWND16 hWndCallBack
, UINT16 wDevID
, UINT16 wStatus
)
1114 TRACE(mmsys
, "(%04X, %u, %04X)\n", hWndCallBack
, wDevID
, wStatus
);
1115 if (!IsWindow32(hWndCallBack
)) return FALSE
;
1116 TRACE(mmsys
, "before PostMessage\n");
1117 PostMessage16( hWndCallBack
, MM_MCINOTIFY
, wStatus
,
1118 MAKELONG(wDevID
, 0));
1122 /**************************************************************************
1123 * mciOpen [internal]
1126 DWORD
mciOpen(DWORD dwParam
, LPMCI_OPEN_PARMS16 lp16Parms
)
1129 LPMCI_OPEN_PARMS16 lpParms
;
1131 UINT16 wDevID
= MMSYSTEM_FirstDevID();
1134 lpParms
= PTR_SEG_TO_LIN(lp16Parms
);
1135 TRACE(mmsys
, "(%08lX, %p (%p))\n", dwParam
, lp16Parms
, lpParms
);
1136 if (lp16Parms
== NULL
) return MCIERR_INTERNAL
;
1138 while(GetDrv(wDevID
)->modp
.wType
!= 0) {
1139 wDevID
= MMSYSTEM_NextDevID(wDevID
);
1140 if (!MMSYSTEM_DevIDValid(wDevID
)) {
1141 TRACE(mmsys
, "MAXMCIDRIVERS reached !\n");
1142 return MCIERR_INTERNAL
;
1145 TRACE(mmsys
, "wDevID=%04X \n", wDevID
);
1146 memcpy(GetOpenDrv(wDevID
),lpParms
,sizeof(*lpParms
));
1148 if (dwParam
& MCI_OPEN_ELEMENT
) {
1151 TRACE(mmsys
,"lpstrElementName='%s'\n",
1152 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
)
1154 s
=(char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
);
1157 GetProfileString32A("mci extensions",t
+1,"*",str
,sizeof(str
));
1159 TRACE(mmsys
, "str = %s \n", str
);
1160 if (strcmp(str
, "CDAUDIO") == 0) {
1161 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
1163 if (strcmp(str
, "WAVEAUDIO") == 0) {
1164 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
1166 if (strcmp(str
, "SEQUENCER") == 0) {
1167 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
1169 if (strcmp(str
, "ANIMATION1") == 0) {
1170 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
1172 if (strcmp(str
, "AVIVIDEO") == 0) {
1173 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
1175 if (strcmp(str
,"*") == 0) {
1176 TRACE(mmsys
,"No [mci extensions] entry for %s found.\n",t
);
1177 return MCIERR_EXTENSION_NOT_FOUND
;
1180 HDRVR16 hdrv
= OpenDriver(str
,"mci",NULL
);
1184 hmod
= GetDriverModuleHandle(hdrv
);
1185 GetDrv(wDevID
)->hdrv
= hdrv
;
1186 GetDrv(wDevID
)->driverproc
= GetProcAddress16(hmod
,SEGPTR_GET(SEGPTR_STRDUP("DRIVERPROC")));
1187 uDevTyp
= MCI_DEVTYPE_OTHER
;
1189 FIXME(mmsys
, "[mci extensions] entry %s for %s not supported.\n",str
,t
);
1190 return MCIERR_DEVICE_NOT_INSTALLED
;
1195 return MCIERR_EXTENSION_NOT_FOUND
;
1198 if (dwParam
& MCI_OPEN_ALIAS
) {
1199 TRACE(mmsys
, "Alias='%s' !\n",
1200 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
));
1201 GetOpenDrv(wDevID
)->lpstrAlias
= (LPSTR
)SEGPTR_GET(
1202 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
)));
1203 /* mplayer does allocate alias to CDAUDIO */
1205 if (dwParam
& MCI_OPEN_TYPE
) {
1206 if (dwParam
& MCI_OPEN_TYPE_ID
) {
1207 TRACE(mmsys
, "Dev=%08lx!\n", (DWORD
)lpParms
->lpstrDeviceType
);
1208 uDevTyp
= LOWORD((DWORD
)lpParms
->lpstrDeviceType
);
1209 GetOpenDrv(wDevID
)->lpstrDeviceType
=(LPSTR
)lpParms
->lpstrDeviceType
;
1211 if (lpParms
->lpstrDeviceType
== NULL
) return MCIERR_INTERNAL
;
1212 TRACE(mmsys
, "Dev='%s' !\n",
1213 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
1214 GetOpenDrv(wDevID
)->lpstrDeviceType
=(LPSTR
)SEGPTR_GET(
1215 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
)));
1216 strcpy(str
, PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
1218 if (strcmp(str
, "CDAUDIO") == 0) {
1219 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
1221 if (strcmp(str
, "WAVEAUDIO") == 0) {
1222 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
1224 if (strcmp(str
, "SEQUENCER") == 0) {
1225 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
1227 if (strcmp(str
, "ANIMATION1") == 0) {
1228 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
1230 if (strcmp(str
, "AVIVIDEO") == 0) {
1231 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
1235 TRACE(mmsys
,"trying to load driver...\n");
1236 hdrv
= OpenDriver(str
,"mci",NULL
);
1240 hmod
= GetDriverModuleHandle(hdrv
);
1241 GetDrv(wDevID
)->hdrv
= hdrv
;
1242 GetDrv(wDevID
)->driverproc
= GetProcAddress16(hmod
,SEGPTR_GET(SEGPTR_STRDUP("DRIVERPROC")));
1243 uDevTyp
= MCI_DEVTYPE_OTHER
;
1246 return MCIERR_DEVICE_NOT_INSTALLED
;
1250 GetDrv(wDevID
)->modp
.wType
= uDevTyp
;
1251 GetDrv(wDevID
)->modp
.wDeviceID
= 0; /* FIXME? for multiple devices */
1252 lpParms
->wDeviceID
= wDevID
;
1253 TRACE(mmsys
, "mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
1254 wDevID
, uDevTyp
, lpParms
->wDeviceID
);
1257 case MCI_DEVTYPE_CD_AUDIO
:
1258 dwret
= CDAUDIO_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1259 dwParam
, (DWORD
)lp16Parms
);
1261 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
1262 dwret
= WAVE_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1263 dwParam
, (DWORD
)lp16Parms
);
1265 case MCI_DEVTYPE_SEQUENCER
:
1266 dwret
= MIDI_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1267 dwParam
, (DWORD
)lp16Parms
);
1269 case MCI_DEVTYPE_ANIMATION
:
1270 dwret
= ANIM_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
1271 dwParam
, (DWORD
)lp16Parms
);
1273 case MCI_DEVTYPE_DIGITAL_VIDEO
:
1274 TRACE(mmsys
, "No DIGITAL_VIDEO yet !\n");
1275 return MCIERR_DEVICE_NOT_INSTALLED
;
1278 dwret
= Callbacks
->CallDriverProc(GetDrv(wDevID
)->driverproc
,0,GetDrv(wDevID
)->hdrv
,MCI_OPEN_DRIVER
,dwParam
,(DWORD
)lp16Parms
);
1279 WARN(mmsys
, "Invalid Device Name '%08lx' !\n", (DWORD
)lpParms
->lpstrDeviceType
);
1281 return MCIERR_INVALID_DEVICE_NAME
;
1285 if (dwParam
&MCI_NOTIFY
)
1286 mciDriverNotify(lpParms
->dwCallback
,wDevID
,
1287 (dwret
==0?MCI_NOTIFY_SUCCESSFUL
:MCI_NOTIFY_FAILURE
));
1289 /* only handled devices fall through */
1290 TRACE(mmsys
, "wDevID = %04X wDeviceID = %d dwret = %ld\n",wDevID
, lpParms
->wDeviceID
, dwret
);
1294 /**************************************************************************
1295 * mciGetDriverData [MMSYSTEM.708]
1297 DWORD WINAPI
mciGetDriverData16(HDRVR16 hdrv
) {
1298 FIXME(mmsys
,"(%04x): stub!\n",hdrv
);
1302 /**************************************************************************
1303 * mciSetDriverData [MMSYSTEM.707]
1305 DWORD WINAPI
mciSetDriverData16(HDRVR16 hdrv
,DWORD data
) {
1306 FIXME(mmsys
,"(%04x,%08lx): stub!\n",hdrv
,data
);
1310 /**************************************************************************
1311 * mciClose [internal]
1313 DWORD
mciClose(UINT16 wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
1315 DWORD dwRet
= MCIERR_INTERNAL
;
1317 TRACE(mmsys
, "(%04x, %08lX, %p)\n", wDevID
, dwParam
, lpParms
);
1318 switch(GetDrv(wDevID
)->modp
.wType
) {
1319 case MCI_DEVTYPE_CD_AUDIO
:
1320 dwRet
= CDAUDIO_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
,0,
1321 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
1323 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
1324 dwRet
= WAVE_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, 0,
1328 case MCI_DEVTYPE_SEQUENCER
:
1329 dwRet
= MIDI_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, 0,
1334 case MCI_DEVTYPE_ANIMATION:
1335 dwRet = ANIM_DriverProc(GetDrv(wDevID)->modp.wDeviceID, 0,
1341 dwRet
= Callbacks
->CallDriverProc(GetDrv(wDevID
)->driverproc
,GetDrv(wDevID
)->modp
.wDeviceID
,GetDrv(wDevID
)->hdrv
,MCI_CLOSE
,dwParam
,(DWORD
)lpParms
);
1343 GetDrv(wDevID
)->modp
.wType
= 0;
1345 if (dwParam
&MCI_NOTIFY
)
1346 mciDriverNotify(lpParms
->dwCallback
,wDevID
,
1347 (dwRet
==0?MCI_NOTIFY_SUCCESSFUL
:MCI_NOTIFY_FAILURE
));
1349 TRACE(mmsys
, "returns %ld\n",dwRet
);
1354 /**************************************************************************
1355 * mciSysinfo [internal]
1357 DWORD
mciSysInfo(DWORD dwFlags
, LPMCI_SYSINFO_PARMS16 lpParms
)
1363 LPSTR SysFile
= "SYSTEM.INI";
1364 TRACE(mci
, "(%08lX, %08lX)\n", dwFlags
, (DWORD
)lpParms
);
1365 lpstrReturn
= PTR_SEG_TO_LIN(lpParms
->lpstrReturn
);
1367 case MCI_SYSINFO_QUANTITY
:
1368 TRACE(mci
, "MCI_SYSINFO_QUANTITY \n");
1369 lpdwRet
= (DWORD
*)lpstrReturn
;
1370 *(lpdwRet
) = InstalledCount
;
1372 case MCI_SYSINFO_INSTALLNAME
:
1373 TRACE(mci
, "MCI_SYSINFO_INSTALLNAME \n");
1374 if (lpInstallNames
== NULL
) {
1376 InstalledListLen
= 0;
1377 ptr
= lpInstallNames
= xmalloc(2048);
1378 GetPrivateProfileString32A("mci", NULL
, "", lpInstallNames
, 2000, SysFile
);
1379 while(strlen(ptr
) > 0) {
1380 TRACE(mci
, "---> '%s' \n", ptr
);
1381 len
= strlen(ptr
) + 1;
1383 InstalledListLen
+= len
;
1387 if (lpParms
->dwRetSize
< InstalledListLen
)
1388 lstrcpyn32A(lpstrReturn
, lpInstallNames
, lpParms
->dwRetSize
- 1);
1390 strcpy(lpstrReturn
, lpInstallNames
);
1392 case MCI_SYSINFO_NAME
:
1393 TRACE(mci
, "MCI_SYSINFO_NAME \n");
1395 case MCI_SYSINFO_OPEN
:
1396 TRACE(mci
, "MCI_SYSINFO_OPEN \n");
1399 return MMSYSERR_INVALPARAM
;
1402 /**************************************************************************
1403 * mciLoadCommandResource
1405 UINT16
mciLoadCommandResource16(HANDLE16 hinst
,LPCSTR resname
,UINT16 type
)
1415 static UINT16 mcidevtype
= 0;
1417 FIXME(mmsys
,"(%04x,%s,%d): stub!\n",hinst
,resname
,type
);
1418 if (!lstrcmpi32A(resname
,"core")) {
1419 FIXME(mmsys
,"(...,\"core\",...), have to use internal tables... (not there yet)\n");
1422 /* if file exists "resname.mci", then load resource "resname" from it
1423 * otherwise directly from driver
1425 strcpy(buf
,resname
);
1427 if (OpenFile32(buf
,&ofs
,OF_EXIST
)!=HFILE_ERROR32
) {
1428 xhinst
= LoadLibrary16(buf
);
1431 } /* else use passed hinst */
1432 segstr
= SEGPTR_STRDUP(resname
);
1433 hrsrc
= FindResource16(hinst
,SEGPTR_GET(segstr
),type
);
1434 SEGPTR_FREE(segstr
);
1436 WARN(mmsys
,"no special commandlist found in resource\n");
1437 return MCI_NO_COMMAND_TABLE
;
1439 hmem
= LoadResource16(hinst
,hrsrc
);
1441 WARN(mmsys
,"couldn't load resource??\n");
1442 return MCI_NO_COMMAND_TABLE
;
1444 xmem
= WIN16_LockResource16(hmem
);
1446 WARN(mmsys
,"couldn't lock resource??\n");
1447 FreeResource16(hmem
);
1448 return MCI_NO_COMMAND_TABLE
;
1450 lmem
= PTR_SEG_TO_LIN(xmem
);
1451 TRACE(mmsys
,"first resource entry is %s\n",(char*)lmem
);
1452 /* parse resource, register stuff, return unique id */
1453 return ++mcidevtype
;
1457 /**************************************************************************
1458 * mciSound [internal]
1459 * not used anymore ??
1461 DWORD mciSound(UINT16 wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
1463 if (lpParms == NULL) return MCIERR_INTERNAL;
1464 if (dwParam & MCI_SOUND_NAME)
1465 TRACE(mci, "file='%s' !\n", lpParms->lpstrSoundName);
1466 return MCIERR_INVALID_DEVICE_ID;
1471 static const char *_mciCommandToString(UINT16 wMsg
)
1473 static char buffer
[100];
1475 #define CASE(s) case (s): return #s
1486 CASE(MCI_GETDEVCAPS
);
1510 sprintf(buffer
, "%04X", wMsg
);
1516 /**************************************************************************
1517 * mciSendCommandA [WINMM.49]
1519 DWORD WINAPI
mciSendCommand32A(UINT32 wDevID
, UINT32 wMsg
, DWORD dwParam1
,
1522 FIXME(mmsys
,"(%08x,%s,%08lx,%08lx): stub!\n",
1523 wDevID
,_mciCommandToString(wMsg
),dwParam1
,dwParam2
);
1526 LPMCI_OPEN_PARMS32A lpmop
= (LPMCI_OPEN_PARMS32A
)dwParam2
;
1527 TRACE(mmsys
," MCI_OPEN(%s,%s,%s)\n",
1528 (dwParam1
&MCI_OPEN_TYPE
) ?lpmop
->lpstrDeviceType
:"<null>",
1529 (dwParam1
&MCI_OPEN_ELEMENT
)?(HIWORD(lpmop
->lpstrElementName
)?lpmop
->lpstrElementName
:"<id>"):"<null>",
1530 (dwParam1
&MCI_OPEN_ALIAS
) ?lpmop
->lpstrAlias
:"<null>"
1535 return 0x1; /* !ok */
1537 /**************************************************************************
1538 * mciSendCommand [MMSYSTEM.701]
1540 DWORD WINAPI
mciSendCommand(UINT16 wDevID
, UINT16 wMsg
, DWORD dwParam1
,
1544 TRACE(mci
, "(%04X, %s, %08lX, %08lX)\n",
1545 wDevID
, _mciCommandToString(wMsg
), dwParam1
, dwParam2
);
1549 return mciOpen(dwParam1
, (LPMCI_OPEN_PARMS16
)dwParam2
);
1551 return mciClose( wDevID
, dwParam1
,
1552 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
1554 return mciSysInfo( dwParam1
,
1555 (LPMCI_SYSINFO_PARMS16
)PTR_SEG_TO_LIN(dwParam2
));
1557 switch(GetDrv(wDevID
)->modp
.wType
)
1559 case MCI_DEVTYPE_CD_AUDIO
:
1560 return CDAUDIO_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, hDrv
,
1561 wMsg
, dwParam1
, dwParam2
);
1562 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
1563 return WAVE_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, hDrv
,
1564 wMsg
, dwParam1
, dwParam2
);
1565 case MCI_DEVTYPE_SEQUENCER
:
1566 return MIDI_DriverProc(GetDrv(wDevID
)->modp
.wDeviceID
, hDrv
,
1567 wMsg
, dwParam1
, dwParam2
);
1569 case MCI_DEVTYPE_ANIMATION:
1570 return ANIM_DriverProc(GetDrv(wDevID)->modp.wDeviceID, hDrv,
1571 wMsg, dwParam1, dwParam2);
1574 return Callbacks
->CallDriverProc(GetDrv(wDevID
)->driverproc
,GetDrv(wDevID
)->modp
.wDeviceID
,GetDrv(wDevID
)->hdrv
,MCI_CLOSE
,dwParam1
,dwParam2
);
1576 WARN(mci
, "unknown device type=%04X !\n",
1577 GetDrv(wDevID
)->modp
.wType
);
1580 return MMSYSERR_INVALPARAM
;
1583 /**************************************************************************
1584 * mciGetDeviceID [MMSYSTEM.703]
1586 UINT16 WINAPI
mciGetDeviceID (LPCSTR lpstrName
)
1590 TRACE(mci
, "(\"%s\")\n", lpstrName
);
1591 if (lpstrName
&& !lstrcmpi32A(lpstrName
, "ALL"))
1592 return MCI_ALL_DEVICE_ID
;
1597 wDevID
= MMSYSTEM_FirstDevID();
1598 while(MMSYSTEM_DevIDValid(wDevID
) && GetDrv(wDevID
)->modp
.wType
) {
1599 if (GetOpenDrv(wDevID
)->lpstrDeviceType
&&
1600 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrDeviceType
), lpstrName
) == 0)
1603 if (GetOpenDrv(wDevID
)->lpstrAlias
&&
1604 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrAlias
), lpstrName
) == 0)
1607 wDevID
= MMSYSTEM_NextDevID(wDevID
);
1613 /**************************************************************************
1614 * mciSetYieldProc [MMSYSTEM.714]
1616 BOOL16 WINAPI
mciSetYieldProc (UINT16 uDeviceID
,
1617 YIELDPROC fpYieldProc
, DWORD dwYieldData
)
1622 /**************************************************************************
1623 * mciGetDeviceIDFromElementID [MMSYSTEM.715]
1625 UINT16 WINAPI
mciGetDeviceIDFromElementID(DWORD dwElementID
, LPCSTR lpstrType
)
1630 /**************************************************************************
1631 * mciGetYieldProc [MMSYSTEM.716]
1633 YIELDPROC WINAPI
mciGetYieldProc(UINT16 uDeviceID
, DWORD
* lpdwYieldData
)
1638 /**************************************************************************
1639 * mciGetCreatorTask [MMSYSTEM.717]
1641 HTASK16 WINAPI
mciGetCreatorTask(UINT16 uDeviceID
)
1646 /**************************************************************************
1647 * midiOutGetNumDevs [WINMM.80]
1649 UINT32 WINAPI
midiOutGetNumDevs32(void)
1651 return midiOutGetNumDevs16();
1653 /**************************************************************************
1654 * midiOutGetNumDevs [MMSYSTEM.201]
1656 UINT16 WINAPI
midiOutGetNumDevs16(void)
1659 TRACE(mmsys
, "midiOutGetNumDevs\n");
1660 count
+= modMessage(0, MODM_GETNUMDEVS
, 0L, 0L, 0L);
1661 TRACE(mmsys
, "midiOutGetNumDevs return %u \n", count
);
1665 /**************************************************************************
1666 * midiOutGetDevCapsW [WINMM.76]
1668 UINT32 WINAPI
midiOutGetDevCaps32W(UINT32 uDeviceID
,LPMIDIOUTCAPS32W lpCaps
, UINT32 uSize
)
1670 MIDIOUTCAPS16 moc16
;
1673 ret
= midiOutGetDevCaps16(uDeviceID
,&moc16
,sizeof(moc16
));
1674 lpCaps
->wMid
= moc16
.wMid
;
1675 lpCaps
->wPid
= moc16
.wPid
;
1676 lpCaps
->vDriverVersion
= moc16
.vDriverVersion
;
1677 lstrcpyAtoW(lpCaps
->szPname
,moc16
.szPname
);
1678 lpCaps
->wTechnology
= moc16
.wTechnology
;
1679 lpCaps
->wVoices
= moc16
.wVoices
;
1680 lpCaps
->wNotes
= moc16
.wNotes
;
1681 lpCaps
->wChannelMask
= moc16
.wChannelMask
;
1682 lpCaps
->dwSupport
= moc16
.dwSupport
;
1685 /**************************************************************************
1686 * midiOutGetDevCapsA [WINMM.75]
1688 UINT32 WINAPI
midiOutGetDevCaps32A(UINT32 uDeviceID
,LPMIDIOUTCAPS32A lpCaps
, UINT32 uSize
)
1690 MIDIOUTCAPS16 moc16
;
1693 ret
= midiOutGetDevCaps16(uDeviceID
,&moc16
,sizeof(moc16
));
1694 lpCaps
->wMid
= moc16
.wMid
;
1695 lpCaps
->wPid
= moc16
.wPid
;
1696 lpCaps
->vDriverVersion
= moc16
.vDriverVersion
;
1697 strcpy(lpCaps
->szPname
,moc16
.szPname
);
1698 lpCaps
->wTechnology
= moc16
.wTechnology
;
1699 lpCaps
->wVoices
= moc16
.wVoices
;
1700 lpCaps
->wNotes
= moc16
.wNotes
;
1701 lpCaps
->wChannelMask
= moc16
.wChannelMask
;
1702 lpCaps
->dwSupport
= moc16
.dwSupport
;
1706 /**************************************************************************
1707 * midiOutGetDevCaps [MMSYSTEM.202]
1709 UINT16 WINAPI
midiOutGetDevCaps16(UINT16 uDeviceID
,LPMIDIOUTCAPS16 lpCaps
, UINT16 uSize
)
1711 TRACE(mmsys
, "midiOutGetDevCaps\n");
1712 return modMessage(uDeviceID
,MODM_GETDEVCAPS
,0,(DWORD
)lpCaps
,uSize
);
1715 /**************************************************************************
1716 * midiOutGetErrorTextA [WINMM.77]
1718 UINT32 WINAPI
midiOutGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
1720 TRACE(mmsys
, "midiOutGetErrorText\n");
1721 return midiGetErrorText(uError
, lpText
, uSize
);
1724 /**************************************************************************
1725 * midiOutGetErrorTextW [WINMM.78]
1727 UINT32 WINAPI
midiOutGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
1729 LPSTR xstr
= HeapAlloc(GetProcessHeap(),0,uSize
);
1732 TRACE(mmsys
, "midiOutGetErrorText\n");
1733 ret
= midiGetErrorText(uError
, xstr
, uSize
);
1734 lstrcpyAtoW(lpText
,xstr
);
1735 HeapFree(GetProcessHeap(),0,xstr
);
1738 /**************************************************************************
1739 * midiOutGetErrorText [MMSYSTEM.203]
1741 UINT16 WINAPI
midiOutGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1743 TRACE(mmsys
, "midiOutGetErrorText\n");
1744 return midiGetErrorText(uError
, lpText
, uSize
);
1747 /**************************************************************************
1748 * midiGetErrorText [internal]
1750 UINT16 WINAPI
midiGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1753 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1756 case MIDIERR_UNPREPARED
:
1757 msgptr
= "The MIDI header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1759 case MIDIERR_STILLPLAYING
:
1760 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1763 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.";
1765 case MIDIERR_NOTREADY
:
1766 msgptr
= "The port is transmitting data to the device. Wait until the data has been transmitted, and then try again.";
1768 case MIDIERR_NODEVICE
:
1769 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.";
1771 case MIDIERR_INVALIDSETUP
:
1772 msgptr
= "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the Windows SYSTEM directory, and then try again.";
1775 msg# 336 : Cannot use the song-pointer time format and the SMPTE time-format together.
1776 msg# 337 : The specified MIDI device is already in use. Wait until it is free, and then try again.
1777 msg# 338 : The specified MIDI device is not installed on the system. Use the Drivers option in Control Panel to install the driver.
1778 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.
1779 msg# 340 : An error occurred using the specified port.
1780 msg# 341 : All multimedia timers are being used by other applications. Quit one of these applications, and then try again.
1781 msg# 342 : There is no current MIDI port.
1782 msg# 343 : There are no MIDI devices installed on the system. Use the Drivers option in Control Panel to install the driver.
1785 msgptr
= "Unknown MIDI Error !\n";
1788 lstrcpyn32A(lpText
, msgptr
, uSize
);
1792 /**************************************************************************
1793 * midiOutOpen [WINM.84]
1795 UINT32 WINAPI
midiOutOpen32(HMIDIOUT32
* lphMidiOut
, UINT32 uDeviceID
,
1796 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1801 ret
= midiOutOpen16(&hmo16
,uDeviceID
,dwCallback
,dwInstance
,dwFlags
);
1802 if (lphMidiOut
) *lphMidiOut
= hmo16
;
1805 /**************************************************************************
1806 * midiOutOpen [MMSYSTEM.204]
1808 UINT16 WINAPI
midiOutOpen16(HMIDIOUT16
* lphMidiOut
, UINT16 uDeviceID
,
1809 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1812 LPMIDIOPENDESC lpDesc
;
1814 BOOL32 bMapperFlg
= FALSE
;
1815 if (lphMidiOut
!= NULL
) *lphMidiOut
= 0;
1816 TRACE(mmsys
, "(%p, %d, %08lX, %08lX, %08lX);\n",
1817 lphMidiOut
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1818 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
1819 TRACE(mmsys
, "MIDI_MAPPER mode requested !\n");
1823 hMidiOut
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1824 if (lphMidiOut
!= NULL
) *lphMidiOut
= hMidiOut
;
1825 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1827 return MMSYSERR_NOMEM
;
1828 lpDesc
->hMidi
= hMidiOut
;
1829 lpDesc
->dwCallback
= dwCallback
;
1830 lpDesc
->dwInstance
= dwInstance
;
1831 while(uDeviceID
< MAXMIDIDRIVERS
) {
1832 dwRet
= modMessage(uDeviceID
, MODM_OPEN
,
1833 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
1834 if (dwRet
== MMSYSERR_NOERROR
) break;
1835 if (!bMapperFlg
) break;
1837 TRACE(mmsys
, "MIDI_MAPPER mode ! try next driver...\n");
1842 /**************************************************************************
1843 * midiOutClose [WINMM.74]
1845 UINT32 WINAPI
midiOutClose32(HMIDIOUT32 hMidiOut
)
1847 return midiOutClose16(hMidiOut
);
1850 /**************************************************************************
1851 * midiOutClose [MMSYSTEM.205]
1853 UINT16 WINAPI
midiOutClose16(HMIDIOUT16 hMidiOut
)
1855 LPMIDIOPENDESC lpDesc
;
1856 TRACE(mmsys
, "(%04X)\n", hMidiOut
);
1857 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1858 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1859 return modMessage(0, MODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1862 /**************************************************************************
1863 * midiOutPrepareHeader [WINMM.85]
1865 UINT32 WINAPI
midiOutPrepareHeader32(HMIDIOUT32 hMidiOut
,
1866 MIDIHDR
* lpMidiOutHdr
, UINT32 uSize
)
1868 return midiOutPrepareHeader16(hMidiOut
,lpMidiOutHdr
,uSize
);
1871 /**************************************************************************
1872 * midiOutPrepareHeader [MMSYSTEM.206]
1874 UINT16 WINAPI
midiOutPrepareHeader16(HMIDIOUT16 hMidiOut
,
1875 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1877 LPMIDIOPENDESC lpDesc
;
1878 TRACE(mmsys
, "(%04X, %p, %d)\n",
1879 hMidiOut
, lpMidiOutHdr
, uSize
);
1880 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1881 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1882 return modMessage(0, MODM_PREPARE
, lpDesc
->dwInstance
,
1883 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1886 /**************************************************************************
1887 * midiOutUnprepareHeader [WINMM.89]
1889 UINT32 WINAPI
midiOutUnprepareHeader32(HMIDIOUT32 hMidiOut
,
1890 MIDIHDR
* lpMidiOutHdr
, UINT32 uSize
)
1892 return midiOutUnprepareHeader16(hMidiOut
,lpMidiOutHdr
,uSize
);
1894 /**************************************************************************
1895 * midiOutUnprepareHeader [MMSYSTEM.207]
1897 UINT16 WINAPI
midiOutUnprepareHeader16(HMIDIOUT16 hMidiOut
,
1898 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1900 LPMIDIOPENDESC lpDesc
;
1901 TRACE(mmsys
, "(%04X, %p, %d)\n",
1902 hMidiOut
, lpMidiOutHdr
, uSize
);
1903 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1904 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1905 return modMessage(0, MODM_UNPREPARE
, lpDesc
->dwInstance
,
1906 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1909 /**************************************************************************
1910 * midiOutShortMsg [WINMM.88]
1912 UINT32 WINAPI
midiOutShortMsg32(HMIDIOUT32 hMidiOut
, DWORD dwMsg
)
1914 return midiOutShortMsg16(hMidiOut
,dwMsg
);
1916 /**************************************************************************
1917 * midiOutShortMsg [MMSYSTEM.208]
1919 UINT16 WINAPI
midiOutShortMsg16(HMIDIOUT16 hMidiOut
, DWORD dwMsg
)
1921 LPMIDIOPENDESC lpDesc
;
1922 TRACE(mmsys
, "(%04X, %08lX)\n", hMidiOut
, dwMsg
);
1923 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1924 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1925 return modMessage(0, MODM_DATA
, lpDesc
->dwInstance
, dwMsg
, 0L);
1928 /**************************************************************************
1929 * midiOutLongMsg [WINMM.82]
1931 UINT32 WINAPI
midiOutLongMsg32(HMIDIOUT32 hMidiOut
,
1932 MIDIHDR
* lpMidiOutHdr
, UINT32 uSize
)
1934 return midiOutLongMsg16(hMidiOut
,lpMidiOutHdr
,uSize
);
1937 /**************************************************************************
1938 * midiOutLongMsg [MMSYSTEM.209]
1940 UINT16 WINAPI
midiOutLongMsg16(HMIDIOUT16 hMidiOut
,
1941 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1943 LPMIDIOPENDESC lpDesc
;
1944 TRACE(mmsys
, "(%04X, %p, %d)\n",
1945 hMidiOut
, lpMidiOutHdr
, uSize
);
1946 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1947 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1948 return modMessage(0, MODM_LONGDATA
, lpDesc
->dwInstance
,
1949 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1952 /**************************************************************************
1953 * midiOutReset [WINMM.86]
1955 UINT32 WINAPI
midiOutReset32(HMIDIOUT32 hMidiOut
)
1957 return midiOutReset16(hMidiOut
);
1960 /**************************************************************************
1961 * midiOutReset [MMSYSTEM.210]
1963 UINT16 WINAPI
midiOutReset16(HMIDIOUT16 hMidiOut
)
1965 LPMIDIOPENDESC lpDesc
;
1966 TRACE(mmsys
, "(%04X)\n", hMidiOut
);
1967 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1968 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1969 return modMessage(0, MODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1972 /**************************************************************************
1973 * midiOutGetVolume [WINM.81]
1975 UINT32 WINAPI
midiOutGetVolume32(UINT32 uDeviceID
, DWORD
* lpdwVolume
)
1977 return midiOutGetVolume16(uDeviceID
,lpdwVolume
);
1979 /**************************************************************************
1980 * midiOutGetVolume [MMSYSTEM.211]
1982 UINT16 WINAPI
midiOutGetVolume16(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
1984 TRACE(mmsys
, "(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1985 return modMessage(uDeviceID
, MODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1988 /**************************************************************************
1989 * midiOutSetVolume [WINMM.87]
1991 UINT32 WINAPI
midiOutSetVolume32(UINT32 uDeviceID
, DWORD dwVolume
)
1993 return midiOutSetVolume16(uDeviceID
,dwVolume
);
1996 /**************************************************************************
1997 * midiOutSetVolume [MMSYSTEM.212]
1999 UINT16 WINAPI
midiOutSetVolume16(UINT16 uDeviceID
, DWORD dwVolume
)
2001 TRACE(mmsys
, "(%04X, %08lX);\n", uDeviceID
, dwVolume
);
2002 return modMessage(uDeviceID
, MODM_SETVOLUME
, 0L, dwVolume
, 0L);
2005 /**************************************************************************
2006 * midiOutCachePatches [WINMM.73]
2008 UINT32 WINAPI
midiOutCachePatches32(HMIDIOUT32 hMidiOut
, UINT32 uBank
,
2009 WORD
* lpwPatchArray
, UINT32 uFlags
)
2011 return midiOutCachePatches16(hMidiOut
,uBank
,lpwPatchArray
,uFlags
);
2014 /**************************************************************************
2015 * midiOutCachePatches [MMSYSTEM.213]
2017 UINT16 WINAPI
midiOutCachePatches16(HMIDIOUT16 hMidiOut
, UINT16 uBank
,
2018 WORD
* lpwPatchArray
, UINT16 uFlags
)
2020 /* not really necessary to support this */
2021 FIXME(mmsys
, "not supported yet\n");
2022 return MMSYSERR_NOTSUPPORTED
;
2025 /**************************************************************************
2026 * midiOutCacheDrumPatches [WINMM.72]
2028 UINT32 WINAPI
midiOutCacheDrumPatches32(HMIDIOUT32 hMidiOut
, UINT32 uPatch
,
2029 WORD
* lpwKeyArray
, UINT32 uFlags
)
2031 return midiOutCacheDrumPatches16(hMidiOut
,uPatch
,lpwKeyArray
,uFlags
);
2034 /**************************************************************************
2035 * midiOutCacheDrumPatches [MMSYSTEM.214]
2037 UINT16 WINAPI
midiOutCacheDrumPatches16(HMIDIOUT16 hMidiOut
, UINT16 uPatch
,
2038 WORD
* lpwKeyArray
, UINT16 uFlags
)
2040 FIXME(mmsys
, "not supported yet\n");
2041 return MMSYSERR_NOTSUPPORTED
;
2044 /**************************************************************************
2045 * midiOutGetID [WINMM.79]
2047 UINT32 WINAPI
midiOutGetID32(HMIDIOUT32 hMidiOut
, UINT32
* lpuDeviceID
)
2052 ret
= midiOutGetID16(hMidiOut
,&xid
);
2057 /**************************************************************************
2058 * midiOutGetID [MMSYSTEM.215]
2060 UINT16 WINAPI
midiOutGetID16(HMIDIOUT16 hMidiOut
, UINT16
* lpuDeviceID
)
2062 TRACE(mmsys
, "midiOutGetID\n");
2066 /**************************************************************************
2067 * midiOutMessage [WINMM.83]
2069 DWORD WINAPI
midiOutMessage32(HMIDIOUT32 hMidiOut
, UINT32 uMessage
,
2070 DWORD dwParam1
, DWORD dwParam2
)
2072 LPMIDIOPENDESC lpDesc
;
2074 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2075 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
2076 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
2077 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2080 FIXME(mmsys
,"can't handle MODM_OPEN!\n");
2082 case MODM_GETDEVCAPS
:
2083 return midiOutGetDevCaps32A(hMidiOut
,(LPMIDIOUTCAPS32A
)dwParam1
,dwParam2
);
2084 case MODM_GETNUMDEVS
:
2087 case MODM_GETVOLUME
:
2088 case MODM_SETVOLUME
:
2091 case MODM_UNPREPARE
:
2092 /* no argument conversion needed */
2095 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
2096 hMidiOut
,uMessage
,dwParam1
,dwParam2
);
2099 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2102 /**************************************************************************
2103 * midiOutMessage [MMSYSTEM.216]
2105 DWORD WINAPI
midiOutMessage16(HMIDIOUT16 hMidiOut
, UINT16 uMessage
,
2106 DWORD dwParam1
, DWORD dwParam2
)
2108 LPMIDIOPENDESC lpDesc
;
2110 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2111 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
2112 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
2113 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2116 FIXME(mmsys
,"can't handle MODM_OPEN!\n");
2118 case MODM_GETNUMDEVS
:
2121 case MODM_SETVOLUME
:
2122 /* no argument conversion needed */
2124 case MODM_GETVOLUME
:
2125 return midiOutGetVolume16(hMidiOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
2127 return midiOutLongMsg16(hMidiOut
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2129 return midiOutPrepareHeader16(hMidiOut
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2130 case MODM_UNPREPARE
:
2131 return midiOutUnprepareHeader16(hMidiOut
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2133 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
2134 hMidiOut
,uMessage
,dwParam1
,dwParam2
);
2137 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2140 /**************************************************************************
2141 * midiInGetNumDevs [WINMM.64]
2143 UINT32 WINAPI
midiInGetNumDevs32(void)
2145 return midiInGetNumDevs16();
2148 /**************************************************************************
2149 * midiInGetNumDevs [MMSYSTEM.301]
2151 UINT16 WINAPI
midiInGetNumDevs16(void)
2154 TRACE(mmsys
, "midiInGetNumDevs\n");
2155 count
+= midMessage(0, MIDM_GETNUMDEVS
, 0L, 0L, 0L);
2156 TRACE(mmsys
, "midiInGetNumDevs return %u \n", count
);
2160 /**************************************************************************
2161 * midiInGetDevCaps [WINMM.60]
2163 UINT32 WINAPI
midiInGetDevCaps32W(UINT32 uDeviceID
,
2164 LPMIDIINCAPS32W lpCaps
, UINT32 uSize
)
2167 UINT32 ret
= midiInGetDevCaps16(uDeviceID
,&mic16
,uSize
);
2169 lpCaps
->wMid
= mic16
.wMid
;
2170 lpCaps
->wPid
= mic16
.wPid
;
2171 lpCaps
->vDriverVersion
= mic16
.vDriverVersion
;
2172 lstrcpyAtoW(lpCaps
->szPname
,mic16
.szPname
);
2173 lpCaps
->dwSupport
= mic16
.dwSupport
;
2177 /**************************************************************************
2178 * midiInGetDevCaps [WINMM.59]
2180 UINT32 WINAPI
midiInGetDevCaps32A(UINT32 uDeviceID
,
2181 LPMIDIINCAPS32A lpCaps
, UINT32 uSize
)
2184 UINT32 ret
= midiInGetDevCaps16(uDeviceID
,&mic16
,uSize
);
2186 lpCaps
->wMid
= mic16
.wMid
;
2187 lpCaps
->wPid
= mic16
.wPid
;
2188 lpCaps
->vDriverVersion
= mic16
.vDriverVersion
;
2189 strcpy(lpCaps
->szPname
,mic16
.szPname
);
2190 lpCaps
->dwSupport
= mic16
.dwSupport
;
2194 /**************************************************************************
2195 * midiInGetDevCaps [MMSYSTEM.302]
2197 UINT16 WINAPI
midiInGetDevCaps16(UINT16 uDeviceID
,
2198 LPMIDIINCAPS16 lpCaps
, UINT16 uSize
)
2200 TRACE(mmsys
, "midiInGetDevCaps\n");
2201 return midMessage(uDeviceID
,MIDM_GETDEVCAPS
,0,(DWORD
)lpCaps
,uSize
);;
2204 /**************************************************************************
2205 * midiInGetErrorText [WINMM.62]
2207 UINT32 WINAPI
midiInGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
2209 LPSTR xstr
= HeapAlloc(GetProcessHeap(),0,uSize
);
2210 UINT32 ret
= midiInGetErrorText16(uError
,xstr
,uSize
);
2211 lstrcpyAtoW(lpText
,xstr
);
2212 HeapFree(GetProcessHeap(),0,xstr
);
2215 /**************************************************************************
2216 * midiInGetErrorText [WINMM.61]
2218 UINT32 WINAPI
midiInGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
2220 return midiInGetErrorText16(uError
,lpText
,uSize
);
2223 /**************************************************************************
2224 * midiInGetErrorText [MMSYSTEM.303]
2226 UINT16 WINAPI
midiInGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
2228 TRACE(mmsys
, "midiInGetErrorText\n");
2229 return (midiGetErrorText(uError
, lpText
, uSize
));
2232 /**************************************************************************
2233 * midiInOpen [WINMM.66]
2235 UINT32 WINAPI
midiInOpen32(HMIDIIN32
* lphMidiIn
, UINT32 uDeviceID
,
2236 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
2239 UINT32 ret
= midiInOpen16(&xhmid16
,uDeviceID
,dwCallback
,dwInstance
,dwFlags
);
2240 if (lphMidiIn
) *lphMidiIn
= xhmid16
;
2244 /**************************************************************************
2245 * midiInOpen [MMSYSTEM.304]
2247 UINT16 WINAPI
midiInOpen16(HMIDIIN16
* lphMidiIn
, UINT16 uDeviceID
,
2248 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
2251 LPMIDIOPENDESC lpDesc
;
2253 BOOL32 bMapperFlg
= FALSE
;
2255 if (lphMidiIn
!= NULL
) *lphMidiIn
= 0;
2256 TRACE(mmsys
, "(%p, %d, %08lX, %08lX, %08lX);\n",
2257 lphMidiIn
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
2258 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
2259 TRACE(mmsys
, "MIDI_MAPPER mode requested !\n");
2263 hMidiIn
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
2264 if (lphMidiIn
!= NULL
) *lphMidiIn
= hMidiIn
;
2265 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2266 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
2267 lpDesc
->hMidi
= hMidiIn
;
2268 lpDesc
->dwCallback
= dwCallback
;
2269 lpDesc
->dwInstance
= dwInstance
;
2270 while(uDeviceID
< MAXMIDIDRIVERS
) {
2271 dwRet
= midMessage(uDeviceID
, MIDM_OPEN
,
2272 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
2273 if (dwRet
== MMSYSERR_NOERROR
) break;
2274 if (!bMapperFlg
) break;
2276 TRACE(mmsys
, "MIDI_MAPPER mode ! try next driver...\n");
2281 /**************************************************************************
2282 * midiInClose [WINMM.58]
2284 UINT32 WINAPI
midiInClose32(HMIDIIN32 hMidiIn
)
2286 return midiInClose16(hMidiIn
);
2289 /**************************************************************************
2290 * midiInClose [MMSYSTEM.305]
2292 UINT16 WINAPI
midiInClose16(HMIDIIN16 hMidiIn
)
2294 LPMIDIOPENDESC lpDesc
;
2295 TRACE(mmsys
, "(%04X)\n", hMidiIn
);
2296 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2297 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2298 return midMessage(0, MIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
2301 /**************************************************************************
2302 * midiInPrepareHeader [WINMM.67]
2304 UINT32 WINAPI
midiInPrepareHeader32(HMIDIIN32 hMidiIn
,
2305 MIDIHDR
* lpMidiInHdr
, UINT32 uSize
)
2307 return midiInPrepareHeader16(hMidiIn
,lpMidiInHdr
,uSize
);
2310 /**************************************************************************
2311 * midiInPrepareHeader [MMSYSTEM.306]
2313 UINT16 WINAPI
midiInPrepareHeader16(HMIDIIN16 hMidiIn
,
2314 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
2316 LPMIDIOPENDESC lpDesc
;
2317 TRACE(mmsys
, "(%04X, %p, %d)\n",
2318 hMidiIn
, lpMidiInHdr
, uSize
);
2319 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2320 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2321 return midMessage(0, MIDM_PREPARE
, lpDesc
->dwInstance
,
2322 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
2325 /**************************************************************************
2326 * midiInUnprepareHeader [WINMM.71]
2328 UINT32 WINAPI
midiInUnprepareHeader32(HMIDIIN32 hMidiIn
,
2329 MIDIHDR
* lpMidiInHdr
, UINT32 uSize
)
2331 return midiInUnprepareHeader16(hMidiIn
,lpMidiInHdr
,uSize
);
2334 /**************************************************************************
2335 * midiInUnprepareHeader [MMSYSTEM.307]
2337 UINT16 WINAPI
midiInUnprepareHeader16(HMIDIIN16 hMidiIn
,
2338 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
2340 LPMIDIOPENDESC lpDesc
;
2341 TRACE(mmsys
, "(%04X, %p, %d)\n",
2342 hMidiIn
, lpMidiInHdr
, uSize
);
2343 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2344 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2345 return midMessage(0, MIDM_UNPREPARE
, lpDesc
->dwInstance
,
2346 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
2349 /**************************************************************************
2350 * midiInAddBuffer [WINMM.57]
2352 UINT32 WINAPI
midiInAddBuffer32(HMIDIIN32 hMidiIn
,
2353 MIDIHDR
* lpMidiInHdr
, UINT32 uSize
)
2355 return midiInAddBuffer16(hMidiIn
,lpMidiInHdr
,uSize
);
2358 /**************************************************************************
2359 * midiInAddBuffer [MMSYSTEM.308]
2361 UINT16 WINAPI
midiInAddBuffer16(HMIDIIN16 hMidiIn
,
2362 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
2364 TRACE(mmsys
, "midiInAddBuffer\n");
2368 /**************************************************************************
2369 * midiInStart [WINMM.69]
2371 UINT32 WINAPI
midiInStart32(HMIDIIN32 hMidiIn
)
2373 return midiInStart16(hMidiIn
);
2376 /**************************************************************************
2377 * midiInStart [MMSYSTEM.309]
2379 UINT16 WINAPI
midiInStart16(HMIDIIN16 hMidiIn
)
2381 TRACE(mmsys
, "midiInStart\n");
2385 /**************************************************************************
2386 * midiInStop [WINMM.70]
2388 UINT32 WINAPI
midiInStop32(HMIDIIN32 hMidiIn
)
2390 return midiInStop16(hMidiIn
);
2393 /**************************************************************************
2394 * midiInStop [MMSYSTEM.310]
2396 UINT16 WINAPI
midiInStop16(HMIDIIN16 hMidiIn
)
2398 TRACE(mmsys
, "midiInStop\n");
2402 /**************************************************************************
2403 * midiInReset [WINMM.68]
2405 UINT32 WINAPI
midiInReset32(HMIDIIN32 hMidiIn
)
2407 return midiInReset16(hMidiIn
);
2410 /**************************************************************************
2411 * midiInReset [MMSYSTEM.311]
2413 UINT16 WINAPI
midiInReset16(HMIDIIN16 hMidiIn
)
2415 TRACE(mmsys
, "midiInReset\n");
2419 /**************************************************************************
2420 * midiInGetID [WINMM.63]
2422 UINT32 WINAPI
midiInGetID32(HMIDIIN32 hMidiIn
, UINT32
* lpuDeviceID
)
2424 TRACE(mmsys
, "midiInGetID\n");
2428 /**************************************************************************
2429 * midiInGetID [MMSYSTEM.312]
2431 UINT16 WINAPI
midiInGetID16(HMIDIIN16 hMidiIn
, UINT16
* lpuDeviceID
)
2433 TRACE(mmsys
, "midiInGetID\n");
2437 /**************************************************************************
2438 * midiInMessage [WINMM.65]
2440 DWORD WINAPI
midiInMessage32(HMIDIIN32 hMidiIn
, UINT32 uMessage
,
2441 DWORD dwParam1
, DWORD dwParam2
)
2443 LPMIDIOPENDESC lpDesc
;
2444 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2445 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
2446 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2447 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2450 FIXME(mmsys
,"can't handle MIDM_OPEN!\n");
2452 case MIDM_GETDEVCAPS
:
2453 return midiInGetDevCaps32A(hMidiIn
,(LPMIDIINCAPS32A
)dwParam1
,dwParam2
);
2454 case MIDM_GETNUMDEVS
:
2459 /* no argument conversion needed */
2462 return midiInPrepareHeader32(hMidiIn
,(LPMIDIHDR
)dwParam1
,dwParam2
);
2463 case MIDM_UNPREPARE
:
2464 return midiInUnprepareHeader32(hMidiIn
,(LPMIDIHDR
)dwParam1
,dwParam2
);
2465 case MIDM_ADDBUFFER
:
2466 return midiInAddBuffer32(hMidiIn
,(LPMIDIHDR
)dwParam1
,dwParam2
);
2468 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
2469 hMidiIn
,uMessage
,dwParam1
,dwParam2
);
2472 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2475 /**************************************************************************
2476 * midiInMessage [MMSYSTEM.313]
2478 DWORD WINAPI
midiInMessage16(HMIDIIN16 hMidiIn
, UINT16 uMessage
,
2479 DWORD dwParam1
, DWORD dwParam2
)
2481 LPMIDIOPENDESC lpDesc
;
2482 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX)\n",
2483 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
2484 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
2485 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2488 WARN(mmsys
,"can't handle MIDM_OPEN!\n");
2490 case MIDM_GETDEVCAPS
:
2491 return midiInGetDevCaps16(hMidiIn
,(LPMIDIINCAPS16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2492 case MIDM_GETNUMDEVS
:
2497 /* no argument conversion needed */
2500 return midiInPrepareHeader16(hMidiIn
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2501 case MIDM_UNPREPARE
:
2502 return midiInUnprepareHeader16(hMidiIn
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2503 case MIDM_ADDBUFFER
:
2504 return midiInAddBuffer16(hMidiIn
,(LPMIDIHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
2506 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
2507 hMidiIn
,uMessage
,dwParam1
,dwParam2
);
2510 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2514 /**************************************************************************
2515 * waveOutGetNumDevs [MMSYSTEM.401]
2517 UINT32 WINAPI
waveOutGetNumDevs32() {
2518 return waveOutGetNumDevs16();
2521 /**************************************************************************
2522 * waveOutGetNumDevs [WINMM.167]
2524 UINT16 WINAPI
waveOutGetNumDevs16()
2527 TRACE(mmsys
, "waveOutGetNumDevs\n");
2528 count
+= wodMessage( MMSYSTEM_FirstDevID(), WODM_GETNUMDEVS
, 0L, 0L, 0L);
2529 TRACE(mmsys
, "waveOutGetNumDevs return %u \n", count
);
2533 /**************************************************************************
2534 * waveOutGetDevCaps [MMSYSTEM.402]
2536 UINT16 WINAPI
waveOutGetDevCaps16(UINT16 uDeviceID
, WAVEOUTCAPS16
* lpCaps
,
2539 if (uDeviceID
> waveOutGetNumDevs16() - 1) return MMSYSERR_BADDEVICEID
;
2540 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) return MMSYSERR_BADDEVICEID
; /* FIXME: do we have a wave mapper ? */
2541 TRACE(mmsys
, "waveOutGetDevCaps\n");
2542 return wodMessage(uDeviceID
, WODM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
2545 /**************************************************************************
2546 * waveOutGetDevCapsA [WINMM.162]
2548 UINT32 WINAPI
waveOutGetDevCaps32A(UINT32 uDeviceID
, LPWAVEOUTCAPS32A lpCaps
,
2551 WAVEOUTCAPS16 woc16
;
2552 UINT16 ret
= waveOutGetDevCaps16(uDeviceID
,&woc16
,sizeof(woc16
));
2554 lpCaps
->wMid
= woc16
.wMid
;
2555 lpCaps
->wPid
= woc16
.wPid
;
2556 lpCaps
->vDriverVersion
= woc16
.vDriverVersion
;
2557 strcpy(lpCaps
->szPname
,woc16
.szPname
);
2558 lpCaps
->dwFormats
= woc16
.dwFormats
;
2559 lpCaps
->wChannels
= woc16
.wChannels
;
2560 lpCaps
->dwSupport
= woc16
.dwSupport
;
2564 /**************************************************************************
2565 * waveOutGetDevCapsW [WINMM.163]
2567 UINT32 WINAPI
waveOutGetDevCaps32W(UINT32 uDeviceID
, LPWAVEOUTCAPS32W lpCaps
,
2570 WAVEOUTCAPS16 woc16
;
2571 UINT32 ret
= waveOutGetDevCaps16(uDeviceID
,&woc16
,sizeof(woc16
));
2573 lpCaps
->wMid
= woc16
.wMid
;
2574 lpCaps
->wPid
= woc16
.wPid
;
2575 lpCaps
->vDriverVersion
= woc16
.vDriverVersion
;
2576 lstrcpyAtoW(lpCaps
->szPname
,woc16
.szPname
);
2577 lpCaps
->dwFormats
= woc16
.dwFormats
;
2578 lpCaps
->wChannels
= woc16
.wChannels
;
2579 lpCaps
->dwSupport
= woc16
.dwSupport
;
2583 /**************************************************************************
2584 * waveOutGetErrorText [MMSYSTEM.403]
2586 UINT16 WINAPI
waveOutGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
2588 TRACE(mmsys
, "waveOutGetErrorText\n");
2589 return(waveGetErrorText(uError
, lpText
, uSize
));
2592 /**************************************************************************
2593 * waveOutGetErrorTextA [WINMM.164]
2595 UINT32 WINAPI
waveOutGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
2597 return(waveOutGetErrorText16(uError
, lpText
, uSize
));
2600 /**************************************************************************
2601 * waveOutGetErrorTextW [WINMM.165]
2603 UINT32 WINAPI
waveOutGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
2605 LPSTR xstr
= HeapAlloc(GetProcessHeap(),0,uSize
);
2606 UINT32 ret
= waveOutGetErrorText32A(uError
, xstr
, uSize
);
2608 lstrcpyAtoW(lpText
,xstr
);
2609 HeapFree(GetProcessHeap(),0,xstr
);
2614 /**************************************************************************
2615 * waveGetErrorText [internal]
2617 static UINT16
waveGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
2620 TRACE(mmsys
, "(%04X, %p, %d);\n",
2621 uError
, lpText
, uSize
);
2622 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
2625 case MMSYSERR_NOERROR
:
2626 msgptr
= "The specified command was carried out.";
2628 case MMSYSERR_ERROR
:
2629 msgptr
= "Undefined external error.";
2631 case MMSYSERR_BADDEVICEID
:
2632 msgptr
= "A device ID has been used that is out of range for your system.";
2634 case MMSYSERR_NOTENABLED
:
2635 msgptr
= "The driver was not enabled.";
2637 case MMSYSERR_ALLOCATED
:
2638 msgptr
= "The specified device is already in use. Wait until it is free, and then try again.";
2640 case MMSYSERR_INVALHANDLE
:
2641 msgptr
= "The specified device handle is invalid.";
2643 case MMSYSERR_NODRIVER
:
2644 msgptr
= "There is no driver installed on your system !\n";
2646 case MMSYSERR_NOMEM
:
2647 msgptr
= "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
2649 case MMSYSERR_NOTSUPPORTED
:
2650 msgptr
= "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
2652 case MMSYSERR_BADERRNUM
:
2653 msgptr
= "An error number was specified that is not defined in the system.";
2655 case MMSYSERR_INVALFLAG
:
2656 msgptr
= "An invalid flag was passed to a system function.";
2658 case MMSYSERR_INVALPARAM
:
2659 msgptr
= "An invalid parameter was passed to a system function.";
2661 case WAVERR_BADFORMAT
:
2662 msgptr
= "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
2664 case WAVERR_STILLPLAYING
:
2665 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
2667 case WAVERR_UNPREPARED
:
2668 msgptr
= "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
2671 msgptr
= "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
2674 msgptr
= "Unknown MMSYSTEM Error !\n";
2677 lstrcpyn32A(lpText
, msgptr
, uSize
);
2681 /**************************************************************************
2682 * waveOutOpen [WINMM.173]
2683 * All the args/structs have the same layout as the win16 equivalents
2685 UINT32 WINAPI
waveOutOpen32(HWAVEOUT32
* lphWaveOut
, UINT32 uDeviceID
,
2686 const LPWAVEFORMATEX lpFormat
, DWORD dwCallback
,
2687 DWORD dwInstance
, DWORD dwFlags
)
2690 UINT32 ret
=waveOutOpen16(&hwo16
,uDeviceID
,lpFormat
,dwCallback
,dwInstance
,dwFlags
);
2691 if (lphWaveOut
) *lphWaveOut
=hwo16
;
2694 /**************************************************************************
2695 * waveOutOpen [MMSYSTEM.404]
2697 UINT16 WINAPI
waveOutOpen16(HWAVEOUT16
* lphWaveOut
, UINT16 uDeviceID
,
2698 const LPWAVEFORMATEX lpFormat
, DWORD dwCallback
,
2699 DWORD dwInstance
, DWORD dwFlags
)
2701 HWAVEOUT16 hWaveOut
;
2702 LPWAVEOPENDESC lpDesc
;
2704 BOOL32 bMapperFlg
= FALSE
;
2706 TRACE(mmsys
, "(%p, %d, %p, %08lX, %08lX, %08lX);\n",
2707 lphWaveOut
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
2708 if (dwFlags
& WAVE_FORMAT_QUERY
)
2709 TRACE(mmsys
, "WAVE_FORMAT_QUERY requested !\n");
2710 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
2711 TRACE(mmsys
, "WAVE_MAPPER mode requested !\n");
2715 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
2717 hWaveOut
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
2718 if (lphWaveOut
!= NULL
) *lphWaveOut
= hWaveOut
;
2719 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2720 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
2721 lpDesc
->hWave
= hWaveOut
;
2722 lpDesc
->lpFormat
= (LPWAVEFORMAT
)lpFormat
; /* should the struct be copied iso pointer? */
2723 lpDesc
->dwCallBack
= dwCallback
;
2724 lpDesc
->dwInstance
= dwInstance
;
2725 if (uDeviceID
>= MAXWAVEDRIVERS
)
2727 while(uDeviceID
< MAXWAVEDRIVERS
) {
2728 dwRet
= wodMessage(uDeviceID
, WODM_OPEN
,
2729 lpDesc
->dwInstance
, (DWORD
)lpDesc
, dwFlags
);
2730 if (dwRet
== MMSYSERR_NOERROR
) break;
2731 if (!bMapperFlg
) break;
2733 TRACE(mmsys
, "WAVE_MAPPER mode ! try next driver...\n");
2735 lpDesc
->uDeviceID
= uDeviceID
; /* save physical Device ID */
2736 if (dwFlags
& WAVE_FORMAT_QUERY
) {
2737 TRACE(mmsys
, "End of WAVE_FORMAT_QUERY !\n");
2738 dwRet
= waveOutClose32(hWaveOut
);
2743 /**************************************************************************
2744 * waveOutClose [WINMM.161]
2746 UINT32 WINAPI
waveOutClose32(HWAVEOUT32 hWaveOut
)
2748 return waveOutClose16(hWaveOut
);
2750 /**************************************************************************
2751 * waveOutClose [MMSYSTEM.405]
2753 UINT16 WINAPI
waveOutClose16(HWAVEOUT16 hWaveOut
)
2755 LPWAVEOPENDESC lpDesc
;
2757 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2758 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2759 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2760 return wodMessage( lpDesc
->uDeviceID
, WODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
2763 /**************************************************************************
2764 * waveOutPrepareHeader [WINMM.175]
2766 UINT32 WINAPI
waveOutPrepareHeader32(HWAVEOUT32 hWaveOut
,
2767 WAVEHDR
* lpWaveOutHdr
, UINT32 uSize
)
2769 LPWAVEOPENDESC lpDesc
;
2771 TRACE(mmsys
, "(%04X, %p, %u);\n",
2772 hWaveOut
, lpWaveOutHdr
, uSize
);
2773 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2774 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2775 return wodMessage( lpDesc
->uDeviceID
, WODM_PREPARE
, lpDesc
->dwInstance
,
2776 (DWORD
)lpWaveOutHdr
,uSize
);
2778 /**************************************************************************
2779 * waveOutPrepareHeader [MMSYSTEM.406]
2781 UINT16 WINAPI
waveOutPrepareHeader16(HWAVEOUT16 hWaveOut
,
2782 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
2784 LPWAVEOPENDESC lpDesc
;
2785 LPBYTE saveddata
= lpWaveOutHdr
->lpData
;
2788 TRACE(mmsys
, "(%04X, %p, %u);\n",
2789 hWaveOut
, lpWaveOutHdr
, uSize
);
2790 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2791 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2792 lpWaveOutHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveOutHdr
->lpData
);
2793 ret
= wodMessage( lpDesc
->uDeviceID
, WODM_PREPARE
, lpDesc
->dwInstance
,
2794 (DWORD
)lpWaveOutHdr
,uSize
);
2795 lpWaveOutHdr
->lpData
= saveddata
;
2799 /**************************************************************************
2800 * waveOutUnprepareHeader [WINMM.181]
2802 UINT32 WINAPI
waveOutUnprepareHeader32(HWAVEOUT32 hWaveOut
,
2803 WAVEHDR
* lpWaveOutHdr
, UINT32 uSize
)
2805 LPWAVEOPENDESC lpDesc
;
2807 TRACE(mmsys
, "(%04X, %p, %u);\n",
2808 hWaveOut
, lpWaveOutHdr
, uSize
);
2809 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2810 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2811 return wodMessage(lpDesc
->uDeviceID
,WODM_UNPREPARE
,lpDesc
->dwInstance
,
2812 (DWORD
)lpWaveOutHdr
, uSize
);
2814 /**************************************************************************
2815 * waveOutUnprepareHeader [MMSYSTEM.407]
2817 UINT16 WINAPI
waveOutUnprepareHeader16(HWAVEOUT16 hWaveOut
,
2818 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
2820 LPWAVEOPENDESC lpDesc
;
2821 LPBYTE saveddata
= lpWaveOutHdr
->lpData
;
2824 TRACE(mmsys
, "(%04X, %p, %u);\n",
2825 hWaveOut
, lpWaveOutHdr
, uSize
);
2826 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2827 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2828 lpWaveOutHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveOutHdr
->lpData
);
2829 ret
= wodMessage(lpDesc
->uDeviceID
,WODM_UNPREPARE
,lpDesc
->dwInstance
,
2830 (DWORD
)lpWaveOutHdr
, uSize
);
2831 lpWaveOutHdr
->lpData
= saveddata
;
2835 /**************************************************************************
2836 * waveOutWrite [MMSYSTEM.408]
2838 UINT32 WINAPI
waveOutWrite32(HWAVEOUT32 hWaveOut
, WAVEHDR
* lpWaveOutHdr
,
2841 LPWAVEOPENDESC lpDesc
;
2842 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
2843 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2844 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2845 lpWaveOutHdr
->reserved
= (DWORD
)lpWaveOutHdr
->lpData
;
2846 return wodMessage( lpDesc
->uDeviceID
, WODM_WRITE
, lpDesc
->dwInstance
, (DWORD
)lpWaveOutHdr
, uSize
);
2848 /**************************************************************************
2849 * waveOutWrite [MMSYSTEM.408]
2851 UINT16 WINAPI
waveOutWrite16(HWAVEOUT16 hWaveOut
, WAVEHDR
* lpWaveOutHdr
,
2854 LPWAVEOPENDESC lpDesc
;
2857 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
2858 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2859 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2860 lpWaveOutHdr
->reserved
=(DWORD
)lpWaveOutHdr
->lpData
;/*save original ptr*/
2861 lpWaveOutHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveOutHdr
->lpData
);
2862 ret
= wodMessage( lpDesc
->uDeviceID
, WODM_WRITE
, lpDesc
->dwInstance
, (DWORD
)lpWaveOutHdr
, uSize
);
2863 lpWaveOutHdr
->lpData
= (LPBYTE
)lpWaveOutHdr
->reserved
;
2867 /**************************************************************************
2868 * waveOutPause [WINMM.174]
2870 UINT32 WINAPI
waveOutPause32(HWAVEOUT32 hWaveOut
)
2872 return waveOutPause16(hWaveOut
);
2875 /**************************************************************************
2876 * waveOutPause [MMSYSTEM.409]
2878 UINT16 WINAPI
waveOutPause16(HWAVEOUT16 hWaveOut
)
2880 LPWAVEOPENDESC lpDesc
;
2882 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2883 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2884 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2885 return wodMessage( lpDesc
->uDeviceID
, WODM_PAUSE
, lpDesc
->dwInstance
, 0L, 0L);
2888 /**************************************************************************
2889 * waveOutRestart [WINMM.177]
2891 UINT32 WINAPI
waveOutRestart32(HWAVEOUT32 hWaveOut
)
2893 return waveOutRestart16(hWaveOut
);
2895 /**************************************************************************
2896 * waveOutRestart [MMSYSTEM.410]
2898 UINT16 WINAPI
waveOutRestart16(HWAVEOUT16 hWaveOut
)
2900 LPWAVEOPENDESC lpDesc
;
2902 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2903 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2904 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2905 return wodMessage( lpDesc
->uDeviceID
, WODM_RESTART
, lpDesc
->dwInstance
, 0L, 0L);
2908 /**************************************************************************
2909 * waveOutReset [WINMM.176]
2911 UINT32 WINAPI
waveOutReset32(HWAVEOUT32 hWaveOut
)
2913 return waveOutReset16(hWaveOut
);
2916 /**************************************************************************
2917 * waveOutReset [MMSYSTEM.411]
2919 UINT16 WINAPI
waveOutReset16(HWAVEOUT16 hWaveOut
)
2921 LPWAVEOPENDESC lpDesc
;
2922 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
2923 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2924 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2925 return wodMessage( lpDesc
->uDeviceID
, WODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
2928 /**************************************************************************
2929 * waveOutGetPosition [WINMM.170]
2931 UINT32 WINAPI
waveOutGetPosition32(HWAVEOUT32 hWaveOut
, LPMMTIME32 lpTime
,
2937 mmt16
.wType
= lpTime
->wType
;
2938 ret
= waveOutGetPosition16(hWaveOut
,&mmt16
,sizeof(mmt16
));
2939 MMSYSTEM_MMTIME16to32(lpTime
,&mmt16
);
2942 /**************************************************************************
2943 * waveOutGetPosition [MMSYSTEM.412]
2945 UINT16 WINAPI
waveOutGetPosition16(HWAVEOUT16 hWaveOut
,LPMMTIME16 lpTime
,
2948 LPWAVEOPENDESC lpDesc
;
2949 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveOut
, lpTime
, uSize
);
2950 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
2951 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2952 return wodMessage( lpDesc
->uDeviceID
, WODM_GETPOS
, lpDesc
->dwInstance
,
2953 (DWORD
)lpTime
, (DWORD
)uSize
);
2956 #define WAVEOUT_SHORTCUT_1(xx,XX,atype) \
2957 UINT32 WINAPI waveOut##xx##32(HWAVEOUT32 hWaveOut, atype x) \
2959 return waveOut##xx##16(hWaveOut,x); \
2961 UINT16 WINAPI waveOut##xx##16(HWAVEOUT16 hWaveOut, atype x) \
2963 LPWAVEOPENDESC lpDesc; \
2964 TRACE(mmsys, "waveOut"#xx"(%04X, %08lx);\n", hWaveOut,(DWORD)x);\
2965 lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut); \
2966 if (lpDesc == NULL) return MMSYSERR_INVALHANDLE; \
2967 return wodMessage(lpDesc->uDeviceID, WODM_##XX, lpDesc->dwInstance,\
2971 WAVEOUT_SHORTCUT_1(GetPitch
,GETPITCH
,DWORD
*)
2972 WAVEOUT_SHORTCUT_1(SetPitch
,SETPITCH
,DWORD
)
2973 WAVEOUT_SHORTCUT_1(GetPlaybackRate
,GETPLAYBACKRATE
,DWORD
*)
2974 WAVEOUT_SHORTCUT_1(SetPlaybackRate
,SETPLAYBACKRATE
,DWORD
)
2976 #define WAVEOUT_SHORTCUT_2(xx,XX,atype) \
2977 UINT32 WINAPI waveOut##xx##32(UINT32 devid, atype x) \
2979 return waveOut##xx##16(devid,x); \
2981 UINT16 WINAPI waveOut##xx##16(UINT16 devid, atype x) \
2983 TRACE(mmsys, "waveOut"#xx"(%04X, %08lx);\n", devid,(DWORD)x); \
2984 return wodMessage(devid, WODM_##XX, 0L, (DWORD)x, 0L); \
2988 WAVEOUT_SHORTCUT_2(GetVolume
,GETVOLUME
,DWORD
*)
2989 WAVEOUT_SHORTCUT_2(SetVolume
,SETVOLUME
,DWORD
)
2992 /**************************************************************************
2993 * waveOutBreakLoop [MMSYSTEM.419]
2995 UINT32 WINAPI
waveOutBreakLoop32(HWAVEOUT32 hWaveOut
)
2997 return waveOutBreakLoop16(hWaveOut
);
2999 /**************************************************************************
3000 * waveOutBreakLoop [MMSYSTEM.419]
3002 UINT16 WINAPI
waveOutBreakLoop16(HWAVEOUT16 hWaveOut
)
3004 TRACE(mmsys
, "(%04X)\n", hWaveOut
);
3005 return MMSYSERR_INVALHANDLE
;
3008 /**************************************************************************
3009 * waveOutGetID [MMSYSTEM.420]
3011 UINT32 WINAPI
waveOutGetID32(HWAVEOUT32 hWaveOut
, UINT32
* lpuDeviceID
)
3013 LPWAVEOPENDESC lpDesc
;
3014 TRACE(mmsys
, "(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
3015 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3016 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3017 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3018 *lpuDeviceID
= lpDesc
->uDeviceID
;
3021 /**************************************************************************
3022 * waveOutGetID [MMSYSTEM.420]
3024 UINT16 WINAPI
waveOutGetID16(HWAVEOUT16 hWaveOut
, UINT16
* lpuDeviceID
)
3026 LPWAVEOPENDESC lpDesc
;
3027 TRACE(mmsys
, "(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
3028 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3029 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3030 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3031 *lpuDeviceID
= lpDesc
->uDeviceID
;
3035 /**************************************************************************
3036 * waveOutMessage [MMSYSTEM.421]
3038 DWORD WINAPI
waveOutMessage32(HWAVEOUT32 hWaveOut
, UINT32 uMessage
,
3039 DWORD dwParam1
, DWORD dwParam2
)
3041 LPWAVEOPENDESC lpDesc
;
3043 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3044 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3046 case WODM_GETNUMDEVS
:
3048 case WODM_GETVOLUME
:
3050 case WODM_GETPLAYBACKRATE
:
3051 case WODM_SETVOLUME
:
3053 case WODM_SETPLAYBACKRATE
:
3057 case WODM_UNPREPARE
:
3060 /* no argument conversion needed */
3063 return waveOutWrite32(hWaveOut
,(LPWAVEHDR
)dwParam1
,dwParam2
);
3064 case WODM_GETDEVCAPS
:
3065 /* FIXME: UNICODE/ANSI? */
3066 return waveOutGetDevCaps32A(hWaveOut
,(LPWAVEOUTCAPS32A
)dwParam1
,dwParam2
);
3068 FIXME(mmsys
,"can't handle WODM_OPEN, please report.\n");
3071 ERR(mmsys
,"(0x%04x,0x%04x,%08lx,%08lx): unhandled message\n",
3072 hWaveOut
,uMessage
,dwParam1
,dwParam2
);
3075 return wodMessage( lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3078 /**************************************************************************
3079 * waveOutMessage [MMSYSTEM.421]
3081 DWORD WINAPI
waveOutMessage16(HWAVEOUT16 hWaveOut
, UINT16 uMessage
,
3082 DWORD dwParam1
, DWORD dwParam2
)
3084 LPWAVEOPENDESC lpDesc
;
3086 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
3087 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3089 case WODM_GETNUMDEVS
:
3090 case WODM_SETVOLUME
:
3092 case WODM_SETPLAYBACKRATE
:
3097 /* no argument conversion needed */
3100 return waveOutGetPosition16(hWaveOut
,(LPMMTIME16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3101 case WODM_GETVOLUME
:
3102 return waveOutGetVolume16(hWaveOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
3104 return waveOutGetPitch16(hWaveOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
3105 case WODM_GETPLAYBACKRATE
:
3106 return waveOutGetPlaybackRate16(hWaveOut
,(LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
3107 case WODM_GETDEVCAPS
:
3108 return waveOutGetDevCaps16(hWaveOut
,(LPWAVEOUTCAPS16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3110 return waveOutPrepareHeader16(hWaveOut
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3111 case WODM_UNPREPARE
:
3112 return waveOutUnprepareHeader16(hWaveOut
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3114 return waveOutWrite16(hWaveOut
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3116 FIXME(mmsys
,"can't handle WODM_OPEN, please report.\n");
3119 ERR(mmsys
,"(0x%04x,0x%04x,%08lx,%08lx): unhandled message\n",
3120 hWaveOut
,uMessage
,dwParam1
,dwParam2
);
3122 return wodMessage( lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3125 /**************************************************************************
3126 * waveInGetNumDevs [WINMM.151]
3128 UINT32 WINAPI
waveInGetNumDevs32()
3130 return waveInGetNumDevs16();
3133 /**************************************************************************
3134 * waveInGetNumDevs [MMSYSTEM.501]
3136 UINT16 WINAPI
waveInGetNumDevs16()
3139 TRACE(mmsys
, "waveInGetNumDevs\n");
3140 count
+= widMessage(0, WIDM_GETNUMDEVS
, 0L, 0L, 0L);
3141 TRACE(mmsys
, "waveInGetNumDevs return %u \n", count
);
3145 /**************************************************************************
3146 * waveInGetDevCapsA [WINMM.147]
3148 UINT32 WINAPI
waveInGetDevCaps32W(UINT32 uDeviceID
, LPWAVEINCAPS32W lpCaps
, UINT32 uSize
)
3151 UINT32 ret
= waveInGetDevCaps16(uDeviceID
,&wic16
,uSize
);
3153 lpCaps
->wMid
= wic16
.wMid
;
3154 lpCaps
->wPid
= wic16
.wPid
;
3155 lpCaps
->vDriverVersion
= wic16
.vDriverVersion
;
3156 lstrcpyAtoW(lpCaps
->szPname
,wic16
.szPname
);
3157 lpCaps
->dwFormats
= wic16
.dwFormats
;
3158 lpCaps
->wChannels
= wic16
.wChannels
;
3162 /**************************************************************************
3163 * waveInGetDevCapsA [WINMM.146]
3165 UINT32 WINAPI
waveInGetDevCaps32A(UINT32 uDeviceID
, LPWAVEINCAPS32A lpCaps
, UINT32 uSize
)
3168 UINT32 ret
= waveInGetDevCaps16(uDeviceID
,&wic16
,uSize
);
3170 lpCaps
->wMid
= wic16
.wMid
;
3171 lpCaps
->wPid
= wic16
.wPid
;
3172 lpCaps
->vDriverVersion
= wic16
.vDriverVersion
;
3173 strcpy(lpCaps
->szPname
,wic16
.szPname
);
3174 lpCaps
->dwFormats
= wic16
.dwFormats
;
3175 lpCaps
->wChannels
= wic16
.wChannels
;
3178 /**************************************************************************
3179 * waveInGetDevCaps [MMSYSTEM.502]
3181 UINT16 WINAPI
waveInGetDevCaps16(UINT16 uDeviceID
, LPWAVEINCAPS16 lpCaps
, UINT16 uSize
)
3183 TRACE(mmsys
, "waveInGetDevCaps\n");
3184 return widMessage(uDeviceID
, WIDM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
3187 /**************************************************************************
3188 * waveInGetErrorTextA [WINMM.148]
3190 UINT32 WINAPI
waveInGetErrorText32A(UINT32 uError
, LPSTR lpText
, UINT32 uSize
)
3192 TRACE(mmsys
, "waveInGetErrorText\n");
3193 return(waveGetErrorText(uError
, lpText
, uSize
));
3196 /**************************************************************************
3197 * waveInGetErrorTextW [WINMM.149]
3199 UINT32 WINAPI
waveInGetErrorText32W(UINT32 uError
, LPWSTR lpText
, UINT32 uSize
)
3201 LPSTR txt
= HeapAlloc(GetProcessHeap(),0,uSize
);
3202 UINT32 ret
= waveGetErrorText(uError
, txt
, uSize
);
3204 lstrcpyAtoW(lpText
,txt
);
3205 HeapFree(GetProcessHeap(),0,txt
);
3209 /**************************************************************************
3210 * waveInGetErrorText [MMSYSTEM.503]
3212 UINT16 WINAPI
waveInGetErrorText16(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
3214 TRACE(mmsys
, "waveInGetErrorText\n");
3215 return(waveGetErrorText(uError
, lpText
, uSize
));
3219 /**************************************************************************
3220 * waveInOpen [WINMM.154]
3222 UINT32 WINAPI
waveInOpen32(HWAVEIN32
* lphWaveIn
, UINT32 uDeviceID
,
3223 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
,
3224 DWORD dwInstance
, DWORD dwFlags
)
3227 UINT32 ret
=waveInOpen16(&hwin16
,uDeviceID
,lpFormat
,dwCallback
,dwInstance
,dwFlags
);
3228 if (lphWaveIn
) *lphWaveIn
= hwin16
;
3232 /**************************************************************************
3233 * waveInOpen [MMSYSTEM.504]
3235 UINT16 WINAPI
waveInOpen16(HWAVEIN16
* lphWaveIn
, UINT16 uDeviceID
,
3236 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
,
3237 DWORD dwInstance
, DWORD dwFlags
)
3240 LPWAVEOPENDESC lpDesc
;
3242 BOOL32 bMapperFlg
= FALSE
;
3243 TRACE(mmsys
, "(%p, %d, %p, %08lX, %08lX, %08lX);\n",
3244 lphWaveIn
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
3245 if (dwFlags
& WAVE_FORMAT_QUERY
)
3246 TRACE(mmsys
, "WAVE_FORMAT_QUERY requested !\n");
3247 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
3248 TRACE(mmsys
, "WAVE_MAPPER mode requested !\n");
3252 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
3253 hWaveIn
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
3254 if (lphWaveIn
!= NULL
) *lphWaveIn
= hWaveIn
;
3255 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3256 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
3257 lpDesc
->hWave
= hWaveIn
;
3258 lpDesc
->lpFormat
= lpFormat
;
3259 lpDesc
->dwCallBack
= dwCallback
;
3260 lpDesc
->dwInstance
= dwInstance
;
3261 while(uDeviceID
< MAXWAVEDRIVERS
) {
3262 dwRet
= widMessage(uDeviceID
, WIDM_OPEN
,
3263 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
3264 if (dwRet
== MMSYSERR_NOERROR
) break;
3265 if (!bMapperFlg
) break;
3267 TRACE(mmsys
, "WAVE_MAPPER mode ! try next driver...\n");
3269 lpDesc
->uDeviceID
= uDeviceID
;
3270 if (dwFlags
& WAVE_FORMAT_QUERY
) {
3271 TRACE(mmsys
, "End of WAVE_FORMAT_QUERY !\n");
3272 dwRet
= waveInClose16(hWaveIn
);
3277 /**************************************************************************
3278 * waveInClose [WINMM.145]
3280 UINT32 WINAPI
waveInClose32(HWAVEIN32 hWaveIn
)
3282 return waveInClose16(hWaveIn
);
3284 /**************************************************************************
3285 * waveInClose [MMSYSTEM.505]
3287 UINT16 WINAPI
waveInClose16(HWAVEIN16 hWaveIn
)
3289 LPWAVEOPENDESC lpDesc
;
3291 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3292 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3293 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3294 return widMessage(lpDesc
->uDeviceID
, WIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
3297 /**************************************************************************
3298 * waveInPrepareHeader [WINMM.155]
3300 UINT32 WINAPI
waveInPrepareHeader32(HWAVEIN32 hWaveIn
,
3301 WAVEHDR
* lpWaveInHdr
, UINT32 uSize
)
3303 LPWAVEOPENDESC lpDesc
;
3305 TRACE(mmsys
, "(%04X, %p, %u);\n",
3306 hWaveIn
, lpWaveInHdr
, uSize
);
3307 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3308 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3309 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3310 lpWaveInHdr
= lpWaveInHdr
;
3311 lpWaveInHdr
->lpNext
= NULL
;
3312 lpWaveInHdr
->dwBytesRecorded
= 0;
3313 TRACE(mmsys
, "lpData=%p size=%lu \n",
3314 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3315 return widMessage(lpDesc
->uDeviceID
,WIDM_PREPARE
,lpDesc
->dwInstance
,
3316 (DWORD
)lpWaveInHdr
, uSize
);
3318 /**************************************************************************
3319 * waveInPrepareHeader [MMSYSTEM.506]
3321 UINT16 WINAPI
waveInPrepareHeader16(HWAVEIN16 hWaveIn
,
3322 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
3324 LPWAVEOPENDESC lpDesc
;
3325 LPBYTE saveddata
= lpWaveInHdr
->lpData
;
3328 TRACE(mmsys
, "(%04X, %p, %u);\n",
3329 hWaveIn
, lpWaveInHdr
, uSize
);
3330 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3331 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3332 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3333 lpWaveInHdr
= lpWaveInHdr
;
3334 lpWaveInHdr
->lpNext
= NULL
;
3335 lpWaveInHdr
->dwBytesRecorded
= 0;
3337 TRACE(mmsys
, "lpData=%p size=%lu \n",
3338 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3339 lpWaveInHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveInHdr
->lpData
);
3340 ret
= widMessage(lpDesc
->uDeviceID
,WIDM_PREPARE
,lpDesc
->dwInstance
,
3341 (DWORD
)lpWaveInHdr
,uSize
);
3342 lpWaveInHdr
->lpData
= saveddata
;
3347 /**************************************************************************
3348 * waveInUnprepareHeader [WINMM.159]
3350 UINT32 WINAPI
waveInUnprepareHeader32(HWAVEIN32 hWaveIn
,
3351 WAVEHDR
* lpWaveInHdr
, UINT32 uSize
)
3353 LPWAVEOPENDESC lpDesc
;
3355 TRACE(mmsys
, "(%04X, %p, %u);\n",
3356 hWaveIn
, lpWaveInHdr
, uSize
);
3357 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3358 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3359 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3360 /*USER_HEAP_FREE(HIWORD((DWORD)lpWaveInHdr->lpData)); FIXME */
3361 lpWaveInHdr
->lpData
= NULL
;
3362 lpWaveInHdr
->lpNext
= NULL
;
3363 return widMessage(lpDesc
->uDeviceID
,WIDM_UNPREPARE
,lpDesc
->dwInstance
,
3364 (DWORD
)lpWaveInHdr
, uSize
);
3366 /**************************************************************************
3367 * waveInUnprepareHeader [MMSYSTEM.507]
3369 UINT16 WINAPI
waveInUnprepareHeader16(HWAVEIN16 hWaveIn
,
3370 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
3372 LPWAVEOPENDESC lpDesc
;
3374 TRACE(mmsys
, "(%04X, %p, %u);\n",
3375 hWaveIn
, lpWaveInHdr
, uSize
);
3376 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3377 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3378 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3379 /*USER_HEAP_FREE(HIWORD((DWORD)lpWaveInHdr->lpData)); FIXME */
3380 lpWaveInHdr
->lpData
= NULL
;
3381 lpWaveInHdr
->lpNext
= NULL
;
3382 return widMessage(lpDesc
->uDeviceID
,WIDM_UNPREPARE
,lpDesc
->dwInstance
,
3383 (DWORD
)lpWaveInHdr
, uSize
);
3386 /**************************************************************************
3387 * waveInAddBuffer [WINMM.144]
3389 UINT32 WINAPI
waveInAddBuffer32(HWAVEIN32 hWaveIn
,
3390 WAVEHDR
* lpWaveInHdr
, UINT32 uSize
)
3392 LPWAVEOPENDESC lpDesc
;
3394 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
3395 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3396 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3397 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3398 lpWaveInHdr
->lpNext
= NULL
;
3399 lpWaveInHdr
->dwBytesRecorded
= 0;
3400 TRACE(mmsys
, "lpData=%p size=%lu \n",
3401 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3402 return widMessage(lpDesc
->uDeviceID
, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
3403 (DWORD
)lpWaveInHdr
, uSize
);
3407 /**************************************************************************
3408 * waveInAddBuffer [MMSYSTEM.508]
3410 UINT16 WINAPI
waveInAddBuffer16(HWAVEIN16 hWaveIn
,
3411 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
3413 LPWAVEOPENDESC lpDesc
;
3416 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
3417 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3418 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3419 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
3420 lpWaveInHdr
->lpNext
= NULL
;
3421 lpWaveInHdr
->dwBytesRecorded
= 0;
3422 lpWaveInHdr
->lpData
= PTR_SEG_TO_LIN(lpWaveInHdr
->lpData
);
3423 TRACE(mmsys
, "lpData=%p size=%lu \n",
3424 lpWaveInHdr
->lpData
, lpWaveInHdr
->dwBufferLength
);
3425 ret
= widMessage(lpDesc
->uDeviceID
, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
3426 (DWORD
)lpWaveInHdr
, uSize
);
3427 /*lpWaveInHdr->lpData = saveddata;*/
3431 /**************************************************************************
3432 * waveInStart [WINMM.157]
3434 UINT32 WINAPI
waveInStart32(HWAVEIN32 hWaveIn
)
3436 return waveInStart16(hWaveIn
);
3439 /**************************************************************************
3440 * waveInStart [MMSYSTEM.509]
3442 UINT16 WINAPI
waveInStart16(HWAVEIN16 hWaveIn
)
3444 LPWAVEOPENDESC lpDesc
;
3446 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3447 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3448 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3449 return widMessage(lpDesc
->uDeviceID
,WIDM_START
,lpDesc
->dwInstance
,0,0);
3452 /**************************************************************************
3453 * waveInStop [WINMM.158]
3455 UINT32 WINAPI
waveInStop32(HWAVEIN32 hWaveIn
)
3457 return waveInStop16(hWaveIn
);
3460 /**************************************************************************
3461 * waveInStop [MMSYSTEM.510]
3463 UINT16 WINAPI
waveInStop16(HWAVEIN16 hWaveIn
)
3465 LPWAVEOPENDESC lpDesc
;
3467 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3468 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3469 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3470 return widMessage(lpDesc
->uDeviceID
, WIDM_STOP
, lpDesc
->dwInstance
, 0L, 0L);
3473 /**************************************************************************
3474 * waveInReset [WINMM.156]
3476 UINT32 WINAPI
waveInReset32(HWAVEIN32 hWaveIn
)
3478 return waveInReset16(hWaveIn
);
3481 /**************************************************************************
3482 * waveInReset [MMSYSTEM.511]
3484 UINT16 WINAPI
waveInReset16(HWAVEIN16 hWaveIn
)
3486 LPWAVEOPENDESC lpDesc
;
3488 TRACE(mmsys
, "(%04X)\n", hWaveIn
);
3489 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3490 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3491 return widMessage(lpDesc
->uDeviceID
,WIDM_RESET
,lpDesc
->dwInstance
,0,0);
3494 /**************************************************************************
3495 * waveInGetPosition [WINMM.152]
3497 UINT32 WINAPI
waveInGetPosition32(HWAVEIN32 hWaveIn
, LPMMTIME32 lpTime
,
3501 UINT32 ret
= waveInGetPosition16(hWaveIn
,&mmt16
,uSize
);
3503 MMSYSTEM_MMTIME16to32(lpTime
,&mmt16
);
3507 /**************************************************************************
3508 * waveInGetPosition [MMSYSTEM.512]
3510 UINT16 WINAPI
waveInGetPosition16(HWAVEIN16 hWaveIn
,LPMMTIME16 lpTime
,
3513 LPWAVEOPENDESC lpDesc
;
3515 TRACE(mmsys
, "(%04X, %p, %u);\n", hWaveIn
, lpTime
, uSize
);
3516 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3517 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3518 return widMessage(lpDesc
->uDeviceID
, WIDM_GETPOS
, lpDesc
->dwInstance
,
3519 (DWORD
)lpTime
, (DWORD
)uSize
);
3522 /**************************************************************************
3523 * waveInGetID [WINMM.150]
3525 UINT32 WINAPI
waveInGetID32(HWAVEIN32 hWaveIn
, UINT32
* lpuDeviceID
)
3527 LPWAVEOPENDESC lpDesc
;
3529 TRACE(mmsys
, "waveInGetID\n");
3530 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3531 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3532 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3533 *lpuDeviceID
= lpDesc
->uDeviceID
;
3538 /**************************************************************************
3539 * waveInGetID [MMSYSTEM.513]
3541 UINT16 WINAPI
waveInGetID16(HWAVEIN16 hWaveIn
, UINT16
* lpuDeviceID
)
3543 LPWAVEOPENDESC lpDesc
;
3545 TRACE(mmsys
, "waveInGetID\n");
3546 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
3547 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3548 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3549 *lpuDeviceID
= lpDesc
->uDeviceID
;
3553 /**************************************************************************
3554 * waveInMessage [WINMM.153]
3556 DWORD WINAPI
waveInMessage32(HWAVEIN32 hWaveIn
, UINT32 uMessage
,
3557 DWORD dwParam1
, DWORD dwParam2
)
3559 LPWAVEOPENDESC lpDesc
;
3561 FIXME(mmsys
, "(%04X, %04X, %08lX, %08lX),FIXME!\n",
3562 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
3563 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3564 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3567 FIXME(mmsys
, "cannot handle WIDM_OPEN, please report.\n");
3569 case WIDM_GETNUMDEVS
:
3576 case WIDM_UNPREPARE
:
3577 case WIDM_ADDBUFFER
:
3579 /* no argument conversion needed */
3581 case WIDM_GETDEVCAPS
:
3582 /*FIXME: ANSI/UNICODE */
3583 return waveInGetDevCaps32A(hWaveIn
,(LPWAVEINCAPS32A
)dwParam1
,dwParam2
);
3585 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
3586 hWaveIn
,uMessage
,dwParam1
,dwParam2
);
3589 return widMessage(lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3592 /**************************************************************************
3593 * waveInMessage [MMSYSTEM.514]
3595 DWORD WINAPI
waveInMessage16(HWAVEIN16 hWaveIn
, UINT16 uMessage
,
3596 DWORD dwParam1
, DWORD dwParam2
)
3598 LPWAVEOPENDESC lpDesc
;
3600 FIXME(mmsys
, "(%04X, %04X, %08lX, %08lX),FIXME!\n",
3601 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
3602 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
3603 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
3606 FIXME(mmsys
,"cannot handle WIDM_OPEN, please report.\n");
3608 case WIDM_GETNUMDEVS
:
3614 /* no argument conversion needed */
3616 case WIDM_GETDEVCAPS
:
3617 return waveInGetDevCaps16(hWaveIn
,(LPWAVEINCAPS16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3619 return waveInGetPosition16(hWaveIn
,(LPMMTIME16
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3621 return waveInPrepareHeader16(hWaveIn
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3622 case WIDM_UNPREPARE
:
3623 return waveInUnprepareHeader16(hWaveIn
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3624 case WIDM_ADDBUFFER
:
3625 return waveInAddBuffer16(hWaveIn
,(LPWAVEHDR
)PTR_SEG_TO_LIN(dwParam1
),dwParam2
);
3627 ERR(mmsys
,"(%04x,%04x,%08lx,%08lx): unhandled message\n",
3628 hWaveIn
,uMessage
,dwParam1
,dwParam2
);
3631 return widMessage(lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
3634 /**************************************************************************
3635 * DrvOpen [MMSYSTEM.1100]
3637 HDRVR16 WINAPI
DrvOpen(LPSTR lpDriverName
, LPSTR lpSectionName
, LPARAM lParam
)
3639 TRACE(mmsys
, "('%s', '%s', %08lX);\n",
3640 lpDriverName
, lpSectionName
, lParam
);
3641 return OpenDriver(lpDriverName
, lpSectionName
, lParam
);
3645 /**************************************************************************
3646 * DrvClose [MMSYSTEM.1101]
3648 LRESULT WINAPI
DrvClose(HDRVR16 hDrvr
, LPARAM lParam1
, LPARAM lParam2
)
3650 TRACE(mmsys
, "(%04X, %08lX, %08lX);\n", hDrvr
, lParam1
, lParam2
);
3651 return CloseDriver(hDrvr
, lParam1
, lParam2
);
3655 /**************************************************************************
3656 * DrvSendMessage [MMSYSTEM.1102]
3658 LRESULT WINAPI
DrvSendMessage(HDRVR16 hDriver
, WORD msg
, LPARAM lParam1
,
3661 DWORD dwDriverID
= 0;
3662 TRACE(mmsys
, "(%04X, %04X, %08lX, %08lX);\n",
3663 hDriver
, msg
, lParam1
, lParam2
);
3664 return CDAUDIO_DriverProc(dwDriverID
, hDriver
, msg
, lParam1
, lParam2
);
3667 /**************************************************************************
3668 * DrvGetModuleHandle [MMSYSTEM.1103]
3670 HANDLE16 WINAPI
DrvGetModuleHandle(HDRVR16 hDrvr
)
3672 TRACE(mmsys
, "(%04X);\n", hDrvr
);
3677 /**************************************************************************
3678 * DrvDefDriverProc [MMSYSTEM.1104]
3680 LRESULT WINAPI
DrvDefDriverProc(DWORD dwDriverID
, HDRVR16 hDriv
, WORD wMsg
,
3681 DWORD dwParam1
, DWORD dwParam2
)
3683 return DefDriverProc(dwDriverID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
3686 /**************************************************************************
3687 * mmThreadCreate [MMSYSTEM.1120]
3689 LRESULT WINAPI
mmThreadCreate16(LPVOID x1
, LPWORD x2
, DWORD x3
, DWORD x4
) {
3690 FIXME(mmsys
,"(%p,%p,%08lx,%08lx): stub!\n",x1
,x2
,x3
,x4
);
3695 /**************************************************************************
3696 * mmThreadGetTask [MMSYSTEM.1125]
3698 LRESULT WINAPI
mmThreadGetTask16(WORD hnd
) {
3699 FIXME(mmsys
,"(%04x): stub!\n",hnd
);
3700 return GetCurrentTask();
3703 /**************************************************************************
3704 * mmThreadSignal [MMSYSTEM.1121]
3706 LRESULT WINAPI
mmThreadSignal16(WORD hnd
) {
3707 FIXME(mmsys
,"(%04x): stub!\n",hnd
);
3711 /**************************************************************************
3712 * mmTaskCreate [MMSYSTEM.900]
3714 LRESULT WINAPI
mmTaskCreate16(LPWORD lphnd
,DWORD x1
,DWORD x2
) {
3715 FIXME(mmsys
,"(%p,%08lx,%08lx): stub!\n",lphnd
,x1
,x2
);
3720 /**************************************************************************
3721 * mmTaskSignal [MMSYSTEM.903]
3723 LRESULT WINAPI
mmTaskSignal16(HTASK16 ht
) {
3724 FIXME(mmsys
,"(%04x): stub!\n",ht
);
3725 return PostAppMessage16(ht
,0x400,0,0);
3728 /**************************************************************************
3729 * mciDriverYield [MMSYSTEM.710]
3731 LRESULT WINAPI
mciDriverYield16(HANDLE16 hnd
) {
3732 FIXME(mmsys
,"(%04x): stub!\n",hnd
);