1// ****************************************************************************
2//
3//		CIndigo.cpp
4//
5//		Implementation file for the CIndigo driver class.
6//		Set editor tabs to 3 for your viewing pleasure.
7//
8// ----------------------------------------------------------------------------
9//
10// This file is part of Echo Digital Audio's generic driver library.
11// Copyright Echo Digital Audio Corporation (c) 1998 - 2005
12// All rights reserved
13// www.echoaudio.com
14//
15// This library is free software; you can redistribute it and/or
16// modify it under the terms of the GNU Lesser General Public
17// License as published by the Free Software Foundation; either
18// version 2.1 of the License, or (at your option) any later version.
19//
20// This library is distributed in the hope that it will be useful,
21// but WITHOUT ANY WARRANTY; without even the implied warranty of
22// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23// Lesser General Public License for more details.
24//
25// You should have received a copy of the GNU Lesser General Public
26// License along with this library; if not, write to the Free Software
27// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28//
29// ****************************************************************************
30
31#include "CIndigo.h"
32
33#define INDIGO_ANALOG_OUTPUT_LATENCY	91
34
35
36/****************************************************************************
37
38	Construction and destruction
39
40 ****************************************************************************/
41
42//===========================================================================
43//
44// Overload new & delete so memory for this object is allocated
45//	from non-paged memory.
46//
47//===========================================================================
48
49PVOID CIndigo::operator new( size_t Size )
50{
51	PVOID 		pMemory;
52	ECHOSTATUS 	Status;
53
54	Status = OsAllocateNonPaged(Size,&pMemory);
55
56	if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory ))
57	{
58		ECHO_DEBUGPRINTF(("CIndigo::operator new - memory allocation failed\n"));
59
60		pMemory = NULL;
61	}
62	else
63	{
64		memset( pMemory, 0, Size );
65	}
66
67	return pMemory;
68
69}	// PVOID CIndigo::operator new( size_t Size )
70
71
72VOID  CIndigo::operator delete( PVOID pVoid )
73{
74	if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) )
75	{
76		ECHO_DEBUGPRINTF(("CIndigo::operator delete memory free failed\n"));
77	}
78}	// VOID CIndigo::operator delete( PVOID pVoid )
79
80
81
82//===========================================================================
83//
84// Constructor and destructor
85//
86//===========================================================================
87
88CIndigo::CIndigo( PCOsSupport pOsSupport )
89	  : CEchoGalsVmixer( pOsSupport )
90{
91	ECHO_DEBUGPRINTF( ( "CIndigo::CIndigo() is born!\n" ) );
92
93	m_wAnalogOutputLatency = INDIGO_ANALOG_OUTPUT_LATENCY;
94}
95
96CIndigo::~CIndigo()
97{
98	ECHO_DEBUGPRINTF( ( "CIndigo::~CIndigo() is toast!\n" ) );
99}
100
101
102
103
104/****************************************************************************
105
106	Setup and hardware initialization
107
108 ****************************************************************************/
109
110//===========================================================================
111//
112// Every card has an InitHw method
113//
114//===========================================================================
115
116ECHOSTATUS CIndigo::InitHw()
117{
118	ECHOSTATUS	Status;
119
120	//
121	// Call the base method
122	//
123	if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) )
124		return Status;
125
126	//
127	// Create the DSP comm object
128	//
129	m_pDspCommObject = new CIndigoDspCommObject( (PDWORD) m_pvSharedMemory,
130															 m_pOsSupport );
131 	if (NULL == m_pDspCommObject)
132	{
133		ECHO_DEBUGPRINTF(("CIndigo::InitHw - could not create DSP comm object\n"));
134		return ECHOSTATUS_NO_MEM;
135	}
136
137	//
138	// Load the DSP
139	//
140	GetDspCommObject()->LoadFirmware();
141	if ( GetDspCommObject()->IsBoardBad() )
142		return ECHOSTATUS_DSP_DEAD;
143
144	//
145	// Do flags
146	//
147	m_wFlags &= ~ECHOGALS_FLAG_BADBOARD;
148	m_wFlags |= ECHOGALS_ROFLAG_SUPER_INTERLEAVE_OK;
149
150	//
151	//	Must call this here after DSP is init to
152	//	init gains and mutes
153	//
154	Status = InitLineLevels();
155	if ( ECHOSTATUS_OK != Status )
156		return Status;
157
158	//
159	//	Get default sample rate from DSP
160	//
161	m_dwSampleRate = GetDspCommObject()->GetSampleRate();
162
163	ECHO_DEBUGPRINTF( ( "CIndigo::InitHw()\n" ) );
164	return Status;
165
166}	// ECHOSTATUS CIndigo::InitHw()
167
168
169
170
171/****************************************************************************
172
173	Informational methods
174
175 ****************************************************************************/
176
177//===========================================================================
178//
179// Override GetCapabilities to enumerate unique capabilties for this card
180//
181//===========================================================================
182
183ECHOSTATUS CIndigo::GetCapabilities
184(
185	PECHOGALS_CAPS	pCapabilities
186)
187{
188	ECHOSTATUS Status;
189
190	Status = GetBaseCapabilities(pCapabilities);
191	if ( ECHOSTATUS_OK != Status )
192		return Status;
193
194	pCapabilities->dwOutClockTypes = 0;
195
196	pCapabilities->dwPipeInCaps[0] = ECHOCAPS_DUMMY;
197	pCapabilities->dwPipeInCaps[1] = ECHOCAPS_DUMMY;
198	pCapabilities->dwBusInCaps[0] = ECHOCAPS_DUMMY;
199	pCapabilities->dwBusInCaps[1] = ECHOCAPS_DUMMY;
200
201	return Status;
202
203}	// ECHOSTATUS CIndigo::GetCapabilities
204
205
206//===========================================================================
207//
208// QueryAudioSampleRate is used to find out if this card can handle a
209// given sample rate.
210//
211//===========================================================================
212
213ECHOSTATUS CIndigo::QueryAudioSampleRate
214(
215	DWORD		dwSampleRate
216)
217{
218	if ( dwSampleRate != 32000 &&
219		  dwSampleRate != 44100 &&
220		  dwSampleRate != 48000 &&
221		  dwSampleRate != 88200 &&
222		  dwSampleRate != 96000 )
223	{
224		ECHO_DEBUGPRINTF(
225			("CIndigo::QueryAudioSampleRate() - rate %ld invalid\n",dwSampleRate) );
226		return ECHOSTATUS_BAD_FORMAT;
227	}
228
229	ECHO_DEBUGPRINTF( ( "CIndigo::QueryAudioSampleRate()\n" ) );
230	return ECHOSTATUS_OK;
231
232}	// ECHOSTATUS CIndigo::QueryAudioSampleRate
233
234
235void CIndigo::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate)
236{
237	dwMinRate = 32000;
238	dwMaxRate = 96000;
239}
240
241
242//===========================================================================
243//
244// Indigo & Indigo DJ don't have monitor mixers, so this works differently
245// from other vmixer cards.
246//
247//===========================================================================
248
249ECHOSTATUS CIndigo::AdjustMonitorsForBusOut(WORD wBusOut)
250{
251	return ECHOSTATUS_OK;
252}
253
254// *** CIndigo.cpp ***
255