xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/CIndigoDspCommObject.cpp (revision 17889a8c70dbb3d59c1412f6431968753c767bab)
1 // ****************************************************************************
2 //
3 //  	CIndigoDspCommObject.cpp
4 //
5 //		Implementation file for EchoGals generic driver Indigo DSP
6 //		interface class.
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 "CEchoGals.h"
32 #include "CIndigoDspCommObject.h"
33 
34 #ifdef ECHO_WDM
35 #pragma optimize("",off)
36 #endif
37 #include "IndigoDSP.c"
38 
39 
40 //
41 //	Construction/destruction
42 //
43 CIndigoDspCommObject::CIndigoDspCommObject
44 (
45 	PDWORD		pdwRegBase,				// Virtual ptr to DSP registers
46 	PCOsSupport	pOsSupport
47 ) : CDspCommObjectVmixer( pdwRegBase, pOsSupport )
48 {
49 	strcpy( m_szCardName, "Indigo" );
50 	m_pdwDspRegBase = pdwRegBase;		// Virtual addr DSP's register base
51 
52 	m_wNumPipesOut = 8;
53 	m_wNumPipesIn = 2;
54 	m_wNumBussesOut = 2;
55 	m_wNumBussesIn = m_wNumPipesIn;
56 	m_wFirstDigitalBusOut = m_wNumBussesOut;
57 	m_wFirstDigitalBusIn = m_wNumBussesIn;
58 
59 	m_fHasVmixer = TRUE;
60 
61 	m_wNumMidiOut = 0;					// # MIDI out channels
62 	m_wNumMidiIn = 0;						// # MIDI in  channels
63 
64 	m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 48000 );
65 
66 	m_bHasASIC = FALSE;
67 
68 	m_pwDspCodeToLoad = pwIndigoDSP;
69 
70 	m_byDigitalMode = DIGITAL_MODE_NONE;
71 
72 	//
73 	// Since this card has no ASIC, mark it as loaded so everything works OK
74 	//
75 	m_bASICLoaded = TRUE;
76 
77 }	// CIndigoDspCommObject::CIndigoDspCommObject( DWORD dwPhysRegBase )
78 
79 
80 CIndigoDspCommObject::~CIndigoDspCommObject()
81 {
82 }	// CIndigoDspCommObject::~CIndigoDspCommObject()
83 
84 
85 //
86 //	Save new clock settings and send to DSP.
87 //
88 ECHOSTATUS CIndigoDspCommObject::SetInputClock(WORD wClock)
89 {
90 
91 	ECHO_DEBUGPRINTF( ("CIndigoDspCommObject::SetInputClock:\n") );
92 	return ECHOSTATUS_CLOCK_NOT_SUPPORTED;
93 
94 }	// ECHOSTATUS CIndigoDspCommObject::SetInputClock
95 
96 
97 //===========================================================================
98 //
99 // SetSampleRate
100 //
101 // Set the audio sample rate for Indigo
102 //
103 //===========================================================================
104 
105 DWORD CIndigoDspCommObject::SetSampleRate( DWORD dwNewSampleRate )
106 {
107 	//
108 	// Set the sample rate
109 	//
110 	DWORD dwControlReg = MIA_48000;
111 
112 	switch ( dwNewSampleRate )
113 	{
114 		case 96000 :
115 			dwControlReg = MIA_96000;
116 			break;
117 
118 		case 88200 :
119 			dwControlReg = MIA_88200;
120 			break;
121 
122 		case 44100 :
123 			dwControlReg = MIA_44100;
124 			break;
125 
126 		case 32000 :
127 			dwControlReg = MIA_32000;
128 			break;
129 	}
130 
131 	//
132 	// Set the control register if it has changed
133 	//
134 	if (dwControlReg != GetControlRegister())
135 	{
136 		if ( !WaitForHandshake() )
137 			return 0xffffffff;
138 
139 		//
140 		// Set the values in the comm page; the dwSampleRate
141 		// field isn't used by the DSP, but is read by the call
142 		// to GetSampleRate below
143 		//
144 		m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
145 		SetControlRegister( dwControlReg );
146 
147 		//
148 		//	Poke the DSP
149 		//
150 		ClearHandshake();
151 		SendVector( DSP_VC_UPDATE_CLOCKS );
152 	}
153 
154 	return GetSampleRate();
155 
156 } // DWORD CIndigoDspCommObject::SetSampleRate( DWORD dwNewSampleRate )
157 
158 // **** CIndigoDspCommObject.cpp ****
159