#include "CLayla24.h"
#define LAYLA24_ANALOG_OUTPUT_LATENCY 59
#define LAYLA24_ANALOG_INPUT_LATENCY 71
#define LAYLA24_DIGITAL_OUTPUT_LATENCY 32
#define LAYLA24_DIGITAL_INPUT_LATENCY 32
Construction and destruction
****************************************************************************/
PVOID CLayla24::operator new( size_t Size )
{
PVOID pMemory;
ECHOSTATUS Status;
Status = OsAllocateNonPaged(Size,&pMemory);
if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory ))
{
ECHO_DEBUGPRINTF(("CLayla24::operator new - memory allocation failed\n"));
pMemory = NULL;
}
else
{
memset( pMemory, 0, Size );
}
return pMemory;
}
VOID CLayla24::operator delete( PVOID pVoid )
{
if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) )
{
ECHO_DEBUGPRINTF( ("CLayla24::operator delete memory free failed\n") );
}
}
CLayla24::CLayla24( PCOsSupport pOsSupport )
: CEchoGalsMTC( pOsSupport )
{
ECHO_DEBUGPRINTF( ( "CLayla24::CLayla24() is born!\n" ) );
m_wAnalogOutputLatency = LAYLA24_ANALOG_OUTPUT_LATENCY;
m_wAnalogInputLatency = LAYLA24_ANALOG_INPUT_LATENCY;
m_wDigitalOutputLatency = LAYLA24_DIGITAL_OUTPUT_LATENCY;
m_wDigitalInputLatency = LAYLA24_DIGITAL_INPUT_LATENCY;
}
CLayla24::~CLayla24()
{
ECHO_DEBUGPRINTF( ( "CLayla24::~CLayla24() is toast!\n" ) );
}
Setup and hardware initialization
****************************************************************************/
ECHOSTATUS CLayla24::InitHw()
{
ECHOSTATUS Status;
WORD i;
if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) )
return Status;
ECHO_ASSERT(NULL == m_pDspCommObject );
m_pDspCommObject = new CLayla24DspCommObject( (PDWORD) m_pvSharedMemory,
m_pOsSupport );
if (NULL == m_pDspCommObject)
{
ECHO_DEBUGPRINTF(("CLayla24::InitHw - could not create DSP comm object\n"));
return ECHOSTATUS_NO_MEM;
}
GetDspCommObject()->LoadFirmware();
if ( GetDspCommObject()->IsBoardBad() )
return ECHOSTATUS_DSP_DEAD;
m_wFlags &= ~ECHOGALS_FLAG_BADBOARD;
m_wFlags |= ECHOGALS_ROFLAG_SUPER_INTERLEAVE_OK |
ECHOGALS_ROFLAG_DIGITAL_IN_AUTOMUTE;
Status = InitLineLevels();
if ( ECHOSTATUS_OK != Status )
return Status;
Status = m_MidiIn.Init( this );
if ( ECHOSTATUS_OK != Status )
return Status;
for (i = 0; i < GetFirstDigitalBusOut(); i++ )
{
GetDspCommObject()->
SetNominalLevel( i, FALSE );
}
for ( i = 0; i < GetNumBussesIn(); i++ )
{
GetDspCommObject()->
SetNominalLevel( GetNumBussesOut() + i, FALSE );
}
SetDigitalMode( DIGITAL_MODE_SPDIF_RCA );
SetProfessionalSpdif( TRUE );
m_dwSampleRate = GetDspCommObject()->GetSampleRate();
ECHO_DEBUGPRINTF( ( "CLayla24::InitHw()\n" ) );
return Status;
}
Informational methods
****************************************************************************/
ECHOSTATUS CLayla24::GetCapabilities
(
PECHOGALS_CAPS pCapabilities
)
{
ECHOSTATUS Status;
WORD i;
Status = GetBaseCapabilities(pCapabilities);
if ( ECHOSTATUS_OK != Status )
return Status;
for (i = 0 ; i < GetFirstDigitalBusOut(); i++)
{
pCapabilities->dwBusOutCaps[i] |= ECHOCAPS_NOMINAL_LEVEL;
}
for (i = 0 ; i < GetNumBussesIn(); i++)
{
pCapabilities->dwBusInCaps[i] |= ECHOCAPS_NOMINAL_LEVEL;
}
pCapabilities->dwInClockTypes |= ECHO_CLOCK_BIT_WORD |
ECHO_CLOCK_BIT_SPDIF |
ECHO_CLOCK_BIT_ADAT |
ECHO_CLOCK_BIT_MTC;
return Status;
}
ECHOSTATUS CLayla24::QueryAudioSampleRate
(
DWORD dwSampleRate
)
{
switch ( dwSampleRate )
{
case 8000 :
case 11025 :
case 16000 :
case 22050 :
case 32000 :
case 44100 :
case 48000 :
goto qasr_ex;
case 88200 :
case 96000 :
if ( DIGITAL_MODE_ADAT == GetDigitalMode() )
{
ECHO_DEBUGPRINTF(
("CLayla24::QueryAudioSampleRate() Sample rate must be < "
"50,000 Hz in ADAT mode\n") );
return ECHOSTATUS_BAD_FORMAT;
}
goto qasr_ex;
}
if ( ( dwSampleRate >= 25000 ) &&
( dwSampleRate <= 50000 ) )
goto qasr_ex;
if ( DIGITAL_MODE_ADAT != GetDigitalMode() &&
( dwSampleRate >= 50000 ) &&
( dwSampleRate <= 100000 ) )
goto qasr_ex;
ECHO_DEBUGPRINTF(
("CLayla24::QueryAudioSampleRate() - rate %ld invalid\n",dwSampleRate) );
return ECHOSTATUS_BAD_FORMAT;
qasr_ex:
ECHO_DEBUGPRINTF( ( "CLayla24::QueryAudioSampleRate() %ld Hz OK\n",
dwSampleRate ) );
return ECHOSTATUS_OK;
}
void CLayla24::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate)
{
dwMinRate = 8000;
dwMaxRate = 96000;
}
ECHOSTATUS CLayla24::GetInputClockDetect(DWORD &dwClockDetectBits)
{
if ( NULL == GetDspCommObject() || GetDspCommObject()->IsBoardBad() )
{
ECHO_DEBUGPRINTF( ("CLayla24::GetInputClockDetect: DSP Dead!\n") );
return ECHOSTATUS_DSP_DEAD;
}
DWORD dwClocksFromDsp = GetDspCommObject()->GetInputClockDetect();
dwClockDetectBits = ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_MTC;
if (0 != (dwClocksFromDsp & GML_CLOCK_DETECT_BIT_SPDIF))
dwClockDetectBits |= ECHO_CLOCK_BIT_SPDIF;
if (0 != (dwClocksFromDsp & GML_CLOCK_DETECT_BIT_ADAT))
dwClockDetectBits |= ECHO_CLOCK_BIT_ADAT;
if (0 != (dwClocksFromDsp & GML_CLOCK_DETECT_BIT_WORD))
dwClockDetectBits |= ECHO_CLOCK_BIT_WORD;
return ECHOSTATUS_OK;
}