4 * Copyright 1993 Martin Ayotte
14 #include <sys/ioctl.h>
24 static int InstalledCount
;
25 static int InstalledListLen
;
26 static LPSTR lpInstallNames
= NULL
;
28 static BOOL mmTimeStarted
= FALSE
;
29 static MMTIME mmSysTimeMS
;
30 static MMTIME mmSysTimeSMPTE
;
32 typedef struct tagTIMERENTRY
{
40 struct tagTIMERENTRY
*Next
;
41 struct tagTIMERENTRY
*Prev
;
43 typedef TIMERENTRY
*LPTIMERENTRY
;
45 static LPTIMERENTRY lpTimerList
= NULL
;
47 static MCI_OPEN_DRIVER_PARMS mciDrv
[MAXMCIDRIVERS
];
49 UINT
midiGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
);
50 UINT
waveGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
);
51 LONG
DrvDefDriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
52 DWORD dwParam1
, DWORD dwParam2
);
54 LONG
WAVE_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
55 DWORD dwParam1
, DWORD dwParam2
);
56 LONG
MIDI_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
57 DWORD dwParam1
, DWORD dwParam2
);
58 LONG
CDAUDIO_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
59 DWORD dwParam1
, DWORD dwParam2
);
60 LONG
ANIM_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
61 DWORD dwParam1
, DWORD dwParam2
);
63 /**************************************************************************
64 * MMSYSTEM_WEP [MMSYSTEM.1]
66 int MMSYSTEM_WEP(HANDLE hInstance
, WORD wDataSeg
,
67 WORD cbHeapSize
, LPSTR lpCmdLine
)
69 printf("MMSYSTEM DLL INIT ... hInst=%04X \n", hInstance
);
73 /**************************************************************************
74 * sndPlaySound [MMSYSTEM.2]
76 BOOL
sndPlaySound(LPCSTR lpszSoundName
, UINT uFlags
)
82 PCMWAVEFORMAT pcmWaveFormat
;
86 LPWAVEOPENDESC lpWaveDesc
;
89 LPWAVEHDR lp16WaveHdr
;
94 dprintf_mmsys(stddeb
, "sndPlaySound // SoundName='%s' uFlags=%04X !\n",
95 lpszSoundName
, uFlags
);
96 if (lpszSoundName
== NULL
) {
97 dprintf_mmsys(stddeb
, "sndPlaySound // Stop !\n");
100 hmmio
= mmioOpen((LPSTR
)lpszSoundName
, NULL
,
101 MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
103 dprintf_mmsys(stddeb
, "sndPlaySound // searching in SystemSound List !\n");
104 GetProfileString("Sounds", (LPSTR
)lpszSoundName
, "", str
, sizeof(str
));
105 if (strlen(str
) == 0) return FALSE
;
106 if ( (ptr
= (LPSTR
)strchr(str
, ',')) != NULL
) *ptr
= '\0';
107 hmmio
= mmioOpen(str
, NULL
, MMIO_ALLOCBUF
| MMIO_READ
| MMIO_DENYWRITE
);
109 dprintf_mmsys(stddeb
, "sndPlaySound // can't find SystemSound='%s' !\n", str
);
113 if (mmioDescend(hmmio
, &ckMainRIFF
, NULL
, 0) != 0) {
114 ErrSND
: if (hmmio
!= 0) mmioClose(hmmio
, 0);
117 dprintf_mmsys(stddeb
, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
118 (LPSTR
)&ckMainRIFF
.ckid
, (LPSTR
)&ckMainRIFF
.fccType
,
120 if ((ckMainRIFF
.ckid
!= FOURCC_RIFF
) ||
121 (ckMainRIFF
.fccType
!= mmioFOURCC('W', 'A', 'V', 'E'))) goto ErrSND
;
122 mmckInfo
.ckid
= mmioFOURCC('f', 'm', 't', ' ');
123 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) != 0) goto ErrSND
;
124 dprintf_mmsys(stddeb
, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
125 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
,
127 if (mmioRead(hmmio
, (HPSTR
) &pcmWaveFormat
,
128 (long) sizeof(PCMWAVEFORMAT
)) != (long) sizeof(PCMWAVEFORMAT
)) goto ErrSND
;
130 dprintf_mmsys(stddeb
, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat
.wf
.wFormatTag
);
131 dprintf_mmsys(stddeb
, "sndPlaySound // nChannels=%d \n", pcmWaveFormat
.wf
.nChannels
);
132 dprintf_mmsys(stddeb
, "sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat
.wf
.nSamplesPerSec
);
133 dprintf_mmsys(stddeb
, "sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat
.wf
.nAvgBytesPerSec
);
134 dprintf_mmsys(stddeb
, "sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat
.wf
.nBlockAlign
);
135 dprintf_mmsys(stddeb
, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat
.wBitsPerSample
);
137 mmckInfo
.ckid
= mmioFOURCC('d', 'a', 't', 'a');
138 if (mmioDescend(hmmio
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) != 0) goto ErrSND
;
139 dprintf_mmsys(stddeb
, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
140 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
,
142 hDesc
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
143 lpWaveDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hDesc
);
144 lpWaveDesc
->hWave
= 0;
145 pcmWaveFormat
.wf
.nAvgBytesPerSec
=
146 pcmWaveFormat
.wf
.nSamplesPerSec
* pcmWaveFormat
.wf
.nBlockAlign
;
147 hFormat
= USER_HEAP_ALLOC(sizeof(PCMWAVEFORMAT
));
148 lpWaveDesc
->lpFormat
= (LPWAVEFORMAT
) USER_HEAP_LIN_ADDR(hFormat
);
149 memcpy(lpWaveDesc
->lpFormat
, &pcmWaveFormat
, sizeof(PCMWAVEFORMAT
));
150 lpWaveDesc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hDesc
);
151 dwRet
= wodMessage(0, WODM_OPEN
, 0, (DWORD
)lpWaveDesc
, CALLBACK_NULL
);
152 if (dwRet
!= MMSYSERR_NOERROR
) {
153 dprintf_mmsys(stddeb
, "sndPlaySound // can't open WaveOut device !\n");
156 USER_HEAP_FREE(hFormat
);
157 hWaveHdr
= USER_HEAP_ALLOC(sizeof(WAVEHDR
));
158 lpWaveHdr
= (LPWAVEHDR
) USER_HEAP_LIN_ADDR(hWaveHdr
);
159 lp16WaveHdr
= (LPWAVEHDR
) USER_HEAP_SEG_ADDR(hWaveHdr
);
161 hData
= GlobalAlloc(GMEM_MOVEABLE
, bufsize
);
162 lpWaveHdr
->lpData
= (LPSTR
) WIN16_GlobalLock(hData
);
163 lpWaveHdr
->dwBufferLength
= bufsize
;
164 lpWaveHdr
->dwUser
= 0L;
165 lpWaveHdr
->dwFlags
= 0L;
166 lpWaveHdr
->dwLoops
= 0L;
167 dwRet
= wodMessage(0, WODM_PREPARE
, 0, (DWORD
)lp16WaveHdr
, sizeof(WAVEHDR
));
168 if (dwRet
!= MMSYSERR_NOERROR
) {
169 dprintf_mmsys(stddeb
, "sndPlaySound // can't prepare WaveOut device !\n");
172 USER_HEAP_FREE(hDesc
);
173 USER_HEAP_FREE(hWaveHdr
);
177 count
= mmioRead(hmmio
, PTR_SEG_TO_LIN(lpWaveHdr
->lpData
), bufsize
);
178 if (count
< 1) break;
179 lpWaveHdr
->dwBufferLength
= count
;
180 /* lpWaveHdr->dwBytesRecorded = count; */
181 wodMessage(0, WODM_WRITE
, 0, (DWORD
)lp16WaveHdr
, sizeof(WAVEHDR
));
183 wodMessage(0, WODM_UNPREPARE
, 0, (DWORD
)lp16WaveHdr
, sizeof(WAVEHDR
));
184 wodMessage(0, WODM_CLOSE
, 0, 0L, 0L);
187 USER_HEAP_FREE(hDesc
);
188 USER_HEAP_FREE(hWaveHdr
);
189 if (hmmio
!= 0) mmioClose(hmmio
, 0);
193 /**************************************************************************
194 * mmsystemGetVersion [MMSYSTEM.5]
196 WORD
mmsystemGetVersion()
198 dprintf_mmsys(stddeb
, "mmsystemGetVersion // 0.4.0 ...?... :-) !\n");
202 /**************************************************************************
203 * DriverProc [MMSYSTEM.6]
205 LRESULT
DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
206 DWORD dwParam1
, DWORD dwParam2
)
208 return DrvDefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
211 /**************************************************************************
212 * OutputDebugStr [MMSYSTEM.30]
214 void OutputDebugStr(LPCSTR str
)
216 fprintf(stdnimp
, "EMPTY STUB !!! OutputDebugStr('%s');\n", str
);
219 /**************************************************************************
220 * DriverCallback [MMSYSTEM.31]
222 BOOL
DriverCallback(DWORD dwCallBack
, UINT uFlags
, HANDLE hDev
,
223 WORD wMsg
, DWORD dwUser
, DWORD dwParam1
, DWORD dwParam2
)
225 dprintf_mmsys(stddeb
, "DriverCallback(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
226 dwCallBack
, uFlags
, hDev
, wMsg
, dwUser
, dwParam1
, dwParam2
);
227 switch(uFlags
& DCB_TYPEMASK
) {
229 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_NULL !\n");
232 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_WINDOW !\n");
235 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_TASK !\n");
238 dprintf_mmsys(stddeb
, "DriverCallback() // CALLBACK_FUNCTION !\n");
244 /**************************************************************************
245 * JoyGetNumDevs [MMSYSTEM.101]
249 fprintf(stdnimp
, "EMPTY STUB !!! JoyGetNumDevs();\n");
253 /**************************************************************************
254 * JoyGetDevCaps [MMSYSTEM.102]
256 WORD
JoyGetDevCaps(WORD wID
, LPJOYCAPS lpCaps
, WORD wSize
)
258 fprintf(stdnimp
, "EMPTY STUB !!! JoyGetDevCaps(%04X, %p, %d);\n",
260 return MMSYSERR_NODRIVER
;
263 /**************************************************************************
264 * JoyGetPos [MMSYSTEM.103]
266 WORD
JoyGetPos(WORD wID
, LPJOYINFO lpInfo
)
268 fprintf(stdnimp
, "EMPTY STUB !!! JoyGetPos(%04X, %p);\n", wID
, lpInfo
);
269 return MMSYSERR_NODRIVER
;
272 /**************************************************************************
273 * JoyGetThreshold [MMSYSTEM.104]
275 WORD
JoyGetThreshold(WORD wID
, LPWORD lpThreshold
)
277 fprintf(stdnimp
, "EMPTY STUB !!! JoyGetThreshold(%04X, %p);\n", wID
, lpThreshold
);
278 return MMSYSERR_NODRIVER
;
281 /**************************************************************************
282 * JoyReleaseCapture [MMSYSTEM.105]
284 WORD
JoyReleaseCapture(WORD wID
)
286 fprintf(stdnimp
, "EMPTY STUB !!! JoyReleaseCapture(%04X);\n", wID
);
287 return MMSYSERR_NODRIVER
;
290 /**************************************************************************
291 * JoySetCapture [MMSYSTEM.106]
293 WORD
JoySetCapture(HWND hWnd
, WORD wID
, WORD wPeriod
, BOOL bChanged
)
295 fprintf(stdnimp
, "EMPTY STUB !!! JoySetCapture(%04X, %04X, %d, %d);\n",
296 hWnd
, wID
, wPeriod
, bChanged
);
297 return MMSYSERR_NODRIVER
;
300 /**************************************************************************
301 * JoySetThreshold [MMSYSTEM.107]
303 WORD
JoySetThreshold(WORD wID
, WORD wThreshold
)
305 fprintf(stdnimp
, "EMPTY STUB !!! JoySetThreshold(%04X, %d);\n", wID
, wThreshold
);
306 return MMSYSERR_NODRIVER
;
309 /**************************************************************************
310 * JoySetCalibration [MMSYSTEM.109]
312 WORD
JoySetCalibration(WORD wID
)
314 fprintf(stdnimp
, "EMPTY STUB !!! JoySetCalibration(%04X);\n", wID
);
315 return MMSYSERR_NODRIVER
;
319 /**************************************************************************
320 * auxGetNumDevs [MMSYSTEM.350]
325 dprintf_mmsys(stddeb
, "auxGetNumDevs !\n");
326 count
+= auxMessage(0, AUXDM_GETNUMDEVS
, 0L, 0L, 0L);
327 dprintf_mmsys(stddeb
, "auxGetNumDevs return %u \n", count
);
331 /**************************************************************************
332 * auxGetDevCaps [MMSYSTEM.351]
334 UINT
auxGetDevCaps(UINT uDeviceID
, AUXCAPS FAR
* lpCaps
, UINT uSize
)
336 dprintf_mmsys(stddeb
, "auxGetDevCaps(%04X, %p, %d) !\n",
337 uDeviceID
, lpCaps
, uSize
);
338 return auxMessage(uDeviceID
, AUXDM_GETDEVCAPS
,
339 0L, (DWORD
)lpCaps
, (DWORD
)uSize
);
342 /**************************************************************************
343 * auxGetVolume [MMSYSTEM.352]
345 UINT
auxGetVolume(UINT uDeviceID
, DWORD FAR
* lpdwVolume
)
347 dprintf_mmsys(stddeb
, "auxGetVolume(%04X, %p) !\n", uDeviceID
, lpdwVolume
);
348 return auxMessage(uDeviceID
, AUXDM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
351 /**************************************************************************
352 * auxSetVolume [MMSYSTEM.353]
354 UINT
auxSetVolume(UINT uDeviceID
, DWORD dwVolume
)
356 dprintf_mmsys(stddeb
, "auxSetVolume(%04X, %08lX) !\n", uDeviceID
, dwVolume
);
357 return auxMessage(uDeviceID
, AUXDM_SETVOLUME
, 0L, dwVolume
, 0L);
360 /**************************************************************************
361 * auxOutMessage [MMSYSTEM.354]
363 DWORD
auxOutMessage(UINT uDeviceID
, UINT uMessage
, DWORD dw1
, DWORD dw2
)
365 dprintf_mmsys(stddeb
, "auxOutMessage(%04X, %04X, %08lX, %08lX)\n",
366 uDeviceID
, uMessage
, dw1
, dw2
);
367 return auxMessage(uDeviceID
, uMessage
, 0L, dw1
, dw2
);
370 /**************************************************************************
371 * mciGetErrorString [MMSYSTEM.706]
373 BOOL
mciGetErrorString (DWORD wError
, LPSTR lpstrBuffer
, UINT uLength
)
377 dprintf_mmsys(stddeb
, "mciGetErrorString(%08lX, %p, %d);\n", wError
, lpstrBuffer
, uLength
);
378 if ((lpstrBuffer
== NULL
) || (uLength
< 1)) return(FALSE
);
379 lpstrBuffer
[0] = '\0';
381 case MCIERR_INVALID_DEVICE_ID
:
382 msgptr
= "Invalid MCI device ID. Use the ID returned when opening the MCI device.";
384 case MCIERR_UNRECOGNIZED_KEYWORD
:
385 msgptr
= "The driver cannot recognize the specified command parameter.";
387 case MCIERR_UNRECOGNIZED_COMMAND
:
388 msgptr
= "The driver cannot recognize the specified command.";
390 case MCIERR_HARDWARE
:
391 msgptr
= "There is a problem with your media device. Make sure it is working correctly or contact the device manufacturer.";
393 case MCIERR_INVALID_DEVICE_NAME
:
394 msgptr
= "The specified device is not open or is not recognized by MCI.";
396 case MCIERR_OUT_OF_MEMORY
:
397 msgptr
= "Not enough memory available for this task. \nQuit one or more applications to increase available memory, and then try again.";
399 case MCIERR_DEVICE_OPEN
:
400 msgptr
= "The device name is already being used as an alias by this application. Use a unique alias.";
402 case MCIERR_CANNOT_LOAD_DRIVER
:
403 msgptr
= "There is an undetectable problem in loading the specified device driver.";
405 case MCIERR_MISSING_COMMAND_STRING
:
406 msgptr
= "No command was specified.";
408 case MCIERR_PARAM_OVERFLOW
:
409 msgptr
= "The output string was to large to fit in the return buffer. Increase the size of the buffer.";
411 case MCIERR_MISSING_STRING_ARGUMENT
:
412 msgptr
= "The specified command requires a character-string parameter. Please provide one.";
414 case MCIERR_BAD_INTEGER
:
415 msgptr
= "The specified integer is invalid for this command.";
417 case MCIERR_PARSER_INTERNAL
:
418 msgptr
= "The device driver returned an invalid return type. Check with the device manufacturer about obtaining a new driver.";
420 case MCIERR_DRIVER_INTERNAL
:
421 msgptr
= "There is a problem with the device driver. Check with the device manufacturer about obtaining a new driver.";
423 case MCIERR_MISSING_PARAMETER
:
424 msgptr
= "The specified command requires a parameter. Please supply one.";
426 case MCIERR_UNSUPPORTED_FUNCTION
:
427 msgptr
= "The MCI device you are using does not support the specified command.";
429 case MCIERR_FILE_NOT_FOUND
:
430 msgptr
= "Cannot find the specified file. Make sure the path and filename are correct.";
432 case MCIERR_DEVICE_NOT_READY
:
433 msgptr
= "The device driver is not ready.";
435 case MCIERR_INTERNAL
:
436 msgptr
= "A problem occurred in initializing MCI. Try restarting Windows.";
439 msgptr
= "There is a problem with the device driver. The driver has closed. Cannot access error.";
441 case MCIERR_CANNOT_USE_ALL
:
442 msgptr
= "Cannot use 'all' as the device name with the specified command.";
444 case MCIERR_MULTIPLE
:
445 msgptr
= "Errors occurred in more than one device. Specify each command and device separately to determine which devices caused the error";
447 case MCIERR_EXTENSION_NOT_FOUND
:
448 msgptr
= "Cannot determine the device type from the given filename extension.";
450 case MCIERR_OUTOFRANGE
:
451 msgptr
= "The specified parameter is out of range for the specified command.";
453 case MCIERR_FLAGS_NOT_COMPATIBLE
:
454 msgptr
= "The specified parameters cannot be used together.";
456 case MCIERR_FILE_NOT_SAVED
:
457 msgptr
= "Cannot save the specified file. Make sure you have enough disk space or are still connected to the network.";
459 case MCIERR_DEVICE_TYPE_REQUIRED
:
460 msgptr
= "Cannot find the specified device. Make sure it is installed or that the device name is spelled correctly.";
462 case MCIERR_DEVICE_LOCKED
:
463 msgptr
= "The specified device is now being closed. Wait a few seconds, and then try again.";
465 case MCIERR_DUPLICATE_ALIAS
:
466 msgptr
= "The specified alias is already being used in this application. Use a unique alias.";
468 case MCIERR_BAD_CONSTANT
:
469 msgptr
= "The specified parameter is invalid for this command.";
471 case MCIERR_MUST_USE_SHAREABLE
:
472 msgptr
= "The device driver is already in use. To share it, use the 'shareable' parameter with each 'open' command.";
474 case MCIERR_MISSING_DEVICE_NAME
:
475 msgptr
= "The specified command requires an alias, file, driver, or device name. Please supply one.";
477 case MCIERR_BAD_TIME_FORMAT
:
478 msgptr
= "The specified value for the time format is invalid. Refer to the MCI documentation for valid formats.";
480 case MCIERR_NO_CLOSING_QUOTE
:
481 msgptr
= "A closing double-quotation mark is missing from the parameter value. Please supply one.";
483 case MCIERR_DUPLICATE_FLAGS
:
484 msgptr
= "A parameter or value was specified twice. Only specify it once.";
486 case MCIERR_INVALID_FILE
:
487 msgptr
= "The specified file cannot be played on the specified MCI device. The file may be corrupt, or not in the correct format.";
489 case MCIERR_NULL_PARAMETER_BLOCK
:
490 msgptr
= "A null parameter block was passed to MCI.";
492 case MCIERR_UNNAMED_RESOURCE
:
493 msgptr
= "Cannot save an unnamed file. Supply a filename.";
495 case MCIERR_NEW_REQUIRES_ALIAS
:
496 msgptr
= "You must specify an alias when using the 'new' parameter.";
498 case MCIERR_NOTIFY_ON_AUTO_OPEN
:
499 msgptr
= "Cannot use the 'notify' flag with auto-opened devices.";
501 case MCIERR_NO_ELEMENT_ALLOWED
:
502 msgptr
= "Cannot use a filename with the specified device.";
504 case MCIERR_NONAPPLICABLE_FUNCTION
:
505 msgptr
= "Cannot carry out the commands in the order specified. Correct the command sequence, and then try again.";
507 case MCIERR_ILLEGAL_FOR_AUTO_OPEN
:
508 msgptr
= "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again.";
510 case MCIERR_FILENAME_REQUIRED
:
511 msgptr
= "The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension.";
513 case MCIERR_EXTRA_CHARACTERS
:
514 msgptr
= "Cannot specify extra characters after a string enclosed in quotation marks.";
516 case MCIERR_DEVICE_NOT_INSTALLED
:
517 msgptr
= "The specified device is not installed on the system. Use the Drivers option in Control Panel to install the device.";
520 msgptr
= "Cannot access the specified file or MCI device. Try changing directories or restarting your computer.";
523 msgptr
= "Cannot access the specified file or MCI device because the application cannot change directories.";
525 case MCIERR_SET_DRIVE
:
526 msgptr
= "Cannot access specified file or MCI device because the application cannot change drives.";
528 case MCIERR_DEVICE_LENGTH
:
529 msgptr
= "Specify a device or driver name that is less than 79 characters.";
531 case MCIERR_DEVICE_ORD_LENGTH
:
532 msgptr
= "Specify a device or driver name that is less than 69 characters.";
534 case MCIERR_NO_INTEGER
:
535 msgptr
= "The specified command requires an integer parameter. Please provide one.";
537 case MCIERR_WAVE_OUTPUTSINUSE
:
538 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.";
540 case MCIERR_WAVE_SETOUTPUTINUSE
:
541 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.";
543 case MCIERR_WAVE_INPUTSINUSE
:
544 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.";
546 case MCIERR_WAVE_SETINPUTINUSE
:
547 msgptr
= "Cannot set the current wave device for recording because it is in use. Wait until the device is free, and then try again.";
549 case MCIERR_WAVE_OUTPUTUNSPECIFIED
:
550 msgptr
= "Any compatible waveform playback device may be used.";
552 case MCIERR_WAVE_INPUTUNSPECIFIED
:
553 msgptr
= "Any compatible waveform recording device may be used.";
555 case MCIERR_WAVE_OUTPUTSUNSUITABLE
:
556 msgptr
= "No wave device that can play files in the current format is installed. Use the Drivers option to install the wave device.";
558 case MCIERR_WAVE_SETOUTPUTUNSUITABLE
:
559 msgptr
= "The device you are trying to play to cannot recognize the current file format.";
561 case MCIERR_WAVE_INPUTSUNSUITABLE
:
562 msgptr
= "No wave device that can record files in the current format is installed. Use the Drivers option to install the wave device.";
564 case MCIERR_WAVE_SETINPUTUNSUITABLE
:
565 msgptr
= "The device you are trying to record from cannot recognize the current file format.";
567 case MCIERR_NO_WINDOW
:
568 msgptr
= "There is no display window.";
570 case MCIERR_CREATEWINDOW
:
571 msgptr
= "Could not create or use window.";
573 case MCIERR_FILE_READ
:
574 msgptr
= "Cannot read the specified file. Make sure the file is still present, or check your disk or network connection.";
576 case MCIERR_FILE_WRITE
:
577 msgptr
= "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network.";
581 #define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80)
582 #define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81)
583 #define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82)
584 #define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83)
585 #define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84)
586 #define MCIERR_SEQ_TIMER (MCIERR_BASE + 85)
587 #define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86)
588 #define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87)
597 msg# 520 : digitalvideo
610 msg# 533 : milliseconds
617 msg# 540 : smpte 30 drop
623 msgptr
= "Unknown MCI Error !\n";
626 maxbuf
= min(uLength
- 1, strlen(msgptr
));
627 if (maxbuf
> 0) strncpy(lpstrBuffer
, msgptr
, maxbuf
);
628 lpstrBuffer
[maxbuf
+ 1] = '\0';
633 /**************************************************************************
634 * mciDriverNotify [MMSYSTEM.711]
636 BOOL
mciDriverNotify(HWND hWndCallBack
, UINT wDevID
, UINT wStatus
)
638 dprintf_mmsys(stddeb
, "mciDriverNotify(%04X, %u, %04X)\n", hWndCallBack
, wDevID
, wStatus
);
639 if (!IsWindow(hWndCallBack
)) return FALSE
;
640 dprintf_mmsys(stddeb
, "mciDriverNotify // before PostMessage\n");
641 PostMessage(hWndCallBack
, MM_MCINOTIFY
, wStatus
,
642 MAKELONG(mciDrv
[wDevID
].wDeviceID
, 0));
646 /**************************************************************************
649 DWORD
mciOpen(DWORD dwParam
, LPMCI_OPEN_PARMS lp16Parms
)
652 LPMCI_OPEN_PARMS lpParms
;
655 lpParms
= PTR_SEG_TO_LIN(lp16Parms
);
656 dprintf_mmsys(stddeb
, "mciOpen(%08lX, %p (%p))\n", dwParam
, lp16Parms
, lpParms
);
657 if (lp16Parms
== NULL
) return MCIERR_INTERNAL
;
658 while(mciDrv
[wDevID
].wType
!= 0) {
659 if (++wDevID
>= MAXMCIDRIVERS
) {
660 dprintf_mmsys(stddeb
, "MCI_OPEN // MAXMCIDRIVERS reached !\n");
661 return MCIERR_INTERNAL
;
664 dprintf_mmsys(stddeb
, "mciOpen // wDevID=%d \n", wDevID
);
665 if (dwParam
& MCI_OPEN_ALIAS
) {
666 dprintf_mmsys(stddeb
, "MCI_OPEN // Alias='%s' !\n",
667 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrAlias
));
668 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
670 if (dwParam
& MCI_OPEN_TYPE
) {
671 if (dwParam
& MCI_OPEN_TYPE_ID
) {
672 dprintf_mmsys(stddeb
, "MCI_OPEN // Dev=%p !\n", lpParms
->lpstrDeviceType
);
673 uDevTyp
= LOWORD((DWORD
)lpParms
->lpstrDeviceType
);
676 if (lpParms
->lpstrDeviceType
== NULL
) return MCIERR_INTERNAL
;
677 dprintf_mmsys(stddeb
, "MCI_OPEN // Dev='%s' !\n",
678 (char*)PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
679 strcpy(str
, PTR_SEG_TO_LIN(lpParms
->lpstrDeviceType
));
681 if (strcmp(str
, "CDAUDIO") == 0) {
682 uDevTyp
= MCI_DEVTYPE_CD_AUDIO
;
685 if (strcmp(str
, "WAVEAUDIO") == 0) {
686 uDevTyp
= MCI_DEVTYPE_WAVEFORM_AUDIO
;
689 if (strcmp(str
, "SEQUENCER") == 0) {
690 uDevTyp
= MCI_DEVTYPE_SEQUENCER
;
693 if (strcmp(str
, "ANIMATION1") == 0) {
694 uDevTyp
= MCI_DEVTYPE_ANIMATION
;
697 if (strcmp(str
, "AVIVIDEO") == 0) {
698 uDevTyp
= MCI_DEVTYPE_DIGITAL_VIDEO
;
702 mciDrv
[wDevID
].wType
= uDevTyp
;
703 mciDrv
[wDevID
].wDeviceID
= wDevID
;
704 lpParms
->wDeviceID
= wDevID
;
705 dprintf_mmsys(stddeb
, "MCI_OPEN // mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
706 wDevID
, uDevTyp
, lpParms
->wDeviceID
);
708 case MCI_DEVTYPE_CD_AUDIO
:
710 WINELIB_UNIMP ("CDAUDIO_DriverProc");
712 return CDAUDIO_DriverProc(0, 0, MCI_OPEN_DRIVER
,
713 dwParam
, (DWORD
)lp16Parms
);
715 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
716 return WAVE_DriverProc(0, 0, MCI_OPEN_DRIVER
,
717 dwParam
, (DWORD
)lp16Parms
);
718 case MCI_DEVTYPE_SEQUENCER
:
719 return MIDI_DriverProc(0, 0, MCI_OPEN_DRIVER
,
720 dwParam
, (DWORD
)lp16Parms
);
721 case MCI_DEVTYPE_ANIMATION
:
722 return ANIM_DriverProc(0, 0, MCI_OPEN_DRIVER
,
723 dwParam
, (DWORD
)lp16Parms
);
724 case MCI_DEVTYPE_DIGITAL_VIDEO
:
725 dprintf_mmsys(stddeb
, "MCI_OPEN // No DIGITAL_VIDEO yet !\n");
726 return MCIERR_DEVICE_NOT_INSTALLED
;
728 dprintf_mmsys(stddeb
, "MCI_OPEN // Invalid Device Name '%p' !\n", lpParms
->lpstrDeviceType
);
729 return MCIERR_INVALID_DEVICE_NAME
;
731 return MCIERR_INTERNAL
;
735 /**************************************************************************
736 * mciClose [internal]
738 DWORD
mciClose(UINT wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
740 DWORD dwRet
= MCIERR_INTERNAL
;
741 dprintf_mmsys(stddeb
, "mciClose(%u, %08lX, %p)\n", wDevID
, dwParam
, lpParms
);
742 switch(mciDrv
[wDevID
].wType
) {
743 case MCI_DEVTYPE_CD_AUDIO
:
745 dwRet
= CDAUDIO_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
746 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
749 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
750 dwRet
= WAVE_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
751 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
753 case MCI_DEVTYPE_SEQUENCER
:
754 dwRet
= MIDI_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
755 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
757 case MCI_DEVTYPE_ANIMATION
:
758 dwRet
= ANIM_DriverProc(mciDrv
[wDevID
].wDeviceID
, 0,
759 MCI_CLOSE
, dwParam
, (DWORD
)lpParms
);
762 dprintf_mmsys(stddeb
, "mciClose() // unknown device type=%04X !\n", mciDrv
[wDevID
].wType
);
764 mciDrv
[wDevID
].wType
= 0;
769 /**************************************************************************
770 * mciSound [internal]
772 DWORD
mciSysInfo(DWORD dwFlags
, LPMCI_SYSINFO_PARMS lpParms
)
778 LPSTR SysFile
= "SYSTEM.INI";
779 dprintf_mci(stddeb
, "mciSysInfo(%08lX, %08lX)\n", dwFlags
, (DWORD
)lpParms
);
780 lpstrReturn
= PTR_SEG_TO_LIN(lpParms
->lpstrReturn
);
782 case MCI_SYSINFO_QUANTITY
:
783 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_QUANTITY \n");
784 lpdwRet
= (DWORD
*)lpstrReturn
;
785 *(lpdwRet
) = InstalledCount
;
787 case MCI_SYSINFO_INSTALLNAME
:
788 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_INSTALLNAME \n");
789 if (lpInstallNames
== NULL
) {
791 InstalledListLen
= 0;
792 ptr
= lpInstallNames
= malloc(2048);
793 GetPrivateProfileString("mci", NULL
, "", lpInstallNames
, 2000, SysFile
);
794 while(strlen(ptr
) > 0) {
795 dprintf_mci(stddeb
, "---> '%s' \n", ptr
);
796 len
= strlen(ptr
) + 1;
798 InstalledListLen
+= len
;
802 if (lpParms
->dwRetSize
< InstalledListLen
) {
803 strncpy(lpstrReturn
, lpInstallNames
, lpParms
->dwRetSize
- 2);
804 lpstrReturn
[lpParms
->dwRetSize
- 1] = '\0';
807 strcpy(lpstrReturn
, lpInstallNames
);
809 case MCI_SYSINFO_NAME
:
810 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_NAME \n");
812 case MCI_SYSINFO_OPEN
:
813 dprintf_mci(stddeb
, "mciSysInfo // MCI_SYSINFO_OPEN \n");
816 return MMSYSERR_INVALPARAM
;
819 /**************************************************************************
820 * mciSound [internal]
822 DWORD
mciSound(UINT wDevID
, DWORD dwParam
, LPMCI_SOUND_PARMS lpParms
)
824 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
825 if (dwParam
& MCI_SOUND_NAME
)
826 dprintf_mci(stddeb
, "MCI_SOUND // file='%s' !\n", lpParms
->lpstrSoundName
);
827 return MCIERR_INVALID_DEVICE_ID
;
832 /**************************************************************************
833 * mciSendCommand [MMSYSTEM.701]
835 DWORD
mciSendCommand(UINT wDevID
, UINT wMsg
, DWORD dwParam1
, DWORD dwParam2
)
838 dprintf_mci(stddeb
, "mciSendCommand(%04X, %04X, %08lX, %08lX)\n",
839 wDevID
, wMsg
, dwParam1
, dwParam2
);
842 return mciOpen(dwParam1
, (LPMCI_OPEN_PARMS
)dwParam2
);
844 return mciClose(wDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
846 return mciSysInfo(dwParam1
, (LPMCI_SYSINFO_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
848 switch(mciDrv
[wDevID
].wType
) {
849 case MCI_DEVTYPE_CD_AUDIO
:
851 return CDAUDIO_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
852 wMsg
, dwParam1
, dwParam2
);
855 case MCI_DEVTYPE_WAVEFORM_AUDIO
:
856 return WAVE_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
857 wMsg
, dwParam1
, dwParam2
);
858 case MCI_DEVTYPE_SEQUENCER
:
859 return MIDI_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
860 wMsg
, dwParam1
, dwParam2
);
861 case MCI_DEVTYPE_ANIMATION
:
862 return ANIM_DriverProc(mciDrv
[wDevID
].wDeviceID
, hDrv
,
863 wMsg
, dwParam1
, dwParam2
);
865 dprintf_mci(stddeb
, "mciSendCommand() // unknown device type=%04X !\n",
866 mciDrv
[wDevID
].wType
);
869 return MMSYSERR_INVALPARAM
;
872 /**************************************************************************
873 * mciGetDeviceID [MMSYSTEM.703]
875 UINT
mciGetDeviceID (LPCSTR lpstrName
)
878 dprintf_mci(stddeb
, "mciGetDeviceID(%s)\n", lpstrName
);
879 if (lpstrName
!= NULL
) {
880 strcpy(str
, lpstrName
);
882 if (strcmp(str
, "ALL") == 0) return MCI_ALL_DEVICE_ID
;
887 /**************************************************************************
888 * mciSendString [MMSYSTEM.702]
890 DWORD
mciSendString (LPCSTR lpstrCommand
,
891 LPSTR lpstrReturnString
, UINT uReturnLength
, HWND hwndCallback
)
893 dprintf_mci(stddeb
, "mciSendString('%s', %p, %u, %X)\n",
894 lpstrCommand
, lpstrReturnString
,
895 uReturnLength
, hwndCallback
);
896 return MCIERR_MISSING_COMMAND_STRING
;
899 /**************************************************************************
900 * mciSetYieldProc [MMSYSTEM.714]
902 BOOL
mciSetYieldProc (UINT uDeviceID
,
903 YIELDPROC fpYieldProc
, DWORD dwYieldData
)
908 /**************************************************************************
909 * mciGetDeviceIDFromElementID [MMSYSTEM.715]
911 UINT
mciGetDeviceIDFromElementID(DWORD dwElementID
, LPCSTR lpstrType
)
916 /**************************************************************************
917 * mciGetYieldProc [MMSYSTEM.716]
919 YIELDPROC
mciGetYieldProc(UINT uDeviceID
, DWORD FAR
* lpdwYieldData
)
924 /**************************************************************************
925 * mciGetCreatorTask [MMSYSTEM.717]
927 HTASK
mciGetCreatorTask(UINT uDeviceID
)
932 /**************************************************************************
933 * midiOutGetNumDevs [MMSYSTEM.201]
935 UINT
midiOutGetNumDevs(void)
938 dprintf_mmsys(stddeb
, "midiOutGetNumDevs\n");
939 count
+= modMessage(0, MODM_GETNUMDEVS
, 0L, 0L, 0L);
940 dprintf_mmsys(stddeb
, "midiOutGetNumDevs return %u \n", count
);
944 /**************************************************************************
945 * midiOutGetDevCaps [MMSYSTEM.202]
947 UINT
midiOutGetDevCaps(UINT uDeviceID
, MIDIOUTCAPS FAR
* lpCaps
, UINT uSize
)
949 dprintf_mmsys(stddeb
, "midiOutGetDevCaps\n");
953 /**************************************************************************
954 * midiOutGetErrorText [MMSYSTEM.203]
956 UINT
midiOutGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
958 dprintf_mmsys(stddeb
, "midiOutGetErrorText\n");
959 return midiGetErrorText(uError
, lpText
, uSize
);
963 /**************************************************************************
964 * midiGetErrorText [internal]
966 UINT
midiGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
970 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
973 case MIDIERR_UNPREPARED
:
974 msgptr
= "The MIDI header was not prepared. Use the Prepare function to prepare the header, and then try again.";
976 case MIDIERR_STILLPLAYING
:
977 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
980 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.";
982 case MIDIERR_NOTREADY
:
983 msgptr
= "The port is transmitting data to the device. Wait until the data has been transmitted, and then try again.";
985 case MIDIERR_NODEVICE
:
986 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.";
988 case MIDIERR_INVALIDSETUP
:
989 msgptr
= "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the Windows SYSTEM directory, and then try again.";
992 msg# 336 : Cannot use the song-pointer time format and the SMPTE time-format together.
993 msg# 337 : The specified MIDI device is already in use. Wait until it is free, and then try again.
994 msg# 338 : The specified MIDI device is not installed on the system. Use the Drivers option in Control Panel to install the driver.
995 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.
996 msg# 340 : An error occurred using the specified port.
997 msg# 341 : All multimedia timers are being used by other applications. Quit one of these applications, and then try again.
998 msg# 342 : There is no current MIDI port.
999 msg# 343 : There are no MIDI devices installed on the system. Use the Drivers option in Control Panel to install the driver.
1002 msgptr
= "Unknown MIDI Error !\n";
1005 maxbuf
= min(uSize
- 1, strlen(msgptr
));
1006 if (maxbuf
> 0) strncpy(lpText
, msgptr
, maxbuf
);
1007 lpText
[maxbuf
+ 1] = '\0';
1011 /**************************************************************************
1012 * midiOutOpen [MMSYSTEM.204]
1014 UINT
midiOutOpen(HMIDIOUT FAR
* lphMidiOut
, UINT uDeviceID
,
1015 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1018 LPMIDIOPENDESC lpDesc
;
1019 LPMIDIOPENDESC lp16Desc
;
1021 BOOL bMapperFlg
= FALSE
;
1022 if (lphMidiOut
!= NULL
) *lphMidiOut
= 0;
1023 dprintf_mmsys(stddeb
, "midiOutOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1024 lphMidiOut
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1025 if (uDeviceID
== (UINT
)MIDI_MAPPER
) {
1026 dprintf_mmsys(stddeb
, "midiOutOpen // MIDI_MAPPER mode requested !\n");
1030 hMidiOut
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1031 if (lphMidiOut
!= NULL
) *lphMidiOut
= hMidiOut
;
1032 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiOut
);
1033 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1034 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1035 lpDesc
->hMidi
= hMidiOut
;
1036 lpDesc
->dwCallback
= dwCallback
;
1037 lpDesc
->dwInstance
= dwInstance
;
1038 while(uDeviceID
< MAXMIDIDRIVERS
) {
1039 dwRet
= modMessage(uDeviceID
, MODM_OPEN
,
1040 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1041 if (dwRet
== MMSYSERR_NOERROR
) break;
1042 if (!bMapperFlg
) break;
1044 dprintf_mmsys(stddeb
, "midiOutOpen // MIDI_MAPPER mode ! try next driver...\n");
1049 /**************************************************************************
1050 * midiOutClose [MMSYSTEM.205]
1052 UINT
midiOutClose(HMIDIOUT hMidiOut
)
1054 LPMIDIOPENDESC lpDesc
;
1055 dprintf_mmsys(stddeb
, "midiOutClose(%04X)\n", hMidiOut
);
1056 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1057 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1058 return modMessage(0, MODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1061 /**************************************************************************
1062 * midiOutPrepareHeader [MMSYSTEM.206]
1064 UINT
midiOutPrepareHeader(HMIDIOUT hMidiOut
,
1065 MIDIHDR FAR
* lpMidiOutHdr
, UINT uSize
)
1067 LPMIDIOPENDESC lpDesc
;
1068 dprintf_mmsys(stddeb
, "midiOutPrepareHeader(%04X, %p, %d)\n",
1069 hMidiOut
, lpMidiOutHdr
, uSize
);
1070 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1071 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1072 return modMessage(0, MODM_PREPARE
, lpDesc
->dwInstance
,
1073 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1076 /**************************************************************************
1077 * midiOutUnprepareHeader [MMSYSTEM.207]
1079 UINT
midiOutUnprepareHeader(HMIDIOUT hMidiOut
,
1080 MIDIHDR FAR
* lpMidiOutHdr
, UINT uSize
)
1082 LPMIDIOPENDESC lpDesc
;
1083 dprintf_mmsys(stddeb
, "midiOutUnprepareHeader(%04X, %p, %d)\n",
1084 hMidiOut
, lpMidiOutHdr
, uSize
);
1085 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1086 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1087 return modMessage(0, MODM_UNPREPARE
, lpDesc
->dwInstance
,
1088 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1091 /**************************************************************************
1092 * midiOutShortMsg [MMSYSTEM.208]
1094 UINT
midiOutShortMsg(HMIDIOUT hMidiOut
, DWORD dwMsg
)
1096 LPMIDIOPENDESC lpDesc
;
1097 dprintf_mmsys(stddeb
, "midiOutShortMsg(%04X, %08lX)\n", hMidiOut
, dwMsg
);
1098 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1099 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1100 return modMessage(0, MODM_DATA
, lpDesc
->dwInstance
, dwMsg
, 0L);
1103 /**************************************************************************
1104 * midiOutLongMsg [MMSYSTEM.209]
1106 UINT
midiOutLongMsg(HMIDIOUT hMidiOut
,
1107 MIDIHDR FAR
* lpMidiOutHdr
, UINT uSize
)
1109 LPMIDIOPENDESC lpDesc
;
1110 dprintf_mmsys(stddeb
, "midiOutLongMsg(%04X, %p, %d)\n",
1111 hMidiOut
, lpMidiOutHdr
, uSize
);
1112 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1113 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1114 return modMessage(0, MODM_LONGDATA
, lpDesc
->dwInstance
,
1115 (DWORD
)lpMidiOutHdr
, (DWORD
)uSize
);
1118 /**************************************************************************
1119 * midiOutReset [MMSYSTEM.210]
1121 UINT
midiOutReset(HMIDIOUT hMidiOut
)
1123 LPMIDIOPENDESC lpDesc
;
1124 dprintf_mmsys(stddeb
, "midiOutReset(%04X)\n", hMidiOut
);
1125 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1126 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1127 return modMessage(0, MODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1130 /**************************************************************************
1131 * midiOutGetVolume [MMSYSTEM.211]
1133 UINT
midiOutGetVolume(UINT uDeviceID
, DWORD FAR
* lpdwVolume
)
1135 dprintf_mmsys(stddeb
, "midiOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1136 return modMessage(uDeviceID
, MODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1140 /**************************************************************************
1141 * midiOutSetVolume [MMSYSTEM.212]
1143 UINT
midiOutSetVolume(UINT uDeviceID
, DWORD dwVolume
)
1145 dprintf_mmsys(stddeb
, "midiOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1146 return modMessage(uDeviceID
, MODM_SETVOLUME
, 0L, dwVolume
, 0L);
1150 /**************************************************************************
1151 * midiOutCachePatches [MMSYSTEM.213]
1153 UINT
midiOutCachePatches(HMIDIOUT hMidiOut
,
1154 UINT uBank
, WORD FAR
* lpwPatchArray
, UINT uFlags
)
1156 dprintf_mmsys(stddeb
, "midiOutCachePatches\n");
1160 /**************************************************************************
1161 * midiOutCacheDrumPatches [MMSYSTEM.214]
1163 UINT
midiOutCacheDrumPatches(HMIDIOUT hMidiOut
,
1164 UINT uPatch
, WORD FAR
* lpwKeyArray
, UINT uFlags
)
1166 dprintf_mmsys(stddeb
, "midiOutCacheDrumPatches\n");
1170 /**************************************************************************
1171 * midiOutGetID [MMSYSTEM.215]
1173 UINT
midiOutGetID(HMIDIOUT hMidiOut
, UINT FAR
* lpuDeviceID
)
1175 dprintf_mmsys(stddeb
, "midiOutGetID\n");
1179 /**************************************************************************
1180 * midiOutMessage [MMSYSTEM.216]
1182 DWORD
midiOutMessage(HMIDIOUT hMidiOut
, UINT uMessage
,
1183 DWORD dwParam1
, DWORD dwParam2
)
1185 LPMIDIOPENDESC lpDesc
;
1186 dprintf_mmsys(stddeb
, "midiOutMessage(%04X, %04X, %08lX, %08lX)\n",
1187 hMidiOut
, uMessage
, dwParam1
, dwParam2
);
1188 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiOut
);
1189 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1190 return modMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1194 /**************************************************************************
1195 * midiInGetNumDevs [MMSYSTEM.301]
1197 UINT
midiInGetNumDevs(void)
1200 dprintf_mmsys(stddeb
, "midiInGetNumDevs\n");
1201 count
+= midMessage(0, MIDM_GETNUMDEVS
, 0L, 0L, 0L);
1202 dprintf_mmsys(stddeb
, "midiInGetNumDevs return %u \n", count
);
1206 /**************************************************************************
1207 * midiInGetDevCaps [MMSYSTEM.302]
1209 UINT
midiInGetDevCaps(UINT uDeviceID
,
1210 LPMIDIINCAPS lpCaps
, UINT uSize
)
1212 dprintf_mmsys(stddeb
, "midiInGetDevCaps\n");
1216 /**************************************************************************
1217 * midiInGetErrorText [MMSYSTEM.303]
1219 UINT
midiInGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1221 dprintf_mmsys(stddeb
, "midiInGetErrorText\n");
1222 return (midiGetErrorText(uError
, lpText
, uSize
));
1225 /**************************************************************************
1226 * midiInOpen [MMSYSTEM.304]
1228 UINT
midiInOpen(HMIDIIN FAR
* lphMidiIn
, UINT uDeviceID
,
1229 DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1232 LPMIDIOPENDESC lpDesc
;
1233 LPMIDIOPENDESC lp16Desc
;
1235 BOOL bMapperFlg
= FALSE
;
1236 if (lphMidiIn
!= NULL
) *lphMidiIn
= 0;
1237 dprintf_mmsys(stddeb
, "midiInOpen(%p, %d, %08lX, %08lX, %08lX);\n",
1238 lphMidiIn
, uDeviceID
, dwCallback
, dwInstance
, dwFlags
);
1239 if (uDeviceID
== (UINT
)MIDI_MAPPER
) {
1240 dprintf_mmsys(stddeb
, "midiInOpen // MIDI_MAPPER mode requested !\n");
1244 hMidiIn
= USER_HEAP_ALLOC(sizeof(MIDIOPENDESC
));
1245 if (lphMidiIn
!= NULL
) *lphMidiIn
= hMidiIn
;
1246 lp16Desc
= (LPMIDIOPENDESC
) USER_HEAP_SEG_ADDR(hMidiIn
);
1247 lpDesc
= (LPMIDIOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1248 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1249 lpDesc
->hMidi
= hMidiIn
;
1250 lpDesc
->dwCallback
= dwCallback
;
1251 lpDesc
->dwInstance
= dwInstance
;
1252 while(uDeviceID
< MAXMIDIDRIVERS
) {
1253 dwRet
= midMessage(uDeviceID
, MIDM_OPEN
,
1254 lpDesc
->dwInstance
, (DWORD
)lpDesc
, 0L);
1255 if (dwRet
== MMSYSERR_NOERROR
) break;
1256 if (!bMapperFlg
) break;
1258 dprintf_mmsys(stddeb
, "midiInOpen // MIDI_MAPPER mode ! try next driver...\n");
1263 /**************************************************************************
1264 * midiInClose [MMSYSTEM.305]
1266 UINT
midiInClose(HMIDIIN hMidiIn
)
1268 LPMIDIOPENDESC lpDesc
;
1269 dprintf_mmsys(stddeb
, "midiInClose(%04X)\n", hMidiIn
);
1270 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1271 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1272 return midMessage(0, MIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1275 /**************************************************************************
1276 * midiInPrepareHeader [MMSYSTEM.306]
1278 UINT
midiInPrepareHeader(HMIDIIN hMidiIn
,
1279 MIDIHDR FAR
* lpMidiInHdr
, UINT uSize
)
1281 LPMIDIOPENDESC lpDesc
;
1282 dprintf_mmsys(stddeb
, "midiInPrepareHeader(%04X, %p, %d)\n",
1283 hMidiIn
, lpMidiInHdr
, uSize
);
1284 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1285 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1286 return midMessage(0, MIDM_PREPARE
, lpDesc
->dwInstance
,
1287 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1290 /**************************************************************************
1291 * midiInUnprepareHeader [MMSYSTEM.307]
1293 UINT
midiInUnprepareHeader(HMIDIIN hMidiIn
,
1294 MIDIHDR FAR
* lpMidiInHdr
, UINT uSize
)
1296 LPMIDIOPENDESC lpDesc
;
1297 dprintf_mmsys(stddeb
, "midiInUnprepareHeader(%04X, %p, %d)\n",
1298 hMidiIn
, lpMidiInHdr
, uSize
);
1299 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1300 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1301 return midMessage(0, MIDM_UNPREPARE
, lpDesc
->dwInstance
,
1302 (DWORD
)lpMidiInHdr
, (DWORD
)uSize
);
1305 /**************************************************************************
1306 * midiInAddBuffer [MMSYSTEM.308]
1308 UINT
midiInAddBuffer(HMIDIIN hMidiIn
,
1309 MIDIHDR FAR
* lpMidiInHdr
, UINT uSize
)
1311 dprintf_mmsys(stddeb
, "midiInAddBuffer\n");
1315 /**************************************************************************
1316 * midiInStart [MMSYSTEM.309]
1318 UINT
midiInStart(HMIDIIN hMidiIn
)
1320 dprintf_mmsys(stddeb
, "midiInStart\n");
1324 /**************************************************************************
1325 * midiInStop [MMSYSTEM.310]
1327 UINT
midiInStop(HMIDIIN hMidiIn
)
1329 dprintf_mmsys(stddeb
, "midiInStop\n");
1333 /**************************************************************************
1334 * midiInReset [MMSYSTEM.311]
1336 UINT
midiInReset(HMIDIIN hMidiIn
)
1338 dprintf_mmsys(stddeb
, "midiInReset\n");
1342 /**************************************************************************
1343 * midiInGetID [MMSYSTEM.312]
1345 UINT
midiInGetID(HMIDIIN hMidiIn
, UINT FAR
* lpuDeviceID
)
1347 dprintf_mmsys(stddeb
, "midiInGetID\n");
1351 /**************************************************************************
1352 * midiInMessage [MMSYSTEM.313]
1354 DWORD
midiInMessage(HMIDIIN hMidiIn
, UINT uMessage
,
1355 DWORD dwParam1
, DWORD dwParam2
)
1357 LPMIDIOPENDESC lpDesc
;
1358 dprintf_mmsys(stddeb
, "midiInMessage(%04X, %04X, %08lX, %08lX)\n",
1359 hMidiIn
, uMessage
, dwParam1
, dwParam2
);
1360 lpDesc
= (LPMIDIOPENDESC
) USER_HEAP_LIN_ADDR(hMidiIn
);
1361 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1362 return midMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1366 /**************************************************************************
1367 * waveOutGetNumDevs [MMSYSTEM.401]
1369 UINT
waveOutGetNumDevs()
1372 dprintf_mmsys(stddeb
, "waveOutGetNumDevs\n");
1373 count
+= wodMessage(0, WODM_GETNUMDEVS
, 0L, 0L, 0L);
1374 dprintf_mmsys(stddeb
, "waveOutGetNumDevs return %u \n", count
);
1378 /**************************************************************************
1379 * waveOutGetDevCaps [MMSYSTEM.402]
1381 UINT
waveOutGetDevCaps(UINT uDeviceID
, WAVEOUTCAPS FAR
* lpCaps
, UINT uSize
)
1383 dprintf_mmsys(stddeb
, "waveOutGetDevCaps\n");
1384 return wodMessage(uDeviceID
, WODM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1387 /**************************************************************************
1388 * waveOutGetErrorText [MMSYSTEM.403]
1390 UINT
waveOutGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1392 dprintf_mmsys(stddeb
, "waveOutGetErrorText\n");
1393 return(waveGetErrorText(uError
, lpText
, uSize
));
1397 /**************************************************************************
1398 * waveGetErrorText [internal]
1400 UINT
waveGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1404 dprintf_mmsys(stddeb
, "waveGetErrorText(%04X, %p, %d);\n", uError
, lpText
, uSize
);
1405 if ((lpText
== NULL
) || (uSize
< 1)) return(FALSE
);
1408 case MMSYSERR_NOERROR
:
1409 msgptr
= "The specified command was carried out.";
1411 case MMSYSERR_ERROR
:
1412 msgptr
= "Undefined external error.";
1414 case MMSYSERR_BADDEVICEID
:
1415 msgptr
= "A device ID has been used that is out of range for your system.";
1417 case MMSYSERR_NOTENABLED
:
1418 msgptr
= "The driver was not enabled.";
1420 case MMSYSERR_ALLOCATED
:
1421 msgptr
= "The specified device is already in use. Wait until it is free, and then try again.";
1423 case MMSYSERR_INVALHANDLE
:
1424 msgptr
= "The specified device handle is invalid.";
1426 case MMSYSERR_NODRIVER
:
1427 msgptr
= "There is no driver installed on your system !\n";
1429 case MMSYSERR_NOMEM
:
1430 msgptr
= "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
1432 case MMSYSERR_NOTSUPPORTED
:
1433 msgptr
= "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
1435 case MMSYSERR_BADERRNUM
:
1436 msgptr
= "An error number was specified that is not defined in the system.";
1438 case MMSYSERR_INVALFLAG
:
1439 msgptr
= "An invalid flag was passed to a system function.";
1441 case MMSYSERR_INVALPARAM
:
1442 msgptr
= "An invalid parameter was passed to a system function.";
1444 case WAVERR_BADFORMAT
:
1445 msgptr
= "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
1447 case WAVERR_STILLPLAYING
:
1448 msgptr
= "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
1450 case WAVERR_UNPREPARED
:
1451 msgptr
= "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
1454 msgptr
= "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
1457 msgptr
= "Unknown MMSYSTEM Error !\n";
1460 maxbuf
= min(uSize
- 1, strlen(msgptr
));
1461 if (maxbuf
> 0) strncpy(lpText
, msgptr
, maxbuf
);
1462 lpText
[maxbuf
+ 1] = '\0';
1466 /**************************************************************************
1467 * waveOutOpen [MMSYSTEM.404]
1469 UINT
waveOutOpen(HWAVEOUT FAR
* lphWaveOut
, UINT uDeviceID
,
1470 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1473 LPWAVEOPENDESC lpDesc
;
1474 LPWAVEOPENDESC lp16Desc
;
1476 BOOL bMapperFlg
= FALSE
;
1477 dprintf_mmsys(stddeb
, "waveOutOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1478 lphWaveOut
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1479 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1480 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_FORMAT_QUERY requested !\n");
1482 if (uDeviceID
== (UINT
)WAVE_MAPPER
) {
1483 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_MAPPER mode requested !\n");
1487 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1488 hWaveOut
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1489 if (lphWaveOut
!= NULL
) *lphWaveOut
= hWaveOut
;
1490 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveOut
);
1491 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1492 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1493 lpDesc
->hWave
= hWaveOut
;
1494 lpDesc
->lpFormat
= lpFormat
;
1495 lpDesc
->dwCallBack
= dwCallback
;
1496 lpDesc
->dwInstance
= dwInstance
;
1497 while(uDeviceID
< MAXWAVEDRIVERS
) {
1498 dwRet
= wodMessage(uDeviceID
, WODM_OPEN
,
1499 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1500 if (dwRet
== MMSYSERR_NOERROR
) break;
1501 if (!bMapperFlg
) break;
1503 dprintf_mmsys(stddeb
, "waveOutOpen // WAVE_MAPPER mode ! try next driver...\n");
1505 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1506 dprintf_mmsys(stddeb
, "waveOutOpen // End of WAVE_FORMAT_QUERY !\n");
1507 waveOutClose(hWaveOut
);
1512 /**************************************************************************
1513 * waveOutClose [MMSYSTEM.405]
1515 UINT
waveOutClose(HWAVEOUT hWaveOut
)
1517 LPWAVEOPENDESC lpDesc
;
1518 dprintf_mmsys(stddeb
, "waveOutClose(%04X)\n", hWaveOut
);
1519 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1520 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1521 return wodMessage(0, WODM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1524 /**************************************************************************
1525 * waveOutPrepareHeader [MMSYSTEM.406]
1527 UINT
waveOutPrepareHeader(HWAVEOUT hWaveOut
,
1528 WAVEHDR FAR
* lpWaveOutHdr
, UINT uSize
)
1530 LPWAVEOPENDESC lpDesc
;
1531 dprintf_mmsys(stddeb
, "waveOutPrepareHeader(%04X, %p, %u);\n",
1532 hWaveOut
, lpWaveOutHdr
, uSize
);
1533 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1534 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1535 return wodMessage(0, WODM_PREPARE
, lpDesc
->dwInstance
,
1536 (DWORD
)lpWaveOutHdr
, uSize
);
1539 /**************************************************************************
1540 * waveOutUnprepareHeader [MMSYSTEM.407]
1542 UINT
waveOutUnprepareHeader(HWAVEOUT hWaveOut
,
1543 WAVEHDR FAR
* lpWaveOutHdr
, UINT uSize
)
1545 LPWAVEOPENDESC lpDesc
;
1546 dprintf_mmsys(stddeb
, "waveOutUnprepareHeader(%04X, %p, %u);\n",
1547 hWaveOut
, lpWaveOutHdr
, uSize
);
1548 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1549 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1550 return wodMessage(0, WODM_UNPREPARE
, lpDesc
->dwInstance
,
1551 (DWORD
)lpWaveOutHdr
, uSize
);
1554 /**************************************************************************
1555 * waveOutWrite [MMSYSTEM.408]
1557 UINT
waveOutWrite(HWAVEOUT hWaveOut
, WAVEHDR FAR
* lpWaveOutHdr
, UINT uSize
)
1559 LPWAVEOPENDESC lpDesc
;
1560 dprintf_mmsys(stddeb
, "waveOutWrite(%04X, %p, %u);\n", hWaveOut
, lpWaveOutHdr
, uSize
);
1561 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1562 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1563 return wodMessage(0, WODM_WRITE
, lpDesc
->dwInstance
,
1564 (DWORD
)lpWaveOutHdr
, uSize
);
1567 /**************************************************************************
1568 * waveOutPause [MMSYSTEM.409]
1570 UINT
waveOutPause(HWAVEOUT hWaveOut
)
1572 LPWAVEOPENDESC lpDesc
;
1573 dprintf_mmsys(stddeb
, "waveOutPause(%04X)\n", hWaveOut
);
1574 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1575 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1576 return wodMessage(0, WODM_PAUSE
, lpDesc
->dwInstance
, 0L, 0L);
1579 /**************************************************************************
1580 * waveOutRestart [MMSYSTEM.410]
1582 UINT
waveOutRestart(HWAVEOUT hWaveOut
)
1584 LPWAVEOPENDESC lpDesc
;
1585 dprintf_mmsys(stddeb
, "waveOutRestart(%04X)\n", hWaveOut
);
1586 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1587 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1588 return wodMessage(0, WODM_RESTART
, lpDesc
->dwInstance
, 0L, 0L);
1591 /**************************************************************************
1592 * waveOutReset [MMSYSTEM.411]
1594 UINT
waveOutReset(HWAVEOUT hWaveOut
)
1596 LPWAVEOPENDESC lpDesc
;
1597 dprintf_mmsys(stddeb
, "waveOutReset(%04X)\n", hWaveOut
);
1598 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1599 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1600 return wodMessage(0, WODM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1603 /**************************************************************************
1604 * waveOutGetPosition [MMSYSTEM.412]
1606 UINT
waveOutGetPosition(HWAVEOUT hWaveOut
, MMTIME FAR
* lpTime
, UINT uSize
)
1608 LPWAVEOPENDESC lpDesc
;
1609 dprintf_mmsys(stddeb
, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut
, lpTime
, uSize
);
1610 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1611 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1612 return wodMessage(0, WODM_GETPOS
, lpDesc
->dwInstance
,
1613 (DWORD
)lpTime
, (DWORD
)uSize
);
1616 /**************************************************************************
1617 * waveOutGetPitch [MMSYSTEM.413]
1619 UINT
waveOutGetPitch(HWAVEOUT hWaveOut
, DWORD FAR
* lpdwPitch
)
1621 LPWAVEOPENDESC lpDesc
;
1622 dprintf_mmsys(stddeb
, "waveOutGetPitch(%04X, %p);\n", hWaveOut
, lpdwPitch
);
1623 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1624 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1625 return wodMessage(0, WODM_GETPITCH
, lpDesc
->dwInstance
,
1626 (DWORD
)lpdwPitch
, 0L);
1629 /**************************************************************************
1630 * waveOutSetPitch [MMSYSTEM.414]
1632 UINT
waveOutSetPitch(HWAVEOUT hWaveOut
, DWORD dwPitch
)
1634 LPWAVEOPENDESC lpDesc
;
1635 dprintf_mmsys(stddeb
, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut
, dwPitch
);
1636 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1637 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1638 return wodMessage(0, WODM_SETPITCH
, lpDesc
->dwInstance
, (DWORD
)dwPitch
, 0L);
1641 /**************************************************************************
1642 * waveOutGetVolume [MMSYSTEM.415]
1644 UINT
waveOutGetVolume(UINT uDeviceID
, DWORD FAR
* lpdwVolume
)
1646 dprintf_mmsys(stddeb
, "waveOutGetVolume(%04X, %p);\n", uDeviceID
, lpdwVolume
);
1647 return wodMessage(uDeviceID
, WODM_GETVOLUME
, 0L, (DWORD
)lpdwVolume
, 0L);
1650 /**************************************************************************
1651 * waveOutSetVolume [MMSYSTEM.416]
1653 UINT
waveOutSetVolume(UINT uDeviceID
, DWORD dwVolume
)
1655 dprintf_mmsys(stddeb
, "waveOutSetVolume(%04X, %08lX);\n", uDeviceID
, dwVolume
);
1656 return wodMessage(uDeviceID
, WODM_SETVOLUME
, 0L, dwVolume
, 0L);
1659 /**************************************************************************
1660 * waveOutGetPlaybackRate [MMSYSTEM.417]
1662 UINT
waveOutGetPlaybackRate(HWAVEOUT hWaveOut
, DWORD FAR
* lpdwRate
)
1664 LPWAVEOPENDESC lpDesc
;
1665 dprintf_mmsys(stddeb
, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut
, lpdwRate
);
1666 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1667 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1668 return wodMessage(0, WODM_GETPLAYBACKRATE
, lpDesc
->dwInstance
,
1669 (DWORD
)lpdwRate
, 0L);
1672 /**************************************************************************
1673 * waveOutSetPlaybackRate [MMSYSTEM.418]
1675 UINT
waveOutSetPlaybackRate(HWAVEOUT hWaveOut
, DWORD dwRate
)
1677 LPWAVEOPENDESC lpDesc
;
1678 dprintf_mmsys(stddeb
, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut
, dwRate
);
1679 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1680 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1681 return wodMessage(0, WODM_SETPLAYBACKRATE
,
1682 lpDesc
->dwInstance
, (DWORD
)dwRate
, 0L);
1685 /**************************************************************************
1686 * waveOutBreakLoop [MMSYSTEM.419]
1688 UINT
waveOutBreakLoop(HWAVEOUT hWaveOut
)
1690 dprintf_mmsys(stddeb
, "waveOutBreakLoop(%04X)\n", hWaveOut
);
1691 return MMSYSERR_INVALHANDLE
;
1694 /**************************************************************************
1695 * waveOutGetID [MMSYSTEM.420]
1697 UINT
waveOutGetID(HWAVEOUT hWaveOut
, UINT FAR
* lpuDeviceID
)
1699 LPWAVEOPENDESC lpDesc
;
1700 dprintf_mmsys(stddeb
, "waveOutGetID(%04X, %p);\n", hWaveOut
, lpuDeviceID
);
1701 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1702 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1703 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALHANDLE
;
1705 *lpuDeviceID = lpParms->wDeviceID;
1710 /**************************************************************************
1711 * waveOutMessage [MMSYSTEM.421]
1713 DWORD
waveOutMessage(HWAVEOUT hWaveOut
, UINT uMessage
,
1714 DWORD dwParam1
, DWORD dwParam2
)
1716 LPWAVEOPENDESC lpDesc
;
1717 dprintf_mmsys(stddeb
, "waveOutMessage(%04X, %04X, %08lX, %08lX)\n",
1718 hWaveOut
, uMessage
, dwParam1
, dwParam2
);
1719 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveOut
);
1720 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1721 return wodMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1724 /**************************************************************************
1725 * waveInGetNumDevs [MMSYSTEM.501]
1727 UINT
waveInGetNumDevs()
1730 dprintf_mmsys(stddeb
, "waveInGetNumDevs\n");
1731 count
+= widMessage(0, WIDM_GETNUMDEVS
, 0L, 0L, 0L);
1732 dprintf_mmsys(stddeb
, "waveInGetNumDevs return %u \n", count
);
1737 /**************************************************************************
1738 * waveInGetDevCaps [MMSYSTEM.502]
1740 UINT
waveInGetDevCaps(UINT uDeviceID
, WAVEINCAPS FAR
* lpCaps
, UINT uSize
)
1742 dprintf_mmsys(stddeb
, "waveInGetDevCaps\n");
1743 return widMessage(uDeviceID
, WIDM_GETDEVCAPS
, 0L, (DWORD
)lpCaps
, uSize
);
1747 /**************************************************************************
1748 * waveInGetErrorText [MMSYSTEM.503]
1750 UINT
waveInGetErrorText(UINT uError
, LPSTR lpText
, UINT uSize
)
1752 dprintf_mmsys(stddeb
, "waveInGetErrorText\n");
1753 return(waveGetErrorText(uError
, lpText
, uSize
));
1757 /**************************************************************************
1758 * waveInOpen [MMSYSTEM.504]
1760 UINT
waveInOpen(HWAVEIN FAR
* lphWaveIn
, UINT uDeviceID
,
1761 const LPWAVEFORMAT lpFormat
, DWORD dwCallback
, DWORD dwInstance
, DWORD dwFlags
)
1764 LPWAVEOPENDESC lpDesc
;
1765 LPWAVEOPENDESC lp16Desc
;
1767 BOOL bMapperFlg
= FALSE
;
1768 dprintf_mmsys(stddeb
, "waveInOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
1769 lphWaveIn
, uDeviceID
, lpFormat
, dwCallback
, dwInstance
, dwFlags
);
1770 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1771 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_FORMAT_QUERY requested !\n");
1773 if (uDeviceID
== (UINT
)WAVE_MAPPER
) {
1774 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_MAPPER mode requested !\n");
1778 if (lpFormat
== NULL
) return WAVERR_BADFORMAT
;
1779 hWaveIn
= USER_HEAP_ALLOC(sizeof(WAVEOPENDESC
));
1780 if (lphWaveIn
!= NULL
) *lphWaveIn
= hWaveIn
;
1781 lp16Desc
= (LPWAVEOPENDESC
) USER_HEAP_SEG_ADDR(hWaveIn
);
1782 lpDesc
= (LPWAVEOPENDESC
) PTR_SEG_TO_LIN(lp16Desc
);
1783 if (lpDesc
== NULL
) return MMSYSERR_NOMEM
;
1784 lpDesc
->hWave
= hWaveIn
;
1785 lpDesc
->lpFormat
= lpFormat
;
1786 lpDesc
->dwCallBack
= dwCallback
;
1787 lpDesc
->dwInstance
= dwInstance
;
1788 while(uDeviceID
< MAXWAVEDRIVERS
) {
1789 dwRet
= widMessage(uDeviceID
, WIDM_OPEN
,
1790 lpDesc
->dwInstance
, (DWORD
)lp16Desc
, 0L);
1791 if (dwRet
== MMSYSERR_NOERROR
) break;
1792 if (!bMapperFlg
) break;
1794 dprintf_mmsys(stddeb
, "waveInOpen // WAVE_MAPPER mode ! try next driver...\n");
1796 if (dwFlags
& WAVE_FORMAT_QUERY
) {
1797 dprintf_mmsys(stddeb
, "waveInOpen // End of WAVE_FORMAT_QUERY !\n");
1798 waveInClose(hWaveIn
);
1804 /**************************************************************************
1805 * waveInClose [MMSYSTEM.505]
1807 UINT
waveInClose(HWAVEIN hWaveIn
)
1809 LPWAVEOPENDESC lpDesc
;
1810 dprintf_mmsys(stddeb
, "waveInClose(%04X)\n", hWaveIn
);
1811 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1812 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1813 return widMessage(0, WIDM_CLOSE
, lpDesc
->dwInstance
, 0L, 0L);
1817 /**************************************************************************
1818 * waveInPrepareHeader [MMSYSTEM.506]
1820 UINT
waveInPrepareHeader(HWAVEIN hWaveIn
,
1821 WAVEHDR FAR
* lpWaveInHdr
, UINT uSize
)
1823 LPWAVEOPENDESC lpDesc
;
1824 LPWAVEHDR lp32WaveInHdr
;
1825 dprintf_mmsys(stddeb
, "waveInPrepareHeader(%04X, %p, %u);\n",
1826 hWaveIn
, lpWaveInHdr
, uSize
);
1827 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1828 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1829 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1830 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1831 lp32WaveInHdr
->lpNext
= NULL
;
1832 lp32WaveInHdr
->dwBytesRecorded
= 0;
1833 dprintf_mmsys(stddeb
, "waveInPrepareHeader // lpData=%p size=%lu \n",
1834 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1835 return widMessage(0, WIDM_PREPARE
, lpDesc
->dwInstance
,
1836 (DWORD
)lpWaveInHdr
, uSize
);
1840 /**************************************************************************
1841 * waveInUnprepareHeader [MMSYSTEM.507]
1843 UINT
waveInUnprepareHeader(HWAVEIN hWaveIn
,
1844 WAVEHDR FAR
* lpWaveInHdr
, UINT uSize
)
1846 LPWAVEOPENDESC lpDesc
;
1847 LPWAVEHDR lp32WaveInHdr
;
1848 dprintf_mmsys(stddeb
, "waveInUnprepareHeader(%04X, %p, %u);\n",
1849 hWaveIn
, lpWaveInHdr
, uSize
);
1850 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1851 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1852 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1853 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1854 USER_HEAP_FREE(HIWORD((DWORD
)lp32WaveInHdr
->lpData
));
1855 lp32WaveInHdr
->lpData
= NULL
;
1856 lp32WaveInHdr
->lpNext
= NULL
;
1857 return widMessage(0, WIDM_UNPREPARE
, lpDesc
->dwInstance
,
1858 (DWORD
)lpWaveInHdr
, uSize
);
1862 /**************************************************************************
1863 * waveInAddBuffer [MMSYSTEM.508]
1865 UINT
waveInAddBuffer(HWAVEIN hWaveIn
,
1866 WAVEHDR FAR
* lpWaveInHdr
, UINT uSize
)
1868 LPWAVEOPENDESC lpDesc
;
1869 LPWAVEHDR lp32WaveInHdr
;
1870 dprintf_mmsys(stddeb
, "waveInAddBuffer(%04X, %p, %u);\n", hWaveIn
, lpWaveInHdr
, uSize
);
1871 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1872 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1873 if (lpWaveInHdr
== NULL
) return MMSYSERR_INVALHANDLE
;
1874 lp32WaveInHdr
= PTR_SEG_TO_LIN(lpWaveInHdr
);
1875 lp32WaveInHdr
->lpNext
= NULL
;
1876 lp32WaveInHdr
->dwBytesRecorded
= 0;
1877 dprintf_mmsys(stddeb
, "waveInAddBuffer // lpData=%p size=%lu \n",
1878 lp32WaveInHdr
->lpData
, lp32WaveInHdr
->dwBufferLength
);
1879 return widMessage(0, WIDM_ADDBUFFER
, lpDesc
->dwInstance
,
1880 (DWORD
)lpWaveInHdr
, uSize
);
1884 /**************************************************************************
1885 * waveInStart [MMSYSTEM.509]
1887 UINT
waveInStart(HWAVEIN hWaveIn
)
1889 LPWAVEOPENDESC lpDesc
;
1890 dprintf_mmsys(stddeb
, "waveInStart(%04X)\n", hWaveIn
);
1891 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1892 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1893 return widMessage(0, WIDM_START
, lpDesc
->dwInstance
, 0L, 0L);
1897 /**************************************************************************
1898 * waveInStop [MMSYSTEM.510]
1900 UINT
waveInStop(HWAVEIN hWaveIn
)
1902 LPWAVEOPENDESC lpDesc
;
1903 dprintf_mmsys(stddeb
, "waveInStop(%04X)\n", hWaveIn
);
1904 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1905 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1906 return widMessage(0, WIDM_STOP
, lpDesc
->dwInstance
, 0L, 0L);
1910 /**************************************************************************
1911 * waveInReset [MMSYSTEM.511]
1913 UINT
waveInReset(HWAVEIN hWaveIn
)
1915 LPWAVEOPENDESC lpDesc
;
1916 dprintf_mmsys(stddeb
, "waveInReset(%04X)\n", hWaveIn
);
1917 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1918 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1919 return widMessage(0, WIDM_RESET
, lpDesc
->dwInstance
, 0L, 0L);
1923 /**************************************************************************
1924 * waveInGetPosition [MMSYSTEM.512]
1926 UINT
waveInGetPosition(HWAVEIN hWaveIn
, MMTIME FAR
* lpTime
, UINT uSize
)
1928 LPWAVEOPENDESC lpDesc
;
1929 dprintf_mmsys(stddeb
, "waveInGetPosition(%04X, %p, %u);\n", hWaveIn
, lpTime
, uSize
);
1930 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1931 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1932 return widMessage(0, WIDM_GETPOS
, lpDesc
->dwInstance
,
1933 (DWORD
)lpTime
, (DWORD
)uSize
);
1937 /**************************************************************************
1938 * waveInGetID [MMSYSTEM.513]
1940 UINT
waveInGetID(HWAVEIN hWaveIn
, UINT FAR
* lpuDeviceID
)
1942 dprintf_mmsys(stddeb
, "waveInGetID\n");
1943 if (lpuDeviceID
== NULL
) return MMSYSERR_INVALPARAM
;
1948 /**************************************************************************
1949 * waveInMessage [MMSYSTEM.514]
1951 DWORD
waveInMessage(HWAVEIN hWaveIn
, UINT uMessage
,
1952 DWORD dwParam1
, DWORD dwParam2
)
1954 LPWAVEOPENDESC lpDesc
;
1955 dprintf_mmsys(stddeb
, "waveInMessage(%04X, %04X, %08lX, %08lX)\n",
1956 hWaveIn
, uMessage
, dwParam1
, dwParam2
);
1957 lpDesc
= (LPWAVEOPENDESC
) USER_HEAP_LIN_ADDR(hWaveIn
);
1958 if (lpDesc
== NULL
) return MMSYSERR_INVALHANDLE
;
1959 return widMessage(0, uMessage
, lpDesc
->dwInstance
, dwParam1
, dwParam2
);
1963 /**************************************************************************
1964 * MMSysTimeCallback [internal]
1966 WORD FAR PASCAL
MMSysTimeCallback(HWND hWnd
, WORD wMsg
, int nID
, DWORD dwTime
)
1968 LPTIMERENTRY lpTimer
= lpTimerList
;
1969 mmSysTimeMS
.u
.ms
+= 33;
1970 mmSysTimeSMPTE
.u
.smpte
.frame
++;
1971 while (lpTimer
!= NULL
) {
1972 lpTimer
->wCurTime
--;
1973 if (lpTimer
->wCurTime
== 0) {
1974 lpTimer
->wCurTime
= lpTimer
->wDelay
;
1975 if (lpTimer
->lpFunc
!= (FARPROC
)NULL
) {
1976 dprintf_mmtime(stddeb
,"MMSysTimeCallback // before CallBack16 !\n");
1977 CallTimeFuncProc( lpTimer
->lpFunc
,
1978 lpTimer
->wTimerID
, 0,
1979 lpTimer
->dwUser
, 0, 0 );
1980 dprintf_mmtime(stddeb
, "MMSysTimeCallback // after CallBack16 !\n");
1983 if (lpTimer
->wFlags
& TIME_ONESHOT
)
1984 timeKillEvent(lpTimer
->wTimerID
);
1986 lpTimer
= lpTimer
->Next
;
1991 /**************************************************************************
1992 * StartMMTime [internal]
1996 if (!mmTimeStarted
) {
1997 mmTimeStarted
= TRUE
;
1998 mmSysTimeMS
.wType
= TIME_MS
;
1999 mmSysTimeMS
.u
.ms
= 0;
2000 mmSysTimeSMPTE
.wType
= TIME_SMPTE
;
2001 mmSysTimeSMPTE
.u
.smpte
.hour
= 0;
2002 mmSysTimeSMPTE
.u
.smpte
.min
= 0;
2003 mmSysTimeSMPTE
.u
.smpte
.sec
= 0;
2004 mmSysTimeSMPTE
.u
.smpte
.frame
= 0;
2005 mmSysTimeSMPTE
.u
.smpte
.fps
= 0;
2006 mmSysTimeSMPTE
.u
.smpte
.dummy
= 0;
2007 SetTimer(0, 1, 33, (FARPROC
)MMSysTimeCallback
);
2011 /**************************************************************************
2012 * timeGetSystemTime [MMSYSTEM.601]
2014 WORD
timeGetSystemTime(LPMMTIME lpTime
, WORD wSize
)
2016 dprintf_mmsys(stddeb
, "timeGetSystemTime(%p, %u);\n", lpTime
, wSize
);
2017 if (!mmTimeStarted
) StartMMTime();
2021 /**************************************************************************
2022 * timeSetEvent [MMSYSTEM.602]
2024 WORD
timeSetEvent(WORD wDelay
, WORD wResol
,
2025 LPTIMECALLBACK lpFunc
,
2026 DWORD dwUser
, WORD wFlags
)
2029 LPTIMERENTRY lpNewTimer
;
2030 LPTIMERENTRY lpTimer
= lpTimerList
;
2031 dprintf_mmsys(stddeb
, "timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
2032 wDelay
, wResol
, lpFunc
, dwUser
, wFlags
);
2033 if (!mmTimeStarted
) StartMMTime();
2034 lpNewTimer
= (LPTIMERENTRY
) malloc(sizeof(TIMERENTRY
));
2035 if (lpNewTimer
== NULL
) return 0;
2036 while (lpTimer
!= NULL
) {
2037 wNewID
= max(wNewID
, lpTimer
->wTimerID
);
2038 if (lpTimer
->Next
== NULL
) break;
2039 lpTimer
= lpTimer
->Next
;
2041 if (lpTimerList
== NULL
) {
2042 lpTimerList
= lpNewTimer
;
2043 lpNewTimer
->Prev
= NULL
;
2046 lpTimer
->Next
= lpNewTimer
;
2047 lpNewTimer
->Prev
= lpTimer
;
2049 lpNewTimer
->Next
= NULL
;
2050 lpNewTimer
->wTimerID
= wNewID
+ 1;
2051 lpNewTimer
->wCurTime
= wDelay
;
2052 lpNewTimer
->wDelay
= wDelay
;
2053 lpNewTimer
->wResol
= wResol
;
2054 lpNewTimer
->lpFunc
= (FARPROC
)lpFunc
;
2055 lpNewTimer
->dwUser
= dwUser
;
2056 lpNewTimer
->wFlags
= wFlags
;
2057 return lpNewTimer
->wTimerID
;
2060 /**************************************************************************
2061 * timeKillEvent [MMSYSTEM.603]
2063 WORD
timeKillEvent(WORD wID
)
2065 LPTIMERENTRY lpTimer
= lpTimerList
;
2066 while (lpTimer
!= NULL
) {
2067 if (wID
== lpTimer
->wTimerID
) {
2068 if (lpTimer
->Prev
!= NULL
) lpTimer
->Prev
->Next
= lpTimer
->Next
;
2069 if (lpTimer
->Next
!= NULL
) lpTimer
->Next
->Prev
= lpTimer
->Prev
;
2073 lpTimer
= lpTimer
->Next
;
2078 /**************************************************************************
2079 * timeGetDevCaps [MMSYSTEM.604]
2081 WORD
timeGetDevCaps(LPTIMECAPS lpCaps
, WORD wSize
)
2083 dprintf_mmsys(stddeb
, "timeGetDevCaps(%p, %u) !\n", lpCaps
, wSize
);
2087 /**************************************************************************
2088 * timeBeginPeriod [MMSYSTEM.605]
2090 WORD
timeBeginPeriod(WORD wPeriod
)
2092 dprintf_mmsys(stddeb
, "timeBeginPeriod(%u) !\n", wPeriod
);
2093 if (!mmTimeStarted
) StartMMTime();
2097 /**************************************************************************
2098 * timeEndPeriod [MMSYSTEM.606]
2100 WORD
timeEndPeriod(WORD wPeriod
)
2102 dprintf_mmsys(stddeb
, "timeEndPeriod(%u) !\n", wPeriod
);
2106 /**************************************************************************
2107 * timeGetTime [MMSYSTEM.607]
2111 dprintf_mmsys(stddeb
, "timeGetTime(); !\n");
2112 if (!mmTimeStarted
) StartMMTime();
2117 /**************************************************************************
2118 * mmioOpen [MMSYSTEM.1210]
2120 HMMIO
mmioOpen(LPSTR szFileName
, MMIOINFO FAR
* lpmmioinfo
, DWORD dwOpenFlags
)
2125 LPMMIOINFO lpmminfo
;
2126 dprintf_mmsys(stddeb
, "mmioOpen('%s', %p, %08lX);\n", szFileName
, lpmmioinfo
, dwOpenFlags
);
2127 hFile
= OpenFile(szFileName
, &ofs
, dwOpenFlags
);
2128 if (hFile
== -1) return 0;
2129 hmmio
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(MMIOINFO
));
2130 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2131 if (lpmminfo
== NULL
) return 0;
2132 memset(lpmminfo
, 0, sizeof(MMIOINFO
));
2133 lpmminfo
->hmmio
= hmmio
;
2134 lpmminfo
->dwReserved2
= MAKELONG(hFile
, 0);
2135 GlobalUnlock(hmmio
);
2136 dprintf_mmsys(stddeb
, "mmioOpen // return hmmio=%04X\n", hmmio
);
2137 return (HMMIO
)hmmio
;
2142 /**************************************************************************
2143 * mmioClose [MMSYSTEM.1211]
2145 UINT
mmioClose(HMMIO hmmio
, UINT uFlags
)
2147 LPMMIOINFO lpmminfo
;
2148 dprintf_mmsys(stddeb
, "mmioClose(%04X, %04X);\n", hmmio
, uFlags
);
2149 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2150 if (lpmminfo
== NULL
) return 0;
2151 _lclose(LOWORD(lpmminfo
->dwReserved2
));
2152 GlobalUnlock(hmmio
);
2159 /**************************************************************************
2160 * mmioRead [MMSYSTEM.1212]
2162 LONG
mmioRead(HMMIO hmmio
, HPSTR pch
, LONG cch
)
2165 LPMMIOINFO lpmminfo
;
2166 dprintf_mmio(stddeb
, "mmioRead(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2167 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2168 if (lpmminfo
== NULL
) return 0;
2169 count
= read(LOWORD(lpmminfo
->dwReserved2
), pch
, cch
);
2170 GlobalUnlock(hmmio
);
2171 dprintf_mmio(stddeb
, "mmioRead // count=%ld\n", count
);
2177 /**************************************************************************
2178 * mmioWrite [MMSYSTEM.1213]
2180 LONG
mmioWrite(HMMIO hmmio
, HPCSTR pch
, LONG cch
)
2183 LPMMIOINFO lpmminfo
;
2184 dprintf_mmsys(stddeb
, "mmioWrite(%04X, %p, %ld);\n", hmmio
, pch
, cch
);
2185 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2186 if (lpmminfo
== NULL
) return 0;
2187 count
= _lwrite(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)pch
, cch
);
2188 GlobalUnlock(hmmio
);
2192 /**************************************************************************
2193 * mmioSeek [MMSYSTEM.1214]
2195 LONG
mmioSeek(HMMIO hmmio
, LONG lOffset
, int iOrigin
)
2198 LPMMIOINFO lpmminfo
;
2199 dprintf_mmsys(stddeb
, "mmioSeek(%04X, %08lX, %d);\n", hmmio
, lOffset
, iOrigin
);
2200 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2201 if (lpmminfo
== NULL
) {
2202 dprintf_mmsys(stddeb
, "mmioSeek // can't lock hmmio=%04X !\n", hmmio
);
2205 count
= _llseek(LOWORD(lpmminfo
->dwReserved2
), lOffset
, iOrigin
);
2206 GlobalUnlock(hmmio
);
2210 /**************************************************************************
2211 * mmioGetInfo [MMSYSTEM.1215]
2213 UINT
mmioGetInfo(HMMIO hmmio
, MMIOINFO FAR
* lpmmioinfo
, UINT uFlags
)
2215 LPMMIOINFO lpmminfo
;
2216 dprintf_mmsys(stddeb
, "mmioGetInfo\n");
2217 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2218 if (lpmminfo
== NULL
) return 0;
2219 memcpy(lpmmioinfo
, lpmminfo
, sizeof(MMIOINFO
));
2220 GlobalUnlock(hmmio
);
2224 /**************************************************************************
2225 * mmioSetInfo [MMSYSTEM.1216]
2227 UINT
mmioSetInfo(HMMIO hmmio
, const MMIOINFO FAR
* lpmmioinfo
, UINT uFlags
)
2229 LPMMIOINFO lpmminfo
;
2230 dprintf_mmsys(stddeb
, "mmioSetInfo\n");
2231 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2232 if (lpmminfo
== NULL
) return 0;
2233 GlobalUnlock(hmmio
);
2237 /**************************************************************************
2238 * mmioSetBuffer [MMSYSTEM.1217]
2240 UINT
mmioSetBuffer(HMMIO hmmio
, LPSTR pchBuffer
,
2241 LONG cchBuffer
, UINT uFlags
)
2243 dprintf_mmsys(stddeb
, "mmioSetBuffer // empty stub \n");
2247 /**************************************************************************
2248 * mmioFlush [MMSYSTEM.1218]
2250 UINT
mmioFlush(HMMIO hmmio
, UINT uFlags
)
2252 LPMMIOINFO lpmminfo
;
2253 dprintf_mmsys(stddeb
, "mmioFlush(%04X, %04X)\n", hmmio
, uFlags
);
2254 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2255 if (lpmminfo
== NULL
) return 0;
2256 GlobalUnlock(hmmio
);
2260 /**************************************************************************
2261 * mmioAdvance [MMSYSTEM.1219]
2263 UINT
mmioAdvance(HMMIO hmmio
, MMIOINFO FAR
* lpmmioinfo
, UINT uFlags
)
2266 LPMMIOINFO lpmminfo
;
2267 dprintf_mmsys(stddeb
, "mmioAdvance\n");
2268 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2269 if (lpmminfo
== NULL
) return 0;
2270 if (uFlags
== MMIO_READ
) {
2271 count
= read(LOWORD(lpmminfo
->dwReserved2
),
2272 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2274 if (uFlags
== MMIO_WRITE
) {
2275 count
= _lwrite(LOWORD(lpmminfo
->dwReserved2
),
2276 lpmmioinfo
->pchBuffer
, lpmmioinfo
->cchBuffer
);
2278 lpmmioinfo
->pchNext
+= count
;
2279 GlobalUnlock(hmmio
);
2280 lpmminfo
->lDiskOffset
= _llseek(LOWORD(lpmminfo
->dwReserved2
), 0, SEEK_CUR
);
2284 /**************************************************************************
2285 * mmioStringToFOURCC [MMSYSTEM.1220]
2287 FOURCC
mmioStringToFOURCC(LPCSTR sz
, UINT uFlags
)
2289 dprintf_mmsys(stddeb
, "mmioStringToFOURCC // empty stub \n");
2293 /**************************************************************************
2294 * mmioInstallIOProc [MMSYSTEM.1221]
2296 LPMMIOPROC
mmioInstallIOProc(FOURCC fccIOProc
,
2297 LPMMIOPROC pIOProc
, DWORD dwFlags
)
2299 dprintf_mmsys(stddeb
, "mmioInstallIOProc // empty stub \n");
2303 /**************************************************************************
2304 * mmioSendMessage [MMSYSTEM.1222]
2306 LRESULT
mmioSendMessage(HMMIO hmmio
, UINT uMessage
,
2307 LPARAM lParam1
, LPARAM lParam2
)
2309 dprintf_mmsys(stddeb
, "mmioSendMessage // empty stub \n");
2313 /**************************************************************************
2314 * mmioDescend [MMSYSTEM.1223]
2316 UINT
mmioDescend(HMMIO hmmio
, MMCKINFO FAR
* lpck
,
2317 const MMCKINFO FAR
* lpckParent
, UINT uFlags
)
2319 DWORD dwfcc
, dwOldPos
;
2320 LPMMIOINFO lpmminfo
;
2321 dprintf_mmio(stddeb
, "mmioDescend(%04X, %p, %p, %04X);\n",
2322 hmmio
, lpck
, lpckParent
, uFlags
);
2323 if (lpck
== NULL
) return 0;
2324 lpmminfo
= (LPMMIOINFO
)GlobalLock(hmmio
);
2325 if (lpmminfo
== NULL
) return 0;
2327 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX\n", dwfcc
);
2328 dwOldPos
= _llseek(LOWORD(lpmminfo
->dwReserved2
), 0, SEEK_CUR
);
2329 dprintf_mmio(stddeb
, "mmioDescend // dwOldPos=%ld\n", dwOldPos
);
2330 if (lpckParent
!= NULL
) {
2331 dprintf_mmio(stddeb
, "mmioDescend // seek inside parent at %ld !\n", lpckParent
->dwDataOffset
);
2332 dwOldPos
= _llseek(LOWORD(lpmminfo
->dwReserved2
),
2333 lpckParent
->dwDataOffset
, SEEK_SET
);
2335 if ((uFlags
& MMIO_FINDCHUNK
) || (uFlags
& MMIO_FINDRIFF
) ||
2336 (uFlags
& MMIO_FINDLIST
)) {
2337 dprintf_mmio(stddeb
, "mmioDescend // MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc
);
2339 if (read(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)lpck
,
2340 sizeof(MMCKINFO
)) < sizeof(MMCKINFO
)) {
2341 _llseek(LOWORD(lpmminfo
->dwReserved2
), dwOldPos
, SEEK_SET
);
2342 GlobalUnlock(hmmio
);
2343 return MMIOERR_CHUNKNOTFOUND
;
2345 dprintf_mmio(stddeb
, "mmioDescend // dwfcc=%08lX ckid=%08lX cksize=%08lX !\n",
2346 dwfcc
, lpck
->ckid
, lpck
->cksize
);
2347 if (dwfcc
== lpck
->ckid
) break;
2348 dwOldPos
+= lpck
->cksize
+ 2 * sizeof(DWORD
);
2349 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2350 dwOldPos
+= sizeof(DWORD
);
2351 _llseek(LOWORD(lpmminfo
->dwReserved2
), dwOldPos
, SEEK_SET
);
2355 if (read(LOWORD(lpmminfo
->dwReserved2
), (LPSTR
)lpck
,
2356 sizeof(MMCKINFO
)) < sizeof(MMCKINFO
)) {
2357 _llseek(LOWORD(lpmminfo
->dwReserved2
), dwOldPos
, SEEK_SET
);
2358 GlobalUnlock(hmmio
);
2359 return MMIOERR_CHUNKNOTFOUND
;
2362 lpck
->dwDataOffset
= dwOldPos
+ 2 * sizeof(DWORD
);
2363 if (lpck
->ckid
== FOURCC_RIFF
|| lpck
->ckid
== FOURCC_LIST
)
2364 lpck
->dwDataOffset
+= sizeof(DWORD
);
2365 lpmminfo
->lDiskOffset
= _llseek(LOWORD(lpmminfo
->dwReserved2
),
2366 lpck
->dwDataOffset
, SEEK_SET
);
2367 GlobalUnlock(hmmio
);
2368 dprintf_mmio(stddeb
, "mmioDescend // lpck->ckid=%08lX lpck->cksize=%ld !\n",
2369 lpck
->ckid
, lpck
->cksize
);
2370 dprintf_mmsys(stddeb
, "mmioDescend // lpck->fccType=%08lX !\n", lpck
->fccType
);
2374 /**************************************************************************
2375 * mmioAscend [MMSYSTEM.1224]
2377 UINT
mmioAscend(HMMIO hmmio
, MMCKINFO FAR
* lpck
, UINT uFlags
)
2379 dprintf_mmsys(stddeb
, "mmioAscend // empty stub !\n");
2383 /**************************************************************************
2384 * mmioCreateChunk [MMSYSTEM.1225]
2386 UINT
mmioCreateChunk(HMMIO hmmio
, MMCKINFO FAR
* lpck
, UINT uFlags
)
2388 dprintf_mmsys(stddeb
, "mmioCreateChunk // empty stub \n");
2393 /**************************************************************************
2394 * mmioRename [MMSYSTEM.1226]
2396 UINT
mmioRename(LPCSTR szFileName
, LPCSTR szNewFileName
,
2397 MMIOINFO FAR
* lpmmioinfo
, DWORD dwRenameFlags
)
2399 dprintf_mmsys(stddeb
, "mmioRename('%s', '%s', %p, %08lX); // empty stub \n",
2400 szFileName
, szNewFileName
, lpmmioinfo
, dwRenameFlags
);
2404 /**************************************************************************
2405 * DrvOpen [MMSYSTEM.1100]
2407 HDRVR
DrvOpen(LPSTR lpDriverName
, LPSTR lpSectionName
, LPARAM lParam
)
2409 dprintf_mmsys(stddeb
, "DrvOpen('%s', '%s', %08lX);\n",
2410 lpDriverName
, lpSectionName
, lParam
);
2411 return OpenDriver(lpDriverName
, lpSectionName
, lParam
);
2415 /**************************************************************************
2416 * DrvClose [MMSYSTEM.1101]
2418 LRESULT
DrvClose(HDRVR hDrvr
, LPARAM lParam1
, LPARAM lParam2
)
2420 dprintf_mmsys(stddeb
, "DrvClose(%04X, %08lX, %08lX);\n", hDrvr
, lParam1
, lParam2
);
2421 return CloseDriver(hDrvr
, lParam1
, lParam2
);
2425 /**************************************************************************
2426 * DrvSendMessage [MMSYSTEM.1102]
2428 LRESULT
DrvSendMessage(HDRVR hDriver
, WORD msg
, LPARAM lParam1
, LPARAM lParam2
)
2431 dprintf_mmsys(stddeb
, "DrvSendMessage(%04X, %04X, %08lX, %08lX);\n",
2432 hDriver
, msg
, lParam1
, lParam2
);
2434 return CDAUDIO_DriverProc(dwDevID
, hDriver
, msg
, lParam1
, lParam2
);
2438 /**************************************************************************
2439 * DrvGetModuleHandle [MMSYSTEM.1103]
2441 HANDLE
DrvGetModuleHandle(HDRVR hDrvr
)
2443 dprintf_mmsys(stddeb
, "DrvGetModuleHandle(%04X);\n", hDrvr
);
2448 /**************************************************************************
2449 * DrvDefDriverProc [MMSYSTEM.1104]
2451 LRESULT
DrvDefDriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
2452 DWORD dwParam1
, DWORD dwParam2
)
2454 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
2458 #endif /* #ifdef WINELIB */