1// ****************************************************************************
2//
3//  	CDarla24DspCommObject.cpp
4//
5//		Implementation file for Darla24 DSP interface class.
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 "CDarla24DspCommObject.h"
32
33#include "Darla24DSP.c"
34
35
36/****************************************************************************
37
38	Magic constants for the Darla24 hardware
39
40 ****************************************************************************/
41
42#define GD24_96000		0x0
43#define GD24_48000		0x1
44#define GD24_44100		0x2
45#define GD24_32000		0x3
46#define GD24_22050		0x4
47#define GD24_16000		0x5
48#define GD24_11025		0x6
49#define GD24_8000			0x7
50#define GD24_88200		0x8
51#define GD24_EXT_SYNC	0x9
52
53
54
55
56/****************************************************************************
57
58	Construction and destruction
59
60 ****************************************************************************/
61
62//===========================================================================
63//
64// Constructor
65//
66//===========================================================================
67
68CDarla24DspCommObject::CDarla24DspCommObject
69(
70	PDWORD		pdwRegBase,				// Virtual ptr to DSP registers
71	PCOsSupport	pOsSupport
72) : CGdDspCommObject( pdwRegBase, pOsSupport )
73{
74	strcpy( m_szCardName, "Darla24" );
75	m_pdwDspRegBase = pdwRegBase;		// Virtual addr DSP's register base
76
77	m_wNumPipesOut = 8;
78	m_wNumPipesIn = 2;
79	m_wNumBussesOut = 8;
80	m_wNumBussesIn = 2;
81	m_wFirstDigitalBusOut = 8;
82	m_wFirstDigitalBusIn = 2;
83
84	m_fHasVmixer = FALSE;
85
86	m_wNumMidiOut = 0;					// # MIDI out channels
87	m_wNumMidiIn = 0;						// # MIDI in  channels
88	m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 44100 );
89												// Need this in case we start with ESYNC
90
91	m_pwDspCodeToLoad = pwDarla24DSP;
92
93	//
94	// Since this card has no ASIC, mark it as loaded so everything works OK
95	//
96	m_bASICLoaded = TRUE;
97
98}	// CDarla24DspCommObject::CDarla24DspCommObject( DWORD dwPhysRegBase )
99
100
101//===========================================================================
102//
103// Destructor
104//
105//===========================================================================
106
107CDarla24DspCommObject::~CDarla24DspCommObject()
108{
109}	// CDarla24DspCommObject::~CDarla24DspCommObject()
110
111
112
113
114/****************************************************************************
115
116	Hardware config
117
118 ****************************************************************************/
119
120//===========================================================================
121//
122// SetSampleRate
123//
124// Set the audio sample rate for Darla24; this is fairly simple.  You
125// just pick the right magic number.
126//
127//===========================================================================
128
129DWORD CDarla24DspCommObject::SetSampleRate( DWORD dwNewSampleRate )
130{
131	BYTE	bClock;
132
133	//
134	// Pick the magic number
135	//
136	switch ( dwNewSampleRate )
137	{
138		case 96000 :
139			bClock = GD24_96000;
140			break;
141		case 88200 :
142			bClock = GD24_88200;
143			break;
144		case 48000 :
145			bClock = GD24_48000;
146			break;
147		case 44100 :
148			bClock = GD24_44100;
149			break;
150		case 32000 :
151			bClock = GD24_32000;
152			break;
153		case 22050 :
154			bClock = GD24_22050;
155			break;
156		case 16000 :
157			bClock = GD24_16000;
158			break;
159		case 11025 :
160			bClock = GD24_11025;
161			break;
162		case 8000 :
163		 	bClock = GD24_8000;
164			break;
165		default :
166			ECHO_DEBUGPRINTF( ("CDarla24DspCommObject::SetSampleRate: Error, "
167									 "invalid sample rate 0x%lx\n", dwNewSampleRate) );
168			return 0xffffffff;
169	}
170
171	if ( !WaitForHandshake() )
172		return 0xffffffff;
173
174	//
175	// Override the sample rate if this card is set to Echo sync.
176	// m_pDspCommPage->wInputClock is just being used as a parameter here;
177	// the DSP ignores it.
178	//
179	if ( ECHO_CLOCK_ESYNC == GetInputClock() )
180		bClock = GD24_EXT_SYNC;
181
182	m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
183
184	//
185	// Write the audio state to the comm page
186	//
187	m_pDspCommPage->byGDClockState = bClock;
188
189	// Send command to DSP
190	ClearHandshake();
191	SendVector( DSP_VC_SET_GD_AUDIO_STATE );
192
193	ECHO_DEBUGPRINTF( ("CDarla24DspCommObject::SetSampleRate: 0x%lx "
194							 "clock %d\n", dwNewSampleRate, bClock) );
195
196	return GetSampleRate();
197
198} // DWORD CDarla24DspCommObject::SetSampleRate( DWORD dwNewSampleRate )
199
200
201//===========================================================================
202//
203// Set input clock
204//
205// Darla24 supports internal and Esync clock.
206//
207//===========================================================================
208
209ECHOSTATUS CDarla24DspCommObject::SetInputClock(WORD wClock)
210{
211	if ( 	(ECHO_CLOCK_INTERNAL != wClock) &&
212			(ECHO_CLOCK_ESYNC != wClock))
213		return ECHOSTATUS_CLOCK_NOT_SUPPORTED;
214
215	m_wInputClock = wClock;
216
217	return SetSampleRate( GetSampleRate() );
218
219}	// SetInputClock
220
221
222// **** Darla24DspCommObject.cpp ****
223