#include "CEchoGals.h"
#include "CMonaDspCommObject.h"
#include "MonaDSP.c"
#include "Mona361DSP.c"
#include "Mona1ASIC48.c"
#include "Mona1ASIC96.c"
#include "Mona1ASIC48_361.c"
#include "Mona1ASIC96_361.c"
#include "Mona2ASIC.c"
Construction and destruction
****************************************************************************/
CMonaDspCommObject::CMonaDspCommObject
(
PDWORD pdwRegBase,
PCOsSupport pOsSupport
) : CGMLDspCommObject( pdwRegBase, pOsSupport )
{
strcpy( m_szCardName, "Mona" );
m_pdwDspRegBase = pdwRegBase;
m_wNumPipesOut = 14;
m_wNumPipesIn = 12;
m_wNumBussesOut = 14;
m_wNumBussesIn = 12;
m_wFirstDigitalBusOut = 6;
m_wFirstDigitalBusIn = 4;
m_bProfessionalSpdif = FALSE;
m_fHasVmixer = FALSE;
m_wNumMidiOut = 0;
m_wNumMidiIn = 0;
m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 44100 );
m_bHasASIC = TRUE;
if ( DEVICE_ID_56361 == pOsSupport->GetDeviceId() )
m_pwDspCodeToLoad = pwMona361DSP;
else
m_pwDspCodeToLoad = pwMonaDSP;
m_byDigitalMode = DIGITAL_MODE_SPDIF_RCA;
}
CMonaDspCommObject::~CMonaDspCommObject()
{
}
Hardware setup and config
****************************************************************************/
BOOL CMonaDspCommObject::LoadASIC()
{
DWORD dwControlReg;
PBYTE pbAsic1;
DWORD dwSize;
if ( m_bASICLoaded )
return TRUE;
m_pOsSupport->OsSnooze( 10000 );
if ( DEVICE_ID_56361 == m_pOsSupport->GetDeviceId() )
{
pbAsic1 = pbMona1ASIC48_361;
dwSize = sizeof( pbMona1ASIC48_361 );
}
else
{
pbAsic1 = pbMona1ASIC48;
dwSize = sizeof( pbMona1ASIC48 );
}
if ( !CDspCommObject::LoadASIC( DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
pbAsic1,
dwSize ) )
return FALSE;
m_pbyAsic = pbAsic1;
m_pOsSupport->OsSnooze( 10000 );
if ( !CDspCommObject::LoadASIC( DSP_FNC_LOAD_MONA_EXTERNAL_ASIC,
pbMona2ASIC,
sizeof( pbMona2ASIC ) ) )
return FALSE;
m_pOsSupport->OsSnooze( 10000 );
CheckAsicStatus();
if ( m_bASICLoaded )
{
dwControlReg = GML_CONVERTER_ENABLE | GML_48KHZ;
ECHO_DEBUGPRINTF(("CMonaDspCommObject::LoadASIC - setting control reg for 0x%lx\n",
dwControlReg));
WriteControlReg( dwControlReg, TRUE );
}
return m_bASICLoaded;
}
BOOL CMonaDspCommObject::SwitchAsic( DWORD dwMask96 )
{
BYTE * pbyAsicNeeded;
DWORD dwAsicSize;
if ( DEVICE_ID_56361 == m_pOsSupport->GetDeviceId() )
{
pbyAsicNeeded = pbMona1ASIC48_361;
dwAsicSize = sizeof( pbMona1ASIC48_361 );
if ( 0 != ( dwMask96 & GetInputClockDetect() ) )
{
pbyAsicNeeded = pbMona1ASIC96_361;
dwAsicSize = sizeof( pbMona1ASIC96_361 );
}
}
else
{
pbyAsicNeeded = pbMona1ASIC48;
dwAsicSize = sizeof( pbMona1ASIC48 );
if ( 0 != ( dwMask96 & GetInputClockDetect() ) )
{
pbyAsicNeeded = pbMona1ASIC96;
dwAsicSize = sizeof( pbMona1ASIC96 );
}
}
if ( pbyAsicNeeded != m_pbyAsic )
{
if ( !CDspCommObject::LoadASIC( DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
pbyAsicNeeded,
dwAsicSize ) )
return FALSE;
m_pbyAsic = pbyAsicNeeded;
m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 48000 );
}
return TRUE;
}
ECHOSTATUS CMonaDspCommObject::SetInputClock(WORD wClock)
{
BOOL bSetRate;
BOOL bWriteControlReg;
DWORD dwControlReg;
ECHO_DEBUGPRINTF( ("CMonaDspCommObject::SetInputClock: clock %d\n",wClock) );
dwControlReg = GetControlRegister();
dwControlReg &= GML_CLOCK_CLEAR_MASK;
bSetRate = FALSE;
bWriteControlReg = TRUE;
switch ( wClock )
{
case ECHO_CLOCK_INTERNAL :
{
ECHO_DEBUGPRINTF( ( "\tSet Mona clock to INTERNAL\n" ) );
bSetRate = TRUE;
bWriteControlReg = FALSE;
break;
}
case ECHO_CLOCK_SPDIF :
{
if ( DIGITAL_MODE_ADAT == GetDigitalMode() )
{
return ECHOSTATUS_CLOCK_NOT_AVAILABLE;
}
if ( FALSE == SwitchAsic( GML_CLOCK_DETECT_BIT_SPDIF96 ) )
{
return ECHOSTATUS_CLOCK_NOT_AVAILABLE;
}
ECHO_DEBUGPRINTF( ( "\tSet Mona 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_WORD :
{
ECHO_DEBUGPRINTF( ( "\tSet Mona clock to WORD\n" ) );
if ( FALSE == SwitchAsic( GML_CLOCK_DETECT_BIT_WORD96 ) )
{
return ECHOSTATUS_CLOCK_NOT_AVAILABLE;
}
dwControlReg |= GML_WORD_CLOCK;
if ( GML_CLOCK_DETECT_BIT_WORD96 & GetInputClockDetect() )
{
dwControlReg |= GML_DOUBLE_SPEED_MODE;
}
else
{
dwControlReg &= ~GML_DOUBLE_SPEED_MODE;
}
break;
}
case ECHO_CLOCK_ADAT :
{
ECHO_DEBUGPRINTF( ( "\tSet Mona clock to ADAT\n" ) );
if ( DIGITAL_MODE_ADAT != GetDigitalMode() )
{
return ECHOSTATUS_CLOCK_NOT_AVAILABLE;
}
dwControlReg |= GML_ADAT_CLOCK;
dwControlReg &= ~GML_DOUBLE_SPEED_MODE;
break;
}
default :
ECHO_DEBUGPRINTF(("Input clock 0x%x not supported for Mona\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 CMonaDspCommObject::SetSampleRate( DWORD dwNewSampleRate )
{
BYTE *pbyAsicNeeded;
DWORD dwAsicSize, dwControlReg, dwNewClock;
BOOL fForceControlReg;
ECHO_DEBUGPRINTF(("CMonaDspCommObject::SetSampleRate to %ld\n",dwNewSampleRate));
fForceControlReg = FALSE;
if ( GetInputClock() != ECHO_CLOCK_INTERNAL )
{
ECHO_DEBUGPRINTF( ( "CMonaDspCommObject::SetSampleRate: Cannot set sample rate - "
"clock not set to CLK_CLOCKININTERNAL\n" ) );
m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
SetInputClock( m_wInputClock );
return GetSampleRate();
}
if ( dwNewSampleRate >= 88200 )
{
if ( DIGITAL_MODE_ADAT == GetDigitalMode() )
return( GetSampleRate() );
if ( DEVICE_ID_56361 == m_pOsSupport->GetDeviceId() )
{
pbyAsicNeeded = pbMona1ASIC96_361;
dwAsicSize = sizeof(pbMona1ASIC96_361);
}
else
{
pbyAsicNeeded = pbMona1ASIC96;
dwAsicSize = sizeof(pbMona1ASIC96);
}
}
else
{
if ( DEVICE_ID_56361 == m_pOsSupport->GetDeviceId() )
{
pbyAsicNeeded = pbMona1ASIC48_361;
dwAsicSize = sizeof(pbMona1ASIC48_361);
}
else
{
pbyAsicNeeded = pbMona1ASIC48;
dwAsicSize = sizeof(pbMona1ASIC48);
}
}
if ( pbyAsicNeeded != m_pbyAsic )
{
ECHO_DEBUGPRINTF(("\tLoading a new ASIC\n"));
if ( FALSE == CDspCommObject::LoadASIC
( DSP_FNC_LOAD_MONA_PCI_CARD_ASIC,
pbyAsicNeeded,
dwAsicSize ) )
return( GetSampleRate() );
m_pbyAsic = pbyAsicNeeded;
fForceControlReg = TRUE;
}
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;
}
dwControlReg |= dwNewClock;
if ( ECHOSTATUS_OK == WriteControlReg( dwControlReg, fForceControlReg ) )
{
m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
ECHO_DEBUGPRINTF( ("CMonaDspCommObject::SetSampleRate: %ld "
"clock %ld\n", dwNewSampleRate, dwNewClock) );
}
return GetSampleRate();
}
ECHOSTATUS CMonaDspCommObject::SetDigitalMode
(
BYTE byNewMode
)
{
ECHO_DEBUGPRINTF(("CMonaDspCommObject::SetDigitalMode %d\n",byNewMode));
BYTE *pbAsic96;
if (DIGITAL_MODE_ADAT == byNewMode)
{
switch (m_pOsSupport->GetDeviceId())
{
case DEVICE_ID_56301 :
pbAsic96 = pbMona1ASIC96;
break;
case DEVICE_ID_56361 :
pbAsic96 = pbMona1ASIC96_361;
break;
default :
return ECHOSTATUS_BAD_CARDID;
}
if (pbAsic96 == m_pbyAsic)
SetSampleRate( 48000 );
}
return CGMLDspCommObject::SetDigitalMode(byNewMode);
}