// ****************************************************************************//// CGdDspCommObject.cpp//// Implementation file for Gina20/Darla20 DSP interface class.//// Darla20 and Gina20 are very similar; this class is used for both.// CGinaDspCommObject and CDarlaDspCommObject dervie from this class, in// turn.//// ----------------------------------------------------------------------------//// 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 "CGinaDspCommObject.h"/****************************************************************************Construction and destruction****************************************************************************///===========================================================================//// Constructor////===========================================================================CGdDspCommObject::CGdDspCommObject(PDWORD pdwRegBase, // Virtual ptr to DSP registersPCOsSupport pOsSupport) : CDspCommObject( pdwRegBase, pOsSupport ){m_byGDCurrentSpdifStatus = GD_SPDIF_STATUS_UNDEF;m_byGDCurrentClockState = GD_CLOCK_UNDEF;} // CGdDspCommObject::CGinaDspCommObject( DWORD dwPhysRegBase )//===========================================================================//// Destructor////===========================================================================CGdDspCommObject::~CGdDspCommObject(){} // CGdDspCommObject::~CGdDspCommObject()/****************************************************************************Hardware config****************************************************************************///===========================================================================//// Called after LoadFirmware to restore old gains, meters on, monitors, etc.// No error checking is done here.////===========================================================================void CGdDspCommObject::RestoreDspSettings(){m_pDspCommPage->byGDClockState = GD_CLOCK_UNDEF;m_pDspCommPage->byGDSpdifStatus = GD_SPDIF_STATUS_UNDEF;CDspCommObject::RestoreDspSettings();} // void CGdDspCommObject::RestoreDspSettings()//===========================================================================//// SetSampleRate//// Set the audio sample rate for Gina/Darla//// For Gina and Darla, three parameters need to be set: the resampler state,// the clock state, and the S/PDIF output status state. The idea is that// these parameters are changed as infrequently as possible.//// Resampling is no longer supported.////===========================================================================DWORD CGdDspCommObject::SetSampleRate( DWORD dwNewSampleRate ){BYTE byGDClockState, byGDSpdifStatus;DWORD fUseSpdifInClock;if ( !WaitForHandshake() )return ECHOSTATUS_DSP_DEAD;//// Pick the clock//fUseSpdifInClock = (GetCardType() == GINA) &&(GetInputClock() == ECHO_CLOCK_SPDIF);if (fUseSpdifInClock){byGDClockState = GD_CLOCK_SPDIFIN;}else{switch (dwNewSampleRate){case 44100 :byGDClockState = GD_CLOCK_44;break;case 48000 :byGDClockState = GD_CLOCK_48;break;default :byGDClockState = GD_CLOCK_NOCHANGE;break;}}if ( m_byGDCurrentClockState == byGDClockState ){byGDClockState = GD_CLOCK_NOCHANGE;}//// Select S/PDIF output status//byGDSpdifStatus = SelectGinaDarlaSpdifStatus( dwNewSampleRate );//// Write the audio state to the comm page//m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );m_pDspCommPage->byGDClockState = byGDClockState;m_pDspCommPage->byGDSpdifStatus = byGDSpdifStatus;m_pDspCommPage->byGDResamplerState = 3; // magic number -// should always be 3//// Send command to DSP//ClearHandshake();SendVector( DSP_VC_SET_GD_AUDIO_STATE );//// Save the new audio state//if ( byGDClockState != GD_CLOCK_NOCHANGE )m_byGDCurrentClockState = byGDClockState;if ( byGDSpdifStatus != GD_SPDIF_STATUS_NOCHANGE )m_byGDCurrentSpdifStatus = byGDSpdifStatus;return dwNewSampleRate;} // DWORD CGdDspCommObject::SetSampleRate( DWORD dwNewSampleRate )//===========================================================================//// SelectGinaDarlaSpdifStatus////===========================================================================BYTE CGdDspCommObject::SelectGinaDarlaSpdifStatus( DWORD dwNewSampleRate ){BYTE byNewStatus = 0;switch (dwNewSampleRate){case 44100 :byNewStatus = GD_SPDIF_STATUS_44;break;case 48000 :byNewStatus = GD_SPDIF_STATUS_48;break;default :byNewStatus = GD_SPDIF_STATUS_NOCHANGE;break;}if (byNewStatus == m_byGDCurrentSpdifStatus){byNewStatus = GD_SPDIF_STATUS_NOCHANGE;}return byNewStatus;} // BYTE CGdDspCommObject::SelectGinaDarlaSpdifStatus( DWORD dwNewSampleRate )/****************************************************************************Power management****************************************************************************///===========================================================================//// Tell the DSP to go into low-power mode////===========================================================================ECHOSTATUS CGdDspCommObject::GoComatose(){ECHO_DEBUGPRINTF(("CGdDspCommObject::GoComatose\n"));m_byGDCurrentClockState = GD_CLOCK_UNDEF;m_byGDCurrentSpdifStatus = GD_SPDIF_STATUS_UNDEF;return CDspCommObject::GoComatose();} // end of GoComatose// **** GinaDspCommObject.cpp ****