1 // **************************************************************************** 2 // 3 // CEchoGalsMTC.cpp 4 // 5 // CEchoGalsMTC is used to add MIDI time code sync to the base 6 // CEchoGals class. CEchoGalsMTC derives from CEchoGals; CLayla and 7 // CLayla24 derive in turn from CEchoGalsMTC. 8 // 9 // Set editor tabs to 3 for your viewing pleasure. 10 // 11 // ---------------------------------------------------------------------------- 12 // 13 // This file is part of Echo Digital Audio's generic driver library. 14 // Copyright Echo Digital Audio Corporation (c) 1998 - 2005 15 // All rights reserved 16 // www.echoaudio.com 17 // 18 // This library is free software; you can redistribute it and/or 19 // modify it under the terms of the GNU Lesser General Public 20 // License as published by the Free Software Foundation; either 21 // version 2.1 of the License, or (at your option) any later version. 22 // 23 // This library is distributed in the hope that it will be useful, 24 // but WITHOUT ANY WARRANTY; without even the implied warranty of 25 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 26 // Lesser General Public License for more details. 27 // 28 // You should have received a copy of the GNU Lesser General Public 29 // License along with this library; if not, write to the Free Software 30 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 31 // 32 // **************************************************************************** 33 34 #include "CEchoGalsMTC.h" 35 36 37 //**************************************************************************** 38 // 39 // Constructor and destructor 40 // 41 //**************************************************************************** 42 43 CEchoGalsMTC::CEchoGalsMTC( PCOsSupport pOsSupport ) 44 : CEchoGals( pOsSupport ) 45 { 46 ECHO_DEBUGPRINTF( ( "CEchoGalsMTC::CEchoGalsMTC() is born!\n" ) ); 47 48 m_wInputClock = ECHO_CLOCK_INTERNAL; 49 50 } // CEchoGalsMTC::CEchoGalsMTC() 51 52 53 CEchoGalsMTC::~CEchoGalsMTC() 54 { 55 ECHO_DEBUGPRINTF( ( "CEchoGalsMTC::~CEchoGalsMTC() is toast!\n" ) ); 56 } // CEchoGalsMTC::~CEchoGalsMTC() 57 58 59 60 61 //**************************************************************************** 62 // 63 // Input clock 64 // 65 //**************************************************************************** 66 67 //============================================================================ 68 // 69 // Set the input clock 70 // 71 // This needs to intercept the input clock value here since MTC sync is 72 // actually implemented in software 73 // 74 //============================================================================ 75 76 ECHOSTATUS CEchoGalsMTC::SetInputClock(WORD wClock) 77 { 78 ECHOSTATUS Status; 79 80 Status = ECHOSTATUS_OK; 81 82 // 83 // Check for MTC clock 84 // 85 if (ECHO_CLOCK_MTC == wClock) 86 { 87 if (ECHO_CLOCK_MTC != m_wInputClock) 88 { 89 // 90 // Tell the MIDI input object to enable MIDI time code sync 91 // 92 Status = m_MidiIn.ArmMtcSync(); 93 94 if (ECHOSTATUS_OK == Status) 95 { 96 // 97 // Store the current clock as MTC... 98 // 99 m_wInputClock = ECHO_CLOCK_MTC; 100 101 // 102 // but set the real clock to internal. 103 // 104 Status = CEchoGals::SetInputClock( ECHO_CLOCK_INTERNAL ); 105 } 106 107 } 108 } 109 else 110 { 111 // 112 // Pass the clock setting to the base class 113 // 114 Status = CEchoGals::SetInputClock( wClock ); 115 if (ECHOSTATUS_OK == Status) 116 { 117 WORD wOldClock; 118 DWORD dwRate; 119 120 // 121 // Get the base rate for MTC sync 122 // 123 m_MidiIn.GetMtcBaseRate( &dwRate ); 124 125 // 126 // Make sure MTC sync is off 127 // 128 m_MidiIn.DisarmMtcSync(); 129 130 // 131 // Store the new clock 132 // 133 wOldClock = m_wInputClock; 134 m_wInputClock = wClock; 135 136 // 137 // If the previous clock was MTC, re-set the sample rate 138 // 139 if (ECHO_CLOCK_MTC == wOldClock) 140 SetAudioSampleRate( dwRate ); 141 } 142 } 143 144 return Status; 145 146 } // SetInputClock 147 148 149 //============================================================================ 150 // 151 // Get the input clock 152 // 153 //============================================================================ 154 155 ECHOSTATUS CEchoGalsMTC::GetInputClock(WORD &wClock) 156 { 157 wClock = m_wInputClock; 158 159 return ECHOSTATUS_OK; 160 } 161 162 163 //**************************************************************************** 164 // 165 // Sample rate 166 // 167 //**************************************************************************** 168 169 //============================================================================ 170 // 171 // Set the sample rate 172 // 173 // Again, the rate needs to be intercepted here. 174 // 175 //============================================================================ 176 177 ECHOSTATUS CEchoGalsMTC::SetAudioSampleRate( DWORD dwSampleRate ) 178 { 179 ECHOSTATUS Status; 180 181 // 182 // Syncing to MTC? 183 // 184 if (ECHO_CLOCK_MTC == m_wInputClock) 185 { 186 // 187 // Test the rate 188 // 189 Status = QueryAudioSampleRate( dwSampleRate ); 190 191 // 192 // Set the base rate if it's OK 193 // 194 if (ECHOSTATUS_OK == Status) 195 { 196 m_MidiIn.SetMtcBaseRate( dwSampleRate ); 197 } 198 } 199 else 200 { 201 // 202 // Call the base class 203 // 204 Status = CEchoGals::SetAudioSampleRate( dwSampleRate ); 205 } 206 207 return Status; 208 209 } // SetAudioSampleRate 210 211 212 //============================================================================ 213 // 214 // Get the sample rate 215 // 216 //============================================================================ 217 218 ECHOSTATUS CEchoGalsMTC::GetAudioSampleRate( PDWORD pdwSampleRate ) 219 { 220 ECHOSTATUS Status; 221 222 if (NULL == pdwSampleRate) 223 return ECHOSTATUS_INVALID_PARAM; 224 225 // 226 // Syncing to MTC? 227 // 228 if (ECHO_CLOCK_MTC == m_wInputClock) 229 { 230 // 231 // Get the MTC base rate 232 // 233 Status = m_MidiIn.GetMtcBaseRate( pdwSampleRate ); 234 } 235 else 236 { 237 // 238 // Call the base class 239 // 240 Status = CEchoGals::GetAudioSampleRate( pdwSampleRate ); 241 } 242 243 return Status; 244 245 } // GetAudioSampleRate 246 247 248 249 250 //**************************************************************************** 251 // 252 // Call this periodically to change the sample rate based on received MTC 253 // data 254 // 255 //**************************************************************************** 256 257 void CEchoGalsMTC::ServiceMtcSync() 258 { 259 m_MidiIn.ServiceMtcSync(); 260 } 261 262 263 // *** CEchoGalsMTC.cpp *** 264