// ****************************************************************************
//
//		CEchoGals_WDM.cpp
//
//		Implementation file for the CEchoGals driver class.
//		Set editor tabs to 3 for your viewing pleasure.
//
//		Copyright Echo Digital Audio Corporation (c) 1998 - 2002
//		All rights reserved
//		www.echoaudio.com
//		
//		Permission is hereby granted, free of charge, to any person obtaining a
//		copy of this software and associated documentation files (the
//		"Software"), to deal with the Software without restriction, including
//		without limitation the rights to use, copy, modify, merge, publish,
//		distribute, sublicense, and/or sell copies of the Software, and to
//		permit persons to whom the Software is furnished to do so, subject to
//		the following conditions:
//		
//		- Redistributions of source code must retain the above copyright
//		notice, this list of conditions and the following disclaimers.
//		
//		- Redistributions in binary form must reproduce the above copyright
//		notice, this list of conditions and the following disclaimers in the
//		documentation and/or other materials provided with the distribution.
//		
//		- Neither the name of Echo Digital Audio, nor the names of its
//		contributors may be used to endorse or promote products derived from
//		this Software without specific prior written permission.
//
//		THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
//		EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
//		MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
//		IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR
//		ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
//		TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
//		SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
//
// ****************************************************************************

#include "CEchoGals.h"

#pragma optimize("",off)

//
// Make new daffy ducks for all channels
//
ECHOSTATUS CEchoGals::MakeDaffyDuck(WORD wPipeIndex)
{
	ECHOSTATUS 	Status = ECHOSTATUS_OK;
	
	//---------------------------------------------------------
	//
	// Allocate the main daffy duck for this channel
	//
	//---------------------------------------------------------

	m_pDaffyDucks[wPipeIndex] = new CDaffyDuck( 	m_pOsSupport,
																GetDspCommObject(),
																wPipeIndex );
	if (NULL == m_pDaffyDucks[wPipeIndex])
	{
		return ECHOSTATUS_NO_MEM;
	}
		
	//
	// Check the daffy duck				 
	//
	Status = m_pDaffyDucks[wPipeIndex]->InitCheck();
	if (ECHOSTATUS_OK != Status)
	{
		return Status;
	}

	//
	// Put the daffy duck in the comm page
	//
	GetDspCommObject()->
		SetAudioDuckListPhys(	wPipeIndex,
					  			m_pDaffyDucks[wPipeIndex]->GetPhysStartAddr() );
		
	return Status;
	
}	// MakeDaffyDuck


//
// Kill the daffy duck for a pipe
//
void CEchoGals::KillDaffyDuck(WORD wPipeIndex)	
{
	if (NULL != m_pDaffyDucks[wPipeIndex])
	{
		delete m_pDaffyDucks[wPipeIndex];
		m_pDaffyDucks[wPipeIndex] = NULL;
	}

}	// KillDaffyDuck


//
// Get the daffy duck for a given pipe index
//
CDaffyDuck *CEchoGals::GetDaffyDuck(WORD wPipeIndex)
{
	if (wPipeIndex >= GetNumPipes())
		return NULL;

	return m_pDaffyDucks[wPipeIndex];
}	


//
// Update the 64 bit DMA counter for this channel, allowing
// for DSP position counter wraparound.  
//
void CEchoGals::UpdateDmaPos( WORD wPipeIndex )
{
	DWORD dwDspPos;
	DWORD dwDelta;
	
	dwDspPos = GetDspCommObject()->GetAudioPosition( wPipeIndex );
	dwDelta = dwDspPos - m_dwLastDspPos[ wPipeIndex ];
	
	m_ullDmaPos[ wPipeIndex ] += dwDelta;
	m_dwLastDspPos[ wPipeIndex ] = dwDspPos;

} // UpdateDmaPos


void CEchoGals::ResetDmaPos(WORD wCh)
{
	m_ullDmaPos[ wCh ] = 0;
	m_dwLastDspPos[ wCh ] = 0;

	//
	// There may still be mappings in the daffy duck; if so,
	// tell them to reset their DMA positions starting at zero
	//
	if (NULL != m_pDaffyDucks[wCh])
		m_pDaffyDucks[wCh]->ResetStartPos();
}



#ifdef SIMPHONICS_EXTENSIONS

/*-----------------------------------------------------------------------------

 CEchoGals::SetMixerUberGain

 Set an array of gains to simultaneously set all monitor, virtual output,
 and output bus gains, as per the SimPhonics specifications.

 The structure of the array is as follows:


					Monitor gains

	0		I0->O0	I1->O0	...	I15->O0
	16		I0->O1	I1->O1	...	I15->O1
	...
	240 	I0->O15	I1->O15	...	I15->O15
	
	
					Virtual output gains

	256	V0->O0	V1->O0	...	V15->O0
	272	V0->O1	V1->O1	...	V15->O1
	...
	498	V0->O15	V1->O15	...	V15->O15
	

					Master output bus gains
		
	512	B0			B1			...	B15
	
	
	Values are signed bytes, ranging from +6 to -128 dB.
	
	Right now, this is hard-coded for Layla24v - 16 inputs,
	16 output busses, 16 virtual outputs.

-----------------------------------------------------------------------------*/

#define LAYLA24V_CHANNELS	16

ECHOSTATUS CEchoGals::SetLayla24vUberGain(LAYLA24V_UBER_GAIN *pLug)
{
	if (GetDspCommObject())
		GetDspCommObject()->SetLayla24vUberGain(pLug);
					
	return ECHOSTATUS_OK;
	
}	// SetLayla24vMixerUberGain

#endif // SIMPHONICS_EXTENSIONS