| 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() const;
|
|---|
| 78 | void stopTimer() const;
|
|---|
| 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 MidiCreateInstance) ( ULONG, MINSTANCE*, PSZ, ULONG );
|
|---|
| 106 | ULONG (*APIENTRY MidiDeleteInstance) ( MINSTANCE, ULONG );
|
|---|
| 107 | ULONG (*APIENTRY MidiEnableInstance) ( MINSTANCE, ULONG );
|
|---|
| 108 | ULONG (*APIENTRY MidiDisableInstance) ( MINSTANCE, ULONG );
|
|---|
| 109 | ULONG (*APIENTRY MidiAddLink) ( MINSTANCE, MINSTANCE, ULONG, ULONG );
|
|---|
| 110 | ULONG (*APIENTRY MidiRemoveLink) ( MINSTANCE, MINSTANCE, ULONG, ULONG );
|
|---|
| 111 | ULONG (*APIENTRY MidiQueryClassList) ( ULONG, PMIDICLASSINFO, ULONG );
|
|---|
| 112 | ULONG (*APIENTRY MidiQueryInstanceList) ( ULONG, PMIDIINSTANCEINFO, ULONG );
|
|---|
| 113 | ULONG (*APIENTRY MidiQueryNumClasses) ( PULONG, ULONG );
|
|---|
| 114 | ULONG (*APIENTRY MidiQueryNumInstances) ( PULONG, ULONG );
|
|---|
| 115 | ULONG (*APIENTRY MidiSendMessages) ( PMESSAGE, ULONG, ULONG );
|
|---|
| 116 | ULONG (*APIENTRY MidiSendSysexMessage) ( PMESSAGE, ULONG, ULONG );
|
|---|
| 117 | ULONG (*APIENTRY MidiRetrieveMessages) ( MINSTANCE, PVOID, PULONG, ULONG );
|
|---|
| 118 | ULONG (*APIENTRY MidiSetup) ( PMIDISETUP, ULONG );
|
|---|
| 119 | ULONG (*APIENTRY MidiTimer) ( ULONG, ULONG );
|
|---|
| 120 |
|
|---|
| 121 | private:
|
|---|
| 122 | unsigned long getRTMidiProcs();
|
|---|
| 123 | unsigned long getClasses();
|
|---|
| 124 | unsigned long getInstances();
|
|---|
| 125 | void delInstances();
|
|---|
| 126 | unsigned long findFreeInstance() const;
|
|---|
| 127 |
|
|---|
| 128 | unsigned long iLastRC;
|
|---|
| 129 |
|
|---|
| 130 | IMidiInstance* iInstances[MAX_INSTANCES+1];
|
|---|
| 131 | unsigned int iNumInInstances;
|
|---|
| 132 | IMidiInstance* iInInstances[MAX_INSTANCES+1];
|
|---|
| 133 | unsigned int iNumOutInstances;
|
|---|
| 134 | IMidiInstance* iOutInstances[MAX_INSTANCES+1];
|
|---|
| 135 | unsigned long iApplicationClass;
|
|---|
| 136 | unsigned long iHardwareClass;
|
|---|
| 137 | static IRTMidi* iTheIRTMidiSingleton;
|
|---|
| 138 | MIDISETUP iSetup;
|
|---|
| 139 | unsigned long maxRTSysexLen;
|
|---|
| 140 | unsigned long * iCurrentTime;
|
|---|
| 141 | HMODULE iRTMidiModule;
|
|---|
| 142 | };
|
|---|
| 143 |
|
|---|
| 144 | #define IRTMIDI IRTMidi::instance()
|
|---|
| 145 |
|
|---|
| 146 | extern "C"
|
|---|
| 147 | {
|
|---|
| 148 | void IRTMidiShutdown();
|
|---|
| 149 | }
|
|---|
| 150 |
|
|---|
| 151 | #endif
|
|---|
| 152 |
|
|---|