root/src/add-ons/kernel/drivers/audio/echo/generic/CEchoGals_info.cpp
// ****************************************************************************
//
//              CEchoGals_info.cpp
//
//              Implementation file for the CEchoGals driver class (info functions).
//              Set editor tabs to 3 for your viewing pleasure.
//
// ----------------------------------------------------------------------------
//
// 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"


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

        CEchoGals informational methods

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

//===========================================================================
//
// GetBaseCapabilities is used by the CEchoGals-derived classes to
// help fill out the ECHOGALS_CAPS struct.
//
//===========================================================================

ECHOSTATUS CEchoGals::GetBaseCapabilities
(
        PECHOGALS_CAPS  pCapabilities
)
{
        CChannelMask    DigMask, ChMask, AdatMask;
        WORD                            i;

        //
        //      Test only for no DSP object.  We can still get capabilities even if
        //      board is bad.
        //
        if ( NULL == GetDspCommObject() )
                return ECHOSTATUS_DSP_DEAD;

        memset( pCapabilities, 0, sizeof(ECHOGALS_CAPS) );
        strcpy( pCapabilities->szName, m_szCardInstallName );
        
        pCapabilities->wCardType                = GetDspCommObject()->GetCardType();
        pCapabilities->wNumPipesOut     = GetNumPipesOut();
        pCapabilities->wNumPipesIn      = GetNumPipesIn();
        pCapabilities->wNumBussesOut    = GetNumBussesOut();
        pCapabilities->wNumBussesIn     = GetNumBussesIn();
        
        pCapabilities->wFirstDigitalBusOut      = GetFirstDigitalBusOut();
        pCapabilities->wFirstDigitalBusIn       = GetFirstDigitalBusIn();
        
        pCapabilities->wNumMidiOut = GetDspCommObject()->GetNumMidiOutChannels();
        pCapabilities->wNumMidiIn = GetDspCommObject()->GetNumMidiInChannels();

        pCapabilities->dwOutClockTypes = 0;
        pCapabilities->dwInClockTypes = ECHO_CLOCK_BIT_INTERNAL;

        //
        // Add the controls to the output pipes that are 
        // the same for all cards       
        // 
        for (i = 0; i < GetNumPipesOut(); i++)
        {
                pCapabilities->dwPipeOutCaps[i] =       ECHOCAPS_GAIN | 
                                                                                                                ECHOCAPS_MUTE;
        }
        
        //
        // Add controls to the input busses that are the same for all cards
        //
        WORD wFirstDigitalBusIn = GetFirstDigitalBusIn();
        for (i = 0; i < GetNumBussesIn(); i++)
        {
                pCapabilities->dwBusInCaps[i] = ECHOCAPS_PEAK_METER |
                                                                                                        ECHOCAPS_VU_METER;
                if (i >= wFirstDigitalBusIn)
                        pCapabilities->dwBusInCaps[i] |= ECHOCAPS_DIGITAL;
        }
        
        //
        // And the output busses
        //
        WORD    wFirstDigitalBusOut = GetFirstDigitalBusOut();
        for (i = 0; i < GetNumBussesOut(); i++)
        {
                pCapabilities->dwBusOutCaps[i] = ECHOCAPS_PEAK_METER |
                                                                                                        ECHOCAPS_VU_METER       |
                                                                                                        ECHOCAPS_GAIN |
                                                                                                        ECHOCAPS_MUTE;
                if (i >= wFirstDigitalBusOut)
                        pCapabilities->dwBusOutCaps[i] |= ECHOCAPS_DIGITAL;
        }
        
        //
        // Digital modes & vmixer flag
        //
        pCapabilities->dwDigitalModes = GetDspCommObject()->GetDigitalModes();
        pCapabilities->fHasVmixer = GetDspCommObject()->HasVmixer();
        
        //
        //      If this is not a vmixer card, output pipes are hard-wired to output busses.
        // Mark those pipes that are hard-wired to digital busses as digital pipes
        //
        if (GetDspCommObject()->HasVmixer())
        {
                pCapabilities->wFirstDigitalPipeOut = pCapabilities->wNumPipesOut;
        }
        else
        {
                pCapabilities->wFirstDigitalPipeOut = pCapabilities->wFirstDigitalBusOut;

                
                for (   i = pCapabilities->wFirstDigitalPipeOut;
                                i < GetNumPipesOut(); 
                                i++)
                {
                        pCapabilities->dwPipeOutCaps[i] |= ECHOCAPS_DIGITAL;
                }

        }
        
        //
        // Input pipes are the same, vmixer or no vmixer
        //
        pCapabilities->wFirstDigitalPipeIn = pCapabilities->wFirstDigitalBusIn;

        for (   i = pCapabilities->wFirstDigitalPipeIn;
                        i < GetNumPipesIn(); 
                        i++)
        {
                pCapabilities->dwPipeInCaps[i] |= ECHOCAPS_DIGITAL;
        }
        return ECHOSTATUS_OK;

}       // ECHOSTATUS CEchoGals::GetBaseCapabilities


//===========================================================================
//
// MakePipeIndex is a utility function; it takes a pipe number and an
// input or output flag and returns the pipe index.  Refer to 
// EchoGalsXface.h for more information.
//
//===========================================================================

WORD CEchoGals::MakePipeIndex(WORD wPipe,BOOL fInput)
{
        if (fInput)
                return wPipe + GetNumPipesOut();
        
        return wPipe;   
        
}       // MakePipeIndex


//===========================================================================
//
// Get the card name as an ASCII zero-terminated string
//
//===========================================================================

CONST PCHAR CEchoGals::GetDeviceName()
{ 
        return m_szCardInstallName;
}


//===========================================================================
//
// Get numbers of pipes and busses
//
//===========================================================================

WORD CEchoGals::GetNumPipesOut()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetNumPipesOut();
}

WORD CEchoGals::GetNumPipesIn()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetNumPipesIn();
}

WORD CEchoGals::GetNumBussesOut()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetNumBussesOut();
}

WORD CEchoGals::GetNumBussesIn()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetNumBussesIn();
}

WORD CEchoGals::GetNumBusses()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetNumBusses();
}

WORD CEchoGals::GetNumPipes()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetNumPipes();
}

WORD CEchoGals::GetFirstDigitalBusOut()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetFirstDigitalBusOut();
}

WORD CEchoGals::GetFirstDigitalBusIn()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->GetFirstDigitalBusIn();
}

BOOL CEchoGals::HasVmixer()
{
        if (NULL == GetDspCommObject())
                return 0;
                
        return GetDspCommObject()->HasVmixer();
}


//===========================================================================
//
//      Get access to the DSP comm object
//
//===========================================================================

PCDspCommObject CEchoGals::GetDspCommObject()
{
        return m_pDspCommObject;        
}