static DWORD modClose(MIDIMAPDATA* mom) { UINT i; DWORD ret = MMSYSERR_NOERROR; if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; for (i = 0; i < 16; i++) { DWORD t; if (mom->ChannelMap[i] && mom->ChannelMap[i]->loaded > 0) { t = midiOutClose(mom->ChannelMap[i]->hMidi); if (t == MMSYSERR_NOERROR) { mom->ChannelMap[i]->loaded = 0; mom->ChannelMap[i]->hMidi = 0; } else if (ret == MMSYSERR_NOERROR) ret = t; } } if (ret == MMSYSERR_NOERROR) HeapFree(GetProcessHeap(), 0, mom); return ret; }
static DWORD modUnprepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD dwParam2) { if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; if ((lpMidiHdr->dwFlags & MHDR_ISSTRM) || !(lpMidiHdr->dwFlags & MHDR_PREPARED)) return MMSYSERR_INVALPARAM; lpMidiHdr->dwFlags &= ~MHDR_PREPARED; return MMSYSERR_NOERROR; }
static DWORD modPrepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2) { if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; if (lpMidiHdr->dwFlags & (MHDR_ISSTRM|MHDR_PREPARED)) return MMSYSERR_INVALPARAM; lpMidiHdr->dwFlags |= MHDR_PREPARED; return MMSYSERR_NOERROR; }
static DWORD modReset(MIDIMAPDATA* mom) { WORD chn; DWORD ret = MMSYSERR_NOERROR; if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; for (chn = 0; chn < 16; chn++) { if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0) { ret = midiOutReset(mom->ChannelMap[chn]->hMidi); if (ret != MMSYSERR_NOERROR) break; } } return ret; }
static DWORD modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD dwParam2) { WORD chn; DWORD ret = MMSYSERR_NOERROR; MIDIHDR mh; if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; mh = *lpMidiHdr; for (chn = 0; chn < 16; chn++) { if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0) { mh.dwFlags = 0; midiOutPrepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); ret = midiOutLongMsg(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); midiOutUnprepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); if (ret != MMSYSERR_NOERROR) break; } } return ret; }
static DWORD modData(MIDIMAPDATA* mom, DWORD dwParam) { BYTE lb = LOBYTE(LOWORD(dwParam)); WORD chn = lb & 0x0F; DWORD ret = MMSYSERR_NOERROR; if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; if (!mom->ChannelMap[chn]) return MMSYSERR_NOERROR; switch (lb & 0xF0) { case 0x80: case 0x90: case 0xA0: case 0xB0: case 0xC0: case 0xD0: case 0xE0: if (mom->ChannelMap[chn]->loaded == 0) { if (midiOutOpen(&mom->ChannelMap[chn]->hMidi, mom->ChannelMap[chn]->uDevID, 0L, 0L, CALLBACK_NULL) == MMSYSERR_NOERROR) mom->ChannelMap[chn]->loaded = 1; else mom->ChannelMap[chn]->loaded = -1; /* FIXME: should load here the IDF midi data... and allow channel and * patch mappings */ } if (mom->ChannelMap[chn]->loaded > 0) { /* change channel */ dwParam &= ~0x0F; dwParam |= mom->ChannelMap[chn]->aChn[chn]; if ((LOBYTE(LOWORD(dwParam)) & 0xF0) == 0xC0 /* program change */ && mom->ChannelMap[chn]->lpbPatch) { BYTE patch = HIBYTE(LOWORD(dwParam)); /* change patch */ dwParam &= ~0x0000FF00; dwParam |= mom->ChannelMap[chn]->lpbPatch[patch]; } ret = midiOutShortMsg(mom->ChannelMap[chn]->hMidi, dwParam); } break; case 0xF0: for (chn = 0; chn < 16; chn++) { if (mom->ChannelMap[chn]->loaded > 0) ret = midiOutShortMsg(mom->ChannelMap[chn]->hMidi, dwParam); } break; default: FIXME("ooch %lu\n", dwParam); } return ret; }