xref: /haiku/src/add-ons/kernel/drivers/audio/echo/generic/MixerXface.h (revision 1d9d47fc72028bb71b5f232a877231e59cfe2438)
1 // ****************************************************************************
2 //
3 //		MixerXface.H
4 //
5 //		Include file for mixer interfacing with the EchoGals-derived classes.
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 //	Prevent problems with multiple includes
33 #ifndef _MIXERXFACE_
34 #define _MIXERXFACE_
35 
36 #include "EchoGalsXface.h"
37 
38 //
39 // Gain ranges
40 //
41 #define ECHOGAIN_MUTED			DSP_TO_GENERIC(-128)	// Minimum possible gain
42 #define ECHOGAIN_MINOUT			DSP_TO_GENERIC(-128)	// Min output gain in dB
43 #define ECHOGAIN_MAXOUT			DSP_TO_GENERIC(6)		// Max output gain in dB
44 #define ECHOGAIN_MININP			DSP_TO_GENERIC(-25) 	// Min input gain in dB
45 #define ECHOGAIN_MAXINP			DSP_TO_GENERIC(25)	// Max input gain in dB
46 
47 #define ECHOGAIN_UPDATE		 	0xAAAAAA					// Using this value means:
48 																	// Re-set the gain
49 																	// to the DSP using the
50 																	// currently stored value.
51 
52 
53 //=============================================================================
54 //
55 // Most of the mixer functions have been unified into a single interface;
56 // you pass either a single MIXER_FUNCTION struct or an array of MIXER_FUNCTION
57 // structs.  Each MIXER_FUNCTION is generally used to set or get one or more
58 // values.
59 //
60 //=============================================================================
61 
62 //
63 //	Structure to specify a bus, pipe, or a monitor being routed from
64 // the input to the output
65 //
66 enum ECHO_CHANNEL_TYPES
67 {
68 	ECHO_BUS_OUT = 0,
69 	ECHO_BUS_IN,
70 	ECHO_PIPE_OUT,
71 	ECHO_PIPE_IN,
72 	ECHO_MONITOR,
73 	ECHO_NO_CHANNEL_TYPE = 0xffff,
74 	ECHO_CHANNEL_UNUSED = 0xffff
75 };
76 
77 typedef struct tMIXER_AUDIO_CHANNEL
78 {
79 	WORD			wCardId;				// This field is obsolete
80 	WORD			wChannel;			// Depends on dwType:
81 											// ECHO_BUS_OUT	wChannel = output bus #
82 											// ECHO_BUS_IN		wChannel = input bus #
83 											// ECHO_PIPE_OUT	wChannel = output pipe #
84 											// ECHO_PIPE_IN	wChannel = input pipe #
85 											// ECHO_MONITOR	wChannel = input bus #
86 	DWORD			dwType;				// One of the above enums
87 } MIXER_AUDIO_CHANNEL, *PMIXER_AUDIO_CHANNEL;
88 
89 
90 //
91 //	Mixer Function Tags
92 //
93 // These codes are used to specify the mixer function you want to perform;
94 // they determine which field in the Data union to use
95 //
96 #define	MXF_GET_CAPS					1		// Get card capabilities
97 #define	MXF_GET_LEVEL					2		// Get level for one channel
98 #define	MXF_SET_LEVEL					3		// Set level for one channel
99 #define	MXF_GET_NOMINAL				4		// Get nominal level for one channel
100 #define	MXF_SET_NOMINAL				5		// Set nominal level for one channel
101 #define	MXF_GET_MONITOR				6		// Get monitor for one channel
102 #define	MXF_SET_MONITOR				7		// Set monitor for one channel
103 #define	MXF_GET_INPUT_CLOCK			8		// Get input clock
104 #define	MXF_SET_INPUT_CLOCK			9		// Set input clock for one card
105 #define	MXF_GET_METERS					10		// Get meters for all channels on one card
106 #define	MXF_GET_METERS_ON				11		// Get meters on state for one card
107 #define	MXF_SET_METERS_ON				12		// Set meters on state for one card
108 														//	Meters must only be enabled while
109 														// driver for card exists; the meters are
110 														// written via bus mastering directly to memory
111 #define	MXF_GET_PROF_SPDIF			13		// Get Professional or consumer S/PDIF mode
112 														// for one card
113 #define	MXF_SET_PROF_SPDIF			14		// Set Professional or consumer S/PDIF mode
114 														// for one card
115 #define	MXF_GET_MUTE					15		// Get mute state for one channel
116 #define	MXF_SET_MUTE					16		// Set mute state for one channel
117 #define	MXF_GET_MONITOR_MUTE			19		// Get monitor mute state for one channel
118 #define	MXF_SET_MONITOR_MUTE			20		// Set monitor mute state for one channel
119 #define	MXF_GET_MONITOR_PAN			23		// Get monitor pan value for one stereo channel
120 #define	MXF_SET_MONITOR_PAN			24		// Set monitor pan value for one stereo channel
121 #define	MXF_GET_FLAGS					27		// Get driver flags
122 #define	MXF_SET_FLAGS					28		// Set driver flag
123 #define	MXF_CLEAR_FLAGS				29		// Clear driver flags
124 #define	MXF_GET_SAMPLERATE_LOCK		30		// Get locked sample rate for one card
125 #define	MXF_SET_SAMPLERATE_LOCK		31		// Set locked sample rate for one card
126 #define	MXF_GET_SAMPLERATE			32		// Get actual sample rate for one card
127 #define	MXF_GET_MIDI_IN_ACTIVITY	35		// Get MIDI in activity state
128 #define	MXF_GET_MIDI_OUT_ACTIVITY	36		// Get MIDI out activity state
129 #define	MXF_GET_DIGITAL_MODE			37		// Get digital mode
130 #define	MXF_SET_DIGITAL_MODE			38		// Get digital mode
131 
132 #define 	MXF_GET_PAN						39		// Get & set pan
133 #define 	MXF_SET_PAN						40
134 #define	MXF_GET_OUTPUT_CLOCK			41		// Get output clock
135 #define	MXF_SET_OUTPUT_CLOCK			42		// Set output clock for one card
136 #define 	MXF_GET_CLOCK_DETECT			43		// Get the currently detected clocks
137 #define 	MXF_GET_DIG_IN_AUTO_MUTE	44		// Get the state of the digital input auto-mute
138 #define 	MXF_SET_DIG_IN_AUTO_MUTE	45		// Set the state of the digital input auto-mute
139 #define	MXF_GET_AUDIO_LATENCY		46		// Get the latency for a single pipe
140 
141 #define	MXF_GET_PHANTOM_POWER		47		// Get phantom power state
142 #define  MXF_SET_PHANTOM_POWER		48		// Set phantom power state
143 
144 
145 //
146 // Output pipe control change - only used if you specify
147 // ECHO_PIPE_OUT in the dwType field for MIXER_AUDIO_CHANNEL
148 //
149 typedef struct
150 {
151 	WORD	wBusOut;	  				// For cards without vmixer, should
152 						  				// be the same as wChannel in MIXER_AUDIO_CHANNEL
153 	union
154 	{
155 		INT32	iLevel;				// New gain in dB X 256
156 		INT32	iPan;					// 0 <= new pan <= MAX_MIXER_PAN,
157 										// 0 = full left MAX_MIXER_PAN = full right
158 		BOOL	bMuteOn;				// To mute or not to mute
159 										// MXF_GET_MONITOR_MUTE &
160 										// MXF_SET_MONITOR_MUTE
161 
162 	} Data;
163 }	MIXER_PIPE_OUT, PMIXER_PIPE_OUT;
164 
165 
166 //
167 //	The MIXER_AUDIO_CHANNEL header has the card and input channel.
168 //	This structure has the output channel and the gain, mute or pan
169 //	state for one monitor.
170 //
171 // Only used if you specify ECHO_MONITOR in the dwType field
172 // for MIXER_AUDIO_CHANNEL.
173 //
174 typedef struct tMIXER_MONITOR
175 {
176 	WORD		wBusOut;
177 	union
178 	{
179 		INT32	iLevel;				// New gain in dB X 256
180 		INT32	iPan;					// 0 <= new pan <= MAX_MIXER_PAN,
181 										// 0 = full left MAX_MIXER_PAN = full right
182 		BOOL	bMuteOn;				// To mute or not to mute
183 										// MXF_GET_MONITOR_MUTE &
184 										// MXF_SET_MONITOR_MUTE
185 	} Data;
186 } MIXER_MONITOR, *PMIXER_MONITOR;
187 
188 
189 //
190 // If you specify MXF_GET_AUDIO_LATENCY, then you get the following
191 // structure back
192 //
193 typedef struct tECHO_AUDIO_LATENCY
194 {
195 	WORD		wPipe;
196 	WORD		wIsInput;
197 	DWORD		dwLatency;
198 }	ECHO_AUDIO_LATENCY;
199 
200 
201 
202 //
203 //	Mixer Function Data Structure
204 //
205 typedef struct tMIXER_FUNCTION
206 {
207 	MIXER_AUDIO_CHANNEL	Channel;				// Which channel to service
208 	INT32						iFunction;			// What function to do
209 	ECHOSTATUS				RtnStatus;			// Return Result
210 	union
211 	{
212 		ECHOGALS_CAPS			Capabilities;	// MXF_GET_CAPS
213 		INT32						iNominal;		// MXF_GET_NOMINAL & MXF_SET_NOMINAL
214 		INT32						iLevel;			// MXF_GET_LEVEL & MXF_SET_LEVEL
215 		MIXER_MONITOR			Monitor;			// MXF_GET_MONITOR & MXF_SET_MONITOR
216 														// MXF_GET_MONITOR_MUTE & MXF_SET_MONITOR_MUTE
217 														// MXF_GET_MONITOR_PAN & MXF_SET_MONITOR_PAN
218 		WORD						wClock;			// MXF_GET_INPUT_CLOCK & MXF_SET_INPUT_CLOCK
219 														// MXF_GET_OUTPUT_CLOCK & MXF_SET_OUTPUT_CLOCK
220 		DWORD						dwClockDetectBits;
221 														// MXF_GET_CLOCK_DETECTs
222 		ECHOGALS_METERS		Meters;			// MXF_GET_METERS
223 		BOOL						bMetersOn;		// MXF_GET_METERS_ON &
224 														//	MXF_SET_METERS_ON
225 		BOOL						bProfSpdif;		// MXF_GET_PROF_SPDIF &
226 														//	MXF_SET_PROF_SPDIF
227 		BOOL						bMuteOn;			// MXF_GET_MUTE & MXF_SET_MUTE
228 		BOOL						bNotifyOn;		// MXF_GET_NOTIFY_ON &
229 														//	MXF_SET_NOTIFY_ON
230 		WORD						wFlags;			// MXF_GET_FLAGS, MXF_SET_FLAGS &
231 														//	MXF_CLEAR_FLAGS (See
232 														// ECHOGALS_FLAG_??? in file
233 														//	EchoGalsXface.h)
234 		DWORD						dwLockedSampleRate;
235 														// MXF_GET_SAMPLERATE_LOCK &
236 														//	MXF_SET_SAMPLERATE_LOCK
237 		DWORD						dwSampleRate;	// MXF_GET_SAMPLERATE
238 		BOOL						bMidiActive;	// MXF_GET_MIDI_IN_ACTIVITY &
239 														//	MXF_GET_MIDI_OUT_ACTIVITY
240 		INT32						iDigMode;		// MXF_GET_DIGITAL_MODE &
241 														//	MXF_SET_DIGITAL_MODE
242 
243 		MIXER_PIPE_OUT			PipeOut;			// MXF_GET_LEVEL & MXF_SET_LEVEL
244 														// MXF_GET_MUTE & MXF_SET_MUTE
245 														// MXF_GET_PAN & MXF_SET_PAN
246 
247 		BOOL						fDigitalInAutoMute;	// MXF_GET_DIG_IN_AUTO_MUTE
248 																// MXF_SET_DIG_IN_AUTO_MUTE
249 		ECHO_AUDIO_LATENCY	Latency;			// MXF_GET_AUDIO_LATENCY
250 
251 		BOOL						fPhantomPower;	// Phantom power state (true == on, false == off)
252 	} Data;
253 } MIXER_FUNCTION, *PMIXER_FUNCTION;
254 
255 //
256 //	Mixer Multifunction Interface
257 //
258 //	Allow user to supply an array of commands to be performed in one call.
259 //	Since this is a variable length structure, user beware!
260 //
261 typedef struct tMIXER_MULTI_FUNCTION
262 {
263 	INT32				iCount;
264 	MIXER_FUNCTION	MixerFunction[ 1 ];
265 } MIXER_MULTI_FUNCTION, *PMIXER_MULTI_FUNCTION;
266 
267 //
268 //	Use this macro to size the data structure
269 //
270 #define	ComputeMixerMultiFunctionSize(Ct)	( sizeof( MIXER_MULTI_FUNCTION ) + ( sizeof( MIXER_FUNCTION ) * ( Ct - 1 ) ) )
271 
272 
273 //
274 //	Notification
275 //
276 //	Mixers allow for notification whenever a change occurs.
277 //	Mixer notify structure contains channel and parameter(s) that
278 //	changed.
279 //
280 
281 //
282 //	Mixer Parameter Changed definitions
283 //
284 #define	MXN_LEVEL				0	// Level changed
285 #define	MXN_NOMINAL				1	// Nominal level changed
286 #define	MXN_INPUT_CLOCK		2	// Input clock changed
287 #define	MXN_SPDIF				3	// S/PDIF - Professional mode changed
288 #define	MXN_MUTE					4	// Mute state changed
289 #define 	MXN_PAN					6  // Pan value changed
290 
291 #define	MXN_FLAGS				12	// A driver flag changed
292 
293 #define	MXN_DIGITAL_MODE		14	// Digital mode changed
294 #define 	MXN_OUTPUT_CLOCK		15 // Output clock changed
295 #define	MXN_MAX					15	// Max notify parameters
296 
297 typedef struct tMIXER_NOTIFY
298 {
299 	WORD			wType;			// Same as enums used for MIXER_AUDIO_CHANNEL
300 
301 	union
302 	{
303 		WORD		wBusIn;
304 		WORD		wPipeIn;
305 		WORD		wPipeOut;
306 	} u;
307 
308 	WORD			wBusOut;			// For monitor & output pipe notifies only
309 	WORD			wParameter;		// One of the above MXN_*
310 
311 } MIXER_NOTIFY, *PMIXER_NOTIFY;
312 
313 
314 typedef struct tMIXER_MULTI_NOTIFY
315 {
316 	NUINT				Cookie;
317 	DWORD				dwCount;			// When passed to the generic driver,
318 											// dwCount holds the size of the Notifies array.
319 											// On returning from the driver, dwCount
320 											// holds the number of entries in Notifies
321 											// filled out by the generic driver.
322 	MIXER_NOTIFY	Notifies[1];	// Dynamic array; there are dwCount entries
323 }	MIXER_MULTI_NOTIFY, *PMIXER_MULTI_NOTIFY;
324 
325 //
326 //	Max pan value
327 //
328 #define	MAX_MIXER_PAN		1000		// this is pan hard right
329 
330 
331 //=============================================================================
332 //
333 // After designing eighteen or nineteen consoles for this hardware, we've
334 // learned that it's useful to be able to get all the following stuff at
335 // once.  Typically the console will run a timer that fetchs this periodically.
336 //
337 // Cookie is the unique ID for the mixer client; this is obtained by calling
338 // CEchoGals::OpenMixer.  The generic driver will maintain a separate notify
339 // queue for each client.
340 //
341 // Meters and dwClockDetectBits are exactly the same as you would get if you
342 // did each of those mixer functions separately.
343 //
344 // dwNumPendingNotifies is how many notifies are in the queue associated with
345 // the cookie.  You can use this number to create an array of MIXER_NOTIFY
346 // structures and call CEchoGals::GetControlChanges.  This way you only check
347 // for control changes if the controls have actually changed.
348 //
349 //=============================================================================
350 
351 typedef struct tECHO_POLLED_STUFF
352 {
353 	NUINT					Cookie;
354 	ECHOGALS_METERS	Meters;
355 	DWORD					dwClockDetectBits;
356 	DWORD					dwNumPendingNotifies;
357 } ECHO_POLLED_STUFF;
358 
359 #endif
360 
361 // MixerXface.h
362