source: trunk/src/winmm/irtmidi.hpp@ 10367

Last change on this file since 10367 was 5269, checked in by sandervl, 25 years ago

fs corruption fixes for rtmidi class

File size: 6.4 KB
Line 
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
24class IMidiInstance {
25public:
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
54class IAppMidiInstance : public IMidiInstance
55{
56public:
57 IAppMidiInstance( unsigned long attrs );
58
59 virtual ~IAppMidiInstance();
60private:
61 static unsigned long appNum;
62}; // IAppMidiInstance
63
64// *****************************************************************************
65// Class declaration for IRTMidi
66// *****************************************************************************
67class IRTMidi {
68public:
69 //----------------------------------------------------------------------------
70 // Constructors / destructors
71 //----------------------------------------------------------------------------
72 IRTMidi();
73
74 virtual ~IRTMidi();
75
76public:
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
137private:
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
162extern "C"
163{
164 void IRTMidiShutdown();
165}
166
167#endif
168
Note: See TracBrowser for help on using the repository browser.