⛏️ index : haiku.git

// ****************************************************************************
//
//  	CMiaDspCommObject.cpp
//
//		Implementation file for EchoGals generic driver Mia 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 "CMiaDspCommObject.h"

#include "MiaDSP.c"


/****************************************************************************

	Construction and destruction

 ****************************************************************************/

//===========================================================================
//
// Constructor
//
//===========================================================================

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

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

	m_fHasVmixer = TRUE;

	if (MIA_MIDI_REV == pOsSupport->GetCardRev())
	{
		m_wNumMidiOut = 1;					// # MIDI out channels
		m_wNumMidiIn = 1;						// # MIDI in  channels
	}

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

	m_bHasASIC = FALSE;

	m_pwDspCodeToLoad = pwMiaDSP;

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


//===========================================================================
//
// Destructor
//
//===========================================================================

CMiaDspCommObject::~CMiaDspCommObject()
{
}	// CMiaDspCommObject::~CMiaDspCommObject()




/****************************************************************************

	Hardware setup and config

 ****************************************************************************/

//===========================================================================
//
//	Set the input clock
//
//===========================================================================

ECHOSTATUS CMiaDspCommObject::SetInputClock(WORD wClock)
{
	DWORD	dwSampleRate = GetSampleRate();

	ECHO_DEBUGPRINTF( ("CMiaDspCommObject::SetInputClock:\n") );

	switch ( wClock )
	{
		case ECHO_CLOCK_INTERNAL : 
		{
			ECHO_DEBUGPRINTF( ( "\tSet Mia clock to INTERNAL\n" ) );
	
			// If the sample rate is out of range for some reason, set it
			// to a reasonable value.  mattg
			if ( ( dwSampleRate < 32000  ) ||
			     ( dwSampleRate > 96000 ) )
			{
				dwSampleRate = 48000;
			}

			break;
		} // CLK_CLOCKININTERNAL

		case ECHO_CLOCK_SPDIF :
		{
			ECHO_DEBUGPRINTF( ( "\tSet Mia clock to SPDIF\n" ) );
			break;
		} // CLK_CLOCKINSPDIF

		default :
			ECHO_DEBUGPRINTF(("Input clock 0x%x not supported for Mia\n",wClock));
			ECHO_DEBUGBREAK();
				return ECHOSTATUS_CLOCK_NOT_SUPPORTED;
	}	// switch (wInputClock)
	
	m_wInputClock = wClock;

	SetSampleRate( dwSampleRate );

	return ECHOSTATUS_OK;
}	// ECHOSTATUS CMiaDspCommObject::SetInputClock


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

DWORD CMiaDspCommObject::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;
	}

	//
	// Override the clock setting if this Mia is set to S/PDIF clock
	//	
	if ( ECHO_CLOCK_SPDIF == GetInputClock() )
		dwControlReg |= MIA_SPDIF;
	
	//
	//	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 CMiaDspCommObject::SetSampleRate( DWORD dwNewSampleRate )

// **** CMiaDspCommObject.cpp ****