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