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