#include "CLayla.h"
#define LAYLA20_ANALOG_OUTPUT_LATENCY 57
#define LAYLA20_ANALOG_INPUT_LATENCY 64
#define LAYLA20_DIGITAL_OUTPUT_LATENCY 32
#define LAYLA20_DIGITAL_INPUT_LATENCY 32
Construction and destruction
****************************************************************************/
PVOID CLayla::operator new( size_t Size )
{
PVOID pMemory;
ECHOSTATUS Status;
Status = OsAllocateNonPaged(Size,&pMemory);
if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory ))
{
ECHO_DEBUGPRINTF(("CLayla::operator new - memory allocation failed\n"));
pMemory = NULL;
}
else
{
memset( pMemory, 0, Size );
}
return pMemory;
}
VOID CLayla::operator delete( PVOID pVoid )
{
if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) )
{
ECHO_DEBUGPRINTF( ("CLayla::operator delete memory free failed\n") );
}
}
CLayla::CLayla( PCOsSupport pOsSupport )
: CEchoGalsMTC( pOsSupport )
{
ECHO_DEBUGPRINTF( ( "CLayla::CLayla() is born!\n" ) );
m_wAnalogOutputLatency = LAYLA20_ANALOG_OUTPUT_LATENCY;
m_wAnalogInputLatency = LAYLA20_ANALOG_INPUT_LATENCY;
m_wDigitalOutputLatency = LAYLA20_DIGITAL_OUTPUT_LATENCY;
m_wDigitalInputLatency = LAYLA20_DIGITAL_INPUT_LATENCY;
}
CLayla::~CLayla()
{
ECHO_DEBUGPRINTF( ( "CLayla::~CLayla() is toast!\n" ) );
}
Setup and hardware initialization
****************************************************************************/
ECHOSTATUS CLayla::InitHw()
{
ECHOSTATUS Status;
WORD i;
if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) )
return Status;
ECHO_ASSERT(NULL == m_pDspCommObject );
m_pDspCommObject = new CLaylaDspCommObject( (PDWORD) m_pvSharedMemory,
m_pOsSupport );
if (NULL == m_pDspCommObject)
{
ECHO_DEBUGPRINTF(("CLayla::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;
Status = InitLineLevels();
if ( ECHOSTATUS_OK != Status )
return Status;
Status = m_MidiIn.Init( this );
if ( ECHOSTATUS_OK != Status )
return Status;
ECHO_DEBUGPRINTF(("\tMIDI input init done\n"));
for (i = 0; i < GetFirstDigitalBusOut(); i++ )
{
ECHO_DEBUGPRINTF(("\tSetting nominal output level %d\n",i));
GetDspCommObject()->SetNominalLevel( i, TRUE );
}
for ( i = 0; i < GetFirstDigitalBusIn(); i++ )
{
ECHO_DEBUGPRINTF(("\tSetting nominal input level %d\n",i));
GetDspCommObject()->SetNominalLevel( GetNumBussesOut() + i, TRUE );
}
ECHO_DEBUGPRINTF(("\tNominal levels done\n"));
SetProfessionalSpdif( TRUE );
ECHO_DEBUGPRINTF(("\tSet S/PDIF format OK\n"));
m_dwSampleRate = GetDspCommObject()->GetSampleRate();
ECHO_DEBUGPRINTF( ( "\tCLayla::InitHw() finished\n" ) );
return Status;
}
Informational methods
****************************************************************************/
ECHOSTATUS CLayla::GetCapabilities
(
PECHOGALS_CAPS pCapabilities
)
{
ECHOSTATUS Status;
WORD i;
Status = GetBaseCapabilities(pCapabilities);
for (i = 0; i < GetFirstDigitalBusIn(); i++)
{
pCapabilities->dwBusInCaps[i] |= ECHOCAPS_GAIN |
ECHOCAPS_MUTE |
ECHOCAPS_NOMINAL_LEVEL;
}
for (i = 0; i < GetFirstDigitalBusOut(); i++)
{
pCapabilities->dwBusOutCaps[i] |= ECHOCAPS_NOMINAL_LEVEL;
}
if ( ECHOSTATUS_OK != Status )
return Status;
pCapabilities->dwInClockTypes |= ECHO_CLOCK_BIT_WORD |
ECHO_CLOCK_BIT_SUPER |
ECHO_CLOCK_BIT_SPDIF |
ECHO_CLOCK_BIT_MTC;
pCapabilities->dwOutClockTypes |= ECHO_CLOCK_BIT_WORD |
ECHO_CLOCK_BIT_SUPER;
return Status;
}
ECHOSTATUS CLayla::QueryAudioSampleRate
(
DWORD dwSampleRate
)
{
if ( dwSampleRate < 8000 ||
dwSampleRate > 50000 )
{
ECHO_DEBUGPRINTF(
("CLayla::QueryAudioSampleRate() - rate %ld invalid\n",dwSampleRate) );
return ECHOSTATUS_BAD_FORMAT;
}
ECHO_DEBUGPRINTF( ( "CLayla::QueryAudioSampleRate() %ld Hz OK\n",
dwSampleRate ) );
return ECHOSTATUS_OK;
}
void CLayla::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate)
{
dwMinRate = 8000;
dwMaxRate = 50000;
}
ECHOSTATUS CLayla::GetInputClockDetect(DWORD &dwClockDetectBits)
{
if ( NULL == GetDspCommObject() || GetDspCommObject()->IsBoardBad() )
{
ECHO_DEBUGPRINTF( ("CLayla::GetInputClockDetect: DSP Dead!\n") );
return ECHOSTATUS_DSP_DEAD;
}
DWORD dwClocksFromDsp = GetDspCommObject()->GetInputClockDetect();
dwClockDetectBits = ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_MTC;
if (0 != (dwClocksFromDsp & GLDM_CLOCK_DETECT_BIT_SPDIF))
dwClockDetectBits |= ECHO_CLOCK_BIT_SPDIF;
if (0 != (dwClocksFromDsp & GLDM_CLOCK_DETECT_BIT_WORD))
{
if (0 != (dwClocksFromDsp & GLDM_CLOCK_DETECT_BIT_SUPER))
dwClockDetectBits |= ECHO_CLOCK_BIT_SUPER;
else
dwClockDetectBits |= ECHO_CLOCK_BIT_WORD;
}
return ECHOSTATUS_OK;
}