1 // **************************************************************************** 2 // 3 // CIndigoDJ.cpp 4 // 5 // Implementation file for the CIndigoDJ 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 "CIndigoDJ.h" 32 33 #define INDIGO_DJ_OUTPUT_LATENCY_SINGLE_SPEED 44 34 #define INDIGO_DJ_OUTPUT_LATENCY_DOUBLE_SPEED 37 35 36 37 /**************************************************************************** 38 39 Construction and destruction 40 41 ****************************************************************************/ 42 43 //=========================================================================== 44 // 45 // Overload new & delete so memory for this object is allocated 46 // from non-paged memory. 47 // 48 //=========================================================================== 49 50 PVOID CIndigoDJ::operator new( size_t Size ) 51 { 52 PVOID pMemory; 53 ECHOSTATUS Status; 54 55 Status = OsAllocateNonPaged(Size,&pMemory); 56 57 if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory )) 58 { 59 ECHO_DEBUGPRINTF(("CIndigoDJ::operator new - memory allocation failed\n")); 60 61 pMemory = NULL; 62 } 63 else 64 { 65 memset( pMemory, 0, Size ); 66 } 67 68 return pMemory; 69 70 } // PVOID CIndigoDJ::operator new( size_t Size ) 71 72 73 VOID CIndigoDJ::operator delete( PVOID pVoid ) 74 { 75 if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) ) 76 { 77 ECHO_DEBUGPRINTF(("CIndigoDJ::operator delete memory free failed\n")); 78 } 79 } // VOID CIndigoDJ::operator delete( PVOID pVoid ) 80 81 82 83 //=========================================================================== 84 // 85 // Constructor and destructor 86 // 87 //=========================================================================== 88 89 CIndigoDJ::CIndigoDJ( PCOsSupport pOsSupport ) 90 : CIndigo( pOsSupport ) 91 { 92 ECHO_DEBUGPRINTF( ( "CIndigoDJ::CIndigoDJ() is born!\n" ) ); 93 } 94 95 CIndigoDJ::~CIndigoDJ() 96 { 97 ECHO_DEBUGPRINTF( ( "CIndigoDJ::~CIndigoDJ() is toast!\n" ) ); 98 } 99 100 101 102 //=========================================================================== 103 // 104 // Every card has an InitHw method 105 // 106 //=========================================================================== 107 108 ECHOSTATUS CIndigoDJ::InitHw() 109 { 110 ECHOSTATUS Status; 111 112 // 113 // Call the base method 114 // 115 if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) ) 116 return Status; 117 118 // 119 // Create the DSP comm object 120 // 121 m_pDspCommObject = new CIndigoDJDspCommObject( (PDWORD) m_pvSharedMemory, 122 m_pOsSupport ); 123 if (NULL == m_pDspCommObject) 124 { 125 ECHO_DEBUGPRINTF(("CIndigoDJ::InitHw - could not create DSP comm object\n")); 126 return ECHOSTATUS_NO_MEM; 127 } 128 129 // 130 // Load the DSP 131 // 132 GetDspCommObject()->LoadFirmware(); 133 if ( GetDspCommObject()->IsBoardBad() ) 134 return ECHOSTATUS_DSP_DEAD; 135 136 // 137 // Do flags 138 // 139 m_wFlags &= ~ECHOGALS_FLAG_BADBOARD; 140 m_wFlags |= ECHOGALS_ROFLAG_SUPER_INTERLEAVE_OK; 141 142 // 143 // Must call this here after DSP is init to 144 // init gains and mutes 145 // 146 Status = InitLineLevels(); 147 if ( ECHOSTATUS_OK != Status ) 148 return Status; 149 150 // 151 // Get default sample rate from DSP 152 // 153 m_dwSampleRate = GetDspCommObject()->GetSampleRate(); 154 155 ECHO_DEBUGPRINTF( ( "CIndigo::InitHw()\n" ) ); 156 return Status; 157 158 } // ECHOSTATUS CIndigo::InitHw() 159 160 161 //=========================================================================== 162 // 163 // GetAudioLatency - returns the latency for a single pipe 164 // 165 //=========================================================================== 166 167 void CIndigoDJ::GetAudioLatency(ECHO_AUDIO_LATENCY *pLatency) 168 { 169 DWORD dwLatency; 170 DWORD dwSampleRate; 171 172 dwSampleRate = GetDspCommObject()->GetSampleRate(); 173 if (FALSE == pLatency->wIsInput) 174 { 175 // 176 // The latency depends on the current sample rate 177 // 178 if (dwSampleRate < 50000) 179 dwLatency = INDIGO_DJ_OUTPUT_LATENCY_SINGLE_SPEED; 180 else 181 dwLatency = INDIGO_DJ_OUTPUT_LATENCY_DOUBLE_SPEED; 182 } 183 else 184 { 185 // 186 // Inputs? What inputs? 187 // 188 dwLatency = 0; 189 } 190 191 pLatency->dwLatency = dwLatency; 192 193 } // GetAudioLatency 194 195 196 // *** CIndigoDJ.cpp *** 197