#include "CEchoGals.h"
#include "CGina24DspCommObject.h"
#include "Gina24DSP.c"
#include "Gina24_361DSP.c"
#include "Gina24ASIC.c"
#include "Gina24ASIC_361.c"
Construction and destruction
****************************************************************************/
CGina24DspCommObject::CGina24DspCommObject
(
PDWORD pdwRegBase,
PCOsSupport pOsSupport
) : CGMLDspCommObject( pdwRegBase, pOsSupport )
{
strcpy( m_szCardName, "Gina24" );
m_pdwDspRegBase = pdwRegBase;
m_wNumPipesOut = 16;
m_wNumPipesIn = 10;
m_wNumBussesOut = 16;
m_wNumBussesIn = 10;
m_wFirstDigitalBusOut = 8;
m_wFirstDigitalBusIn = 2;
m_fHasVmixer = FALSE;
m_wNumMidiOut = 0;
m_wNumMidiIn = 0;
m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 44100 );
m_bHasASIC = TRUE;
if ( DEVICE_ID_56361 == m_pOsSupport->GetDeviceId() )
m_pwDspCodeToLoad = pwGina24_361DSP;
else
m_pwDspCodeToLoad = pwGina24DSP;
m_byDigitalMode = DIGITAL_MODE_SPDIF_RCA;
m_bProfessionalSpdif = FALSE;
}
CGina24DspCommObject::~CGina24DspCommObject()
{
ECHO_DEBUGPRINTF(("CGina24DspCommObject::~CGina24DspCommObject - "
"hasta la vista!\n"));
}
Hardware setup and config
****************************************************************************/
BOOL CGina24DspCommObject::LoadASIC()
{
DWORD dwControlReg, dwSize;
PBYTE pbAsic;
if ( m_bASICLoaded )
return TRUE;
m_pOsSupport->OsSnooze( 10000 );
if ( DEVICE_ID_56361 == m_pOsSupport->GetDeviceId() )
{
pbAsic = pbGina24ASIC_361;
dwSize = sizeof( pbGina24ASIC_361 );
}
else
{
pbAsic = pbGina24ASIC;
dwSize = sizeof( pbGina24ASIC );
}
if ( !CDspCommObject::LoadASIC( DSP_FNC_LOAD_GINA24_ASIC,
pbAsic,
dwSize ) )
return FALSE;
m_pbyAsic = pbAsic;
m_pOsSupport->OsSnooze( 10000 );
CheckAsicStatus();
if ( m_bASICLoaded )
{
dwControlReg = GML_CONVERTER_ENABLE | GML_48KHZ;
WriteControlReg( dwControlReg, TRUE );
}
return m_bASICLoaded;
}
ECHOSTATUS CGina24DspCommObject::SetInputClock(WORD wClock)
{
BOOL bSetRate;
BOOL bWriteControlReg;
DWORD dwControlReg;
ECHO_DEBUGPRINTF( ("CGina24DspCommObject::SetInputClock:\n") );
dwControlReg = GetControlRegister();
dwControlReg &= GML_CLOCK_CLEAR_MASK;
bSetRate = FALSE;
bWriteControlReg = TRUE;
switch ( wClock )
{
case ECHO_CLOCK_INTERNAL :
{
ECHO_DEBUGPRINTF( ( "\tSet Gina24 clock to INTERNAL\n" ) );
bSetRate = TRUE;
bWriteControlReg = FALSE;
break;
}
case ECHO_CLOCK_SPDIF :
{
if ( DIGITAL_MODE_ADAT == GetDigitalMode() )
{
return ECHOSTATUS_CLOCK_NOT_AVAILABLE;
}
ECHO_DEBUGPRINTF( ( "\tSet Gina24 clock to SPDIF\n" ) );
dwControlReg |= GML_SPDIF_CLOCK;
if ( GML_CLOCK_DETECT_BIT_SPDIF96 & GetInputClockDetect() )
{
dwControlReg |= GML_DOUBLE_SPEED_MODE;
}
else
{
dwControlReg &= ~GML_DOUBLE_SPEED_MODE;
}
break;
}
case ECHO_CLOCK_ADAT :
{
ECHO_DEBUGPRINTF( ( "\tSet Gina24 clock to ADAT\n" ) );
if ( DIGITAL_MODE_ADAT != GetDigitalMode() )
{
return ECHOSTATUS_CLOCK_NOT_AVAILABLE;
}
dwControlReg |= GML_ADAT_CLOCK;
dwControlReg &= ~GML_DOUBLE_SPEED_MODE;
break;
}
case ECHO_CLOCK_ESYNC :
{
ECHO_DEBUGPRINTF( ( "\tSet Gina24 clock to ESYNC\n" ) );
dwControlReg |= GML_ESYNC_CLOCK;
dwControlReg &= ~GML_DOUBLE_SPEED_MODE;
break;
}
case ECHO_CLOCK_ESYNC96 :
{
ECHO_DEBUGPRINTF( ( "\tSet Gina24 clock to ESYNC96\n" ) );
dwControlReg |= GML_ESYNC_CLOCK | GML_DOUBLE_SPEED_MODE;
break;
}
default :
ECHO_DEBUGPRINTF(("Input clock 0x%x not supported for Gina24\n",wClock));
ECHO_DEBUGBREAK();
return ECHOSTATUS_CLOCK_NOT_SUPPORTED;
}
m_wInputClock = wClock;
if ( bWriteControlReg )
{
WriteControlReg( dwControlReg, TRUE );
}
if ( bSetRate )
{
SetSampleRate( GetSampleRate() );
}
return ECHOSTATUS_OK;
}
DWORD CGina24DspCommObject::SetSampleRate( DWORD dwNewSampleRate )
{
DWORD dwControlReg, dwNewClock;
if ( GetInputClock() != ECHO_CLOCK_INTERNAL )
{
ECHO_DEBUGPRINTF( ( "CGina24DspCommObject::SetSampleRate: Cannot set sample rate - "
"clock not set to CLK_CLOCKININTERNAL\n" ) );
m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
SetInputClock( m_wInputClock );
return GetSampleRate();
}
dwNewClock = 0;
dwControlReg = GetControlRegister();
dwControlReg &= GML_CLOCK_CLEAR_MASK;
dwControlReg &= GML_SPDIF_RATE_CLEAR_MASK;
switch ( dwNewSampleRate )
{
case 96000 :
dwNewClock = GML_96KHZ;
break;
case 88200 :
dwNewClock = GML_88KHZ;
break;
case 48000 :
dwNewClock = GML_48KHZ | GML_SPDIF_SAMPLE_RATE1;
break;
case 44100 :
dwNewClock = GML_44KHZ;
if ( dwControlReg & GML_SPDIF_PRO_MODE )
{
dwNewClock |= GML_SPDIF_SAMPLE_RATE0;
}
break;
case 32000 :
dwNewClock = GML_32KHZ |
GML_SPDIF_SAMPLE_RATE0 |
GML_SPDIF_SAMPLE_RATE1;
break;
case 22050 :
dwNewClock = GML_22KHZ;
break;
case 16000 :
dwNewClock = GML_16KHZ;
break;
case 11025 :
dwNewClock = GML_11KHZ;
break;
case 8000 :
dwNewClock = GML_8KHZ;
break;
default :
ECHO_DEBUGPRINTF( ("CGina24DspCommObject::SetSampleRate: %ld "
"invalid!\n", dwNewSampleRate) );
ECHO_DEBUGBREAK();
return( GetSampleRate() );
}
dwControlReg |= dwNewClock;
if ( ECHOSTATUS_OK == WriteControlReg( dwControlReg ) )
{
m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
ECHO_DEBUGPRINTF( ("CGina24DspCommObject::SetSampleRate: %ld "
"clock %ld\n", dwNewSampleRate, dwNewClock) );
}
return GetSampleRate();
}