#ifndef _3GDSPCOMMOBJECT_
#define _3GDSPCOMMOBJECT_
#include "CDspCommObject.h"
class C3gDco : public CDspCommObject
{
public:
C3gDco( PDWORD pdwRegBase, PCOsSupport pOsSupport );
virtual ~C3gDco();
virtual DWORD SetSampleRate( DWORD dwNewSampleRate );
virtual DWORD SetSampleRate()
{ return( SetSampleRate( GetSampleRate() ) ); }
virtual WORD GetCardType()
{ return( ECHO3G ); }
virtual void Get3gBoxType(DWORD *pOriginalBoxType,DWORD *pCurrentBoxType);
virtual DWORD GetDigitalModes();
virtual ECHOSTATUS SetInputClock(WORD wClock);
virtual ECHOSTATUS SetDigitalMode
(
BYTE byNewMode
);
virtual void SetProfessionalSpdif( BOOL bNewStatus );
virtual BOOL IsProfessionalSpdif()
{ return( m_bProfessionalSpdif ); }
virtual BOOL IsSpdifOutNonAudio()
{
return m_bNonAudio;
}
virtual void SetSpdifOutNonAudio(BOOL bNonAudio);
void SetPhantomPower( BOOL fPhantom );
virtual ECHOSTATUS GetAudioMeters
(
PECHOGALS_METERS pMeters
);
BOOL DoubleSpeedMode(DWORD *pdwNewCtrlReg = NULL);
CChannelMask m_Adat38Mask;
protected:
virtual BOOL LoadASIC();
using CDspCommObject::LoadASIC;
enum
{
E3G_ASIC_NOT_LOADED = 0xffff,
E3G_BOX_TYPE_MASK = 0xf0
};
virtual BOOL CheckAsicStatus();
void SetChannelCounts();
DWORD Get3gFreqReg()
{ ECHO_ASSERT(NULL != m_pDspCommPage );
return SWAP( m_pDspCommPage->dw3gFreqReg ); }
ECHOSTATUS WriteControlReg
(
DWORD dwControlReg,
DWORD dwFreqReg,
BOOL fForceWrite = FALSE
);
ECHOSTATUS ValidateCtrlReg(DWORD dwNewControlReg );
void SetSpdifBits(DWORD *pdwCtrlReg,DWORD dwSampleRate);
BOOL m_bProfessionalSpdif;
BOOL m_bNonAudio;
DWORD m_dwOriginalBoxType;
DWORD m_dwCurrentBoxType;
BOOL m_bBoxTypeSet;
};
typedef C3gDco* PC3gDco;
#define E3G_CONVERTER_ENABLE 0x0010
#define E3G_SPDIF_PRO_MODE 0x0020 // Professional S/PDIF == 1, consumer == 0
#define E3G_SPDIF_SAMPLE_RATE0 0x0040
#define E3G_SPDIF_SAMPLE_RATE1 0x0080
#define E3G_SPDIF_TWO_CHANNEL 0x0100 // 1 == two channels, 0 == one channel
#define E3G_SPDIF_NOT_AUDIO 0x0200
#define E3G_SPDIF_COPY_PERMIT 0x0400
#define E3G_SPDIF_24_BIT 0x0800 // 1 == 24 bit, 0 == 20 bit
#define E3G_DOUBLE_SPEED_MODE 0x4000 // 1 == double speed, 0 == single speed
#define E3G_PHANTOM_POWER 0x8000 // 1 == phantom power on, 0 == phantom power off
#define E3G_96KHZ (0x0 | E3G_DOUBLE_SPEED_MODE)
#define E3G_88KHZ (0x1 | E3G_DOUBLE_SPEED_MODE)
#define E3G_48KHZ 0x2
#define E3G_44KHZ 0x3
#define E3G_32KHZ 0x4
#define E3G_22KHZ 0x5
#define E3G_16KHZ 0x6
#define E3G_11KHZ 0x7
#define E3G_8KHZ 0x8
#define E3G_SPDIF_CLOCK 0x9
#define E3G_ADAT_CLOCK 0xA
#define E3G_WORD_CLOCK 0xB
#define E3G_CONTINUOUS_CLOCK 0xE
#define E3G_ADAT_MODE 0x1000
#define E3G_SPDIF_OPTICAL_MODE 0x2000
#define E3G_CLOCK_CLEAR_MASK 0xbfffbff0
#define E3G_DIGITAL_MODE_CLEAR_MASK 0xffffcfff
#define E3G_SPDIF_FORMAT_CLEAR_MASK 0xfffff01f
#define E3G_CLOCK_DETECT_BIT_WORD96 0x0001
#define E3G_CLOCK_DETECT_BIT_WORD48 0x0002
#define E3G_CLOCK_DETECT_BIT_SPDIF48 0x0004
#define E3G_CLOCK_DETECT_BIT_ADAT 0x0004
#define E3G_CLOCK_DETECT_BIT_SPDIF96 0x0008
#define E3G_CLOCK_DETECT_BIT_WORD (E3G_CLOCK_DETECT_BIT_WORD96|E3G_CLOCK_DETECT_BIT_WORD48)
#define E3G_CLOCK_DETECT_BIT_SPDIF (E3G_CLOCK_DETECT_BIT_SPDIF48|E3G_CLOCK_DETECT_BIT_SPDIF96)
#define E3G_MAGIC_NUMBER 677376000
#define E3G_FREQ_REG_DEFAULT (E3G_MAGIC_NUMBER / 48000 - 2)
#define E3G_FREQ_REG_MAX 0xffff
#define E3G_MAX_OUTPUTS 16
#endif