#include "CEchoGals.h"
#include "CMonitorCtrl.h"
CMonitorCtrl::~CMonitorCtrl()
{
Cleanup();
}
ECHOSTATUS CMonitorCtrl::Init(CEchoGals *pEG)
{
DWORD dwBytes;
DWORD dwArraySize;
m_Gains = NULL;
m_Mutes = NULL;
m_Pans = NULL;
m_PanDbs = NULL;
m_pEG = pEG;
m_wNumBussesIn = pEG->GetNumBussesIn();
m_wNumBussesOut = pEG->GetNumBussesOut();
if ((0 == m_wNumBussesIn) || (0 == m_wNumBussesOut))
{
ECHO_DEBUGPRINTF(("CMonitorCtrl::Init - this card has no inputs!\n"));
return ECHOSTATUS_OK;
}
dwArraySize = m_wNumBussesIn * (m_wNumBussesOut >> 1);
dwBytes = sizeof(INT8) * dwArraySize;
OsAllocateNonPaged(dwBytes,(void **) &m_Gains);
if (NULL == m_Gains)
{
Cleanup();
return ECHOSTATUS_NO_MEM;
}
dwBytes = sizeof(WORD) * dwArraySize;
OsAllocateNonPaged(dwBytes,(void **) &m_Pans);
if (NULL == m_Pans)
{
Cleanup();
return ECHOSTATUS_NO_MEM;
}
dwBytes = sizeof(BYTE) * dwArraySize;
OsAllocateNonPaged(dwBytes,(void **) &m_Mutes);
if (NULL == m_Mutes)
{
Cleanup();
return ECHOSTATUS_NO_MEM;
}
dwBytes = sizeof(PAN_DB) * dwArraySize;
OsAllocateNonPaged(dwBytes,(void **) &m_PanDbs );
if (NULL == m_PanDbs)
{
Cleanup();
return ECHOSTATUS_NO_MEM;
}
WORD wBusIn,wBusOut,wIndex;
for (wBusIn = 0; wBusIn < m_wNumBussesIn; wBusIn++)
for (wBusOut = 0; wBusOut < m_wNumBussesOut; wBusOut += 2)
{
wIndex = GetIndex(wBusIn,wBusOut);
if (0 == (wBusIn & 1))
{
m_Pans[wIndex] = 0;
m_PanDbs[wIndex].iLeft = 0;
m_PanDbs[wIndex].iRight = (INT8) GENERIC_TO_DSP( ECHOGAIN_MUTED );
}
else
{
m_Pans[wIndex] = MAX_MIXER_PAN;
m_PanDbs[wIndex].iLeft = (INT8) GENERIC_TO_DSP( ECHOGAIN_MUTED );
m_PanDbs[wIndex].iRight = 0;
}
if ( (wBusIn < m_pEG->GetFirstDigitalBusIn()) &&
( (wBusIn & 0xfffe) == wBusOut ) )
{
m_Mutes[wIndex] = FALSE;
}
else
{
m_Mutes[wIndex] = TRUE;
}
SetGain(wBusIn,wBusOut,ECHOGAIN_UPDATE,FALSE);
}
m_pEG->GetDspCommObject()->UpdateAudioOutLineLevel();
return ECHOSTATUS_OK;
}
void CMonitorCtrl::Cleanup()
{
if (m_Gains)
OsFreeNonPaged(m_Gains);
if (m_Mutes)
OsFreeNonPaged(m_Mutes);
if (m_Pans)
OsFreeNonPaged(m_Pans);
if (m_PanDbs)
OsFreeNonPaged(m_PanDbs);
}
ECHOSTATUS CMonitorCtrl::SetGain
(
WORD wBusIn,
WORD wBusOut,
INT32 iGain,
BOOL fImmediate
)
{
ECHOSTATUS Status;
if (NULL == m_pEG)
return ECHOSTATUS_DSP_DEAD;
if ( (NULL == m_Gains) ||
(NULL == m_PanDbs) )
return ECHOSTATUS_NO_MEM;
if ( (wBusIn >= m_wNumBussesIn) || (wBusOut >= m_wNumBussesOut) )
{
ECHO_DEBUGPRINTF(("CMonitorCtrl::SetGain - out of range in %d out %d\n",
wBusIn,wBusOut));
return ECHOSTATUS_INVALID_PARAM;
}
wBusOut &= 0xfffe;
WORD wIndex = GetIndex(wBusIn,wBusOut);
if (ECHOGAIN_UPDATE == iGain)
{
iGain = DSP_TO_GENERIC( m_Gains[ wIndex ] );
}
else
{
if (iGain > ECHOGAIN_MAXOUT)
iGain = ECHOGAIN_MAXOUT;
else if (iGain < ECHOGAIN_MUTED)
iGain = ECHOGAIN_MUTED;
m_Gains[ wIndex ] = (INT8) GENERIC_TO_DSP( iGain );
m_pEG->MixerControlChanged(ECHO_MONITOR,MXN_LEVEL,wBusIn,wBusOut);
}
INT32 iLeft = iGain + DSP_TO_GENERIC( m_PanDbs[wIndex].iLeft );
INT32 iRight = iGain + DSP_TO_GENERIC( m_PanDbs[wIndex].iRight );
iLeft += m_pEG->m_BusOutLineLevels[wBusOut].GetGain();
iRight += m_pEG->m_BusOutLineLevels[wBusOut + 1].GetGain();
if (TRUE == m_Mutes[wIndex])
{
iLeft = ECHOGAIN_MUTED;
iRight = ECHOGAIN_MUTED;
}
else
{
if ( m_pEG->m_BusOutLineLevels[wBusOut].IsMuteOn() )
{
iLeft = ECHOGAIN_MUTED;
}
else
{
if (iLeft > ECHOGAIN_MAXOUT)
iLeft = ECHOGAIN_MAXOUT;
else if (iLeft < ECHOGAIN_MUTED)
iLeft = ECHOGAIN_MUTED;
}
if ( m_pEG->m_BusOutLineLevels[wBusOut + 1].IsMuteOn() )
{
iRight = ECHOGAIN_MUTED;
}
else
{
if (iRight > ECHOGAIN_MAXOUT)
iRight = ECHOGAIN_MAXOUT;
else if (iRight < ECHOGAIN_MUTED)
iRight = ECHOGAIN_MUTED;
}
}
if ( (NULL == m_pEG) ||
(NULL == m_pEG->GetDspCommObject() ) )
return ECHOSTATUS_DSP_DEAD;
Status = m_pEG->
GetDspCommObject()->
SetAudioMonitor( wBusOut,
wBusIn,
iLeft,
FALSE);
if (ECHOSTATUS_OK == Status)
{
Status = m_pEG->
GetDspCommObject()->
SetAudioMonitor( wBusOut + 1,
wBusIn,
iRight,
fImmediate);
}
return Status;
}
ECHOSTATUS CMonitorCtrl::GetGain(WORD wBusIn, WORD wBusOut, INT32 &iGain)
{
WORD wIndex = GetIndex(wBusIn,wBusOut);
if (NULL == m_Gains)
return ECHOSTATUS_NO_MEM;
if ( (wBusIn >= m_wNumBussesIn) || (wBusOut >= m_wNumBussesOut) )
{
ECHO_DEBUGPRINTF(("CMonitorCtrl::GetGain - out of range in %d out %d\n",
wBusIn,wBusOut));
return ECHOSTATUS_INVALID_PARAM;
}
iGain = DSP_TO_GENERIC( m_Gains[wIndex] );
return ECHOSTATUS_OK;
}
ECHOSTATUS CMonitorCtrl::SetMute
(
WORD wBusIn,
WORD wBusOut,
BOOL bMute,
BOOL fImmediate
)
{
if (NULL == m_Mutes)
return ECHOSTATUS_NO_MEM;
if ( (wBusIn >= m_wNumBussesIn) || (wBusOut >= m_wNumBussesOut) )
{
ECHO_DEBUGPRINTF(("CMonitorCtrl::SetMute - out of range in %d out %d\n",
wBusIn,wBusOut));
return ECHOSTATUS_INVALID_PARAM;
}
wBusOut &= 0xfffe;
WORD wIndex = GetIndex(wBusIn,wBusOut);
m_Mutes[ wIndex ] = (BYTE) bMute;
m_pEG->MixerControlChanged(ECHO_MONITOR,MXN_MUTE,wBusIn,wBusOut);
return SetGain(wBusIn,wBusOut,ECHOGAIN_UPDATE,fImmediate);
}
ECHOSTATUS CMonitorCtrl::GetMute(WORD wBusIn, WORD wBusOut, BOOL &bMute)
{
wBusOut &= 0xfffe;
if ( (wBusIn >= m_wNumBussesIn) || (wBusOut >= m_wNumBussesOut) )
{
ECHO_DEBUGPRINTF(("CMonitorCtrl::GetMute - out of range in %d out %d\n",
wBusIn,wBusOut));
return ECHOSTATUS_INVALID_PARAM;
}
WORD wIndex = GetIndex(wBusIn,wBusOut);
if (NULL == m_Mutes)
return ECHOSTATUS_NO_MEM;
bMute = (BOOL) m_Mutes[ wIndex ];
return ECHOSTATUS_OK;
}
ECHOSTATUS CMonitorCtrl::SetPan(WORD wBusIn, WORD wBusOut, INT32 iPan)
{
if ( (wBusIn >= m_wNumBussesIn) || (wBusOut >= m_wNumBussesOut) )
{
ECHO_DEBUGPRINTF(("CMonitorCtrl::SetPan - out of range in %d out %d\n",
wBusIn,wBusOut));
return ECHOSTATUS_INVALID_PARAM;
}
wBusOut &= 0xfffe;
WORD wIndex = GetIndex(wBusIn,wBusOut);
if (NULL == m_Pans)
return ECHOSTATUS_NO_MEM;
if (iPan < 0)
iPan = 0;
else if (iPan > MAX_MIXER_PAN)
iPan = MAX_MIXER_PAN;
m_Pans[wIndex] = (WORD) iPan;
m_PanDbs[wIndex].iLeft = (INT8) GENERIC_TO_DSP( PanToDb(MAX_MIXER_PAN - iPan) );
m_PanDbs[wIndex].iRight = (INT8) GENERIC_TO_DSP( PanToDb(iPan) );
m_pEG->MixerControlChanged(ECHO_MONITOR,MXN_PAN,wBusIn,wBusOut);
return SetGain(wBusIn,wBusOut,ECHOGAIN_UPDATE);
}
ECHOSTATUS CMonitorCtrl::GetPan(WORD wBusIn, WORD wBusOut, INT32 &iPan)
{
if ( (wBusIn >= m_wNumBussesIn) || (wBusOut >= m_wNumBussesOut) )
{
ECHO_DEBUGPRINTF(("CMonitorCtrl::GetPan - out of range in %d out %d\n",
wBusIn,wBusOut));
return ECHOSTATUS_INVALID_PARAM;
}
wBusOut &= 0xfffe;
WORD wIndex = GetIndex(wBusIn,wBusOut);
if (NULL == m_Pans)
return ECHOSTATUS_NO_MEM;
iPan = m_Pans[ wIndex ];
return ECHOSTATUS_OK;
}