xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/CLineLevel.cpp (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 // ****************************************************************************
2 //
3 //		CLineLevel.cpp
4 //
5 //		Source file for EchoGals generic driver line level control class.
6 //
7 // 	Controls line levels for input and output busses.
8 //
9 //		Implemented as a base class with 2 derived classes, one for
10 //		each type of bus.
11 //
12 // ----------------------------------------------------------------------------
13 //
14 // This file is part of Echo Digital Audio's generic driver library.
15 // Copyright Echo Digital Audio Corporation (c) 1998 - 2005
16 // All rights reserved
17 // www.echoaudio.com
18 //
19 // This library is free software; you can redistribute it and/or
20 // modify it under the terms of the GNU Lesser General Public
21 // License as published by the Free Software Foundation; either
22 // version 2.1 of the License, or (at your option) any later version.
23 //
24 // This library is distributed in the hope that it will be useful,
25 // but WITHOUT ANY WARRANTY; without even the implied warranty of
26 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27 // Lesser General Public License for more details.
28 //
29 // You should have received a copy of the GNU Lesser General Public
30 // License along with this library; if not, write to the Free Software
31 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
32 //
33 // ****************************************************************************
34 
35 #include "CEchoGals.h"
36 
37 
38 /****************************************************************************
39 
40 	CLineLevel - Construction and destruction
41 
42  ****************************************************************************/
43 
44 //===========================================================================
45 //
46 // Constructor
47 //
48 //===========================================================================
49 
50 CLineLevel::CLineLevel()
51 {
52 
53 	Init( 0, NULL, NULL );
54 
55 }	// CLineLevel::CLineLevel()
56 
57 
58 //===========================================================================
59 //
60 // Destructor
61 //
62 //===========================================================================
63 
64 CLineLevel::~CLineLevel()
65 {
66 }	// CLineLevel::~CLineLevel()
67 
68 
69 //===========================================================================
70 //
71 // Initialization
72 //
73 //===========================================================================
74 
75 void CLineLevel::Init
76 (
77 	WORD				wChannelIndex,	// Which channel we represent
78 	CEchoGals *		pEchoGals,		// For setting line levels
79 	INT32				iGain				// Initial gain setting
80 )
81 {
82 	m_iGain = 0;						// Current gain in dB X 256
83 	m_fMuted = FALSE;
84 	m_pEchoGals = pEchoGals;		// Ptr to our creator object
85 	m_wChannelIndex = wChannelIndex;
86 											// pipe index for this line
87 
88 }	// void CLineLevel::Init
89 
90 
91 /****************************************************************************
92 
93 	CLineLevel - Set and get stuff
94 
95  ****************************************************************************/
96 
97 //===========================================================================
98 //
99 // Set the mute
100 //
101 //===========================================================================
102 
103 ECHOSTATUS CLineLevel::SetMute( BOOL fMute )
104 {
105 	m_fMuted = fMute;
106 	return SetGain(ECHOGAIN_UPDATE);
107 }
108 
109 
110 
111 /****************************************************************************
112 
113 	CBusInLineLevel - Construction and destruction
114 
115  ****************************************************************************/
116 
117 //===========================================================================
118 //
119 //	Construction/destruction
120 //
121 //===========================================================================
122 
123 CBusInLineLevel::CBusInLineLevel()
124 {
125 }	// CBusInLineLevel::CBusInLineLevel()
126 
127 
128 CBusInLineLevel::~CBusInLineLevel()
129 {
130 }	// COutLineLevel::~COutLineLevel()
131 
132 
133 
134 /****************************************************************************
135 
136 	CBusInLineLevel - Get and set stuff
137 
138  ****************************************************************************/
139 
140 
141 //===========================================================================
142 //
143 // Set the mute
144 //
145 //===========================================================================
146 
147 ECHOSTATUS CBusInLineLevel::SetMute( BOOL fMute )
148 {
149 	if (fMute != m_fMuted)
150 	{
151 		m_pEchoGals->MixerControlChanged(ECHO_BUS_IN,
152 													MXN_MUTE,
153 													m_wChannelIndex);
154 	}
155 	return CLineLevel::SetMute(fMute);
156 }
157 
158 
159 //===========================================================================
160 //
161 // Set the gain
162 //
163 //===========================================================================
164 
165 ECHOSTATUS CBusInLineLevel::SetGain
166 (
167 	INT32 	iGain,
168 	BOOL 	fImmediate
169 )
170 {
171 	ECHOSTATUS	Status;
172 
173 	if ( NULL == m_pEchoGals ||
174 		  NULL == m_pEchoGals->GetDspCommObject() ||
175 		  m_pEchoGals->GetDspCommObject()->IsBoardBad() )
176 		return ECHOSTATUS_DSP_DEAD;
177 
178 	//
179 	// If the magic ECHOGAIN_UPDATE value was passed in,
180 	// use the stored gain.  Otherwise, clamp the gain.
181 	//
182 	if ( ECHOGAIN_UPDATE == iGain )
183 		iGain = m_iGain;
184 	else if ( iGain < ECHOGAIN_MININP )
185 		iGain = ECHOGAIN_MININP;
186 	else if ( iGain > ECHOGAIN_MAXINP )
187 		iGain = ECHOGAIN_MAXINP;
188 
189 	//
190 	// Generate a control notify if necessary
191 	//
192 	if ( m_iGain != iGain )
193 	{
194 		m_iGain = iGain;
195 		m_pEchoGals->MixerControlChanged(ECHO_BUS_IN,
196 													MXN_LEVEL,
197 													m_wChannelIndex);
198 	}
199 
200 	//
201 	// Mute?
202 	//
203 	if (m_fMuted)
204 	{
205 		iGain = ECHOGAIN_MININP;
206 	}
207 
208 	//
209 	// Tell the DSP what to do
210 	//
211 	iGain <<= 1; 	// Preserver half-dB steps in input gain
212 	Status =
213 		m_pEchoGals->GetDspCommObject()->SetBusInGain
214 						( m_wChannelIndex,
215 						  (BYTE) ( GENERIC_TO_DSP( iGain ) ) );
216 								  // Shift iGain up by 1 to preserve half-dB steps
217 
218 	return Status;
219 
220 }	// ECHOSTATUS CBusInLineLevel::SetGain
221 
222 
223 
224 /****************************************************************************
225 
226 	CBusOutLineLevel - Construction and destruction
227 
228  ****************************************************************************/
229 
230 //===========================================================================
231 //
232 //	Construction/destruction
233 //
234 //===========================================================================
235 
236 //
237 //	Construction/destruction
238 //
239 CBusOutLineLevel::CBusOutLineLevel()
240 {
241 }	// CBusOutLineLevel::CBusOutLineLevel()
242 
243 
244 CBusOutLineLevel::~CBusOutLineLevel()
245 {
246 }	// CBusOutLineLevel::~CBusOutLineLevel()
247 
248 
249 
250 
251 /****************************************************************************
252 
253 	CBusOutLineLevel - Get and set stuff
254 
255  ****************************************************************************/
256 
257 
258 //===========================================================================
259 //
260 // Set the mute
261 //
262 //===========================================================================
263 
264 ECHOSTATUS CBusOutLineLevel::SetMute( BOOL fMute )
265 {
266 	if (fMute != m_fMuted)
267 	{
268 		m_pEchoGals->MixerControlChanged(ECHO_BUS_OUT,
269 													MXN_MUTE,
270 													m_wChannelIndex);
271 	}
272 	return CLineLevel::SetMute(fMute);
273 }
274 
275 
276 //===========================================================================
277 //
278 // Set the gain
279 //
280 //===========================================================================
281 
282 ECHOSTATUS CBusOutLineLevel::SetGain
283 (
284 	INT32 	iGain,
285 	BOOL 		fImmediate
286 )
287 {
288 	ECHOSTATUS	Status = ECHOSTATUS_OK;
289 
290 	if ( NULL == m_pEchoGals ||
291 		  NULL == m_pEchoGals->GetDspCommObject() ||
292 		  m_pEchoGals->GetDspCommObject()->IsBoardBad() )
293 		return ECHOSTATUS_DSP_DEAD;
294 
295 	//
296 	// If iGain is ECHOGAIN_UPDATE, then the caller
297 	// wants this function to re-do the gain setting
298 	// with the currently stored value
299 	//
300 	// Otherwise, clamp the gain setting
301 	//
302 	if ( ECHOGAIN_UPDATE == iGain )
303 		iGain = m_iGain;
304 	else if ( iGain < ECHOGAIN_MUTED )
305 		iGain = ECHOGAIN_MUTED;
306 	else if ( iGain > ECHOGAIN_MAXOUT )
307 		iGain = ECHOGAIN_MAXOUT;
308 
309 	//
310 	// Mark this control as changed
311 	//
312 	if ( m_iGain != iGain )
313 	{
314 		m_iGain = iGain;
315 
316 		if ( ECHOSTATUS_OK == Status )
317 			Status = m_pEchoGals->MixerControlChanged(ECHO_BUS_OUT,
318 																	MXN_LEVEL,
319 																	m_wChannelIndex);
320 	}
321 
322 	//
323 	// Set the gain to mute if this bus is muted
324 	//
325 	INT32 iGainTemp = iGain;
326 	if ( m_fMuted )
327 		iGainTemp = ECHOGAIN_MUTED;
328 
329 	//
330 	// Tell all the monitors for this output bus to
331 	// update their gains
332 	//
333 	m_pEchoGals->AdjustMonitorsForBusOut(m_wChannelIndex);
334 
335 	//
336 	// Tell all the output pipes for this output bus
337 	// to update their gains
338 	//
339 	m_pEchoGals->AdjustPipesOutForBusOut(m_wChannelIndex,iGainTemp);
340 
341 	return Status;
342 
343 }	// ECHOSTATUS CBusOutLineLevel::SetGain
344 
345 
346 // **** CLineLevel.cpp ****
347