2 * Sample MIDI Wine Driver for Linux
4 * Copyright 1994 Martin Ayotte
6 static char Copyright
[] = "Copyright Martin Ayotte, 1994";
9 #define BUILTIN_MMSYSTEM
12 #ifdef BUILTIN_MMSYSTEM
23 #include <sys/ioctl.h>
25 #include <linux/soundcard.h>
29 #define MIDI_DEV "/dev/midi"
32 #define IOCTL(a,b,c) ioctl(a,b,&c)
34 #define IOCTL(a,b,c) (c = ioctl(a,b,c) )
37 #define MAX_MIDIINDRV 2
38 #define MAX_MIDIOUTDRV 2
39 #define MAX_MCIMIDIDRV 2
45 MIDIOPENDESC midiDesc
;
55 MIDIOPENDESC midiDesc
;
62 int nUseCount
; /* Incremented for each shared open */
63 BOOL fShareable
; /* TRUE if first open was shareable */
64 WORD wNotifyDeviceID
; /* MCI device ID with a pending notification */
65 HANDLE hCallback
; /* Callback handle for pending notification */
66 HMMIO hFile
; /* mmio file handle open as Element */
67 MCI_OPEN_PARMS openParms
;
72 static LINUX_MIDIIN MidiInDev
[MAX_MIDIINDRV
];
73 static LINUX_MIDIOUT MidiOutDev
[MAX_MIDIOUTDRV
];
74 static LINUX_MCIMIDI MCIMidiDev
[MAX_MCIMIDIDRV
];
77 DWORD
MIDI_mciOpen(DWORD dwFlags
, LPMCI_OPEN_PARMS lpParms
);
78 DWORD
MIDI_mciClose(UINT wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
);
79 DWORD
MIDI_mciPlay(UINT wDevID
, DWORD dwFlags
, LPMCI_PLAY_PARMS lpParms
);
80 DWORD
MIDI_mciRecord(UINT wDevID
, DWORD dwFlags
, LPMCI_RECORD_PARMS lpParms
);
81 DWORD
MIDI_mciStop(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
);
82 DWORD
MIDI_mciPause(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
);
83 DWORD
MIDI_mciResume(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
);
84 DWORD
MIDI_mciSet(UINT wDevID
, DWORD dwFlags
, LPMCI_SET_PARMS lpParms
);
85 DWORD
MIDI_mciStatus(UINT wDevID
, DWORD dwFlags
, LPMCI_STATUS_PARMS lpParms
);
86 DWORD
MIDI_mciGetDevCaps(UINT wDevID
, DWORD dwFlags
, LPMCI_GETDEVCAPS_PARMS lpParms
);
87 DWORD
MIDI_mciInfo(UINT wDevID
, DWORD dwFlags
, LPMCI_INFO_PARMS lpParms
);
90 /**************************************************************************
91 * MIDI_NotifyClient [internal]
93 DWORD
MIDI_NotifyClient(UINT wDevID
, WORD wMsg
,
94 DWORD dwParam1
, DWORD dwParam2
)
97 if (MidiInDev
[wDevID
].wFlags
!= DCB_NULL
&& !DriverCallback(
98 MidiInDev
[wDevID
].midiDesc
.dwCallback
, MidiInDev
[wDevID
].wFlags
,
99 MidiInDev
[wDevID
].midiDesc
.hMidi
, wMsg
,
100 MidiInDev
[wDevID
].midiDesc
.dwInstance
, dwParam1
, dwParam2
)) {
101 printf("MIDI_NotifyClient // can't notify client !\n");
102 return MMSYSERR_NOERROR
;
105 return MMSYSERR_NOTENABLED
;
110 /**************************************************************************
111 * AUDIO_DriverProc [sample driver]
113 LRESULT
MIDI_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
114 DWORD dwParam1
, DWORD dwParam2
)
130 case DRV_QUERYCONFIGURE
:
133 MessageBox((HWND
)NULL
, "Sample Midi Linux Driver !",
134 "MMLinux Driver", MB_OK
);
137 return (LRESULT
)DRVCNF_RESTART
;
139 return (LRESULT
)DRVCNF_RESTART
;
140 case MCI_OPEN_DRIVER
:
142 return MIDI_mciOpen(dwParam1
, (LPMCI_OPEN_PARMS
)dwParam2
);
143 case MCI_CLOSE_DRIVER
:
145 return MIDI_mciClose(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
147 return MIDI_mciPlay(dwDevID
, dwParam1
, (LPMCI_PLAY_PARMS
)dwParam2
);
149 return MIDI_mciRecord(dwDevID
, dwParam1
, (LPMCI_RECORD_PARMS
)dwParam2
);
151 return MIDI_mciStop(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
153 return MIDI_mciSet(dwDevID
, dwParam1
, (LPMCI_SET_PARMS
)dwParam2
);
155 return MIDI_mciPause(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
157 return MIDI_mciResume(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
159 return MIDI_mciStatus(dwDevID
, dwParam1
, (LPMCI_STATUS_PARMS
)dwParam2
);
161 return MIDI_mciGetDevCaps(dwDevID
, dwParam1
, (LPMCI_GETDEVCAPS_PARMS
)dwParam2
);
163 return MIDI_mciInfo(dwDevID
, dwParam1
, (LPMCI_INFO_PARMS
)dwParam2
);
165 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
168 return MMSYSERR_NOTENABLED
;
172 /**************************************************************************
173 * MIDI_mciOpen [internal]
175 DWORD
MIDI_mciOpen(DWORD dwFlags
, LPMCI_OPEN_PARMS lpParms
)
181 MIDIOPENDESC MidiDesc
;
186 printf("MIDI_mciOpen(%08X, %08X)\n", dwFlags
, lpParms
);
188 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
189 wDevID
= lpParms
->wDeviceID
;
190 if (MCIMidiDev
[wDevID
].nUseCount
> 0) {
191 /* The driver already open on this channel */
192 /* If the driver was opened shareable before and this open specifies */
193 /* shareable then increment the use count */
194 if (MCIMidiDev
[wDevID
].fShareable
&& (dwFlags
& MCI_OPEN_SHAREABLE
))
195 ++MCIMidiDev
[wDevID
].nUseCount
;
197 return MCIERR_MUST_USE_SHAREABLE
;
200 MCIMidiDev
[wDevID
].nUseCount
= 1;
201 MCIMidiDev
[wDevID
].fShareable
= dwFlags
& MCI_OPEN_SHAREABLE
;
203 if (dwFlags
& MCI_OPEN_ELEMENT
) {
204 printf("MIDI_mciOpen // MCI_OPEN_ELEMENT '%s' !\n",
205 lpParms
->lpstrElementName
);
206 /* printf("MIDI_mciOpen // cdw='%s'\n", DOS_GetCurrentDir(DOS_GetDefaultDrive())); */
207 if (strlen(lpParms
->lpstrElementName
) > 0) {
208 strcpy(str
, lpParms
->lpstrElementName
);
210 MCIMidiDev
[wDevID
].hFile
= mmioOpen(str
, NULL
,
211 MMIO_ALLOCBUF
| MMIO_READWRITE
| MMIO_EXCLUSIVE
);
212 if (MCIMidiDev
[wDevID
].hFile
== 0) {
213 printf("MIDI_mciOpen // can't find file='%s' !\n", str
);
214 return MCIERR_FILE_NOT_FOUND
;
218 MCIMidiDev
[wDevID
].hFile
= 0;
220 printf("MIDI_mciOpen // hFile=%u\n", MCIMidiDev
[wDevID
].hFile
);
221 memcpy(&MCIMidiDev
[wDevID
].openParms
, lpParms
, sizeof(MCI_OPEN_PARMS
));
222 MCIMidiDev
[wDevID
].wNotifyDeviceID
= lpParms
->wDeviceID
;
223 MCIMidiDev
[wDevID
].dwStatus
= MCI_MODE_STOP
;
225 if (MCIMidiDev
[wDevID
].hFile
!= 0) {
228 if (mmioDescend(MCIMidiDev
[wDevID
].hFile
, &ckMainRIFF
, NULL
, 0) != 0) {
229 return MCIERR_INTERNAL
;
232 printf("MIDI_mciOpen // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
233 (LPSTR
)&ckMainRIFF
.ckid
, (LPSTR
)&ckMainRIFF
.fccType
,
236 if (ckMainRIFF
.ckid
!= FOURCC_RIFF
) return MCIERR_INTERNAL
;
237 if (ckMainRIFF
.fccType
!= mmioFOURCC('R', 'M', 'I', 'D') &&
238 ckMainRIFF
.fccType
!= mmioFOURCC('M', 'T', 'h', 'd')) {
239 return MCIERR_INTERNAL
;
241 mmckInfo
.ckid
= mmioFOURCC('d', 'a', 't', 'a');
242 if (mmioDescend(MCIMidiDev
[wDevID
].hFile
, &mmckInfo
, &ckMainRIFF
, MMIO_FINDCHUNK
) != 0) {
243 return MCIERR_INTERNAL
;
246 printf("MIDI_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
247 (LPSTR
)&mmckInfo
.ckid
, (LPSTR
)&mmckInfo
.fccType
,
251 dwRet
= modMessage(0, MODM_OPEN
, 0, (DWORD
)&MidiDesc
, CALLBACK_NULL
);
252 dwRet
= midMessage(0, MIDM_OPEN
, 0, (DWORD
)&MidiDesc
, CALLBACK_NULL
);
255 return MMSYSERR_NOTENABLED
;
260 /**************************************************************************
261 * MIDI_mciClose [internal]
263 DWORD
MIDI_mciClose(UINT wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
268 printf("MIDI_mciClose(%u, %08X, %08X);\n", wDevID
, dwParam
, lpParms
);
270 if (MCIMidiDev
[wDevID
].dwStatus
!= MCI_MODE_STOP
) {
271 MIDI_mciStop(wDevID
, MCI_WAIT
, lpParms
);
273 MCIMidiDev
[wDevID
].dwStatus
= MCI_MODE_STOP
;
274 MCIMidiDev
[wDevID
].nUseCount
--;
275 if (MCIMidiDev
[wDevID
].nUseCount
== 0) {
276 if (MCIMidiDev
[wDevID
].hFile
!= 0) {
277 close(MCIMidiDev
[wDevID
].hFile
);
278 MCIMidiDev
[wDevID
].hFile
= 0;
280 dwRet
= modMessage(0, MODM_CLOSE
, 0, 0L, 0L);
281 if (dwRet
!= MMSYSERR_NOERROR
) return MCIERR_INTERNAL
;
282 dwRet
= midMessage(0, MIDM_CLOSE
, 0, 0L, 0L);
283 if (dwRet
!= MMSYSERR_NOERROR
) return MCIERR_INTERNAL
;
292 /**************************************************************************
293 * MIDI_mciPlay [internal]
295 DWORD
MIDI_mciPlay(UINT wDevID
, DWORD dwFlags
, LPMCI_PLAY_PARMS lpParms
)
303 printf("MIDI_mciPlay(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
305 if (MCIMidiDev
[wDevID
].hFile
== 0) {
306 printf("MIDI_mciPlay // can't find file='%s' !\n",
307 MCIMidiDev
[wDevID
].openParms
.lpstrElementName
);
308 return MCIERR_FILE_NOT_FOUND
;
310 start
= 1; end
= 99999;
311 if (dwFlags
& MCI_FROM
) {
312 start
= lpParms
->dwFrom
;
313 printf("MIDI_mciPlay // MCI_FROM=%d \n", start
);
315 if (dwFlags
& MCI_TO
) {
317 printf("MIDI_mciPlay // MCI_TO=%d \n", end
);
320 if (dwFlags
& MCI_NOTIFY
) {
321 printf("MIDI_mciPlay // MCI_NOTIFY %08X !\n", lpParms
->dwCallback
);
324 printf("MIDI_mciPlay // Can't 'fork' process !\n");
327 printf("MIDI_mciPlay // process started ! play in background ...\n");
330 printf("MIDI_mciPlay // process started ! return to caller...\n");
335 lpMidiHdr
= &MCIMidiDev
[wDevID
].MidiHdr
;
336 lpMidiHdr
->lpData
= (LPSTR
) malloc(64000);
337 lpMidiHdr
->dwBufferLength
= 32000;
338 lpMidiHdr
->dwUser
= 0L;
339 lpMidiHdr
->dwFlags
= 0L;
340 dwRet
= modMessage(0, MODM_PREPARE
, 0, (DWORD
)lpMidiHdr
, sizeof(MIDIHDR
));
341 /* printf("MIDI_mciPlay // after MODM_PREPARE \n"); */
342 MCIMidiDev
[wDevID
].dwStatus
= MCI_MODE_PLAY
;
343 while(MCIMidiDev
[wDevID
].dwStatus
!= MCI_MODE_STOP
) {
344 printf("MIDI_mciPlay // MCIMidiDev[wDevID].dwStatus=%p %d\n",
345 &MCIMidiDev
[wDevID
].dwStatus
, MCIMidiDev
[wDevID
].dwStatus
);
346 count
= mmioRead(MCIMidiDev
[wDevID
].hFile
, lpMidiHdr
->lpData
, lpMidiHdr
->dwBufferLength
);
347 if (count
< 1) break;
348 lpMidiHdr
->dwBytesRecorded
= count
;
350 printf("MIDI_mciPlay // before MODM_LONGDATA lpMidiHdr=%08X dwBytesRecorded=%u\n",
351 lpMidiHdr
, lpMidiHdr
->dwBytesRecorded
);
353 /* dwRet = modMessage(0, MODM_LONGDATA, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR)); */
355 dwRet
= modMessage(0, MODM_UNPREPARE
, 0, (DWORD
)lpMidiHdr
, sizeof(MIDIHDR
));
356 if (lpMidiHdr
->lpData
!= NULL
) {
357 free(lpMidiHdr
->lpData
);
358 lpMidiHdr
->lpData
= NULL
;
360 MCIMidiDev
[wDevID
].dwStatus
= MCI_MODE_STOP
;
361 if (dwFlags
& MCI_NOTIFY
) {
363 printf("MIDI_mciPlay // MCI_NOTIFY_SUCCESSFUL %08X !\n", lpParms
->dwCallback
);
365 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
366 MCIMidiDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
371 return MMSYSERR_NOTENABLED
;
376 /**************************************************************************
377 * MIDI_mciRecord [internal]
379 DWORD
MIDI_mciRecord(UINT wDevID
, DWORD dwFlags
, LPMCI_RECORD_PARMS lpParms
)
387 printf("MIDI_mciRecord(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
389 if (MCIMidiDev
[wDevID
].hFile
== 0) {
390 printf("MIDI_mciRecord // can't find file='%s' !\n",
391 MCIMidiDev
[wDevID
].openParms
.lpstrElementName
);
392 return MCIERR_FILE_NOT_FOUND
;
394 start
= 1; end
= 99999;
395 if (dwFlags
& MCI_FROM
) {
396 start
= lpParms
->dwFrom
;
397 printf("MIDI_mciRecord // MCI_FROM=%d \n", start
);
399 if (dwFlags
& MCI_TO
) {
401 printf("MIDI_mciRecord // MCI_TO=%d \n", end
);
403 lpMidiHdr
= &MCIMidiDev
[wDevID
].MidiHdr
;
404 lpMidiHdr
->lpData
= (LPSTR
) malloc(64000);
405 lpMidiHdr
->dwBufferLength
= 32000;
406 lpMidiHdr
->dwUser
= 0L;
407 lpMidiHdr
->dwFlags
= 0L;
408 dwRet
= midMessage(0, MIDM_PREPARE
, 0, (DWORD
)lpMidiHdr
, sizeof(MIDIHDR
));
409 printf("MIDI_mciRecord // after MIDM_PREPARE \n");
410 MCIMidiDev
[wDevID
].dwStatus
= MCI_MODE_RECORD
;
411 while(MCIMidiDev
[wDevID
].dwStatus
!= MCI_MODE_STOP
) {
412 printf("MIDI_mciRecord // MCIMidiDev[wDevID].dwStatus=%p %d\n",
413 &MCIMidiDev
[wDevID
].dwStatus
, MCIMidiDev
[wDevID
].dwStatus
);
414 lpMidiHdr
->dwBytesRecorded
= 0;
415 dwRet
= midMessage(0, MIDM_START
, 0, 0L, 0L);
416 printf("MIDI_mciRecord // after MIDM_START lpMidiHdr=%08X dwBytesRecorded=%u\n",
417 lpMidiHdr
, lpMidiHdr
->dwBytesRecorded
);
418 if (lpMidiHdr
->dwBytesRecorded
== 0) break;
420 printf("MIDI_mciRecord // before MIDM_UNPREPARE \n");
421 dwRet
= midMessage(0, MIDM_UNPREPARE
, 0, (DWORD
)lpMidiHdr
, sizeof(MIDIHDR
));
422 printf("MIDI_mciRecord // after MIDM_UNPREPARE \n");
423 if (lpMidiHdr
->lpData
!= NULL
) {
424 free(lpMidiHdr
->lpData
);
425 lpMidiHdr
->lpData
= NULL
;
427 MCIMidiDev
[wDevID
].dwStatus
= MCI_MODE_STOP
;
428 if (dwFlags
& MCI_NOTIFY
) {
430 printf("MIDI_mciRecord // MCI_NOTIFY_SUCCESSFUL %08X !\n", lpParms
->dwCallback
);
432 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
433 MCIMidiDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
437 return MMSYSERR_NOTENABLED
;
442 /**************************************************************************
443 * MIDI_mciStop [internal]
445 DWORD
MIDI_mciStop(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
449 printf("MIDI_mciStop(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
451 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
452 MCIMidiDev
[wDevID
].dwStatus
= MCI_MODE_STOP
;
453 printf("MIDI_mciStop // MCIMidiDev[wDevID].dwStatus=%p %d\n",
454 &MCIMidiDev
[wDevID
].dwStatus
, MCIMidiDev
[wDevID
].dwStatus
);
457 return MCIERR_INTERNAL
;
462 /**************************************************************************
463 * MIDI_mciPause [internal]
465 DWORD
MIDI_mciPause(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
469 printf("MIDI_mciPause(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
471 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
474 return MCIERR_INTERNAL
;
479 /**************************************************************************
480 * MIDI_mciResume [internal]
482 DWORD
MIDI_mciResume(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
486 printf("MIDI_mciResume(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
488 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
491 return MCIERR_INTERNAL
;
496 /**************************************************************************
497 * MIDI_mciSet [internal]
499 DWORD
MIDI_mciSet(UINT wDevID
, DWORD dwFlags
, LPMCI_SET_PARMS lpParms
)
503 printf("MIDI_mciSet(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
505 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
507 printf("MIDI_mciSet // dwTimeFormat=%08X\n", lpParms
->dwTimeFormat
);
508 printf("MIDI_mciSet // dwAudio=%08X\n", lpParms
->dwAudio
);
510 if (dwFlags
& MCI_SET_TIME_FORMAT
) {
511 switch (lpParms
->dwTimeFormat
) {
512 case MCI_FORMAT_MILLISECONDS
:
513 printf("MIDI_mciSet // MCI_FORMAT_MILLISECONDS !\n");
515 case MCI_FORMAT_BYTES
:
516 printf("MIDI_mciSet // MCI_FORMAT_BYTES !\n");
518 case MCI_FORMAT_SAMPLES
:
519 printf("MIDI_mciSet // MCI_FORMAT_SAMPLES !\n");
522 printf("MIDI_mciSet // bad time format !\n");
523 return MCIERR_BAD_TIME_FORMAT
;
526 if (dwFlags
& MCI_SET_VIDEO
) return MCIERR_UNSUPPORTED_FUNCTION
;
527 if (dwFlags
& MCI_SET_DOOR_OPEN
) return MCIERR_UNSUPPORTED_FUNCTION
;
528 if (dwFlags
& MCI_SET_DOOR_CLOSED
) return MCIERR_UNSUPPORTED_FUNCTION
;
529 if (dwFlags
& MCI_SET_AUDIO
) {
530 printf("MIDI_mciSet // MCI_SET_AUDIO !\n");
532 if (dwFlags
&& MCI_SET_ON
) {
533 printf("MIDI_mciSet // MCI_SET_ON !\n");
534 if (dwFlags
&& MCI_SET_AUDIO_LEFT
) {
535 printf("MIDI_mciSet // MCI_SET_AUDIO_LEFT !\n");
537 if (dwFlags
&& MCI_SET_AUDIO_RIGHT
) {
538 printf("MIDI_mciSet // MCI_SET_AUDIO_RIGHT !\n");
541 if (dwFlags
& MCI_SET_OFF
) {
542 printf("MIDI_mciSet // MCI_SET_OFF !\n");
544 if (dwFlags
& MCI_SEQ_SET_MASTER
) {
545 printf("MIDI_mciSet // MCI_SEQ_SET_MASTER !\n");
547 if (dwFlags
& MCI_SEQ_SET_SLAVE
) {
548 printf("MIDI_mciSet // MCI_SEQ_SET_SLAVE !\n");
550 if (dwFlags
& MCI_SEQ_SET_OFFSET
) {
551 printf("MIDI_mciSet // MCI_SEQ_SET_OFFSET !\n");
553 if (dwFlags
& MCI_SEQ_SET_PORT
) {
554 printf("MIDI_mciSet // MCI_SEQ_SET_PORT !\n");
556 if (dwFlags
& MCI_SEQ_SET_TEMPO
) {
557 printf("MIDI_mciSet // MCI_SEQ_SET_TEMPO !\n");
561 return MCIERR_INTERNAL
;
566 /**************************************************************************
567 * MIDI_mciStatus [internal]
569 DWORD
MIDI_mciStatus(UINT wDevID
, DWORD dwFlags
, LPMCI_STATUS_PARMS lpParms
)
573 printf("MIDI_mciStatus(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
575 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
576 if (dwFlags
& MCI_STATUS_ITEM
) {
577 switch(lpParms
->dwItem
) {
578 case MCI_STATUS_CURRENT_TRACK
:
579 lpParms
->dwReturn
= 1;
581 case MCI_STATUS_LENGTH
:
582 lpParms
->dwReturn
= 5555;
583 if (dwFlags
& MCI_TRACK
) {
584 lpParms
->dwTrack
= 1;
585 lpParms
->dwReturn
= 2222;
588 case MCI_STATUS_MODE
:
589 lpParms
->dwReturn
= MCI_MODE_STOP
;
591 case MCI_STATUS_MEDIA_PRESENT
:
592 printf("MIDI_mciStatus // MCI_STATUS_MEDIA_PRESENT !\n");
593 lpParms
->dwReturn
= TRUE
;
595 case MCI_STATUS_NUMBER_OF_TRACKS
:
596 lpParms
->dwReturn
= 1;
598 case MCI_STATUS_POSITION
:
599 lpParms
->dwReturn
= 3333;
600 if (dwFlags
& MCI_STATUS_START
) {
603 if (dwFlags
& MCI_TRACK
) {
604 lpParms
->dwTrack
= 1;
605 lpParms
->dwReturn
= 777;
608 case MCI_STATUS_READY
:
609 printf("MIDI_mciStatus // MCI_STATUS_READY !\n");
610 lpParms
->dwReturn
= TRUE
;
612 case MCI_STATUS_TIME_FORMAT
:
613 printf("MIDI_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
614 lpParms
->dwReturn
= MCI_FORMAT_MILLISECONDS
;
616 case MCI_SEQ_STATUS_DIVTYPE
:
617 printf("MIDI_mciStatus // MCI_SEQ_STATUS_DIVTYPE !\n");
618 lpParms
->dwReturn
= 0;
620 case MCI_SEQ_STATUS_MASTER
:
621 printf("MIDI_mciStatus // MCI_SEQ_STATUS_MASTER !\n");
622 lpParms
->dwReturn
= 0;
624 case MCI_SEQ_STATUS_SLAVE
:
625 printf("MIDI_mciStatus // MCI_SEQ_STATUS_SLAVE !\n");
626 lpParms
->dwReturn
= 0;
628 case MCI_SEQ_STATUS_OFFSET
:
629 printf("MIDI_mciStatus // MCI_SEQ_STATUS_OFFSET !\n");
630 lpParms
->dwReturn
= 0;
632 case MCI_SEQ_STATUS_PORT
:
633 printf("MIDI_mciStatus // MCI_SEQ_STATUS_PORT !\n");
634 lpParms
->dwReturn
= 0;
636 case MCI_SEQ_STATUS_TEMPO
:
637 printf("MIDI_mciStatus // MCI_SEQ_STATUS_TEMPO !\n");
638 lpParms
->dwReturn
= 0;
641 printf("MIDI_mciStatus // unknowm command %04X !\n", lpParms
->dwItem
);
642 return MCIERR_UNRECOGNIZED_COMMAND
;
645 if (dwFlags
& MCI_NOTIFY
) {
646 printf("MIDI_mciStatus // MCI_NOTIFY_SUCCESSFUL %08X !\n", lpParms
->dwCallback
);
647 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
648 MCIMidiDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
652 return MCIERR_INTERNAL
;
656 /**************************************************************************
657 * MIDI_mciGetDevCaps [internal]
659 DWORD
MIDI_mciGetDevCaps(UINT wDevID
, DWORD dwFlags
,
660 LPMCI_GETDEVCAPS_PARMS lpParms
)
663 printf("MIDI_mciGetDevCaps(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
664 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
665 if (dwFlags
& MCI_GETDEVCAPS_ITEM
) {
666 switch(lpParms
->dwItem
) {
667 case MCI_GETDEVCAPS_CAN_RECORD
:
668 lpParms
->dwReturn
= TRUE
;
670 case MCI_GETDEVCAPS_HAS_AUDIO
:
671 lpParms
->dwReturn
= TRUE
;
673 case MCI_GETDEVCAPS_HAS_VIDEO
:
674 lpParms
->dwReturn
= FALSE
;
676 case MCI_GETDEVCAPS_DEVICE_TYPE
:
677 lpParms
->dwReturn
= MCI_DEVTYPE_SEQUENCER
;
679 case MCI_GETDEVCAPS_USES_FILES
:
680 lpParms
->dwReturn
= TRUE
;
682 case MCI_GETDEVCAPS_COMPOUND_DEVICE
:
683 lpParms
->dwReturn
= TRUE
;
685 case MCI_GETDEVCAPS_CAN_EJECT
:
686 lpParms
->dwReturn
= FALSE
;
688 case MCI_GETDEVCAPS_CAN_PLAY
:
689 lpParms
->dwReturn
= TRUE
;
691 case MCI_GETDEVCAPS_CAN_SAVE
:
692 lpParms
->dwReturn
= FALSE
;
695 return MCIERR_UNRECOGNIZED_COMMAND
;
700 return MCIERR_INTERNAL
;
704 /**************************************************************************
705 * MIDI_mciInfo [internal]
707 DWORD
MIDI_mciInfo(UINT wDevID
, DWORD dwFlags
, LPMCI_INFO_PARMS lpParms
)
710 printf("MIDI_mciInfo(%u, %08X, %08X);\n", wDevID
, dwFlags
, lpParms
);
711 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
712 lpParms
->lpstrReturn
= NULL
;
714 case MCI_INFO_PRODUCT
:
715 lpParms
->lpstrReturn
= "Linux Sound System 0.5";
718 lpParms
->lpstrReturn
= "FileName";
721 return MCIERR_UNRECOGNIZED_COMMAND
;
723 if (lpParms
->lpstrReturn
!= NULL
)
724 lpParms
->dwRetSize
= strlen(lpParms
->lpstrReturn
);
726 lpParms
->dwRetSize
= 0;
729 return MCIERR_INTERNAL
;
734 /*-----------------------------------------------------------------------*/
737 /**************************************************************************
738 * midGetDevCaps [internal]
740 DWORD
midGetDevCaps(WORD wDevID
, LPMIDIINCAPS lpCaps
, DWORD dwSize
)
742 printf("midGetDevCaps(%u, %08X, %08X);\n", wDevID
, lpCaps
, dwSize
);
743 return MMSYSERR_NOTENABLED
;
746 /**************************************************************************
749 DWORD
midOpen(WORD wDevID
, LPMIDIOPENDESC lpDesc
, DWORD dwFlags
)
751 printf("modOpen(%u, %08X, %08X);\n", wDevID
, lpDesc
, dwFlags
);
752 return MMSYSERR_NOTENABLED
;
755 /**************************************************************************
756 * midClose [internal]
758 DWORD
midClose(WORD wDevID
)
760 printf("midClose(%u);\n", wDevID
);
761 return MMSYSERR_NOTENABLED
;
764 /**************************************************************************
765 * midAddBuffer [internal]
767 DWORD
midAddBuffer(WORD wDevID
, LPMIDIHDR lpMidiHdr
, DWORD dwSize
)
769 printf("midAddBuffer(%u, %08X, %08X);\n", wDevID
, lpMidiHdr
, dwSize
);
770 return MMSYSERR_NOTENABLED
;
773 /**************************************************************************
774 * midPrepare [internal]
776 DWORD
midPrepare(WORD wDevID
, LPMIDIHDR lpMidiHdr
, DWORD dwSize
)
778 printf("midPrepare(%u, %08X, %08X);\n", wDevID
, lpMidiHdr
, dwSize
);
779 return MMSYSERR_NOTENABLED
;
782 /**************************************************************************
783 * midUnprepare [internal]
785 DWORD
midUnprepare(WORD wDevID
, LPMIDIHDR lpMidiHdr
, DWORD dwSize
)
787 printf("midUnprepare(%u, %08X, %08X);\n", wDevID
, lpMidiHdr
, dwSize
);
788 return MMSYSERR_NOTENABLED
;
791 /**************************************************************************
792 * midReset [internal]
794 DWORD
midReset(WORD wDevID
)
796 printf("midReset(%u);\n", wDevID
);
797 return MMSYSERR_NOTENABLED
;
801 /**************************************************************************
802 * midStart [internal]
804 DWORD
midStart(WORD wDevID
)
806 printf("midStart(%u);\n", wDevID
);
807 return MMSYSERR_NOTENABLED
;
811 /**************************************************************************
814 DWORD
midStop(WORD wDevID
)
816 printf("midStop(%u);\n", wDevID
);
817 return MMSYSERR_NOTENABLED
;
821 /**************************************************************************
822 * midMessage [sample driver]
824 DWORD
midMessage(WORD wDevID
, WORD wMsg
, DWORD dwUser
,
825 DWORD dwParam1
, DWORD dwParam2
)
827 printf("midMessage(%u, %04X, %08X, %08X, %08X);\n",
828 wDevID
, wMsg
, dwUser
, dwParam1
, dwParam2
);
831 return midOpen(wDevID
, (LPMIDIOPENDESC
)dwParam1
, dwParam2
);
833 return midClose(wDevID
);
835 return midAddBuffer(wDevID
, (LPMIDIHDR
)dwParam1
, dwParam2
);
837 return midPrepare(wDevID
, (LPMIDIHDR
)dwParam1
, dwParam2
);
839 return midUnprepare(wDevID
, (LPMIDIHDR
)dwParam1
, dwParam2
);
840 case MIDM_GETDEVCAPS
:
841 return midGetDevCaps(wDevID
, (LPMIDIINCAPS
)dwParam1
, dwParam2
);
842 case MIDM_GETNUMDEVS
:
845 return midReset(wDevID
);
847 return midStart(wDevID
);
849 return midStop(wDevID
);
851 return MMSYSERR_NOTSUPPORTED
;
856 /*-----------------------------------------------------------------------*/
859 /**************************************************************************
860 * modGetDevCaps [internal]
862 DWORD
modGetDevCaps(WORD wDevID
, LPMIDIOUTCAPS lpCaps
, DWORD dwSize
)
864 printf("modGetDevCaps(%u, %08X, %08X);\n", wDevID
, lpCaps
, dwSize
);
865 return MMSYSERR_NOTENABLED
;
869 /**************************************************************************
872 DWORD
modOpen(WORD wDevID
, LPMIDIOPENDESC lpDesc
, DWORD dwFlags
)
874 printf("modOpen(%u, %08X, %08X);\n", wDevID
, lpDesc
, dwFlags
);
875 return MMSYSERR_NOTENABLED
;
879 /**************************************************************************
880 * modClose [internal]
882 DWORD
modClose(WORD wDevID
)
884 printf("modClose(%u);\n", wDevID
);
885 return MMSYSERR_NOTENABLED
;
888 /**************************************************************************
891 DWORD
modData(WORD wDevID
, LPMIDIHDR lpMidiHdr
, DWORD dwSize
)
893 printf("modData(%u, %08X, %08X);\n", wDevID
, lpMidiHdr
, dwSize
);
894 return MMSYSERR_NOTENABLED
;
897 /**************************************************************************
898 * modLongData [internal]
900 DWORD
modLongData(WORD wDevID
, LPMIDIHDR lpMidiHdr
, DWORD dwSize
)
902 printf("modLongData(%u, %08X, %08X);\n", wDevID
, lpMidiHdr
, dwSize
);
903 return MMSYSERR_NOTENABLED
;
906 /**************************************************************************
907 * modPrepare [internal]
909 DWORD
modPrepare(WORD wDevID
, LPMIDIHDR lpMidiHdr
, DWORD dwSize
)
911 printf("modPrepare(%u, %08X, %08X);\n", wDevID
, lpMidiHdr
, dwSize
);
912 return MMSYSERR_NOTENABLED
;
915 /**************************************************************************
916 * modUnprepare [internal]
918 DWORD
modUnprepare(WORD wDevID
, LPMIDIHDR lpMidiHdr
, DWORD dwSize
)
920 printf("modUnprepare(%u, %08X, %08X);\n", wDevID
, lpMidiHdr
, dwSize
);
921 return MMSYSERR_NOTENABLED
;
924 /**************************************************************************
925 * modReset [internal]
927 DWORD
modReset(WORD wDevID
)
929 printf("modReset(%u);\n", wDevID
);
930 return MMSYSERR_NOTENABLED
;
934 /**************************************************************************
935 * modGetPosition [internal]
937 DWORD
modGetPosition(WORD wDevID
, LPMMTIME lpTime
, DWORD uSize
)
939 printf("modGetposition(%u, %08X, %08X);\n", wDevID
, lpTime
, uSize
);
940 return MMSYSERR_NOTENABLED
;
944 /**************************************************************************
945 * modMessage [sample driver]
947 DWORD
modMessage(WORD wDevID
, WORD wMsg
, DWORD dwUser
,
948 DWORD dwParam1
, DWORD dwParam2
)
950 printf("modMessage(%u, %04X, %08X, %08X, %08X);\n",
951 wDevID
, wMsg
, dwUser
, dwParam1
, dwParam2
);
954 return modOpen(wDevID
, (LPMIDIOPENDESC
)dwParam1
, dwParam2
);
956 return modClose(wDevID
);
958 return modData(wDevID
, (LPMIDIHDR
)dwParam1
, dwParam2
);
960 return modLongData(wDevID
, (LPMIDIHDR
)dwParam1
, dwParam2
);
962 return modPrepare(wDevID
, (LPMIDIHDR
)dwParam1
, dwParam2
);
964 return modUnprepare(wDevID
, (LPMIDIHDR
)dwParam1
, dwParam2
);
965 case MODM_GETDEVCAPS
:
966 return modGetDevCaps(wDevID
, (LPMIDIOUTCAPS
)dwParam1
, dwParam2
);
967 case MODM_GETNUMDEVS
:
974 return modReset(wDevID
);
976 return MMSYSERR_NOTSUPPORTED
;
980 /*-----------------------------------------------------------------------*/
983 #endif /* #ifdef BUILTIN_MMSYSTEM */