xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/CDarla.cpp (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 // ****************************************************************************
2 //
3 //		CDarla.cpp
4 //
5 //		Implementation file for the CDarla driver class; this supports 20 bit
6 //		Darla, not Darla24.
7 //
8 //		Set editor tabs to 3 for your viewing pleasure.
9 //
10 // ----------------------------------------------------------------------------
11 //
12 // This file is part of Echo Digital Audio's generic driver library.
13 // Copyright Echo Digital Audio Corporation (c) 1998 - 2005
14 // All rights reserved
15 // www.echoaudio.com
16 //
17 // This library is free software; you can redistribute it and/or
18 // modify it under the terms of the GNU Lesser General Public
19 // License as published by the Free Software Foundation; either
20 // version 2.1 of the License, or (at your option) any later version.
21 //
22 // This library is distributed in the hope that it will be useful,
23 // but WITHOUT ANY WARRANTY; without even the implied warranty of
24 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25 // Lesser General Public License for more details.
26 //
27 // You should have received a copy of the GNU Lesser General Public
28 // License along with this library; if not, write to the Free Software
29 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
30 //
31 // ****************************************************************************
32 
33 #include "CDarla.h"
34 
35 #define DARLA20_ANALOG_OUTPUT_LATENCY	137
36 #define DARLA20_ANALOG_INPUT_LATENCY	240
37 
38 
39 /****************************************************************************
40 
41 	Construction and destruction
42 
43  ****************************************************************************/
44 
45 //===========================================================================
46 //
47 // Overload new & delete so memory for this object is allocated
48 //	from non-paged memory.
49 //
50 //===========================================================================
51 
52 PVOID CDarla::operator new( size_t Size )
53 {
54 	PVOID 		pMemory;
55 	ECHOSTATUS 	Status;
56 
57 	Status = OsAllocateNonPaged(Size,&pMemory);
58 
59 	if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory ))
60 	{
61 		ECHO_DEBUGPRINTF(("CDarla::operator new - memory allocation failed\n"));
62 
63 		pMemory = NULL;
64 	}
65 	else
66 	{
67 		memset( pMemory, 0, Size );
68 	}
69 
70 	return pMemory;
71 
72 }	// PVOID CDarla::operator new( size_t Size )
73 
74 
75 VOID  CDarla::operator delete( PVOID pVoid )
76 {
77 	if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) )
78 	{
79 		ECHO_DEBUGPRINTF(("CDarla::operator delete memory free failed\n"));
80 	}
81 }	// VOID  CDarla::operator delete( PVOID pVoid )
82 
83 
84 //===========================================================================
85 //
86 // Constructor and destructor
87 //
88 //===========================================================================
89 
90 CDarla::CDarla( PCOsSupport pOsSupport )
91 		: CEchoGals( pOsSupport )
92 {
93 	ECHO_DEBUGPRINTF( ( "CDarla::CDarla() is born!\n" ) );
94 
95 	m_wAnalogOutputLatency = DARLA20_ANALOG_OUTPUT_LATENCY;
96 	m_wAnalogInputLatency = DARLA20_ANALOG_INPUT_LATENCY;
97 }
98 
99 CDarla::~CDarla()
100 {
101 	ECHO_DEBUGPRINTF( ( "CDarla::~CDarla() is toast!\n" ) );
102 }
103 
104 
105 
106 
107 /****************************************************************************
108 
109 	Setup and hardware initialization
110 
111  ****************************************************************************/
112 
113 //===========================================================================
114 //
115 // Every card has an InitHw method
116 //
117 //===========================================================================
118 
119 ECHOSTATUS CDarla::InitHw()
120 {
121 	ECHOSTATUS	Status;
122 
123 	//
124 	// Call the base InitHw 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 CDarlaDspCommObject( (PDWORD) m_pvSharedMemory,
134 																m_pOsSupport );
135 	if (NULL == m_pDspCommObject)
136 	{
137 		ECHO_DEBUGPRINTF(("CDarla::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
150 	//
151 	m_wFlags &= ~ECHOGALS_FLAG_BADBOARD;
152 
153 	//
154 	//	Must call this here *after* DSP is init
155 	//
156 	Status = InitLineLevels();
157 
158 	//
159 	//	Get default sample rate from DSP
160 	//
161 	m_dwSampleRate = GetDspCommObject()->GetSampleRate();
162 
163 	ECHO_DEBUGPRINTF( ( "CDarla::InitHw()\n" ) );
164 
165 	return Status;
166 
167 }	// ECHOSTATUS CDarla::InitHw()
168 
169 
170 
171 
172 /****************************************************************************
173 
174 	Informational methods
175 
176  ****************************************************************************/
177 
178 //===========================================================================
179 //
180 // QueryAudioSampleRate is used to find out if this card can handle a
181 // given sample rate.
182 //
183 //===========================================================================
184 
185 ECHOSTATUS CDarla::QueryAudioSampleRate
186 (
187 	DWORD		dwSampleRate
188 )
189 {
190 	if ( dwSampleRate != 44100 &&
191 		  dwSampleRate != 48000 )
192 	{
193 		ECHO_DEBUGPRINTF(
194 			("CDarla::QueryAudioSampleRate() - rate %ld invalid\n",
195 				dwSampleRate));
196 		return ECHOSTATUS_BAD_FORMAT;
197 	}
198 
199 	ECHO_DEBUGPRINTF( ( "CDarla::QueryAudioSampleRate()\n" ) );
200 	return ECHOSTATUS_OK;
201 
202 }	// ECHOSTATUS CDarla::QueryAudioSampleRate
203 
204 
205 void CDarla::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate)
206 {
207 	dwMinRate = 44100;
208 	dwMaxRate = 48000;
209 }
210 
211 
212 
213 // *** CDarla.cpp ***
214