4 * Copyright 1993 Martin Ayotte
6 static char Copyright[] = "Copyright Martin Ayotte, 1993";
15 #include <sys/ioctl.h>
23 /* #define DEBUG_MCI */
24 /* #undef DEBUG_MCI */
25 /* #define DEBUG_MMTIME */
26 /* #undef DEBUG_MMTIME */
27 /* #define DEBUG_MMIO */
28 /* #undef DEBUG_MMIO */
31 static int InstalledCount
;
32 static int InstalledListLen
;
33 static LPSTR lpInstallNames
= NULL
;
35 static BOOL mmTimeStarted
= FALSE
;
36 static MMTIME mmSysTimeMS
;
37 static MMTIME mmSysTimeSMPTE
;
39 typedef struct tagTIMERENTRY
{
47 struct tagTIMERENTRY
*Next
;
48 struct tagTIMERENTRY
*Prev
;
50 typedef TIMERENTRY
*LPTIMERENTRY
;
52 static LPTIMERENTRY lpTimerList
= NULL
;
54 static MCI_OPEN_DRIVER_PARMS mciDrv
[MAXMCIDRIVERS
];
56 UINT WINAPI
midiGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
);
57 UINT WINAPI
waveGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
);
58 LRESULT
DrvDefDriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
59 DWORD dwParam1
, DWORD dwParam2
);
61 LRESULT
WAVE_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
62 DWORD dwParam1
, DWORD dwParam2
);
63 LRESULT
MIDI_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
64 DWORD dwParam1
, DWORD dwParam2
);
65 LRESULT
CDAUDIO_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
66 DWORD dwParam1
, DWORD dwParam2
);
67 LRESULT
ANIM_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
68 DWORD dwParam1
, DWORD dwParam2
);
70 /**************************************************************************
71 * MMSYSTEM_WEP [MMSYSTEM.1]
73 int MMSYSTEM_WEP(HANDLE hInstance
, WORD wDataSeg
,
74 WORD cbHeapSize
, LPSTR lpCmdLine
)
76 printf("MMSYSTEM DLL INIT ... hInst=%04X \n", hInstance
);
80 /**************************************************************************
81 * sndPlaySound [MMSYSTEM.2]
83 BOOL WINAPI
sndPlaySound(LPCSTR lpszSoundName
, UINT uFlags
)
89 PCMWAVEFORMAT pcmWaveFormat
;
93 LPWAVEOPENDESC lpWaveDesc
;
96 LPWAVEHDR lp16WaveHdr
;
101 printf("sndPlaySound // SoundName='%s' uFlags=%04X !\n",
102 lpszSoundName
, uFlags
);
103 if (lpszSoundName
== NULL
) {
104 printf("sndPlaySound // Stop !\n");
107 hmmio
= mmioOpen((LPSTR
)lpszSoundName
, NULL
,
108 MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
110 printf("sndPlaySound // searching in SystemSound List !\n");
111 GetProfileString("Sounds", (LPSTR
)lpszSoundName
, "", str
, sizeof(str
));
112 if (strlen(str
) == 0) return FALSE
;
113 if ( (ptr
= (LPSTR
)strchr(str
, ',')) != NULL
) *ptr
= '\0';
114 hmmio
= mmioOpen(str
, NULL
, MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
116 printf("sndPlaySound // can't find SystemSound='%s' !\n", str
);
120 if (mmioDescend(hmmio
, &ckMainRIFF
, NULL
, 0) != 0) {
121 ErrSND
: if (hmmio
!= 0) mmioClose(hmmio
, 0);
124 printf("sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
125 (LPSTR
)&ckMainRIFF
.ckid
, (LPSTR
)&ckMainRIFF
.fccType
,
127 if ((ckMainRIFF
.ckid
!= FOURCC_RIFF
) ||
128 (ckMainRIFF
.fccType
!= mmioFOURCC('W', 'A', 'V', 'E'))) goto ErrSND
;
129 mmckInfo
.ckid
= mmioFOURCC('f', 'm', 't', ' ');
130 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) != 0) goto ErrSND
;
131 printf("sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
132 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
,
134 if (mmioRead(hmmio
, (HPSTR
) &pcmWaveFormat
,
135 (long) sizeof(PCMWAVEFORMAT
)) != (long) sizeof(PCMWAVEFORMAT
)) goto ErrSND
;
137 printf("sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat
.wf
.wFormatTag
);
138 printf("sndPlaySound // nChannels=%d \n", pcmWaveFormat
.wf
.nChannels
);
139 printf("sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat
.wf
.nSamplesPerSec
);
140 printf("sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat
.wf
.nAvgBytesPerSec
);
141 printf("sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat
.wf
.nBlockAlign
);
142 printf("sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat
.wBitsPerSample
);
144 mmckInfo
.ckid
= mmioFOURCC('d', 'a', 't', 'a');
145 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) != 0) goto ErrSND
;
146 printf("sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
147 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
,
149 hDesc
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
150 lpWaveDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hDesc
);
151 lpWaveDesc
->hWave
= 0;
152 pcmWaveFormat
.wf
.nAvgBytesPerSec
=
153 pcmWaveFormat
.wf
.nSamplesPerSec
* pcmWaveFormat
.wf
.nBlockAlign
;
154 hFormat
= USER_HEAP_ALLOC(sizeof(PCMWAVEFORMAT
));
155 lpWaveDesc
->lpFormat
= (LPWAVEFORMAT
) USER_HEAP_LIN_ADDR(hFormat
);
156 memcpy(lpWaveDesc
->lpFormat
, &pcmWaveFormat
, sizeof(PCMWAVEFORMAT
));
157 lpWaveDesc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hDesc
);
158 dwRet
= wodMessage(0, WODM_OPEN
, 0, (DWORD
)lpWaveDesc
, CALLBACK_NULL
);
159 if (dwRet
!= MMSYSERR_NOERROR
) {
160 printf("sndPlaySound // can't open WaveOut device !\n");
163 USER_HEAP_FREE(hFormat
);
164 hWaveHdr
= USER_HEAP_ALLOC(sizeof(WAVEHDR
));
165 lpWaveHdr
= (LPWAVEHDR
) USER_HEAP_LIN_ADDR(hWaveHdr
);
166 lp16WaveHdr
= (LPWAVEHDR
) USER_HEAP_SEG_ADDR(hWaveHdr
);
168 hData
= GlobalAlloc(GMEM_MOVEABLE
, bufsize
);
169 lpWaveHdr
->lpData
= (LPSTR
) WIN16_GlobalLock(hData
);
170 lpWaveHdr
->dwBufferLength
= bufsize
;
171 lpWaveHdr
->dwUser
= 0L;
172 lpWaveHdr
->dwFlags
= 0L;
173 lpWaveHdr
->dwLoops
= 0L;
174 dwRet
= wodMessage(0, WODM_PREPARE
, 0, (DWORD
)lp16WaveHdr
, sizeof(WAVEHDR
));
175 if (dwRet
!= MMSYSERR_NOERROR
) {
176 printf("sndPlaySound // can't prepare WaveOut device !\n");
179 USER_HEAP_FREE(hDesc
);
180 USER_HEAP_FREE(hWaveHdr
);
184 count
= mmioRead(hmmio
, PTR_SEG_TO_LIN(lpWaveHdr
->lpData
), bufsize
);
185 if (count
< 1) break;
186 lpWaveHdr
->dwBufferLength
= count
;
187 /* lpWaveHdr->dwBytesRecorded = count; */
188 wodMessage(0, WODM_WRITE
, 0, (DWORD
)lp16WaveHdr
, sizeof(WAVEHDR
));
190 wodMessage(0, WODM_UNPREPARE
, 0, (DWORD
)lp16WaveHdr
, sizeof(WAVEHDR
));
191 wodMessage(0, WODM_CLOSE
, 0, 0L, 0L);
194 USER_HEAP_FREE(hDesc
);
195 USER_HEAP_FREE(hWaveHdr
);
196 if (hmmio
!= 0) mmioClose(hmmio
, 0);
200 /**************************************************************************
201 * mmsystemGetVersion [MMSYSTEM.5]
203 WORD WINAPI
mmsystemGetVersion()
205 printf("mmsystemGetVersion // 0.4.0 ...?... :-) !\n");
209 /**************************************************************************
210 * DriverProc [MMSYSTEM.6]
212 LRESULT
DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
213 DWORD dwParam1
, DWORD dwParam2
)
215 return DrvDefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
218 /**************************************************************************
219 * OutputDebugStr [MMSYSTEM.30]
221 void WINAPI
OutputDebugStr(LPCSTR str
)
223 printf("EMPTY STUB !!! OutputDebugStr('%s');\n", str
);
226 /**************************************************************************
227 * DriverCallback [MMSYSTEM.31]
229 BOOL
DriverCallback(DWORD dwCallBack
, UINT uFlags
, HANDLE hDev
,
230 WORD wMsg
, DWORD dwUser
, DWORD dwParam1
, DWORD dwParam2
)
232 printf("DriverCallback(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
233 dwCallBack
, uFlags
, hDev
, wMsg
, dwUser
, dwParam1
, dwParam2
);
234 switch(uFlags
& DCB_TYPEMASK
) {
236 printf("DriverCallback() // CALLBACK_NULL !\n");
239 printf("DriverCallback() // CALLBACK_WINDOW !\n");
242 printf("DriverCallback() // CALLBACK_TASK !\n");
245 printf("DriverCallback() // CALLBACK_FUNCTION !\n");
251 /**************************************************************************
252 * JoyGetNumDevs [MMSYSTEM.101]
256 printf("EMPTY STUB !!! JoyGetNumDevs();\n");
260 /**************************************************************************
261 * JoyGetDevCaps [MMSYSTEM.102]
263 WORD
JoyGetDevCaps(WORD wID
, LPJOYCAPS lpCaps
, WORD wSize
)
265 printf("EMPTY STUB !!! JoyGetDevCaps(%04X, %p, %d);\n",
267 return MMSYSERR_NODRIVER
;
270 /**************************************************************************
271 * JoyGetPos [MMSYSTEM.103]
273 WORD
JoyGetPos(WORD wID
, LPJOYINFO lpInfo
)
275 printf("EMPTY STUB !!! JoyGetPos(%04X, %p);\n", wID
, lpInfo
);
276 return MMSYSERR_NODRIVER
;
279 /**************************************************************************
280 * JoyGetThreshold [MMSYSTEM.104]
282 WORD
JoyGetThreshold(WORD wID
, LPWORD lpThreshold
)
284 printf("EMPTY STUB !!! JoyGetThreshold(%04X, %p);\n", wID
, lpThreshold
);
285 return MMSYSERR_NODRIVER
;
288 /**************************************************************************
289 * JoyReleaseCapture [MMSYSTEM.105]
291 WORD
JoyReleaseCapture(WORD wID
)
293 printf("EMPTY STUB !!! JoyReleaseCapture(%04X);\n", wID
);
294 return MMSYSERR_NODRIVER
;
297 /**************************************************************************
298 * JoySetCapture [MMSYSTEM.106]
300 WORD
JoySetCapture(HWND hWnd
, WORD wID
, WORD wPeriod
, BOOL bChanged
)
302 printf("EMPTY STUB !!! JoySetCapture(%04X, %04X, %d, %d);\n",
303 hWnd
, wID
, wPeriod
, bChanged
);
304 return MMSYSERR_NODRIVER
;
307 /**************************************************************************
308 * JoySetThreshold [MMSYSTEM.107]
310 WORD
JoySetThreshold(WORD wID
, WORD wThreshold
)
312 printf("EMPTY STUB !!! JoySetThreshold(%04X, %d);\n", wID
, wThreshold
);
313 return MMSYSERR_NODRIVER
;
316 /**************************************************************************
317 * JoySetCalibration [MMSYSTEM.109]
319 WORD
JoySetCalibration(WORD wID
)
321 printf("EMPTY STUB !!! JoySetCalibration(%04X);\n", wID
);
322 return MMSYSERR_NODRIVER
;
326 /**************************************************************************
327 * auxGetNumDevs [MMSYSTEM.350]
329 UINT WINAPI
auxGetNumDevs()
332 printf("auxGetNumDevs !\n");
333 count
+= auxMessage(0, AUXDM_GETNUMDEVS
, 0L, 0L, 0L);
334 printf("auxGetNumDevs return %u \n", count
);
338 /**************************************************************************
339 * auxGetDevCaps [MMSYSTEM.351]
341 UINT WINAPI
auxGetDevCaps(UINT uDeviceID
, AUXCAPS FAR
* lpCaps
, UINT uSize
)
343 printf("auxGetDevCaps(%04X, %p, %d) !\n",
344 uDeviceID
, lpCaps
, uSize
);
345 return auxMessage(uDeviceID
, AUXDM_GETDEVCAPS
,
346 0L, (DWORD
)lpCaps
, (DWORD
)uSize
);
349 /**************************************************************************
350 * auxGetVolume [MMSYSTEM.352]
352 UINT WINAPI
auxGetVolume(UINT uDeviceID
, DWORD FAR
* lpdwVolume
)
354 printf("auxGetVolume(%04X, %p) !\n", uDeviceID
, lpdwVolume
);
355 return auxMessage(uDeviceID
, AUXDM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
358 /**************************************************************************
359 * auxSetVolume [MMSYSTEM.353]
361 UINT WINAPI
auxSetVolume(UINT uDeviceID
, DWORD dwVolume
)
363 printf("auxSetVolume(%04X, %08lX) !\n", uDeviceID
, dwVolume
);
364 return auxMessage(uDeviceID
, AUXDM_SETVOLUME
, 0L, dwVolume
, 0L);
367 /**************************************************************************
368 * auxOutMessage [MMSYSTEM.354]
370 DWORD WINAPI
auxOutMessage(UINT uDeviceID
, UINT uMessage
, DWORD dw1
, DWORD dw2
)
372 printf("auxOutMessage(%04X, %04X, %08lX, %08lX)\n",
373 uDeviceID
, uMessage
, dw1
, dw2
);
374 return auxMessage(uDeviceID
, uMessage
, 0L, dw1
, dw2
);
377 /**************************************************************************
378 * mciGetErrorString [MMSYSTEM.706]
380 BOOL
mciGetErrorString (DWORD wError
, LPSTR lpstrBuffer
, UINT uLength
)
384 printf("mciGetErrorString(%08lX, %p, %d);\n", wError
, lpstrBuffer
, uLength
);
385 if ((lpstrBuffer
== NULL
) || (uLength
< 1)) return(FALSE
);
386 lpstrBuffer
[0] = '\0';
388 case MCIERR_INVALID_DEVICE_ID
:
389 msgptr
= "Invalid MCI device ID. Use the ID returned when opening the MCI device.";
391 case MCIERR_UNRECOGNIZED_KEYWORD
:
392 msgptr
= "The driver cannot recognize the specified command parameter.";
394 case MCIERR_UNRECOGNIZED_COMMAND
:
395 msgptr
= "The driver cannot recognize the specified command.";
397 case MCIERR_HARDWARE
:
398 msgptr
= "There is a problem with your media device. Make sure it is working correctly or contact the device manufacturer.";
400 case MCIERR_INVALID_DEVICE_NAME
:
401 msgptr
= "The specified device is not open or is not recognized by MCI.";
403 case MCIERR_OUT_OF_MEMORY
:
404 msgptr
= "Not enough memory available for this task. \nQuit one or more applications to increase available memory, and then try again.";
406 case MCIERR_DEVICE_OPEN
:
407 msgptr
= "The device name is already being used as an alias by this application. Use a unique alias.";
409 case MCIERR_CANNOT_LOAD_DRIVER
:
410 msgptr
= "There is an undetectable problem in loading the specified device driver.";
412 case MCIERR_MISSING_COMMAND_STRING
:
413 msgptr
= "No command was specified.";
415 case MCIERR_PARAM_OVERFLOW
:
416 msgptr
= "The output string was to large to fit in the return buffer. Increase the size of the buffer.";
418 case MCIERR_MISSING_STRING_ARGUMENT
:
419 msgptr
= "The specified command requires a character-string parameter. Please provide one.";
421 case MCIERR_BAD_INTEGER
:
422 msgptr
= "The specified integer is invalid for this command.";
424 case MCIERR_PARSER_INTERNAL
:
425 msgptr
= "The device driver returned an invalid return type. Check with the device manufacturer about obtaining a new driver.";
427 case MCIERR_DRIVER_INTERNAL
:
428 msgptr
= "There is a problem with the device driver. Check with the device manufacturer about obtaining a new driver.";
430 case MCIERR_MISSING_PARAMETER
:
431 msgptr
= "The specified command requires a parameter. Please supply one.";
433 case MCIERR_UNSUPPORTED_FUNCTION
:
434 msgptr
= "The MCI device you are using does not support the specified command.";
436 case MCIERR_FILE_NOT_FOUND
:
437 msgptr
= "Cannot find the specified file. Make sure the path and filename are correct.";
439 case MCIERR_DEVICE_NOT_READY
:
440 msgptr
= "The device driver is not ready.";
442 case MCIERR_INTERNAL
:
443 msgptr
= "A problem occurred in initializing MCI. Try restarting Windows.";
446 msgptr
= "There is a problem with the device driver. The driver has closed. Cannot access error.";
448 case MCIERR_CANNOT_USE_ALL
:
449 msgptr
= "Cannot use 'all' as the device name with the specified command.";
451 case MCIERR_MULTIPLE
:
452 msgptr
= "Errors occurred in more than one device. Specify each command and device separately to determine which devices caused the error";
454 case MCIERR_EXTENSION_NOT_FOUND
:
455 msgptr
= "Cannot determine the device type from the given filename extension.";
457 case MCIERR_OUTOFRANGE
:
458 msgptr
= "The specified parameter is out of range for the specified command.";
460 case MCIERR_FLAGS_NOT_COMPATIBLE
:
461 msgptr
= "The specified parameters cannot be used together.";
463 case MCIERR_FILE_NOT_SAVED
:
464 msgptr
= "Cannot save the specified file. Make sure you have enough disk space or are still connected to the network.";
466 case MCIERR_DEVICE_TYPE_REQUIRED
:
467 msgptr
= "Cannot find the specified device. Make sure it is installed or that the device name is spelled correctly.";
469 case MCIERR_DEVICE_LOCKED
:
470 msgptr
= "The specified device is now being closed. Wait a few seconds, and then try again.";
472 case MCIERR_DUPLICATE_ALIAS
:
473 msgptr
= "The specified alias is already being used in this application. Use a unique alias.";
475 case MCIERR_BAD_CONSTANT
:
476 msgptr
= "The specified parameter is invalid for this command.";
478 case MCIERR_MUST_USE_SHAREABLE
:
479 msgptr
= "The device driver is already in use. To share it, use the 'shareable' parameter with each 'open' command.";
481 case MCIERR_MISSING_DEVICE_NAME
:
482 msgptr
= "The specified command requires an alias, file, driver, or device name. Please supply one.";
484 case MCIERR_BAD_TIME_FORMAT
:
485 msgptr
= "The specified value for the time format is invalid. Refer to the MCI documentation for valid formats.";
487 case MCIERR_NO_CLOSING_QUOTE
:
488 msgptr
= "A closing double-quotation mark is missing from the parameter value. Please supply one.";
490 case MCIERR_DUPLICATE_FLAGS
:
491 msgptr
= "A parameter or value was specified twice. Only specify it once.";
493 case MCIERR_INVALID_FILE
:
494 msgptr
= "The specified file cannot be played on the specified MCI device. The file may be corrupt, or not in the correct format.";
496 case MCIERR_NULL_PARAMETER_BLOCK
:
497 msgptr
= "A null parameter block was passed to MCI.";
499 case MCIERR_UNNAMED_RESOURCE
:
500 msgptr
= "Cannot save an unnamed file. Supply a filename.";
502 case MCIERR_NEW_REQUIRES_ALIAS
:
503 msgptr
= "You must specify an alias when using the 'new' parameter.";
505 case MCIERR_NOTIFY_ON_AUTO_OPEN
:
506 msgptr
= "Cannot use the 'notify' flag with auto-opened devices.";
508 case MCIERR_NO_ELEMENT_ALLOWED
:
509 msgptr
= "Cannot use a filename with the specified device.";
511 case MCIERR_NONAPPLICABLE_FUNCTION
:
512 msgptr
= "Cannot carry out the commands in the order specified. Correct the command sequence, and then try again.";
514 case MCIERR_ILLEGAL_FOR_AUTO_OPEN
:
515 msgptr
= "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again.";
517 case MCIERR_FILENAME_REQUIRED
:
518 msgptr
= "The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension.";
520 case MCIERR_EXTRA_CHARACTERS
:
521 msgptr
= "Cannot specify extra characters after a string enclosed in quotation marks.";
523 case MCIERR_DEVICE_NOT_INSTALLED
:
524 msgptr
= "The specified device is not installed on the system. Use the Drivers option in Control Panel to install the device.";
527 msgptr
= "Cannot access the specified file or MCI device. Try changing directories or restarting your computer.";
530 msgptr
= "Cannot access the specified file or MCI device because the application cannot change directories.";
532 case MCIERR_SET_DRIVE
:
533 msgptr
= "Cannot access specified file or MCI device because the application cannot change drives.";
535 case MCIERR_DEVICE_LENGTH
:
536 msgptr
= "Specify a device or driver name that is less than 79 characters.";
538 case MCIERR_DEVICE_ORD_LENGTH
:
539 msgptr
= "Specify a device or driver name that is less than 69 characters.";
541 case MCIERR_NO_INTEGER
:
542 msgptr
= "The specified command requires an integer parameter. Please provide one.";
544 case MCIERR_WAVE_OUTPUTSINUSE
:
545 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.";
547 case MCIERR_WAVE_SETOUTPUTINUSE
:
548 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.";
550 case MCIERR_WAVE_INPUTSINUSE
:
551 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.";
553 case MCIERR_WAVE_SETINPUTINUSE
:
554 msgptr
= "Cannot set the current wave device for recording because it is in use. Wait until the device is free, and then try again.";
556 case MCIERR_WAVE_OUTPUTUNSPECIFIED
:
557 msgptr
= "Any compatible waveform playback device may be used.";
559 case MCIERR_WAVE_INPUTUNSPECIFIED
:
560 msgptr
= "Any compatible waveform recording device may be used.";
562 case MCIERR_WAVE_OUTPUTSUNSUITABLE
:
563 msgptr
= "No wave device that can play files in the current format is installed. Use the Drivers option to install the wave device.";
565 case MCIERR_WAVE_SETOUTPUTUNSUITABLE
:
566 msgptr
= "The device you are trying to play to cannot recognize the current file format.";
568 case MCIERR_WAVE_INPUTSUNSUITABLE
:
569 msgptr
= "No wave device that can record files in the current format is installed. Use the Drivers option to install the wave device.";
571 case MCIERR_WAVE_SETINPUTUNSUITABLE
:
572 msgptr
= "The device you are trying to record from cannot recognize the current file format.";
574 case MCIERR_NO_WINDOW
:
575 msgptr
= "There is no display window.";
577 case MCIERR_CREATEWINDOW
:
578 msgptr
= "Could not create or use window.";
580 case MCIERR_FILE_READ
:
581 msgptr
= "Cannot read the specified file. Make sure the file is still present, or check your disk or network connection.";
583 case MCIERR_FILE_WRITE
:
584 msgptr
= "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network.";
588 #define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80)
589 #define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81)
590 #define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82)
591 #define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83)
592 #define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84)
593 #define MCIERR_SEQ_TIMER (MCIERR_BASE + 85)
594 #define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86)
595 #define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87)
604 msg# 520 : digitalvideo
617 msg# 533 : milliseconds
624 msg# 540 : smpte 30 drop
630 msgptr
= "Unknown MCI Error !\n";
633 maxbuf
= min(uLength
- 1, strlen(msgptr
));
634 if (maxbuf
> 0) strncpy(lpstrBuffer
, msgptr
, maxbuf
);
635 lpstrBuffer
[maxbuf
+ 1] = '\0';
640 /**************************************************************************
641 * mciDriverNotify [MMSYSTEM.711]
643 BOOL WINAPI
mciDriverNotify(HWND hWndCallBack
, UINT wDevID
, UINT wStatus
)
645 printf("mciDriverNotify(%04X, %u, %04X)\n", hWndCallBack
, wDevID
, wStatus
);
646 if (!IsWindow(hWndCallBack
)) return FALSE
;
647 printf("mciDriverNotify // before PostMessage\n");
648 PostMessage(hWndCallBack
, MM_MCINOTIFY
, wStatus
,
649 MAKELONG(mciDrv
[wDevID
].wDeviceID
, 0));
653 /**************************************************************************
656 DWORD
mciOpen(DWORD dwParam
, LPMCI_OPEN_PARMS lp16Parms
)
659 LPMCI_OPEN_PARMS lpParms
;
662 lpParms
= PTR_SEG_TO_LIN(lp16Parms
);
663 printf("mciOpen(%08lX, %p (%p))\n", dwParam
, lp16Parms
, lpParms
);
664 if (lp16Parms
== NULL
) return MCIERR_INTERNAL
;
665 while(mciDrv
[wDevID
].wType
!= 0) {
666 if (++wDevID
>= MAXMCIDRIVERS
) {
667 printf("MCI_OPEN // MAXMCIDRIVERS reached !\n");
668 return MCIERR_INTERNAL
;
671 printf("mciOpen // wDevID=%d \n", wDevID
);
672 if (dwParam
& MCI_OPEN_ALIAS
) {
673 printf("MCI_OPEN // Alias='%s' !\n",
674 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
));
675 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
677 if (dwParam
& MCI_OPEN_TYPE
) {
678 if (dwParam
& MCI_OPEN_TYPE_ID
) {
679 printf("MCI_OPEN // Dev=%p !\n", lpParms
->lpstrDeviceType
);
680 uDevTyp
= LOWORD((DWORD
)lpParms
->lpstrDeviceType
);
683 if (lpParms
->lpstrDeviceType
== NULL
) return MCIERR_INTERNAL
;
684 printf("MCI_OPEN // Dev='%s' !\n",
685 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
686 strcpy(str
, PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
688 if (strcmp(str
, "CDAUDIO") == 0) {
689 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
692 if (strcmp(str
, "WAVEAUDIO") == 0) {
693 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
696 if (strcmp(str
, "SEQUENCER") == 0) {
697 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
700 if (strcmp(str
, "ANIMATION1") == 0) {
701 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
704 if (strcmp(str
, "AVIVIDEO") == 0) {
705 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
709 mciDrv
[wDevID
].wType
= uDevTyp
;
710 mciDrv
[wDevID
].wDeviceID
= wDevID
;
711 lpParms
->wDeviceID
= wDevID
;
712 printf("MCI_OPEN // mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
713 wDevID
, uDevTyp
, lpParms
->wDeviceID
);
715 case MCI_DEVTYPE_CD_AUDIO
:
717 WINELIB_UNIMP ("CDAUDIO_DriverProc");
719 return CDAUDIO_DriverProc(0, 0, MCI_OPEN_DRIVER
,
720 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 printf("MCI_OPEN // No DIGITAL_VIDEO yet !\n");
733 return MCIERR_DEVICE_NOT_INSTALLED
;
735 printf("MCI_OPEN // Invalid Device Name '%p' !\n", lpParms
->lpstrDeviceType
);
736 return MCIERR_INVALID_DEVICE_NAME
;
738 return MCIERR_INTERNAL
;
742 /**************************************************************************
743 * mciClose [internal]
745 DWORD
mciClose(UINT wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
747 DWORD dwRet
= MCIERR_INTERNAL
;
748 printf("mciClose(%u, %08lX, %p)\n", wDevID
, dwParam
, lpParms
);
749 switch(mciDrv
[wDevID
].wType
) {
750 case MCI_DEVTYPE_CD_AUDIO
:
752 dwRet
= CDAUDIO_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
753 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
756 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
757 dwRet
= WAVE_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
758 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
760 case MCI_DEVTYPE_SEQUENCER
:
761 dwRet
= MIDI_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
762 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
764 case MCI_DEVTYPE_ANIMATION
:
765 dwRet
= ANIM_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
766 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
769 printf("mciClose() // unknown device type=%04X !\n", mciDrv
[wDevID
].wType
);
771 mciDrv
[wDevID
].wType
= 0;
776 /**************************************************************************
777 * mciSound [internal]
779 DWORD
mciSysInfo(DWORD dwFlags
, LPMCI_SYSINFO_PARMS lpParms
)
785 LPSTR SysFile
= "SYSTEM.INI";
786 dprintf_mci(stddeb
, "mciSysInfo(%08lX, %08lX)\n", dwFlags
, (DWORD
)lpParms
);
787 lpstrReturn
= PTR_SEG_TO_LIN(lpParms
->lpstrReturn
);
789 case MCI_SYSINFO_QUANTITY
:
790 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_QUANTITY \n");
791 lpdwRet
= (DWORD
*)lpstrReturn
;
792 *(lpdwRet
) = InstalledCount
;
794 case MCI_SYSINFO_INSTALLNAME
:
795 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_INSTALLNAME \n");
796 if (lpInstallNames
== NULL
) {
798 InstalledListLen
= 0;
799 ptr
= lpInstallNames
= malloc(2048);
800 GetPrivateProfileString("mci", NULL
, "", lpInstallNames
, 2000, SysFile
);
801 while(strlen(ptr
) > 0) {
802 printf("---> '%s' \n", ptr
);
803 len
= strlen(ptr
) + 1;
805 InstalledListLen
+= len
;
809 if (lpParms
->dwRetSize
< InstalledListLen
) {
810 strncpy(lpstrReturn
, lpInstallNames
, lpParms
->dwRetSize
- 2);
811 lpstrReturn
[lpParms
->dwRetSize
- 1] = '\0';
814 strcpy(lpstrReturn
, lpInstallNames
);
816 case MCI_SYSINFO_NAME
:
817 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_NAME \n");
819 case MCI_SYSINFO_OPEN
:
820 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_OPEN \n");
823 return MMSYSERR_INVALPARAM
;
826 /**************************************************************************
827 * mciSound [internal]
829 DWORD
mciSound(UINT wDevID
, DWORD dwParam
, LPMCI_SOUND_PARMS lpParms
)
831 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
832 if (dwParam
& MCI_SOUND_NAME
)
833 printf("MCI_SOUND // file='%s' !\n", lpParms
->lpstrSoundName
);
834 return MCIERR_INVALID_DEVICE_ID
;
839 /**************************************************************************
840 * mciSendCommand [MMSYSTEM.701]
842 DWORD
mciSendCommand(UINT wDevID
, UINT wMsg
, DWORD dwParam1
, DWORD dwParam2
)
845 dprintf_mci(stddeb
, "mciSendCommand(%04X, %04X, %08lX, %08lX)\n",
846 wDevID
, wMsg
, dwParam1
, dwParam2
);
849 return mciOpen(dwParam1
, (LPMCI_OPEN_PARMS
)dwParam2
);
851 return mciClose(wDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
853 return mciSysInfo(dwParam1
, (LPMCI_SYSINFO_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
855 switch(mciDrv
[wDevID
].wType
) {
856 case MCI_DEVTYPE_CD_AUDIO
:
858 return CDAUDIO_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
859 wMsg
, dwParam1
, dwParam2
);
862 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
863 return WAVE_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
864 wMsg
, dwParam1
, dwParam2
);
865 case MCI_DEVTYPE_SEQUENCER
:
866 return MIDI_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
867 wMsg
, dwParam1
, dwParam2
);
868 case MCI_DEVTYPE_ANIMATION
:
869 return ANIM_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
870 wMsg
, dwParam1
, dwParam2
);
872 printf("mciSendCommand() // unknown device type=%04X !\n",
873 mciDrv
[wDevID
].wType
);
876 return MMSYSERR_INVALPARAM
;
879 /**************************************************************************
880 * mciGetDeviceID [MMSYSTEM.703]
882 UINT
mciGetDeviceID (LPCSTR lpstrName
)
885 printf("mciGetDeviceID(%s)\n", lpstrName
);
886 if (lpstrName
!= NULL
) {
887 strcpy(str
, lpstrName
);
889 if (strcmp(str
, "ALL") == 0) return MCI_ALL_DEVICE_ID
;
894 /**************************************************************************
895 * mciSendString [MMSYSTEM.702]
897 DWORD WINAPI
mciSendString (LPCSTR lpstrCommand
,
898 LPSTR lpstrReturnString
, UINT uReturnLength
, HWND hwndCallback
)
900 printf("mciSendString('%s', %p, %u, %X)\n",
901 lpstrCommand
, lpstrReturnString
,
902 uReturnLength
, hwndCallback
);
903 return MCIERR_MISSING_COMMAND_STRING
;
906 /**************************************************************************
907 * mciSetYieldProc [MMSYSTEM.714]
909 BOOL WINAPI
mciSetYieldProc (UINT uDeviceID
,
910 YIELDPROC fpYieldProc
, DWORD dwYieldData
)
915 /**************************************************************************
916 * mciGetDeviceIDFromElementID [MMSYSTEM.715]
918 UINT WINAPI
mciGetDeviceIDFromElementID(DWORD dwElementID
, LPCSTR lpstrType
)
923 /**************************************************************************
924 * mciGetYieldProc [MMSYSTEM.716]
926 YIELDPROC WINAPI
mciGetYieldProc(UINT uDeviceID
, DWORD FAR
* lpdwYieldData
)
931 /**************************************************************************
932 * mciGetCreatorTask [MMSYSTEM.717]
934 HTASK WINAPI
mciGetCreatorTask(UINT uDeviceID
)
939 /**************************************************************************
940 * midiOutGetNumDevs [MMSYSTEM.201]
942 UINT WINAPI
midiOutGetNumDevs(void)
945 printf("midiOutGetNumDevs\n");
946 count
+= modMessage(0, MODM_GETNUMDEVS
, 0L, 0L, 0L);
947 printf("midiOutGetNumDevs return %u \n", count
);
951 /**************************************************************************
952 * midiOutGetDevCaps [MMSYSTEM.202]
954 UINT WINAPI
midiOutGetDevCaps(UINT uDeviceID
,
955 MIDIOUTCAPS FAR
* lpCaps
, UINT uSize
)
957 printf("midiOutGetDevCaps\n");
961 /**************************************************************************
962 * midiOutGetErrorText [MMSYSTEM.203]
964 UINT WINAPI
midiOutGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
966 printf("midiOutGetErrorText\n");
967 return(midiGetErrorText(uError
, lpText
, uSize
));
971 /**************************************************************************
972 * midiGetErrorText [internal]
974 UINT WINAPI
midiGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
978 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
981 case MIDIERR_UNPREPARED
:
982 msgptr
= "The MIDI header was not prepared. Use the Prepare function to prepare the header, and then try again.";
984 case MIDIERR_STILLPLAYING
:
985 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
988 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.";
990 case MIDIERR_NOTREADY
:
991 msgptr
= "The port is transmitting data to the device. Wait until the data has been transmitted, and then try again.";
993 case MIDIERR_NODEVICE
:
994 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.";
996 case MIDIERR_INVALIDSETUP
:
997 msgptr
= "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the Windows SYSTEM directory, and then try again.";
1000 msg# 336 : Cannot use the song-pointer time format and the SMPTE time-format together.
1001 msg# 337 : The specified MIDI device is already in use. Wait until it is free, and then try again.
1002 msg# 338 : The specified MIDI device is not installed on the system. Use the Drivers option in Control Panel to install the driver.
1003 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.
1004 msg# 340 : An error occurred using the specified port.
1005 msg# 341 : All multimedia timers are being used by other applications. Quit one of these applications, and then try again.
1006 msg# 342 : There is no current MIDI port.
1007 msg# 343 : There are no MIDI devices installed on the system. Use the Drivers option in Control Panel to install the driver.
1010 msgptr
= "Unknown MIDI Error !\n";
1013 maxbuf
= min(uSize
- 1, strlen(msgptr
));
1014 if (maxbuf
> 0) strncpy(lpText
, msgptr
, maxbuf
);
1015 lpText
[maxbuf
+ 1] = '\0';
1019 /**************************************************************************
1020 * midiOutOpen [MMSYSTEM.204]
1022 UINT WINAPI
midiOutOpen(HMIDIOUT FAR
* lphMidiOut
, UINT uDeviceID
,
1023 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1026 LPMIDIOPENDESC lpDesc
;
1027 LPMIDIOPENDESC lp16Desc
;
1029 BOOL bMapperFlg
= FALSE
;
1030 if (lphMidiOut
!= NULL
) *lphMidiOut
= 0;
1031 printf("midiOutOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1032 lphMidiOut
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1033 if (uDeviceID
== (UINT
)MIDI_MAPPER
) {
1034 printf("midiOutOpen // MIDI_MAPPER mode requested !\n");
1038 hMidiOut
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1039 if (lphMidiOut
!= NULL
) *lphMidiOut
= hMidiOut
;
1040 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiOut
);
1041 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1042 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1043 lpDesc
->hMidi
= hMidiOut
;
1044 lpDesc
->dwCallback
= dwCallback
;
1045 lpDesc
->dwInstance
= dwInstance
;
1046 while(uDeviceID
< MAXMIDIDRIVERS
) {
1047 dwRet
= modMessage(uDeviceID
, MODM_OPEN
,
1048 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1049 if (dwRet
== MMSYSERR_NOERROR
) break;
1050 if (!bMapperFlg
) break;
1052 printf("midiOutOpen // MIDI_MAPPER mode ! try next driver...\n");
1057 /**************************************************************************
1058 * midiOutClose [MMSYSTEM.205]
1060 UINT WINAPI
midiOutClose(HMIDIOUT hMidiOut
)
1062 LPMIDIOPENDESC lpDesc
;
1063 printf("midiOutClose(%04X)\n", hMidiOut
);
1064 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1065 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1066 return modMessage(0, MODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1069 /**************************************************************************
1070 * midiOutPrepareHeader [MMSYSTEM.206]
1072 UINT WINAPI
midiOutPrepareHeader(HMIDIOUT hMidiOut
,
1073 MIDIHDR FAR
* lpMidiOutHdr
, UINT uSize
)
1075 LPMIDIOPENDESC lpDesc
;
1076 printf("midiOutPrepareHeader(%04X, %p, %d)\n",
1077 hMidiOut
, lpMidiOutHdr
, uSize
);
1078 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1079 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1080 return modMessage(0, MODM_PREPARE
, lpDesc
->dwInstance
,
1081 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1084 /**************************************************************************
1085 * midiOutUnprepareHeader [MMSYSTEM.207]
1087 UINT WINAPI
midiOutUnprepareHeader(HMIDIOUT hMidiOut
,
1088 MIDIHDR FAR
* lpMidiOutHdr
, UINT uSize
)
1090 LPMIDIOPENDESC lpDesc
;
1091 printf("midiOutUnprepareHeader(%04X, %p, %d)\n",
1092 hMidiOut
, lpMidiOutHdr
, uSize
);
1093 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1094 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1095 return modMessage(0, MODM_UNPREPARE
, lpDesc
->dwInstance
,
1096 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1099 /**************************************************************************
1100 * midiOutShortMsg [MMSYSTEM.208]
1102 UINT WINAPI
midiOutShortMsg(HMIDIOUT hMidiOut
, DWORD dwMsg
)
1104 LPMIDIOPENDESC lpDesc
;
1105 printf("midiOutShortMsg(%04X, %08lX)\n", hMidiOut
, dwMsg
);
1106 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1107 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1108 return modMessage(0, MODM_DATA
, lpDesc
->dwInstance
, dwMsg
, 0L);
1111 /**************************************************************************
1112 * midiOutLongMsg [MMSYSTEM.209]
1114 UINT WINAPI
midiOutLongMsg(HMIDIOUT hMidiOut
,
1115 MIDIHDR FAR
* lpMidiOutHdr
, UINT uSize
)
1117 LPMIDIOPENDESC lpDesc
;
1118 printf("midiOutLongMsg(%04X, %p, %d)\n",
1119 hMidiOut
, lpMidiOutHdr
, uSize
);
1120 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1121 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1122 return modMessage(0, MODM_LONGDATA
, lpDesc
->dwInstance
,
1123 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1126 /**************************************************************************
1127 * midiOutReset [MMSYSTEM.210]
1129 UINT WINAPI
midiOutReset(HMIDIOUT hMidiOut
)
1131 LPMIDIOPENDESC lpDesc
;
1132 printf("midiOutReset(%04X)\n", hMidiOut
);
1133 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1134 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1135 return modMessage(0, MODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1138 /**************************************************************************
1139 * midiOutGetVolume [MMSYSTEM.211]
1141 UINT WINAPI
midiOutGetVolume(UINT uDeviceID
, DWORD FAR
* lpdwVolume
)
1143 printf("midiOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1144 return modMessage(uDeviceID
, MODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1148 /**************************************************************************
1149 * midiOutSetVolume [MMSYSTEM.212]
1151 UINT WINAPI
midiOutSetVolume(UINT uDeviceID
, DWORD dwVolume
)
1153 printf("midiOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1154 return modMessage(uDeviceID
, MODM_SETVOLUME
, 0L, dwVolume
, 0L);
1158 /**************************************************************************
1159 * midiOutCachePatches [MMSYSTEM.213]
1161 UINT WINAPI
midiOutCachePatches(HMIDIOUT hMidiOut
,
1162 UINT uBank
, WORD FAR
* lpwPatchArray
, UINT uFlags
)
1164 printf("midiOutCachePatches\n");
1168 /**************************************************************************
1169 * midiOutCacheDrumPatches [MMSYSTEM.214]
1171 UINT WINAPI
midiOutCacheDrumPatches(HMIDIOUT hMidiOut
,
1172 UINT uPatch
, WORD FAR
* lpwKeyArray
, UINT uFlags
)
1174 printf("midiOutCacheDrumPatches\n");
1178 /**************************************************************************
1179 * midiOutGetID [MMSYSTEM.215]
1181 UINT WINAPI
midiOutGetID(HMIDIOUT hMidiOut
, UINT FAR
* lpuDeviceID
)
1183 printf("midiOutGetID\n");
1187 /**************************************************************************
1188 * midiOutMessage [MMSYSTEM.216]
1190 DWORD WINAPI
midiOutMessage(HMIDIOUT hMidiOut
, UINT uMessage
,
1191 DWORD dwParam1
, DWORD dwParam2
)
1193 LPMIDIOPENDESC lpDesc
;
1194 printf("midiOutMessage(%04X, %04X, %08lX, %08lX)\n",
1195 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
1196 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1197 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1198 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1202 /**************************************************************************
1203 * midiInGetNumDevs [MMSYSTEM.301]
1205 UINT WINAPI
midiInGetNumDevs(void)
1208 printf("midiInGetNumDevs\n");
1209 count
+= midMessage(0, MIDM_GETNUMDEVS
, 0L, 0L, 0L);
1210 printf("midiInGetNumDevs return %u \n", count
);
1214 /**************************************************************************
1215 * midiInGetDevCaps [MMSYSTEM.302]
1217 UINT WINAPI
midiInGetDevCaps(UINT uDeviceID
,
1218 LPMIDIINCAPS lpCaps
, UINT uSize
)
1220 printf("midiInGetDevCaps\n");
1224 /**************************************************************************
1225 * midiInGetErrorText [MMSYSTEM.303]
1227 UINT WINAPI
midiInGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1229 printf("midiInGetErrorText\n");
1230 return (midiGetErrorText(uError
, lpText
, uSize
));
1233 /**************************************************************************
1234 * midiInOpen [MMSYSTEM.304]
1236 UINT WINAPI
midiInOpen(HMIDIIN FAR
* lphMidiIn
, UINT uDeviceID
,
1237 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1240 LPMIDIOPENDESC lpDesc
;
1241 LPMIDIOPENDESC lp16Desc
;
1243 BOOL bMapperFlg
= FALSE
;
1244 if (lphMidiIn
!= NULL
) *lphMidiIn
= 0;
1245 printf("midiInOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1246 lphMidiIn
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1247 if (uDeviceID
== (UINT
)MIDI_MAPPER
) {
1248 printf("midiInOpen // MIDI_MAPPER mode requested !\n");
1252 hMidiIn
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1253 if (lphMidiIn
!= NULL
) *lphMidiIn
= hMidiIn
;
1254 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiIn
);
1255 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1256 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1257 lpDesc
->hMidi
= hMidiIn
;
1258 lpDesc
->dwCallback
= dwCallback
;
1259 lpDesc
->dwInstance
= dwInstance
;
1260 while(uDeviceID
< MAXMIDIDRIVERS
) {
1261 dwRet
= midMessage(uDeviceID
, MIDM_OPEN
,
1262 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
1263 if (dwRet
== MMSYSERR_NOERROR
) break;
1264 if (!bMapperFlg
) break;
1266 printf("midiInOpen // MIDI_MAPPER mode ! try next driver...\n");
1271 /**************************************************************************
1272 * midiInClose [MMSYSTEM.305]
1274 UINT WINAPI
midiInClose(HMIDIIN hMidiIn
)
1276 LPMIDIOPENDESC lpDesc
;
1277 printf("midiInClose(%04X)\n", hMidiIn
);
1278 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1279 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1280 return midMessage(0, MIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1283 /**************************************************************************
1284 * midiInPrepareHeader [MMSYSTEM.306]
1286 UINT WINAPI
midiInPrepareHeader(HMIDIIN hMidiIn
,
1287 MIDIHDR FAR
* lpMidiInHdr
, UINT uSize
)
1289 LPMIDIOPENDESC lpDesc
;
1290 printf("midiInPrepareHeader(%04X, %p, %d)\n",
1291 hMidiIn
, lpMidiInHdr
, uSize
);
1292 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1293 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1294 return midMessage(0, MIDM_PREPARE
, lpDesc
->dwInstance
,
1295 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1298 /**************************************************************************
1299 * midiInUnprepareHeader [MMSYSTEM.307]
1301 UINT WINAPI
midiInUnprepareHeader(HMIDIIN hMidiIn
,
1302 MIDIHDR FAR
* lpMidiInHdr
, UINT uSize
)
1304 LPMIDIOPENDESC lpDesc
;
1305 printf("midiInUnprepareHeader(%04X, %p, %d)\n",
1306 hMidiIn
, lpMidiInHdr
, uSize
);
1307 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1308 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1309 return midMessage(0, MIDM_UNPREPARE
, lpDesc
->dwInstance
,
1310 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1313 /**************************************************************************
1314 * midiInAddBuffer [MMSYSTEM.308]
1316 UINT WINAPI
midiInAddBuffer(HMIDIIN hMidiIn
,
1317 MIDIHDR FAR
* lpMidiInHdr
, UINT uSize
)
1319 printf("midiInAddBuffer\n");
1323 /**************************************************************************
1324 * midiInStart [MMSYSTEM.309]
1326 UINT WINAPI
midiInStart(HMIDIIN hMidiIn
)
1328 printf("midiInStart\n");
1332 /**************************************************************************
1333 * midiInStop [MMSYSTEM.310]
1335 UINT WINAPI
midiInStop(HMIDIIN hMidiIn
)
1337 printf("midiInStop\n");
1341 /**************************************************************************
1342 * midiInReset [MMSYSTEM.311]
1344 UINT WINAPI
midiInReset(HMIDIIN hMidiIn
)
1346 printf("midiInReset\n");
1350 /**************************************************************************
1351 * midiInGetID [MMSYSTEM.312]
1353 UINT WINAPI
midiInGetID(HMIDIIN hMidiIn
, UINT FAR
* lpuDeviceID
)
1355 printf("midiInGetID\n");
1359 /**************************************************************************
1360 * midiInMessage [MMSYSTEM.313]
1362 DWORD WINAPI
midiInMessage(HMIDIIN hMidiIn
, UINT uMessage
,
1363 DWORD dwParam1
, DWORD dwParam2
)
1365 LPMIDIOPENDESC lpDesc
;
1366 printf("midiInMessage(%04X, %04X, %08lX, %08lX)\n",
1367 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
1368 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1369 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1370 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1374 /**************************************************************************
1375 * waveOutGetNumDevs [MMSYSTEM.401]
1377 UINT WINAPI
waveOutGetNumDevs()
1380 printf("waveOutGetNumDevs\n");
1381 count
+= wodMessage(0, WODM_GETNUMDEVS
, 0L, 0L, 0L);
1382 printf("waveOutGetNumDevs return %u \n", count
);
1386 /**************************************************************************
1387 * waveOutGetDevCaps [MMSYSTEM.402]
1389 UINT WINAPI
waveOutGetDevCaps(UINT uDeviceID
, WAVEOUTCAPS FAR
* lpCaps
, UINT uSize
)
1391 printf("waveOutGetDevCaps\n");
1392 return wodMessage(uDeviceID
, WODM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1395 /**************************************************************************
1396 * waveOutGetErrorText [MMSYSTEM.403]
1398 UINT WINAPI
waveOutGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1400 printf("waveOutGetErrorText\n");
1401 return(waveGetErrorText(uError
, lpText
, uSize
));
1405 /**************************************************************************
1406 * waveGetErrorText [internal]
1408 UINT WINAPI
waveGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1412 printf("waveGetErrorText(%04X, %p, %d);\n", uError
, lpText
, uSize
);
1413 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1416 case MMSYSERR_NOERROR
:
1417 msgptr
= "The specified command was carried out.";
1419 case MMSYSERR_ERROR
:
1420 msgptr
= "Undefined external error.";
1422 case MMSYSERR_BADDEVICEID
:
1423 msgptr
= "A device ID has been used that is out of range for your system.";
1425 case MMSYSERR_NOTENABLED
:
1426 msgptr
= "The driver was not enabled.";
1428 case MMSYSERR_ALLOCATED
:
1429 msgptr
= "The specified device is already in use. Wait until it is free, and then try again.";
1431 case MMSYSERR_INVALHANDLE
:
1432 msgptr
= "The specified device handle is invalid.";
1434 case MMSYSERR_NODRIVER
:
1435 msgptr
= "There is no driver installed on your system !\n";
1437 case MMSYSERR_NOMEM
:
1438 msgptr
= "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
1440 case MMSYSERR_NOTSUPPORTED
:
1441 msgptr
= "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
1443 case MMSYSERR_BADERRNUM
:
1444 msgptr
= "An error number was specified that is not defined in the system.";
1446 case MMSYSERR_INVALFLAG
:
1447 msgptr
= "An invalid flag was passed to a system function.";
1449 case MMSYSERR_INVALPARAM
:
1450 msgptr
= "An invalid parameter was passed to a system function.";
1452 case WAVERR_BADFORMAT
:
1453 msgptr
= "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
1455 case WAVERR_STILLPLAYING
:
1456 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1458 case WAVERR_UNPREPARED
:
1459 msgptr
= "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1462 msgptr
= "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
1465 msgptr
= "Unknown MMSYSTEM Error !\n";
1468 maxbuf
= min(uSize
- 1, strlen(msgptr
));
1469 if (maxbuf
> 0) strncpy(lpText
, msgptr
, maxbuf
);
1470 lpText
[maxbuf
+ 1] = '\0';
1474 /**************************************************************************
1475 * waveOutOpen [MMSYSTEM.404]
1477 UINT WINAPI
waveOutOpen(HWAVEOUT FAR
* lphWaveOut
, UINT uDeviceID
,
1478 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1481 LPWAVEOPENDESC lpDesc
;
1482 LPWAVEOPENDESC lp16Desc
;
1484 BOOL bMapperFlg
= FALSE
;
1485 printf("waveOutOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1486 lphWaveOut
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1487 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1488 printf("waveOutOpen // WAVE_FORMAT_QUERY requested !\n");
1490 if (uDeviceID
== (UINT
)WAVE_MAPPER
) {
1491 printf("waveOutOpen // WAVE_MAPPER mode requested !\n");
1495 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1496 hWaveOut
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1497 if (lphWaveOut
!= NULL
) *lphWaveOut
= hWaveOut
;
1498 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveOut
);
1499 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1500 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1501 lpDesc
->hWave
= hWaveOut
;
1502 lpDesc
->lpFormat
= lpFormat
;
1503 lpDesc
->dwCallBack
= dwCallback
;
1504 lpDesc
->dwInstance
= dwInstance
;
1505 while(uDeviceID
< MAXWAVEDRIVERS
) {
1506 dwRet
= wodMessage(uDeviceID
, WODM_OPEN
,
1507 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1508 if (dwRet
== MMSYSERR_NOERROR
) break;
1509 if (!bMapperFlg
) break;
1511 printf("waveOutOpen // WAVE_MAPPER mode ! try next driver...\n");
1513 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1514 printf("waveOutOpen // End of WAVE_FORMAT_QUERY !\n");
1515 waveOutClose(hWaveOut
);
1520 /**************************************************************************
1521 * waveOutClose [MMSYSTEM.405]
1523 UINT WINAPI
waveOutClose(HWAVEOUT hWaveOut
)
1525 LPWAVEOPENDESC lpDesc
;
1526 printf("waveOutClose(%04X)\n", hWaveOut
);
1527 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1528 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1529 return wodMessage(0, WODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1532 /**************************************************************************
1533 * waveOutPrepareHeader [MMSYSTEM.406]
1535 UINT WINAPI
waveOutPrepareHeader(HWAVEOUT hWaveOut
,
1536 WAVEHDR FAR
* lpWaveOutHdr
, UINT uSize
)
1538 LPWAVEOPENDESC lpDesc
;
1539 printf("waveOutPrepareHeader(%04X, %p, %u);\n",
1540 hWaveOut
, lpWaveOutHdr
, uSize
);
1541 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1542 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1543 return wodMessage(0, WODM_PREPARE
, lpDesc
->dwInstance
,
1544 (DWORD
)lpWaveOutHdr
, uSize
);
1547 /**************************************************************************
1548 * waveOutUnprepareHeader [MMSYSTEM.407]
1550 UINT WINAPI
waveOutUnprepareHeader(HWAVEOUT hWaveOut
,
1551 WAVEHDR FAR
* lpWaveOutHdr
, UINT uSize
)
1553 LPWAVEOPENDESC lpDesc
;
1554 printf("waveOutUnprepareHeader(%04X, %p, %u);\n",
1555 hWaveOut
, lpWaveOutHdr
, uSize
);
1556 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1557 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1558 return wodMessage(0, WODM_UNPREPARE
, lpDesc
->dwInstance
,
1559 (DWORD
)lpWaveOutHdr
, uSize
);
1562 /**************************************************************************
1563 * waveOutWrite [MMSYSTEM.408]
1565 UINT WINAPI
waveOutWrite(HWAVEOUT hWaveOut
, WAVEHDR FAR
* lpWaveOutHdr
, UINT uSize
)
1567 LPWAVEOPENDESC lpDesc
;
1568 printf("waveOutWrite(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
1569 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1570 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1571 return wodMessage(0, WODM_WRITE
, lpDesc
->dwInstance
,
1572 (DWORD
)lpWaveOutHdr
, uSize
);
1575 /**************************************************************************
1576 * waveOutPause [MMSYSTEM.409]
1578 UINT WINAPI
waveOutPause(HWAVEOUT hWaveOut
)
1580 LPWAVEOPENDESC lpDesc
;
1581 printf("waveOutPause(%04X)\n", hWaveOut
);
1582 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1583 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1584 return wodMessage(0, WODM_PAUSE
, lpDesc
->dwInstance
, 0L, 0L);
1587 /**************************************************************************
1588 * waveOutRestart [MMSYSTEM.410]
1590 UINT WINAPI
waveOutRestart(HWAVEOUT hWaveOut
)
1592 LPWAVEOPENDESC lpDesc
;
1593 printf("waveOutRestart(%04X)\n", hWaveOut
);
1594 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1595 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1596 return wodMessage(0, WODM_RESTART
, lpDesc
->dwInstance
, 0L, 0L);
1599 /**************************************************************************
1600 * waveOutReset [MMSYSTEM.411]
1602 UINT WINAPI
waveOutReset(HWAVEOUT hWaveOut
)
1604 LPWAVEOPENDESC lpDesc
;
1605 printf("waveOutReset(%04X)\n", hWaveOut
);
1606 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1607 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1608 return wodMessage(0, WODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1611 /**************************************************************************
1612 * waveOutGetPosition [MMSYSTEM.412]
1614 UINT WINAPI
waveOutGetPosition(HWAVEOUT hWaveOut
, MMTIME FAR
* lpTime
, UINT uSize
)
1616 LPWAVEOPENDESC lpDesc
;
1617 printf("waveOutGetPosition(%04X, %p, %u);\n", hWaveOut
, lpTime
, uSize
);
1618 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1619 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1620 return wodMessage(0, WODM_GETPOS
, lpDesc
->dwInstance
,
1621 (DWORD
)lpTime
, (DWORD
)uSize
);
1624 /**************************************************************************
1625 * waveOutGetPitch [MMSYSTEM.413]
1627 UINT WINAPI
waveOutGetPitch(HWAVEOUT hWaveOut
, DWORD FAR
* lpdwPitch
)
1629 LPWAVEOPENDESC lpDesc
;
1630 printf("waveOutGetPitch(%04X, %p);\n", hWaveOut
, lpdwPitch
);
1631 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1632 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1633 return wodMessage(0, WODM_GETPITCH
, lpDesc
->dwInstance
,
1634 (DWORD
)lpdwPitch
, 0L);
1637 /**************************************************************************
1638 * waveOutSetPitch [MMSYSTEM.414]
1640 UINT WINAPI
waveOutSetPitch(HWAVEOUT hWaveOut
, DWORD dwPitch
)
1642 LPWAVEOPENDESC lpDesc
;
1643 printf("waveOutSetPitch(%04X, %08lX);\n", hWaveOut
, dwPitch
);
1644 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1645 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1646 return wodMessage(0, WODM_SETPITCH
, lpDesc
->dwInstance
, (DWORD
)dwPitch
, 0L);
1649 /**************************************************************************
1650 * waveOutGetVolume [MMSYSTEM.415]
1652 UINT WINAPI
waveOutGetVolume(UINT uDeviceID
, DWORD FAR
* lpdwVolume
)
1654 printf("waveOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1655 return wodMessage(uDeviceID
, WODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1658 /**************************************************************************
1659 * waveOutSetVolume [MMSYSTEM.416]
1661 UINT WINAPI
waveOutSetVolume(UINT uDeviceID
, DWORD dwVolume
)
1663 printf("waveOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1664 return wodMessage(uDeviceID
, WODM_SETVOLUME
, 0L, dwVolume
, 0L);
1667 /**************************************************************************
1668 * waveOutGetPlaybackRate [MMSYSTEM.417]
1670 UINT WINAPI
waveOutGetPlaybackRate(HWAVEOUT hWaveOut
, DWORD FAR
* lpdwRate
)
1672 LPWAVEOPENDESC lpDesc
;
1673 printf("waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut
, lpdwRate
);
1674 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1675 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1676 return wodMessage(0, WODM_GETPLAYBACKRATE
, lpDesc
->dwInstance
,
1677 (DWORD
)lpdwRate
, 0L);
1680 /**************************************************************************
1681 * waveOutSetPlaybackRate [MMSYSTEM.418]
1683 UINT WINAPI
waveOutSetPlaybackRate(HWAVEOUT hWaveOut
, DWORD dwRate
)
1685 LPWAVEOPENDESC lpDesc
;
1686 printf("waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut
, dwRate
);
1687 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1688 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1689 return wodMessage(0, WODM_SETPLAYBACKRATE
,
1690 lpDesc
->dwInstance
, (DWORD
)dwRate
, 0L);
1693 /**************************************************************************
1694 * waveOutBreakLoop [MMSYSTEM.419]
1696 UINT WINAPI
waveOutBreakLoop(HWAVEOUT hWaveOut
)
1698 printf("waveOutBreakLoop(%04X)\n", hWaveOut
);
1699 return MMSYSERR_INVALHANDLE
;
1702 /**************************************************************************
1703 * waveOutGetID [MMSYSTEM.420]
1705 UINT WINAPI
waveOutGetID(HWAVEOUT hWaveOut
, UINT FAR
* lpuDeviceID
)
1707 LPWAVEOPENDESC lpDesc
;
1708 printf("waveOutGetID(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
1709 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1710 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1711 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
1713 *lpuDeviceID = lpParms->wDeviceID;
1718 /**************************************************************************
1719 * waveOutMessage [MMSYSTEM.421]
1721 DWORD WINAPI
waveOutMessage(HWAVEOUT hWaveOut
, UINT uMessage
,
1722 DWORD dwParam1
, DWORD dwParam2
)
1724 LPWAVEOPENDESC lpDesc
;
1725 printf("waveOutMessage(%04X, %04X, %08lX, %08lX)\n",
1726 hWaveOut
, uMessage
, dwParam1
, dwParam2
);
1727 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1728 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1729 return wodMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1732 /**************************************************************************
1733 * waveInGetNumDevs [MMSYSTEM.501]
1735 UINT WINAPI
waveInGetNumDevs()
1738 printf("waveInGetNumDevs\n");
1739 count
+= widMessage(0, WIDM_GETNUMDEVS
, 0L, 0L, 0L);
1740 printf("waveInGetNumDevs return %u \n", count
);
1745 /**************************************************************************
1746 * waveInGetDevCaps [MMSYSTEM.502]
1748 UINT WINAPI
waveInGetDevCaps(UINT uDeviceID
, WAVEINCAPS FAR
* lpCaps
, UINT uSize
)
1750 printf("waveInGetDevCaps\n");
1751 return widMessage(uDeviceID
, WIDM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1755 /**************************************************************************
1756 * waveInGetErrorText [MMSYSTEM.503]
1758 UINT WINAPI
waveInGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1760 printf("waveInGetErrorText\n");
1761 return(waveGetErrorText(uError
, lpText
, uSize
));
1765 /**************************************************************************
1766 * waveInOpen [MMSYSTEM.504]
1768 UINT WINAPI
waveInOpen(HWAVEIN FAR
* lphWaveIn
, UINT uDeviceID
,
1769 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1772 LPWAVEOPENDESC lpDesc
;
1773 LPWAVEOPENDESC lp16Desc
;
1775 BOOL bMapperFlg
= FALSE
;
1776 printf("waveInOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1777 lphWaveIn
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1778 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1779 printf("waveInOpen // WAVE_FORMAT_QUERY requested !\n");
1781 if (uDeviceID
== (UINT
)WAVE_MAPPER
) {
1782 printf("waveInOpen // WAVE_MAPPER mode requested !\n");
1786 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1787 hWaveIn
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1788 if (lphWaveIn
!= NULL
) *lphWaveIn
= hWaveIn
;
1789 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveIn
);
1790 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1791 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1792 lpDesc
->hWave
= hWaveIn
;
1793 lpDesc
->lpFormat
= lpFormat
;
1794 lpDesc
->dwCallBack
= dwCallback
;
1795 lpDesc
->dwInstance
= dwInstance
;
1796 while(uDeviceID
< MAXWAVEDRIVERS
) {
1797 dwRet
= widMessage(uDeviceID
, WIDM_OPEN
,
1798 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1799 if (dwRet
== MMSYSERR_NOERROR
) break;
1800 if (!bMapperFlg
) break;
1802 printf("waveInOpen // WAVE_MAPPER mode ! try next driver...\n");
1804 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1805 printf("waveInOpen // End of WAVE_FORMAT_QUERY !\n");
1806 waveInClose(hWaveIn
);
1812 /**************************************************************************
1813 * waveInClose [MMSYSTEM.505]
1815 UINT WINAPI
waveInClose(HWAVEIN hWaveIn
)
1817 LPWAVEOPENDESC lpDesc
;
1818 printf("waveInClose(%04X)\n", hWaveIn
);
1819 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1820 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1821 return widMessage(0, WIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1825 /**************************************************************************
1826 * waveInPrepareHeader [MMSYSTEM.506]
1828 UINT WINAPI
waveInPrepareHeader(HWAVEIN hWaveIn
,
1829 WAVEHDR FAR
* lpWaveInHdr
, UINT uSize
)
1831 LPWAVEOPENDESC lpDesc
;
1832 LPWAVEHDR lp32WaveInHdr
;
1833 printf("waveInPrepareHeader(%04X, %p, %u);\n",
1834 hWaveIn
, lpWaveInHdr
, uSize
);
1835 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1836 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1837 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1838 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1839 lp32WaveInHdr
->lpNext
= NULL
;
1840 lp32WaveInHdr
->dwBytesRecorded
= 0;
1841 printf("waveInPrepareHeader // lpData=%p size=%lu \n",
1842 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1843 return widMessage(0, WIDM_PREPARE
, lpDesc
->dwInstance
,
1844 (DWORD
)lpWaveInHdr
, uSize
);
1848 /**************************************************************************
1849 * waveInUnprepareHeader [MMSYSTEM.507]
1851 UINT WINAPI
waveInUnprepareHeader(HWAVEIN hWaveIn
,
1852 WAVEHDR FAR
* lpWaveInHdr
, UINT uSize
)
1854 LPWAVEOPENDESC lpDesc
;
1855 LPWAVEHDR lp32WaveInHdr
;
1856 printf("waveInUnprepareHeader(%04X, %p, %u);\n",
1857 hWaveIn
, lpWaveInHdr
, uSize
);
1858 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1859 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1860 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1861 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1862 USER_HEAP_FREE(HIWORD((DWORD
)lp32WaveInHdr
->lpData
));
1863 lp32WaveInHdr
->lpData
= NULL
;
1864 lp32WaveInHdr
->lpNext
= NULL
;
1865 return widMessage(0, WIDM_UNPREPARE
, lpDesc
->dwInstance
,
1866 (DWORD
)lpWaveInHdr
, uSize
);
1870 /**************************************************************************
1871 * waveInAddBuffer [MMSYSTEM.508]
1873 UINT WINAPI
waveInAddBuffer(HWAVEIN hWaveIn
,
1874 WAVEHDR FAR
* lpWaveInHdr
, UINT uSize
)
1876 LPWAVEOPENDESC lpDesc
;
1877 LPWAVEHDR lp32WaveInHdr
;
1878 printf("waveInAddBuffer(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
1879 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1880 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1881 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1882 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1883 lp32WaveInHdr
->lpNext
= NULL
;
1884 lp32WaveInHdr
->dwBytesRecorded
= 0;
1885 printf("waveInAddBuffer // lpData=%p size=%lu \n",
1886 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1887 return widMessage(0, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
1888 (DWORD
)lpWaveInHdr
, uSize
);
1892 /**************************************************************************
1893 * waveInStart [MMSYSTEM.509]
1895 UINT WINAPI
waveInStart(HWAVEIN hWaveIn
)
1897 LPWAVEOPENDESC lpDesc
;
1898 printf("waveInStart(%04X)\n", hWaveIn
);
1899 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1900 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1901 return widMessage(0, WIDM_START
, lpDesc
->dwInstance
, 0L, 0L);
1905 /**************************************************************************
1906 * waveInStop [MMSYSTEM.510]
1908 UINT WINAPI
waveInStop(HWAVEIN hWaveIn
)
1910 LPWAVEOPENDESC lpDesc
;
1911 printf("waveInStop(%04X)\n", hWaveIn
);
1912 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1913 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1914 return widMessage(0, WIDM_STOP
, lpDesc
->dwInstance
, 0L, 0L);
1918 /**************************************************************************
1919 * waveInReset [MMSYSTEM.511]
1921 UINT WINAPI
waveInReset(HWAVEIN hWaveIn
)
1923 LPWAVEOPENDESC lpDesc
;
1924 printf("waveInReset(%04X)\n", hWaveIn
);
1925 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1926 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1927 return widMessage(0, WIDM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1931 /**************************************************************************
1932 * waveInGetPosition [MMSYSTEM.512]
1934 UINT WINAPI
waveInGetPosition(HWAVEIN hWaveIn
, MMTIME FAR
* lpTime
, UINT uSize
)
1936 LPWAVEOPENDESC lpDesc
;
1937 printf("waveInGetPosition(%04X, %p, %u);\n", hWaveIn
, lpTime
, uSize
);
1938 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1939 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1940 return widMessage(0, WIDM_GETPOS
, lpDesc
->dwInstance
,
1941 (DWORD
)lpTime
, (DWORD
)uSize
);
1945 /**************************************************************************
1946 * waveInGetID [MMSYSTEM.513]
1948 UINT WINAPI
waveInGetID(HWAVEIN hWaveIn
, UINT FAR
* lpuDeviceID
)
1950 printf("waveInGetID\n");
1951 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALPARAM
;
1956 /**************************************************************************
1957 * waveInMessage [MMSYSTEM.514]
1959 DWORD WINAPI
waveInMessage(HWAVEIN hWaveIn
, UINT uMessage
,
1960 DWORD dwParam1
, DWORD dwParam2
)
1962 LPWAVEOPENDESC lpDesc
;
1963 printf("waveInMessage(%04X, %04X, %08lX, %08lX)\n",
1964 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
1965 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1966 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1967 return widMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1971 /**************************************************************************
1972 * MMSysTimeCallback [internal]
1974 WORD FAR PASCAL
MMSysTimeCallback(HWND hWnd
, WORD wMsg
, int nID
, DWORD dwTime
)
1976 LPTIMERENTRY lpTimer
= lpTimerList
;
1977 mmSysTimeMS
.u
.ms
+= 33;
1978 mmSysTimeSMPTE
.u
.smpte
.frame
++;
1979 while (lpTimer
!= NULL
) {
1980 lpTimer
->wCurTime
--;
1981 if (lpTimer
->wCurTime
== 0) {
1982 lpTimer
->wCurTime
= lpTimer
->wDelay
;
1983 if (lpTimer
->lpFunc
!= (FARPROC
)NULL
) {
1984 dprintf_mmtime(stddeb
,"MMSysTimeCallback // before CallBack16 !\n");
1985 CallTimeFuncProc( lpTimer
->lpFunc
,
1986 lpTimer
->wTimerID
, 0,
1987 lpTimer
->dwUser
, 0, 0 );
1988 dprintf_mmtime(stddeb
, "MMSysTimeCallback // after CallBack16 !\n");
1991 if (lpTimer
->wFlags
& TIME_ONESHOT
)
1992 timeKillEvent(lpTimer
->wTimerID
);
1994 lpTimer
= lpTimer
->Next
;
1999 /**************************************************************************
2000 * StartMMTime [internal]
2004 if (!mmTimeStarted
) {
2005 mmTimeStarted
= TRUE
;
2006 mmSysTimeMS
.wType
= TIME_MS
;
2007 mmSysTimeMS
.u
.ms
= 0;
2008 mmSysTimeSMPTE
.wType
= TIME_SMPTE
;
2009 mmSysTimeSMPTE
.u
.smpte
.hour
= 0;
2010 mmSysTimeSMPTE
.u
.smpte
.min
= 0;
2011 mmSysTimeSMPTE
.u
.smpte
.sec
= 0;
2012 mmSysTimeSMPTE
.u
.smpte
.frame
= 0;
2013 mmSysTimeSMPTE
.u
.smpte
.fps
= 0;
2014 mmSysTimeSMPTE
.u
.smpte
.dummy
= 0;
2015 SetTimer(0, 1, 33, (FARPROC
)MMSysTimeCallback
);
2019 /**************************************************************************
2020 * timeGetSystemTime [MMSYSTEM.601]
2022 WORD
timeGetSystemTime(LPMMTIME lpTime
, WORD wSize
)
2024 printf("timeGetSystemTime(%p, %u);\n", lpTime
, wSize
);
2025 if (!mmTimeStarted
) StartMMTime();
2029 /**************************************************************************
2030 * timeSetEvent [MMSYSTEM.602]
2032 WORD
timeSetEvent(WORD wDelay
, WORD wResol
,
2033 LPTIMECALLBACK lpFunc
,
2034 DWORD dwUser
, WORD wFlags
)
2037 LPTIMERENTRY lpNewTimer
;
2038 LPTIMERENTRY lpTimer
= lpTimerList
;
2039 printf("timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
2040 wDelay
, wResol
, lpFunc
, dwUser
, wFlags
);
2041 if (!mmTimeStarted
) StartMMTime();
2042 lpNewTimer
= (LPTIMERENTRY
) malloc(sizeof(TIMERENTRY
));
2043 if (lpNewTimer
== NULL
) return 0;
2044 while (lpTimer
!= NULL
) {
2045 wNewID
= max(wNewID
, lpTimer
->wTimerID
);
2046 if (lpTimer
->Next
== NULL
) break;
2047 lpTimer
= lpTimer
->Next
;
2049 if (lpTimerList
== NULL
) {
2050 lpTimerList
= lpNewTimer
;
2051 lpNewTimer
->Prev
= NULL
;
2054 lpTimer
->Next
= lpNewTimer
;
2055 lpNewTimer
->Prev
= lpTimer
;
2057 lpNewTimer
->Next
= NULL
;
2058 lpNewTimer
->wTimerID
= wNewID
+ 1;
2059 lpNewTimer
->wCurTime
= wDelay
;
2060 lpNewTimer
->wDelay
= wDelay
;
2061 lpNewTimer
->wResol
= wResol
;
2062 lpNewTimer
->lpFunc
= (FARPROC
)lpFunc
;
2063 lpNewTimer
->dwUser
= dwUser
;
2064 lpNewTimer
->wFlags
= wFlags
;
2065 return lpNewTimer
->wTimerID
;
2068 /**************************************************************************
2069 * timeKillEvent [MMSYSTEM.603]
2071 WORD
timeKillEvent(WORD wID
)
2073 LPTIMERENTRY lpTimer
= lpTimerList
;
2074 while (lpTimer
!= NULL
) {
2075 if (wID
== lpTimer
->wTimerID
) {
2076 if (lpTimer
->Prev
!= NULL
) lpTimer
->Prev
->Next
= lpTimer
->Next
;
2077 if (lpTimer
->Next
!= NULL
) lpTimer
->Next
->Prev
= lpTimer
->Prev
;
2081 lpTimer
= lpTimer
->Next
;
2086 /**************************************************************************
2087 * timeGetDevCaps [MMSYSTEM.604]
2089 WORD
timeGetDevCaps(LPTIMECAPS lpCaps
, WORD wSize
)
2091 printf("timeGetDevCaps(%p, %u) !\n", lpCaps
, wSize
);
2095 /**************************************************************************
2096 * timeBeginPeriod [MMSYSTEM.605]
2098 WORD
timeBeginPeriod(WORD wPeriod
)
2100 printf("timeBeginPeriod(%u) !\n", wPeriod
);
2101 if (!mmTimeStarted
) StartMMTime();
2105 /**************************************************************************
2106 * timeEndPeriod [MMSYSTEM.606]
2108 WORD
timeEndPeriod(WORD wPeriod
)
2110 printf("timeEndPeriod(%u) !\n", wPeriod
);
2114 /**************************************************************************
2115 * timeGetTime [MMSYSTEM.607]
2119 printf("timeGetTime(); !\n");
2120 if (!mmTimeStarted
) StartMMTime();
2125 /**************************************************************************
2126 * mmioOpen [MMSYSTEM.1210]
2128 HMMIO WINAPI
mmioOpen(LPSTR szFileName
, MMIOINFO FAR
* lpmmioinfo
, DWORD dwOpenFlags
)
2133 LPMMIOINFO lpmminfo
;
2134 printf("mmioOpen('%s', %p, %08lX);\n", szFileName
, lpmmioinfo
, dwOpenFlags
);
2135 hFile
= OpenFile(szFileName
, &ofs
, dwOpenFlags
);
2136 if (hFile
== -1) return 0;
2137 hmmio
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(MMIOINFO
));
2138 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2139 if (lpmminfo
== NULL
) return 0;
2140 memset(lpmminfo
, 0, sizeof(MMIOINFO
));
2141 lpmminfo
->hmmio
= hmmio
;
2142 lpmminfo
->dwReserved2
= MAKELONG(hFile
, 0);
2143 GlobalUnlock(hmmio
);
2144 printf("mmioOpen // return hmmio=%04X\n", hmmio
);
2145 return (HMMIO
)hmmio
;
2150 /**************************************************************************
2151 * mmioClose [MMSYSTEM.1211]
2153 UINT WINAPI
mmioClose(HMMIO hmmio
, UINT uFlags
)
2155 LPMMIOINFO lpmminfo
;
2156 printf("mmioClose(%04X, %04X);\n", hmmio
, uFlags
);
2157 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2158 if (lpmminfo
== NULL
) return 0;
2159 _lclose(LOWORD(lpmminfo
->dwReserved2
));
2160 GlobalUnlock(hmmio
);
2167 /**************************************************************************
2168 * mmioRead [MMSYSTEM.1212]
2170 LONG WINAPI
mmioRead(HMMIO hmmio
, HPSTR pch
, LONG cch
)
2173 LPMMIOINFO lpmminfo
;
2174 dprintf_mmio(stddeb
, "mmioRead(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2175 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2176 if (lpmminfo
== NULL
) return 0;
2177 count
= read(LOWORD(lpmminfo
->dwReserved2
), pch
, cch
);
2178 GlobalUnlock(hmmio
);
2179 dprintf_mmio(stddeb
, "mmioRead // count=%ld\n", count
);
2185 /**************************************************************************
2186 * mmioWrite [MMSYSTEM.1213]
2188 LONG WINAPI
mmioWrite(HMMIO hmmio
, HPCSTR pch
, LONG cch
)
2191 LPMMIOINFO lpmminfo
;
2192 printf("mmioWrite(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2193 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2194 if (lpmminfo
== NULL
) return 0;
2195 count
= _lwrite(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)pch
, cch
);
2196 GlobalUnlock(hmmio
);
2200 /**************************************************************************
2201 * mmioSeek [MMSYSTEM.1214]
2203 LONG WINAPI
mmioSeek(HMMIO hmmio
, LONG lOffset
, int iOrigin
)
2206 LPMMIOINFO lpmminfo
;
2207 printf("mmioSeek(%04X, %08lX, %d);\n", hmmio
, lOffset
, iOrigin
);
2208 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2209 if (lpmminfo
== NULL
) {
2210 printf("mmioSeek // can't lock hmmio=%04X !\n", hmmio
);
2213 count
= _llseek(LOWORD(lpmminfo
->dwReserved2
), lOffset
, iOrigin
);
2214 GlobalUnlock(hmmio
);
2218 /**************************************************************************
2219 * mmioGetInfo [MMSYSTEM.1215]
2221 UINT WINAPI
mmioGetInfo(HMMIO hmmio
, MMIOINFO FAR
* lpmmioinfo
, UINT uFlags
)
2223 LPMMIOINFO lpmminfo
;
2224 printf("mmioGetInfo\n");
2225 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2226 if (lpmminfo
== NULL
) return 0;
2227 memcpy(lpmmioinfo
, lpmminfo
, sizeof(MMIOINFO
));
2228 GlobalUnlock(hmmio
);
2232 /**************************************************************************
2233 * mmioSetInfo [MMSYSTEM.1216]
2235 UINT WINAPI
mmioSetInfo(HMMIO hmmio
, const MMIOINFO FAR
* lpmmioinfo
, UINT uFlags
)
2237 LPMMIOINFO lpmminfo
;
2238 printf("mmioSetInfo\n");
2239 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2240 if (lpmminfo
== NULL
) return 0;
2241 GlobalUnlock(hmmio
);
2245 /**************************************************************************
2246 * mmioSetBuffer [MMSYSTEM.1217]
2248 UINT WINAPI
mmioSetBuffer(HMMIO hmmio
, LPSTR pchBuffer
,
2249 LONG cchBuffer
, UINT uFlags
)
2251 printf("mmioSetBuffer // empty stub \n");
2255 /**************************************************************************
2256 * mmioFlush [MMSYSTEM.1218]
2258 UINT WINAPI
mmioFlush(HMMIO hmmio
, UINT uFlags
)
2260 LPMMIOINFO lpmminfo
;
2261 printf("mmioFlush(%04X, %04X)\n", hmmio
, uFlags
);
2262 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2263 if (lpmminfo
== NULL
) return 0;
2264 GlobalUnlock(hmmio
);
2268 /**************************************************************************
2269 * mmioAdvance [MMSYSTEM.1219]
2271 UINT WINAPI
mmioAdvance(HMMIO hmmio
, MMIOINFO FAR
* lpmmioinfo
, UINT uFlags
)
2274 LPMMIOINFO lpmminfo
;
2275 printf("mmioAdvance\n");
2276 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2277 if (lpmminfo
== NULL
) return 0;
2278 if (uFlags
== MMIO_READ
) {
2279 count
= read(LOWORD(lpmminfo
->dwReserved2
),
2280 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2282 if (uFlags
== MMIO_WRITE
) {
2283 count
= _lwrite(LOWORD(lpmminfo
->dwReserved2
),
2284 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2286 lpmmioinfo
->pchNext
+= count
;
2287 GlobalUnlock(hmmio
);
2288 lpmminfo
->lDiskOffset
= _llseek(LOWORD(lpmminfo
->dwReserved2
), 0, SEEK_CUR
);
2292 /**************************************************************************
2293 * mmioStringToFOURCC [MMSYSTEM.1220]
2295 FOURCC WINAPI
mmioStringToFOURCC(LPCSTR sz
, UINT uFlags
)
2297 printf("mmioStringToFOURCC // empty stub \n");
2301 /**************************************************************************
2302 * mmioInstallIOProc [MMSYSTEM.1221]
2304 LPMMIOPROC WINAPI
mmioInstallIOProc(FOURCC fccIOProc
,
2305 LPMMIOPROC pIOProc
, DWORD dwFlags
)
2307 printf("mmioInstallIOProc // empty stub \n");
2311 /**************************************************************************
2312 * mmioSendMessage [MMSYSTEM.1222]
2314 LRESULT WINAPI
mmioSendMessage(HMMIO hmmio
, UINT uMessage
,
2315 LPARAM lParam1
, LPARAM lParam2
)
2317 printf("mmioSendMessage // empty stub \n");
2321 /**************************************************************************
2322 * mmioDescend [MMSYSTEM.1223]
2324 UINT WINAPI
mmioDescend(HMMIO hmmio
, MMCKINFO FAR
* lpck
,
2325 const MMCKINFO FAR
* lpckParent
, UINT uFlags
)
2327 DWORD dwfcc
, dwOldPos
;
2328 LPMMIOINFO lpmminfo
;
2329 dprintf_mmio(stddeb
, "mmioDescend(%04X, %p, %p, %04X);\n",
2330 hmmio
, lpck
, lpckParent
, uFlags
);
2331 if (lpck
== NULL
) return 0;
2332 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2333 if (lpmminfo
== NULL
) return 0;
2335 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX\n", dwfcc
);
2336 dwOldPos
= _llseek(LOWORD(lpmminfo
->dwReserved2
), 0, SEEK_CUR
);
2337 dprintf_mmio(stddeb
, "mmioDescend // dwOldPos=%ld\n", dwOldPos
);
2338 if (lpckParent
!= NULL
) {
2339 dprintf_mmio(stddeb
, "mmioDescend // seek inside parent at %ld !\n", lpckParent
->dwDataOffset
);
2340 dwOldPos
= _llseek(LOWORD(lpmminfo
->dwReserved2
),
2341 lpckParent
->dwDataOffset
, SEEK_SET
);
2343 if ((uFlags
& MMIO_FINDCHUNK
) || (uFlags
& MMIO_FINDRIFF
) ||
2344 (uFlags
& MMIO_FINDLIST
)) {
2345 dprintf_mmio(stddeb
, "mmioDescend // MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc
);
2347 if (read(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)lpck
,
2348 sizeof(MMCKINFO
)) < sizeof(MMCKINFO
)) {
2349 _llseek(LOWORD(lpmminfo
->dwReserved2
), dwOldPos
, SEEK_SET
);
2350 GlobalUnlock(hmmio
);
2351 return MMIOERR_CHUNKNOTFOUND
;
2353 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX ckid=%08lX cksize=%08lX !\n",
2354 dwfcc
, lpck
->ckid
, lpck
->cksize
);
2355 if (dwfcc
== lpck
->ckid
) break;
2356 dwOldPos
+= lpck
->cksize
+ 2 * sizeof(DWORD
);
2357 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2358 dwOldPos
+= sizeof(DWORD
);
2359 _llseek(LOWORD(lpmminfo
->dwReserved2
), dwOldPos
, SEEK_SET
);
2363 if (read(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)lpck
,
2364 sizeof(MMCKINFO
)) < sizeof(MMCKINFO
)) {
2365 _llseek(LOWORD(lpmminfo
->dwReserved2
), dwOldPos
, SEEK_SET
);
2366 GlobalUnlock(hmmio
);
2367 return MMIOERR_CHUNKNOTFOUND
;
2370 lpck
->dwDataOffset
= dwOldPos
+ 2 * sizeof(DWORD
);
2371 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2372 lpck
->dwDataOffset
+= sizeof(DWORD
);
2373 lpmminfo
->lDiskOffset
= _llseek(LOWORD(lpmminfo
->dwReserved2
),
2374 lpck
->dwDataOffset
, SEEK_SET
);
2375 GlobalUnlock(hmmio
);
2376 dprintf_mmio(stddeb
, "mmioDescend // lpck->ckid=%08lX lpck->cksize=%ld !\n",
2377 lpck
->ckid
, lpck
->cksize
);
2378 printf("mmioDescend // lpck->fccType=%08lX !\n", lpck
->fccType
);
2382 /**************************************************************************
2383 * mmioAscend [MMSYSTEM.1224]
2385 UINT WINAPI
mmioAscend(HMMIO hmmio
, MMCKINFO FAR
* lpck
, UINT uFlags
)
2387 printf("mmioAscend // empty stub !\n");
2391 /**************************************************************************
2392 * mmioCreateChunk [MMSYSTEM.1225]
2394 UINT WINAPI
mmioCreateChunk(HMMIO hmmio
, MMCKINFO FAR
* lpck
, UINT uFlags
)
2396 printf("mmioCreateChunk // empty stub \n");
2401 /**************************************************************************
2402 * mmioRename [MMSYSTEM.1226]
2404 UINT WINAPI
mmioRename(LPCSTR szFileName
, LPCSTR szNewFileName
,
2405 MMIOINFO FAR
* lpmmioinfo
, DWORD dwRenameFlags
)
2407 printf("mmioRename('%s', '%s', %p, %08lX); // empty stub \n",
2408 szFileName
, szNewFileName
, lpmmioinfo
, dwRenameFlags
);
2412 /**************************************************************************
2413 * DrvOpen [MMSYSTEM.1100]
2415 HDRVR
DrvOpen(LPSTR lpDriverName
, LPSTR lpSectionName
, LPARAM lParam
)
2417 printf("DrvOpen('%s', '%s', %08lX);\n",
2418 lpDriverName
, lpSectionName
, lParam
);
2419 return OpenDriver(lpDriverName
, lpSectionName
, lParam
);
2423 /**************************************************************************
2424 * DrvClose [MMSYSTEM.1101]
2426 LRESULT
DrvClose(HDRVR hDrvr
, LPARAM lParam1
, LPARAM lParam2
)
2428 printf("DrvClose(%04X, %08lX, %08lX);\n", hDrvr
, lParam1
, lParam2
);
2429 return CloseDriver(hDrvr
, lParam1
, lParam2
);
2433 /**************************************************************************
2434 * DrvSendMessage [MMSYSTEM.1102]
2436 LRESULT WINAPI
DrvSendMessage(HDRVR hDriver
, WORD msg
, LPARAM lParam1
, LPARAM lParam2
)
2439 printf("DrvSendMessage(%04X, %04X, %08lX, %08lX);\n",
2440 hDriver
, msg
, lParam1
, lParam2
);
2442 return CDAUDIO_DriverProc(dwDevID
, hDriver
, msg
, lParam1
, lParam2
);
2446 /**************************************************************************
2447 * DrvGetModuleHandle [MMSYSTEM.1103]
2449 HANDLE
DrvGetModuleHandle(HDRVR hDrvr
)
2451 printf("DrvGetModuleHandle(%04X);\n", hDrvr
);
2456 /**************************************************************************
2457 * DrvDefDriverProc [MMSYSTEM.1104]
2459 LRESULT
DrvDefDriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
2460 DWORD dwParam1
, DWORD dwParam2
)
2462 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
2466 #endif /* #ifdef WINELIB */