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
33extern "C" {
34#endif
35
36#include <sys/types.h>
37#include <sys/ioccom.h>
38#include <sys/audioio.h>
39
40typedef 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