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>
30 static int InstalledCount
;
31 static int InstalledListLen
;
32 static LPSTR lpInstallNames
= NULL
;
34 MCI_OPEN_DRIVER_PARMS mciDrv
[MAXMCIDRIVERS
];
35 /* struct below is to remember alias/devicenames for mcistring.c
36 * FIXME: should use some internal struct ...
38 MCI_OPEN_PARMS mciOpenDrv
[MAXMCIDRIVERS
];
40 UINT16
midiGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
);
41 UINT16
waveGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
);
42 LONG
DrvDefDriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
43 DWORD dwParam1
, DWORD dwParam2
);
45 LONG
WAVE_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
46 DWORD dwParam1
, DWORD dwParam2
);
47 LONG
MIDI_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
48 DWORD dwParam1
, DWORD dwParam2
);
49 LONG
CDAUDIO_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
50 DWORD dwParam1
, DWORD dwParam2
);
51 LONG
ANIM_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
52 DWORD dwParam1
, DWORD dwParam2
);
55 #define GetDrv(wDevID) (&mciDrv[MMSYSTEM_DevIDToIndex(wDevID)])
56 #define GetOpenDrv(wDevID) (&mciOpenDrv[MMSYSTEM_DevIDToIndex(wDevID)])
58 /* The wDevID's returned by wine were originally in the range
59 * 0 - (MAXMCIDRIVERS - 1) and used directly as array indices.
60 * Unfortunately, ms-windows uses wDevID of zero to indicate
61 * errors. Now, multimedia drivers must pass the wDevID through
62 * MMSYSTEM_DevIDToIndex to get an index in that range. An
63 * aribtrary value, MMSYSTEM_MAGIC is added to the wDevID seen
64 * by the windows programs.
67 #define MMSYSTEM_MAGIC 0x0F00
69 /**************************************************************************
70 * MMSYSTEM_DevIDToIndex [internal]
72 int MMSYSTEM_DevIDToIndex(UINT16 wDevID
) {
73 return wDevID
- MMSYSTEM_MAGIC
;
76 /**************************************************************************
77 * MMSYSTEM_FirstDevId [internal]
79 UINT16
MMSYSTEM_FirstDevID(void)
81 return MMSYSTEM_MAGIC
;
84 /**************************************************************************
85 * MMSYSTEM_NextDevId [internal]
87 UINT16
MMSYSTEM_NextDevID(UINT16 wDevID
) {
91 /**************************************************************************
92 * MMSYSTEM_DevIdValid [internal]
94 BOOL32
MMSYSTEM_DevIDValid(UINT16 wDevID
) {
95 return wDevID
>= 0x0F00 && wDevID
< (0x0F00 + MAXMCIDRIVERS
);
98 /**************************************************************************
99 * MMSYSTEM_WEP [MMSYSTEM.1]
101 int MMSYSTEM_WEP(HINSTANCE16 hInstance
, WORD wDataSeg
,
102 WORD cbHeapSize
, LPSTR lpCmdLine
)
104 fprintf(stderr
, "STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance
);
108 /**************************************************************************
109 * sndPlaySound [MMSYSTEM.2]
111 BOOL16
sndPlaySound(LPCSTR lpszSoundName
, UINT16 uFlags
)
119 dprintf_mmsys(stddeb
, "sndPlaySound // SoundName='%s' uFlags=%04X !\n",
120 lpszSoundName
, uFlags
);
121 if (lpszSoundName
== NULL
) {
122 dprintf_mmsys(stddeb
, "sndPlaySound // Stop !\n");
125 hmmio
= mmioOpen((LPSTR
)lpszSoundName
, NULL
,
126 MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
128 if (uFlags
& SND_MEMORY
) {
129 dprintf_mmsys(stddeb
, "sndPlaySound // SND_MEMORY flag not implemented!\n");
135 dprintf_mmsys(stddeb
, "sndPlaySound // searching in SystemSound List !\n");
136 GetProfileString32A("Sounds", (LPSTR
)lpszSoundName
, "", str
, sizeof(str
));
137 if (strlen(str
) == 0) return FALSE
;
138 if ( (ptr
= (LPSTR
)strchr(str
, ',')) != NULL
) *ptr
= '\0';
139 hmmio
= mmioOpen(str
, NULL
, MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
142 dprintf_mmsys(stddeb
, "sndPlaySound // can't find SystemSound='%s' !\n", str
);
147 if (mmioDescend(hmmio
, &ckMainRIFF
, NULL
, 0) == 0)
149 dprintf_mmsys(stddeb
, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
150 (LPSTR
)&ckMainRIFF
.ckid
, (LPSTR
)&ckMainRIFF
.fccType
, ckMainRIFF
.cksize
);
152 if ((ckMainRIFF
.ckid
== FOURCC_RIFF
) &&
153 (ckMainRIFF
.fccType
== mmioFOURCC('W', 'A', 'V', 'E')))
157 mmckInfo
.ckid
= mmioFOURCC('f', 'm', 't', ' ');
159 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
161 PCMWAVEFORMAT pcmWaveFormat
;
163 dprintf_mmsys(stddeb
, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
164 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
166 if (mmioRead(hmmio
, (HPSTR
) &pcmWaveFormat
,
167 (long) sizeof(PCMWAVEFORMAT
)) == (long) sizeof(PCMWAVEFORMAT
))
170 dprintf_mmsys(stddeb
, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat
.wf
.wFormatTag
);
171 dprintf_mmsys(stddeb
, "sndPlaySound // nChannels=%d \n", pcmWaveFormat
.wf
.nChannels
);
172 dprintf_mmsys(stddeb
, "sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat
.wf
.nSamplesPerSec
);
173 dprintf_mmsys(stddeb
, "sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat
.wf
.nAvgBytesPerSec
);
174 dprintf_mmsys(stddeb
, "sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat
.wf
.nBlockAlign
);
175 dprintf_mmsys(stddeb
, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat
.wBitsPerSample
);
177 mmckInfo
.ckid
= mmioFOURCC('d', 'a', 't', 'a');
178 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
180 LPWAVEFORMAT lpFormat
= (LPWAVEFORMAT
) SEGPTR_ALLOC(sizeof(PCMWAVEFORMAT
));
181 LPWAVEOPENDESC lpWaveDesc
= (LPWAVEOPENDESC
) SEGPTR_ALLOC(sizeof(WAVEOPENDESC
));
184 dprintf_mmsys(stddeb
, "sndPlaySound // Chunk Found \
185 ckid=%.4s fccType=%.4s cksize=%08lX \n", (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
187 pcmWaveFormat
.wf
.nAvgBytesPerSec
= pcmWaveFormat
.wf
.nSamplesPerSec
*
188 pcmWaveFormat
.wf
.nBlockAlign
;
189 memcpy(lpFormat
, &pcmWaveFormat
, sizeof(PCMWAVEFORMAT
));
191 lpWaveDesc
->hWave
= 0;
192 lpWaveDesc
->lpFormat
= (LPWAVEFORMAT
) SEGPTR_GET(lpFormat
);
194 dwRet
= wodMessage( 0,
195 WODM_OPEN
, 0, (DWORD
)SEGPTR_GET(lpWaveDesc
), CALLBACK_NULL
);
196 SEGPTR_FREE(lpFormat
);
197 SEGPTR_FREE(lpWaveDesc
);
199 if (dwRet
== MMSYSERR_NOERROR
)
201 LPWAVEHDR lpWaveHdr
= (LPWAVEHDR
) SEGPTR_ALLOC(sizeof(WAVEHDR
));
202 SEGPTR spWaveHdr
= SEGPTR_GET(lpWaveHdr
);
204 INT32 count
, bufsize
;
207 hData
= GlobalAlloc16(GMEM_MOVEABLE
, bufsize
);
208 lpWaveHdr
->lpData
= (LPSTR
) WIN16_GlobalLock16(hData
);
209 lpWaveHdr
->dwBufferLength
= bufsize
;
210 lpWaveHdr
->dwUser
= 0L;
211 lpWaveHdr
->dwFlags
= 0L;
212 lpWaveHdr
->dwLoops
= 0L;
214 dwRet
= wodMessage( 0,
215 WODM_PREPARE
, 0, (DWORD
)spWaveHdr
, sizeof(WAVEHDR
));
216 if (dwRet
== MMSYSERR_NOERROR
)
220 count
= mmioRead(hmmio
, PTR_SEG_TO_LIN(lpWaveHdr
->lpData
), bufsize
);
221 if (count
< 1) break;
222 lpWaveHdr
->dwBufferLength
= count
;
223 /* lpWaveHdr->dwBytesRecorded = count; */
224 wodMessage( 0, WODM_WRITE
,
225 0, (DWORD
)spWaveHdr
, sizeof(WAVEHDR
));
228 WODM_UNPREPARE
, 0, (DWORD
)spWaveHdr
, sizeof(WAVEHDR
));
230 WODM_CLOSE
, 0, 0L, 0L);
234 else dprintf_mmsys(stddeb
, "sndPlaySound // can't prepare WaveOut device !\n");
236 GlobalUnlock16(hData
);
239 SEGPTR_FREE(lpWaveHdr
);
247 if (hmmio
!= 0) mmioClose(hmmio
, 0);
251 /**************************************************************************
252 * mmsystemGetVersion [MMSYSTEM.5]
254 WORD
mmsystemGetVersion()
256 dprintf_mmsys(stddeb
, "mmsystemGetVersion // 0.4.0 ...?... :-) !\n");
260 /**************************************************************************
261 * DriverProc [MMSYSTEM.6]
263 LRESULT
DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
264 DWORD dwParam1
, DWORD dwParam2
)
266 return DrvDefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
269 /**************************************************************************
270 * DriverCallback [MMSYSTEM.31]
272 BOOL16
DriverCallback(DWORD dwCallBack
, UINT16 uFlags
, HANDLE16 hDev
,
273 WORD wMsg
, DWORD dwUser
, DWORD dwParam1
, DWORD dwParam2
)
275 LPWAVEOPENDESC lpDesc
;
277 dprintf_mmsys(stddeb
, "DriverCallback(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
278 dwCallBack
, uFlags
, hDev
, wMsg
, dwUser
, dwParam1
, dwParam2
);
279 switch(uFlags
& DCB_TYPEMASK
) {
281 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_NULL !\n");
284 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_WINDOW = %04lX handle = %04X!\n",dwCallBack
,hDev
);
285 if (!IsWindow32(dwCallBack
)) return FALSE
;
286 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hDev
);
287 if (lpDesc
== NULL
) return FALSE
;
289 PostMessage16((HWND16
)dwCallBack
, wMsg
, hDev
, dwParam1
);
292 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_TASK !\n");
295 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_FUNCTION !\n");
296 CallDriverCallback( (FARPROC16
)dwCallBack
, hDev
, wMsg
,
297 dwUser
, dwParam1
, dwParam2
);
303 /**************************************************************************
304 * auxGetNumDevs [MMSYSTEM.350]
306 UINT16
auxGetNumDevs()
309 dprintf_mmsys(stddeb
, "auxGetNumDevs !\n");
310 count
+= auxMessage(0, AUXDM_GETNUMDEVS
, 0L, 0L, 0L);
311 dprintf_mmsys(stddeb
, "auxGetNumDevs return %u \n", count
);
315 /**************************************************************************
316 * auxGetDevCaps [MMSYSTEM.351]
318 UINT16
auxGetDevCaps(UINT16 uDeviceID
, AUXCAPS
* lpCaps
, UINT16 uSize
)
320 dprintf_mmsys(stddeb
, "auxGetDevCaps(%04X, %p, %d) !\n",
321 uDeviceID
, lpCaps
, uSize
);
322 return auxMessage(uDeviceID
, AUXDM_GETDEVCAPS
,
323 0L, (DWORD
)lpCaps
, (DWORD
)uSize
);
326 /**************************************************************************
327 * auxGetVolume [MMSYSTEM.352]
329 UINT16
auxGetVolume(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
331 dprintf_mmsys(stddeb
, "auxGetVolume(%04X, %p) !\n", uDeviceID
, lpdwVolume
);
332 return auxMessage(uDeviceID
, AUXDM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
335 /**************************************************************************
336 * auxSetVolume [MMSYSTEM.353]
338 UINT16
auxSetVolume(UINT16 uDeviceID
, DWORD dwVolume
)
340 dprintf_mmsys(stddeb
, "auxSetVolume(%04X, %08lX) !\n", uDeviceID
, dwVolume
);
341 return auxMessage(uDeviceID
, AUXDM_SETVOLUME
, 0L, dwVolume
, 0L);
344 /**************************************************************************
345 * auxOutMessage [MMSYSTEM.354]
347 DWORD
auxOutMessage(UINT16 uDeviceID
, UINT16 uMessage
, DWORD dw1
, DWORD dw2
)
349 dprintf_mmsys(stddeb
, "auxOutMessage(%04X, %04X, %08lX, %08lX)\n",
350 uDeviceID
, uMessage
, dw1
, dw2
);
351 return auxMessage(uDeviceID
, uMessage
, 0L, dw1
, dw2
);
354 /**************************************************************************
355 * mciGetErrorString [MMSYSTEM.706]
357 BOOL16
mciGetErrorString (DWORD wError
, LPSTR lpstrBuffer
, UINT16 uLength
)
360 dprintf_mmsys(stddeb
, "mciGetErrorString(%08lX, %p, %d);\n", wError
, lpstrBuffer
, uLength
);
361 if ((lpstrBuffer
== NULL
) || (uLength
< 1)) return(FALSE
);
362 lpstrBuffer
[0] = '\0';
364 case MCIERR_INVALID_DEVICE_ID
:
365 msgptr
= "Invalid MCI device ID. Use the ID returned when opening the MCI device.";
367 case MCIERR_UNRECOGNIZED_KEYWORD
:
368 msgptr
= "The driver cannot recognize the specified command parameter.";
370 case MCIERR_UNRECOGNIZED_COMMAND
:
371 msgptr
= "The driver cannot recognize the specified command.";
373 case MCIERR_HARDWARE
:
374 msgptr
= "There is a problem with your media device. Make sure it is working correctly or contact the device manufacturer.";
376 case MCIERR_INVALID_DEVICE_NAME
:
377 msgptr
= "The specified device is not open or is not recognized by MCI.";
379 case MCIERR_OUT_OF_MEMORY
:
380 msgptr
= "Not enough memory available for this task. \nQuit one or more applications to increase available memory, and then try again.";
382 case MCIERR_DEVICE_OPEN
:
383 msgptr
= "The device name is already being used as an alias by this application. Use a unique alias.";
385 case MCIERR_CANNOT_LOAD_DRIVER
:
386 msgptr
= "There is an undetectable problem in loading the specified device driver.";
388 case MCIERR_MISSING_COMMAND_STRING
:
389 msgptr
= "No command was specified.";
391 case MCIERR_PARAM_OVERFLOW
:
392 msgptr
= "The output string was to large to fit in the return buffer. Increase the size of the buffer.";
394 case MCIERR_MISSING_STRING_ARGUMENT
:
395 msgptr
= "The specified command requires a character-string parameter. Please provide one.";
397 case MCIERR_BAD_INTEGER
:
398 msgptr
= "The specified integer is invalid for this command.";
400 case MCIERR_PARSER_INTERNAL
:
401 msgptr
= "The device driver returned an invalid return type. Check with the device manufacturer about obtaining a new driver.";
403 case MCIERR_DRIVER_INTERNAL
:
404 msgptr
= "There is a problem with the device driver. Check with the device manufacturer about obtaining a new driver.";
406 case MCIERR_MISSING_PARAMETER
:
407 msgptr
= "The specified command requires a parameter. Please supply one.";
409 case MCIERR_UNSUPPORTED_FUNCTION
:
410 msgptr
= "The MCI device you are using does not support the specified command.";
412 case MCIERR_FILE_NOT_FOUND
:
413 msgptr
= "Cannot find the specified file. Make sure the path and filename are correct.";
415 case MCIERR_DEVICE_NOT_READY
:
416 msgptr
= "The device driver is not ready.";
418 case MCIERR_INTERNAL
:
419 msgptr
= "A problem occurred in initializing MCI. Try restarting Windows.";
422 msgptr
= "There is a problem with the device driver. The driver has closed. Cannot access error.";
424 case MCIERR_CANNOT_USE_ALL
:
425 msgptr
= "Cannot use 'all' as the device name with the specified command.";
427 case MCIERR_MULTIPLE
:
428 msgptr
= "Errors occurred in more than one device. Specify each command and device separately to determine which devices caused the error";
430 case MCIERR_EXTENSION_NOT_FOUND
:
431 msgptr
= "Cannot determine the device type from the given filename extension.";
433 case MCIERR_OUTOFRANGE
:
434 msgptr
= "The specified parameter is out of range for the specified command.";
436 case MCIERR_FLAGS_NOT_COMPATIBLE
:
437 msgptr
= "The specified parameters cannot be used together.";
439 case MCIERR_FILE_NOT_SAVED
:
440 msgptr
= "Cannot save the specified file. Make sure you have enough disk space or are still connected to the network.";
442 case MCIERR_DEVICE_TYPE_REQUIRED
:
443 msgptr
= "Cannot find the specified device. Make sure it is installed or that the device name is spelled correctly.";
445 case MCIERR_DEVICE_LOCKED
:
446 msgptr
= "The specified device is now being closed. Wait a few seconds, and then try again.";
448 case MCIERR_DUPLICATE_ALIAS
:
449 msgptr
= "The specified alias is already being used in this application. Use a unique alias.";
451 case MCIERR_BAD_CONSTANT
:
452 msgptr
= "The specified parameter is invalid for this command.";
454 case MCIERR_MUST_USE_SHAREABLE
:
455 msgptr
= "The device driver is already in use. To share it, use the 'shareable' parameter with each 'open' command.";
457 case MCIERR_MISSING_DEVICE_NAME
:
458 msgptr
= "The specified command requires an alias, file, driver, or device name. Please supply one.";
460 case MCIERR_BAD_TIME_FORMAT
:
461 msgptr
= "The specified value for the time format is invalid. Refer to the MCI documentation for valid formats.";
463 case MCIERR_NO_CLOSING_QUOTE
:
464 msgptr
= "A closing double-quotation mark is missing from the parameter value. Please supply one.";
466 case MCIERR_DUPLICATE_FLAGS
:
467 msgptr
= "A parameter or value was specified twice. Only specify it once.";
469 case MCIERR_INVALID_FILE
:
470 msgptr
= "The specified file cannot be played on the specified MCI device. The file may be corrupt, or not in the correct format.";
472 case MCIERR_NULL_PARAMETER_BLOCK
:
473 msgptr
= "A null parameter block was passed to MCI.";
475 case MCIERR_UNNAMED_RESOURCE
:
476 msgptr
= "Cannot save an unnamed file. Supply a filename.";
478 case MCIERR_NEW_REQUIRES_ALIAS
:
479 msgptr
= "You must specify an alias when using the 'new' parameter.";
481 case MCIERR_NOTIFY_ON_AUTO_OPEN
:
482 msgptr
= "Cannot use the 'notify' flag with auto-opened devices.";
484 case MCIERR_NO_ELEMENT_ALLOWED
:
485 msgptr
= "Cannot use a filename with the specified device.";
487 case MCIERR_NONAPPLICABLE_FUNCTION
:
488 msgptr
= "Cannot carry out the commands in the order specified. Correct the command sequence, and then try again.";
490 case MCIERR_ILLEGAL_FOR_AUTO_OPEN
:
491 msgptr
= "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again.";
493 case MCIERR_FILENAME_REQUIRED
:
494 msgptr
= "The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension.";
496 case MCIERR_EXTRA_CHARACTERS
:
497 msgptr
= "Cannot specify extra characters after a string enclosed in quotation marks.";
499 case MCIERR_DEVICE_NOT_INSTALLED
:
500 msgptr
= "The specified device is not installed on the system. Use the Drivers option in Control Panel to install the device.";
503 msgptr
= "Cannot access the specified file or MCI device. Try changing directories or restarting your computer.";
506 msgptr
= "Cannot access the specified file or MCI device because the application cannot change directories.";
508 case MCIERR_SET_DRIVE
:
509 msgptr
= "Cannot access specified file or MCI device because the application cannot change drives.";
511 case MCIERR_DEVICE_LENGTH
:
512 msgptr
= "Specify a device or driver name that is less than 79 characters.";
514 case MCIERR_DEVICE_ORD_LENGTH
:
515 msgptr
= "Specify a device or driver name that is less than 69 characters.";
517 case MCIERR_NO_INTEGER
:
518 msgptr
= "The specified command requires an integer parameter. Please provide one.";
520 case MCIERR_WAVE_OUTPUTSINUSE
:
521 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.";
523 case MCIERR_WAVE_SETOUTPUTINUSE
:
524 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.";
526 case MCIERR_WAVE_INPUTSINUSE
:
527 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.";
529 case MCIERR_WAVE_SETINPUTINUSE
:
530 msgptr
= "Cannot set the current wave device for recording because it is in use. Wait until the device is free, and then try again.";
532 case MCIERR_WAVE_OUTPUTUNSPECIFIED
:
533 msgptr
= "Any compatible waveform playback device may be used.";
535 case MCIERR_WAVE_INPUTUNSPECIFIED
:
536 msgptr
= "Any compatible waveform recording device may be used.";
538 case MCIERR_WAVE_OUTPUTSUNSUITABLE
:
539 msgptr
= "No wave device that can play files in the current format is installed. Use the Drivers option to install the wave device.";
541 case MCIERR_WAVE_SETOUTPUTUNSUITABLE
:
542 msgptr
= "The device you are trying to play to cannot recognize the current file format.";
544 case MCIERR_WAVE_INPUTSUNSUITABLE
:
545 msgptr
= "No wave device that can record files in the current format is installed. Use the Drivers option to install the wave device.";
547 case MCIERR_WAVE_SETINPUTUNSUITABLE
:
548 msgptr
= "The device you are trying to record from cannot recognize the current file format.";
550 case MCIERR_NO_WINDOW
:
551 msgptr
= "There is no display window.";
553 case MCIERR_CREATEWINDOW
:
554 msgptr
= "Could not create or use window.";
556 case MCIERR_FILE_READ
:
557 msgptr
= "Cannot read the specified file. Make sure the file is still present, or check your disk or network connection.";
559 case MCIERR_FILE_WRITE
:
560 msgptr
= "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network.";
562 case MCIERR_SEQ_DIV_INCOMPATIBLE
:
563 msgptr
= "The time formats of the \"song pointer\" and SMPTE are mutually exclusive. You can't use them together.";
565 case MCIERR_SEQ_NOMIDIPRESENT
:
566 msgptr
= "The system has no installed MIDI devices. Use the Drivers option from the Control Panel to install a MIDI driver.";
568 case MCIERR_SEQ_PORT_INUSE
:
569 msgptr
= "The specified MIDI port is already in use. Wait until it is free; the try again.";
571 case MCIERR_SEQ_PORT_MAPNODEVICE
:
572 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.";
574 case MCIERR_SEQ_PORT_MISCERROR
:
575 msgptr
= "An error occurred with the specified port.";
577 case MCIERR_SEQ_PORT_NONEXISTENT
:
578 msgptr
= "The specified MIDI device is not installed on the system. Use the Drivers option from the Control Panel to install a MIDI device.";
580 case MCIERR_SEQ_PORTUNSPECIFIED
:
581 msgptr
= "The system doesnot have a current MIDI port specified.";
583 case MCIERR_SEQ_TIMER
:
584 msgptr
= "All multimedia timers are being used by other applications. Quit one of these applications; then, try again.";
595 msg# 520 : digitalvideo
608 msg# 533 : milliseconds
615 msg# 540 : smpte 30 drop
621 msgptr
= "Unknown MCI Error !\n";
624 lstrcpyn32A(lpstrBuffer
, msgptr
, uLength
);
625 dprintf_mmsys(stddeb
, "mciGetErrorString // msg = %s;\n", msgptr
);
630 /**************************************************************************
631 * mciDriverNotify [MMSYSTEM.711]
633 BOOL16
mciDriverNotify(HWND16 hWndCallBack
, UINT16 wDevID
, UINT16 wStatus
)
635 dprintf_mmsys(stddeb
, "mciDriverNotify(%04X, %u, %04X)\n", hWndCallBack
, wDevID
, wStatus
);
636 if (!IsWindow32(hWndCallBack
)) return FALSE
;
637 dprintf_mmsys(stddeb
, "mciDriverNotify // before PostMessage\n");
638 PostMessage16( hWndCallBack
, MM_MCINOTIFY
, wStatus
,
639 MAKELONG(wDevID
, 0));
643 /**************************************************************************
647 DWORD
mciOpen(DWORD dwParam
, LPMCI_OPEN_PARMS lp16Parms
)
650 LPMCI_OPEN_PARMS lpParms
;
652 UINT16 wDevID
= MMSYSTEM_FirstDevID();
655 lpParms
= PTR_SEG_TO_LIN(lp16Parms
);
656 dprintf_mmsys(stddeb
, "mciOpen(%08lX, %p (%p))\n", dwParam
, lp16Parms
, lpParms
);
657 if (lp16Parms
== NULL
) return MCIERR_INTERNAL
;
659 while(GetDrv(wDevID
)->wType
!= 0) {
660 wDevID
= MMSYSTEM_NextDevID(wDevID
);
661 if (!MMSYSTEM_DevIDValid(wDevID
)) {
662 dprintf_mmsys(stddeb
, "MCI_OPEN // MAXMCIDRIVERS reached !\n");
663 return MCIERR_INTERNAL
;
666 dprintf_mmsys(stddeb
, "mciOpen // wDevID=%04X \n", wDevID
);
667 memcpy(GetOpenDrv(wDevID
),lpParms
,sizeof(*lpParms
));
669 if (dwParam
& MCI_OPEN_ELEMENT
) {
672 dprintf_mmsys(stddeb
,"mciOpen // lpstrElementName='%s'\n",
673 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
)
675 s
=(char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
);
678 GetProfileString32A("mci extensions",t
+1,"*",str
,sizeof(str
));
680 dprintf_mmsys(stddeb
, "mciOpen // str = %s \n", str
);
681 if (strcmp(str
, "CDAUDIO") == 0) {
682 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
684 if (strcmp(str
, "WAVEAUDIO") == 0) {
685 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
687 if (strcmp(str
, "SEQUENCER") == 0) {
688 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
690 if (strcmp(str
, "ANIMATION1") == 0) {
691 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
693 if (strcmp(str
, "AVIVIDEO") == 0) {
694 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
696 if (strcmp(str
,"*") == 0) {
697 dprintf_mmsys(stddeb
,"No [mci extensions] entry for %s found.\n",t
);
698 return MCIERR_EXTENSION_NOT_FOUND
;
700 dprintf_mmsys(stddeb
,"[mci extensions] entry %s for %s not supported.\n",str
,t
);
703 return MCIERR_EXTENSION_NOT_FOUND
;
706 if (dwParam
& MCI_OPEN_ALIAS
) {
707 dprintf_mmsys(stddeb
, "MCI_OPEN // Alias='%s' !\n",
708 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
));
709 GetOpenDrv(wDevID
)->lpstrAlias
= SEGPTR_GET(
710 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
)));
711 /* mplayer does allocate alias to CDAUDIO */
713 if (dwParam
& MCI_OPEN_TYPE
) {
714 if (dwParam
& MCI_OPEN_TYPE_ID
) {
715 dprintf_mmsys(stddeb
, "MCI_OPEN // Dev=%08lx !\n", lpParms
->lpstrDeviceType
);
716 uDevTyp
= LOWORD((DWORD
)lpParms
->lpstrDeviceType
);
717 GetOpenDrv(wDevID
)->lpstrDeviceType
=lpParms
->lpstrDeviceType
;
719 if (lpParms
->lpstrDeviceType
== (SEGPTR
)NULL
) return MCIERR_INTERNAL
;
720 dprintf_mmsys(stddeb
, "MCI_OPEN // Dev='%s' !\n",
721 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
722 GetOpenDrv(wDevID
)->lpstrDeviceType
= SEGPTR_GET(
723 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
)));
724 strcpy(str
, PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
726 if (strcmp(str
, "CDAUDIO") == 0) {
727 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
729 if (strcmp(str
, "WAVEAUDIO") == 0) {
730 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
732 if (strcmp(str
, "SEQUENCER") == 0) {
733 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
735 if (strcmp(str
, "ANIMATION1") == 0) {
736 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
738 if (strcmp(str
, "AVIVIDEO") == 0) {
739 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
743 GetDrv(wDevID
)->wType
= uDevTyp
;
744 GetDrv(wDevID
)->wDeviceID
= 0; /* FIXME? for multiple devices */
745 lpParms
->wDeviceID
= wDevID
;
746 dprintf_mmsys(stddeb
, "MCI_OPEN // mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
747 wDevID
, uDevTyp
, lpParms
->wDeviceID
);
750 case MCI_DEVTYPE_CD_AUDIO
:
751 dwret
= CDAUDIO_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
752 dwParam
, (DWORD
)lp16Parms
);
754 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
755 dwret
= WAVE_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
756 dwParam
, (DWORD
)lp16Parms
);
758 case MCI_DEVTYPE_SEQUENCER
:
759 dwret
= MIDI_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
760 dwParam
, (DWORD
)lp16Parms
);
762 case MCI_DEVTYPE_ANIMATION
:
763 dwret
= ANIM_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
764 dwParam
, (DWORD
)lp16Parms
);
766 case MCI_DEVTYPE_DIGITAL_VIDEO
:
767 dprintf_mmsys(stddeb
, "MCI_OPEN // No DIGITAL_VIDEO yet !\n");
768 return MCIERR_DEVICE_NOT_INSTALLED
;
770 dprintf_mmsys(stddeb
, "MCI_OPEN // Invalid Device Name '%08lx' !\n", lpParms
->lpstrDeviceType
);
771 return MCIERR_INVALID_DEVICE_NAME
;
775 if (dwParam
&MCI_NOTIFY
)
776 mciDriverNotify(lpParms
->dwCallback
,wDevID
,
777 (dwret
==0?MCI_NOTIFY_SUCCESSFUL
:MCI_NOTIFY_FAILURE
));
779 /* only handled devices fall through */
780 dprintf_mmsys(stddeb
, "MCI_OPEN // wDevID = %04X wDeviceID = %d dwret = %ld\n",wDevID
, lpParms
->wDeviceID
, dwret
);
785 /**************************************************************************
786 * mciClose [internal]
788 DWORD
mciClose(UINT16 wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
790 DWORD dwRet
= MCIERR_INTERNAL
;
792 dprintf_mmsys(stddeb
, "mciClose(%04x, %08lX, %p)\n", wDevID
, dwParam
, lpParms
);
793 switch(GetDrv(wDevID
)->wType
) {
794 case MCI_DEVTYPE_CD_AUDIO
:
795 dwRet
= CDAUDIO_DriverProc(GetDrv(wDevID
)->wDeviceID
,0,
796 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
798 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
799 dwRet
= WAVE_DriverProc(GetDrv(wDevID
)->wDeviceID
, 0,
803 case MCI_DEVTYPE_SEQUENCER
:
804 dwRet
= MIDI_DriverProc(GetDrv(wDevID
)->wDeviceID
, 0,
808 case MCI_DEVTYPE_ANIMATION
:
809 dwRet
= ANIM_DriverProc(GetDrv(wDevID
)->wDeviceID
, 0,
814 dprintf_mmsys(stddeb
, "mciClose() // unknown device type=%04X !\n", GetDrv(wDevID
)->wType
);
815 dwRet
= MCIERR_DEVICE_NOT_INSTALLED
;
817 GetDrv(wDevID
)->wType
= 0;
819 if (dwParam
&MCI_NOTIFY
)
820 mciDriverNotify(lpParms
->dwCallback
,wDevID
,
821 (dwRet
==0?MCI_NOTIFY_SUCCESSFUL
:MCI_NOTIFY_FAILURE
));
823 dprintf_mmsys(stddeb
, "mciClose() // returns %ld\n",dwRet
);
828 /**************************************************************************
829 * mciSysinfo [internal]
831 DWORD
mciSysInfo(DWORD dwFlags
, LPMCI_SYSINFO_PARMS lpParms
)
837 LPSTR SysFile
= "SYSTEM.INI";
838 dprintf_mci(stddeb
, "mciSysInfo(%08lX, %08lX)\n", dwFlags
, (DWORD
)lpParms
);
839 lpstrReturn
= PTR_SEG_TO_LIN(lpParms
->lpstrReturn
);
841 case MCI_SYSINFO_QUANTITY
:
842 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_QUANTITY \n");
843 lpdwRet
= (DWORD
*)lpstrReturn
;
844 *(lpdwRet
) = InstalledCount
;
846 case MCI_SYSINFO_INSTALLNAME
:
847 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_INSTALLNAME \n");
848 if (lpInstallNames
== NULL
) {
850 InstalledListLen
= 0;
851 ptr
= lpInstallNames
= xmalloc(2048);
852 GetPrivateProfileString32A("mci", NULL
, "", lpInstallNames
, 2000, SysFile
);
853 while(strlen(ptr
) > 0) {
854 dprintf_mci(stddeb
, "---> '%s' \n", ptr
);
855 len
= strlen(ptr
) + 1;
857 InstalledListLen
+= len
;
861 if (lpParms
->dwRetSize
< InstalledListLen
)
862 lstrcpyn32A(lpstrReturn
, lpInstallNames
, lpParms
->dwRetSize
- 1);
864 strcpy(lpstrReturn
, lpInstallNames
);
866 case MCI_SYSINFO_NAME
:
867 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_NAME \n");
869 case MCI_SYSINFO_OPEN
:
870 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_OPEN \n");
873 return MMSYSERR_INVALPARAM
;
876 /**************************************************************************
877 * mciSound [internal]
878 * not used anymore ??
880 DWORD mciSound(UINT16 wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
882 if (lpParms == NULL) return MCIERR_INTERNAL;
883 if (dwParam & MCI_SOUND_NAME)
884 dprintf_mci(stddeb, "MCI_SOUND // file='%s' !\n", lpParms->lpstrSoundName);
885 return MCIERR_INVALID_DEVICE_ID;
890 static const char *_mciCommandToString(UINT16 wMsg
)
892 static char buffer
[100];
894 #define CASE(s) case (s): return #s
905 CASE(MCI_GETDEVCAPS
);
929 sprintf(buffer
, "%04X", wMsg
);
935 /**************************************************************************
936 * mciSendCommand [MMSYSTEM.701]
938 DWORD
mciSendCommand(UINT16 wDevID
, UINT16 wMsg
, DWORD dwParam1
, DWORD dwParam2
)
941 dprintf_mci(stddeb
, "mciSendCommand(%04X, %s, %08lX, %08lX)\n",
942 wDevID
, _mciCommandToString(wMsg
), dwParam1
, dwParam2
);
946 return mciOpen(dwParam1
, (LPMCI_OPEN_PARMS
)dwParam2
);
948 return mciClose( wDevID
, dwParam1
,
949 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
951 return mciSysInfo( dwParam1
,
952 (LPMCI_SYSINFO_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
954 switch(GetDrv(wDevID
)->wType
)
956 case MCI_DEVTYPE_CD_AUDIO
:
957 return CDAUDIO_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
958 wMsg
, dwParam1
, dwParam2
);
959 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
960 return WAVE_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
961 wMsg
, dwParam1
, dwParam2
);
962 case MCI_DEVTYPE_SEQUENCER
:
963 return MIDI_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
964 wMsg
, dwParam1
, dwParam2
);
965 case MCI_DEVTYPE_ANIMATION
:
966 return ANIM_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
967 wMsg
, dwParam1
, dwParam2
);
970 "mciSendCommand() // unknown device type=%04X !\n",
971 GetDrv(wDevID
)->wType
);
974 return MMSYSERR_INVALPARAM
;
977 /**************************************************************************
978 * mciGetDeviceID [MMSYSTEM.703]
980 UINT16
mciGetDeviceID (LPCSTR lpstrName
)
984 dprintf_mci(stddeb
, "mciGetDeviceID(\"%s\")\n", lpstrName
);
985 if (lpstrName
&& !lstrcmpi32A(lpstrName
, "ALL"))
986 return MCI_ALL_DEVICE_ID
;
991 wDevID
= MMSYSTEM_FirstDevID();
992 while(MMSYSTEM_DevIDValid(wDevID
) && GetDrv(wDevID
)->wType
) {
993 if (GetOpenDrv(wDevID
)->lpstrDeviceType
&&
994 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrDeviceType
), lpstrName
) == 0)
997 if (GetOpenDrv(wDevID
)->lpstrAlias
&&
998 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrAlias
), lpstrName
) == 0)
1001 wDevID
= MMSYSTEM_NextDevID(wDevID
);
1007 /**************************************************************************
1008 * mciSetYieldProc [MMSYSTEM.714]
1010 BOOL16
mciSetYieldProc (UINT16 uDeviceID
,
1011 YIELDPROC fpYieldProc
, DWORD dwYieldData
)
1016 /**************************************************************************
1017 * mciGetDeviceIDFromElementID [MMSYSTEM.715]
1019 UINT16
mciGetDeviceIDFromElementID(DWORD dwElementID
, LPCSTR lpstrType
)
1024 /**************************************************************************
1025 * mciGetYieldProc [MMSYSTEM.716]
1027 YIELDPROC
mciGetYieldProc(UINT16 uDeviceID
, DWORD
* lpdwYieldData
)
1032 /**************************************************************************
1033 * mciGetCreatorTask [MMSYSTEM.717]
1035 HTASK16
mciGetCreatorTask(UINT16 uDeviceID
)
1040 /**************************************************************************
1041 * midiOutGetNumDevs [MMSYSTEM.201]
1043 UINT16
midiOutGetNumDevs(void)
1046 dprintf_mmsys(stddeb
, "midiOutGetNumDevs\n");
1047 count
+= modMessage(0, MODM_GETNUMDEVS
, 0L, 0L, 0L);
1048 dprintf_mmsys(stddeb
, "midiOutGetNumDevs return %u \n", count
);
1052 /**************************************************************************
1053 * midiOutGetDevCaps [MMSYSTEM.202]
1055 UINT16
midiOutGetDevCaps(UINT16 uDeviceID
, MIDIOUTCAPS
* lpCaps
, UINT16 uSize
)
1057 dprintf_mmsys(stddeb
, "midiOutGetDevCaps\n");
1058 return modMessage(uDeviceID
,MODM_GETDEVCAPS
,0,(DWORD
)lpCaps
,uSize
);
1061 /**************************************************************************
1062 * midiOutGetErrorText [MMSYSTEM.203]
1064 UINT16
midiOutGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1066 dprintf_mmsys(stddeb
, "midiOutGetErrorText\n");
1067 return midiGetErrorText(uError
, lpText
, uSize
);
1071 /**************************************************************************
1072 * midiGetErrorText [internal]
1074 UINT16
midiGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1077 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1080 case MIDIERR_UNPREPARED
:
1081 msgptr
= "The MIDI header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1083 case MIDIERR_STILLPLAYING
:
1084 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1087 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.";
1089 case MIDIERR_NOTREADY
:
1090 msgptr
= "The port is transmitting data to the device. Wait until the data has been transmitted, and then try again.";
1092 case MIDIERR_NODEVICE
:
1093 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.";
1095 case MIDIERR_INVALIDSETUP
:
1096 msgptr
= "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the Windows SYSTEM directory, and then try again.";
1099 msg# 336 : Cannot use the song-pointer time format and the SMPTE time-format together.
1100 msg# 337 : The specified MIDI device is already in use. Wait until it is free, and then try again.
1101 msg# 338 : The specified MIDI device is not installed on the system. Use the Drivers option in Control Panel to install the driver.
1102 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.
1103 msg# 340 : An error occurred using the specified port.
1104 msg# 341 : All multimedia timers are being used by other applications. Quit one of these applications, and then try again.
1105 msg# 342 : There is no current MIDI port.
1106 msg# 343 : There are no MIDI devices installed on the system. Use the Drivers option in Control Panel to install the driver.
1109 msgptr
= "Unknown MIDI Error !\n";
1112 lstrcpyn32A(lpText
, msgptr
, uSize
);
1116 /**************************************************************************
1117 * midiOutOpen [MMSYSTEM.204]
1119 UINT16
midiOutOpen(HMIDIOUT16
* lphMidiOut
, UINT16 uDeviceID
,
1120 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1123 LPMIDIOPENDESC lpDesc
;
1124 LPMIDIOPENDESC lp16Desc
;
1126 BOOL32 bMapperFlg
= FALSE
;
1127 if (lphMidiOut
!= NULL
) *lphMidiOut
= 0;
1128 dprintf_mmsys(stddeb
, "midiOutOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1129 lphMidiOut
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1130 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
1131 dprintf_mmsys(stddeb
, "midiOutOpen // MIDI_MAPPER mode requested !\n");
1135 hMidiOut
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1136 if (lphMidiOut
!= NULL
) *lphMidiOut
= hMidiOut
;
1137 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiOut
);
1138 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1139 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1140 lpDesc
->hMidi
= hMidiOut
;
1141 lpDesc
->dwCallback
= dwCallback
;
1142 lpDesc
->dwInstance
= dwInstance
;
1143 while(uDeviceID
< MAXMIDIDRIVERS
) {
1144 dwRet
= modMessage(uDeviceID
, MODM_OPEN
,
1145 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1146 if (dwRet
== MMSYSERR_NOERROR
) break;
1147 if (!bMapperFlg
) break;
1149 dprintf_mmsys(stddeb
, "midiOutOpen // MIDI_MAPPER mode ! try next driver...\n");
1154 /**************************************************************************
1155 * midiOutClose [MMSYSTEM.205]
1157 UINT16
midiOutClose(HMIDIOUT16 hMidiOut
)
1159 LPMIDIOPENDESC lpDesc
;
1160 dprintf_mmsys(stddeb
, "midiOutClose(%04X)\n", hMidiOut
);
1161 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1162 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1163 return modMessage(0, MODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1166 /**************************************************************************
1167 * midiOutPrepareHeader [MMSYSTEM.206]
1169 UINT16
midiOutPrepareHeader(HMIDIOUT16 hMidiOut
,
1170 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1172 LPMIDIOPENDESC lpDesc
;
1173 dprintf_mmsys(stddeb
, "midiOutPrepareHeader(%04X, %p, %d)\n",
1174 hMidiOut
, lpMidiOutHdr
, uSize
);
1175 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1176 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1177 return modMessage(0, MODM_PREPARE
, lpDesc
->dwInstance
,
1178 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1181 /**************************************************************************
1182 * midiOutUnprepareHeader [MMSYSTEM.207]
1184 UINT16
midiOutUnprepareHeader(HMIDIOUT16 hMidiOut
,
1185 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1187 LPMIDIOPENDESC lpDesc
;
1188 dprintf_mmsys(stddeb
, "midiOutUnprepareHeader(%04X, %p, %d)\n",
1189 hMidiOut
, lpMidiOutHdr
, uSize
);
1190 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1191 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1192 return modMessage(0, MODM_UNPREPARE
, lpDesc
->dwInstance
,
1193 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1196 /**************************************************************************
1197 * midiOutShortMsg [MMSYSTEM.208]
1199 UINT16
midiOutShortMsg(HMIDIOUT16 hMidiOut
, DWORD dwMsg
)
1201 LPMIDIOPENDESC lpDesc
;
1202 dprintf_mmsys(stddeb
, "midiOutShortMsg(%04X, %08lX)\n", hMidiOut
, dwMsg
);
1203 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1204 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1205 return modMessage(0, MODM_DATA
, lpDesc
->dwInstance
, dwMsg
, 0L);
1208 /**************************************************************************
1209 * midiOutLongMsg [MMSYSTEM.209]
1211 UINT16
midiOutLongMsg(HMIDIOUT16 hMidiOut
,
1212 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1214 LPMIDIOPENDESC lpDesc
;
1215 dprintf_mmsys(stddeb
, "midiOutLongMsg(%04X, %p, %d)\n",
1216 hMidiOut
, lpMidiOutHdr
, uSize
);
1217 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1218 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1219 return modMessage(0, MODM_LONGDATA
, lpDesc
->dwInstance
,
1220 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1223 /**************************************************************************
1224 * midiOutReset [MMSYSTEM.210]
1226 UINT16
midiOutReset(HMIDIOUT16 hMidiOut
)
1228 LPMIDIOPENDESC lpDesc
;
1229 dprintf_mmsys(stddeb
, "midiOutReset(%04X)\n", hMidiOut
);
1230 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1231 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1232 return modMessage(0, MODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1235 /**************************************************************************
1236 * midiOutGetVolume [MMSYSTEM.211]
1238 UINT16
midiOutGetVolume(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
1240 dprintf_mmsys(stddeb
, "midiOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1241 return modMessage(uDeviceID
, MODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1245 /**************************************************************************
1246 * midiOutSetVolume [MMSYSTEM.212]
1248 UINT16
midiOutSetVolume(UINT16 uDeviceID
, DWORD dwVolume
)
1250 dprintf_mmsys(stddeb
, "midiOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1251 return modMessage(uDeviceID
, MODM_SETVOLUME
, 0L, dwVolume
, 0L);
1255 /**************************************************************************
1256 * midiOutCachePatches [MMSYSTEM.213]
1258 UINT16
midiOutCachePatches(HMIDIOUT16 hMidiOut
,
1259 UINT16 uBank
, WORD
* lpwPatchArray
, UINT16 uFlags
)
1261 /* not really necessary to support this */
1262 fprintf(stdnimp
, "midiOutCachePatches: not supported yet\n");
1263 return MMSYSERR_NOTSUPPORTED
;
1266 /**************************************************************************
1267 * midiOutCacheDrumPatches [MMSYSTEM.214]
1269 UINT16
midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut
,
1270 UINT16 uPatch
, WORD
* lpwKeyArray
, UINT16 uFlags
)
1272 fprintf(stdnimp
, "midiOutCacheDrumPatchesi: not supported yet\n");
1273 return MMSYSERR_NOTSUPPORTED
;
1276 /**************************************************************************
1277 * midiOutGetID [MMSYSTEM.215]
1279 UINT16
midiOutGetID(HMIDIOUT16 hMidiOut
, UINT16
* lpuDeviceID
)
1281 dprintf_mmsys(stddeb
, "midiOutGetID\n");
1285 /**************************************************************************
1286 * midiOutMessage [MMSYSTEM.216]
1288 DWORD
midiOutMessage(HMIDIOUT16 hMidiOut
, UINT16 uMessage
,
1289 DWORD dwParam1
, DWORD dwParam2
)
1291 LPMIDIOPENDESC lpDesc
;
1292 dprintf_mmsys(stddeb
, "midiOutMessage(%04X, %04X, %08lX, %08lX)\n",
1293 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
1294 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1295 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1296 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1300 /**************************************************************************
1301 * midiInGetNumDevs [MMSYSTEM.301]
1303 UINT16
midiInGetNumDevs(void)
1306 dprintf_mmsys(stddeb
, "midiInGetNumDevs\n");
1307 count
+= midMessage(0, MIDM_GETNUMDEVS
, 0L, 0L, 0L);
1308 dprintf_mmsys(stddeb
, "midiInGetNumDevs return %u \n", count
);
1312 /**************************************************************************
1313 * midiInGetDevCaps [MMSYSTEM.302]
1315 UINT16
midiInGetDevCaps(UINT16 uDeviceID
,
1316 LPMIDIINCAPS lpCaps
, UINT16 uSize
)
1318 dprintf_mmsys(stddeb
, "midiInGetDevCaps\n");
1319 return midMessage(uDeviceID
,MIDM_GETDEVCAPS
,0,(DWORD
)lpCaps
,uSize
);;
1322 /**************************************************************************
1323 * midiInGetErrorText [MMSYSTEM.303]
1325 UINT16
midiInGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1327 dprintf_mmsys(stddeb
, "midiInGetErrorText\n");
1328 return (midiGetErrorText(uError
, lpText
, uSize
));
1331 /**************************************************************************
1332 * midiInOpen [MMSYSTEM.304]
1334 UINT16
midiInOpen(HMIDIIN16
* lphMidiIn
, UINT16 uDeviceID
,
1335 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1338 LPMIDIOPENDESC lpDesc
;
1339 LPMIDIOPENDESC lp16Desc
;
1341 BOOL32 bMapperFlg
= FALSE
;
1342 if (lphMidiIn
!= NULL
) *lphMidiIn
= 0;
1343 dprintf_mmsys(stddeb
, "midiInOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1344 lphMidiIn
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1345 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
1346 dprintf_mmsys(stddeb
, "midiInOpen // MIDI_MAPPER mode requested !\n");
1350 hMidiIn
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1351 if (lphMidiIn
!= NULL
) *lphMidiIn
= hMidiIn
;
1352 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiIn
);
1353 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1354 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1355 lpDesc
->hMidi
= hMidiIn
;
1356 lpDesc
->dwCallback
= dwCallback
;
1357 lpDesc
->dwInstance
= dwInstance
;
1358 while(uDeviceID
< MAXMIDIDRIVERS
) {
1359 dwRet
= midMessage(uDeviceID
, MIDM_OPEN
,
1360 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
1361 if (dwRet
== MMSYSERR_NOERROR
) break;
1362 if (!bMapperFlg
) break;
1364 dprintf_mmsys(stddeb
, "midiInOpen // MIDI_MAPPER mode ! try next driver...\n");
1369 /**************************************************************************
1370 * midiInClose [MMSYSTEM.305]
1372 UINT16
midiInClose(HMIDIIN16 hMidiIn
)
1374 LPMIDIOPENDESC lpDesc
;
1375 dprintf_mmsys(stddeb
, "midiInClose(%04X)\n", hMidiIn
);
1376 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1377 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1378 return midMessage(0, MIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1381 /**************************************************************************
1382 * midiInPrepareHeader [MMSYSTEM.306]
1384 UINT16
midiInPrepareHeader(HMIDIIN16 hMidiIn
,
1385 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
1387 LPMIDIOPENDESC lpDesc
;
1388 dprintf_mmsys(stddeb
, "midiInPrepareHeader(%04X, %p, %d)\n",
1389 hMidiIn
, lpMidiInHdr
, uSize
);
1390 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1391 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1392 return midMessage(0, MIDM_PREPARE
, lpDesc
->dwInstance
,
1393 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1396 /**************************************************************************
1397 * midiInUnprepareHeader [MMSYSTEM.307]
1399 UINT16
midiInUnprepareHeader(HMIDIIN16 hMidiIn
,
1400 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
1402 LPMIDIOPENDESC lpDesc
;
1403 dprintf_mmsys(stddeb
, "midiInUnprepareHeader(%04X, %p, %d)\n",
1404 hMidiIn
, lpMidiInHdr
, uSize
);
1405 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1406 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1407 return midMessage(0, MIDM_UNPREPARE
, lpDesc
->dwInstance
,
1408 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1411 /**************************************************************************
1412 * midiInAddBuffer [MMSYSTEM.308]
1414 UINT16
midiInAddBuffer(HMIDIIN16 hMidiIn
,
1415 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
1417 dprintf_mmsys(stddeb
, "midiInAddBuffer\n");
1421 /**************************************************************************
1422 * midiInStart [MMSYSTEM.309]
1424 UINT16
midiInStart(HMIDIIN16 hMidiIn
)
1426 dprintf_mmsys(stddeb
, "midiInStart\n");
1430 /**************************************************************************
1431 * midiInStop [MMSYSTEM.310]
1433 UINT16
midiInStop(HMIDIIN16 hMidiIn
)
1435 dprintf_mmsys(stddeb
, "midiInStop\n");
1439 /**************************************************************************
1440 * midiInReset [MMSYSTEM.311]
1442 UINT16
midiInReset(HMIDIIN16 hMidiIn
)
1444 dprintf_mmsys(stddeb
, "midiInReset\n");
1448 /**************************************************************************
1449 * midiInGetID [MMSYSTEM.312]
1451 UINT16
midiInGetID(HMIDIIN16 hMidiIn
, UINT16
* lpuDeviceID
)
1453 dprintf_mmsys(stddeb
, "midiInGetID\n");
1457 /**************************************************************************
1458 * midiInMessage [MMSYSTEM.313]
1460 DWORD
midiInMessage(HMIDIIN16 hMidiIn
, UINT16 uMessage
,
1461 DWORD dwParam1
, DWORD dwParam2
)
1463 LPMIDIOPENDESC lpDesc
;
1464 dprintf_mmsys(stddeb
, "midiInMessage(%04X, %04X, %08lX, %08lX)\n",
1465 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
1466 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1467 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1468 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1472 /**************************************************************************
1473 * waveOutGetNumDevs [MMSYSTEM.401]
1475 UINT16
waveOutGetNumDevs()
1478 dprintf_mmsys(stddeb
, "waveOutGetNumDevs\n");
1479 count
+= wodMessage( MMSYSTEM_FirstDevID(), WODM_GETNUMDEVS
, 0L, 0L, 0L);
1480 dprintf_mmsys(stddeb
, "waveOutGetNumDevs return %u \n", count
);
1484 /**************************************************************************
1485 * waveOutGetDevCaps [MMSYSTEM.402]
1487 UINT16
waveOutGetDevCaps(UINT16 uDeviceID
, WAVEOUTCAPS
* lpCaps
, UINT16 uSize
)
1489 if (uDeviceID
> waveOutGetNumDevs() - 1) return MMSYSERR_BADDEVICEID
;
1490 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) return MMSYSERR_BADDEVICEID
; /* FIXME: do we have a wave mapper ? */
1491 dprintf_mmsys(stddeb
, "waveOutGetDevCaps\n");
1492 return wodMessage(uDeviceID
, WODM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1495 /**************************************************************************
1496 * waveOutGetErrorText [MMSYSTEM.403]
1498 UINT16
waveOutGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1500 dprintf_mmsys(stddeb
, "waveOutGetErrorText\n");
1501 return(waveGetErrorText(uError
, lpText
, uSize
));
1505 /**************************************************************************
1506 * waveGetErrorText [internal]
1508 UINT16
waveGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1511 dprintf_mmsys(stddeb
, "waveGetErrorText(%04X, %p, %d);\n", uError
, lpText
, uSize
);
1512 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1515 case MMSYSERR_NOERROR
:
1516 msgptr
= "The specified command was carried out.";
1518 case MMSYSERR_ERROR
:
1519 msgptr
= "Undefined external error.";
1521 case MMSYSERR_BADDEVICEID
:
1522 msgptr
= "A device ID has been used that is out of range for your system.";
1524 case MMSYSERR_NOTENABLED
:
1525 msgptr
= "The driver was not enabled.";
1527 case MMSYSERR_ALLOCATED
:
1528 msgptr
= "The specified device is already in use. Wait until it is free, and then try again.";
1530 case MMSYSERR_INVALHANDLE
:
1531 msgptr
= "The specified device handle is invalid.";
1533 case MMSYSERR_NODRIVER
:
1534 msgptr
= "There is no driver installed on your system !\n";
1536 case MMSYSERR_NOMEM
:
1537 msgptr
= "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
1539 case MMSYSERR_NOTSUPPORTED
:
1540 msgptr
= "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
1542 case MMSYSERR_BADERRNUM
:
1543 msgptr
= "An error number was specified that is not defined in the system.";
1545 case MMSYSERR_INVALFLAG
:
1546 msgptr
= "An invalid flag was passed to a system function.";
1548 case MMSYSERR_INVALPARAM
:
1549 msgptr
= "An invalid parameter was passed to a system function.";
1551 case WAVERR_BADFORMAT
:
1552 msgptr
= "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
1554 case WAVERR_STILLPLAYING
:
1555 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1557 case WAVERR_UNPREPARED
:
1558 msgptr
= "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1561 msgptr
= "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
1564 msgptr
= "Unknown MMSYSTEM Error !\n";
1567 lstrcpyn32A(lpText
, msgptr
, uSize
);
1571 /**************************************************************************
1572 * waveOutOpen [MMSYSTEM.404]
1574 UINT16
waveOutOpen(HWAVEOUT16
* lphWaveOut
, UINT16 uDeviceID
,
1575 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1577 HWAVEOUT16 hWaveOut
;
1578 LPWAVEOPENDESC lpDesc
;
1579 LPWAVEOPENDESC lp16Desc
;
1581 BOOL32 bMapperFlg
= FALSE
;
1583 dprintf_mmsys(stddeb
, "waveOutOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1584 lphWaveOut
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1585 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1586 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_FORMAT_QUERY requested !\n");
1588 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
1589 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_MAPPER mode requested !\n");
1593 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1595 hWaveOut
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1596 if (lphWaveOut
!= NULL
) *lphWaveOut
= hWaveOut
;
1597 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveOut
);
1598 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1599 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1600 lpDesc
->hWave
= hWaveOut
;
1601 lpDesc
->lpFormat
= lpFormat
; /* should the struct be copied iso pointer? */
1602 lpDesc
->dwCallBack
= dwCallback
;
1603 lpDesc
->dwInstance
= dwInstance
;
1604 if (uDeviceID
>= MAXWAVEDRIVERS
) uDeviceID
= 0;
1605 while(uDeviceID
< MAXWAVEDRIVERS
) {
1606 dwRet
= wodMessage(uDeviceID
, WODM_OPEN
,
1607 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, dwFlags
);
1608 if (dwRet
== MMSYSERR_NOERROR
) break;
1609 if (!bMapperFlg
) break;
1611 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_MAPPER mode ! try next driver...\n");
1613 lpDesc
->uDeviceID
= uDeviceID
; /* save physical Device ID */
1614 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1615 dprintf_mmsys(stddeb
, "waveOutOpen // End of WAVE_FORMAT_QUERY !\n");
1616 dwRet
= waveOutClose(hWaveOut
);
1621 /**************************************************************************
1622 * waveOutClose [MMSYSTEM.405]
1624 UINT16
waveOutClose(HWAVEOUT16 hWaveOut
)
1626 LPWAVEOPENDESC lpDesc
;
1628 dprintf_mmsys(stddeb
, "waveOutClose(%04X)\n", hWaveOut
);
1629 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1630 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1631 return wodMessage( lpDesc
->uDeviceID
, WODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1634 /**************************************************************************
1635 * waveOutPrepareHeader [MMSYSTEM.406]
1637 UINT16
waveOutPrepareHeader(HWAVEOUT16 hWaveOut
,
1638 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
1640 LPWAVEOPENDESC lpDesc
;
1642 dprintf_mmsys(stddeb
, "waveOutPrepareHeader(%04X, %p, %u);\n",
1643 hWaveOut
, lpWaveOutHdr
, uSize
);
1644 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1645 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1646 return wodMessage( lpDesc
->uDeviceID
, WODM_PREPARE
, lpDesc
->dwInstance
,
1647 (DWORD
)lpWaveOutHdr
, uSize
);
1650 /**************************************************************************
1651 * waveOutUnprepareHeader [MMSYSTEM.407]
1653 UINT16
waveOutUnprepareHeader(HWAVEOUT16 hWaveOut
,
1654 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
1656 LPWAVEOPENDESC lpDesc
;
1658 dprintf_mmsys(stddeb
, "waveOutUnprepareHeader(%04X, %p, %u);\n",
1659 hWaveOut
, lpWaveOutHdr
, uSize
);
1660 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1661 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1662 return wodMessage( lpDesc
->uDeviceID
, WODM_UNPREPARE
, lpDesc
->dwInstance
,
1663 (DWORD
)lpWaveOutHdr
, uSize
);
1666 /**************************************************************************
1667 * waveOutWrite [MMSYSTEM.408]
1669 UINT16
waveOutWrite(HWAVEOUT16 hWaveOut
, WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
1671 LPWAVEOPENDESC lpDesc
;
1673 dprintf_mmsys(stddeb
, "waveOutWrite(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
1674 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1675 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1676 return wodMessage( lpDesc
->uDeviceID
, WODM_WRITE
, lpDesc
->dwInstance
,
1677 (DWORD
)lpWaveOutHdr
, uSize
);
1680 /**************************************************************************
1681 * waveOutPause [MMSYSTEM.409]
1683 UINT16
waveOutPause(HWAVEOUT16 hWaveOut
)
1685 LPWAVEOPENDESC lpDesc
;
1687 dprintf_mmsys(stddeb
, "waveOutPause(%04X)\n", hWaveOut
);
1688 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1689 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1690 return wodMessage( lpDesc
->uDeviceID
, WODM_PAUSE
, lpDesc
->dwInstance
, 0L, 0L);
1693 /**************************************************************************
1694 * waveOutRestart [MMSYSTEM.410]
1696 UINT16
waveOutRestart(HWAVEOUT16 hWaveOut
)
1698 LPWAVEOPENDESC lpDesc
;
1700 dprintf_mmsys(stddeb
, "waveOutRestart(%04X)\n", hWaveOut
);
1701 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1702 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1703 return wodMessage( lpDesc
->uDeviceID
, WODM_RESTART
, lpDesc
->dwInstance
, 0L, 0L);
1706 /**************************************************************************
1707 * waveOutReset [MMSYSTEM.411]
1709 UINT16
waveOutReset(HWAVEOUT16 hWaveOut
)
1711 LPWAVEOPENDESC lpDesc
;
1712 dprintf_mmsys(stddeb
, "waveOutReset(%04X)\n", hWaveOut
);
1713 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1714 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1715 return wodMessage( lpDesc
->uDeviceID
, WODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1718 /**************************************************************************
1719 * waveOutGetPosition [MMSYSTEM.412]
1721 UINT16
waveOutGetPosition(HWAVEOUT16 hWaveOut
, MMTIME
* lpTime
, UINT16 uSize
)
1723 LPWAVEOPENDESC lpDesc
;
1724 dprintf_mmsys(stddeb
, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut
, lpTime
, uSize
);
1725 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1726 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1727 return wodMessage( lpDesc
->uDeviceID
, WODM_GETPOS
, lpDesc
->dwInstance
,
1728 (DWORD
)lpTime
, (DWORD
)uSize
);
1731 /**************************************************************************
1732 * waveOutGetPitch [MMSYSTEM.413]
1734 UINT16
waveOutGetPitch(HWAVEOUT16 hWaveOut
, DWORD
* lpdwPitch
)
1736 LPWAVEOPENDESC lpDesc
;
1737 dprintf_mmsys(stddeb
, "waveOutGetPitch(%04X, %p);\n", hWaveOut
, lpdwPitch
);
1738 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1739 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1740 return wodMessage( lpDesc
->uDeviceID
, WODM_GETPITCH
, lpDesc
->dwInstance
,
1741 (DWORD
)lpdwPitch
, 0L);
1744 /**************************************************************************
1745 * waveOutSetPitch [MMSYSTEM.414]
1747 UINT16
waveOutSetPitch(HWAVEOUT16 hWaveOut
, DWORD dwPitch
)
1749 LPWAVEOPENDESC lpDesc
;
1750 dprintf_mmsys(stddeb
, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut
, dwPitch
);
1751 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1752 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1753 return wodMessage( lpDesc
->uDeviceID
, WODM_SETPITCH
, lpDesc
->dwInstance
, (DWORD
)dwPitch
, 0L);
1756 /**************************************************************************
1757 * waveOutGetVolume [MMSYSTEM.415]
1759 UINT16
waveOutGetVolume(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
1761 dprintf_mmsys(stddeb
, "waveOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1762 return wodMessage(uDeviceID
, WODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1765 /**************************************************************************
1766 * waveOutSetVolume [MMSYSTEM.416]
1768 UINT16
waveOutSetVolume(UINT16 uDeviceID
, DWORD dwVolume
)
1770 dprintf_mmsys(stddeb
, "waveOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1771 return wodMessage(uDeviceID
, WODM_SETVOLUME
, 0L, dwVolume
, 0L);
1774 /**************************************************************************
1775 * waveOutGetPlaybackRate [MMSYSTEM.417]
1777 UINT16
waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut
, DWORD
* lpdwRate
)
1779 LPWAVEOPENDESC lpDesc
;
1780 dprintf_mmsys(stddeb
, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut
, lpdwRate
);
1781 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1782 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1783 return wodMessage( lpDesc
->uDeviceID
, WODM_GETPLAYBACKRATE
, lpDesc
->dwInstance
,
1784 (DWORD
)lpdwRate
, 0L);
1787 /**************************************************************************
1788 * waveOutSetPlaybackRate [MMSYSTEM.418]
1790 UINT16
waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut
, DWORD dwRate
)
1792 LPWAVEOPENDESC lpDesc
;
1793 dprintf_mmsys(stddeb
, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut
, dwRate
);
1794 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1795 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1796 return wodMessage( lpDesc
->uDeviceID
, WODM_SETPLAYBACKRATE
,
1797 lpDesc
->dwInstance
, (DWORD
)dwRate
, 0L);
1800 /**************************************************************************
1801 * waveOutBreakLoop [MMSYSTEM.419]
1803 UINT16
waveOutBreakLoop(HWAVEOUT16 hWaveOut
)
1805 dprintf_mmsys(stddeb
, "waveOutBreakLoop(%04X)\n", hWaveOut
);
1806 return MMSYSERR_INVALHANDLE
;
1809 /**************************************************************************
1810 * waveOutGetID [MMSYSTEM.420]
1812 UINT16
waveOutGetID(HWAVEOUT16 hWaveOut
, UINT16
* lpuDeviceID
)
1814 LPWAVEOPENDESC lpDesc
;
1815 dprintf_mmsys(stddeb
, "waveOutGetID(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
1816 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1817 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1818 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
1819 *lpuDeviceID
= lpDesc
->uDeviceID
;
1823 /**************************************************************************
1824 * waveOutMessage [MMSYSTEM.421]
1826 DWORD
waveOutMessage(HWAVEOUT16 hWaveOut
, UINT16 uMessage
,
1827 DWORD dwParam1
, DWORD dwParam2
)
1829 LPWAVEOPENDESC lpDesc
;
1830 dprintf_mmsys(stddeb
, "waveOutMessage(%04X, %04X, %08lX, %08lX)\n",
1831 hWaveOut
, uMessage
, dwParam1
, dwParam2
);
1832 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1833 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1834 return wodMessage( lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1837 /**************************************************************************
1838 * waveInGetNumDevs [MMSYSTEM.501]
1840 UINT16
waveInGetNumDevs()
1843 dprintf_mmsys(stddeb
, "waveInGetNumDevs\n");
1844 count
+= widMessage(0, WIDM_GETNUMDEVS
, 0L, 0L, 0L);
1845 dprintf_mmsys(stddeb
, "waveInGetNumDevs return %u \n", count
);
1850 /**************************************************************************
1851 * waveInGetDevCaps [MMSYSTEM.502]
1853 UINT16
waveInGetDevCaps(UINT16 uDeviceID
, WAVEINCAPS
* lpCaps
, UINT16 uSize
)
1855 dprintf_mmsys(stddeb
, "waveInGetDevCaps\n");
1856 return widMessage(uDeviceID
, WIDM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1860 /**************************************************************************
1861 * waveInGetErrorText [MMSYSTEM.503]
1863 UINT16
waveInGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1865 dprintf_mmsys(stddeb
, "waveInGetErrorText\n");
1866 return(waveGetErrorText(uError
, lpText
, uSize
));
1870 /**************************************************************************
1871 * waveInOpen [MMSYSTEM.504]
1873 UINT16
waveInOpen(HWAVEIN16
* lphWaveIn
, UINT16 uDeviceID
,
1874 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1877 LPWAVEOPENDESC lpDesc
;
1878 LPWAVEOPENDESC lp16Desc
;
1880 BOOL32 bMapperFlg
= FALSE
;
1881 dprintf_mmsys(stddeb
, "waveInOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1882 lphWaveIn
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1883 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1884 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_FORMAT_QUERY requested !\n");
1886 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
1887 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_MAPPER mode requested !\n");
1891 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1892 hWaveIn
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1893 if (lphWaveIn
!= NULL
) *lphWaveIn
= hWaveIn
;
1894 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveIn
);
1895 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1896 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1897 lpDesc
->hWave
= hWaveIn
;
1898 lpDesc
->lpFormat
= lpFormat
;
1899 lpDesc
->dwCallBack
= dwCallback
;
1900 lpDesc
->dwInstance
= dwInstance
;
1901 while(uDeviceID
< MAXWAVEDRIVERS
) {
1902 dwRet
= widMessage(uDeviceID
, WIDM_OPEN
,
1903 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1904 if (dwRet
== MMSYSERR_NOERROR
) break;
1905 if (!bMapperFlg
) break;
1907 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_MAPPER mode ! try next driver...\n");
1909 lpDesc
->uDeviceID
= uDeviceID
;
1910 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1911 dprintf_mmsys(stddeb
, "waveInOpen // End of WAVE_FORMAT_QUERY !\n");
1912 dwRet
= waveInClose(hWaveIn
);
1918 /**************************************************************************
1919 * waveInClose [MMSYSTEM.505]
1921 UINT16
waveInClose(HWAVEIN16 hWaveIn
)
1923 LPWAVEOPENDESC lpDesc
;
1925 dprintf_mmsys(stddeb
, "waveInClose(%04X)\n", hWaveIn
);
1926 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1927 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1928 return widMessage(lpDesc
->uDeviceID
, WIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1932 /**************************************************************************
1933 * waveInPrepareHeader [MMSYSTEM.506]
1935 UINT16
waveInPrepareHeader(HWAVEIN16 hWaveIn
,
1936 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
1938 LPWAVEOPENDESC lpDesc
;
1939 LPWAVEHDR lp32WaveInHdr
;
1941 dprintf_mmsys(stddeb
, "waveInPrepareHeader(%04X, %p, %u);\n",
1942 hWaveIn
, lpWaveInHdr
, uSize
);
1943 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1944 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1945 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1946 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1947 lp32WaveInHdr
->lp16Next
= (SEGPTR
)NULL
;
1948 lp32WaveInHdr
->dwBytesRecorded
= 0;
1949 dprintf_mmsys(stddeb
, "waveInPrepareHeader // lpData=%p size=%lu \n",
1950 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1951 return widMessage(lpDesc
->uDeviceID
, WIDM_PREPARE
, lpDesc
->dwInstance
,
1952 (DWORD
)lpWaveInHdr
, uSize
);
1956 /**************************************************************************
1957 * waveInUnprepareHeader [MMSYSTEM.507]
1959 UINT16
waveInUnprepareHeader(HWAVEIN16 hWaveIn
,
1960 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
1962 LPWAVEOPENDESC lpDesc
;
1963 LPWAVEHDR lp32WaveInHdr
;
1965 dprintf_mmsys(stddeb
, "waveInUnprepareHeader(%04X, %p, %u);\n",
1966 hWaveIn
, lpWaveInHdr
, uSize
);
1967 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1968 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1969 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1970 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1971 USER_HEAP_FREE(HIWORD((DWORD
)lp32WaveInHdr
->lpData
));
1972 lp32WaveInHdr
->lpData
= NULL
;
1973 lp32WaveInHdr
->lp16Next
= (SEGPTR
)NULL
;
1974 return widMessage(lpDesc
->uDeviceID
, WIDM_UNPREPARE
, lpDesc
->dwInstance
,
1975 (DWORD
)lpWaveInHdr
, uSize
);
1979 /**************************************************************************
1980 * waveInAddBuffer [MMSYSTEM.508]
1982 UINT16
waveInAddBuffer(HWAVEIN16 hWaveIn
,
1983 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
1985 LPWAVEOPENDESC lpDesc
;
1986 LPWAVEHDR lp32WaveInHdr
;
1988 dprintf_mmsys(stddeb
, "waveInAddBuffer(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
1989 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1990 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1991 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1992 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1993 lp32WaveInHdr
->lp16Next
= (SEGPTR
)NULL
;
1994 lp32WaveInHdr
->dwBytesRecorded
= 0;
1995 dprintf_mmsys(stddeb
, "waveInAddBuffer // lpData=%p size=%lu \n",
1996 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1997 return widMessage(lpDesc
->uDeviceID
, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
1998 (DWORD
)lpWaveInHdr
, uSize
);
2002 /**************************************************************************
2003 * waveInStart [MMSYSTEM.509]
2005 UINT16
waveInStart(HWAVEIN16 hWaveIn
)
2007 LPWAVEOPENDESC lpDesc
;
2009 dprintf_mmsys(stddeb
, "waveInStart(%04X)\n", hWaveIn
);
2010 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
2011 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2012 return widMessage(lpDesc
->uDeviceID
, WIDM_START
, lpDesc
->dwInstance
, 0L, 0L);
2016 /**************************************************************************
2017 * waveInStop [MMSYSTEM.510]
2019 UINT16
waveInStop(HWAVEIN16 hWaveIn
)
2021 LPWAVEOPENDESC lpDesc
;
2023 dprintf_mmsys(stddeb
, "waveInStop(%04X)\n", hWaveIn
);
2024 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
2025 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2026 return widMessage(lpDesc
->uDeviceID
, WIDM_STOP
, lpDesc
->dwInstance
, 0L, 0L);
2030 /**************************************************************************
2031 * waveInReset [MMSYSTEM.511]
2033 UINT16
waveInReset(HWAVEIN16 hWaveIn
)
2035 LPWAVEOPENDESC lpDesc
;
2037 dprintf_mmsys(stddeb
, "waveInReset(%04X)\n", hWaveIn
);
2038 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
2039 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2040 return widMessage(lpDesc
->uDeviceID
, WIDM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
2044 /**************************************************************************
2045 * waveInGetPosition [MMSYSTEM.512]
2047 UINT16
waveInGetPosition(HWAVEIN16 hWaveIn
, MMTIME
* lpTime
, UINT16 uSize
)
2049 LPWAVEOPENDESC lpDesc
;
2051 dprintf_mmsys(stddeb
, "waveInGetPosition(%04X, %p, %u);\n", hWaveIn
, lpTime
, uSize
);
2052 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
2053 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2054 return widMessage(lpDesc
->uDeviceID
, WIDM_GETPOS
, lpDesc
->dwInstance
,
2055 (DWORD
)lpTime
, (DWORD
)uSize
);
2059 /**************************************************************************
2060 * waveInGetID [MMSYSTEM.513]
2062 UINT16
waveInGetID(HWAVEIN16 hWaveIn
, UINT16
* lpuDeviceID
)
2064 LPWAVEOPENDESC lpDesc
;
2066 dprintf_mmsys(stddeb
, "waveInGetID\n");
2067 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
2068 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
2069 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2070 *lpuDeviceID
= lpDesc
->uDeviceID
;
2075 /**************************************************************************
2076 * waveInMessage [MMSYSTEM.514]
2078 DWORD
waveInMessage(HWAVEIN16 hWaveIn
, UINT16 uMessage
,
2079 DWORD dwParam1
, DWORD dwParam2
)
2081 LPWAVEOPENDESC lpDesc
;
2083 dprintf_mmsys(stddeb
, "waveInMessage(%04X, %04X, %08lX, %08lX)\n",
2084 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
2085 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
2086 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2087 return widMessage(lpDesc
->uDeviceID
, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2091 /**************************************************************************
2092 * mmioOpen [MMSYSTEM.1210]
2094 HMMIO16
mmioOpen(LPSTR szFileName
, MMIOINFO
* lpmmioinfo
, DWORD dwOpenFlags
)
2099 LPMMIOINFO lpmminfo
;
2100 dprintf_mmio(stddeb
, "mmioOpen('%s', %p, %08lX);\n", szFileName
, lpmmioinfo
, dwOpenFlags
);
2103 /* FIXME: should load memory file if szFileName == NULL */
2104 fprintf(stderr
, "WARNING: mmioOpen(): szFileName == NULL (memory file ???)\n");
2107 hFile
= OpenFile32(szFileName
, &ofs
, dwOpenFlags
);
2108 if (hFile
== -1) return 0;
2109 hmmio
= GlobalAlloc16(GMEM_MOVEABLE
, sizeof(MMIOINFO
));
2110 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2111 if (lpmminfo
== NULL
) return 0;
2112 memset(lpmminfo
, 0, sizeof(MMIOINFO
));
2113 lpmminfo
->hmmio
= hmmio
;
2114 lpmminfo
->dwReserved2
= hFile
;
2115 GlobalUnlock16(hmmio
);
2116 dprintf_mmio(stddeb
, "mmioOpen // return hmmio=%04X\n", hmmio
);
2121 /**************************************************************************
2122 * mmioClose [MMSYSTEM.1211]
2124 UINT16
mmioClose(HMMIO16 hmmio
, UINT16 uFlags
)
2126 LPMMIOINFO lpmminfo
;
2127 dprintf_mmio(stddeb
, "mmioClose(%04X, %04X);\n", hmmio
, uFlags
);
2128 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2129 if (lpmminfo
== NULL
) return 0;
2130 _lclose32((HFILE32
)lpmminfo
->dwReserved2
);
2131 GlobalUnlock16(hmmio
);
2132 GlobalFree16(hmmio
);
2138 /**************************************************************************
2139 * mmioRead [MMSYSTEM.1212]
2141 LONG
mmioRead(HMMIO16 hmmio
, HPSTR pch
, LONG cch
)
2144 LPMMIOINFO lpmminfo
;
2145 dprintf_mmio(stddeb
, "mmioRead(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2146 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2147 if (lpmminfo
== NULL
) return 0;
2148 count
= _lread32(LOWORD(lpmminfo
->dwReserved2
), pch
, cch
);
2149 GlobalUnlock16(hmmio
);
2150 dprintf_mmio(stddeb
, "mmioRead // count=%ld\n", count
);
2156 /**************************************************************************
2157 * mmioWrite [MMSYSTEM.1213]
2159 LONG
mmioWrite(HMMIO16 hmmio
, HPCSTR pch
, LONG cch
)
2162 LPMMIOINFO lpmminfo
;
2163 dprintf_mmio(stddeb
, "mmioWrite(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2164 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2165 if (lpmminfo
== NULL
) return 0;
2166 count
= _lwrite32(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)pch
, cch
);
2167 GlobalUnlock16(hmmio
);
2171 /**************************************************************************
2172 * mmioSeek [MMSYSTEM.1214]
2174 LONG
mmioSeek(HMMIO16 hmmio
, LONG lOffset
, int iOrigin
)
2177 LPMMIOINFO lpmminfo
;
2178 dprintf_mmio(stddeb
, "mmioSeek(%04X, %08lX, %d);\n", hmmio
, lOffset
, iOrigin
);
2179 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2180 if (lpmminfo
== NULL
) {
2181 dprintf_mmio(stddeb
, "mmioSeek // can't lock hmmio=%04X !\n", hmmio
);
2184 count
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
, lOffset
, iOrigin
);
2185 GlobalUnlock16(hmmio
);
2189 /**************************************************************************
2190 * mmioGetInfo [MMSYSTEM.1215]
2192 UINT16
mmioGetInfo(HMMIO16 hmmio
, MMIOINFO
* lpmmioinfo
, UINT16 uFlags
)
2194 LPMMIOINFO lpmminfo
;
2195 dprintf_mmio(stddeb
, "mmioGetInfo\n");
2196 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2197 if (lpmminfo
== NULL
) return 0;
2198 memcpy(lpmmioinfo
, lpmminfo
, sizeof(MMIOINFO
));
2199 GlobalUnlock16(hmmio
);
2203 /**************************************************************************
2204 * mmioSetInfo [MMSYSTEM.1216]
2206 UINT16
mmioSetInfo(HMMIO16 hmmio
, const MMIOINFO
* lpmmioinfo
, UINT16 uFlags
)
2208 LPMMIOINFO lpmminfo
;
2209 dprintf_mmio(stddeb
, "mmioSetInfo\n");
2210 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2211 if (lpmminfo
== NULL
) return 0;
2212 GlobalUnlock16(hmmio
);
2216 /**************************************************************************
2217 * mmioSetBuffer [MMSYSTEM.1217]
2219 UINT16
mmioSetBuffer(HMMIO16 hmmio
, LPSTR pchBuffer
,
2220 LONG cchBuffer
, UINT16 uFlags
)
2222 dprintf_mmio(stddeb
, "mmioSetBuffer // empty stub \n");
2226 /**************************************************************************
2227 * mmioFlush [MMSYSTEM.1218]
2229 UINT16
mmioFlush(HMMIO16 hmmio
, UINT16 uFlags
)
2231 LPMMIOINFO lpmminfo
;
2232 dprintf_mmio(stddeb
, "mmioFlush(%04X, %04X)\n", hmmio
, uFlags
);
2233 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2234 if (lpmminfo
== NULL
) return 0;
2235 GlobalUnlock16(hmmio
);
2239 /**************************************************************************
2240 * mmioAdvance [MMSYSTEM.1219]
2242 UINT16
mmioAdvance(HMMIO16 hmmio
, MMIOINFO
* lpmmioinfo
, UINT16 uFlags
)
2245 LPMMIOINFO lpmminfo
;
2246 dprintf_mmio(stddeb
, "mmioAdvance\n");
2247 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2248 if (lpmminfo
== NULL
) return 0;
2249 if (uFlags
== MMIO_READ
) {
2250 count
= _lread32(LOWORD(lpmminfo
->dwReserved2
),
2251 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2253 if (uFlags
== MMIO_WRITE
) {
2254 count
= _lwrite32(LOWORD(lpmminfo
->dwReserved2
),
2255 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2257 lpmmioinfo
->pchNext
+= count
;
2258 GlobalUnlock16(hmmio
);
2259 lpmminfo
->lDiskOffset
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
, 0, SEEK_CUR
);
2263 /**************************************************************************
2264 * mmioStringToFOURCC [MMSYSTEM.1220]
2266 FOURCC
mmioStringToFOURCC(LPCSTR sz
, UINT16 uFlags
)
2268 dprintf_mmio(stddeb
, "mmioStringToFOURCC // empty stub \n");
2272 /**************************************************************************
2273 * mmioInstallIOProc [MMSYSTEM.1221]
2275 LPMMIOPROC
mmioInstallIOProc(FOURCC fccIOProc
,
2276 LPMMIOPROC pIOProc
, DWORD dwFlags
)
2278 dprintf_mmio(stddeb
, "mmioInstallIOProc // empty stub \n");
2282 /**************************************************************************
2283 * mmioSendMessage [MMSYSTEM.1222]
2285 LRESULT
mmioSendMessage(HMMIO16 hmmio
, UINT16 uMessage
,
2286 LPARAM lParam1
, LPARAM lParam2
)
2288 dprintf_mmio(stddeb
, "mmioSendMessage // empty stub \n");
2292 /**************************************************************************
2293 * mmioDescend [MMSYSTEM.1223]
2295 UINT16
mmioDescend(HMMIO16 hmmio
, MMCKINFO
* lpck
,
2296 const MMCKINFO
* lpckParent
, UINT16 uFlags
)
2298 DWORD dwfcc
, dwOldPos
;
2299 LPMMIOINFO lpmminfo
;
2300 dprintf_mmio(stddeb
, "mmioDescend(%04X, %p, %p, %04X);\n",
2301 hmmio
, lpck
, lpckParent
, uFlags
);
2302 if (lpck
== NULL
) return 0;
2303 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2304 if (lpmminfo
== NULL
) return 0;
2306 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX\n", dwfcc
);
2307 dprintf_mmio(stddeb
, "mmioDescend // hfile = %ld\n", lpmminfo
->dwReserved2
);
2308 dwOldPos
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
, 0, SEEK_CUR
);
2309 dprintf_mmio(stddeb
, "mmioDescend // dwOldPos=%ld\n", dwOldPos
);
2310 if (lpckParent
!= NULL
) {
2311 dprintf_mmio(stddeb
, "mmioDescend // seek inside parent at %ld !\n", lpckParent
->dwDataOffset
);
2312 dwOldPos
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
,
2313 lpckParent
->dwDataOffset
, SEEK_SET
);
2317 It seems to be that FINDRIFF should not be treated the same as the
2318 other FINDxxx so I treat it as a MMIO_FINDxxx
2320 if ((uFlags & MMIO_FINDCHUNK) || (uFlags & MMIO_FINDRIFF) ||
2321 (uFlags & MMIO_FINDLIST)) {
2323 if ((uFlags
& MMIO_FINDCHUNK
) || (uFlags
& MMIO_FINDLIST
)) {
2324 dprintf_mmio(stddeb
, "mmioDescend // MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc
);
2328 ix
=_lread32((HFILE32
)lpmminfo
->dwReserved2
, (LPSTR
)lpck
, sizeof(MMCKINFO
));
2329 dprintf_mmio(stddeb
, "mmioDescend // after _lread32 ix = %d req = %d, errno = %d\n",ix
,sizeof(MMCKINFO
),errno
);
2330 if (ix
< sizeof(MMCKINFO
)) {
2332 _llseek32((HFILE32
)lpmminfo
->dwReserved2
, dwOldPos
, SEEK_SET
);
2333 GlobalUnlock16(hmmio
);
2334 dprintf_mmio(stddeb
, "mmioDescend // return ChunkNotFound\n");
2335 return MMIOERR_CHUNKNOTFOUND
;
2337 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX ckid=%08lX cksize=%08lX !\n",
2338 dwfcc
, lpck
->ckid
, lpck
->cksize
);
2339 if (dwfcc
== lpck
->ckid
) break;
2340 dwOldPos
+= lpck
->cksize
+ 2 * sizeof(DWORD
);
2341 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2342 dwOldPos
+= sizeof(DWORD
);
2343 _llseek32((HFILE32
)lpmminfo
->dwReserved2
, dwOldPos
, SEEK_SET
);
2347 if (_lread32(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)lpck
,
2348 sizeof(MMCKINFO
)) < sizeof(MMCKINFO
)) {
2349 _llseek32((HFILE32
)lpmminfo
->dwReserved2
, dwOldPos
, SEEK_SET
);
2350 GlobalUnlock16(hmmio
);
2351 dprintf_mmio(stddeb
, "mmioDescend // return ChunkNotFound 2nd\n");
2352 return MMIOERR_CHUNKNOTFOUND
;
2355 lpck
->dwDataOffset
= dwOldPos
+ 2 * sizeof(DWORD
);
2356 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2357 lpck
->dwDataOffset
+= sizeof(DWORD
);
2358 lpmminfo
->lDiskOffset
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
,
2359 lpck
->dwDataOffset
, SEEK_SET
);
2360 GlobalUnlock16(hmmio
);
2361 dprintf_mmio(stddeb
, "mmioDescend // lpck->ckid=%08lX lpck->cksize=%ld !\n",
2362 lpck
->ckid
, lpck
->cksize
);
2363 dprintf_mmio(stddeb
, "mmioDescend // lpck->fccType=%08lX !\n", lpck
->fccType
);
2367 /**************************************************************************
2368 * mmioAscend [MMSYSTEM.1224]
2370 UINT16
mmioAscend(HMMIO16 hmmio
, MMCKINFO
* lpck
, UINT16 uFlags
)
2372 dprintf_mmio(stddeb
, "mmioAscend // empty stub !\n");
2376 /**************************************************************************
2377 * mmioCreateChunk [MMSYSTEM.1225]
2379 UINT16
mmioCreateChunk(HMMIO16 hmmio
, MMCKINFO
* lpck
, UINT16 uFlags
)
2381 dprintf_mmio(stddeb
, "mmioCreateChunk // empty stub \n");
2386 /**************************************************************************
2387 * mmioRename [MMSYSTEM.1226]
2389 UINT16
mmioRename(LPCSTR szFileName
, LPCSTR szNewFileName
,
2390 MMIOINFO
* lpmmioinfo
, DWORD dwRenameFlags
)
2392 dprintf_mmio(stddeb
, "mmioRename('%s', '%s', %p, %08lX); // empty stub \n",
2393 szFileName
, szNewFileName
, lpmmioinfo
, dwRenameFlags
);
2397 /**************************************************************************
2398 * DrvOpen [MMSYSTEM.1100]
2400 HDRVR16
DrvOpen(LPSTR lpDriverName
, LPSTR lpSectionName
, LPARAM lParam
)
2402 dprintf_mmsys(stddeb
, "DrvOpen('%s', '%s', %08lX);\n",
2403 lpDriverName
, lpSectionName
, lParam
);
2404 return OpenDriver(lpDriverName
, lpSectionName
, lParam
);
2408 /**************************************************************************
2409 * DrvClose [MMSYSTEM.1101]
2411 LRESULT
DrvClose(HDRVR16 hDrvr
, LPARAM lParam1
, LPARAM lParam2
)
2413 dprintf_mmsys(stddeb
, "DrvClose(%04X, %08lX, %08lX);\n", hDrvr
, lParam1
, lParam2
);
2414 return CloseDriver(hDrvr
, lParam1
, lParam2
);
2418 /**************************************************************************
2419 * DrvSendMessage [MMSYSTEM.1102]
2421 LRESULT
DrvSendMessage(HDRVR16 hDriver
, WORD msg
, LPARAM lParam1
, LPARAM lParam2
)
2423 DWORD dwDriverID
= 0;
2424 dprintf_mmsys(stddeb
, "DrvSendMessage(%04X, %04X, %08lX, %08lX);\n",
2425 hDriver
, msg
, lParam1
, lParam2
);
2426 return CDAUDIO_DriverProc(dwDriverID
, hDriver
, msg
, lParam1
, lParam2
);
2429 /**************************************************************************
2430 * DrvGetModuleHandle [MMSYSTEM.1103]
2432 HANDLE16
DrvGetModuleHandle(HDRVR16 hDrvr
)
2434 dprintf_mmsys(stddeb
, "DrvGetModuleHandle(%04X);\n", hDrvr
);
2439 /**************************************************************************
2440 * DrvDefDriverProc [MMSYSTEM.1104]
2442 LRESULT
DrvDefDriverProc(DWORD dwDriverID
, HDRVR16 hDriv
, WORD wMsg
,
2443 DWORD dwParam1
, DWORD dwParam2
)
2445 return DefDriverProc(dwDriverID
, hDriv
, wMsg
, dwParam1
, dwParam2
);