// ****************************************************************************//// CMiaDspCommObject.cpp//// Implementation file for EchoGals generic driver Mia DSP// interface class.//// ----------------------------------------------------------------------------//// 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 "CEchoGals.h"#include "CMiaDspCommObject.h"#include "MiaDSP.c"/****************************************************************************Construction and destruction****************************************************************************///===========================================================================//// Constructor////===========================================================================CMiaDspCommObject::CMiaDspCommObject(PDWORD pdwRegBase, // Virtual ptr to DSP registersPCOsSupport pOsSupport) : CDspCommObjectVmixer( pdwRegBase, pOsSupport ){strcpy( m_szCardName, "Mia" );m_pdwDspRegBase = pdwRegBase; // Virtual addr DSP's register basem_wNumPipesOut = 8;m_wNumPipesIn = 4;m_wNumBussesOut = 4;m_wNumBussesIn = 4;m_wFirstDigitalBusOut = 2;m_wFirstDigitalBusIn = 2;m_fHasVmixer = TRUE;if (MIA_MIDI_REV == pOsSupport->GetCardRev()){m_wNumMidiOut = 1; // # MIDI out channelsm_wNumMidiIn = 1; // # MIDI in channels}m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 44100 );m_bHasASIC = FALSE;m_pwDspCodeToLoad = pwMiaDSP;m_byDigitalMode = DIGITAL_MODE_NONE;//// Since this card has no ASIC, mark it as loaded so everything works OK//m_bASICLoaded = TRUE;} // CMiaDspCommObject::CMiaDspCommObject( DWORD dwPhysRegBase )//===========================================================================//// Destructor////===========================================================================CMiaDspCommObject::~CMiaDspCommObject(){} // CMiaDspCommObject::~CMiaDspCommObject()/****************************************************************************Hardware setup and config****************************************************************************///===========================================================================//// Set the input clock////===========================================================================ECHOSTATUS CMiaDspCommObject::SetInputClock(WORD wClock){DWORD dwSampleRate = GetSampleRate();ECHO_DEBUGPRINTF( ("CMiaDspCommObject::SetInputClock:\n") );switch ( wClock ){case ECHO_CLOCK_INTERNAL :{ECHO_DEBUGPRINTF( ( "\tSet Mia clock to INTERNAL\n" ) );// If the sample rate is out of range for some reason, set it// to a reasonable value. mattgif ( ( dwSampleRate < 32000 ) ||( dwSampleRate > 96000 ) ){dwSampleRate = 48000;}break;} // CLK_CLOCKININTERNALcase ECHO_CLOCK_SPDIF :{ECHO_DEBUGPRINTF( ( "\tSet Mia clock to SPDIF\n" ) );break;} // CLK_CLOCKINSPDIFdefault :ECHO_DEBUGPRINTF(("Input clock 0x%x not supported for Mia\n",wClock));ECHO_DEBUGBREAK();return ECHOSTATUS_CLOCK_NOT_SUPPORTED;} // switch (wInputClock)m_wInputClock = wClock;SetSampleRate( dwSampleRate );return ECHOSTATUS_OK;} // ECHOSTATUS CMiaDspCommObject::SetInputClock//===========================================================================//// SetSampleRate//// Set the audio sample rate for Mia////===========================================================================DWORD CMiaDspCommObject::SetSampleRate( DWORD dwNewSampleRate ){//// Set the sample rate//DWORD dwControlReg = MIA_48000;switch ( dwNewSampleRate ){case 96000 :dwControlReg = MIA_96000;break;case 88200 :dwControlReg = MIA_88200;break;case 44100 :dwControlReg = MIA_44100;break;case 32000 :dwControlReg = MIA_32000;break;}//// Override the clock setting if this Mia is set to S/PDIF clock//if ( ECHO_CLOCK_SPDIF == GetInputClock() )dwControlReg |= MIA_SPDIF;//// Set the control register if it has changed//if (dwControlReg != GetControlRegister()){if ( !WaitForHandshake() )return 0xffffffff;//// Set the values in the comm page; the dwSampleRate// field isn't used by the DSP, but is read by the call// to GetSampleRate below//m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );SetControlRegister( dwControlReg );//// Poke the DSP//ClearHandshake();SendVector( DSP_VC_UPDATE_CLOCKS );}return GetSampleRate();} // DWORD CMiaDspCommObject::SetSampleRate( DWORD dwNewSampleRate )// **** CMiaDspCommObject.cpp ****