1 // **************************************************************************** 2 // 3 // CMidiInQ.h 4 // 5 // This class manages MIDI input. 6 // 7 // Use a simple fixed size queue for storing MIDI data. 8 // 9 // Fill & drain pointers are maintained automatically whenever 10 // an Add or Get function succeeds. 11 // 12 // Set editor tabs to 3 for your viewing pleasure. 13 // 14 // ---------------------------------------------------------------------------- 15 // 16 // This file is part of Echo Digital Audio's generic driver library. 17 // Copyright Echo Digital Audio Corporation (c) 1998 - 2005 18 // All rights reserved 19 // www.echoaudio.com 20 // 21 // This library is free software; you can redistribute it and/or 22 // modify it under the terms of the GNU Lesser General Public 23 // License as published by the Free Software Foundation; either 24 // version 2.1 of the License, or (at your option) any later version. 25 // 26 // This library is distributed in the hope that it will be useful, 27 // but WITHOUT ANY WARRANTY; without even the implied warranty of 28 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 29 // Lesser General Public License for more details. 30 // 31 // You should have received a copy of the GNU Lesser General Public 32 // License along with this library; if not, write to the Free Software 33 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 34 // 35 // **************************************************************************** 36 37 // Prevent problems with multiple includes 38 #ifndef _MIDIQUEUEOBJECT_ 39 #define _MIDIQUEUEOBJECT_ 40 41 #include "CMtcSync.h" 42 43 typedef struct tMIDI_DATA 44 { 45 DWORD dwMidi; 46 LONGLONG llTimestamp; 47 } 48 MIDI_DATA; 49 50 typedef MIDI_DATA *PMIDI_DATA; 51 52 // 53 // Default to one MIDI input client 54 // 55 #ifndef MAX_MIDI_IN_CLIENTS 56 #define MAX_MIDI_IN_CLIENTS 1 57 #endif 58 59 // 60 // MIDI in queue size 61 // 62 // Total buffer size in bytes will be MIDI_IN_Q_SIZE * sizeof(MIDI_DATA) 63 // 64 // Buffer size must be a power of 2. This is the default size; to change it, 65 // add #define MIDI_IN_Q_SIZE to your OsSupport??.h file 66 // 67 #ifndef MIDI_IN_Q_SIZE 68 #define MIDI_IN_Q_SIZE 128 69 #endif 70 71 // 72 // Class used for simple MIDI byte queue 73 // 74 class CMidiInQ 75 { 76 public: 77 // 78 // Construction/destruction 79 // 80 CMidiInQ(); 81 ~CMidiInQ(); 82 83 // 84 // Init 85 // 86 ECHOSTATUS Init(CEchoGals *pEG); 87 88 // 89 // Get the oldest byte from the circular buffer 90 // 91 ECHOSTATUS GetMidi 92 ( 93 ECHOGALS_MIDI_IN_CONTEXT *pContext, 94 DWORD &dwMidiByte, 95 LONGLONG &llTimestamp 96 ); 97 98 // 99 // Enable and disable MIDI input and MTC sync 100 // 101 ECHOSTATUS Arm(ECHOGALS_MIDI_IN_CONTEXT *pContext); 102 ECHOSTATUS Disarm(ECHOGALS_MIDI_IN_CONTEXT *pContext); 103 ECHOSTATUS ArmMtcSync(); 104 ECHOSTATUS DisarmMtcSync(); 105 106 // 107 // Get and set MTC base rate 108 // 109 ECHOSTATUS GetMtcBaseRate(DWORD *pdwBaseRate); 110 ECHOSTATUS SetMtcBaseRate(DWORD dwBaseRate); 111 112 // 113 // If MTC sync is turned on, process received MTC data 114 // and update the sample rate 115 // 116 void ServiceMtcSync(); 117 118 // 119 // See if there has been any recent MIDI input activity 120 // 121 BOOL IsActive(); 122 123 // 124 // Reset the in/out ptrs 125 // 126 void Reset(ECHOGALS_MIDI_IN_CONTEXT *pContext); 127 128 // 129 // Service a MIDI input interrupt 130 // 131 ECHOSTATUS ServiceIrq(); 132 133 134 protected: 135 136 // 137 // Add a MIDI byte to the circular buffer 138 // 139 inline ECHOSTATUS AddMidi 140 ( 141 DWORD dwMidiByte, 142 LONGLONG llTimestamp 143 ); 144 145 // 146 // Parse MIDI time code data 147 // 148 DWORD MtcProcessData( DWORD dwMidiData ); 149 150 // 151 // Cleanup 152 // 153 void Cleanup(); 154 155 // 156 // Midi buffer management 157 // 158 PMIDI_DATA m_pBuffer; 159 DWORD m_dwFill; 160 DWORD m_dwBufferSizeMask; 161 DWORD m_dwNumClients; 162 163 // 164 // Most recent MIDI input time - used for activity detector 165 // 166 ULONGLONG m_ullLastActivityTime; 167 168 // 169 // MIDI time code 170 // 171 WORD m_wMtcState; 172 CMtcSync *m_pMtcSync; 173 174 // 175 // Other objects 176 // 177 CEchoGals *m_pEG; 178 179 }; // class CMidiInQ 180 181 typedef CMidiInQ * PCMidiInQ; 182 183 #endif 184 185 // *** CMidiInQ.H *** 186