Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*******************************Module*Header*********************************
* Module Name: mmsys.h * * MultiMedia Systems MIDI Sequencer DLL Internal prototypes and data struct's * (contains constants, data types, and prototypes common to mci and seq * sections of mciseq.drv) * * Created: 4/10/90 * Author: GREGSI * * History: * * Copyright (c) 1985-1998 Microsoft Corporation * \****************************************************************************/
#include <port1632.h>
/* Set up NT style debugging */
#ifdef WIN32
#if DBG
#define DEBUG
#endif
#endif
#define PUBLIC extern /* Public label. */
#define PRIVATE static /* Private label. */
#define EXPORT FAR _LOADDS /* Export function. */
#define WAIT_FOREVER ((DWORD)(-1))
#define GETMOTWORD(lpb) ((((WORD)*(LPBYTE)(lpb)) << (8 * sizeof(BYTE))) + *((LPBYTE)(lpb) + sizeof(BYTE)))
typedef HANDLE HMIDISEQ; typedef HMIDISEQ FAR *LPHMIDISEQ; /****************************************************************************
Sequencer error return values
****************************************************************************/
#define MIDISEQERR_BASE 96
#define MIDISEQERR_NOERROR 0 // no error
#define MIDISEQERR_ERROR (MIDISEQERR_BASE+1) // unspecified error
#define MIDISEQERR_NOSEQUENCER (MIDISEQERR_BASE+2) // no sequencer present
#define MIDISEQERR_INVALSEQHANDLE (MIDISEQERR_BASE+3) // given sequence handle is invalid
#define MIDISEQERR_NOMEM (MIDISEQERR_BASE+4) // memory allocation error
#define MIDISEQERR_ALLOCATED (MIDISEQERR_BASE+5) // sequencer already allocated
#define MIDISEQERR_BADERRNUM (MIDISEQERR_BASE+6) // error number out of range
#define MIDISEQERR_INTERNALERROR (MIDISEQERR_BASE+7) // internal error - see mmddk.h
#define MIDISEQERR_INVALMIDIHANDLE (MIDISEQERR_BASE+8) // specified MIDI output handle invalid
#define MIDISEQERR_INVALMSG (MIDISEQERR_BASE+9) // specified msg was invalid
#define MIDISEQERR_INVALPARM (MIDISEQERR_BASE+10) // msg parameter bad
#define MIDISEQERR_TIMER (MIDISEQERR_BASE+11) // timer failed
/****************************************************************************
Sequencer callback ****************************************************************************/ typedef DRVCALLBACK MIDISEQCALLBACK; typedef MIDISEQCALLBACK FAR *LPMIDISEQCALLBACK;
// callback messages
#define MIDISEQ_DONE 0
#define MIDISEQ_RESET 1
#define MIDISEQ_DONEPLAY 2
/****************************************************************************
Sequencer data block header ****************************************************************************/
typedef struct midiseqhdr_tag { LPSTR lpData; // pointer to locked data block
DWORD dwLength; // length of data in data block
WORD wFlags; // assorted flags (see defines)
WORD wTrack; // track number
struct midiseqhdr_tag far *lpNext; // reserved for sequencer
DWORD reserved; // reserved for sequencer
} MIDISEQHDR; typedef MIDISEQHDR FAR *LPMIDISEQHDR;
// defines for MIDISEQOUTHDR flag bits
#define MIDISEQHDR_DONE 0x0001 // done bit
#define MIDISEQHDR_BOT 0x0002 // beginning of track
#define MIDISEQHDR_EOT 0x0004 // end of track
/****************************************************************************
Sequencer support structures ****************************************************************************/
/* Struct used for the seqinfo message. */
typedef struct midiseqinfo_tag { WORD wDivType; // division type of file
WORD wResolution; // resolution of file
DWORD dwLength; // length of sequence in ticks
BOOL bPlaying; // whether file is playing
BOOL bSeeking; // whether seek is in progress
BOOL bReadyToPlay; // if all is set to play
DWORD dwCurrentTick; // current position in terms of file's ticks
DWORD dwPlayTo; DWORD dwTempo; // tempo of file in microseconds per tick
// BYTE bTSNum; // numerator of time signature
// BYTE bTSDenom; // denominator of time signature
// WORD wNumTracks; // number of tracks in the file
// HANDLE hPort; // MIDI port handle
BOOL bTempoFromFile; // whether file's tempo events are to be used
MMTIME mmSmpteOffset; // offset into file if in smpte format
WORD wInSync; // in (slave) sync mode
WORD wOutSync; // out (master) sync mode
BYTE tempoMapExists; BYTE bLegalFile; } MIDISEQINFO; typedef MIDISEQINFO FAR *LPMIDISEQINFO;
/****************************************************************************
Sequencer synchronization constants ****************************************************************************/
#define SEQ_SYNC_NOTHING 0
#define SEQ_SYNC_FILE 1
#define SEQ_SYNC_MIDI 2
#define SEQ_SYNC_SMPTE 3
#define SEQ_SYNC_OFFSET 4
#define SEQ_SYNC_OFFSET_NOEFFECT 0xFFFFFFFF
/****************************************************************************
Sequencer file division-type constants ****************************************************************************/ #define SEQ_DIV_PPQN 0
#define SEQ_DIV_SMPTE_24 24
#define SEQ_DIV_SMPTE_25 25
#define SEQ_DIV_SMPTE_30DROP 29
#define SEQ_DIV_SMPTE_30 30
/****************************************************************************
midiSeqMessage constants ****************************************************************************/
#define SEQ_PLAY 3
#define SEQ_RESET 4
#define SEQ_SETTEMPO 6
#define SEQ_SETSONGPTR 7
#define SEQ_SETUPTOPLAY 8
#define SEQ_STOP 9
#define SEQ_TRACKDATA 10
#define SEQ_GETINFO 11
#define SEQ_SETPORT 12
#define SEQ_SETPORTOFF 13
#define SEQ_MSTOTICKS 14
#define SEQ_TICKSTOMS 15
#define SEQ_SEEKTICKS 16
#define SEQ_SYNCSEEKTICKS 17
#define SEQ_SETSYNCSLAVE 18
#define SEQ_SETSYNCMASTER 19
#define SEQ_QUERYGENMIDI 20
#define SEQ_QUERYHMIDI 21
/***************** "play to" code for seq_play ***************************/
#define PLAYTOEND ((DWORD)-1)
/****************************************************************************
sequencer support ****************************************************************************/
// opening info -- needed for MIDISEQOPEN message
typedef struct midiseqopendesc_tag { DWORD_PTR dwCallback; // callback
DWORD_PTR dwInstance; // app's private instance information
HANDLE hStream; // handle to stream
LPBYTE lpMIDIFileHdr; DWORD dwLen; // length of midi file header
} MIDISEQOPENDESC; typedef MIDISEQOPENDESC FAR *LPMIDISEQOPENDESC;
/****************************************************************************
MIDISeqMessage() messages ****************************************************************************/
#define SEQ_OPEN 1
#define SEQ_CLOSE 2
// microseconds per minute -- a handy thing to have around
#define USecPerMinute 60000000
#define USecPerSecond 1000000
#define USecPerMinute 60000000
#define DefaultTempo 120
/********************** COMMON SYSTEM PROTOTYPES ************************/
PUBLIC DWORD_PTR FAR PASCAL midiSeqMessage(HMIDISEQ hMIDISeq, UINT msg, DWORD_PTR lParam1, DWORD_PTR lParam2);
/*** math support ****/ #ifdef WIN16
PUBLIC LONG FAR PASCAL muldiv32(long, long, long); #else
#define muldiv32 MulDiv
#endif // WIN16
#define WTM_DONEPLAY (WM_USER+0)
#define WTM_QUITTASK (WM_USER+1)
#define WTM_FILLBUFFER (WM_USER+2)
PUBLIC UINT FAR PASCAL TaskBlock(void); PUBLIC BOOL FAR PASCAL TaskSignal(DWORD dwThreadId, UINT wMsg); PUBLIC VOID FAR PASCAL TaskWaitComplete(HANDLE htask);
#ifdef WIN32
#undef Yield
#define Yield() { LeaveSeq(); EnterSeq(); } /* Should there be a Sleep call ? */
VOID InitCrit(VOID); VOID DeleteCrit(VOID); DWORD midiSeqMessageInternal(HMIDISEQ, UINT, DWORD, DWORD); VOID EnterSeq(VOID); VOID LeaveSeq(VOID); #else
#define EnterSeq()
#define LeaveSeq()
#endif // WIN32
|