xref: /onnv-gate/usr/src/cmd/audio/include/audio_device.h (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate  * CDDL HEADER START
3*0Sstevel@tonic-gate  *
4*0Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*0Sstevel@tonic-gate  * with the License.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate  * and limitations under the License.
13*0Sstevel@tonic-gate  *
14*0Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate  *
20*0Sstevel@tonic-gate  * CDDL HEADER END
21*0Sstevel@tonic-gate  */
22*0Sstevel@tonic-gate /*
23*0Sstevel@tonic-gate  * Copyright (c) 1992-2001 by Sun Microsystems, Inc.
24*0Sstevel@tonic-gate  * All rights reserved.
25*0Sstevel@tonic-gate  */
26*0Sstevel@tonic-gate 
27*0Sstevel@tonic-gate #ifndef _MULTIMEDIA_AUDIO_DEVICE_H
28*0Sstevel@tonic-gate #define	_MULTIMEDIA_AUDIO_DEVICE_H
29*0Sstevel@tonic-gate 
30*0Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*0Sstevel@tonic-gate 
32*0Sstevel@tonic-gate #ifdef __cplusplus
33*0Sstevel@tonic-gate extern "C" {
34*0Sstevel@tonic-gate #endif
35*0Sstevel@tonic-gate 
36*0Sstevel@tonic-gate #include <sys/types.h>
37*0Sstevel@tonic-gate #include <sys/ioccom.h>
38*0Sstevel@tonic-gate #include <sys/audioio.h>
39*0Sstevel@tonic-gate 
40*0Sstevel@tonic-gate typedef audio_info_t	Audio_info;
41*0Sstevel@tonic-gate 
42*0Sstevel@tonic-gate /*
43*0Sstevel@tonic-gate  * The following macros read the current audio device configuration
44*0Sstevel@tonic-gate  * and convert the data encoding format into an Audio_hdr.
45*0Sstevel@tonic-gate  * 'F' is an open audio file descriptor.
46*0Sstevel@tonic-gate  * 'H' is a pointer to an Audio_hdr.
47*0Sstevel@tonic-gate  * The structure '*H' is updated after the device state has been read.
48*0Sstevel@tonic-gate  */
49*0Sstevel@tonic-gate #define	audio_get_play_config(F, H)					\
50*0Sstevel@tonic-gate 		audio__setplayhdr((F), (H), AUDIO__PLAY)
51*0Sstevel@tonic-gate #define	audio_get_record_config(F, H)					\
52*0Sstevel@tonic-gate 		audio__setplayhdr((F), (H), AUDIO__RECORD)
53*0Sstevel@tonic-gate 
54*0Sstevel@tonic-gate /*
55*0Sstevel@tonic-gate  * The following macros attempt to reconfigure the audio device so that
56*0Sstevel@tonic-gate  * it operates on data encoded according to a given Audio_hdr.
57*0Sstevel@tonic-gate  * 'F' is an open audio file descriptor.
58*0Sstevel@tonic-gate  * 'H' is a pointer to an Audio_hdr describing the desired encoding.
59*0Sstevel@tonic-gate  * The structure '*H' is updated after the device state has been read
60*0Sstevel@tonic-gate  * to reflect the actual state of the device.
61*0Sstevel@tonic-gate  *
62*0Sstevel@tonic-gate  * AUDIO_SUCCESS is returned if the device configuration matches the
63*0Sstevel@tonic-gate  * requested encoding.  AUDIO_ERR_NOEFFECT is returned if it does not.
64*0Sstevel@tonic-gate  */
65*0Sstevel@tonic-gate #define	audio_set_play_config(F, H)					\
66*0Sstevel@tonic-gate 		audio__setplayhdr((F), (H), AUDIO__SET|AUDIO__PLAY)
67*0Sstevel@tonic-gate #define	audio_set_record_config(F, H)					\
68*0Sstevel@tonic-gate 		audio__setplayhdr((F), (H), AUDIO__SET|AUDIO__RECORD)
69*0Sstevel@tonic-gate 
70*0Sstevel@tonic-gate 
71*0Sstevel@tonic-gate /*
72*0Sstevel@tonic-gate  * The following macros pause or resume the audio play and/or record channels.
73*0Sstevel@tonic-gate  * Note that requests to pause a channel that is not open will have no effect.
74*0Sstevel@tonic-gate  * In such cases, AUDIO_ERR_NOEFFECT is returned.
75*0Sstevel@tonic-gate  */
76*0Sstevel@tonic-gate #define	audio_pause(F)							\
77*0Sstevel@tonic-gate 		audio__setpause((F), AUDIO__PLAYREC|AUDIO__PAUSE)
78*0Sstevel@tonic-gate #define	audio_pause_play(F)						\
79*0Sstevel@tonic-gate 		audio__setpause((F), AUDIO__PLAY|AUDIO__PAUSE)
80*0Sstevel@tonic-gate #define	audio_pause_record(F)						\
81*0Sstevel@tonic-gate 		audio__setpause((F), AUDIO__RECORD|AUDIO__PAUSE)
82*0Sstevel@tonic-gate 
83*0Sstevel@tonic-gate #define	audio_resume(F)							\
84*0Sstevel@tonic-gate 		audio__setpause((F), AUDIO__PLAYREC|AUDIO__RESUME)
85*0Sstevel@tonic-gate #define	audio_resume_play(F)						\
86*0Sstevel@tonic-gate 		audio__setpause((F), AUDIO__PLAY|AUDIO__RESUME)
87*0Sstevel@tonic-gate #define	audio_resume_record(F)						\
88*0Sstevel@tonic-gate 		audio__setpause((F), AUDIO__RECORD|AUDIO__RESUME)
89*0Sstevel@tonic-gate 
90*0Sstevel@tonic-gate 
91*0Sstevel@tonic-gate /*
92*0Sstevel@tonic-gate  * The following macros get individual state values.
93*0Sstevel@tonic-gate  * 'F' is an open audio file descriptor.
94*0Sstevel@tonic-gate  * 'V' is a pointer to an unsigned int.
95*0Sstevel@tonic-gate  * The value '*V' is updated after the device state has been read.
96*0Sstevel@tonic-gate  */
97*0Sstevel@tonic-gate #define	audio_get_play_port(F, V)					\
98*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__PORT)
99*0Sstevel@tonic-gate #define	audio_get_record_port(F, V)					\
100*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__RECORD|AUDIO__PORT)
101*0Sstevel@tonic-gate #define	audio_get_play_balance(F, V)					\
102*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__BALANCE)
103*0Sstevel@tonic-gate #define	audio_get_record_balance(F, V)					\
104*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__RECORD|AUDIO__BALANCE)
105*0Sstevel@tonic-gate #define	audio_get_play_samples(F, V)					\
106*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__SAMPLES)
107*0Sstevel@tonic-gate #define	audio_get_record_samples(F, V)					\
108*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__RECORD|AUDIO__SAMPLES)
109*0Sstevel@tonic-gate #define	audio_get_play_error(F, V)					\
110*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__ERROR)
111*0Sstevel@tonic-gate #define	audio_get_record_error(F, V)					\
112*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__RECORD|AUDIO__ERROR)
113*0Sstevel@tonic-gate #define	audio_get_play_eof(F, V)					\
114*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__EOF)
115*0Sstevel@tonic-gate 
116*0Sstevel@tonic-gate #define	audio_get_play_open(F, V)					\
117*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__OPEN)
118*0Sstevel@tonic-gate #define	audio_get_record_open(F, V)					\
119*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__RECORD|AUDIO__OPEN)
120*0Sstevel@tonic-gate #define	audio_get_play_active(F, V)					\
121*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__ACTIVE)
122*0Sstevel@tonic-gate #define	audio_get_record_active(F, V)					\
123*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__RECORD|AUDIO__ACTIVE)
124*0Sstevel@tonic-gate #define	audio_get_play_waiting(F, V)					\
125*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__PLAY|AUDIO__WAITING)
126*0Sstevel@tonic-gate #define	audio_get_record_waiting(F, V)					\
127*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__RECORD|AUDIO__WAITING)
128*0Sstevel@tonic-gate 
129*0Sstevel@tonic-gate /*
130*0Sstevel@tonic-gate  * The following macros set individual state values.
131*0Sstevel@tonic-gate  * 'F' is an open audio file descriptor.
132*0Sstevel@tonic-gate  * 'V' is a pointer to an unsigned int.
133*0Sstevel@tonic-gate  * The value '*V' is updated after the device state has been read.
134*0Sstevel@tonic-gate  */
135*0Sstevel@tonic-gate #define	audio_set_play_port(F, V)					\
136*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__PLAY|AUDIO__PORT)
137*0Sstevel@tonic-gate #define	audio_set_record_port(F, V)					\
138*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__RECORD|AUDIO__PORT)
139*0Sstevel@tonic-gate 
140*0Sstevel@tonic-gate /*
141*0Sstevel@tonic-gate  * The value returned for these is the value *before* the state was changed.
142*0Sstevel@tonic-gate  * This allows you to atomically read and reset their values.
143*0Sstevel@tonic-gate  */
144*0Sstevel@tonic-gate #define	audio_set_play_balance(F, V)					\
145*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__PLAY|AUDIO__BALANCE)
146*0Sstevel@tonic-gate #define	audio_set_record_balance(F, V)					\
147*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__RECORD|AUDIO__BALANCE)
148*0Sstevel@tonic-gate #define	audio_set_play_samples(F, V)					\
149*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__PLAY|AUDIO__SAMPLES)
150*0Sstevel@tonic-gate #define	audio_set_record_samples(F, V)					\
151*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__RECORD|AUDIO__SAMPLES)
152*0Sstevel@tonic-gate #define	audio_set_play_error(F, V)					\
153*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__PLAY|AUDIO__ERROR)
154*0Sstevel@tonic-gate #define	audio_set_record_error(F, V)					\
155*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__RECORD|AUDIO__ERROR)
156*0Sstevel@tonic-gate #define	audio_set_play_eof(F, V)					\
157*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__PLAY|AUDIO__EOF)
158*0Sstevel@tonic-gate 
159*0Sstevel@tonic-gate /* The value can only be set to one.  It is reset to zero on close(). */
160*0Sstevel@tonic-gate #define	audio_set_play_waiting(F, V)					\
161*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__PLAY|AUDIO__WAITING)
162*0Sstevel@tonic-gate #define	audio_set_record_waiting(F, V)					\
163*0Sstevel@tonic-gate 		audio__setval((F), (V), AUDIO__SET|AUDIO__RECORD|AUDIO__WAITING)
164*0Sstevel@tonic-gate 
165*0Sstevel@tonic-gate /*
166*0Sstevel@tonic-gate  * Gain routines take double values, mapping the valid range of gains
167*0Sstevel@tonic-gate  * to a floating-point value between zero and one, inclusive.
168*0Sstevel@tonic-gate  * The value returned will likely be slightly different than the value set.
169*0Sstevel@tonic-gate  * This is because the value is quantized by the device.
170*0Sstevel@tonic-gate  *
171*0Sstevel@tonic-gate  * Make sure that 'V' is a (double *)!
172*0Sstevel@tonic-gate  */
173*0Sstevel@tonic-gate #define	audio_get_play_gain(F, V)					\
174*0Sstevel@tonic-gate 		audio__setgain((F), (V), AUDIO__PLAY|AUDIO__GAIN)
175*0Sstevel@tonic-gate #define	audio_get_record_gain(F, V)					\
176*0Sstevel@tonic-gate 		audio__setgain((F), (V), AUDIO__RECORD|AUDIO__GAIN)
177*0Sstevel@tonic-gate #define	audio_get_monitor_gain(F, V)					\
178*0Sstevel@tonic-gate 		audio__setgain((F), (V), AUDIO__MONGAIN)
179*0Sstevel@tonic-gate 
180*0Sstevel@tonic-gate #define	audio_set_play_gain(F, V)					\
181*0Sstevel@tonic-gate 		audio__setgain((F), (V), AUDIO__SET|AUDIO__PLAY|AUDIO__GAIN)
182*0Sstevel@tonic-gate #define	audio_set_record_gain(F, V)					\
183*0Sstevel@tonic-gate 		audio__setgain((F), (V), AUDIO__SET|AUDIO__RECORD|AUDIO__GAIN)
184*0Sstevel@tonic-gate #define	audio_set_monitor_gain(F, V)					\
185*0Sstevel@tonic-gate 		audio__setgain((F), (V), AUDIO__SET|AUDIO__MONGAIN)
186*0Sstevel@tonic-gate 
187*0Sstevel@tonic-gate /*
188*0Sstevel@tonic-gate  * The following macros flush the audio play and/or record queues.
189*0Sstevel@tonic-gate  * Note that requests to flush a channel that is not open will have no effect.
190*0Sstevel@tonic-gate  */
191*0Sstevel@tonic-gate #define	audio_flush(F)							\
192*0Sstevel@tonic-gate 		audio__flush((F), AUDIO__PLAYREC)
193*0Sstevel@tonic-gate #define	audio_flush_play(F)						\
194*0Sstevel@tonic-gate 		audio__flush((F), AUDIO__PLAY)
195*0Sstevel@tonic-gate #define	audio_flush_record(F)						\
196*0Sstevel@tonic-gate 		audio__flush((F), AUDIO__RECORD)
197*0Sstevel@tonic-gate 
198*0Sstevel@tonic-gate 
199*0Sstevel@tonic-gate /* The following is used for 'which' arguments to get/set info routines */
200*0Sstevel@tonic-gate #define	AUDIO__PLAY		(0x10000)
201*0Sstevel@tonic-gate #define	AUDIO__RECORD		(0x20000)
202*0Sstevel@tonic-gate #define	AUDIO__PLAYREC		(AUDIO__PLAY | AUDIO__RECORD)
203*0Sstevel@tonic-gate 
204*0Sstevel@tonic-gate #define	AUDIO__PORT		(1)
205*0Sstevel@tonic-gate #define	AUDIO__SAMPLES		(2)
206*0Sstevel@tonic-gate #define	AUDIO__ERROR		(3)
207*0Sstevel@tonic-gate #define	AUDIO__EOF		(4)
208*0Sstevel@tonic-gate #define	AUDIO__OPEN		(5)
209*0Sstevel@tonic-gate #define	AUDIO__ACTIVE		(6)
210*0Sstevel@tonic-gate #define	AUDIO__WAITING		(7)
211*0Sstevel@tonic-gate #define	AUDIO__GAIN		(8)
212*0Sstevel@tonic-gate #define	AUDIO__MONGAIN		(9)
213*0Sstevel@tonic-gate #define	AUDIO__PAUSE		(10)
214*0Sstevel@tonic-gate #define	AUDIO__RESUME		(11)
215*0Sstevel@tonic-gate #define	AUDIO__BALANCE		(12)
216*0Sstevel@tonic-gate 
217*0Sstevel@tonic-gate #define	AUDIO__SET		(0x80000000)
218*0Sstevel@tonic-gate #define	AUDIO__SETVAL_MASK	(0xff)
219*0Sstevel@tonic-gate 
220*0Sstevel@tonic-gate #ifdef __cplusplus
221*0Sstevel@tonic-gate }
222*0Sstevel@tonic-gate #endif
223*0Sstevel@tonic-gate 
224*0Sstevel@tonic-gate #endif /* !_MULTIMEDIA_AUDIO_DEVICE_H */
225