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
15 #include <sys/ioctl.h>
27 static int InstalledCount
;
28 static int InstalledListLen
;
29 static LPSTR lpInstallNames
= NULL
;
31 MCI_OPEN_DRIVER_PARMS mciDrv
[MAXMCIDRIVERS
];
32 /* struct below is to remember alias/devicenames for mcistring.c
33 * FIXME: should use some internal struct ...
35 MCI_OPEN_PARMS mciOpenDrv
[MAXMCIDRIVERS
];
37 UINT16
midiGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
);
38 UINT16
waveGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
);
39 LONG
DrvDefDriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
40 DWORD dwParam1
, DWORD dwParam2
);
42 LONG
WAVE_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
43 DWORD dwParam1
, DWORD dwParam2
);
44 LONG
MIDI_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
45 DWORD dwParam1
, DWORD dwParam2
);
46 LONG
CDAUDIO_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
47 DWORD dwParam1
, DWORD dwParam2
);
48 LONG
ANIM_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
49 DWORD dwParam1
, DWORD dwParam2
);
52 #define GetDrv(wDevID) (&mciDrv[MMSYSTEM_DevIDToIndex(wDevID)])
53 #define GetOpenDrv(wDevID) (&mciOpenDrv[MMSYSTEM_DevIDToIndex(wDevID)])
55 /* The wDevID's returned by wine were originally in the range
56 * 0 - (MAXMCIDRIVERS - 1) and used directly as array indices.
57 * Unfortunately, ms-windows uses wDevID of zero to indicate
58 * errors. Now, multimedia drivers must pass the wDevID through
59 * MMSYSTEM_DevIDToIndex to get an index in that range. An
60 * aribtrary value, MMSYSTEM_MAGIC is added to the wDevID seen
61 * by the windows programs.
64 #define MMSYSTEM_MAGIC 0x0F00
66 /**************************************************************************
67 * MMSYSTEM_DevIDToIndex [internal]
69 int MMSYSTEM_DevIDToIndex(UINT16 wDevID
) {
70 return wDevID
- MMSYSTEM_MAGIC
;
73 /**************************************************************************
74 * MMSYSTEM_FirstDevId [internal]
76 UINT16
MMSYSTEM_FirstDevID(void)
78 return MMSYSTEM_MAGIC
;
81 /**************************************************************************
82 * MMSYSTEM_NextDevId [internal]
84 UINT16
MMSYSTEM_NextDevID(UINT16 wDevID
) {
88 /**************************************************************************
89 * MMSYSTEM_DevIdValid [internal]
91 BOOL32
MMSYSTEM_DevIDValid(UINT16 wDevID
) {
92 return wDevID
>= 0x0F00 && wDevID
< (0x0F00 + MAXMCIDRIVERS
);
95 /**************************************************************************
96 * MMSYSTEM_WEP [MMSYSTEM.1]
98 int MMSYSTEM_WEP(HINSTANCE16 hInstance
, WORD wDataSeg
,
99 WORD cbHeapSize
, LPSTR lpCmdLine
)
101 fprintf(stderr
, "STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance
);
105 /**************************************************************************
106 * sndPlaySound [MMSYSTEM.2]
108 BOOL16
sndPlaySound(LPCSTR lpszSoundName
, UINT16 uFlags
)
116 dprintf_mmsys(stddeb
, "sndPlaySound // SoundName='%s' uFlags=%04X !\n",
117 lpszSoundName
, uFlags
);
118 if (lpszSoundName
== NULL
) {
119 dprintf_mmsys(stddeb
, "sndPlaySound // Stop !\n");
122 hmmio
= mmioOpen((LPSTR
)lpszSoundName
, NULL
,
123 MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
125 if (uFlags
& SND_MEMORY
) {
126 dprintf_mmsys(stddeb
, "sndPlaySound // SND_MEMORY flag not implemented!\n");
132 dprintf_mmsys(stddeb
, "sndPlaySound // searching in SystemSound List !\n");
133 GetProfileString32A("Sounds", (LPSTR
)lpszSoundName
, "", str
, sizeof(str
));
134 if (strlen(str
) == 0) return FALSE
;
135 if ( (ptr
= (LPSTR
)strchr(str
, ',')) != NULL
) *ptr
= '\0';
136 hmmio
= mmioOpen(str
, NULL
, MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
139 dprintf_mmsys(stddeb
, "sndPlaySound // can't find SystemSound='%s' !\n", str
);
144 if (mmioDescend(hmmio
, &ckMainRIFF
, NULL
, 0) == 0)
146 dprintf_mmsys(stddeb
, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
147 (LPSTR
)&ckMainRIFF
.ckid
, (LPSTR
)&ckMainRIFF
.fccType
, ckMainRIFF
.cksize
);
149 if ((ckMainRIFF
.ckid
== FOURCC_RIFF
) &&
150 (ckMainRIFF
.fccType
== mmioFOURCC('W', 'A', 'V', 'E')))
154 mmckInfo
.ckid
= mmioFOURCC('f', 'm', 't', ' ');
156 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
158 PCMWAVEFORMAT pcmWaveFormat
;
160 dprintf_mmsys(stddeb
, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
161 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
163 if (mmioRead(hmmio
, (HPSTR
) &pcmWaveFormat
,
164 (long) sizeof(PCMWAVEFORMAT
)) == (long) sizeof(PCMWAVEFORMAT
))
167 dprintf_mmsys(stddeb
, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat
.wf
.wFormatTag
);
168 dprintf_mmsys(stddeb
, "sndPlaySound // nChannels=%d \n", pcmWaveFormat
.wf
.nChannels
);
169 dprintf_mmsys(stddeb
, "sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat
.wf
.nSamplesPerSec
);
170 dprintf_mmsys(stddeb
, "sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat
.wf
.nAvgBytesPerSec
);
171 dprintf_mmsys(stddeb
, "sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat
.wf
.nBlockAlign
);
172 dprintf_mmsys(stddeb
, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat
.wBitsPerSample
);
174 mmckInfo
.ckid
= mmioFOURCC('d', 'a', 't', 'a');
175 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) == 0)
177 LPWAVEFORMAT lpFormat
= (LPWAVEFORMAT
) SEGPTR_ALLOC(sizeof(PCMWAVEFORMAT
));
178 LPWAVEOPENDESC lpWaveDesc
= (LPWAVEOPENDESC
) SEGPTR_ALLOC(sizeof(WAVEOPENDESC
));
181 dprintf_mmsys(stddeb
, "sndPlaySound // Chunk Found \
182 ckid=%.4s fccType=%.4s cksize=%08lX \n", (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
, mmckInfo
.cksize
);
184 pcmWaveFormat
.wf
.nAvgBytesPerSec
= pcmWaveFormat
.wf
.nSamplesPerSec
*
185 pcmWaveFormat
.wf
.nBlockAlign
;
186 memcpy(lpFormat
, &pcmWaveFormat
, sizeof(PCMWAVEFORMAT
));
188 lpWaveDesc
->hWave
= 0;
189 lpWaveDesc
->lpFormat
= (LPWAVEFORMAT
) SEGPTR_GET(lpFormat
);
191 dwRet
= wodMessage( MMSYSTEM_FirstDevID(),
192 WODM_OPEN
, 0, (DWORD
)SEGPTR_GET(lpWaveDesc
), CALLBACK_NULL
);
193 SEGPTR_FREE(lpFormat
);
194 SEGPTR_FREE(lpWaveDesc
);
196 if (dwRet
== MMSYSERR_NOERROR
)
198 LPWAVEHDR lpWaveHdr
= (LPWAVEHDR
) SEGPTR_ALLOC(sizeof(WAVEHDR
));
199 SEGPTR spWaveHdr
= SEGPTR_GET(lpWaveHdr
);
201 INT32 count
, bufsize
;
204 hData
= GlobalAlloc16(GMEM_MOVEABLE
, bufsize
);
205 lpWaveHdr
->lpData
= (LPSTR
) WIN16_GlobalLock16(hData
);
206 lpWaveHdr
->dwBufferLength
= bufsize
;
207 lpWaveHdr
->dwUser
= 0L;
208 lpWaveHdr
->dwFlags
= 0L;
209 lpWaveHdr
->dwLoops
= 0L;
211 dwRet
= wodMessage( MMSYSTEM_FirstDevID(),
212 WODM_PREPARE
, 0, (DWORD
)spWaveHdr
, sizeof(WAVEHDR
));
213 if (dwRet
== MMSYSERR_NOERROR
)
217 count
= mmioRead(hmmio
, PTR_SEG_TO_LIN(lpWaveHdr
->lpData
), bufsize
);
218 if (count
< 1) break;
219 lpWaveHdr
->dwBufferLength
= count
;
220 /* lpWaveHdr->dwBytesRecorded = count; */
221 wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE
,
222 0, (DWORD
)spWaveHdr
, sizeof(WAVEHDR
));
224 wodMessage( MMSYSTEM_FirstDevID(),
225 WODM_UNPREPARE
, 0, (DWORD
)spWaveHdr
, sizeof(WAVEHDR
));
226 wodMessage( MMSYSTEM_FirstDevID(),
227 WODM_CLOSE
, 0, 0L, 0L);
231 else dprintf_mmsys(stddeb
, "sndPlaySound // can't prepare WaveOut device !\n");
233 GlobalUnlock16(hData
);
236 SEGPTR_FREE(lpWaveHdr
);
244 if (hmmio
!= 0) mmioClose(hmmio
, 0);
248 /**************************************************************************
249 * mmsystemGetVersion [MMSYSTEM.5]
251 WORD
mmsystemGetVersion()
253 dprintf_mmsys(stddeb
, "mmsystemGetVersion // 0.4.0 ...?... :-) !\n");
257 /**************************************************************************
258 * DriverProc [MMSYSTEM.6]
260 LRESULT
DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
261 DWORD dwParam1
, DWORD dwParam2
)
263 return DrvDefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
266 /**************************************************************************
267 * DriverCallback [MMSYSTEM.31]
269 BOOL16
DriverCallback(DWORD dwCallBack
, UINT16 uFlags
, HANDLE16 hDev
,
270 WORD wMsg
, DWORD dwUser
, DWORD dwParam1
, DWORD dwParam2
)
272 dprintf_mmsys(stddeb
, "DriverCallback(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
273 dwCallBack
, uFlags
, hDev
, wMsg
, dwUser
, dwParam1
, dwParam2
);
274 switch(uFlags
& DCB_TYPEMASK
) {
276 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_NULL !\n");
279 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_WINDOW !\n");
282 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_TASK !\n");
285 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_FUNCTION !\n");
291 /**************************************************************************
292 * auxGetNumDevs [MMSYSTEM.350]
294 UINT16
auxGetNumDevs()
297 dprintf_mmsys(stddeb
, "auxGetNumDevs !\n");
298 count
+= auxMessage(0, AUXDM_GETNUMDEVS
, 0L, 0L, 0L);
299 dprintf_mmsys(stddeb
, "auxGetNumDevs return %u \n", count
);
303 /**************************************************************************
304 * auxGetDevCaps [MMSYSTEM.351]
306 UINT16
auxGetDevCaps(UINT16 uDeviceID
, AUXCAPS
* lpCaps
, UINT16 uSize
)
308 dprintf_mmsys(stddeb
, "auxGetDevCaps(%04X, %p, %d) !\n",
309 uDeviceID
, lpCaps
, uSize
);
310 return auxMessage(uDeviceID
, AUXDM_GETDEVCAPS
,
311 0L, (DWORD
)lpCaps
, (DWORD
)uSize
);
314 /**************************************************************************
315 * auxGetVolume [MMSYSTEM.352]
317 UINT16
auxGetVolume(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
319 dprintf_mmsys(stddeb
, "auxGetVolume(%04X, %p) !\n", uDeviceID
, lpdwVolume
);
320 return auxMessage(uDeviceID
, AUXDM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
323 /**************************************************************************
324 * auxSetVolume [MMSYSTEM.353]
326 UINT16
auxSetVolume(UINT16 uDeviceID
, DWORD dwVolume
)
328 dprintf_mmsys(stddeb
, "auxSetVolume(%04X, %08lX) !\n", uDeviceID
, dwVolume
);
329 return auxMessage(uDeviceID
, AUXDM_SETVOLUME
, 0L, dwVolume
, 0L);
332 /**************************************************************************
333 * auxOutMessage [MMSYSTEM.354]
335 DWORD
auxOutMessage(UINT16 uDeviceID
, UINT16 uMessage
, DWORD dw1
, DWORD dw2
)
337 dprintf_mmsys(stddeb
, "auxOutMessage(%04X, %04X, %08lX, %08lX)\n",
338 uDeviceID
, uMessage
, dw1
, dw2
);
339 return auxMessage(uDeviceID
, uMessage
, 0L, dw1
, dw2
);
342 /**************************************************************************
343 * mciGetErrorString [MMSYSTEM.706]
345 BOOL16
mciGetErrorString (DWORD wError
, LPSTR lpstrBuffer
, UINT16 uLength
)
348 dprintf_mmsys(stddeb
, "mciGetErrorString(%08lX, %p, %d);\n", wError
, lpstrBuffer
, uLength
);
349 if ((lpstrBuffer
== NULL
) || (uLength
< 1)) return(FALSE
);
350 lpstrBuffer
[0] = '\0';
352 case MCIERR_INVALID_DEVICE_ID
:
353 msgptr
= "Invalid MCI device ID. Use the ID returned when opening the MCI device.";
355 case MCIERR_UNRECOGNIZED_KEYWORD
:
356 msgptr
= "The driver cannot recognize the specified command parameter.";
358 case MCIERR_UNRECOGNIZED_COMMAND
:
359 msgptr
= "The driver cannot recognize the specified command.";
361 case MCIERR_HARDWARE
:
362 msgptr
= "There is a problem with your media device. Make sure it is working correctly or contact the device manufacturer.";
364 case MCIERR_INVALID_DEVICE_NAME
:
365 msgptr
= "The specified device is not open or is not recognized by MCI.";
367 case MCIERR_OUT_OF_MEMORY
:
368 msgptr
= "Not enough memory available for this task. \nQuit one or more applications to increase available memory, and then try again.";
370 case MCIERR_DEVICE_OPEN
:
371 msgptr
= "The device name is already being used as an alias by this application. Use a unique alias.";
373 case MCIERR_CANNOT_LOAD_DRIVER
:
374 msgptr
= "There is an undetectable problem in loading the specified device driver.";
376 case MCIERR_MISSING_COMMAND_STRING
:
377 msgptr
= "No command was specified.";
379 case MCIERR_PARAM_OVERFLOW
:
380 msgptr
= "The output string was to large to fit in the return buffer. Increase the size of the buffer.";
382 case MCIERR_MISSING_STRING_ARGUMENT
:
383 msgptr
= "The specified command requires a character-string parameter. Please provide one.";
385 case MCIERR_BAD_INTEGER
:
386 msgptr
= "The specified integer is invalid for this command.";
388 case MCIERR_PARSER_INTERNAL
:
389 msgptr
= "The device driver returned an invalid return type. Check with the device manufacturer about obtaining a new driver.";
391 case MCIERR_DRIVER_INTERNAL
:
392 msgptr
= "There is a problem with the device driver. Check with the device manufacturer about obtaining a new driver.";
394 case MCIERR_MISSING_PARAMETER
:
395 msgptr
= "The specified command requires a parameter. Please supply one.";
397 case MCIERR_UNSUPPORTED_FUNCTION
:
398 msgptr
= "The MCI device you are using does not support the specified command.";
400 case MCIERR_FILE_NOT_FOUND
:
401 msgptr
= "Cannot find the specified file. Make sure the path and filename are correct.";
403 case MCIERR_DEVICE_NOT_READY
:
404 msgptr
= "The device driver is not ready.";
406 case MCIERR_INTERNAL
:
407 msgptr
= "A problem occurred in initializing MCI. Try restarting Windows.";
410 msgptr
= "There is a problem with the device driver. The driver has closed. Cannot access error.";
412 case MCIERR_CANNOT_USE_ALL
:
413 msgptr
= "Cannot use 'all' as the device name with the specified command.";
415 case MCIERR_MULTIPLE
:
416 msgptr
= "Errors occurred in more than one device. Specify each command and device separately to determine which devices caused the error";
418 case MCIERR_EXTENSION_NOT_FOUND
:
419 msgptr
= "Cannot determine the device type from the given filename extension.";
421 case MCIERR_OUTOFRANGE
:
422 msgptr
= "The specified parameter is out of range for the specified command.";
424 case MCIERR_FLAGS_NOT_COMPATIBLE
:
425 msgptr
= "The specified parameters cannot be used together.";
427 case MCIERR_FILE_NOT_SAVED
:
428 msgptr
= "Cannot save the specified file. Make sure you have enough disk space or are still connected to the network.";
430 case MCIERR_DEVICE_TYPE_REQUIRED
:
431 msgptr
= "Cannot find the specified device. Make sure it is installed or that the device name is spelled correctly.";
433 case MCIERR_DEVICE_LOCKED
:
434 msgptr
= "The specified device is now being closed. Wait a few seconds, and then try again.";
436 case MCIERR_DUPLICATE_ALIAS
:
437 msgptr
= "The specified alias is already being used in this application. Use a unique alias.";
439 case MCIERR_BAD_CONSTANT
:
440 msgptr
= "The specified parameter is invalid for this command.";
442 case MCIERR_MUST_USE_SHAREABLE
:
443 msgptr
= "The device driver is already in use. To share it, use the 'shareable' parameter with each 'open' command.";
445 case MCIERR_MISSING_DEVICE_NAME
:
446 msgptr
= "The specified command requires an alias, file, driver, or device name. Please supply one.";
448 case MCIERR_BAD_TIME_FORMAT
:
449 msgptr
= "The specified value for the time format is invalid. Refer to the MCI documentation for valid formats.";
451 case MCIERR_NO_CLOSING_QUOTE
:
452 msgptr
= "A closing double-quotation mark is missing from the parameter value. Please supply one.";
454 case MCIERR_DUPLICATE_FLAGS
:
455 msgptr
= "A parameter or value was specified twice. Only specify it once.";
457 case MCIERR_INVALID_FILE
:
458 msgptr
= "The specified file cannot be played on the specified MCI device. The file may be corrupt, or not in the correct format.";
460 case MCIERR_NULL_PARAMETER_BLOCK
:
461 msgptr
= "A null parameter block was passed to MCI.";
463 case MCIERR_UNNAMED_RESOURCE
:
464 msgptr
= "Cannot save an unnamed file. Supply a filename.";
466 case MCIERR_NEW_REQUIRES_ALIAS
:
467 msgptr
= "You must specify an alias when using the 'new' parameter.";
469 case MCIERR_NOTIFY_ON_AUTO_OPEN
:
470 msgptr
= "Cannot use the 'notify' flag with auto-opened devices.";
472 case MCIERR_NO_ELEMENT_ALLOWED
:
473 msgptr
= "Cannot use a filename with the specified device.";
475 case MCIERR_NONAPPLICABLE_FUNCTION
:
476 msgptr
= "Cannot carry out the commands in the order specified. Correct the command sequence, and then try again.";
478 case MCIERR_ILLEGAL_FOR_AUTO_OPEN
:
479 msgptr
= "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again.";
481 case MCIERR_FILENAME_REQUIRED
:
482 msgptr
= "The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension.";
484 case MCIERR_EXTRA_CHARACTERS
:
485 msgptr
= "Cannot specify extra characters after a string enclosed in quotation marks.";
487 case MCIERR_DEVICE_NOT_INSTALLED
:
488 msgptr
= "The specified device is not installed on the system. Use the Drivers option in Control Panel to install the device.";
491 msgptr
= "Cannot access the specified file or MCI device. Try changing directories or restarting your computer.";
494 msgptr
= "Cannot access the specified file or MCI device because the application cannot change directories.";
496 case MCIERR_SET_DRIVE
:
497 msgptr
= "Cannot access specified file or MCI device because the application cannot change drives.";
499 case MCIERR_DEVICE_LENGTH
:
500 msgptr
= "Specify a device or driver name that is less than 79 characters.";
502 case MCIERR_DEVICE_ORD_LENGTH
:
503 msgptr
= "Specify a device or driver name that is less than 69 characters.";
505 case MCIERR_NO_INTEGER
:
506 msgptr
= "The specified command requires an integer parameter. Please provide one.";
508 case MCIERR_WAVE_OUTPUTSINUSE
:
509 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.";
511 case MCIERR_WAVE_SETOUTPUTINUSE
:
512 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.";
514 case MCIERR_WAVE_INPUTSINUSE
:
515 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.";
517 case MCIERR_WAVE_SETINPUTINUSE
:
518 msgptr
= "Cannot set the current wave device for recording because it is in use. Wait until the device is free, and then try again.";
520 case MCIERR_WAVE_OUTPUTUNSPECIFIED
:
521 msgptr
= "Any compatible waveform playback device may be used.";
523 case MCIERR_WAVE_INPUTUNSPECIFIED
:
524 msgptr
= "Any compatible waveform recording device may be used.";
526 case MCIERR_WAVE_OUTPUTSUNSUITABLE
:
527 msgptr
= "No wave device that can play files in the current format is installed. Use the Drivers option to install the wave device.";
529 case MCIERR_WAVE_SETOUTPUTUNSUITABLE
:
530 msgptr
= "The device you are trying to play to cannot recognize the current file format.";
532 case MCIERR_WAVE_INPUTSUNSUITABLE
:
533 msgptr
= "No wave device that can record files in the current format is installed. Use the Drivers option to install the wave device.";
535 case MCIERR_WAVE_SETINPUTUNSUITABLE
:
536 msgptr
= "The device you are trying to record from cannot recognize the current file format.";
538 case MCIERR_NO_WINDOW
:
539 msgptr
= "There is no display window.";
541 case MCIERR_CREATEWINDOW
:
542 msgptr
= "Could not create or use window.";
544 case MCIERR_FILE_READ
:
545 msgptr
= "Cannot read the specified file. Make sure the file is still present, or check your disk or network connection.";
547 case MCIERR_FILE_WRITE
:
548 msgptr
= "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network.";
552 #define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80)
553 #define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81)
554 #define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82)
555 #define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83)
556 #define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84)
557 #define MCIERR_SEQ_TIMER (MCIERR_BASE + 85)
558 #define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86)
559 #define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87)
568 msg# 520 : digitalvideo
581 msg# 533 : milliseconds
588 msg# 540 : smpte 30 drop
594 msgptr
= "Unknown MCI Error !\n";
597 lstrcpyn32A(lpstrBuffer
, msgptr
, uLength
);
602 /**************************************************************************
603 * mciDriverNotify [MMSYSTEM.711]
605 BOOL16
mciDriverNotify(HWND16 hWndCallBack
, UINT16 wDevID
, UINT16 wStatus
)
607 dprintf_mmsys(stddeb
, "mciDriverNotify(%04X, %u, %04X)\n", hWndCallBack
, wDevID
, wStatus
);
608 if (!IsWindow32(hWndCallBack
)) return FALSE
;
609 dprintf_mmsys(stddeb
, "mciDriverNotify // before PostMessage\n");
610 PostMessage16( hWndCallBack
, MM_MCINOTIFY
, wStatus
,
611 MAKELONG(GetDrv(wDevID
)->wDeviceID
, 0));
615 /**************************************************************************
619 DWORD
mciOpen(DWORD dwParam
, LPMCI_OPEN_PARMS lp16Parms
)
622 LPMCI_OPEN_PARMS lpParms
;
624 UINT16 wDevID
= MMSYSTEM_FirstDevID();
626 lpParms
= PTR_SEG_TO_LIN(lp16Parms
);
627 dprintf_mmsys(stddeb
, "mciOpen(%08lX, %p (%p))\n", dwParam
, lp16Parms
, lpParms
);
628 if (lp16Parms
== NULL
) return MCIERR_INTERNAL
;
629 while(GetDrv(wDevID
)->wType
!= 0) {
630 wDevID
= MMSYSTEM_NextDevID(wDevID
);
631 if (!MMSYSTEM_DevIDValid(wDevID
)) {
632 dprintf_mmsys(stddeb
, "MCI_OPEN // MAXMCIDRIVERS reached !\n");
633 return MCIERR_INTERNAL
;
636 dprintf_mmsys(stddeb
, "mciOpen // wDevID=%04X \n", wDevID
);
637 memcpy(GetOpenDrv(wDevID
),lpParms
,sizeof(*lpParms
));
639 if (dwParam
& MCI_OPEN_ELEMENT
) {
642 dprintf_mmsys(stddeb
,"mciOpen // lpstrElementName='%s'\n",
643 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
)
645 s
=(char*)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
);
648 GetProfileString32A("mci extensions",t
+1,"*",str
,sizeof(str
));
650 if (strcmp(str
, "CDAUDIO") == 0) {
651 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
653 if (strcmp(str
, "WAVEAUDIO") == 0) {
654 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
656 if (strcmp(str
, "SEQUENCER") == 0) {
657 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
659 if (strcmp(str
, "ANIMATION1") == 0) {
660 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
662 if (strcmp(str
, "AVIVIDEO") == 0) {
663 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
665 if (strcmp(str
,"*") == 0) {
666 dprintf_mmsys(stddeb
,"No [mci extensions] entry for %s found.\n",t
);
667 return MCIERR_EXTENSION_NOT_FOUND
;
669 dprintf_mmsys(stddeb
,"[mci extensions] entry %s for %s not supported.\n",str
,t
);
672 return MCIERR_EXTENSION_NOT_FOUND
;
675 if (dwParam
& MCI_OPEN_ALIAS
) {
676 dprintf_mmsys(stddeb
, "MCI_OPEN // Alias='%s' !\n",
677 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
));
678 GetOpenDrv(wDevID
)->lpstrAlias
= SEGPTR_GET(
679 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
)));
680 /* mplayer does allocate alias to CDAUDIO */
682 if (dwParam
& MCI_OPEN_TYPE
) {
683 if (dwParam
& MCI_OPEN_TYPE_ID
) {
684 dprintf_mmsys(stddeb
, "MCI_OPEN // Dev=%08lx !\n", lpParms
->lpstrDeviceType
);
685 uDevTyp
= LOWORD((DWORD
)lpParms
->lpstrDeviceType
);
686 GetOpenDrv(wDevID
)->lpstrDeviceType
=lpParms
->lpstrDeviceType
;
688 if (lpParms
->lpstrDeviceType
== NULL
) return MCIERR_INTERNAL
;
689 dprintf_mmsys(stddeb
, "MCI_OPEN // Dev='%s' !\n",
690 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
691 GetOpenDrv(wDevID
)->lpstrDeviceType
= SEGPTR_GET(
692 SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
)));
693 strcpy(str
, PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
695 if (strcmp(str
, "CDAUDIO") == 0) {
696 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
698 if (strcmp(str
, "WAVEAUDIO") == 0) {
699 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
701 if (strcmp(str
, "SEQUENCER") == 0) {
702 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
704 if (strcmp(str
, "ANIMATION1") == 0) {
705 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
707 if (strcmp(str
, "AVIVIDEO") == 0) {
708 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
712 GetDrv(wDevID
)->wType
= uDevTyp
;
713 GetDrv(wDevID
)->wDeviceID
= wDevID
;
714 lpParms
->wDeviceID
= wDevID
;
715 dprintf_mmsys(stddeb
, "MCI_OPEN // mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
716 wDevID
, uDevTyp
, lpParms
->wDeviceID
);
719 case MCI_DEVTYPE_CD_AUDIO
:
720 return CDAUDIO_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
721 dwParam
, (DWORD
)lp16Parms
);
722 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
723 return WAVE_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
724 dwParam
, (DWORD
)lp16Parms
);
725 case MCI_DEVTYPE_SEQUENCER
:
726 return MIDI_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
727 dwParam
, (DWORD
)lp16Parms
);
728 case MCI_DEVTYPE_ANIMATION
:
729 return ANIM_DriverProc( 0, 0, MCI_OPEN_DRIVER
,
730 dwParam
, (DWORD
)lp16Parms
);
731 case MCI_DEVTYPE_DIGITAL_VIDEO
:
732 dprintf_mmsys(stddeb
, "MCI_OPEN // No DIGITAL_VIDEO yet !\n");
733 return MCIERR_DEVICE_NOT_INSTALLED
;
735 dprintf_mmsys(stddeb
, "MCI_OPEN // Invalid Device Name '%08lx' !\n", lpParms
->lpstrDeviceType
);
736 return MCIERR_INVALID_DEVICE_NAME
;
738 return MCIERR_INTERNAL
;
742 /**************************************************************************
743 * mciClose [internal]
745 DWORD
mciClose(UINT16 wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
747 DWORD dwRet
= MCIERR_INTERNAL
;
748 dprintf_mmsys(stddeb
, "mciClose(%u, %08lX, %p)\n", wDevID
, dwParam
, lpParms
);
749 switch(GetDrv(wDevID
)->wType
) {
750 case MCI_DEVTYPE_CD_AUDIO
:
751 dwRet
= CDAUDIO_DriverProc(GetDrv(wDevID
)->wDeviceID
,0,
752 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
754 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
755 dwRet
= WAVE_DriverProc(GetDrv(wDevID
)->wDeviceID
, 0,
759 case MCI_DEVTYPE_SEQUENCER
:
760 dwRet
= MIDI_DriverProc(GetDrv(wDevID
)->wDeviceID
, 0,
764 case MCI_DEVTYPE_ANIMATION
:
765 dwRet
= ANIM_DriverProc(GetDrv(wDevID
)->wDeviceID
, 0,
770 dprintf_mmsys(stddeb
, "mciClose() // unknown device type=%04X !\n", GetDrv(wDevID
)->wType
);
772 GetDrv(wDevID
)->wType
= 0;
777 /**************************************************************************
778 * mciSound [internal]
780 DWORD
mciSysInfo(DWORD dwFlags
, LPMCI_SYSINFO_PARMS lpParms
)
786 LPSTR SysFile
= "SYSTEM.INI";
787 dprintf_mci(stddeb
, "mciSysInfo(%08lX, %08lX)\n", dwFlags
, (DWORD
)lpParms
);
788 lpstrReturn
= PTR_SEG_TO_LIN(lpParms
->lpstrReturn
);
790 case MCI_SYSINFO_QUANTITY
:
791 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_QUANTITY \n");
792 lpdwRet
= (DWORD
*)lpstrReturn
;
793 *(lpdwRet
) = InstalledCount
;
795 case MCI_SYSINFO_INSTALLNAME
:
796 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_INSTALLNAME \n");
797 if (lpInstallNames
== NULL
) {
799 InstalledListLen
= 0;
800 ptr
= lpInstallNames
= xmalloc(2048);
801 GetPrivateProfileString32A("mci", NULL
, "", lpInstallNames
, 2000, SysFile
);
802 while(strlen(ptr
) > 0) {
803 dprintf_mci(stddeb
, "---> '%s' \n", ptr
);
804 len
= strlen(ptr
) + 1;
806 InstalledListLen
+= len
;
810 if (lpParms
->dwRetSize
< InstalledListLen
)
811 lstrcpyn32A(lpstrReturn
, lpInstallNames
, lpParms
->dwRetSize
- 1);
813 strcpy(lpstrReturn
, lpInstallNames
);
815 case MCI_SYSINFO_NAME
:
816 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_NAME \n");
818 case MCI_SYSINFO_OPEN
:
819 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_OPEN \n");
822 return MMSYSERR_INVALPARAM
;
825 /**************************************************************************
826 * mciSound [internal]
828 DWORD
mciSound(UINT16 wDevID
, DWORD dwParam
, LPMCI_SOUND_PARMS lpParms
)
830 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
831 if (dwParam
& MCI_SOUND_NAME
)
832 dprintf_mci(stddeb
, "MCI_SOUND // file='%s' !\n", lpParms
->lpstrSoundName
);
833 return MCIERR_INVALID_DEVICE_ID
;
837 static const char *_mciCommandToString(UINT16 wMsg
)
839 static char buffer
[100];
841 #define CASE(s) case (s): return #s
852 CASE(MCI_GETDEVCAPS
);
876 sprintf(buffer
, "%04X", wMsg
);
882 /**************************************************************************
883 * mciSendCommand [MMSYSTEM.701]
885 DWORD
mciSendCommand(UINT16 wDevID
, UINT16 wMsg
, DWORD dwParam1
, DWORD dwParam2
)
888 dprintf_mci(stddeb
, "mciSendCommand(%04X, %s, %08lX, %08lX)\n",
889 wDevID
, _mciCommandToString(wMsg
), dwParam1
, dwParam2
);
893 return mciOpen(dwParam1
, (LPMCI_OPEN_PARMS
)dwParam2
);
895 return mciClose( wDevID
, dwParam1
,
896 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
898 return mciSysInfo( dwParam1
,
899 (LPMCI_SYSINFO_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
901 switch(GetDrv(wDevID
)->wType
)
903 case MCI_DEVTYPE_CD_AUDIO
:
904 return CDAUDIO_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
905 wMsg
, dwParam1
, dwParam2
);
906 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
907 return WAVE_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
908 wMsg
, dwParam1
, dwParam2
);
909 case MCI_DEVTYPE_SEQUENCER
:
910 return MIDI_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
911 wMsg
, dwParam1
, dwParam2
);
912 case MCI_DEVTYPE_ANIMATION
:
913 return ANIM_DriverProc(GetDrv(wDevID
)->wDeviceID
, hDrv
,
914 wMsg
, dwParam1
, dwParam2
);
917 "mciSendCommand() // unknown device type=%04X !\n",
918 GetDrv(wDevID
)->wType
);
921 return MMSYSERR_INVALPARAM
;
924 /**************************************************************************
925 * mciGetDeviceID [MMSYSTEM.703]
927 UINT16
mciGetDeviceID (LPCSTR lpstrName
)
931 dprintf_mci(stddeb
, "mciGetDeviceID(\"%s\")\n", lpstrName
);
932 if (lpstrName
&& !lstrcmpi32A(lpstrName
, "ALL"))
933 return MCI_ALL_DEVICE_ID
;
938 wDevID
= MMSYSTEM_FirstDevID();
939 while(GetDrv(wDevID
)->wType
) {
940 if (GetOpenDrv(wDevID
)->lpstrDeviceType
&&
941 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrDeviceType
), lpstrName
) == 0)
944 if (GetOpenDrv(wDevID
)->lpstrAlias
&&
945 strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID
)->lpstrAlias
), lpstrName
) == 0)
948 wDevID
= MMSYSTEM_NextDevID(wDevID
);
954 /**************************************************************************
955 * mciSetYieldProc [MMSYSTEM.714]
957 BOOL16
mciSetYieldProc (UINT16 uDeviceID
,
958 YIELDPROC fpYieldProc
, DWORD dwYieldData
)
963 /**************************************************************************
964 * mciGetDeviceIDFromElementID [MMSYSTEM.715]
966 UINT16
mciGetDeviceIDFromElementID(DWORD dwElementID
, LPCSTR lpstrType
)
971 /**************************************************************************
972 * mciGetYieldProc [MMSYSTEM.716]
974 YIELDPROC
mciGetYieldProc(UINT16 uDeviceID
, DWORD
* lpdwYieldData
)
979 /**************************************************************************
980 * mciGetCreatorTask [MMSYSTEM.717]
982 HTASK16
mciGetCreatorTask(UINT16 uDeviceID
)
987 /**************************************************************************
988 * midiOutGetNumDevs [MMSYSTEM.201]
990 UINT16
midiOutGetNumDevs(void)
993 dprintf_mmsys(stddeb
, "midiOutGetNumDevs\n");
994 count
+= modMessage(0, MODM_GETNUMDEVS
, 0L, 0L, 0L);
995 dprintf_mmsys(stddeb
, "midiOutGetNumDevs return %u \n", count
);
999 /**************************************************************************
1000 * midiOutGetDevCaps [MMSYSTEM.202]
1002 UINT16
midiOutGetDevCaps(UINT16 uDeviceID
, MIDIOUTCAPS
* lpCaps
, UINT16 uSize
)
1004 dprintf_mmsys(stddeb
, "midiOutGetDevCaps\n");
1008 /**************************************************************************
1009 * midiOutGetErrorText [MMSYSTEM.203]
1011 UINT16
midiOutGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1013 dprintf_mmsys(stddeb
, "midiOutGetErrorText\n");
1014 return midiGetErrorText(uError
, lpText
, uSize
);
1018 /**************************************************************************
1019 * midiGetErrorText [internal]
1021 UINT16
midiGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1024 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1027 case MIDIERR_UNPREPARED
:
1028 msgptr
= "The MIDI header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1030 case MIDIERR_STILLPLAYING
:
1031 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1034 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.";
1036 case MIDIERR_NOTREADY
:
1037 msgptr
= "The port is transmitting data to the device. Wait until the data has been transmitted, and then try again.";
1039 case MIDIERR_NODEVICE
:
1040 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.";
1042 case MIDIERR_INVALIDSETUP
:
1043 msgptr
= "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the Windows SYSTEM directory, and then try again.";
1046 msg# 336 : Cannot use the song-pointer time format and the SMPTE time-format together.
1047 msg# 337 : The specified MIDI device is already in use. Wait until it is free, and then try again.
1048 msg# 338 : The specified MIDI device is not installed on the system. Use the Drivers option in Control Panel to install the driver.
1049 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.
1050 msg# 340 : An error occurred using the specified port.
1051 msg# 341 : All multimedia timers are being used by other applications. Quit one of these applications, and then try again.
1052 msg# 342 : There is no current MIDI port.
1053 msg# 343 : There are no MIDI devices installed on the system. Use the Drivers option in Control Panel to install the driver.
1056 msgptr
= "Unknown MIDI Error !\n";
1059 lstrcpyn32A(lpText
, msgptr
, uSize
);
1063 /**************************************************************************
1064 * midiOutOpen [MMSYSTEM.204]
1066 UINT16
midiOutOpen(HMIDIOUT16
* lphMidiOut
, UINT16 uDeviceID
,
1067 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1070 LPMIDIOPENDESC lpDesc
;
1071 LPMIDIOPENDESC lp16Desc
;
1073 BOOL32 bMapperFlg
= FALSE
;
1074 if (lphMidiOut
!= NULL
) *lphMidiOut
= 0;
1075 dprintf_mmsys(stddeb
, "midiOutOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1076 lphMidiOut
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1077 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
1078 dprintf_mmsys(stddeb
, "midiOutOpen // MIDI_MAPPER mode requested !\n");
1082 hMidiOut
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1083 if (lphMidiOut
!= NULL
) *lphMidiOut
= hMidiOut
;
1084 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiOut
);
1085 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1086 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1087 lpDesc
->hMidi
= hMidiOut
;
1088 lpDesc
->dwCallback
= dwCallback
;
1089 lpDesc
->dwInstance
= dwInstance
;
1090 while(uDeviceID
< MAXMIDIDRIVERS
) {
1091 dwRet
= modMessage(uDeviceID
, MODM_OPEN
,
1092 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1093 if (dwRet
== MMSYSERR_NOERROR
) break;
1094 if (!bMapperFlg
) break;
1096 dprintf_mmsys(stddeb
, "midiOutOpen // MIDI_MAPPER mode ! try next driver...\n");
1101 /**************************************************************************
1102 * midiOutClose [MMSYSTEM.205]
1104 UINT16
midiOutClose(HMIDIOUT16 hMidiOut
)
1106 LPMIDIOPENDESC lpDesc
;
1107 dprintf_mmsys(stddeb
, "midiOutClose(%04X)\n", hMidiOut
);
1108 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1109 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1110 return modMessage(0, MODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1113 /**************************************************************************
1114 * midiOutPrepareHeader [MMSYSTEM.206]
1116 UINT16
midiOutPrepareHeader(HMIDIOUT16 hMidiOut
,
1117 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1119 LPMIDIOPENDESC lpDesc
;
1120 dprintf_mmsys(stddeb
, "midiOutPrepareHeader(%04X, %p, %d)\n",
1121 hMidiOut
, lpMidiOutHdr
, uSize
);
1122 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1123 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1124 return modMessage(0, MODM_PREPARE
, lpDesc
->dwInstance
,
1125 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1128 /**************************************************************************
1129 * midiOutUnprepareHeader [MMSYSTEM.207]
1131 UINT16
midiOutUnprepareHeader(HMIDIOUT16 hMidiOut
,
1132 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1134 LPMIDIOPENDESC lpDesc
;
1135 dprintf_mmsys(stddeb
, "midiOutUnprepareHeader(%04X, %p, %d)\n",
1136 hMidiOut
, lpMidiOutHdr
, uSize
);
1137 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1138 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1139 return modMessage(0, MODM_UNPREPARE
, lpDesc
->dwInstance
,
1140 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1143 /**************************************************************************
1144 * midiOutShortMsg [MMSYSTEM.208]
1146 UINT16
midiOutShortMsg(HMIDIOUT16 hMidiOut
, DWORD dwMsg
)
1148 LPMIDIOPENDESC lpDesc
;
1149 dprintf_mmsys(stddeb
, "midiOutShortMsg(%04X, %08lX)\n", hMidiOut
, dwMsg
);
1150 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1151 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1152 return modMessage(0, MODM_DATA
, lpDesc
->dwInstance
, dwMsg
, 0L);
1155 /**************************************************************************
1156 * midiOutLongMsg [MMSYSTEM.209]
1158 UINT16
midiOutLongMsg(HMIDIOUT16 hMidiOut
,
1159 MIDIHDR
* lpMidiOutHdr
, UINT16 uSize
)
1161 LPMIDIOPENDESC lpDesc
;
1162 dprintf_mmsys(stddeb
, "midiOutLongMsg(%04X, %p, %d)\n",
1163 hMidiOut
, lpMidiOutHdr
, uSize
);
1164 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1165 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1166 return modMessage(0, MODM_LONGDATA
, lpDesc
->dwInstance
,
1167 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1170 /**************************************************************************
1171 * midiOutReset [MMSYSTEM.210]
1173 UINT16
midiOutReset(HMIDIOUT16 hMidiOut
)
1175 LPMIDIOPENDESC lpDesc
;
1176 dprintf_mmsys(stddeb
, "midiOutReset(%04X)\n", hMidiOut
);
1177 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1178 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1179 return modMessage(0, MODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1182 /**************************************************************************
1183 * midiOutGetVolume [MMSYSTEM.211]
1185 UINT16
midiOutGetVolume(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
1187 dprintf_mmsys(stddeb
, "midiOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1188 return modMessage(uDeviceID
, MODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1192 /**************************************************************************
1193 * midiOutSetVolume [MMSYSTEM.212]
1195 UINT16
midiOutSetVolume(UINT16 uDeviceID
, DWORD dwVolume
)
1197 dprintf_mmsys(stddeb
, "midiOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1198 return modMessage(uDeviceID
, MODM_SETVOLUME
, 0L, dwVolume
, 0L);
1202 /**************************************************************************
1203 * midiOutCachePatches [MMSYSTEM.213]
1205 UINT16
midiOutCachePatches(HMIDIOUT16 hMidiOut
,
1206 UINT16 uBank
, WORD
* lpwPatchArray
, UINT16 uFlags
)
1208 /* not really necessary to support this */
1209 fprintf(stdnimp
, "midiOutCachePatches: not supported yet\n");
1210 return MMSYSERR_NOTSUPPORTED
;
1213 /**************************************************************************
1214 * midiOutCacheDrumPatches [MMSYSTEM.214]
1216 UINT16
midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut
,
1217 UINT16 uPatch
, WORD
* lpwKeyArray
, UINT16 uFlags
)
1219 fprintf(stdnimp
, "midiOutCacheDrumPatchesi: not supported yet\n");
1220 return MMSYSERR_NOTSUPPORTED
;
1223 /**************************************************************************
1224 * midiOutGetID [MMSYSTEM.215]
1226 UINT16
midiOutGetID(HMIDIOUT16 hMidiOut
, UINT16
* lpuDeviceID
)
1228 dprintf_mmsys(stddeb
, "midiOutGetID\n");
1232 /**************************************************************************
1233 * midiOutMessage [MMSYSTEM.216]
1235 DWORD
midiOutMessage(HMIDIOUT16 hMidiOut
, UINT16 uMessage
,
1236 DWORD dwParam1
, DWORD dwParam2
)
1238 LPMIDIOPENDESC lpDesc
;
1239 dprintf_mmsys(stddeb
, "midiOutMessage(%04X, %04X, %08lX, %08lX)\n",
1240 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
1241 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1242 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1243 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1247 /**************************************************************************
1248 * midiInGetNumDevs [MMSYSTEM.301]
1250 UINT16
midiInGetNumDevs(void)
1253 dprintf_mmsys(stddeb
, "midiInGetNumDevs\n");
1254 count
+= midMessage(0, MIDM_GETNUMDEVS
, 0L, 0L, 0L);
1255 dprintf_mmsys(stddeb
, "midiInGetNumDevs return %u \n", count
);
1259 /**************************************************************************
1260 * midiInGetDevCaps [MMSYSTEM.302]
1262 UINT16
midiInGetDevCaps(UINT16 uDeviceID
,
1263 LPMIDIINCAPS lpCaps
, UINT16 uSize
)
1265 dprintf_mmsys(stddeb
, "midiInGetDevCaps\n");
1269 /**************************************************************************
1270 * midiInGetErrorText [MMSYSTEM.303]
1272 UINT16
midiInGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1274 dprintf_mmsys(stddeb
, "midiInGetErrorText\n");
1275 return (midiGetErrorText(uError
, lpText
, uSize
));
1278 /**************************************************************************
1279 * midiInOpen [MMSYSTEM.304]
1281 UINT16
midiInOpen(HMIDIIN16
* lphMidiIn
, UINT16 uDeviceID
,
1282 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1285 LPMIDIOPENDESC lpDesc
;
1286 LPMIDIOPENDESC lp16Desc
;
1288 BOOL32 bMapperFlg
= FALSE
;
1289 if (lphMidiIn
!= NULL
) *lphMidiIn
= 0;
1290 dprintf_mmsys(stddeb
, "midiInOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1291 lphMidiIn
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1292 if (uDeviceID
== (UINT16
)MIDI_MAPPER
) {
1293 dprintf_mmsys(stddeb
, "midiInOpen // MIDI_MAPPER mode requested !\n");
1297 hMidiIn
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1298 if (lphMidiIn
!= NULL
) *lphMidiIn
= hMidiIn
;
1299 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiIn
);
1300 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1301 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1302 lpDesc
->hMidi
= hMidiIn
;
1303 lpDesc
->dwCallback
= dwCallback
;
1304 lpDesc
->dwInstance
= dwInstance
;
1305 while(uDeviceID
< MAXMIDIDRIVERS
) {
1306 dwRet
= midMessage(uDeviceID
, MIDM_OPEN
,
1307 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
1308 if (dwRet
== MMSYSERR_NOERROR
) break;
1309 if (!bMapperFlg
) break;
1311 dprintf_mmsys(stddeb
, "midiInOpen // MIDI_MAPPER mode ! try next driver...\n");
1316 /**************************************************************************
1317 * midiInClose [MMSYSTEM.305]
1319 UINT16
midiInClose(HMIDIIN16 hMidiIn
)
1321 LPMIDIOPENDESC lpDesc
;
1322 dprintf_mmsys(stddeb
, "midiInClose(%04X)\n", hMidiIn
);
1323 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1324 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1325 return midMessage(0, MIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1328 /**************************************************************************
1329 * midiInPrepareHeader [MMSYSTEM.306]
1331 UINT16
midiInPrepareHeader(HMIDIIN16 hMidiIn
,
1332 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
1334 LPMIDIOPENDESC lpDesc
;
1335 dprintf_mmsys(stddeb
, "midiInPrepareHeader(%04X, %p, %d)\n",
1336 hMidiIn
, lpMidiInHdr
, uSize
);
1337 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1338 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1339 return midMessage(0, MIDM_PREPARE
, lpDesc
->dwInstance
,
1340 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1343 /**************************************************************************
1344 * midiInUnprepareHeader [MMSYSTEM.307]
1346 UINT16
midiInUnprepareHeader(HMIDIIN16 hMidiIn
,
1347 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
1349 LPMIDIOPENDESC lpDesc
;
1350 dprintf_mmsys(stddeb
, "midiInUnprepareHeader(%04X, %p, %d)\n",
1351 hMidiIn
, lpMidiInHdr
, uSize
);
1352 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1353 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1354 return midMessage(0, MIDM_UNPREPARE
, lpDesc
->dwInstance
,
1355 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1358 /**************************************************************************
1359 * midiInAddBuffer [MMSYSTEM.308]
1361 UINT16
midiInAddBuffer(HMIDIIN16 hMidiIn
,
1362 MIDIHDR
* lpMidiInHdr
, UINT16 uSize
)
1364 dprintf_mmsys(stddeb
, "midiInAddBuffer\n");
1368 /**************************************************************************
1369 * midiInStart [MMSYSTEM.309]
1371 UINT16
midiInStart(HMIDIIN16 hMidiIn
)
1373 dprintf_mmsys(stddeb
, "midiInStart\n");
1377 /**************************************************************************
1378 * midiInStop [MMSYSTEM.310]
1380 UINT16
midiInStop(HMIDIIN16 hMidiIn
)
1382 dprintf_mmsys(stddeb
, "midiInStop\n");
1386 /**************************************************************************
1387 * midiInReset [MMSYSTEM.311]
1389 UINT16
midiInReset(HMIDIIN16 hMidiIn
)
1391 dprintf_mmsys(stddeb
, "midiInReset\n");
1395 /**************************************************************************
1396 * midiInGetID [MMSYSTEM.312]
1398 UINT16
midiInGetID(HMIDIIN16 hMidiIn
, UINT16
* lpuDeviceID
)
1400 dprintf_mmsys(stddeb
, "midiInGetID\n");
1404 /**************************************************************************
1405 * midiInMessage [MMSYSTEM.313]
1407 DWORD
midiInMessage(HMIDIIN16 hMidiIn
, UINT16 uMessage
,
1408 DWORD dwParam1
, DWORD dwParam2
)
1410 LPMIDIOPENDESC lpDesc
;
1411 dprintf_mmsys(stddeb
, "midiInMessage(%04X, %04X, %08lX, %08lX)\n",
1412 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
1413 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1414 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1415 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1419 /**************************************************************************
1420 * waveOutGetNumDevs [MMSYSTEM.401]
1422 UINT16
waveOutGetNumDevs()
1425 dprintf_mmsys(stddeb
, "waveOutGetNumDevs\n");
1426 count
+= wodMessage( MMSYSTEM_FirstDevID(), WODM_GETNUMDEVS
, 0L, 0L, 0L);
1427 dprintf_mmsys(stddeb
, "waveOutGetNumDevs return %u \n", count
);
1431 /**************************************************************************
1432 * waveOutGetDevCaps [MMSYSTEM.402]
1434 UINT16
waveOutGetDevCaps(UINT16 uDeviceID
, WAVEOUTCAPS
* lpCaps
, UINT16 uSize
)
1436 dprintf_mmsys(stddeb
, "waveOutGetDevCaps\n");
1437 return wodMessage(uDeviceID
, WODM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1440 /**************************************************************************
1441 * waveOutGetErrorText [MMSYSTEM.403]
1443 UINT16
waveOutGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1445 dprintf_mmsys(stddeb
, "waveOutGetErrorText\n");
1446 return(waveGetErrorText(uError
, lpText
, uSize
));
1450 /**************************************************************************
1451 * waveGetErrorText [internal]
1453 UINT16
waveGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1456 dprintf_mmsys(stddeb
, "waveGetErrorText(%04X, %p, %d);\n", uError
, lpText
, uSize
);
1457 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1460 case MMSYSERR_NOERROR
:
1461 msgptr
= "The specified command was carried out.";
1463 case MMSYSERR_ERROR
:
1464 msgptr
= "Undefined external error.";
1466 case MMSYSERR_BADDEVICEID
:
1467 msgptr
= "A device ID has been used that is out of range for your system.";
1469 case MMSYSERR_NOTENABLED
:
1470 msgptr
= "The driver was not enabled.";
1472 case MMSYSERR_ALLOCATED
:
1473 msgptr
= "The specified device is already in use. Wait until it is free, and then try again.";
1475 case MMSYSERR_INVALHANDLE
:
1476 msgptr
= "The specified device handle is invalid.";
1478 case MMSYSERR_NODRIVER
:
1479 msgptr
= "There is no driver installed on your system !\n";
1481 case MMSYSERR_NOMEM
:
1482 msgptr
= "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
1484 case MMSYSERR_NOTSUPPORTED
:
1485 msgptr
= "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
1487 case MMSYSERR_BADERRNUM
:
1488 msgptr
= "An error number was specified that is not defined in the system.";
1490 case MMSYSERR_INVALFLAG
:
1491 msgptr
= "An invalid flag was passed to a system function.";
1493 case MMSYSERR_INVALPARAM
:
1494 msgptr
= "An invalid parameter was passed to a system function.";
1496 case WAVERR_BADFORMAT
:
1497 msgptr
= "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
1499 case WAVERR_STILLPLAYING
:
1500 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1502 case WAVERR_UNPREPARED
:
1503 msgptr
= "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1506 msgptr
= "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
1509 msgptr
= "Unknown MMSYSTEM Error !\n";
1512 lstrcpyn32A(lpText
, msgptr
, uSize
);
1516 /**************************************************************************
1517 * waveOutOpen [MMSYSTEM.404]
1519 UINT16
waveOutOpen(HWAVEOUT16
* lphWaveOut
, UINT16 uDeviceID
,
1520 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1522 HWAVEOUT16 hWaveOut
;
1523 LPWAVEOPENDESC lpDesc
;
1524 LPWAVEOPENDESC lp16Desc
;
1526 BOOL32 bMapperFlg
= FALSE
;
1527 dprintf_mmsys(stddeb
, "waveOutOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1528 lphWaveOut
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1529 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1530 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_FORMAT_QUERY requested !\n");
1532 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
1533 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_MAPPER mode requested !\n");
1537 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1538 hWaveOut
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1539 if (lphWaveOut
!= NULL
) *lphWaveOut
= hWaveOut
;
1540 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveOut
);
1541 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1542 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1543 lpDesc
->hWave
= hWaveOut
;
1544 lpDesc
->lpFormat
= lpFormat
;
1545 lpDesc
->dwCallBack
= dwCallback
;
1546 lpDesc
->dwInstance
= dwInstance
;
1547 while(uDeviceID
< MAXWAVEDRIVERS
) {
1548 dwRet
= wodMessage(uDeviceID
, WODM_OPEN
,
1549 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1550 if (dwRet
== MMSYSERR_NOERROR
) break;
1551 if (!bMapperFlg
) break;
1553 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_MAPPER mode ! try next driver...\n");
1555 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1556 dprintf_mmsys(stddeb
, "waveOutOpen // End of WAVE_FORMAT_QUERY !\n");
1557 waveOutClose(hWaveOut
);
1562 /**************************************************************************
1563 * waveOutClose [MMSYSTEM.405]
1565 UINT16
waveOutClose(HWAVEOUT16 hWaveOut
)
1567 LPWAVEOPENDESC lpDesc
;
1568 dprintf_mmsys(stddeb
, "waveOutClose(%04X)\n", hWaveOut
);
1569 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1570 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1571 return wodMessage( MMSYSTEM_FirstDevID(), WODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1574 /**************************************************************************
1575 * waveOutPrepareHeader [MMSYSTEM.406]
1577 UINT16
waveOutPrepareHeader(HWAVEOUT16 hWaveOut
,
1578 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
1580 LPWAVEOPENDESC lpDesc
;
1581 dprintf_mmsys(stddeb
, "waveOutPrepareHeader(%04X, %p, %u);\n",
1582 hWaveOut
, lpWaveOutHdr
, uSize
);
1583 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1584 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1585 return wodMessage( MMSYSTEM_FirstDevID(), WODM_PREPARE
, lpDesc
->dwInstance
,
1586 (DWORD
)lpWaveOutHdr
, uSize
);
1589 /**************************************************************************
1590 * waveOutUnprepareHeader [MMSYSTEM.407]
1592 UINT16
waveOutUnprepareHeader(HWAVEOUT16 hWaveOut
,
1593 WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
1595 LPWAVEOPENDESC lpDesc
;
1596 dprintf_mmsys(stddeb
, "waveOutUnprepareHeader(%04X, %p, %u);\n",
1597 hWaveOut
, lpWaveOutHdr
, uSize
);
1598 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1599 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1600 return wodMessage( MMSYSTEM_FirstDevID(), WODM_UNPREPARE
, lpDesc
->dwInstance
,
1601 (DWORD
)lpWaveOutHdr
, uSize
);
1604 /**************************************************************************
1605 * waveOutWrite [MMSYSTEM.408]
1607 UINT16
waveOutWrite(HWAVEOUT16 hWaveOut
, WAVEHDR
* lpWaveOutHdr
, UINT16 uSize
)
1609 LPWAVEOPENDESC lpDesc
;
1610 dprintf_mmsys(stddeb
, "waveOutWrite(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
1611 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1612 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1613 return wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE
, lpDesc
->dwInstance
,
1614 (DWORD
)lpWaveOutHdr
, uSize
);
1617 /**************************************************************************
1618 * waveOutPause [MMSYSTEM.409]
1620 UINT16
waveOutPause(HWAVEOUT16 hWaveOut
)
1622 LPWAVEOPENDESC lpDesc
;
1623 dprintf_mmsys(stddeb
, "waveOutPause(%04X)\n", hWaveOut
);
1624 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1625 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1626 return wodMessage( MMSYSTEM_FirstDevID(), WODM_PAUSE
, lpDesc
->dwInstance
, 0L, 0L);
1629 /**************************************************************************
1630 * waveOutRestart [MMSYSTEM.410]
1632 UINT16
waveOutRestart(HWAVEOUT16 hWaveOut
)
1634 LPWAVEOPENDESC lpDesc
;
1635 dprintf_mmsys(stddeb
, "waveOutRestart(%04X)\n", hWaveOut
);
1636 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1637 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1638 return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESTART
, lpDesc
->dwInstance
, 0L, 0L);
1641 /**************************************************************************
1642 * waveOutReset [MMSYSTEM.411]
1644 UINT16
waveOutReset(HWAVEOUT16 hWaveOut
)
1646 LPWAVEOPENDESC lpDesc
;
1647 dprintf_mmsys(stddeb
, "waveOutReset(%04X)\n", hWaveOut
);
1648 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1649 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1650 return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1653 /**************************************************************************
1654 * waveOutGetPosition [MMSYSTEM.412]
1656 UINT16
waveOutGetPosition(HWAVEOUT16 hWaveOut
, MMTIME
* lpTime
, UINT16 uSize
)
1658 LPWAVEOPENDESC lpDesc
;
1659 dprintf_mmsys(stddeb
, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut
, lpTime
, uSize
);
1660 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1661 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1662 return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPOS
, lpDesc
->dwInstance
,
1663 (DWORD
)lpTime
, (DWORD
)uSize
);
1666 /**************************************************************************
1667 * waveOutGetPitch [MMSYSTEM.413]
1669 UINT16
waveOutGetPitch(HWAVEOUT16 hWaveOut
, DWORD
* lpdwPitch
)
1671 LPWAVEOPENDESC lpDesc
;
1672 dprintf_mmsys(stddeb
, "waveOutGetPitch(%04X, %p);\n", hWaveOut
, lpdwPitch
);
1673 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1674 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1675 return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPITCH
, lpDesc
->dwInstance
,
1676 (DWORD
)lpdwPitch
, 0L);
1679 /**************************************************************************
1680 * waveOutSetPitch [MMSYSTEM.414]
1682 UINT16
waveOutSetPitch(HWAVEOUT16 hWaveOut
, DWORD dwPitch
)
1684 LPWAVEOPENDESC lpDesc
;
1685 dprintf_mmsys(stddeb
, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut
, dwPitch
);
1686 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1687 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1688 return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPITCH
, lpDesc
->dwInstance
, (DWORD
)dwPitch
, 0L);
1691 /**************************************************************************
1692 * waveOutGetVolume [MMSYSTEM.415]
1694 UINT16
waveOutGetVolume(UINT16 uDeviceID
, DWORD
* lpdwVolume
)
1696 dprintf_mmsys(stddeb
, "waveOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1697 return wodMessage(uDeviceID
, WODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1700 /**************************************************************************
1701 * waveOutSetVolume [MMSYSTEM.416]
1703 UINT16
waveOutSetVolume(UINT16 uDeviceID
, DWORD dwVolume
)
1705 dprintf_mmsys(stddeb
, "waveOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1706 return wodMessage(uDeviceID
, WODM_SETVOLUME
, 0L, dwVolume
, 0L);
1709 /**************************************************************************
1710 * waveOutGetPlaybackRate [MMSYSTEM.417]
1712 UINT16
waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut
, DWORD
* lpdwRate
)
1714 LPWAVEOPENDESC lpDesc
;
1715 dprintf_mmsys(stddeb
, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut
, lpdwRate
);
1716 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1717 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1718 return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPLAYBACKRATE
, lpDesc
->dwInstance
,
1719 (DWORD
)lpdwRate
, 0L);
1722 /**************************************************************************
1723 * waveOutSetPlaybackRate [MMSYSTEM.418]
1725 UINT16
waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut
, DWORD dwRate
)
1727 LPWAVEOPENDESC lpDesc
;
1728 dprintf_mmsys(stddeb
, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut
, dwRate
);
1729 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1730 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1731 return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPLAYBACKRATE
,
1732 lpDesc
->dwInstance
, (DWORD
)dwRate
, 0L);
1735 /**************************************************************************
1736 * waveOutBreakLoop [MMSYSTEM.419]
1738 UINT16
waveOutBreakLoop(HWAVEOUT16 hWaveOut
)
1740 dprintf_mmsys(stddeb
, "waveOutBreakLoop(%04X)\n", hWaveOut
);
1741 return MMSYSERR_INVALHANDLE
;
1744 /**************************************************************************
1745 * waveOutGetID [MMSYSTEM.420]
1747 UINT16
waveOutGetID(HWAVEOUT16 hWaveOut
, UINT16
* lpuDeviceID
)
1749 LPWAVEOPENDESC lpDesc
;
1750 dprintf_mmsys(stddeb
, "waveOutGetID(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
1751 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1752 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1753 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
1755 *lpuDeviceID = lpParms->wDeviceID;
1760 /**************************************************************************
1761 * waveOutMessage [MMSYSTEM.421]
1763 DWORD
waveOutMessage(HWAVEOUT16 hWaveOut
, UINT16 uMessage
,
1764 DWORD dwParam1
, DWORD dwParam2
)
1766 LPWAVEOPENDESC lpDesc
;
1767 dprintf_mmsys(stddeb
, "waveOutMessage(%04X, %04X, %08lX, %08lX)\n",
1768 hWaveOut
, uMessage
, dwParam1
, dwParam2
);
1769 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1770 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1771 return wodMessage( MMSYSTEM_FirstDevID(), uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1774 /**************************************************************************
1775 * waveInGetNumDevs [MMSYSTEM.501]
1777 UINT16
waveInGetNumDevs()
1780 dprintf_mmsys(stddeb
, "waveInGetNumDevs\n");
1781 count
+= widMessage(0, WIDM_GETNUMDEVS
, 0L, 0L, 0L);
1782 dprintf_mmsys(stddeb
, "waveInGetNumDevs return %u \n", count
);
1787 /**************************************************************************
1788 * waveInGetDevCaps [MMSYSTEM.502]
1790 UINT16
waveInGetDevCaps(UINT16 uDeviceID
, WAVEINCAPS
* lpCaps
, UINT16 uSize
)
1792 dprintf_mmsys(stddeb
, "waveInGetDevCaps\n");
1793 return widMessage(uDeviceID
, WIDM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1797 /**************************************************************************
1798 * waveInGetErrorText [MMSYSTEM.503]
1800 UINT16
waveInGetErrorText(UINT16 uError
, LPSTR lpText
, UINT16 uSize
)
1802 dprintf_mmsys(stddeb
, "waveInGetErrorText\n");
1803 return(waveGetErrorText(uError
, lpText
, uSize
));
1807 /**************************************************************************
1808 * waveInOpen [MMSYSTEM.504]
1810 UINT16
waveInOpen(HWAVEIN16
* lphWaveIn
, UINT16 uDeviceID
,
1811 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1814 LPWAVEOPENDESC lpDesc
;
1815 LPWAVEOPENDESC lp16Desc
;
1817 BOOL32 bMapperFlg
= FALSE
;
1818 dprintf_mmsys(stddeb
, "waveInOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1819 lphWaveIn
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1820 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1821 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_FORMAT_QUERY requested !\n");
1823 if (uDeviceID
== (UINT16
)WAVE_MAPPER
) {
1824 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_MAPPER mode requested !\n");
1828 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1829 hWaveIn
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1830 if (lphWaveIn
!= NULL
) *lphWaveIn
= hWaveIn
;
1831 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveIn
);
1832 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1833 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1834 lpDesc
->hWave
= hWaveIn
;
1835 lpDesc
->lpFormat
= lpFormat
;
1836 lpDesc
->dwCallBack
= dwCallback
;
1837 lpDesc
->dwInstance
= dwInstance
;
1838 while(uDeviceID
< MAXWAVEDRIVERS
) {
1839 dwRet
= widMessage(uDeviceID
, WIDM_OPEN
,
1840 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1841 if (dwRet
== MMSYSERR_NOERROR
) break;
1842 if (!bMapperFlg
) break;
1844 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_MAPPER mode ! try next driver...\n");
1846 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1847 dprintf_mmsys(stddeb
, "waveInOpen // End of WAVE_FORMAT_QUERY !\n");
1848 waveInClose(hWaveIn
);
1854 /**************************************************************************
1855 * waveInClose [MMSYSTEM.505]
1857 UINT16
waveInClose(HWAVEIN16 hWaveIn
)
1859 LPWAVEOPENDESC lpDesc
;
1860 dprintf_mmsys(stddeb
, "waveInClose(%04X)\n", hWaveIn
);
1861 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1862 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1863 return widMessage(0, WIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1867 /**************************************************************************
1868 * waveInPrepareHeader [MMSYSTEM.506]
1870 UINT16
waveInPrepareHeader(HWAVEIN16 hWaveIn
,
1871 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
1873 LPWAVEOPENDESC lpDesc
;
1874 LPWAVEHDR lp32WaveInHdr
;
1875 dprintf_mmsys(stddeb
, "waveInPrepareHeader(%04X, %p, %u);\n",
1876 hWaveIn
, lpWaveInHdr
, uSize
);
1877 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1878 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1879 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1880 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1881 lp32WaveInHdr
->lpNext
= NULL
;
1882 lp32WaveInHdr
->dwBytesRecorded
= 0;
1883 dprintf_mmsys(stddeb
, "waveInPrepareHeader // lpData=%p size=%lu \n",
1884 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1885 return widMessage(0, WIDM_PREPARE
, lpDesc
->dwInstance
,
1886 (DWORD
)lpWaveInHdr
, uSize
);
1890 /**************************************************************************
1891 * waveInUnprepareHeader [MMSYSTEM.507]
1893 UINT16
waveInUnprepareHeader(HWAVEIN16 hWaveIn
,
1894 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
1896 LPWAVEOPENDESC lpDesc
;
1897 LPWAVEHDR lp32WaveInHdr
;
1898 dprintf_mmsys(stddeb
, "waveInUnprepareHeader(%04X, %p, %u);\n",
1899 hWaveIn
, lpWaveInHdr
, uSize
);
1900 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1901 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1902 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1903 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1904 USER_HEAP_FREE(HIWORD((DWORD
)lp32WaveInHdr
->lpData
));
1905 lp32WaveInHdr
->lpData
= NULL
;
1906 lp32WaveInHdr
->lpNext
= NULL
;
1907 return widMessage(0, WIDM_UNPREPARE
, lpDesc
->dwInstance
,
1908 (DWORD
)lpWaveInHdr
, uSize
);
1912 /**************************************************************************
1913 * waveInAddBuffer [MMSYSTEM.508]
1915 UINT16
waveInAddBuffer(HWAVEIN16 hWaveIn
,
1916 WAVEHDR
* lpWaveInHdr
, UINT16 uSize
)
1918 LPWAVEOPENDESC lpDesc
;
1919 LPWAVEHDR lp32WaveInHdr
;
1920 dprintf_mmsys(stddeb
, "waveInAddBuffer(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
1921 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1922 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1923 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1924 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1925 lp32WaveInHdr
->lpNext
= NULL
;
1926 lp32WaveInHdr
->dwBytesRecorded
= 0;
1927 dprintf_mmsys(stddeb
, "waveInAddBuffer // lpData=%p size=%lu \n",
1928 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1929 return widMessage(0, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
1930 (DWORD
)lpWaveInHdr
, uSize
);
1934 /**************************************************************************
1935 * waveInStart [MMSYSTEM.509]
1937 UINT16
waveInStart(HWAVEIN16 hWaveIn
)
1939 LPWAVEOPENDESC lpDesc
;
1940 dprintf_mmsys(stddeb
, "waveInStart(%04X)\n", hWaveIn
);
1941 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1942 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1943 return widMessage(0, WIDM_START
, lpDesc
->dwInstance
, 0L, 0L);
1947 /**************************************************************************
1948 * waveInStop [MMSYSTEM.510]
1950 UINT16
waveInStop(HWAVEIN16 hWaveIn
)
1952 LPWAVEOPENDESC lpDesc
;
1953 dprintf_mmsys(stddeb
, "waveInStop(%04X)\n", hWaveIn
);
1954 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1955 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1956 return widMessage(0, WIDM_STOP
, lpDesc
->dwInstance
, 0L, 0L);
1960 /**************************************************************************
1961 * waveInReset [MMSYSTEM.511]
1963 UINT16
waveInReset(HWAVEIN16 hWaveIn
)
1965 LPWAVEOPENDESC lpDesc
;
1966 dprintf_mmsys(stddeb
, "waveInReset(%04X)\n", hWaveIn
);
1967 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1968 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1969 return widMessage(0, WIDM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1973 /**************************************************************************
1974 * waveInGetPosition [MMSYSTEM.512]
1976 UINT16
waveInGetPosition(HWAVEIN16 hWaveIn
, MMTIME
* lpTime
, UINT16 uSize
)
1978 LPWAVEOPENDESC lpDesc
;
1979 dprintf_mmsys(stddeb
, "waveInGetPosition(%04X, %p, %u);\n", hWaveIn
, lpTime
, uSize
);
1980 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1981 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1982 return widMessage(0, WIDM_GETPOS
, lpDesc
->dwInstance
,
1983 (DWORD
)lpTime
, (DWORD
)uSize
);
1987 /**************************************************************************
1988 * waveInGetID [MMSYSTEM.513]
1990 UINT16
waveInGetID(HWAVEIN16 hWaveIn
, UINT16
* lpuDeviceID
)
1992 dprintf_mmsys(stddeb
, "waveInGetID\n");
1993 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALPARAM
;
1998 /**************************************************************************
1999 * waveInMessage [MMSYSTEM.514]
2001 DWORD
waveInMessage(HWAVEIN16 hWaveIn
, UINT16 uMessage
,
2002 DWORD dwParam1
, DWORD dwParam2
)
2004 LPWAVEOPENDESC lpDesc
;
2005 dprintf_mmsys(stddeb
, "waveInMessage(%04X, %04X, %08lX, %08lX)\n",
2006 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
2007 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
2008 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
2009 return widMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
2013 /**************************************************************************
2014 * mmioOpen [MMSYSTEM.1210]
2016 HMMIO16
mmioOpen(LPSTR szFileName
, MMIOINFO
* lpmmioinfo
, DWORD dwOpenFlags
)
2021 LPMMIOINFO lpmminfo
;
2022 dprintf_mmsys(stddeb
, "mmioOpen('%s', %p, %08lX);\n", szFileName
, lpmmioinfo
, dwOpenFlags
);
2023 hFile
= OpenFile32(szFileName
, &ofs
, dwOpenFlags
);
2024 if (hFile
== -1) return 0;
2025 hmmio
= GlobalAlloc16(GMEM_MOVEABLE
, sizeof(MMIOINFO
));
2026 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2027 if (lpmminfo
== NULL
) return 0;
2028 memset(lpmminfo
, 0, sizeof(MMIOINFO
));
2029 lpmminfo
->hmmio
= hmmio
;
2030 lpmminfo
->dwReserved2
= hFile
;
2031 GlobalUnlock16(hmmio
);
2032 dprintf_mmsys(stddeb
, "mmioOpen // return hmmio=%04X\n", hmmio
);
2037 /**************************************************************************
2038 * mmioClose [MMSYSTEM.1211]
2040 UINT16
mmioClose(HMMIO16 hmmio
, UINT16 uFlags
)
2042 LPMMIOINFO lpmminfo
;
2043 dprintf_mmsys(stddeb
, "mmioClose(%04X, %04X);\n", hmmio
, uFlags
);
2044 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2045 if (lpmminfo
== NULL
) return 0;
2046 _lclose32((HFILE32
)lpmminfo
->dwReserved2
);
2047 GlobalUnlock16(hmmio
);
2048 GlobalFree16(hmmio
);
2054 /**************************************************************************
2055 * mmioRead [MMSYSTEM.1212]
2057 LONG
mmioRead(HMMIO16 hmmio
, HPSTR pch
, LONG cch
)
2060 LPMMIOINFO lpmminfo
;
2061 dprintf_mmio(stddeb
, "mmioRead(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2062 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2063 if (lpmminfo
== NULL
) return 0;
2064 count
= _lread32(LOWORD(lpmminfo
->dwReserved2
), pch
, cch
);
2065 GlobalUnlock16(hmmio
);
2066 dprintf_mmio(stddeb
, "mmioRead // count=%ld\n", count
);
2072 /**************************************************************************
2073 * mmioWrite [MMSYSTEM.1213]
2075 LONG
mmioWrite(HMMIO16 hmmio
, HPCSTR pch
, LONG cch
)
2078 LPMMIOINFO lpmminfo
;
2079 dprintf_mmsys(stddeb
, "mmioWrite(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2080 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2081 if (lpmminfo
== NULL
) return 0;
2082 count
= _lwrite32(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)pch
, cch
);
2083 GlobalUnlock16(hmmio
);
2087 /**************************************************************************
2088 * mmioSeek [MMSYSTEM.1214]
2090 LONG
mmioSeek(HMMIO16 hmmio
, LONG lOffset
, int iOrigin
)
2093 LPMMIOINFO lpmminfo
;
2094 dprintf_mmsys(stddeb
, "mmioSeek(%04X, %08lX, %d);\n", hmmio
, lOffset
, iOrigin
);
2095 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2096 if (lpmminfo
== NULL
) {
2097 dprintf_mmsys(stddeb
, "mmioSeek // can't lock hmmio=%04X !\n", hmmio
);
2100 count
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
, lOffset
, iOrigin
);
2101 GlobalUnlock16(hmmio
);
2105 /**************************************************************************
2106 * mmioGetInfo [MMSYSTEM.1215]
2108 UINT16
mmioGetInfo(HMMIO16 hmmio
, MMIOINFO
* lpmmioinfo
, UINT16 uFlags
)
2110 LPMMIOINFO lpmminfo
;
2111 dprintf_mmsys(stddeb
, "mmioGetInfo\n");
2112 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2113 if (lpmminfo
== NULL
) return 0;
2114 memcpy(lpmmioinfo
, lpmminfo
, sizeof(MMIOINFO
));
2115 GlobalUnlock16(hmmio
);
2119 /**************************************************************************
2120 * mmioSetInfo [MMSYSTEM.1216]
2122 UINT16
mmioSetInfo(HMMIO16 hmmio
, const MMIOINFO
* lpmmioinfo
, UINT16 uFlags
)
2124 LPMMIOINFO lpmminfo
;
2125 dprintf_mmsys(stddeb
, "mmioSetInfo\n");
2126 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2127 if (lpmminfo
== NULL
) return 0;
2128 GlobalUnlock16(hmmio
);
2132 /**************************************************************************
2133 * mmioSetBuffer [MMSYSTEM.1217]
2135 UINT16
mmioSetBuffer(HMMIO16 hmmio
, LPSTR pchBuffer
,
2136 LONG cchBuffer
, UINT16 uFlags
)
2138 dprintf_mmsys(stddeb
, "mmioSetBuffer // empty stub \n");
2142 /**************************************************************************
2143 * mmioFlush [MMSYSTEM.1218]
2145 UINT16
mmioFlush(HMMIO16 hmmio
, UINT16 uFlags
)
2147 LPMMIOINFO lpmminfo
;
2148 dprintf_mmsys(stddeb
, "mmioFlush(%04X, %04X)\n", hmmio
, uFlags
);
2149 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2150 if (lpmminfo
== NULL
) return 0;
2151 GlobalUnlock16(hmmio
);
2155 /**************************************************************************
2156 * mmioAdvance [MMSYSTEM.1219]
2158 UINT16
mmioAdvance(HMMIO16 hmmio
, MMIOINFO
* lpmmioinfo
, UINT16 uFlags
)
2161 LPMMIOINFO lpmminfo
;
2162 dprintf_mmsys(stddeb
, "mmioAdvance\n");
2163 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2164 if (lpmminfo
== NULL
) return 0;
2165 if (uFlags
== MMIO_READ
) {
2166 count
= _lread32(LOWORD(lpmminfo
->dwReserved2
),
2167 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2169 if (uFlags
== MMIO_WRITE
) {
2170 count
= _lwrite32(LOWORD(lpmminfo
->dwReserved2
),
2171 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2173 lpmmioinfo
->pchNext
+= count
;
2174 GlobalUnlock16(hmmio
);
2175 lpmminfo
->lDiskOffset
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
, 0, SEEK_CUR
);
2179 /**************************************************************************
2180 * mmioStringToFOURCC [MMSYSTEM.1220]
2182 FOURCC
mmioStringToFOURCC(LPCSTR sz
, UINT16 uFlags
)
2184 dprintf_mmsys(stddeb
, "mmioStringToFOURCC // empty stub \n");
2188 /**************************************************************************
2189 * mmioInstallIOProc [MMSYSTEM.1221]
2191 LPMMIOPROC
mmioInstallIOProc(FOURCC fccIOProc
,
2192 LPMMIOPROC pIOProc
, DWORD dwFlags
)
2194 dprintf_mmsys(stddeb
, "mmioInstallIOProc // empty stub \n");
2198 /**************************************************************************
2199 * mmioSendMessage [MMSYSTEM.1222]
2201 LRESULT
mmioSendMessage(HMMIO16 hmmio
, UINT16 uMessage
,
2202 LPARAM lParam1
, LPARAM lParam2
)
2204 dprintf_mmsys(stddeb
, "mmioSendMessage // empty stub \n");
2208 /**************************************************************************
2209 * mmioDescend [MMSYSTEM.1223]
2211 UINT16
mmioDescend(HMMIO16 hmmio
, MMCKINFO
* lpck
,
2212 const MMCKINFO
* lpckParent
, UINT16 uFlags
)
2214 DWORD dwfcc
, dwOldPos
;
2215 LPMMIOINFO lpmminfo
;
2216 dprintf_mmio(stddeb
, "mmioDescend(%04X, %p, %p, %04X);\n",
2217 hmmio
, lpck
, lpckParent
, uFlags
);
2218 if (lpck
== NULL
) return 0;
2219 lpmminfo
= (LPMMIOINFO
)GlobalLock16(hmmio
);
2220 if (lpmminfo
== NULL
) return 0;
2222 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX\n", dwfcc
);
2223 dwOldPos
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
, 0, SEEK_CUR
);
2224 dprintf_mmio(stddeb
, "mmioDescend // dwOldPos=%ld\n", dwOldPos
);
2225 if (lpckParent
!= NULL
) {
2226 dprintf_mmio(stddeb
, "mmioDescend // seek inside parent at %ld !\n", lpckParent
->dwDataOffset
);
2227 dwOldPos
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
,
2228 lpckParent
->dwDataOffset
, SEEK_SET
);
2230 if ((uFlags
& MMIO_FINDCHUNK
) || (uFlags
& MMIO_FINDRIFF
) ||
2231 (uFlags
& MMIO_FINDLIST
)) {
2232 dprintf_mmio(stddeb
, "mmioDescend // MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc
);
2234 if (_lread32((HFILE32
)lpmminfo
->dwReserved2
, (LPSTR
)lpck
,
2235 sizeof(MMCKINFO
)) < sizeof(MMCKINFO
)) {
2236 _llseek32((HFILE32
)lpmminfo
->dwReserved2
, dwOldPos
, SEEK_SET
);
2237 GlobalUnlock16(hmmio
);
2238 return MMIOERR_CHUNKNOTFOUND
;
2240 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX ckid=%08lX cksize=%08lX !\n",
2241 dwfcc
, lpck
->ckid
, lpck
->cksize
);
2242 if (dwfcc
== lpck
->ckid
) break;
2243 dwOldPos
+= lpck
->cksize
+ 2 * sizeof(DWORD
);
2244 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2245 dwOldPos
+= sizeof(DWORD
);
2246 _llseek32((HFILE32
)lpmminfo
->dwReserved2
, dwOldPos
, SEEK_SET
);
2250 if (_lread32(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)lpck
,
2251 sizeof(MMCKINFO
)) < sizeof(MMCKINFO
)) {
2252 _llseek32((HFILE32
)lpmminfo
->dwReserved2
, dwOldPos
, SEEK_SET
);
2253 GlobalUnlock16(hmmio
);
2254 return MMIOERR_CHUNKNOTFOUND
;
2257 lpck
->dwDataOffset
= dwOldPos
+ 2 * sizeof(DWORD
);
2258 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2259 lpck
->dwDataOffset
+= sizeof(DWORD
);
2260 lpmminfo
->lDiskOffset
= _llseek32((HFILE32
)lpmminfo
->dwReserved2
,
2261 lpck
->dwDataOffset
, SEEK_SET
);
2262 GlobalUnlock16(hmmio
);
2263 dprintf_mmio(stddeb
, "mmioDescend // lpck->ckid=%08lX lpck->cksize=%ld !\n",
2264 lpck
->ckid
, lpck
->cksize
);
2265 dprintf_mmsys(stddeb
, "mmioDescend // lpck->fccType=%08lX !\n", lpck
->fccType
);
2269 /**************************************************************************
2270 * mmioAscend [MMSYSTEM.1224]
2272 UINT16
mmioAscend(HMMIO16 hmmio
, MMCKINFO
* lpck
, UINT16 uFlags
)
2274 dprintf_mmsys(stddeb
, "mmioAscend // empty stub !\n");
2278 /**************************************************************************
2279 * mmioCreateChunk [MMSYSTEM.1225]
2281 UINT16
mmioCreateChunk(HMMIO16 hmmio
, MMCKINFO
* lpck
, UINT16 uFlags
)
2283 dprintf_mmsys(stddeb
, "mmioCreateChunk // empty stub \n");
2288 /**************************************************************************
2289 * mmioRename [MMSYSTEM.1226]
2291 UINT16
mmioRename(LPCSTR szFileName
, LPCSTR szNewFileName
,
2292 MMIOINFO
* lpmmioinfo
, DWORD dwRenameFlags
)
2294 dprintf_mmsys(stddeb
, "mmioRename('%s', '%s', %p, %08lX); // empty stub \n",
2295 szFileName
, szNewFileName
, lpmmioinfo
, dwRenameFlags
);
2299 /**************************************************************************
2300 * DrvOpen [MMSYSTEM.1100]
2302 HDRVR16
DrvOpen(LPSTR lpDriverName
, LPSTR lpSectionName
, LPARAM lParam
)
2304 dprintf_mmsys(stddeb
, "DrvOpen('%s', '%s', %08lX);\n",
2305 lpDriverName
, lpSectionName
, lParam
);
2306 return OpenDriver(lpDriverName
, lpSectionName
, lParam
);
2310 /**************************************************************************
2311 * DrvClose [MMSYSTEM.1101]
2313 LRESULT
DrvClose(HDRVR16 hDrvr
, LPARAM lParam1
, LPARAM lParam2
)
2315 dprintf_mmsys(stddeb
, "DrvClose(%04X, %08lX, %08lX);\n", hDrvr
, lParam1
, lParam2
);
2316 return CloseDriver(hDrvr
, lParam1
, lParam2
);
2320 /**************************************************************************
2321 * DrvSendMessage [MMSYSTEM.1102]
2323 LRESULT
DrvSendMessage(HDRVR16 hDriver
, WORD msg
, LPARAM lParam1
, LPARAM lParam2
)
2325 DWORD dwDriverID
= 0;
2326 dprintf_mmsys(stddeb
, "DrvSendMessage(%04X, %04X, %08lX, %08lX);\n",
2327 hDriver
, msg
, lParam1
, lParam2
);
2328 return CDAUDIO_DriverProc(dwDriverID
, hDriver
, msg
, lParam1
, lParam2
);
2331 /**************************************************************************
2332 * DrvGetModuleHandle [MMSYSTEM.1103]
2334 HANDLE16
DrvGetModuleHandle(HDRVR16 hDrvr
)
2336 dprintf_mmsys(stddeb
, "DrvGetModuleHandle(%04X);\n", hDrvr
);
2341 /**************************************************************************
2342 * DrvDefDriverProc [MMSYSTEM.1104]
2344 LRESULT
DrvDefDriverProc(DWORD dwDriverID
, HDRVR16 hDriv
, WORD wMsg
,
2345 DWORD dwParam1
, DWORD dwParam2
)
2347 return DefDriverProc(dwDriverID
, hDriv
, wMsg
, dwParam1
, dwParam2
);