⛏️ index : haiku.git

// ****************************************************************************
//
//  	CIndigoDspCommObject.cpp
//
//		Implementation file for EchoGals generic driver Indigo DSP
//		interface class.
//
// ----------------------------------------------------------------------------
//
// This file is part of Echo Digital Audio's generic driver library.
// Copyright Echo Digital Audio Corporation (c) 1998 - 2005
// All rights reserved
// www.echoaudio.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// ****************************************************************************

#include "CEchoGals.h"
#include "CIndigoDspCommObject.h"

#ifdef ECHO_WDM
#pragma optimize("",off)
#endif
#include "IndigoDSP.c"


//
//	Construction/destruction
//
CIndigoDspCommObject::CIndigoDspCommObject
(
	PDWORD		pdwRegBase,				// Virtual ptr to DSP registers
	PCOsSupport	pOsSupport
) : CDspCommObjectVmixer( pdwRegBase, pOsSupport )
{
	strcpy( m_szCardName, "Indigo" );
	m_pdwDspRegBase = pdwRegBase;		// Virtual addr DSP's register base

	m_wNumPipesOut = 8;
	m_wNumPipesIn = 2;
	m_wNumBussesOut = 2;
	m_wNumBussesIn = m_wNumPipesIn;
	m_wFirstDigitalBusOut = m_wNumBussesOut;
	m_wFirstDigitalBusIn = m_wNumBussesIn;

	m_fHasVmixer = TRUE;
		
	m_wNumMidiOut = 0;					// # MIDI out channels
	m_wNumMidiIn = 0;						// # MIDI in  channels

	m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 48000 );

	m_bHasASIC = FALSE;

	m_pwDspCodeToLoad = pwIndigoDSP;
	
	m_byDigitalMode = DIGITAL_MODE_NONE;
	
	//
	// Since this card has no ASIC, mark it as loaded so everything works OK
	//
	m_bASICLoaded = TRUE;
	
}	// CIndigoDspCommObject::CIndigoDspCommObject( DWORD dwPhysRegBase )


CIndigoDspCommObject::~CIndigoDspCommObject()
{
}	// CIndigoDspCommObject::~CIndigoDspCommObject()


//
//	Save new clock settings and send to DSP.
//
ECHOSTATUS CIndigoDspCommObject::SetInputClock(WORD wClock)
{

	ECHO_DEBUGPRINTF( ("CIndigoDspCommObject::SetInputClock:\n") );
	return ECHOSTATUS_CLOCK_NOT_SUPPORTED;

}	// ECHOSTATUS CIndigoDspCommObject::SetInputClock


//===========================================================================
//
// SetSampleRate
// 
// Set the audio sample rate for Indigo
//
//===========================================================================

DWORD CIndigoDspCommObject::SetSampleRate( DWORD dwNewSampleRate )
{
	//
	// Set the sample rate
	//
	DWORD dwControlReg = MIA_48000;

	switch ( dwNewSampleRate )
	{
		case 96000 :
			dwControlReg = MIA_96000;
			break;
			
		case 88200 :
			dwControlReg = MIA_88200;
			break;
			
		case 44100 : 
			dwControlReg = MIA_44100;
			break;
			
		case 32000 :
			dwControlReg = MIA_32000;
			break;
	}
	
	//
	// Set the control register if it has changed
	//
	if (dwControlReg != GetControlRegister())
	{
		if ( !WaitForHandshake() )
			return 0xffffffff;
		
		//
		// Set the values in the comm page; the dwSampleRate
		// field isn't used by the DSP, but is read by the call
		// to GetSampleRate below
		//		
		m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
		SetControlRegister( dwControlReg );

		//
		//	Poke the DSP
		// 
		ClearHandshake();
		SendVector( DSP_VC_UPDATE_CLOCKS );
	}

	return GetSampleRate();
	
} // DWORD CIndigoDspCommObject::SetSampleRate( DWORD dwNewSampleRate )

// **** CIndigoDspCommObject.cpp ****