1// ****************************************************************************
2//
3//  	CDspCommObjectVmixer.cpp
4//
5//		Implementation file for DSP interface class with vmixer support.
6//
7// ----------------------------------------------------------------------------
8//
9// This file is part of Echo Digital Audio's generic driver library.
10// Copyright Echo Digital Audio Corporation (c) 1998 - 2005
11// All rights reserved
12// www.echoaudio.com
13//
14// This library is free software; you can redistribute it and/or
15// modify it under the terms of the GNU Lesser General Public
16// License as published by the Free Software Foundation; either
17// version 2.1 of the License, or (at your option) any later version.
18//
19// This library is distributed in the hope that it will be useful,
20// but WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22// Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public
25// License along with this library; if not, write to the Free Software
26// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27//
28// ****************************************************************************
29
30#include "CEchoGals.h"
31#include "CDspCommObjectVmixer.h"
32
33
34/****************************************************************************
35
36	Construction and destruction
37
38 ****************************************************************************/
39
40//===========================================================================
41//
42// Constructor
43//
44//===========================================================================
45
46CDspCommObjectVmixer::CDspCommObjectVmixer
47(
48	PDWORD		pdwRegBase,				// Virtual ptr to DSP registers
49	PCOsSupport	pOsSupport
50) : CDspCommObject( pdwRegBase, pOsSupport )
51{
52}	// CDspCommObjectVmixer::CDspCommObjectVmixer( DWORD dwPhysRegBase )
53
54
55//===========================================================================
56//
57// Destructor
58//
59//===========================================================================
60
61CDspCommObjectVmixer::~CDspCommObjectVmixer()
62{
63}	// CDspCommObjectVmixer::~CDspCommObjectVmixer()
64
65
66
67
68/****************************************************************************
69
70	Hardware setup and config
71
72 ****************************************************************************/
73
74//===========================================================================
75//
76// GetAudioMeters
77//
78// Meters are written to the comm page by the DSP as follows:
79//
80// Output busses
81// Input busses
82// Output pipes (vmixer cards only)
83//
84//===========================================================================
85
86ECHOSTATUS CDspCommObjectVmixer::GetAudioMeters
87(
88	PECHOGALS_METERS	pMeters
89)
90{
91	WORD i;
92
93	pMeters->iNumPipesIn = 0;
94
95	//
96	//	Output
97	//
98	DWORD dwCh = 0;
99
100	pMeters->iNumBussesOut = (INT32) m_wNumBussesOut;
101	for (i = 0; i < m_wNumBussesOut; i++)
102	{
103		pMeters->iBusOutVU[i] =
104			DSP_TO_GENERIC( ((INT32) (char) m_pDspCommPage->VUMeter[ dwCh ]) );
105
106		pMeters->iBusOutPeak[i] =
107			DSP_TO_GENERIC( ((INT32) (char) m_pDspCommPage->PeakMeter[ dwCh ]) );
108
109		dwCh++;
110	}
111
112	pMeters->iNumBussesIn = (INT32) m_wNumBussesIn;
113	for (i = 0; i < m_wNumPipesIn; i++)
114	{
115		pMeters->iBusInVU[i] =
116			DSP_TO_GENERIC( ((INT32) (char) m_pDspCommPage->VUMeter[ dwCh ]) );
117		pMeters->iBusInPeak[i] =
118			DSP_TO_GENERIC( ((INT32) (char) m_pDspCommPage->PeakMeter[ dwCh ]) );
119
120		dwCh++;
121	}
122
123	pMeters->iNumPipesOut = (INT32) m_wNumPipesOut;
124	for (i = 0; i < m_wNumPipesOut; i++)
125	{
126		pMeters->iPipeOutVU[i] =
127			DSP_TO_GENERIC( ((INT32) (char) m_pDspCommPage->VUMeter[ dwCh ]) );
128		pMeters->iPipeOutPeak[i] =
129			DSP_TO_GENERIC( ((INT32) (char) m_pDspCommPage->PeakMeter[ dwCh ]) );
130
131		dwCh++;
132	}
133
134	return ECHOSTATUS_OK;
135
136} // GetAudioMeters
137
138
139//===========================================================================
140//
141// GetPipeOutGain and SetPipeOutGain
142//
143// This doesn't set the line out volume; instead, it sets the
144// vmixer volume.
145//
146//===========================================================================
147
148ECHOSTATUS CDspCommObjectVmixer::SetPipeOutGain
149(
150	WORD wPipeOut,
151	WORD wBusOut,
152	INT32 iGain,
153	BOOL fImmediate
154)
155{
156	if (wPipeOut >= m_wNumPipesOut)
157	{
158		ECHO_DEBUGPRINTF( ("CDspCommObjectVmixer::SetPipeOutGain: Invalid out pipe "
159								 "%d\n",
160								 wPipeOut) );
161
162		return ECHOSTATUS_INVALID_CHANNEL;
163	}
164
165	iGain = GENERIC_TO_DSP(iGain);
166
167	if ( wBusOut < m_wNumBussesOut )
168	{
169		if ( !WaitForHandshake() )
170			return ECHOSTATUS_DSP_DEAD;
171
172		DWORD dwIndex = wBusOut * m_wNumPipesOut + wPipeOut;
173		m_pDspCommPage->byVmixerLevel[ dwIndex ] = (BYTE) iGain;
174
175/*
176		ECHO_DEBUGPRINTF( ("CDspCommObjectVmixer::SetPipeOutGain: Out pipe %d, "
177								 "out bus %d = 0x%lx\n",
178								 wPipeOut,
179								 wBusOut,
180								 iGain) );
181*/
182
183		if (fImmediate)
184		{
185			return UpdateVmixerLevel();
186		}
187
188		return ECHOSTATUS_OK;
189	}
190
191	ECHO_DEBUGPRINTF( ("CDspCommObjectVmixer::SetPipeOutGain: Invalid out bus "
192							 "%d\n",
193							 wBusOut) );
194
195	return ECHOSTATUS_INVALID_CHANNEL;
196
197}	// SetPipeOutGain
198
199
200ECHOSTATUS CDspCommObjectVmixer::GetPipeOutGain
201(
202	WORD wPipeOut,
203	WORD wBusOut,
204	INT32 &iGain
205)
206{
207	if (wPipeOut >= m_wNumPipesOut)
208	{
209		ECHO_DEBUGPRINTF( ("CDspCommObjectVmixer::GetPipeOutGain: Invalid out pipe "
210								 "%d\n",
211								 wPipeOut) );
212
213		return ECHOSTATUS_INVALID_CHANNEL;
214	}
215
216	if (wBusOut < m_wNumBussesOut)
217	{
218		iGain = m_pDspCommPage->byVmixerLevel[ wBusOut * m_wNumPipesOut + wPipeOut ];
219		iGain = DSP_TO_GENERIC(iGain);
220		return ECHOSTATUS_OK;
221	}
222
223	ECHO_DEBUGPRINTF( ("CDspCommObjectVmixer::GetPipeOutGain: Invalid out bus "
224							 "%d\n",
225							 wBusOut) );
226
227	return ECHOSTATUS_INVALID_CHANNEL;
228
229}	// GetPipeOutGain
230
231//===========================================================================
232//
233// SetBusOutGain
234//
235//===========================================================================
236
237ECHOSTATUS CDspCommObjectVmixer::SetBusOutGain(WORD wBusOut,INT32 iGain)
238{
239	if ( wBusOut < m_wNumBussesOut )
240	{
241		if ( !WaitForHandshake() )
242			return ECHOSTATUS_DSP_DEAD;
243
244		iGain = GENERIC_TO_DSP(iGain);
245		m_pDspCommPage->OutLineLevel[ wBusOut ] = (BYTE) iGain;
246
247		ECHO_DEBUGPRINTF( ("CDspCommObjectVmixer::SetBusOutGain: Out bus %d "
248								 "= %lu\n",
249								 wBusOut,
250								 iGain) );
251
252		return UpdateAudioOutLineLevel();
253
254	}
255
256	ECHO_DEBUGPRINTF( ("CDspCommObjectVmixer::SetBusOutGain: Invalid out bus "
257							 "%d\n",
258							 wBusOut) );
259
260	return ECHOSTATUS_INVALID_CHANNEL;
261}
262
263
264//===========================================================================
265//
266// Tell the DSP to read and update vmixer levels
267//	from the comm page.
268//
269//===========================================================================
270
271ECHOSTATUS CDspCommObjectVmixer::UpdateVmixerLevel()
272{
273	//ECHO_DEBUGPRINTF( ( "CDspCommObjectVmixer::UpdateVmixerLevel:\n" ) );
274
275	ClearHandshake();
276	return( SendVector( DSP_VC_SET_VMIXER_GAIN ) );
277}
278
279
280// **** CDspCommObjectVmixer.cpp ****
281