44#define MIDI_NOTEOFF 0x80
45#define MIDI_NOTEON 0x90
114 if (!modp)
return 0xFFFFFFFF;
140 return (dwDevID == 0xFFFFFFFF) ? 1 : 0;
151 WARN(
"Invalid wDevID=%u\n", wDevID);
183 WARN(
"Error reading wmm=%p\n", wmm);
200 *lpw = ((
WORD)hibyte << 8) + lobyte;
238 }
while (
byte & 0x80);
270 if (evtLength >= 0x10000u) {
272 WARN(
"Ouch !! Implementation limitation to 64k bytes for a MIDI event is overflowed\n");
287 switch ((
b1 >> 4) & 0x07) {
288 case 0:
case 1:
case 2:
case 3:
case 6:
295 WARN(
"Strange indeed b1=0x%02x\n",
b1);
326 if (fourcc !=
mmioFOURCC(
'M',
'T',
'r',
'k')) {
327 WARN(
"Can't synchronize on 'MTrk' !\n");
352 WARN(
"Buffer for text is too small (%u are needed)\n",
len);
391 WARN(
"Ouch, out of sync seek=%lu track=%lu\n",
412 WARN(
"Can't seek at %08lX begin of 'MThd'\n",
dwOffset);
418 if (fourcc !=
mmioFOURCC(
'M',
'T',
'h',
'd')) {
419 WARN(
"Can't synchronize on 'MThd' !\n");
432 TRACE(
"toberead=0x%08lX, wFormat=0x%04X nTracks=0x%04X nDivision=0x%04X\n",
445 FIXME(
"Handling SMPTE time in MIDI files has not been tested\n"
446 "Please report to comp.emulators.ms-windows.wine with MIDI file !\n");
468 WARN(
"Number of division is 0, can't support that !!\n");
477 WARN(
"Got type 0 file whose number of track is not 1. Setting it to 1\n");
485 WARN(
"Handling MIDI files which format = %d is not (yet) supported\n"
486 "Please report with MIDI file !\n", wmm->
wFormat);
492 FIXME(
"Truncating MIDI file with %u tracks\n", wmm->
nTracks);
500 toberead -= 3 *
sizeof(
WORD);
502 TRACE(
"Size of MThd > 6, skipping %ld extra bytes\n", toberead);
509 WARN(
"Can't read 'MTrk' header\n");
530 FIXME(
"Shouldn't happen. wmm->nDivision = 0\n");
534 ret = (pulse * 1000) / (nf * nsf);
548#define TIME_MS_IN_ONE_HOUR (60*60*1000)
549#define TIME_MS_IN_ONE_MINUTE (60*1000)
550#define TIME_MS_IN_ONE_SECOND (1000)
608 f = (
val * 3) / 125;
val -= (
f * 125) / 3;
616 f = (
val * 3) / 100;
val -= (
f * 100) / 3;
619 FIXME(
"There must be some bad bad programmer\n");
624 ret = (
f << 24) | (
s << 16) | (
m << 8) | (
h << 0);
688 if (wmm->
hFile == 0) {
707 if (wmm->
hFile != 0) {
715 TRACE(
"ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX\n",
721 TRACE(
"... is a 'RMID' file\n");
728 WARN(
"Can't read 'MThd' header\n");
733 TRACE(
"hFile==0, setting #tracks to 0; is this correct ?\n");
804 if (wmm->
hFile != 0) {
807 TRACE(
"hFile closed !\n");
836 *hiPulse = 0xFFFFFFFFul;
848 return (
cnt == 0xFFFFu) ? 0
895 TRACE(
"wmm->dwStatus=%d, doPlay=%c\n", wmm->
dwStatus, doPlay ?
'T' :
'F');
915 TRACE(
"Pulses hi=0x%08lx <> cur=0x%08lx\n", hiPulse, wmm->
dwPulse);
916 TRACE(
"Wait until %lu => %lu ms\n",
928 FIXME(
"Not handling SysEx events (yet)\n");
940 TRACE(
"Got sequence number %u\n", twd);
953 static const char*
const info[8] = {
"",
"Text",
"Copyright",
"Seq/Trk name",
954 "Instrument",
"Lyric",
"Marker",
"Cue-point"};
958 WARN(
"Buffer for text is too small (%u are needed)\n",
len);
975 FIXME(
"NIY: MIDI channel=%u, track=%u\n", bt, mmt->
wTrackNr);
995 WARN(
"For format #1 MIDI files, tempo can only be changed on track #0 (%u)\n", mmt->
wTrackNr);
1009 WARN(
"For format #1 MIDI files, SMPTE track start can only be expressed on track #0 (%u)\n", mmt->
wTrackNr);
1011 WARN(
"SMPTE track start can only be expressed at start of track (%lu)\n", mmt->
dwEventPulse);
1020 FIXME(
"NIY: SMPTE track start %u:%u:%u %u.%u\n",
h,
m,
s,
f, ff);
1032 TRACE(
"%u/%u, clock per metronome click=%u, 32nd notes by 1/4 note=%u\n",
num, 1 << den, cpmc, _32npqn);
1042 if (sf >= 0x80)
TRACE(
"%d flats\n", -(
char)sf);
1043 else if (sf > 0)
TRACE(
"%d sharps\n", (
char)sf);
1044 else TRACE(
"Key of C\n");
1045 TRACE(
"Mode: %s\n", (mm == 0) ?
"major" :
"minor");
1137 DWORD dwStartMS, dwEndMS;
1143 if (wmm->
hFile == 0) {
1152 dwEndMS = 0xFFFFFFFFul;
1159 if (dwEndMS < dwStartMS)
1167 if (wmm->
dwEndMS != dwEndMS) {
1173 TRACE(
"Playing from %lu to %lu\n", dwStartMS, dwEndMS);
1201 for (chn = 0; chn < 16; chn++)
1238 TRACE(
"MCI_FORMAT_MILLISECONDS !\n");
1242 TRACE(
"MCI_FORMAT_SMPTE_24 !\n");
1246 TRACE(
"MCI_FORMAT_SMPTE_25 !\n");
1250 TRACE(
"MCI_FORMAT_SMPTE_30 !\n");
1259 TRACE(
"No support for video !\n");
1263 TRACE(
"No support for door open !\n");
1267 TRACE(
"No support for door close !\n");
1272 TRACE(
"MCI_SET_ON audio !\n");
1274 TRACE(
"MCI_SET_OFF audio !\n");
1276 WARN(
"MCI_SET_AUDIO without SET_ON or SET_OFF\n");
1285 default:
WARN(
"Unknown audio channel %lu\n", lpParms->
dwAudio);
break;
1290 TRACE(
"MCI_SEQ_SET_MASTER !\n");
1292 TRACE(
"MCI_SEQ_SET_SLAVE !\n");
1294 TRACE(
"MCI_SEQ_SET_OFFSET !\n");
1296 TRACE(
"MCI_SEQ_SET_PORT = %ld\n", lpParms->
dwPort);
1305 TRACE(
"MCI_SEQ_SET_TEMPO !\n");
1323 switch (lpParms->
dwItem) {
1327 TRACE(
"MCI_STATUS_CURRENT_TRACK => %Iu\n", lpParms->
dwReturn);
1348 TRACE(
"MCI_STATUS_MEDIA_PRESENT => TRUE\n");
1354 TRACE(
"MCI_STATUS_NUMBER_OF_TRACKS => %Iu\n", lpParms->
dwReturn);
1361 TRACE(
"MCI_STATUS_POSITION %s => %Iu\n",
1376 TRACE(
"MCI_SEQ_STATUS_DIVTYPE !\n");
1383 default:
FIXME(
"There is a bad bad programmer\n");
1392 TRACE(
"MCI_SEQ_STATUS_MASTER !\n");
1397 TRACE(
"MCI_SEQ_STATUS_SLAVE !\n");
1402 TRACE(
"MCI_SEQ_STATUS_OFFSET !\n");
1415 TRACE(
"MCI_SEQ_STATUS_TEMPO !\n");
1419 FIXME(
"Unknown command %08lX !\n", lpParms->
dwItem);
1443 switch (lpParms->
dwItem) {
1445 TRACE(
"MCI_GETDEVCAPS_DEVICE_TYPE !\n");
1450 TRACE(
"MCI_GETDEVCAPS_HAS_AUDIO !\n");
1455 TRACE(
"MCI_GETDEVCAPS_HAS_VIDEO !\n");
1460 TRACE(
"MCI_GETDEVCAPS_USES_FILES !\n");
1465 TRACE(
"MCI_GETDEVCAPS_COMPOUND_DEVICE !\n");
1470 TRACE(
"MCI_GETDEVCAPS_CAN_EJECT !\n");
1475 TRACE(
"MCI_GETDEVCAPS_CAN_PLAY !\n");
1480 TRACE(
"MCI_GETDEVCAPS_CAN_RECORD !\n");
1485 TRACE(
"MCI_GETDEVCAPS_CAN_SAVE !\n");
1490 FIXME(
"Unknown capability (%08lx) !\n", lpParms->
dwItem);
1494 WARN(
"No GetDevCaps-Item !\n");
1523 WARN(
"Don't know this info command (%lu)\n",
dwFlags);
1595 TRACE(
"Sending msg %04x to default driver proc\n", wMsg);
1596 return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
1616 FIXME(
"Shouldn't receive a MCI_OPEN or CLOSE message\n");
1619 TRACE(
"Unsupported command [0x%x]\n", wMsg);
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define HeapFree(x, y, z)
#define MultiByteToWideChar
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
BOOL WINAPI GetExitCodeThread(IN HANDLE hThread, OUT LPDWORD lpExitCode)
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
#define MCI_NO_COMMAND_TABLE
#define MCI_FORMAT_RETURN_BASE
#define MAKEMCIRESOURCE(wRet, wRes)
BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)
#define MCI_RESOURCE_RETURNED
BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD dwData)
DWORD WINAPI mciGetDriverData(UINT uDeviceID)
LRESULT WINAPI DefDriverProc(DWORD_PTR dwDriverIdentifier, HDRVR hDrv, UINT Msg, LPARAM lParam1, LPARAM lParam2)
LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, INT iOrigin)
MMRESULT WINAPI mmioClose(HMMIO hmmio, UINT uFlags)
MMRESULT WINAPI mmioDescend(HMMIO hmmio, LPMMCKINFO lpck, const MMCKINFO *lpckParent, UINT uFlags)
LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch)
HMMIO WINAPI mmioOpenW(LPWSTR szFileName, MMIOINFO *lpmmioinfo, DWORD dwOpenFlags)
#define InterlockedExchangePointer(Target, Value)
GLenum GLuint GLenum GLsizei const GLchar * buf
GLfloat GLfloat GLfloat GLfloat h
static DWORD CALLBACK MIDI_Starter(void *ptr)
static DWORD MIDI_ConvertMSToTimeFormat(WINE_MCIMIDI *wmm, DWORD _val)
static DWORD MIDI_mciStatus(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
static DWORD MIDI_mciSeek(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
static DWORD MIDI_GetMThdLengthMS(WINE_MCIMIDI *wmm)
static DWORD MIDI_ConvertTimeFormatToMS(WINE_MCIMIDI *wmm, DWORD val)
static DWORD MIDI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
static DWORD MIDI_mciReadByte(WINE_MCIMIDI *wmm, BYTE *lpbyt)
static DWORD MIDI_ConvertPulseToMS(WINE_MCIMIDI *wmm, DWORD pulse)
static DWORD MIDI_mciReadWord(WINE_MCIMIDI *wmm, LPWORD lpw)
static DWORD MIDI_mciSet(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms)
struct tagWINE_MCIMIDI WINE_MCIMIDI
static DWORD MIDI_mciReadMThd(WINE_MCIMIDI *wmm, DWORD dwOffset)
static DWORD MIDI_mciInfo(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
static DWORD MIDI_mciPlay(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
static DWORD MIDI_mciOpen(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms)
static WORD MIDI_mciReadVaryLen(WINE_MCIMIDI *wmm, LPDWORD lpdw)
static DWORD MIDI_mciReadNextEvent(WINE_MCIMIDI *wmm, MCI_MIDITRACK *mmt)
static DWORD mmr2mci(DWORD ret)
#define TIME_MS_IN_ONE_MINUTE
static DWORD MIDI_player(WINE_MCIMIDI *wmm, DWORD dwFlags)
LRESULT CALLBACK MCIMIDI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2)
static DWORD MIDI_mciClose(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
#define TIME_MS_IN_ONE_HOUR
static DWORD MIDI_mciPause(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
static DWORD MIDI_mciReadMTrk(WINE_MCIMIDI *wmm, MCI_MIDITRACK *mmt)
static MCI_MIDITRACK * MIDI_mciFindNextEvent(WINE_MCIMIDI *wmm, LPDWORD hiPulse)
static DWORD MIDI_mciStop(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
static DWORD MIDI_mciReadLong(WINE_MCIMIDI *wmm, LPDWORD lpdw)
static WINE_MCIMIDI * MIDI_mciGetOpenDev(MCIDEVICEID wDevID, UINT wMsg)
static DWORD MIDI_mciGetDevCaps(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms)
static DWORD ensurePlayerThread(WINE_MCIMIDI *wmm)
#define TIME_MS_IN_ONE_SECOND
static DWORD MIDI_drvClose(DWORD dwDevID)
static DWORD MIDI_mciResume(WINE_MCIMIDI *wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
static void MIDI_mciNotify(DWORD_PTR hWndCallBack, WINE_MCIMIDI *wmm, UINT wStatus)
#define MCI_SEQ_STATUS_TEMPO
#define MCIERR_FLAGS_NOT_COMPATIBLE
#define MCI_OPEN_SHAREABLE
#define MCI_SEQ_STATUS_DIVTYPE
#define MCI_NOTIFY_SUPERSEDED
#define MCI_GETDEVCAPS_CAN_SAVE
#define MCI_GETDEVCAPS_HAS_VIDEO
#define MCI_FORMAT_SMPTE_30
#define MCI_STATUS_POSITION
#define MCI_SEQ_SET_OFFSET
#define DRV_QUERYCONFIGURE
#define MIDIERR_INVALIDSETUP
#define MCI_GETDEVCAPS_CAN_RECORD
#define MCI_FORMAT_MILLISECONDS
#define MCIERR_FILE_NOT_FOUND
#define MCI_SEQ_DIV_SMPTE_25
#define MCI_FORMAT_SMPTE_24
#define MCI_GETDEVCAPS_DEVICE_TYPE
#define MCI_SEQ_STATUS_OFFSET
#define MCI_SEQ_STATUS_PORT
#define MCIERR_UNRECOGNIZED_COMMAND
#define MCI_SEQ_DIV_SMPTE_30
#define MCIERR_SEQ_PORT_MAPNODEVICE
#define MCI_GETDEVCAPS_COMPOUND_DEVICE
#define MCI_SEQ_STATUS_SLAVE
#define MCIERR_BAD_INTEGER
#define MCI_SET_DOOR_OPEN
#define MCI_GETDEVCAPS_USES_FILES
#define MCI_GETDEVCAPS_CAN_PLAY
#define MCIERR_PARAM_OVERFLOW
#define MCIERR_INVALID_DEVICE_ID
#define MCI_SET_TIME_FORMAT
#define MCI_SEQ_SET_MASTER
#define MCIERR_SEQ_PORT_NONEXISTENT
#define MCI_SEQ_SET_TEMPO
#define MCIERR_INVALID_FILE
#define MCI_GETDEVCAPS_CAN_EJECT
#define MCIERR_DEVICE_OPEN
#define MCIERR_MISSING_PARAMETER
#define MCI_FORMAT_SMPTE_25
#define MCI_SET_AUDIO_RIGHT
#define MCIERR_NULL_PARAMETER_BLOCK
#define MCI_NOTIFY_ABORTED
#define MCI_SET_AUDIO_ALL
#define MCI_SEQ_SET_SLAVE
#define MCIERR_OUTOFRANGE
#define MCI_INFO_COPYRIGHT
#define MCI_STATUS_CURRENT_TRACK
#define MCI_SEQ_DIV_SMPTE_30DROP
#define MCI_STATUS_NUMBER_OF_TRACKS
#define MCIERR_OUT_OF_MEMORY
#define MCI_SET_DOOR_CLOSED
#define MCIERR_SEQ_PORT_INUSE
#define MCI_GETDEVCAPS_ITEM
#define MMSYSERR_ALLOCATED
#define MCI_STATUS_LENGTH
#define MCI_DEVTYPE_SEQUENCER
#define MCI_FORMAT_SMPTE_30DROP
#define MCI_SET_AUDIO_LEFT
#define mmioFOURCC(c0, c1, c2, c3)
#define MCI_SEQ_STATUS_MASTER
#define MCI_SEEK_TO_START
#define MCI_NOTIFY_SUCCESSFUL
#define MCI_NOTIFY_FAILURE
#define MCI_SEQ_DIV_SMPTE_24
#define MCI_MODE_NOT_READY
#define MCI_STATUS_MEDIA_PRESENT
#define MCIERR_BAD_TIME_FORMAT
#define MMSYSERR_BADDEVICEID
#define MCIERR_NONAPPLICABLE_FUNCTION
#define MCIERR_UNSUPPORTED_FUNCTION
#define MCI_STATUS_TIME_FORMAT
#define MCI_GETDEVCAPS_HAS_AUDIO
static CRYPT_DATA_BLOB b3[]
static CRYPT_DATA_BLOB b2[]
static CRYPT_DATA_BLOB b1[]
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
_In_ DWORD _In_ DWORD dwOffset
int WINAPI MessageBoxA(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
#define THREAD_PRIORITY_TIME_CRITICAL
UINT WINAPI midiOutReset(HMIDIOUT hMidiOut)
UINT WINAPI midiOutGetNumDevs(void)
UINT WINAPI midiOutClose(HMIDIOUT hMidiOut)
UINT WINAPI midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg)
MMRESULT WINAPI midiOutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD dwFlags)