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