xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/EchoGalsXface.h (revision 1d9d47fc72028bb71b5f232a877231e59cfe2438)
1 // ****************************************************************************
2 //
3 //		EchoGalsXface.H
4 //
5 //		Include file for interfacing with the CEchoGals generic driver class.
6 //
7 //		Set editor tabs to 3 for your viewing pleasure.
8 //
9 // ----------------------------------------------------------------------------
10 //
11 // This file is part of Echo Digital Audio's generic driver library.
12 // Copyright Echo Digital Audio Corporation (c) 1998 - 2005
13 // All rights reserved
14 // www.echoaudio.com
15 //
16 // This library is free software; you can redistribute it and/or
17 // modify it under the terms of the GNU Lesser General Public
18 // License as published by the Free Software Foundation; either
19 // version 2.1 of the License, or (at your option) any later version.
20 //
21 // This library is distributed in the hope that it will be useful,
22 // but WITHOUT ANY WARRANTY; without even the implied warranty of
23 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24 // Lesser General Public License for more details.
25 //
26 // You should have received a copy of the GNU Lesser General Public
27 // License along with this library; if not, write to the Free Software
28 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
29 //
30 // ****************************************************************************
31 
32 /*
33 
34 
35 
36 	Here's a block diagram of how most of the cards work:
37 
38                   +-----------+
39          record   |           |<-------------------- Inputs
40           <-------|           |        |
41   PCI             | Transport |        |
42   bus             |  engine   |       \|/
43           ------->|           |    +-------+
44            play   |           |--->|monitor|-------> Outputs
45                   +-----------+    | mixer |
46                                    +-------+
47 
48 	The lines going to and from the PCI bus represent "pipes".  A pipe performs
49 	audio transport - moving audio data to and from buffers on the host via
50 	bus mastering.
51 
52 	The inputs and outputs on the right represent input and output "busses."
53 	A bus is a physical, real connection to the outside world.  An example
54 	of a bus would be the 1/4" analog connectors on the back of Layla or
55 	an RCA S/PDIF connector.
56 
57 	For most cards, there is a one-to-one correspondence between outputs
58 	and busses; that is, each individual pipe is hard-wired to a single bus.
59 
60 	Cards that work this way are Darla20, Gina20, Layla20, Darla24, Gina24,
61 	Layla24, Mona, Indigo, Indigo io, and Indigo dj.
62 
63 
64 	Mia has a feature called "virtual outputs."
65 
66 
67                   +-----------+
68            record |           |<----------------------------- Inputs
69           <-------|           |                  |
70      PCI          | Transport |                  |
71      bus          |  engine   |                 \|/
72           ------->|           |   +------+   +-------+
73             play  |           |-->|vmixer|-->|monitor|-------> Outputs
74                   +-----------+   +------+   | mixer |
75                                              +-------+
76 
77 
78 	Obviously, the difference here is the box labeled "vmixer."  Vmixer is
79 	short for "virtual output mixer."  For Mia, pipes are *not* hard-wired
80 	to a single bus; the vmixer lets you mix any pipe to any bus in any
81 	combination.
82 
83 	Note, however, that the left-hand side of the diagram is unchanged.
84 	Transport works exactly the same way - the difference is in the mixer stage.
85 
86 
87 	Pipes and busses are numbered starting at zero.
88 
89 
90 
91 	Pipe index
92 	==========
93 
94 	A number of calls in CEchoGals refer to a "pipe index".  A pipe index is
95 	a unique number for a pipe that unambiguously refers to a playback or record
96 	pipe.  Pipe indices are numbered starting with analog outputs, followed by
97 	digital outputs, then analog inputs, then digital inputs.
98 
99 	Take Gina24 as an example:
100 
101 	Pipe index
102 
103 	0-7				Analog outputs
104 	8-15				Digital outputs
105 	16-17				Analog inputs
106 	18-25				Digital inputs
107 
108 
109 	You get the pipe index by calling CEchoGals::OpenAudio; the other transport
110 	functions take the pipe index as a parameter.  If you need a pipe index for
111 	some other reason, use the handy MakePipeIndex method.
112 
113 
114 	Some calls take a CChannelMask parameter; CChannelMask is a handy way to group
115 	pipe indices.
116 
117 
118 
119 	Digital mode switch
120 	===================
121 
122 	Some cards (right now, Gina24, Layla24, and Mona) have a Digital Mode Switch
123 	or DMS.  Cards with a DMS can be set to one of three mutually exclusive
124 	digital modes: S/PDIF RCA, S/PDIF optical, or ADAT optical.
125 
126 	This may create some confusion since ADAT optical is 8 channels wide and
127 	S/PDIF is only two channels wide.  Gina24, Layla24, and Mona handle this
128 	by acting as if they always have 8 digital outs and ins.  If you are in
129 	either S/PDIF mode, the last 6 channels don't do anything - data sent
130 	out these channels is thrown away and you will always record zeros.
131 
132 	Note that with Gina24, Layla24, and Mona, sample rates above 50 kHz are
133 	only available if	you have the card configured for S/PDIF optical or S/PDIF RCA.
134 
135 
136 
137 	Double speed mode
138 	=================
139 
140 	Some of the cards support 88.2 kHz and 96 kHz sampling (Darla24, Gina24, Layla24,
141 	Mona, Mia, and Indigo).  For these cards, the driver sometimes has to worry about
142 	"double speed mode"; double speed mode applies whenever the sampling rate is above
143 	50 kHz.
144 
145 	For instance, Mona and Layla24 support word clock sync.  However, they actually
146 	support two different word clock modes - single speed (below 50 kHz) and double
147 	speed (above 50 kHz).  The hardware detects if a single or double speed word clock
148 	signal is present; the generic code uses that information to determine which mode
149 	to use.
150 
151 	The generic code takes care of all this for you.
152 
153    For hardware that supports 176.4 and 192 kHz, there is a corresponding quad speed
154 	mode.
155 
156 */
157 
158 
159 //	Prevent problems with multiple includes
160 #ifndef _ECHOGALSXFACE_
161 #define _ECHOGALSXFACE_
162 
163 
164 //***********************************************************************
165 //
166 //	PCI configuration space
167 //
168 //***********************************************************************
169 
170 //
171 // PCI vendor ID and device IDs for the hardware
172 //
173 #define VENDOR_ID						 0x1057
174 #define DEVICE_ID_56301				 0x1801
175 #define DEVICE_ID_56361				 0x3410
176 #define SUBVENDOR_ID					 ((ULONG)0xECC0)
177 
178 
179 //
180 //	Valid Echo PCI subsystem card IDs
181 //
182 #define DARLA							0x0010
183 #define GINA							0x0020
184 #define LAYLA							0x0030
185 #define DARLA24						0x0040
186 #define GINA24					 		0x0050
187 #define LAYLA24						0x0060
188 #define MONA							0x0070
189 #define MIA								0x0080
190 #define INDIGO							0x0090
191 #define INDIGO_IO						0x00a0
192 #define INDIGO_DJ						0x00b0
193 #define ECHO3G							0x0100
194 #define BASEPCI						0xfff0
195 
196 
197 //***********************************************************************
198 //
199 //	Array sizes and so forth
200 //
201 //***********************************************************************
202 
203 //
204 // Sizes
205 //
206 #define ECHO_MAXNAMELEN				128			// Max card name length
207 															// (includes 0 terminator)
208 #define ECHO_MAXAUDIOINPUTS		32				// Max audio input channels
209 #define ECHO_MAXAUDIOOUTPUTS		32				// Max audio output channels
210 #define ECHO_MAXAUDIOPIPES			32				// Max number of input and output pipes
211 #define ECHO_MAXMIDIJACKS			1				// Max MIDI ports
212 #define ECHO_MTC_QUEUE_SZ			32				// Max MIDI time code input queue entries
213 
214 //
215 // MIDI activity indicator timeout
216 //
217 #define MIDI_ACTIVITY_TIMEOUT_USEC	200000
218 
219 
220 //*****************************************************************************
221 //
222 // Clocks
223 //
224 //*****************************************************************************
225 
226 //
227 // Clock numbers
228 //
229 #define ECHO_CLOCK_INTERNAL				0
230 #define ECHO_CLOCK_WORD						1
231 #define ECHO_CLOCK_SUPER					2
232 #define ECHO_CLOCK_SPDIF					3
233 #define ECHO_CLOCK_ADAT						4
234 #define ECHO_CLOCK_ESYNC					5
235 #define ECHO_CLOCK_ESYNC96					6
236 #define ECHO_CLOCK_MTC						7
237 #define ECHO_CLOCK_NONE						0xffff
238 
239 //
240 // Clock bit numbers - used to report capabilities and whatever clocks
241 // are being detected dynamically.
242 //
243 #define ECHO_CLOCK_BIT_INTERNAL			(1<<ECHO_CLOCK_INTERNAL)
244 #define ECHO_CLOCK_BIT_WORD				(1<<ECHO_CLOCK_WORD)
245 #define ECHO_CLOCK_BIT_SUPER				(1<<ECHO_CLOCK_SUPER)
246 #define ECHO_CLOCK_BIT_SPDIF				(1<<ECHO_CLOCK_SPDIF)
247 #define ECHO_CLOCK_BIT_ADAT				(1<<ECHO_CLOCK_ADAT)
248 #define ECHO_CLOCK_BIT_ESYNC				(1<<ECHO_CLOCK_ESYNC)
249 #define ECHO_CLOCK_BIT_ESYNC96			(1<<ECHO_CLOCK_ESYNC96)
250 #define ECHO_CLOCK_BIT_MTC					(1<<ECHO_CLOCK_MTC)
251 
252 
253 //*****************************************************************************
254 //
255 // Digital modes
256 //
257 //*****************************************************************************
258 
259 //
260 // Digital modes for Mona, Layla24, and Gina24
261 //
262 #define DIGITAL_MODE_NONE					0xFF
263 #define DIGITAL_MODE_SPDIF_RCA			0
264 #define DIGITAL_MODE_SPDIF_OPTICAL		1
265 #define DIGITAL_MODE_ADAT					2
266 
267 //
268 //	Digital mode capability masks
269 //
270 #define ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA		(1<<DIGITAL_MODE_SPDIF_RCA)
271 #define ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL	(1<<DIGITAL_MODE_SPDIF_OPTICAL)
272 #define ECHOCAPS_HAS_DIGITAL_MODE_ADAT				(1<<DIGITAL_MODE_ADAT)
273 
274 
275 //*****************************************************************************
276 //
277 // Driver flags
278 //
279 //*****************************************************************************
280 
281 //
282 //	Note that some flags are read-only (look for ROFLAG as part of the name).
283 // The read-only flags are used to tell you what the card can do; you can't
284 // set or clear them.
285 //
286 // Some cards can only handle mono & stereo interleaved data in host audio buffers; that
287 // is, you may only specify 1 or 2 in the wPipeWidth field when you open a pipe for
288 // playing or recording.
289 //
290 // If the card has the super interleave flag set, that means that you can interleave
291 // by more than 2.  For super interleave-capable cards, you can interleave by 1, 2,
292 // 4, 6, 8, 10, 12, 14, or 16.  Note that you cannot interleave beyond the actual
293 // number of pipes on the card - if the card has 16 pipes and you open pipe 6,
294 // the maximum interleave would be 10.
295 //
296 //
297 // Gina24, Layla24, and Mona support digital input auto-mute.  If the digital input
298 // auto-mute is enabled, the DSP will only enable the digital inputs if the card
299 // is syncing to a valid clock on the ADAT or S/PDIF inputs.
300 //
301 // If the auto-mute is disabled, the digital inputs are enabled regardless of
302 // what the input clock is set or what is connected.
303 //
304 //
305 
306 #define ECHOGALS_FLAG_BADBOARD					0x0001	// Board could not be init or
307 																		// stopped responding
308 																		// (i.e. DSP crashed)
309 
310 #define ECHOGALS_FLAG_SYNCH_WAVE					0x0004	// Used to enable wave device
311 																		// synchronization.  When set,
312 																		// all open wave devices for
313 																		// a single task start when the
314 																		// start for the last channel
315 																		// is received.
316 
317 #define ECHOGALS_FLAG_SAMPLE_RATE_LOCKED		0x0010	// Set true if the rate has been locked
318 
319 #define ECHOGALS_ROFLAG_DIGITAL_IN_AUTOMUTE	0x4000	// Set if the console needs to handle
320 																		// the digital input auto-mute
321 
322 #define ECHOGALS_ROFLAG_SUPER_INTERLEAVE_OK	0x8000	// Set if this card can handle super
323 																		// interleave
324 
325 #define ECHOGALS_FLAG_WRITABLE_MASK				0x3fff
326 
327 
328 
329 //*****************************************************************************
330 //
331 // ECHOSTATUS return type - most of the generic driver functions
332 // return an ECHOSTATUS value
333 //
334 //*****************************************************************************
335 
336 typedef unsigned long	ECHOSTATUS;
337 
338 //
339 // Return status values
340 //
341 //	Changes here require a change in pStatusStrs in CEchoGals.cpp
342 //
343 #define ECHOSTATUS_OK									0x00
344 #define ECHOSTATUS_FIRST								0x00
345 #define ECHOSTATUS_BAD_FORMAT							0x01
346 #define ECHOSTATUS_BAD_BUFFER_SIZE					0x02
347 #define ECHOSTATUS_CANT_OPEN							0x03
348 #define ECHOSTATUS_CANT_CLOSE							0x04
349 #define ECHOSTATUS_CHANNEL_NOT_OPEN					0x05
350 #define ECHOSTATUS_BUSY									0x06
351 #define ECHOSTATUS_BAD_LEVEL							0x07
352 #define ECHOSTATUS_NO_MIDI								0x08
353 #define ECHOSTATUS_CLOCK_NOT_SUPPORTED				0x09
354 #define ECHOSTATUS_CLOCK_NOT_AVAILABLE				0x0A
355 #define ECHOSTATUS_BAD_CARDID							0x0B
356 #define ECHOSTATUS_NOT_SUPPORTED						0x0C
357 #define ECHOSTATUS_BAD_NOTIFY_SIZE					0x0D
358 #define ECHOSTATUS_INVALID_PARAM						0x0E
359 #define ECHOSTATUS_NO_MEM								0x0F
360 #define ECHOSTATUS_NOT_SHAREABLE						0x10
361 #define ECHOSTATUS_FIRMWARE_LOADED					0x11
362 #define ECHOSTATUS_DSP_DEAD							0x12
363 #define ECHOSTATUS_DSP_TIMEOUT						0x13
364 #define ECHOSTATUS_INVALID_CHANNEL					0x14
365 #define ECHOSTATUS_CHANNEL_ALREADY_OPEN			0x15
366 #define ECHOSTATUS_DUCK_FULL							0x16
367 #define ECHOSTATUS_INVALID_INDEX						0x17
368 #define ECHOSTATUS_BAD_CARD_NAME 					0x18
369 #define ECHOSTATUS_IRQ_NOT_OURS						0x19
370 #define ECHOSTATUS_NO_DATA								0x1E
371 #define ECHOSTATUS_BUFFER_OVERFLOW					0x1F
372 #define ECHOSTATUS_OPERATION_CANCELED				0x20
373 #define ECHOSTATUS_EVENT_NOT_OPEN					0x21
374 #define ECHOSTATUS_ASIC_NOT_LOADED					0x22
375 #define ECHOSTATUS_DIGITAL_MODE_NOT_SUPPORTED	0x23
376 #define ECHOSTATUS_RESERVED							0x24
377 #define ECHOSTATUS_BAD_COOKIE							0x25
378 #define ECHOSTATUS_MIXER_DISABLED					0x26
379 #define ECHOSTATUS_NO_SUPER_INTERLEAVE				0x27
380 #define ECHOSTATUS_DUCK_NOT_WRAPPED					0x28
381 #define ECHOSTATUS_NO_3G_BOX							0x29
382 #define ECHOSTATUS_LAST									0x2a
383 
384 
385 //*****************************************************************************
386 //
387 // ECHOGALS_AUDIOFORMAT describes the audio buffer format for a pipe
388 //
389 //
390 // byMonoToStereo is used to resolve an ambiguity when wDataInterleave is set
391 // to one.  Say you're writing a Windows driver and someone tells you to play mono data;
392 // what they really mean is that they want the same signal sent out of both left
393 // and right channels.
394 //
395 // Now, say you're writing an ASIO driver and the ASIO host wants mono data
396 // sent out of a single output only.  byMonoToStereo is a flag used to resolve
397 // this; if byMonoToStereo is non-zero, then the same signal is sent out both channels.
398 // If byMonoToStereo is zero, then only one output channel is used.
399 //
400 //*****************************************************************************
401 
402 typedef struct tECHOGALS_AUDIOFORMAT
403 {
404 	WORD		wDataInterleave;				// How the data is arranged in memory
405 													// Mono = 1, stereo = 2
406 	WORD		wBitsPerSample;				// 8, 16, 32
407 	BYTE		byMonoToStereo;				// Only used if wDataInterleave is 1 and
408 													// if this is an output pipe.
409 	BYTE		byDataAreBigEndian;			// 1 = Apple, 0 = Intel
410 } ECHOGALS_AUDIOFORMAT, * PECHOGALS_AUDIOFORMAT;
411 
412 
413 //
414 //	All kinds of peak and VU meters.  Only cards with virtual outputs will
415 // have output pipe meters.
416 //
417 //	All data are scaled integers in units of dB X 256
418 //
419 typedef struct tECHOGALS_METERS
420 {
421 	INT32	iNumPipesOut;	// These numbers only apply in the context of this structure;
422 	INT32	iNumPipesIn;	// they indicate the number of entries in each of the arrays.
423 	INT32	iNumBussesOut;
424 	INT32	iNumBussesIn;
425 
426 	INT32	iPipeOutVU[ECHO_MAXAUDIOOUTPUTS];
427 	INT32	iPipeOutPeak[ECHO_MAXAUDIOOUTPUTS];
428 
429 	INT32	iPipeInVU[ECHO_MAXAUDIOINPUTS];
430 	INT32	iPipeInPeak[ECHO_MAXAUDIOINPUTS];
431 
432 	INT32	iBusOutVU[ECHO_MAXAUDIOOUTPUTS];
433 	INT32	iBusOutPeak[ECHO_MAXAUDIOOUTPUTS];
434 
435 	INT32	iBusInVU[ECHO_MAXAUDIOINPUTS];
436 	INT32	iBusInPeak[ECHO_MAXAUDIOINPUTS];
437 } ECHOGALS_METERS, * PECHOGALS_METERS;
438 
439 //
440 // ECHOGALS_AUDIO_PIPE describes a single pipe.
441 //
442 // Note that nPipe is *not* a pipe index; it's just the number for the pipe.
443 // This is meant to make life easier for you, the driver developer; the code
444 // is meant to be set up that you don't have to go around calculating the
445 // pipe index.
446 //
447 // In other words, if you want to specify the first input pipe, do this:
448 //
449 // nPipe = 0
450 // bIsInput = TRUE
451 //
452 // Don't set nPipe equal to the number of output pipes, since it's not a pipe
453 // index.
454 //
455 
456 typedef struct tECHOGALS_AUDIO_PIPE
457 {
458 	WORD		nPipe;					// Pipe number (not a pipe index!)
459 	BOOL		bIsInput;				// Set TRUE for input pipe, FALSE for output
460 	WORD		wInterleave;			// Interleave factor for this pipe
461 											// Mono = 1, stereo = 2, 5.1 surround = 6
462 } ECHOGALS_AUDIO_PIPE, * PECHOGALS_AUDIO_PIPE;
463 
464 
465 //
466 // This structure is used to open a pipe and reserve it for your exclusive use.
467 //
468 // Note that if you set wInterleave in the ECHOGALS_AUDIO_PIPE sub-struct
469 // to greater than one, you are actually reserving more than one pipe; in fact
470 // you are reserving the pipe specified by the nPipe field as well as
471 // the next wInterleave-1 pipes.
472 //
473 // ProcessId is used in specific situations in the Windows driver where
474 // several pipes are opened as different devices, but you want them all
475 // to start synchronously.  The driver attempts to start the pipes in groups
476 // based on the ProcessId field.
477 //
478 // If you don't want to hassle with this, just set ProcessId to NULL; the
479 // generic code will then ignore the ProcessId.
480 //
481 // ProcessId is also ignored if you clear the ECHOGALS_FLAG_SYNCH_WAVE flag.
482 //
483 
484 typedef struct tECHOGALS_OPENAUDIOPARAMETERS
485 {
486 	ECHOGALS_AUDIO_PIPE		Pipe;			// Pipe descriptor
487 	BOOL							bIsCyclic;	// Set TRUE if using circular buffers
488 													// Set FALSE for linked list of use
489 													// once and discard buffers
490 	PVOID							ProcessId;	// Caller process ID for implementing
491 													// synchronous wave start
492 } ECHOGALS_OPENAUDIOPARAMETERS, * PECHOGALS_OPENAUDIOPARAMETERS;
493 
494 
495 //
496 // Yes, it's the world's simplest structure.
497 //
498 typedef struct tECHOGALS_CLOSEAUDIOPARAMETERS
499 {
500 	WORD		wPipeIndex;
501 } ECHOGALS_CLOSEAUDIOPARAMETERS, * PECHOGALS_CLOSEAUDIOPARAMETERS;
502 
503 //
504 // Context info for MIDI input clients
505 //
506 typedef struct tECHOGALS_MIDI_IN_CONTEXT
507 {
508 	BOOL	fOpen;
509 	DWORD dwDrain;
510 } ECHOGALS_MIDI_IN_CONTEXT;
511 
512 //
513 // One nifty feature is that the DSP is constantly writing the DMA position
514 // for each pipe to the comm page without the driver having to do anything.
515 // You can therefore obtain a pointer to this location and directly read
516 // the position from anywhere.
517 //
518 // The pointer returned should be treated as a read-only pointer and is
519 // kind of dangerous, since it points directly into the driver.
520 //
521 // Note that the value pointed to by pdwPosition will be in little-endian
522 // format.
523 //
524 // The value pointed to by pdwPosition is the number of bytes transported
525 // by the DSP; it will constantly increase until it hits the 32-bit boundary
526 // and then wraps around.  It does *not* represent the offset into a circular
527 // DMA buffer; this value is treated identically for cyclic and non-cyclic
528 // buffer schemes.
529 //
530 typedef struct tECHOGALS_POSITION
531 {
532 	PDWORD	pdwPosition;
533 } ECHOGALS_POSITION, * PECHOGALS_POSITION;
534 
535 
536 /*
537 
538 	ECHOGALS_CAPS
539 
540 	This structure is used to differentiate one card from another.
541 
542 	szName					Zero-terinated char string; unique name for
543 								this card.
544 
545 	wCardType				One of the DARLA, GINA, etc. card IDs at the
546 								top of this header file
547 
548 	dwOutClockTypes		This is a bit mask describing all the different
549 								output clock types that can be set.  If the bit mask
550 								is zero, then the output clock cannot be set on this
551 								card.  The bits will be one of the ECHO_CLOCK_BIT_???
552 								defines above.
553 
554 	dwInClockTypes			Again, a bit mask describing what this card can
555 								sync to.  This mask is fixed, regardless of what is
556 								or is not currently connected to the hardware.  Again,
557 								this uses the ECHO_CLOCK_BIT_??? defines.
558 
559 	dwDigitalModes			Some cards (right now, Gina24, Layla24 and Mona) have
560 								what we call a Digital Mode Switch or DMS.
561 								Use the ECHOCAPS_HAS_DIGITAL_MODE_??? defines to determine
562 								which digital modes this card supports.
563 
564 	fHasVmixer				Boolean flag- if this field is non-zero, then this card
565 								supports virtual outputs.
566 
567 	wNumPipesOut			Should be self-explanatory, given the definitions of
568 	wNumPipesIn				pipes and busses above.  Note that these are all in terms
569 	wNumBussesOut			of mono pipes and busses.
570 	wNumBussesIn
571 
572 	wFirstDigitalBusOut	Gives you the number of, well, the first bus that
573 								goes out an S/PDIF or ADAT output.  If this card has
574 								no digital outputs, wFirstDigitalBusOut will be equal
575 								to wNumBussesOut.  This may seem strange, but remember
576 								that the busses are numbered starting at zero and that
577 								valid bus numbers therefore range from zero to
578 								(wNumBussesOut - 1).  Doing it this way actually
579 								turned out to simplify writing consoles and so forth.
580 
581 	wFirstDigitalBusIn	Just like the last one, but for inputs
582 
583 	wFirstDigitalPipeOut	Gives you the number of the first pipe that is connected
584 								to a digital output bus.  If this card has no digital output
585 								busses, this will be equal to wNumPipesOut.  Cards with
586 								virtual outputs will always have this member set equal
587 								to wNumPipesOut.
588 
589 	wFirstDigitalPipeIn	Again, just like wFirstDigitalPipeOut, but for inputs.
590 
591 	dwPipeOutCaps[]		Array of bit fields with information about each output
592 								pipe.  This tells you what controls are available for
593 								each output pipe, as well as whether or not this pipe
594 								is connected to a digital output.  Use the ECHOCAPS_???
595 								bits above to parse this bit field.
596 
597 	dwPipeInCaps[]			More arrays for the other busses and pipes; works
598 	dwBusOutCaps[]			just like dwPipeOutCaps.
599 	dwBusInCaps[]
600 
601 	wNumMidiOut				Number of MIDI inputs and outputs on this card.
602 	wNumMidiIn
603 
604  */
605 
606 enum
607 {
608 	ECHOCAPS_GAIN 				= 0x00000001,
609 	ECHOCAPS_MUTE				= 0x00000004,
610 	ECHOCAPS_PAN				= 0x00000010,
611 	ECHOCAPS_PEAK_METER		= 0x00000020,
612 	ECHOCAPS_VU_METER 		= 0x00000040,
613 	ECHOCAPS_NOMINAL_LEVEL	= 0x00000080,	// aka +4/-10
614 	ECHOCAPS_PHANTOM_POWER	= 0x20000000,
615 	ECHOCAPS_DUMMY				= 0x40000000,	// Used for Indigo; indicates
616 														// a dummy input or output
617 	ECHOCAPS_DIGITAL			= 0x80000000 	// S/PDIF or ADAT connection
618 };
619 
620 
621 typedef struct tECHOGALS_CAPS
622 {
623 	CHAR 		szName[ ECHO_MAXNAMELEN ];	// Name of this card
624 	WORD		wCardType;						// Type of card
625 	DWORD		dwOutClockTypes;				// Types of output clocks
626 	DWORD		dwInClockTypes;				// Types of input clocks
627 	DWORD		dwDigitalModes;				// Digital modes supported
628 	BOOL		fHasVmixer;
629 
630 	WORD		wNumPipesOut;
631 	WORD		wNumPipesIn;
632 	WORD		wNumBussesOut;
633 	WORD		wNumBussesIn;
634 
635 	WORD		wFirstDigitalBusOut;			// Equal to wNumBussesOut if this card has
636 													// no digital output busses
637 
638 	WORD		wFirstDigitalBusIn;			// Equal to wNumBussesIn if this card has
639 													// no digital input busses
640 
641 	WORD		wFirstDigitalPipeOut;		// Works just like wFirstDigitalBus... above
642 	WORD		wFirstDigitalPipeIn;
643 
644 	DWORD		dwPipeOutCaps[ ECHO_MAXAUDIOOUTPUTS ];
645 	DWORD		dwPipeInCaps[ ECHO_MAXAUDIOINPUTS ];
646 	DWORD		dwBusOutCaps[ ECHO_MAXAUDIOOUTPUTS ];
647 	DWORD		dwBusInCaps[ ECHO_MAXAUDIOINPUTS ];
648 
649 	WORD		wNumMidiOut;					// Number of MIDI out jacks
650 	WORD		wNumMidiIn;						// Number of MIDI in jacks
651 } ECHOGALS_CAPS, *PECHOGALS_CAPS;
652 
653 
654 /*
655 
656 	Echo3G box types
657 
658 */
659 
660 //
661 // 3G external box types
662 //
663 #define GINA3G									0x00
664 #define LAYLA3G								0x10
665 #define NO3GBOX								0xffff
666 
667 
668 #endif // _ECHOGALSXFACE_
669 
670 
671 // end file EchoGalsXface.h
672