xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/CEchoGalsMTC.cpp (revision 626bc4bee107897c38c596c3440cf0a74b4b9c40)
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