1 // **************************************************************************** 2 // 3 // CIndigo.cpp 4 // 5 // Implementation file for the CIndigo 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 "CIndigo.h" 32 33 #define INDIGO_ANALOG_OUTPUT_LATENCY 91 34 35 36 /**************************************************************************** 37 38 Construction and destruction 39 40 ****************************************************************************/ 41 42 //=========================================================================== 43 // 44 // Overload new & delete so memory for this object is allocated 45 // from non-paged memory. 46 // 47 //=========================================================================== 48 49 PVOID CIndigo::operator new( size_t Size ) 50 { 51 PVOID pMemory; 52 ECHOSTATUS Status; 53 54 Status = OsAllocateNonPaged(Size,&pMemory); 55 56 if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory )) 57 { 58 ECHO_DEBUGPRINTF(("CIndigo::operator new - memory allocation failed\n")); 59 60 pMemory = NULL; 61 } 62 else 63 { 64 memset( pMemory, 0, Size ); 65 } 66 67 return pMemory; 68 69 } // PVOID CIndigo::operator new( size_t Size ) 70 71 72 VOID CIndigo::operator delete( PVOID pVoid ) 73 { 74 if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) ) 75 { 76 ECHO_DEBUGPRINTF(("CIndigo::operator delete memory free failed\n")); 77 } 78 } // VOID CIndigo::operator delete( PVOID pVoid ) 79 80 81 82 //=========================================================================== 83 // 84 // Constructor and destructor 85 // 86 //=========================================================================== 87 88 CIndigo::CIndigo( PCOsSupport pOsSupport ) 89 : CEchoGalsVmixer( pOsSupport ) 90 { 91 ECHO_DEBUGPRINTF( ( "CIndigo::CIndigo() is born!\n" ) ); 92 93 m_wAnalogOutputLatency = INDIGO_ANALOG_OUTPUT_LATENCY; 94 } 95 96 CIndigo::~CIndigo() 97 { 98 ECHO_DEBUGPRINTF( ( "CIndigo::~CIndigo() is toast!\n" ) ); 99 } 100 101 102 103 104 /**************************************************************************** 105 106 Setup and hardware initialization 107 108 ****************************************************************************/ 109 110 //=========================================================================== 111 // 112 // Every card has an InitHw method 113 // 114 //=========================================================================== 115 116 ECHOSTATUS CIndigo::InitHw() 117 { 118 ECHOSTATUS Status; 119 120 // 121 // Call the base method 122 // 123 if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) ) 124 return Status; 125 126 // 127 // Create the DSP comm object 128 // 129 m_pDspCommObject = new CIndigoDspCommObject( (PDWORD) m_pvSharedMemory, 130 m_pOsSupport ); 131 if (NULL == m_pDspCommObject) 132 { 133 ECHO_DEBUGPRINTF(("CIndigo::InitHw - could not create DSP comm object\n")); 134 return ECHOSTATUS_NO_MEM; 135 } 136 137 // 138 // Load the DSP 139 // 140 GetDspCommObject()->LoadFirmware(); 141 if ( GetDspCommObject()->IsBoardBad() ) 142 return ECHOSTATUS_DSP_DEAD; 143 144 // 145 // Do flags 146 // 147 m_wFlags &= ~ECHOGALS_FLAG_BADBOARD; 148 m_wFlags |= ECHOGALS_ROFLAG_SUPER_INTERLEAVE_OK; 149 150 // 151 // Must call this here after DSP is init to 152 // init gains and mutes 153 // 154 Status = InitLineLevels(); 155 if ( ECHOSTATUS_OK != Status ) 156 return Status; 157 158 // 159 // Get default sample rate from DSP 160 // 161 m_dwSampleRate = GetDspCommObject()->GetSampleRate(); 162 163 ECHO_DEBUGPRINTF( ( "CIndigo::InitHw()\n" ) ); 164 return Status; 165 166 } // ECHOSTATUS CIndigo::InitHw() 167 168 169 170 171 /**************************************************************************** 172 173 Informational methods 174 175 ****************************************************************************/ 176 177 //=========================================================================== 178 // 179 // Override GetCapabilities to enumerate unique capabilties for this card 180 // 181 //=========================================================================== 182 183 ECHOSTATUS CIndigo::GetCapabilities 184 ( 185 PECHOGALS_CAPS pCapabilities 186 ) 187 { 188 ECHOSTATUS Status; 189 190 Status = GetBaseCapabilities(pCapabilities); 191 if ( ECHOSTATUS_OK != Status ) 192 return Status; 193 194 pCapabilities->dwOutClockTypes = 0; 195 196 pCapabilities->dwPipeInCaps[0] = ECHOCAPS_DUMMY; 197 pCapabilities->dwPipeInCaps[1] = ECHOCAPS_DUMMY; 198 pCapabilities->dwBusInCaps[0] = ECHOCAPS_DUMMY; 199 pCapabilities->dwBusInCaps[1] = ECHOCAPS_DUMMY; 200 201 return Status; 202 203 } // ECHOSTATUS CIndigo::GetCapabilities 204 205 206 //=========================================================================== 207 // 208 // QueryAudioSampleRate is used to find out if this card can handle a 209 // given sample rate. 210 // 211 //=========================================================================== 212 213 ECHOSTATUS CIndigo::QueryAudioSampleRate 214 ( 215 DWORD dwSampleRate 216 ) 217 { 218 if ( dwSampleRate != 32000 && 219 dwSampleRate != 44100 && 220 dwSampleRate != 48000 && 221 dwSampleRate != 88200 && 222 dwSampleRate != 96000 ) 223 { 224 ECHO_DEBUGPRINTF( 225 ("CIndigo::QueryAudioSampleRate() - rate %ld invalid\n",dwSampleRate) ); 226 return ECHOSTATUS_BAD_FORMAT; 227 } 228 229 ECHO_DEBUGPRINTF( ( "CIndigo::QueryAudioSampleRate()\n" ) ); 230 return ECHOSTATUS_OK; 231 232 } // ECHOSTATUS CIndigo::QueryAudioSampleRate 233 234 235 void CIndigo::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate) 236 { 237 dwMinRate = 32000; 238 dwMaxRate = 96000; 239 } 240 241 242 //=========================================================================== 243 // 244 // Indigo & Indigo DJ don't have monitor mixers, so this works differently 245 // from other vmixer cards. 246 // 247 //=========================================================================== 248 249 ECHOSTATUS CIndigo::AdjustMonitorsForBusOut(WORD wBusOut) 250 { 251 return ECHOSTATUS_OK; 252 } 253 254 // *** CIndigo.cpp *** 255