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