| 1 | /******************************************************************************* | 
|---|
| 2 | * FILE NAME: IRTMidi.hpp                                                       * | 
|---|
| 3 | *                                                                              * | 
|---|
| 4 | * DESCRIPTION:                                                                 * | 
|---|
| 5 | *   Class implementation of the class:                                         * | 
|---|
| 6 | *     IRTMidi- Real Time Midi Base Class                                       * | 
|---|
| 7 | *                                                                              * | 
|---|
| 8 | * Copyright Joel Troster                                                       * | 
|---|
| 9 | * | 
|---|
| 10 | * Project Odin Software License can be found in LICENSE.TXT | 
|---|
| 11 | * | 
|---|
| 12 | *******************************************************************************/ | 
|---|
| 13 | #ifndef _IRMIDI_ | 
|---|
| 14 | #define _IRMIDI_ | 
|---|
| 15 |  | 
|---|
| 16 | #ifdef _OS2WIN_H | 
|---|
| 17 | #include <winos2def.h> | 
|---|
| 18 | #endif | 
|---|
| 19 |  | 
|---|
| 20 | #include <mididll.h> | 
|---|
| 21 |  | 
|---|
| 22 | #define MAX_INSTANCES 32 | 
|---|
| 23 |  | 
|---|
| 24 | class IMidiInstance { | 
|---|
| 25 | public: | 
|---|
| 26 | IMidiInstance(); | 
|---|
| 27 |  | 
|---|
| 28 | virtual  ~IMidiInstance(); | 
|---|
| 29 |  | 
|---|
| 30 | void setInstanceInfo( MIDIINSTANCEINFO * theInstanceInfo ); | 
|---|
| 31 | MINSTANCE instance() const; | 
|---|
| 32 | unsigned long classNum() const; | 
|---|
| 33 | char * name(); | 
|---|
| 34 | unsigned long numLinks() const; | 
|---|
| 35 | unsigned long attributes() const; | 
|---|
| 36 | BOOL isSend() const; | 
|---|
| 37 | IMidiInstance& enableSend(BOOL enable = TRUE); | 
|---|
| 38 | BOOL isReceive() const; | 
|---|
| 39 | IMidiInstance& enableReceive(BOOL enable = TRUE); | 
|---|
| 40 | BOOL canReceive() const; | 
|---|
| 41 | BOOL canSend() const; | 
|---|
| 42 | IMidiInstance& removeLink(IMidiInstance* toInstance); | 
|---|
| 43 | IMidiInstance& addLink(IMidiInstance* toInstance); | 
|---|
| 44 |  | 
|---|
| 45 | unsigned long getMessage( ULONG * pTime, ULONG * pMsg ); | 
|---|
| 46 | void sendMessage( UCHAR b1, UCHAR b2, UCHAR b3, UCHAR b4 ) const; | 
|---|
| 47 | void sendMessage( ULONG theMsg  ) const; | 
|---|
| 48 | void sendSysexMessage( UCHAR* theMsg, ULONG msgLen  ) const; | 
|---|
| 49 |  | 
|---|
| 50 | MIDIINSTANCEINFO iInfo; | 
|---|
| 51 |  | 
|---|
| 52 | };  // IMidiInstance | 
|---|
| 53 |  | 
|---|
| 54 | class IAppMidiInstance : public IMidiInstance | 
|---|
| 55 | { | 
|---|
| 56 | public: | 
|---|
| 57 | IAppMidiInstance( unsigned long attrs ); | 
|---|
| 58 |  | 
|---|
| 59 | virtual  ~IAppMidiInstance(); | 
|---|
| 60 | private: | 
|---|
| 61 | static unsigned long appNum; | 
|---|
| 62 | };  // IAppMidiInstance | 
|---|
| 63 |  | 
|---|
| 64 | // ***************************************************************************** | 
|---|
| 65 | // Class declaration for IRTMidi | 
|---|
| 66 | // ***************************************************************************** | 
|---|
| 67 | class IRTMidi { | 
|---|
| 68 | public: | 
|---|
| 69 | //---------------------------------------------------------------------------- | 
|---|
| 70 | // Constructors / destructors | 
|---|
| 71 | //---------------------------------------------------------------------------- | 
|---|
| 72 | IRTMidi(); | 
|---|
| 73 |  | 
|---|
| 74 | virtual  ~IRTMidi(); | 
|---|
| 75 |  | 
|---|
| 76 | public: | 
|---|
| 77 | void            startTimer(); | 
|---|
| 78 | void            stopTimer(); | 
|---|
| 79 | MINSTANCE       addInstance(IMidiInstance* theInstance, ULONG classNum, char * ); | 
|---|
| 80 | void            delInstance(IMidiInstance* theInstance); | 
|---|
| 81 | void            resetLastRC(); | 
|---|
| 82 | unsigned long   lastRC() const | 
|---|
| 83 | { return iLastRC; } | 
|---|
| 84 | void            setLastRC(unsigned long theRC); | 
|---|
| 85 | unsigned long   applicationClass() const | 
|---|
| 86 | { return iApplicationClass; }; | 
|---|
| 87 | unsigned long   hardwareClass() const | 
|---|
| 88 | { return iHardwareClass; }; | 
|---|
| 89 | char *          RCExplanation() const; | 
|---|
| 90 | static IRTMidi* instance(); | 
|---|
| 91 | static void     shutdown(); | 
|---|
| 92 |  | 
|---|
| 93 | unsigned int    numInInstances() const | 
|---|
| 94 | { return iNumInInstances; }; | 
|---|
| 95 | IMidiInstance*  inInstance( unsigned int i ) const | 
|---|
| 96 | { return iInInstances[i]; }; | 
|---|
| 97 | unsigned int    numOutInstances() const | 
|---|
| 98 | { return iNumOutInstances; }; | 
|---|
| 99 | IMidiInstance*  outInstance( unsigned int i ) const | 
|---|
| 100 | { return iOutInstances[i]; }; | 
|---|
| 101 | unsigned long   currentTime() const | 
|---|
| 102 | { return *iCurrentTime; }; | 
|---|
| 103 |  | 
|---|
| 104 | // Methods for calls to RTMIDI functions | 
|---|
| 105 | ULONG (*APIENTRY pfnMidiCreateInstance)    ( ULONG, MINSTANCE*, PSZ, ULONG ); | 
|---|
| 106 | ULONG (*APIENTRY pfnMidiDeleteInstance)    ( MINSTANCE, ULONG ); | 
|---|
| 107 | ULONG (*APIENTRY pfnMidiEnableInstance)    ( MINSTANCE, ULONG ); | 
|---|
| 108 | ULONG (*APIENTRY pfnMidiDisableInstance)   ( MINSTANCE, ULONG ); | 
|---|
| 109 | ULONG (*APIENTRY pfnMidiAddLink)           ( MINSTANCE, MINSTANCE, ULONG, ULONG ); | 
|---|
| 110 | ULONG (*APIENTRY pfnMidiRemoveLink)        ( MINSTANCE, MINSTANCE, ULONG, ULONG ); | 
|---|
| 111 | ULONG (*APIENTRY pfnMidiQueryClassList)    ( ULONG, PMIDICLASSINFO, ULONG ); | 
|---|
| 112 | ULONG (*APIENTRY pfnMidiQueryInstanceList) ( ULONG, PMIDIINSTANCEINFO, ULONG ); | 
|---|
| 113 | ULONG (*APIENTRY pfnMidiQueryNumClasses)   ( PULONG, ULONG ); | 
|---|
| 114 | ULONG (*APIENTRY pfnMidiQueryNumInstances) ( PULONG, ULONG ); | 
|---|
| 115 | ULONG (*APIENTRY pfnMidiSendMessages)      ( PMESSAGE, ULONG, ULONG ); | 
|---|
| 116 | ULONG (*APIENTRY pfnMidiSendSysexMessage)  ( PMESSAGE, ULONG, ULONG ); | 
|---|
| 117 | ULONG (*APIENTRY pfnMidiRetrieveMessages)  ( MINSTANCE, PVOID, PULONG, ULONG ); | 
|---|
| 118 | ULONG (*APIENTRY pfnMidiSetup)             ( PMIDISETUP, ULONG ); | 
|---|
| 119 | ULONG (*APIENTRY pfnMidiTimer)             ( ULONG, ULONG ); | 
|---|
| 120 |  | 
|---|
| 121 | ULONG MidiCreateInstance    ( ULONG, MINSTANCE*, PSZ, ULONG ); | 
|---|
| 122 | ULONG MidiDeleteInstance    ( MINSTANCE, ULONG ); | 
|---|
| 123 | ULONG MidiEnableInstance    ( MINSTANCE, ULONG ); | 
|---|
| 124 | ULONG MidiDisableInstance   ( MINSTANCE, ULONG ); | 
|---|
| 125 | ULONG MidiAddLink           ( MINSTANCE, MINSTANCE, ULONG, ULONG ); | 
|---|
| 126 | ULONG MidiRemoveLink        ( MINSTANCE, MINSTANCE, ULONG, ULONG ); | 
|---|
| 127 | ULONG MidiQueryClassList    ( ULONG, PMIDICLASSINFO, ULONG ); | 
|---|
| 128 | ULONG MidiQueryInstanceList ( ULONG, PMIDIINSTANCEINFO, ULONG ); | 
|---|
| 129 | ULONG MidiQueryNumClasses   ( PULONG, ULONG ); | 
|---|
| 130 | ULONG MidiQueryNumInstances ( PULONG, ULONG ); | 
|---|
| 131 | ULONG MidiSendMessages      ( PMESSAGE, ULONG, ULONG ); | 
|---|
| 132 | ULONG MidiSendSysexMessage  ( PMESSAGE, ULONG, ULONG ); | 
|---|
| 133 | ULONG MidiRetrieveMessages  ( MINSTANCE, PVOID, PULONG, ULONG ); | 
|---|
| 134 | ULONG MidiSetup             ( PMIDISETUP, ULONG ); | 
|---|
| 135 | ULONG MidiTimer             ( ULONG, ULONG ); | 
|---|
| 136 |  | 
|---|
| 137 | private: | 
|---|
| 138 | unsigned long              getRTMidiProcs(); | 
|---|
| 139 | unsigned long              getClasses(); | 
|---|
| 140 | unsigned long              getInstances(); | 
|---|
| 141 | void                       delInstances(); | 
|---|
| 142 | unsigned long              findFreeInstance() const; | 
|---|
| 143 |  | 
|---|
| 144 | unsigned long              iLastRC; | 
|---|
| 145 |  | 
|---|
| 146 | IMidiInstance*             iInstances[MAX_INSTANCES+1]; | 
|---|
| 147 | unsigned int               iNumInInstances; | 
|---|
| 148 | IMidiInstance*             iInInstances[MAX_INSTANCES+1]; | 
|---|
| 149 | unsigned int               iNumOutInstances; | 
|---|
| 150 | IMidiInstance*             iOutInstances[MAX_INSTANCES+1]; | 
|---|
| 151 | unsigned long              iApplicationClass; | 
|---|
| 152 | unsigned long              iHardwareClass; | 
|---|
| 153 | static IRTMidi*            iTheIRTMidiSingleton; | 
|---|
| 154 | MIDISETUP                  iSetup; | 
|---|
| 155 | unsigned long              maxRTSysexLen; | 
|---|
| 156 | unsigned long *            iCurrentTime; | 
|---|
| 157 | HMODULE                    iRTMidiModule; | 
|---|
| 158 | }; | 
|---|
| 159 |  | 
|---|
| 160 | #define IRTMIDI IRTMidi::instance() | 
|---|
| 161 |  | 
|---|
| 162 | extern "C" | 
|---|
| 163 | { | 
|---|
| 164 | void IRTMidiShutdown(); | 
|---|
| 165 | } | 
|---|
| 166 |  | 
|---|
| 167 | #endif | 
|---|
| 168 |  | 
|---|