// ****************************************************************************//// CEchoGalsMTC.cpp//// CEchoGalsMTC is used to add MIDI time code sync to the base// CEchoGals class. CEchoGalsMTC derives from CEchoGals; CLayla and// CLayla24 derive in turn from CEchoGalsMTC.//// Set editor tabs to 3 for your viewing pleasure.//// ----------------------------------------------------------------------------//// This file is part of Echo Digital Audio's generic driver library.// Copyright Echo Digital Audio Corporation (c) 1998 - 2005// All rights reserved// www.echoaudio.com//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public// License as published by the Free Software Foundation; either// version 2.1 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//// ****************************************************************************#include "CEchoGalsMTC.h"//****************************************************************************//// Constructor and destructor////****************************************************************************CEchoGalsMTC::CEchoGalsMTC( PCOsSupport pOsSupport ): CEchoGals( pOsSupport ){ECHO_DEBUGPRINTF( ( "CEchoGalsMTC::CEchoGalsMTC() is born!\n" ) );m_wInputClock = ECHO_CLOCK_INTERNAL;} // CEchoGalsMTC::CEchoGalsMTC()CEchoGalsMTC::~CEchoGalsMTC(){ECHO_DEBUGPRINTF( ( "CEchoGalsMTC::~CEchoGalsMTC() is toast!\n" ) );} // CEchoGalsMTC::~CEchoGalsMTC()//****************************************************************************//// Input clock////****************************************************************************//============================================================================//// Set the input clock//// This needs to intercept the input clock value here since MTC sync is// actually implemented in software////============================================================================ECHOSTATUS CEchoGalsMTC::SetInputClock(WORD wClock){ECHOSTATUS Status;Status = ECHOSTATUS_OK;//// Check for MTC clock//if (ECHO_CLOCK_MTC == wClock){if (ECHO_CLOCK_MTC != m_wInputClock){//// Tell the MIDI input object to enable MIDI time code sync//Status = m_MidiIn.ArmMtcSync();if (ECHOSTATUS_OK == Status){//// Store the current clock as MTC...//m_wInputClock = ECHO_CLOCK_MTC;//// but set the real clock to internal.//Status = CEchoGals::SetInputClock( ECHO_CLOCK_INTERNAL );}}}else{//// Pass the clock setting to the base class//Status = CEchoGals::SetInputClock( wClock );if (ECHOSTATUS_OK == Status){WORD wOldClock;DWORD dwRate;//// Get the base rate for MTC sync//m_MidiIn.GetMtcBaseRate( &dwRate );//// Make sure MTC sync is off//m_MidiIn.DisarmMtcSync();//// Store the new clock//wOldClock = m_wInputClock;m_wInputClock = wClock;//// If the previous clock was MTC, re-set the sample rate//if (ECHO_CLOCK_MTC == wOldClock)SetAudioSampleRate( dwRate );}}return Status;} // SetInputClock//============================================================================//// Get the input clock////============================================================================ECHOSTATUS CEchoGalsMTC::GetInputClock(WORD &wClock){wClock = m_wInputClock;return ECHOSTATUS_OK;}//****************************************************************************//// Sample rate////****************************************************************************//============================================================================//// Set the sample rate//// Again, the rate needs to be intercepted here.////============================================================================ECHOSTATUS CEchoGalsMTC::SetAudioSampleRate( DWORD dwSampleRate ){ECHOSTATUS Status;//// Syncing to MTC?//if (ECHO_CLOCK_MTC == m_wInputClock){//// Test the rate//Status = QueryAudioSampleRate( dwSampleRate );//// Set the base rate if it's OK//if (ECHOSTATUS_OK == Status){m_MidiIn.SetMtcBaseRate( dwSampleRate );}}else{//// Call the base class//Status = CEchoGals::SetAudioSampleRate( dwSampleRate );}return Status;} // SetAudioSampleRate//============================================================================//// Get the sample rate////============================================================================ECHOSTATUS CEchoGalsMTC::GetAudioSampleRate( PDWORD pdwSampleRate ){ECHOSTATUS Status;if (NULL == pdwSampleRate)return ECHOSTATUS_INVALID_PARAM;//// Syncing to MTC?//if (ECHO_CLOCK_MTC == m_wInputClock){//// Get the MTC base rate//Status = m_MidiIn.GetMtcBaseRate( pdwSampleRate );}else{//// Call the base class//Status = CEchoGals::GetAudioSampleRate( pdwSampleRate );}return Status;} // GetAudioSampleRate//****************************************************************************//// Call this periodically to change the sample rate based on received MTC// data////****************************************************************************void CEchoGalsMTC::ServiceMtcSync(){m_MidiIn.ServiceMtcSync();}// *** CEchoGalsMTC.cpp ***