1// **************************************************************************** 2// 3// CDarla.cpp 4// 5// Implementation file for the CDarla driver class; this supports 20 bit 6// Darla, not Darla24. 7// 8// Set editor tabs to 3 for your viewing pleasure. 9// 10// ---------------------------------------------------------------------------- 11// 12// This file is part of Echo Digital Audio's generic driver library. 13// Copyright Echo Digital Audio Corporation (c) 1998 - 2005 14// All rights reserved 15// www.echoaudio.com 16// 17// This library is free software; you can redistribute it and/or 18// modify it under the terms of the GNU Lesser General Public 19// License as published by the Free Software Foundation; either 20// version 2.1 of the License, or (at your option) any later version. 21// 22// This library is distributed in the hope that it will be useful, 23// but WITHOUT ANY WARRANTY; without even the implied warranty of 24// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 25// Lesser General Public License for more details. 26// 27// You should have received a copy of the GNU Lesser General Public 28// License along with this library; if not, write to the Free Software 29// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 30// 31// **************************************************************************** 32 33#include "CDarla.h" 34 35#define DARLA20_ANALOG_OUTPUT_LATENCY 137 36#define DARLA20_ANALOG_INPUT_LATENCY 240 37 38 39/**************************************************************************** 40 41 Construction and destruction 42 43 ****************************************************************************/ 44 45//=========================================================================== 46// 47// Overload new & delete so memory for this object is allocated 48// from non-paged memory. 49// 50//=========================================================================== 51 52PVOID CDarla::operator new( size_t Size ) 53{ 54 PVOID pMemory; 55 ECHOSTATUS Status; 56 57 Status = OsAllocateNonPaged(Size,&pMemory); 58 59 if ( (ECHOSTATUS_OK != Status) || (NULL == pMemory )) 60 { 61 ECHO_DEBUGPRINTF(("CDarla::operator new - memory allocation failed\n")); 62 63 pMemory = NULL; 64 } 65 else 66 { 67 memset( pMemory, 0, Size ); 68 } 69 70 return pMemory; 71 72} // PVOID CDarla::operator new( size_t Size ) 73 74 75VOID CDarla::operator delete( PVOID pVoid ) 76{ 77 if ( ECHOSTATUS_OK != OsFreeNonPaged( pVoid ) ) 78 { 79 ECHO_DEBUGPRINTF(("CDarla::operator delete memory free failed\n")); 80 } 81} // VOID CDarla::operator delete( PVOID pVoid ) 82 83 84//=========================================================================== 85// 86// Constructor and destructor 87// 88//=========================================================================== 89 90CDarla::CDarla( PCOsSupport pOsSupport ) 91 : CEchoGals( pOsSupport ) 92{ 93 ECHO_DEBUGPRINTF( ( "CDarla::CDarla() is born!\n" ) ); 94 95 m_wAnalogOutputLatency = DARLA20_ANALOG_OUTPUT_LATENCY; 96 m_wAnalogInputLatency = DARLA20_ANALOG_INPUT_LATENCY; 97} 98 99CDarla::~CDarla() 100{ 101 ECHO_DEBUGPRINTF( ( "CDarla::~CDarla() is toast!\n" ) ); 102} 103 104 105 106 107/**************************************************************************** 108 109 Setup and hardware initialization 110 111 ****************************************************************************/ 112 113//=========================================================================== 114// 115// Every card has an InitHw method 116// 117//=========================================================================== 118 119ECHOSTATUS CDarla::InitHw() 120{ 121 ECHOSTATUS Status; 122 123 // 124 // Call the base InitHw method 125 // 126 if ( ECHOSTATUS_OK != ( Status = CEchoGals::InitHw() ) ) 127 return Status; 128 129 // 130 // Create the DSP comm object 131 // 132 ECHO_ASSERT(NULL == m_pDspCommObject ); 133 m_pDspCommObject = new CDarlaDspCommObject( (PDWORD) m_pvSharedMemory, 134 m_pOsSupport ); 135 if (NULL == m_pDspCommObject) 136 { 137 ECHO_DEBUGPRINTF(("CDarla::InitHw - could not create DSP comm object\n")); 138 return ECHOSTATUS_NO_MEM; 139 } 140 141 // 142 // Load the DSP 143 // 144 GetDspCommObject()->LoadFirmware(); 145 if ( GetDspCommObject()->IsBoardBad() ) 146 return ECHOSTATUS_DSP_DEAD; 147 148 // 149 // Clear the "bad board" flag 150 // 151 m_wFlags &= ~ECHOGALS_FLAG_BADBOARD; 152 153 // 154 // Must call this here *after* DSP is init 155 // 156 Status = InitLineLevels(); 157 158 // 159 // Get default sample rate from DSP 160 // 161 m_dwSampleRate = GetDspCommObject()->GetSampleRate(); 162 163 ECHO_DEBUGPRINTF( ( "CDarla::InitHw()\n" ) ); 164 165 return Status; 166 167} // ECHOSTATUS CDarla::InitHw() 168 169 170 171 172/**************************************************************************** 173 174 Informational methods 175 176 ****************************************************************************/ 177 178//=========================================================================== 179// 180// QueryAudioSampleRate is used to find out if this card can handle a 181// given sample rate. 182// 183//=========================================================================== 184 185ECHOSTATUS CDarla::QueryAudioSampleRate 186( 187 DWORD dwSampleRate 188) 189{ 190 if ( dwSampleRate != 44100 && 191 dwSampleRate != 48000 ) 192 { 193 ECHO_DEBUGPRINTF( 194 ("CDarla::QueryAudioSampleRate() - rate %ld invalid\n", 195 dwSampleRate)); 196 return ECHOSTATUS_BAD_FORMAT; 197 } 198 199 ECHO_DEBUGPRINTF( ( "CDarla::QueryAudioSampleRate()\n" ) ); 200 return ECHOSTATUS_OK; 201 202} // ECHOSTATUS CDarla::QueryAudioSampleRate 203 204 205void CDarla::QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate) 206{ 207 dwMinRate = 44100; 208 dwMaxRate = 48000; 209} 210 211 212 213// *** CDarla.cpp *** 214