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
CEchoGalsMTC(PCOsSupport pOsSupport)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
~CEchoGalsMTC()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
SetInputClock(WORD wClock)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
GetInputClock(WORD & wClock)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
SetAudioSampleRate(DWORD dwSampleRate)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
GetAudioSampleRate(PDWORD pdwSampleRate)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
ServiceMtcSync()257 void CEchoGalsMTC::ServiceMtcSync()
258 {
259 m_MidiIn.ServiceMtcSync();
260 }
261
262
263 // *** CEchoGalsMTC.cpp ***
264