1// **************************************************************************** 2// 3// CIndigoIO.cpp 4// 5// Implementation file for the CIndigoIO 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 "CIndigoIO.h" 32#include "CIndigoDJ.h" 33 34#define INDIGO_IO_OUTPUT_LATENCY_SINGLE_SPEED 44 35#define INDIGO_IO_OUTPUT_LATENCY_DOUBLE_SPEED 37 36#define INDIGO_IO_INPUT_LATENCY_SINGLE_SPEED 44 37#define INDIGO_IO_INPUT_LATENCY_DOUBLE_SPEED 41 38 39 40/**************************************************************************** 41 42 Construction and destruction 43 44 ****************************************************************************/ 45 46//=========================================================================== 47// 48// Overload new & delete so memory for this object is allocated 49// from non-paged memory. 50// 51//=========================================================================== 52 53PVOID CIndigoIO::operator new( size_t Size ) 54{ 55 PVOID pMemory; 56 ECHOSTATUS Status; 57 58 Status = OsAllocateNonPaged(Size,&pMemory); 59 60 if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory )) 61 { 62 ECHO_DEBUGPRINTF(("CIndigoIO::operator new - memory allocation failed\n")); 63 64 pMemory = NULL; 65 } 66 else 67 { 68 memset( pMemory, 0, Size ); 69 } 70 71 return pMemory; 72 73} // PVOID CIndigoIO::operator new( size_t Size ) 74 75 76VOID CIndigoIO::operator delete( PVOID pVoid ) 77{ 78 if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) ) 79 { 80 ECHO_DEBUGPRINTF(("CIndigoIO::operator delete memory free failed\n")); 81 } 82} // VOID CIndigoIO::operator delete( PVOID pVoid ) 83 84 85 86//=========================================================================== 87// 88// Constructor and destructor 89// 90//=========================================================================== 91 92CIndigoIO::CIndigoIO( PCOsSupport pOsSupport ) 93 : CEchoGalsVmixer( pOsSupport ) 94{ 95 ECHO_DEBUGPRINTF( ( "CIndigoIO::CIndigoIO() is born!\n" ) ); 96} 97 98CIndigoIO::~CIndigoIO() 99{ 100 ECHO_DEBUGPRINTF( ( "CIndigoIO::~CIndigoIO() 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 118ECHOSTATUS CIndigoIO::InitHw() 119{ 120 ECHOSTATUS Status; 121 122 // 123 // Call the base method 124 // 125 if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) ) 126 return Status; 127 128 // 129 // Create the DSP comm object 130 // 131 ECHO_ASSERT(NULL == m_pDspCommObject ); 132 m_pDspCommObject = new CIndigoIODspCommObject( (PDWORD) m_pvSharedMemory, 133 m_pOsSupport ); 134 if (NULL == m_pDspCommObject) 135 { 136 ECHO_DEBUGPRINTF(("CIndigoIO::InitHw - could not create DSP comm object\n")); 137 return ECHOSTATUS_NO_MEM; 138 } 139 140 // 141 // Load the DSP 142 // 143 GetDspCommObject()->LoadFirmware(); 144 if ( GetDspCommObject()->IsBoardBad() ) 145 return ECHOSTATUS_DSP_DEAD; 146 147 // 148 // Do flags 149 // 150 m_wFlags &= ~ECHOGALS_FLAG_BADBOARD; 151 m_wFlags |= ECHOGALS_ROFLAG_SUPER_INTERLEAVE_OK; 152 153 // 154 // Must call this here after DSP is init to 155 // init gains and mutes 156 // 157 Status = InitLineLevels(); 158 if ( ECHOSTATUS_OK != Status ) 159 return Status; 160 161 // 162 // Get default sample rate from DSP 163 // 164 m_dwSampleRate = GetDspCommObject()->GetSampleRate(); 165 166 ECHO_DEBUGPRINTF( ( "CIndigoIO::InitHw() complete\n" ) ); 167 return Status; 168 169} // ECHOSTATUS CIndigoIO::InitHw() 170 171 172 173 174/**************************************************************************** 175 176 Informational methods 177 178 ****************************************************************************/ 179 180//=========================================================================== 181// 182// Override GetCapabilities to enumerate unique capabilties for this card 183// 184//=========================================================================== 185 186ECHOSTATUS CIndigoIO::GetCapabilities 187( 188 PECHOGALS_CAPS pCapabilities 189) 190{ 191 ECHOSTATUS Status; 192 193 Status = GetBaseCapabilities(pCapabilities); 194 if ( ECHOSTATUS_OK != Status ) 195 return Status; 196 197 pCapabilities->dwOutClockTypes = 0; 198 199 return Status; 200 201} // ECHOSTATUS CIndigoIO::GetCapabilities 202 203 204//=========================================================================== 205// 206// QueryAudioSampleRate is used to find out if this card can handle a 207// given sample rate. 208// 209//=========================================================================== 210 211ECHOSTATUS CIndigoIO::QueryAudioSampleRate 212( 213 DWORD dwSampleRate 214) 215{ 216 if ( dwSampleRate != 32000 && 217 dwSampleRate != 44100 && 218 dwSampleRate != 48000 && 219 dwSampleRate != 64000 && 220 dwSampleRate != 88200 && 221 dwSampleRate != 96000 222 ) 223 { 224 ECHO_DEBUGPRINTF( 225 ("CIndigoIO::QueryAudioSampleRate() - rate %ld invalid\n",dwSampleRate) ); 226 return ECHOSTATUS_BAD_FORMAT; 227 } 228 229 ECHO_DEBUGPRINTF( ( "CIndigoIO::QueryAudioSampleRate()\n" ) ); 230 return ECHOSTATUS_OK; 231 232} // ECHOSTATUS CIndigoIO::QueryAudioSampleRate 233 234 235void CIndigoIO::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate) 236{ 237 dwMinRate = 32000; 238 dwMaxRate = 96000; 239} 240 241 242//=========================================================================== 243// 244// GetAudioLatency - returns the latency for a single pipe 245// 246//=========================================================================== 247 248void CIndigoIO::GetAudioLatency(ECHO_AUDIO_LATENCY *pLatency) 249{ 250 DWORD dwLatency; 251 DWORD dwSampleRate; 252 253 // 254 // The latency depends on the current sample rate 255 // 256 dwSampleRate = GetDspCommObject()->GetSampleRate(); 257 if (FALSE == pLatency->wIsInput) 258 { 259 if (dwSampleRate < 50000) 260 dwLatency = INDIGO_IO_OUTPUT_LATENCY_SINGLE_SPEED; 261 else 262 dwLatency = INDIGO_IO_OUTPUT_LATENCY_DOUBLE_SPEED; 263 } 264 else 265 { 266 if (dwSampleRate < 50000) 267 dwLatency = INDIGO_IO_INPUT_LATENCY_SINGLE_SPEED; 268 else 269 dwLatency = INDIGO_IO_INPUT_LATENCY_DOUBLE_SPEED; 270 } 271 272 pLatency->dwLatency = dwLatency; 273 274} // GetAudioLatency 275 276// *** CIndigoIO.cpp *** 277