xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/CMiaDspCommObject.cpp (revision 4f00613311d0bd6b70fa82ce19931c41f071ea4e)
1 // ****************************************************************************
2 //
3 //  	CMiaDspCommObject.cpp
4 //
5 //		Implementation file for EchoGals generic driver Mia 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 "CMiaDspCommObject.h"
33 
34 #include "MiaDSP.c"
35 
36 
37 /****************************************************************************
38 
39 	Construction and destruction
40 
41  ****************************************************************************/
42 
43 //===========================================================================
44 //
45 // Constructor
46 //
47 //===========================================================================
48 
49 CMiaDspCommObject::CMiaDspCommObject
50 (
51 	PDWORD		pdwRegBase,				// Virtual ptr to DSP registers
52 	PCOsSupport	pOsSupport
53 ) : CDspCommObjectVmixer( pdwRegBase, pOsSupport )
54 {
55 	strcpy( m_szCardName, "Mia" );
56 	m_pdwDspRegBase = pdwRegBase;		// Virtual addr DSP's register base
57 
58 	m_wNumPipesOut = 8;
59 	m_wNumPipesIn = 4;
60 	m_wNumBussesOut = 4;
61 	m_wNumBussesIn = 4;
62 	m_wFirstDigitalBusOut = 2;
63 	m_wFirstDigitalBusIn = 2;
64 
65 	m_fHasVmixer = TRUE;
66 
67 	if (MIA_MIDI_REV == pOsSupport->GetCardRev())
68 	{
69 		m_wNumMidiOut = 1;					// # MIDI out channels
70 		m_wNumMidiIn = 1;						// # MIDI in  channels
71 	}
72 
73 	m_pDspCommPage->dwSampleRate = SWAP( (DWORD) 44100 );
74 
75 	m_bHasASIC = FALSE;
76 
77 	m_pwDspCodeToLoad = pwMiaDSP;
78 
79 	m_byDigitalMode = DIGITAL_MODE_NONE;
80 
81 	//
82 	// Since this card has no ASIC, mark it as loaded so everything works OK
83 	//
84 	m_bASICLoaded = TRUE;
85 
86 }	// CMiaDspCommObject::CMiaDspCommObject( DWORD dwPhysRegBase )
87 
88 
89 //===========================================================================
90 //
91 // Destructor
92 //
93 //===========================================================================
94 
95 CMiaDspCommObject::~CMiaDspCommObject()
96 {
97 }	// CMiaDspCommObject::~CMiaDspCommObject()
98 
99 
100 
101 
102 /****************************************************************************
103 
104 	Hardware setup and config
105 
106  ****************************************************************************/
107 
108 //===========================================================================
109 //
110 //	Set the input clock
111 //
112 //===========================================================================
113 
114 ECHOSTATUS CMiaDspCommObject::SetInputClock(WORD wClock)
115 {
116 	DWORD	dwSampleRate = GetSampleRate();
117 
118 	ECHO_DEBUGPRINTF( ("CMiaDspCommObject::SetInputClock:\n") );
119 
120 	switch ( wClock )
121 	{
122 		case ECHO_CLOCK_INTERNAL :
123 		{
124 			ECHO_DEBUGPRINTF( ( "\tSet Mia clock to INTERNAL\n" ) );
125 
126 			// If the sample rate is out of range for some reason, set it
127 			// to a reasonable value.  mattg
128 			if ( ( dwSampleRate < 32000  ) ||
129 			     ( dwSampleRate > 96000 ) )
130 			{
131 				dwSampleRate = 48000;
132 			}
133 
134 			break;
135 		} // CLK_CLOCKININTERNAL
136 
137 		case ECHO_CLOCK_SPDIF :
138 		{
139 			ECHO_DEBUGPRINTF( ( "\tSet Mia clock to SPDIF\n" ) );
140 			break;
141 		} // CLK_CLOCKINSPDIF
142 
143 		default :
144 			ECHO_DEBUGPRINTF(("Input clock 0x%x not supported for Mia\n",wClock));
145 			ECHO_DEBUGBREAK();
146 				return ECHOSTATUS_CLOCK_NOT_SUPPORTED;
147 	}	// switch (wInputClock)
148 
149 	m_wInputClock = wClock;
150 
151 	SetSampleRate( dwSampleRate );
152 
153 	return ECHOSTATUS_OK;
154 }	// ECHOSTATUS CMiaDspCommObject::SetInputClock
155 
156 
157 //===========================================================================
158 //
159 // SetSampleRate
160 //
161 // Set the audio sample rate for Mia
162 //
163 //===========================================================================
164 
165 DWORD CMiaDspCommObject::SetSampleRate( DWORD dwNewSampleRate )
166 {
167 	//
168 	// Set the sample rate
169 	//
170 	DWORD dwControlReg = MIA_48000;
171 
172 	switch ( dwNewSampleRate )
173 	{
174 		case 96000 :
175 			dwControlReg = MIA_96000;
176 			break;
177 
178 		case 88200 :
179 			dwControlReg = MIA_88200;
180 			break;
181 
182 		case 44100 :
183 			dwControlReg = MIA_44100;
184 			break;
185 
186 		case 32000 :
187 			dwControlReg = MIA_32000;
188 			break;
189 	}
190 
191 	//
192 	// Override the clock setting if this Mia is set to S/PDIF clock
193 	//
194 	if ( ECHO_CLOCK_SPDIF == GetInputClock() )
195 		dwControlReg |= MIA_SPDIF;
196 
197 	//
198 	//	Set the control register if it has changed
199 	//
200 	if (dwControlReg != GetControlRegister())
201 	{
202 		if ( !WaitForHandshake() )
203 			return 0xffffffff;
204 
205 		//
206 		// Set the values in the comm page; the dwSampleRate
207 		// field isn't used by the DSP, but is read by the call
208 		// to GetSampleRate below
209 		//
210 		m_pDspCommPage->dwSampleRate = SWAP( dwNewSampleRate );
211 		SetControlRegister( dwControlReg );
212 
213 		//
214 		//	Poke the DSP
215 		//
216 		ClearHandshake();
217 		SendVector( DSP_VC_UPDATE_CLOCKS );
218 	}
219 
220 	return GetSampleRate();
221 
222 } // DWORD CMiaDspCommObject::SetSampleRate( DWORD dwNewSampleRate )
223 
224 // **** CMiaDspCommObject.cpp ****
225