1// ****************************************************************************
2//
3//		CEchoGals.H
4//
5//		Include file for the CEchoGals generic driver class.
6//		Set editor tabs to 3 for your viewing pleasure.
7//
8// 		CEchoGals is the big daddy class of the generic code.  It is the upper
9//		edge of the generic code - that is, it is the interface between the
10// 		operating system-specific code and the generic driver.
11//
12//		There are a number of terms in this file that won't make any sense unless
13// 		you go read EchoGalsXface.h first.
14//
15// ----------------------------------------------------------------------------
16//
17// This file is part of Echo Digital Audio's generic driver library.
18// Copyright Echo Digital Audio Corporation (c) 1998 - 2005
19// All rights reserved
20// www.echoaudio.com
21//
22// This library is free software; you can redistribute it and/or
23// modify it under the terms of the GNU Lesser General Public
24// License as published by the Free Software Foundation; either
25// version 2.1 of the License, or (at your option) any later version.
26//
27// This library is distributed in the hope that it will be useful,
28// but WITHOUT ANY WARRANTY; without even the implied warranty of
29// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
30// Lesser General Public License for more details.
31//
32// You should have received a copy of the GNU Lesser General Public
33// License along with this library; if not, write to the Free Software
34// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
35//
36// ****************************************************************************
37
38//	Prevent problems with multiple includes
39#ifndef _ECHOGALSOBJECT_
40#define _ECHOGALSOBJECT_
41
42#ifdef _DEBUG
43#ifdef ECHO_WDM
44#pragma optimize("",off)
45#endif
46#endif
47
48
49//
50//	Each project creates this file to support the OS it is targeted for
51//
52#include "OsSupport.h"
53
54//
55// Include the definitions for the card family
56//
57#include "family.h"
58
59
60//
61//	Interface definitions
62//
63#include "EchoGalsXface.h"
64#include "MixerXface.h"
65#include "CLineLevel.h"
66#include "CPipeOutCtrl.h"
67#include "CMonitorCtrl.h"
68#include "CEchoGals_mixer.h"
69#include "CChannelMask.h"
70#include "CDspCommObject.h"
71#include "CMidiInQ.h"
72
73//
74//	Pipe states
75//
76#define	PIPE_STATE_RESET			0	// Pipe has been reset
77#define	PIPE_STATE_STOPPED		1	// Pipe has been stopped
78#define	PIPE_STATE_STARTED		2	// Pipe has been started
79#define	PIPE_STATE_PENDING		3	// Pipe has pending start
80
81
82
83//
84// Prototypes to make the Mac compiler happy
85//
86ECHOSTATUS CheckSetting(INT32 iValue,INT32 iMin,INT32 iMax);
87INT32 PanToDb( INT32 iPan );
88
89
90//
91//	Base class used for interfacing with the audio card.
92//
93class CEchoGals
94{
95public:
96
97	//***********************************************************************
98	//
99	//	Initialization (public)
100	//
101	//***********************************************************************
102
103	//
104	//	Overload new & delete so memory for this object is allocated
105	//	from non-paged memory.
106	//
107	PVOID operator new( size_t Size );
108	VOID  operator delete( PVOID pVoid );
109
110	//
111	// Constructor and destructor
112	//
113	// Note that you must call AssignResources and InitHw
114	// before you can do anything useful.
115	//
116	CEchoGals( PCOsSupport pOsSupport );
117	virtual ~CEchoGals();
118
119	//
120	//	Validate and save resources assigned by PNP.
121	//	Each card uses one IRQ vector and accesses the DSP through
122	//	shared memory
123	//
124	virtual ECHOSTATUS AssignResources
125	(
126		PVOID		pvSharedMemory,		// Virtual pointer to DSP registers
127		PCHAR		pszCardName				// Caller gets from registry
128    );
129
130	//
131	//	Initialize the hardware using data from AssignResources,
132	//	create the CDspCommObject class, return status.
133	//
134	virtual ECHOSTATUS InitHw();
135
136
137
138	//***********************************************************************
139	//
140	//	PCI card information (public)
141	//
142	//***********************************************************************
143
144	//
145	//	Return the capabilities of this card; card type, card name,
146	//	# analog inputs, # analog outputs, # digital channels,
147	//	# MIDI ports and supported clocks.
148	//	See ECHOGALS_CAPS definition above.
149	//
150	virtual ECHOSTATUS GetCapabilities
151	(
152		PECHOGALS_CAPS	pCapabilities
153	)
154	{ return GetBaseCapabilities(pCapabilities); }
155
156
157	CONST PCHAR GetDeviceName();
158
159	WORD MakePipeIndex(WORD wPipe,BOOL fInput);
160
161
162
163	//***********************************************************************
164	//
165	//	Mixer interface (public) - used to set volume levels and other
166	// miscellaneous stuff.
167	//
168	//***********************************************************************
169
170	//
171	// Open and close the mixer
172	//
173	ECHOSTATUS OpenMixer(NUINT &Cookie);
174	ECHOSTATUS CloseMixer(NUINT Cookie);
175
176	//
177	// Is the mixer open by one or more clients?
178	//
179	BOOL IsMixerOpen();
180
181	//
182	//	Process mixer functions
183	//
184	virtual ECHOSTATUS ProcessMixerFunction
185	(
186		PMIXER_FUNCTION	pMixerFunction,	// Request from mixer
187		INT32 &				iRtnDataSz			// # bytes returned (if any)
188	);
189
190	//
191	//	Process multiple mixer functions
192	//
193	virtual ECHOSTATUS ProcessMixerMultiFunction
194	(
195		PMIXER_MULTI_FUNCTION	pMixerFunctions,	// Request from mixer
196		INT32 &						iRtnDataSz			// # bytes returned (if any)
197	);
198
199	//
200	// Get all the control notifies since last time this was called
201	// for this client.  dwNumNotifies is the size of the array passed in
202	// pNotifies; dwNumReturned specifies how many were actually copied in.
203	//
204	// Takes the cookie as a separate parameter; the one in MIXER_MULTI_NOTIFY
205	// is ignored since it's not 64 bits
206	//
207	ECHOSTATUS GetControlChanges
208	(
209		PMIXER_MULTI_NOTIFY	pNotifies,
210		NUINT MixerCookie
211	);
212
213	//
214	// Get a bunch of useful polled stuff- audio meters,
215	// clock detect bits, and pending notifies
216	//
217	ECHOSTATUS GetPolledStuff
218	(
219		ECHO_POLLED_STUFF *pPolledStuff,
220		NUINT MixerCookie
221	);
222
223	//
224	// Get the digital mode
225	//
226	virtual BYTE GetDigitalMode()
227		{ return( ( NULL == GetDspCommObject() )
228						? (BYTE) DIGITAL_MODE_SPDIF_RCA
229						: GetDspCommObject()->GetDigitalMode() ); }
230
231	//
232	//	Get, set and clear CEchoGals flags.
233	//	See ECHOGALS_FLAG_??? definitions in EchoGalsXface.h
234	//
235	virtual WORD GetFlags()
236	{
237		return m_wFlags;
238	}
239	virtual ECHOSTATUS SetFlags(WORD wFlags);
240	virtual ECHOSTATUS ClearFlags(WORD	wFlags);
241
242	//
243	// Get/set the locked sample rate - if the sample rate is locked,
244	// the card will be fixed at the locked rate.  Only applies if
245	// the card is set to internal clock.
246	//
247	virtual ECHOSTATUS GetAudioLockedSampleRate
248	(
249		DWORD		&dwSampleRate
250	);
251
252	virtual ECHOSTATUS SetAudioLockedSampleRate
253	(
254		DWORD		dwSampleRate
255	);
256
257	//
258	//	Enable/disable audio metering.
259	//
260	ECHOSTATUS GetMetersOn( BOOL & bOn )
261		{ return( ( NULL == GetDspCommObject() )
262						? ECHOSTATUS_DSP_DEAD
263						: GetDspCommObject()->GetMetersOn( bOn ) ); }
264
265	ECHOSTATUS SetMetersOn( BOOL bOn )
266		{ return( ( NULL == GetDspCommObject() )
267						? ECHOSTATUS_DSP_DEAD
268						: GetDspCommObject()->SetMetersOn( bOn ) ); }
269	//
270	//	Get/Set Professional or consumer S/PDIF status
271	//
272	virtual BOOL IsProfessionalSpdif()
273		{ return( ( NULL == GetDspCommObject() )
274						? FALSE
275						: GetDspCommObject()->IsProfessionalSpdif() ); }
276	virtual void SetProfessionalSpdif( BOOL bNewStatus );
277
278	//
279	// Get/Set S/PDIF out non-audio status bit
280	//
281	virtual BOOL IsSpdifOutNonAudio()
282		{ return( ( NULL == GetDspCommObject() )
283						? FALSE
284						: GetDspCommObject()->IsSpdifOutNonAudio() ); }
285	virtual void SetSpdifOutNonAudio(BOOL bNonAudio )
286	{
287		if (GetDspCommObject())
288			GetDspCommObject()->SetSpdifOutNonAudio(bNonAudio);
289	}
290
291
292
293	//
294	//	Set digital mode
295	//
296	virtual ECHOSTATUS SetDigitalMode( BYTE byDigitalMode );
297
298	//
299	// Get and set input and output clocks
300	//
301	virtual ECHOSTATUS SetInputClock(WORD	wClock);
302	virtual ECHOSTATUS GetInputClock(WORD	&wClock);
303	virtual ECHOSTATUS SetOutputClock(WORD wClock);
304	virtual ECHOSTATUS GetOutputClock(WORD &wClock);
305
306	//
307	//	Audio Line Levels Functions:
308	//	Nominal level is either -10dBV or +4dBu.
309	//	Output level data is scaled by 256 and ranges from -128dB to
310	//	+6dB (0xffff8000 to 0x600).
311	//	Input level data is scaled by 256 and ranges from -25dB to +25dB
312	//	( 0xffffe700 to 0x1900 ).
313	//
314	virtual ECHOSTATUS GetAudioLineLevel
315	(
316		PMIXER_FUNCTION	pMF
317	);
318
319	virtual ECHOSTATUS SetAudioLineLevel
320	(
321		PMIXER_FUNCTION	pMF
322	);
323
324	virtual ECHOSTATUS GetAudioNominal
325	(
326		PMIXER_FUNCTION	pMF
327	);
328
329	virtual ECHOSTATUS SetAudioNominal
330	(
331		PMIXER_FUNCTION	pMF
332	);
333
334	//
335	//	Audio mute controls
336	//
337	virtual ECHOSTATUS SetAudioMute
338	(
339		PMIXER_FUNCTION	pMF
340	);
341
342	virtual ECHOSTATUS GetAudioMute
343	(
344		PMIXER_FUNCTION	pMF
345	);
346
347	//
348	//	Audio Monitors Functions:
349	//
350	virtual ECHOSTATUS SetAudioMonitor
351	(
352		WORD	wBusIn,
353		WORD	wBusOut,
354		INT32	iGain						// New gain
355	);
356
357	virtual ECHOSTATUS GetAudioMonitor
358	(
359		WORD	wBusIn,
360		WORD	wBusOut,
361		INT32 &	iGain						// Returns current gain
362	);
363
364	virtual ECHOSTATUS SetAudioMonitorPan
365	(
366		WORD	wBusIn,
367		WORD	wBusOut,
368		INT32	iPan						// New pan (0 - MAX_MIXER_PAN)
369	);
370
371	virtual ECHOSTATUS GetAudioMonitorPan
372	(
373		WORD	wBusIn,
374		WORD	wBusOut,
375		INT32 &	iPan						// Returns current pan (0 - MAX_MIXER_PAN)
376	);
377
378	virtual ECHOSTATUS SetAudioMonitorMute
379	(
380		WORD	wBusIn,
381		WORD	wBusOut,
382		BOOL	bMute						// New state
383	);
384
385	virtual ECHOSTATUS GetAudioMonitorMute
386	(
387		WORD	wBusIn,
388		WORD	wBusOut,
389		BOOL &bMute						// Returns current state
390	);
391
392
393	//
394	// Get and set audio pan
395	//
396	virtual ECHOSTATUS GetAudioPan(PMIXER_FUNCTION pMixerFunction);
397	virtual ECHOSTATUS SetAudioPan(PMIXER_FUNCTION pMixerFunction);
398
399	//
400	// Get a bitmask of all the clocks the hardware is currently detecting
401	//
402	virtual ECHOSTATUS GetInputClockDetect(DWORD &dwClockDetectBits);
403
404
405#ifdef PHANTOM_POWER_CONTROL
406	//
407	// Phantom power on/off for Gina3G
408	//
409	virtual void GetPhantomPower(BOOL *pfPhantom) { *pfPhantom = 0; }
410	virtual void SetPhantomPower(BOOL fPhantom) {}
411#endif
412
413
414	//***********************************************************************
415	//
416	//	Audio transport (public) - playing and recording audio
417	//
418	//***********************************************************************
419
420	//
421	// Set the scatter-gather list for a pipe
422	//
423	ECHOSTATUS SetDaffyDuck( WORD wPipeIndex, CDaffyDuck *pDuck);
424
425	//
426	//	Reserve a pipe.  Please refer to the definition of
427	// ECHOGALS_OPENAUDIOPARAMETERS.
428	//
429	// If the fCheckHardware flag is true, then the open will fail
430	// if the DSP and ASIC firmware have not been loaded (usually means
431	// your external box is turned off).
432	//
433	// If you want to manage your own CDaffyDuck object for this pipe,
434	// then pass a pointer to a CDaffyDuck object.  If you pass NULL,
435	// one will be created for you.
436	//
437	virtual ECHOSTATUS OpenAudio
438	(
439		PECHOGALS_OPENAUDIOPARAMETERS	pOpenParameters,	// Info on channel
440		PWORD									pwPipeIndex,		// Ptr to pipe index
441		BOOL									fCheckHardware = TRUE,
442		CDaffyDuck							*pDuck = NULL
443	);
444
445	//
446	//	Close a pipe
447	//
448	virtual ECHOSTATUS CloseAudio
449	(
450		PECHOGALS_CLOSEAUDIOPARAMETERS	pCloseParameters,
451		BOOL										fFreeDuck = TRUE
452	);
453
454	//
455	//	Find out if the audio format is supported.
456	//
457	virtual ECHOSTATUS QueryAudioFormat
458	(
459		WORD							wPipeIndex,
460		PECHOGALS_AUDIOFORMAT	pAudioFormat
461	);
462
463	//
464	// Set the audio format for a single pipe
465	virtual ECHOSTATUS SetAudioFormat
466	(
467		WORD							wPipeIndex,
468		PECHOGALS_AUDIOFORMAT	pAudioFormat
469	);
470
471	//
472	// Set the audio format for a bunch of pipes at once
473	//
474	virtual ECHOSTATUS SetAudioFormat
475	(
476		PCChannelMask				pChannelMask,
477		PECHOGALS_AUDIOFORMAT	pAudioFormat
478	);
479
480	//
481	//	Get the current audio format for a pipe
482	//
483	virtual ECHOSTATUS GetAudioFormat
484	(
485		WORD							wPipeIndex,
486		PECHOGALS_AUDIOFORMAT	pAudioFormat
487	);
488
489	//
490	// Call this to find out if this card can handle a given sample rate
491	//
492	virtual ECHOSTATUS QueryAudioSampleRate
493	(
494		DWORD		dwSampleRate
495	) = 0;
496
497	virtual void QuerySampleRateRange(DWORD &dwMinRate,DWORD &dwMaxRate) = 0;
498
499	//
500	// I'm not going to tell you what the next two functions do; you'll just
501	// have to guess.
502	//
503	virtual ECHOSTATUS SetAudioSampleRate
504	(
505		DWORD		dwSampleRate
506	);
507
508	virtual ECHOSTATUS GetAudioSampleRate
509	(
510		PDWORD	pdwSampleRate
511	);
512
513
514	//
515	//	Start transport for several pipes at once
516	//
517	virtual ECHOSTATUS Start
518	(
519		PCChannelMask	pChannelMask
520	);
521
522	//
523	//	Start transport for a single audio pipe
524	//
525	virtual ECHOSTATUS Start
526	(
527		WORD		wPipeIndex
528	);
529
530	//
531	//	Stop transport for several pipes at once
532	//
533	virtual ECHOSTATUS Stop
534	(
535		PCChannelMask	pChannelMask
536	);
537
538	//
539	//	Stop transport for a single pipe
540	//
541	virtual ECHOSTATUS Stop
542	(
543		WORD		wPipeIndex
544	);
545
546	//
547	//	Stop and reset selected output and/or input audio pipes
548	//
549	virtual ECHOSTATUS Reset
550	(
551		PCChannelMask	pChannelMask
552	);
553
554	//
555	//	Stop and reset single audio pipe
556	//
557	virtual ECHOSTATUS Reset
558	(
559		WORD		wPipeIndex
560	);
561
562	//
563	// Get mask with active pipes - that is, those pipes that
564	// are currently moving data.
565	//
566	virtual ECHOSTATUS GetActivePipes
567	(
568		PCChannelMask	pChannelMask
569	);
570
571	//
572	// Get mask with open pipes
573	//
574	virtual ECHOSTATUS GetOpenPipes
575	(
576		PCChannelMask	pChannelMask
577	);
578
579	//
580	//	Get a pointer that can be dereferenced to read
581	// the DSP's DMA counter for this pipe; see CEchoGals_transport.cpp
582	// for more info.
583	//
584	virtual ECHOSTATUS GetAudioPositionPtr
585	(
586		WORD		wPipeIndex,
587		PDWORD 	(&pdwPosition)
588	);
589
590	//
591	// Get the daffy duck pointer for a pipe
592	//
593	CDaffyDuck *GetDaffyDuck(WORD wPipeIndex);
594
595	//
596	// Reset the 64 bit DMA position for this pipe
597	//
598	void ResetDmaPos( WORD wPipe );
599
600	//
601	// Update the 64 bit DMA position for this pipe
602	//
603	void UpdateDmaPos( WORD wPipeIndex );
604
605	//
606	//	Get the 64 bit DMA position for this pipe
607	//
608	void GetDmaPos( WORD wPipeIndex, PULONGLONG pPos )
609	{
610		UpdateDmaPos( wPipeIndex );
611		*pPos = m_ullDmaPos[ wPipeIndex ];
612	}
613
614	//
615	// Get the state of a given pipe
616	//
617	DWORD GetPipeState( WORD wPipeIndex )
618	{
619		return (DWORD) m_byPipeState[ wPipeIndex ];
620	}
621
622	//
623	//	Verify a pipe is open and ready for business!
624	//
625	ECHOSTATUS VerifyAudioOpen
626	(
627		WORD		wPipeIndex
628	);
629
630	//***********************************************************************
631	//
632	//	MIDI (public)
633	//
634	//***********************************************************************
635
636#ifdef MIDI_SUPPORT
637
638	// The context struct should be set to zero before calling OpenMidiInput
639	virtual ECHOSTATUS OpenMidiInput(ECHOGALS_MIDI_IN_CONTEXT *pContext);
640	virtual ECHOSTATUS CloseMidiInput(ECHOGALS_MIDI_IN_CONTEXT *pContext);
641
642	//
643	// Reset the MIDI input buffer; MIDI input remains enabled and open
644	//
645	virtual ECHOSTATUS ResetMidiInput(ECHOGALS_MIDI_IN_CONTEXT *pContext);
646
647	virtual ECHOSTATUS WriteMidi
648	(
649		DWORD		dwExpectedCt,
650		PBYTE		pBuffer,
651		PDWORD	pdwActualCt
652	);
653
654	virtual ECHOSTATUS ReadMidiByte(	ECHOGALS_MIDI_IN_CONTEXT	*pContext,
655												DWORD								&dwMidiData,
656												LONGLONG							&llTimestamp);
657
658	virtual void ServiceMtcSync()
659	{
660	}
661
662#endif // MIDI_SUPPORT
663
664
665
666	//***********************************************************************
667	//
668	//	Interrupt handler methods (public)
669	//
670	//***********************************************************************
671
672	//
673	//	This is called from within an interrupt handler.  It starts interrupt
674	//	handling.  Returns error status if this interrupt is not ours.
675	// Returns ECHOSTATUS_OK if it is.
676	//
677	//	OS dependent code handles routing to this point.
678	//
679	virtual ECHOSTATUS ServiceIrq(BOOL &fMidiReceived);
680
681
682	//***********************************************************************
683	//
684	//	Power management (public)
685	//
686	// Please do not do silly things like try and set a volume level or
687	// play audio after calling GoComatose; be sure and call WakeUp first!
688	//
689	//***********************************************************************
690
691	//
692	// Tell the hardware to go to sleep
693	//
694	virtual ECHOSTATUS GoComatose();
695
696	//
697	// Tell the hardware to wake up
698	//
699	virtual ECHOSTATUS WakeUp();
700
701
702
703protected:
704
705	//***********************************************************************
706	//
707	//	Member variables (protected)
708	//
709	//***********************************************************************
710
711	PCOsSupport		m_pOsSupport;		// Ptr to OS Support methods & data
712	WORD				m_wFlags;			// See ECHOGALS_FLAG_??? flags defined
713												// in EchoGalsXface.h
714	PVOID				m_pvSharedMemory;	// Shared memory addr assigned by PNP
715	CHAR				m_szCardInstallName[ ECHO_MAXNAMELEN ];
716												// Same as card except when multiple
717												// boards of the same type installed.
718												// Then becomes "Layla1", "Layla2" etc.
719	CChannelMask	m_cmAudioOpen;		// Audio channels open mask
720	CChannelMask	m_cmAudioCyclic;	// Audio use cyclic buffers mask
721
722	DWORD				m_dwSampleRate;	// Card sample rate in Hz
723	DWORD				m_dwLockedSampleRate;
724												// Card sample rate when locked
725	ECHOGALS_AUDIO_PIPE
726						m_Pipes[ ECHO_MAXAUDIOPIPES ];
727												// Keep mapping info on open pipes
728	BYTE				m_byPipeState[ ECHO_MAXAUDIOPIPES ];
729												// Track state of all pipes
730	PVOID				m_ProcessId[ ECHO_MAXAUDIOPIPES ];
731												// Caller process ID for implementing
732												// synchronous wave start
733	DWORD				m_dwMeterOnCount;	// Track need for meter updates by DSP
734	PCDspCommObject
735						m_pDspCommObject;	// Ptr to DSP communication object
736
737	DWORD				m_dwMidiInOpen;	// Midi in channels open mask
738	DWORD				m_dwMidiOutOpen; 	// Midi out channels open mask
739
740	BOOL				m_fMixerDisabled;
741
742	WORD				m_wAnalogOutputLatency;	// Latency in samples
743	WORD				m_wAnalogInputLatency;
744	WORD				m_wDigitalOutputLatency;
745	WORD				m_wDigitalInputLatency;
746
747
748
749	//
750	//	Monitor state info
751	//
752	CMonitorCtrl		m_MonitorCtrl;
753
754	//
755	// Output pipe control
756	//
757	CPipeOutCtrl		m_PipeOutCtrl;
758
759	//
760	// Input bus mute and gain settings
761	//
762	CBusInLineLevel	m_BusInLineLevels[ ECHO_MAXAUDIOINPUTS ];
763
764	//
765	// Output bus mute and gain settings
766	//
767	CBusOutLineLevel	m_BusOutLineLevels[ ECHO_MAXAUDIOOUTPUTS ];
768
769	//
770	//
771	// Linked list of mixer clients
772	//
773	ECHO_MIXER_CLIENT	*m_pMixerClients;
774
775
776	//
777	// DMA position, in bytes, for each pipe
778	//
779	ULONGLONG		m_ullDmaPos[ ECHO_MAXAUDIOPIPES ];
780	DWORD				m_dwLastDspPos[ ECHO_MAXAUDIOPIPES ];
781
782	//
783	//	Pointers to daffy ducks for each pipe
784	//
785	PCDaffyDuck		m_DaffyDucks[ ECHO_MAXAUDIOPIPES ];
786
787
788#ifdef MIDI_SUPPORT
789	//
790	// MIDI input buffer
791	//
792	CMidiInQ	m_MidiIn;
793#endif
794
795
796	//
797	//	Macintosh compiler likes "class" after friend, PC doesn't care
798	//
799	friend class CLineLevel;
800	friend class CBusOutLineLevel;
801	friend class CBusInLineLevel;
802	friend class CPipeOutCtrl;
803	friend class CMonitorCtrl;
804	friend class CMidiInQ;
805	friend class CMtcSync;
806
807
808	//***********************************************************************
809	//
810	//	Initialization (protected)
811	//
812	//***********************************************************************
813
814	//
815	//	Init the line level classes.
816	//	This MUST be called from within any derived classes as part of
817	//	InitHw after the DSP is up and running!
818	//
819	virtual ECHOSTATUS InitLineLevels();
820
821
822	//***********************************************************************
823	//
824	//	Information (protected)
825	//
826	//***********************************************************************
827
828	virtual ECHOSTATUS GetBaseCapabilities(PECHOGALS_CAPS pCapabilities);
829
830	WORD GetNumPipesOut();
831	WORD GetNumPipesIn();
832	WORD GetNumBussesOut();
833	WORD GetNumBussesIn();
834	WORD GetNumBusses();
835 	WORD GetNumPipes();
836	WORD GetFirstDigitalBusOut();
837	WORD GetFirstDigitalBusIn();
838
839	BOOL HasVmixer();
840
841	PCDspCommObject GetDspCommObject();
842
843
844	//***********************************************************************
845	//
846	//	Audio transport (protected)
847	//
848	// Daffy ducks are objects that manage scatter-gather lists.
849	//
850	//***********************************************************************
851
852
853
854	//***********************************************************************
855	//
856	//	Mixer interface (protected)
857	//
858	//***********************************************************************
859
860	//
861	// Match a mixer cookie to a mixer client
862	//
863	ECHO_MIXER_CLIENT *GetMixerClient(NUINT Cookie);
864
865	//
866	// Adjust all the monitor levels for a particular output bus; this is
867	// used to implement the master output level.
868	//
869	virtual ECHOSTATUS AdjustMonitorsForBusOut(WORD wBusOut);
870
871	//
872	// Adjust all the output pipe levels for a particular output bus; this is
873	// also used to implement the master output level.
874	//
875	virtual ECHOSTATUS AdjustPipesOutForBusOut(WORD wBusOut,INT32 iBusOutGain);
876
877	//
878	// A mixer control has changed; store the notify
879	//
880	ECHOSTATUS MixerControlChanged
881	(
882		WORD	wType,								// One of the ECHO_CHANNEL_TYPES
883		WORD  wParameter, 						// One of the MXN_* values
884		WORD 	wCh1 = ECHO_CHANNEL_UNUSED,	// Depends on the wType value
885		WORD  wCh2 = ECHO_CHANNEL_UNUSED		// Also depends on wType value
886	);
887
888#ifdef DIGITAL_INPUT_AUTO_MUTE_SUPPORT
889	//
890	// Digital input auto-mute - Gina24, Layla24, and Mona only
891	//
892	virtual ECHOSTATUS GetDigitalInAutoMute(PMIXER_FUNCTION pMixerFunction);
893	virtual ECHOSTATUS SetDigitalInAutoMute(PMIXER_FUNCTION pMixerFunction);
894#endif
895
896	//
897	// Get the audio latency for a single pipe
898	//
899	virtual void GetAudioLatency(ECHO_AUDIO_LATENCY *pLatency);
900
901};		// class CEchoGals
902
903typedef CEchoGals * PCEchoGals;
904
905#endif
906
907// *** CEchoGals.h ***
908