#include "CMona.h"
#define MONA_ANALOG_OUTPUT_LATENCY 59
#define MONA_ANALOG_INPUT_LATENCY 71
#define MONA_DIGITAL_OUTPUT_LATENCY 32
#define MONA_DIGITAL_INPUT_LATENCY 32
Construction and destruction
****************************************************************************/
PVOID CMona::operator new( size_t Size )
{
PVOID pMemory;
ECHOSTATUS Status;
Status = OsAllocateNonPaged(Size,&pMemory);
if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory ))
{
ECHO_DEBUGPRINTF(("CMona::operator new - memory allocation failed\n"));
pMemory = NULL;
}
else
{
memset( pMemory, 0, Size );
}
return pMemory;
}
VOID CMona::operator delete( PVOID pVoid )
{
if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) )
{
ECHO_DEBUGPRINTF(("CMona::operator delete memory free failed\n"));
}
}
CMona::CMona( PCOsSupport pOsSupport )
: CEchoGals( pOsSupport )
{
ECHO_DEBUGPRINTF( ( "CMona::CMona() is born!\n" ) );
m_wAnalogOutputLatency = MONA_ANALOG_OUTPUT_LATENCY;
m_wAnalogInputLatency = MONA_ANALOG_INPUT_LATENCY;
m_wDigitalOutputLatency = MONA_DIGITAL_OUTPUT_LATENCY;
m_wDigitalInputLatency = MONA_DIGITAL_INPUT_LATENCY;
}
CMona::~CMona()
{
ECHO_DEBUGPRINTF( ( "CMona::~CMona() is toast!\n" ) );
}
Setup and hardware initialization
****************************************************************************/
ECHOSTATUS CMona::InitHw()
{
ECHOSTATUS Status;
if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) )
return Status;
ECHO_ASSERT(NULL == m_pDspCommObject );
m_pDspCommObject = new CMonaDspCommObject( (PDWORD) m_pvSharedMemory,
m_pOsSupport );
if (NULL == m_pDspCommObject)
{
ECHO_DEBUGPRINTF(("CMona::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;
SetDigitalMode( DIGITAL_MODE_SPDIF_RCA );
SetProfessionalSpdif( TRUE );
m_dwSampleRate = GetDspCommObject()->GetSampleRate();
ECHO_DEBUGPRINTF( ( "CMona::InitHw()\n" ) );
return Status;
}
Informational methods
****************************************************************************/
ECHOSTATUS CMona::GetCapabilities
(
PECHOGALS_CAPS pCapabilities
)
{
ECHOSTATUS Status;
Status = GetBaseCapabilities(pCapabilities);
if ( ECHOSTATUS_OK != Status )
return Status;
pCapabilities->dwInClockTypes |= ECHO_CLOCK_BIT_WORD |
ECHO_CLOCK_BIT_SPDIF |
ECHO_CLOCK_BIT_ADAT;
return Status;
}
ECHOSTATUS CMona::QueryAudioSampleRate
(
DWORD dwSampleRate
)
{
if ( dwSampleRate != 8000 &&
dwSampleRate != 11025 &&
dwSampleRate != 16000 &&
dwSampleRate != 22050 &&
dwSampleRate != 32000 &&
dwSampleRate != 44100 &&
dwSampleRate != 48000 &&
dwSampleRate != 88200 &&
dwSampleRate != 96000 )
{
ECHO_DEBUGPRINTF(
("CMona::QueryAudioSampleRate() - rate %ld invalid\n",dwSampleRate) );
return ECHOSTATUS_BAD_FORMAT;
}
if ( dwSampleRate >= 88200 && DIGITAL_MODE_ADAT == GetDigitalMode() )
{
ECHO_DEBUGPRINTF(
("CMona::QueryAudioSampleRate() Sample rate cannot be "
"set to 88,200 Hz or 96,000 Hz in ADAT mode\n") );
return ECHOSTATUS_BAD_FORMAT;
}
ECHO_DEBUGPRINTF( ( "CMona::QueryAudioSampleRate()\n" ) );
return ECHOSTATUS_OK;
}
void CMona::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate)
{
dwMinRate = 8000;
dwMaxRate = 96000;
}
ECHOSTATUS CMona::GetInputClockDetect(DWORD &dwClockDetectBits)
{
if ( NULL == GetDspCommObject() || GetDspCommObject()->IsBoardBad() )
{
ECHO_DEBUGPRINTF( ("CMona::GetInputClockDetect: DSP Dead!\n") );
return ECHOSTATUS_DSP_DEAD;
}
DWORD dwClocksFromDsp = GetDspCommObject()->GetInputClockDetect();
dwClockDetectBits = ECHO_CLOCK_BIT_INTERNAL;
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;
}