Make it (almost) 32 bit only.
Reflected creation of WINEOSS module.
No longer using ERR when no MIDI card is present.
diff --git a/multimedia/midi.c b/multimedia/midi.c
index a40d39f..1142e53 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -35,7 +35,7 @@
DWORD bufsize;
LPMIDIOPENDESC midiDesc;
WORD wFlags;
- LPMIDIHDR16 lpQueueHdr;
+ LPMIDIHDR lpQueueHdr;
DWORD dwTotalPlayed;
unsigned char incoming[3];
unsigned char incPrev;
@@ -48,7 +48,7 @@
DWORD bufsize;
LPMIDIOPENDESC midiDesc;
WORD wFlags;
- LPMIDIHDR16 lpQueueHdr;
+ LPMIDIHDR lpQueueHdr;
DWORD dwTotalPlayed;
void* lpExtra; /* according to port type (MIDI, FM...), extra data when needed */
} WINE_MIDIOUT;
@@ -76,13 +76,12 @@
/* this structure holds pointers with information for each MIDI
* out device found.
*/
-static LPMIDIOUTCAPS16 midiOutDevices[MAX_MIDIOUTDRV];
+static LPMIDIOUTCAPSA midiOutDevices[MAX_MIDIOUTDRV];
/* this structure holds pointers with information for each MIDI
* in device found.
*/
-static LPMIDIINCAPS16 midiInDevices [MAX_MIDIINDRV];
-#endif
+static LPMIDIINCAPSA midiInDevices [MAX_MIDIINDRV];
/*
* FIXME : all tests on device ID for midXXX and modYYY are made against
@@ -94,8 +93,6 @@
* Low level MIDI implementation *
*======================================================================*/
-#ifdef HAVE_OSS_MIDI
-
static int midiOpenSeq(void);
static int midiCloseSeq(void);
@@ -128,23 +125,24 @@
}
return MOD_FMSYNTH;
}
-#endif
/**************************************************************************
* OSS_MidiInit [internal]
*
* Initializes the MIDI devices information variables
- *
*/
-/* FIXME: this function shall be moved to the OSS drivers DLL entry point */
-BOOL OSS_MidiInit(void)
+static BOOL OSS_MidiInit(void)
{
-#ifdef HAVE_OSS_MIDI
int i, status, numsynthdevs = 255, nummididevs = 255;
struct synth_info sinfo;
struct midi_info minfo;
-
+ static BOOL bInitDone = FALSE;
+
+ if (bInitDone)
+ return TRUE;
+
TRACE("Initializing the MIDI variables.\n");
+ bInitDone = TRUE;
/* try to open device */
if (midiOpenSeq() == -1) {
@@ -167,7 +165,7 @@
}
for (i = 0; i < numsynthdevs; i++) {
- LPMIDIOUTCAPS16 tmplpCaps;
+ LPMIDIOUTCAPSA tmplpCaps;
sinfo.device = i;
status = ioctl(midiSeqFD, SNDCTL_SYNTH_INFO, &sinfo);
@@ -177,7 +175,7 @@
return TRUE;
}
- tmplpCaps = HeapAlloc(SystemHeap, 0, sizeof(MIDIOUTCAPS16));
+ tmplpCaps = HeapAlloc(SystemHeap, 0, sizeof(MIDIOUTCAPSA));
if (!tmplpCaps)
break;
/* We also have the information sinfo.synth_subtype, not used here
@@ -245,8 +243,8 @@
}
for (i = 0; i < nummididevs; i++) {
- LPMIDIOUTCAPS16 tmplpOutCaps;
- LPMIDIINCAPS16 tmplpInCaps;
+ LPMIDIOUTCAPSA tmplpOutCaps;
+ LPMIDIINCAPSA tmplpInCaps;
minfo.device = i;
status = ioctl(midiSeqFD, SNDCTL_MIDI_INFO, &minfo);
@@ -256,7 +254,7 @@
return TRUE;
}
- tmplpOutCaps = HeapAlloc(SystemHeap, 0, sizeof(MIDIOUTCAPS16));
+ tmplpOutCaps = HeapAlloc(SystemHeap, 0, sizeof(MIDIOUTCAPSA));
if (!tmplpOutCaps)
break;
/* This whole part is somewhat obscure to me. I'll keep trying to dig
@@ -282,7 +280,7 @@
midiOutDevices[numsynthdevs + i] = tmplpOutCaps;
- tmplpInCaps = HeapAlloc(SystemHeap, 0, sizeof(MIDIOUTCAPS16));
+ tmplpInCaps = HeapAlloc(SystemHeap, 0, sizeof(MIDIOUTCAPSA));
if (!tmplpInCaps)
break;
/* This whole part is somewhat obscure to me. I'll keep trying to dig
@@ -319,22 +317,19 @@
/* close file and exit */
midiCloseSeq();
-#endif /* HAVE_OSS_MIDI */
return TRUE;
}
-#ifdef HAVE_OSS_MIDI
-
/**************************************************************************
* MIDI_NotifyClient [internal]
*/
-static DWORD MIDI_NotifyClient(UINT16 wDevID, WORD wMsg,
+static DWORD MIDI_NotifyClient(UINT wDevID, WORD wMsg,
DWORD dwParam1, DWORD dwParam2)
{
DWORD dwCallBack;
- UINT16 uFlags;
- HANDLE16 hDev;
+ UINT uFlags;
+ HANDLE hDev;
DWORD dwInstance;
TRACE("wDevID = %04X wMsg = %d dwParm1 = %04lX dwParam2 = %04lX\n",
@@ -370,7 +365,7 @@
return MCIERR_INTERNAL;
}
- return DriverCallback16(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2) ?
+ return DriverCallback(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2) ?
0 : MCIERR_INTERNAL;
}
@@ -382,7 +377,12 @@
if (numOpenMidiSeq == 0) {
midiSeqFD = open(MIDI_SEQ, O_RDWR, 0);
if (midiSeqFD == -1) {
- ERR("can't open '%s' ! (%d)\n", MIDI_SEQ, errno);
+ /* don't bark when we're facing a config without midi driver available */
+ if (errno != ENODEV && errno != ENXIO) {
+ ERR("can't open '%s' ! (%d)\n", MIDI_SEQ, errno);
+ } else {
+ TRACE("No midi device present\n");
+ }
return -1;
}
if (fcntl(midiSeqFD, F_SETFL, O_NONBLOCK) < 0) {
@@ -449,7 +449,7 @@
}
if (MidiInDev[wDevID].state & 2) { /* system exclusive */
- LPMIDIHDR16 lpMidiHdr = MidiInDev[wDevID].lpQueueHdr;
+ LPMIDIHDR lpMidiHdr = MidiInDev[wDevID].lpQueueHdr;
WORD sbfb = FALSE;
if (lpMidiHdr) {
@@ -469,7 +469,7 @@
lpMidiHdr = MidiInDev[wDevID].lpQueueHdr;
lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
lpMidiHdr->dwFlags |= MHDR_DONE;
- MidiInDev[wDevID].lpQueueHdr = (LPMIDIHDR16)lpMidiHdr->lpNext;
+ MidiInDev[wDevID].lpQueueHdr = (LPMIDIHDR)lpMidiHdr->lpNext;
if (MIDI_NotifyClient(wDevID, MIM_LONGDATA, (DWORD)lpMidiHdr->reserved, dwTime) != MMSYSERR_NOERROR) {
WARN("Couldn't notify client\n");
}
@@ -586,9 +586,9 @@
/**************************************************************************
* midGetDevCaps [internal]
*/
-static DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPS16 lpCaps, DWORD dwSize)
+static DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPSA lpCaps, DWORD dwSize)
{
- LPMIDIINCAPS16 tmplpCaps;
+ LPMIDIINCAPSA tmplpCaps;
TRACE("(%04X, %p, %08lX);\n", wDevID, lpCaps, dwSize);
@@ -604,10 +604,10 @@
lpCaps->wPid = tmplpCaps->wPid;
lpCaps->vDriverVersion = tmplpCaps->vDriverVersion;
strcpy(lpCaps->szPname, tmplpCaps->szPname);
- if (dwSize == sizeof(MIDIINCAPS16)) {
+ if (dwSize == sizeof(MIDIINCAPSA)) {
/* we should run win 95, so make use of dwSupport */
lpCaps->dwSupport = tmplpCaps->dwSupport;
- } else if (dwSize != sizeof(MIDIINCAPS16) - sizeof(DWORD)) {
+ } else if (dwSize != sizeof(MIDIINCAPSA) - sizeof(DWORD)) {
TRACE("bad size for lpCaps\n");
return MMSYSERR_INVALPARAM;
}
@@ -720,12 +720,12 @@
/**************************************************************************
* midAddBuffer [internal]
*/
-static DWORD midAddBuffer(WORD wDevID, LPMIDIHDR16 lpMidiHdr, DWORD dwSize)
+static DWORD midAddBuffer(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
TRACE("(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
if (lpMidiHdr == NULL) return MMSYSERR_INVALPARAM;
- if (sizeof(MIDIHDR16) > dwSize) return MMSYSERR_INVALPARAM;
+ if (sizeof(MIDIHDR) > dwSize) return MMSYSERR_INVALPARAM;
if (lpMidiHdr->dwBufferLength == 0) return MMSYSERR_INVALPARAM;
if (lpMidiHdr->dwFlags & MHDR_INQUEUE) return MIDIERR_STILLPLAYING;
if (!(lpMidiHdr->dwFlags & MHDR_PREPARED)) return MIDIERR_UNPREPARED;
@@ -733,11 +733,11 @@
if (MidiInDev[wDevID].lpQueueHdr == 0) {
MidiInDev[wDevID].lpQueueHdr = lpMidiHdr;
} else {
- LPMIDIHDR16 ptr;
+ LPMIDIHDR ptr;
for (ptr = MidiInDev[wDevID].lpQueueHdr;
ptr->lpNext != 0;
- ptr = (LPMIDIHDR16)ptr->lpNext);
+ ptr = (LPMIDIHDR)ptr->lpNext);
ptr->lpNext = (struct midihdr_tag*)lpMidiHdr;
}
return MMSYSERR_NOERROR;
@@ -746,11 +746,11 @@
/**************************************************************************
* midPrepare [internal]
*/
-static DWORD midPrepare(WORD wDevID, LPMIDIHDR16 lpMidiHdr, DWORD dwSize)
+static DWORD midPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
TRACE("(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
- if (dwSize < sizeof(MIDIHDR16) || lpMidiHdr == 0 ||
+ if (dwSize < sizeof(MIDIHDR) || lpMidiHdr == 0 ||
lpMidiHdr->lpData == 0 || lpMidiHdr->dwFlags != 0 ||
lpMidiHdr->dwBufferLength >= 0x10000ul)
return MMSYSERR_INVALPARAM;
@@ -765,11 +765,11 @@
/**************************************************************************
* midUnprepare [internal]
*/
-static DWORD midUnprepare(WORD wDevID, LPMIDIHDR16 lpMidiHdr, DWORD dwSize)
+static DWORD midUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
TRACE("(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
- if (dwSize < sizeof(MIDIHDR16) || lpMidiHdr == 0 ||
+ if (dwSize < sizeof(MIDIHDR) || lpMidiHdr == 0 ||
lpMidiHdr->lpData == 0 || lpMidiHdr->dwBufferLength >= 0x10000ul)
return MMSYSERR_INVALPARAM;
@@ -798,7 +798,7 @@
(DWORD)MidiInDev[wDevID].lpQueueHdr, dwTime) != MMSYSERR_NOERROR) {
WARN("Couldn't notify client\n");
}
- MidiInDev[wDevID].lpQueueHdr = (LPMIDIHDR16)MidiInDev[wDevID].lpQueueHdr->lpNext;
+ MidiInDev[wDevID].lpQueueHdr = (LPMIDIHDR)MidiInDev[wDevID].lpQueueHdr->lpNext;
}
return MMSYSERR_NOERROR;
@@ -948,7 +948,7 @@
/**************************************************************************
* modGetDevCaps [internal]
*/
-static DWORD modGetDevCaps(WORD wDevID, LPMIDIOUTCAPS16 lpCaps,
+static DWORD modGetDevCaps(WORD wDevID, LPMIDIOUTCAPSA lpCaps,
DWORD dwSize)
{
TRACE("(%04X, %p, %08lX);\n", wDevID, lpCaps, dwSize);
@@ -964,7 +964,7 @@
/* FIXME Does it make any difference ? */
lpCaps->dwSupport = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME;
} else {
- LPMIDIOUTCAPS16 tmplpCaps;
+ LPMIDIOUTCAPSA tmplpCaps;
if (wDevID >= MODM_NUMDEVS) {
TRACE("MAX_MIDIOUTDRV reached !\n");
@@ -1406,7 +1406,7 @@
/**************************************************************************
* modLongData [internal]
*/
-static DWORD modLongData(WORD wDevID, LPMIDIHDR16 lpMidiHdr, DWORD dwSize)
+static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
int count;
LPBYTE lpData;
@@ -1484,7 +1484,7 @@
/**************************************************************************
* modPrepare [internal]
*/
-static DWORD modPrepare(WORD wDevID, LPMIDIHDR16 lpMidiHdr, DWORD dwSize)
+static DWORD modPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
TRACE("(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
@@ -1497,11 +1497,11 @@
* asks to prepare MIDIHDR which dwFlags != 0.
* So at least check for the inqueue flag
*/
- if (dwSize < sizeof(MIDIHDR16) || lpMidiHdr == 0 ||
+ if (dwSize < sizeof(MIDIHDR) || lpMidiHdr == 0 ||
lpMidiHdr->lpData == 0 || (lpMidiHdr->dwFlags & MHDR_INQUEUE) != 0 ||
lpMidiHdr->dwBufferLength >= 0x10000ul) {
WARN("%p %p %08lx %d/%ld\n", lpMidiHdr, lpMidiHdr->lpData,
- lpMidiHdr->dwFlags, sizeof(MIDIHDR16), dwSize);
+ lpMidiHdr->dwFlags, sizeof(MIDIHDR), dwSize);
return MMSYSERR_INVALPARAM;
}
@@ -1514,7 +1514,7 @@
/**************************************************************************
* modUnprepare [internal]
*/
-static DWORD modUnprepare(WORD wDevID, LPMIDIHDR16 lpMidiHdr, DWORD dwSize)
+static DWORD modUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
TRACE("(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
@@ -1523,7 +1523,7 @@
return MMSYSERR_NOTENABLED;
}
- if (dwSize < sizeof(MIDIHDR16) || lpMidiHdr == 0)
+ if (dwSize < sizeof(MIDIHDR) || lpMidiHdr == 0)
return MMSYSERR_INVALPARAM;
if (lpMidiHdr->dwFlags & MHDR_INQUEUE)
return MIDIERR_STILLPLAYING;
@@ -1536,12 +1536,22 @@
*/
static DWORD modReset(WORD wDevID)
{
+ unsigned chn;
+
TRACE("(%04X);\n", wDevID);
- /* FIXME: this function should :
- * turn off every note, remove sustain on all channels
- * remove any pending buffers
+
+ /* stop all notes */
+ /* FIXME: check if 0x78B0 is channel dependant or not. I coded it so that
+ * it's channel dependent...
*/
- return MMSYSERR_NOTENABLED;
+ for (chn = 0; chn < 16; chn++) {
+ /* turn off every note */
+ modData(wDevID, 0x7800 | MIDI_CTL_CHANGE | chn);
+ /* remove sustain on all channels */
+ modData(wDevID, (CTL_SUSTAIN << 8) | MIDI_CTL_CHANGE | chn);
+ }
+ /* FIXME: the LongData buffers must also be returned to the app */
+ return MMSYSERR_NOERROR;
}
#endif /* HAVE_OSS_MIDI */
@@ -1551,27 +1561,35 @@
*======================================================================*/
/**************************************************************************
- * midMessage [sample driver]
+ * OSS_midMessage [sample driver]
*/
-DWORD WINAPI midMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
- DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_midMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
+ DWORD dwParam1, DWORD dwParam2)
{
TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
switch (wMsg) {
#ifdef HAVE_OSS_MIDI
+ case DRVM_INIT:
+ OSS_MidiInit();
+ /* fall thru */
+ case DRVM_EXIT:
+ case DRVM_ENABLE:
+ case DRVM_DISABLE:
+ /* FIXME: Pretend this is supported */
+ return 0;
case MIDM_OPEN:
- return midOpen(wDevID,(LPMIDIOPENDESC)dwParam1, dwParam2);
+ return midOpen(wDevID, (LPMIDIOPENDESC)dwParam1, dwParam2);
case MIDM_CLOSE:
return midClose(wDevID);
case MIDM_ADDBUFFER:
- return midAddBuffer(wDevID,(LPMIDIHDR16)dwParam1, dwParam2);
+ return midAddBuffer(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
case MIDM_PREPARE:
- return midPrepare(wDevID,(LPMIDIHDR16)dwParam1, dwParam2);
+ return midPrepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
case MIDM_UNPREPARE:
- return midUnprepare(wDevID,(LPMIDIHDR16)dwParam1, dwParam2);
+ return midUnprepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
case MIDM_GETDEVCAPS:
- return midGetDevCaps(wDevID,(LPMIDIINCAPS16)dwParam1,dwParam2);
+ return midGetDevCaps(wDevID, (LPMIDIINCAPSA)dwParam1,dwParam2);
case MIDM_GETNUMDEVS:
return MIDM_NUMDEVS;
case MIDM_RESET:
@@ -1588,16 +1606,24 @@
}
/**************************************************************************
- * modMessage [sample driver]
+ * OSS_modMessage [sample driver]
*/
-DWORD WINAPI modMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
- DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_modMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
+ DWORD dwParam1, DWORD dwParam2)
{
TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
switch (wMsg) {
#ifdef HAVE_OSS_MIDI
+ case DRVM_INIT:
+ OSS_MidiInit();
+ /* fall thru */
+ case DRVM_EXIT:
+ case DRVM_ENABLE:
+ case DRVM_DISABLE:
+ /* FIXME: Pretend this is supported */
+ return 0;
case MODM_OPEN:
return modOpen(wDevID, (LPMIDIOPENDESC)dwParam1, dwParam2);
case MODM_CLOSE:
@@ -1605,13 +1631,13 @@
case MODM_DATA:
return modData(wDevID, dwParam1);
case MODM_LONGDATA:
- return modLongData(wDevID, (LPMIDIHDR16)dwParam1, dwParam2);
+ return modLongData(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
case MODM_PREPARE:
- return modPrepare(wDevID, (LPMIDIHDR16)dwParam1, dwParam2);
+ return modPrepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
case MODM_UNPREPARE:
- return modUnprepare(wDevID, (LPMIDIHDR16)dwParam1, dwParam2);
+ return modUnprepare(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
case MODM_GETDEVCAPS:
- return modGetDevCaps(wDevID, (LPMIDIOUTCAPS16)dwParam1, dwParam2);
+ return modGetDevCaps(wDevID, (LPMIDIOUTCAPSA)dwParam1, dwParam2);
case MODM_GETNUMDEVS:
return MODM_NUMDEVS;
case MODM_GETVOLUME:
@@ -1627,50 +1653,4 @@
return MMSYSERR_NOTSUPPORTED;
}
-/**************************************************************************
- * MIDI_DriverProc32 [sample driver]
- */
-LONG CALLBACK MIDI_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
- DWORD dwParam1, DWORD dwParam2)
-{
- switch (wMsg) {
- case DRV_LOAD: return 1;
- case DRV_FREE: return 1;
- case DRV_OPEN: return 1;
- case DRV_CLOSE: return 1;
- case DRV_ENABLE: return 1;
- case DRV_DISABLE: return 1;
- case DRV_QUERYCONFIGURE: return 1;
- case DRV_CONFIGURE: MessageBoxA(0, "Sample Midi Linux Driver !", "MMLinux Driver", MB_OK); return 1;
- case DRV_INSTALL: return DRVCNF_RESTART;
- case DRV_REMOVE: return DRVCNF_RESTART;
- default:
- TRACE("Sending msg=%lu to default driver proc\n", wMsg);
- return DefDriverProc16(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
- }
-}
-
-/**************************************************************************
- * MIDI_DriverProc16 [sample driver]
- */
-LONG CALLBACK MIDI_DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
- DWORD dwParam1, DWORD dwParam2)
-{
- switch (wMsg) {
- case DRV_LOAD: return 1;
- case DRV_FREE: return 1;
- case DRV_OPEN: return 1;
- case DRV_CLOSE: return 1;
- case DRV_ENABLE: return 1;
- case DRV_DISABLE: return 1;
- case DRV_QUERYCONFIGURE: return 1;
- case DRV_CONFIGURE: MessageBoxA(0, "Sample Midi Linux Driver !", "MMLinux Driver", MB_OK); return 1;
- case DRV_INSTALL: return DRVCNF_RESTART;
- case DRV_REMOVE: return DRVCNF_RESTART;
- default:
- TRACE("Sending msg=%u to default driver proc\n", wMsg);
- return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
- }
-}
-
/*-----------------------------------------------------------------------*/