root/src/add-ons/kernel/drivers/audio/echo/generic/CMiaDspCommObject.cpp
// ****************************************************************************
//
//      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 ****