xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/CDarla24.cpp (revision 4dd9e43637031d2c5a6755a0184040f0de8f2884)
1 // ****************************************************************************
2 //
3 //		CDarla24.cpp
4 //
5 //		Implementation file for the CDarla24 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 "CDarla24.h"
32 
33 #define DARLA24_ANALOG_OUTPUT_LATENCY	59
34 #define DARLA24_ANALOG_INPUT_LATENCY	71
35 
36 
37 /****************************************************************************
38 
39 	Construction and destruction
40 
41  ****************************************************************************/
42 
43 //===========================================================================
44 //
45 // Overload new & delete so memory for this object is allocated
46 //	from non-paged memory.
47 //
48 //===========================================================================
49 
operator new(size_t Size)50 PVOID CDarla24::operator new( size_t Size )
51 {
52 	PVOID 		pMemory;
53 	ECHOSTATUS 	Status;
54 
55 	Status = OsAllocateNonPaged(Size,&pMemory);
56 
57 	if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory ))
58 	{
59 		ECHO_DEBUGPRINTF(("CDarla24::operator new - memory allocation failed\n"));
60 
61 		pMemory = NULL;
62 	}
63 	else
64 	{
65 		memset( pMemory, 0, Size );
66 	}
67 
68 	return pMemory;
69 
70 }	// PVOID CDarla24::operator new( size_t Size )
71 
72 
operator delete(PVOID pVoid)73 VOID  CDarla24::operator delete( PVOID pVoid )
74 {
75 	if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) )
76 	{
77 		ECHO_DEBUGPRINTF(("CDarla24::operator delete memory free failed\n"));
78 	}
79 }	// VOID CDarla24::operator delete( PVOID pVoid )
80 
81 
82 //===========================================================================
83 //
84 // Constructor and destructor
85 //
86 //===========================================================================
87 
CDarla24(PCOsSupport pOsSupport)88 CDarla24::CDarla24( PCOsSupport pOsSupport )
89 			: CEchoGals( pOsSupport )
90 {
91 	ECHO_DEBUGPRINTF( ( "CDarla24::CDarla24() is born!\n" ) );
92 
93 	m_wAnalogOutputLatency = DARLA24_ANALOG_OUTPUT_LATENCY;
94 	m_wAnalogInputLatency = DARLA24_ANALOG_INPUT_LATENCY;
95 
96 }
97 
~CDarla24()98 CDarla24::~CDarla24()
99 {
100 	ECHO_DEBUGPRINTF( ( "CDarla24::~CDarla24() is toast!\n" ) );
101 }
102 
103 
104 
105 
106 /****************************************************************************
107 
108 	Setup and hardware initialization
109 
110  ****************************************************************************/
111 
112 //===========================================================================
113 //
114 // Every card has an InitHw method
115 //
116 //===========================================================================
117 
InitHw()118 ECHOSTATUS CDarla24::InitHw()
119 {
120 	ECHOSTATUS	Status;
121 	WORD			i;
122 
123 	//
124 	// Call the base method
125 	//
126 	if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) )
127 		return Status;
128 
129 	//
130 	// Create the DSP comm object
131 	//
132 	ECHO_ASSERT(NULL == m_pDspCommObject );
133 	m_pDspCommObject = new CDarla24DspCommObject( (PDWORD) m_pvSharedMemory,
134 																 m_pOsSupport );
135 	if (NULL == m_pDspCommObject)
136 	{
137 		ECHO_DEBUGPRINTF(("CDarla24::InitHw - could not create DSP comm object\n"));
138 		return ECHOSTATUS_NO_MEM;
139 	}
140 
141 	//
142 	//	Load the DSP
143 	//
144 	GetDspCommObject()->LoadFirmware();
145 	if ( GetDspCommObject()->IsBoardBad() )
146 		return ECHOSTATUS_DSP_DEAD;
147 
148 	//
149 	// Clear the "bad board" flag; set the flag to indicate that
150 	// Darla24 can handle super-interleave.
151 	//
152 	m_wFlags &= ~ECHOGALS_FLAG_BADBOARD;
153 	m_wFlags |= ECHOGALS_ROFLAG_SUPER_INTERLEAVE_OK;
154 
155 	//
156 	//	Must call this here after DSP is init to
157 	//	init gains
158 	//
159 	Status = InitLineLevels();
160 	if ( ECHOSTATUS_OK != Status )
161 		return Status;
162 
163 	//
164 	// Set defaults for +4/-10
165 	//
166 	for (i = 0; i < GetNumBusses(); i++ )
167 	{
168 		GetDspCommObject()->SetNominalLevel( i, FALSE );	// FALSE is +4 here
169 	}
170 
171 	//
172 	//	Get default sample rate from DSP
173 	//
174 	m_dwSampleRate = GetDspCommObject()->GetSampleRate();
175 	ECHO_DEBUGPRINTF( ( "CDarla24::InitHw()\n" ) );
176 
177 	return Status;
178 
179 }	// ECHOSTATUS CDarla24::InitHw()
180 
181 
182 
183 
184 /****************************************************************************
185 
186 	Informational methods
187 
188  ****************************************************************************/
189 
190 //===========================================================================
191 //
192 // Override GetCapabilities to enumerate unique capabilties for this card
193 //
194 //===========================================================================
195 
GetCapabilities(PECHOGALS_CAPS pCapabilities)196 ECHOSTATUS CDarla24::GetCapabilities
197 (
198 	PECHOGALS_CAPS	pCapabilities
199 )
200 {
201 	ECHOSTATUS	Status;
202 	WORD			i;
203 
204 	Status = GetBaseCapabilities(pCapabilities);
205 
206 	//
207 	// Add nominal level control to in & out busses
208 	//
209 	for (i = 0 ; i < GetNumBussesOut(); i++)
210 	{
211 		pCapabilities->dwBusOutCaps[i] |= ECHOCAPS_NOMINAL_LEVEL;
212 	}
213 
214 	for (i = 0 ; i < GetNumBussesIn(); i++)
215 	{
216 		pCapabilities->dwBusInCaps[i] |= ECHOCAPS_NOMINAL_LEVEL;
217 	}
218 
219 	if ( ECHOSTATUS_OK != Status )
220 		return Status;
221 
222 	pCapabilities->dwInClockTypes |= ECHO_CLOCK_BIT_ESYNC;
223 
224 	return Status;
225 
226 }	// ECHOSTATUS CDarla24::GetCapabilities
227 
228 
229 //===========================================================================
230 //
231 // GetInputClockDetect returns a bitmask consisting of all the input
232 // clocks currently connected to the hardware; this changes as the user
233 // connects and disconnects clock inputs.
234 //
235 // You should use this information to determine which clocks the user is
236 // allowed to select.
237 //
238 // Darla24 only supports Esync input clock.
239 //
240 //===========================================================================
241 
GetInputClockDetect(DWORD & dwClockDetectBits)242 ECHOSTATUS CDarla24::GetInputClockDetect(DWORD &dwClockDetectBits)
243 {
244 	if ( NULL == GetDspCommObject() || GetDspCommObject()->IsBoardBad() )
245 	{
246 		ECHO_DEBUGPRINTF( ("CDarla24::GetInputClockDetect: DSP Dead!\n") );
247 		return ECHOSTATUS_DSP_DEAD;
248 	}
249 
250 	DWORD dwClocksFromDsp = GetDspCommObject()->GetInputClockDetect();
251 
252 	dwClockDetectBits = ECHO_CLOCK_BIT_INTERNAL;
253 
254 	if (0 != (dwClocksFromDsp & GLDM_CLOCK_DETECT_BIT_ESYNC))
255 		dwClockDetectBits |= ECHO_CLOCK_BIT_ESYNC;
256 
257 	return ECHOSTATUS_OK;
258 
259 }	// GetInputClockDetect
260 
261 
262 //===========================================================================
263 //
264 // QueryAudioSampleRate is used to find out if this card can handle a
265 // given sample rate.
266 //
267 //===========================================================================
268 
QueryAudioSampleRate(DWORD dwSampleRate)269 ECHOSTATUS CDarla24::QueryAudioSampleRate
270 (
271 	DWORD		dwSampleRate
272 )
273 {
274 	if ( dwSampleRate != 8000 &&
275 		  dwSampleRate != 11025 &&
276 		  dwSampleRate != 16000 &&
277 		  dwSampleRate != 22050 &&
278 		  dwSampleRate != 32000 &&
279 		  dwSampleRate != 44100 &&
280 		  dwSampleRate != 48000 &&
281 		  dwSampleRate != 88200 &&
282 		  dwSampleRate != 96000 )
283 	{
284 		ECHO_DEBUGPRINTF(
285 			("CDarla24::QueryAudioSampleRate() - rate %ld invalid\n",
286 			dwSampleRate) );
287 		return ECHOSTATUS_BAD_FORMAT;
288 	}
289 
290 	ECHO_DEBUGPRINTF( ( "CDarla24::QueryAudioSampleRate()\n" ) );
291 	return ECHOSTATUS_OK;
292 
293 }	// ECHOSTATUS CDarla24::QueryAudioSampleRate
294 
QuerySampleRateRange(DWORD & dwMinRate,DWORD & dwMaxRate)295 void CDarla24::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate)
296 {
297 	dwMinRate = 8000;
298 	dwMaxRate = 96000;
299 }
300 
301 
302 
303 // *** CDarla24.cpp ***
304