#include "CEchoGals.h"
#include "CGMLDspCommObject.h"
void CGMLDspCommObject::SetProfessionalSpdif
(
BOOL bNewStatus
)
{
DWORD dwControlReg;
dwControlReg = GetControlRegister();
dwControlReg &= GML_SPDIF_FORMAT_CLEAR_MASK;
dwControlReg |= GML_SPDIF_TWO_CHANNEL |
GML_SPDIF_24_BIT |
GML_SPDIF_COPY_PERMIT;
if ( bNewStatus )
{
dwControlReg |= GML_SPDIF_PRO_MODE;
switch ( GetSampleRate() )
{
case 32000 :
dwControlReg |= GML_SPDIF_SAMPLE_RATE0 |
GML_SPDIF_SAMPLE_RATE1;
break;
case 44100 :
dwControlReg |= GML_SPDIF_SAMPLE_RATE0;
break;
case 48000 :
dwControlReg |= GML_SPDIF_SAMPLE_RATE1;
break;
}
}
else
{
switch ( GetSampleRate() )
{
case 32000 :
dwControlReg |= GML_SPDIF_SAMPLE_RATE0 |
GML_SPDIF_SAMPLE_RATE1;
break;
case 48000 :
dwControlReg |= GML_SPDIF_SAMPLE_RATE1;
break;
}
}
if (m_bNonAudio)
dwControlReg |= GML_SPDIF_NOT_AUDIO;
WriteControlReg( dwControlReg );
m_bProfessionalSpdif = bNewStatus;
ECHO_DEBUGPRINTF( ("CGMLDspCommObject::SetProfessionalSpdif to %s\n",
( bNewStatus ) ? "Professional" : "Consumer") );
}
void CGMLDspCommObject::SetSpdifOutNonAudio(BOOL bNonAudio)
{
DWORD dwControlReg;
dwControlReg = GetControlRegister();
if (bNonAudio)
{
dwControlReg |= GML_SPDIF_NOT_AUDIO;
}
else
{
dwControlReg &= ~GML_SPDIF_NOT_AUDIO;
}
m_bNonAudio = bNonAudio;
WriteControlReg( dwControlReg );
}
ECHOSTATUS CGMLDspCommObject::WriteControlReg
(
DWORD dwControlReg,
BOOL fForceWrite
)
{
ECHO_DEBUGPRINTF(("CGMLDspCommObject::WriteControlReg 0x%lx\n",dwControlReg));
if ( !m_bASICLoaded )
{
ECHO_DEBUGPRINTF(("CGMLDspCommObject::WriteControlReg - ASIC not loaded\n"));
return( ECHOSTATUS_ASIC_NOT_LOADED );
}
if ( !WaitForHandshake() )
{
ECHO_DEBUGPRINTF(("CGMLDspCommObject::WriteControlReg - no handshake\n"));
return ECHOSTATUS_DSP_DEAD;
}
#ifdef DIGITAL_INPUT_AUTO_MUTE_SUPPORT
if (TRUE == m_fDigitalInAutoMute)
dwControlReg |= GML_DIGITAL_IN_AUTO_MUTE;
else
dwControlReg &= ~GML_DIGITAL_IN_AUTO_MUTE;
#endif
if (fForceWrite || (dwControlReg != GetControlRegister()) )
{
SetControlRegister( dwControlReg );
ECHO_DEBUGPRINTF( ("CGMLDspCommObject::WriteControlReg: Setting 0x%lx\n",
dwControlReg) );
ClearHandshake();
return SendVector( DSP_VC_WRITE_CONTROL_REG );
}
else
{
ECHO_DEBUGPRINTF( ("CGMLDspCommObject::WriteControlReg: control reg is already 0x%lx\n",
dwControlReg) );
}
return ECHOSTATUS_OK;
}
ECHOSTATUS CGMLDspCommObject::SetDigitalMode
(
BYTE byNewMode
)
{
WORD wInvalidClock;
switch (byNewMode)
{
case DIGITAL_MODE_SPDIF_RCA :
case DIGITAL_MODE_SPDIF_OPTICAL :
wInvalidClock = ECHO_CLOCK_ADAT;
break;
case DIGITAL_MODE_ADAT :
wInvalidClock = ECHO_CLOCK_SPDIF;
break;
default :
wInvalidClock = 0xffff;
break;
}
if (wInvalidClock == GetInputClock())
{
SetInputClock( ECHO_CLOCK_INTERNAL );
SetSampleRate( 48000 );
}
DWORD dwControlReg;
dwControlReg = GetControlRegister();
dwControlReg &= GML_DIGITAL_MODE_CLEAR_MASK;
switch ( byNewMode )
{
case DIGITAL_MODE_SPDIF_RCA :
break;
case DIGITAL_MODE_SPDIF_OPTICAL :
dwControlReg |= GML_SPDIF_OPTICAL_MODE;
break;
case DIGITAL_MODE_ADAT :
dwControlReg |= GML_ADAT_MODE;
dwControlReg &= ~GML_DOUBLE_SPEED_MODE;
break;
default :
return ECHOSTATUS_DIGITAL_MODE_NOT_SUPPORTED;
}
WriteControlReg( dwControlReg );
m_byDigitalMode = byNewMode;
ECHO_DEBUGPRINTF( ("CGMLDspCommObject::SetDigitalMode to %ld\n",
(DWORD) m_byDigitalMode) );
return ECHOSTATUS_OK;
}