4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
26 #ifndef _AUDIO_CLIENT_H
27 #define _AUDIO_CLIENT_H
30 * Structure implementation in audio_impl.h
32 #include <sys/audio/audio_common.h>
34 typedef struct audio_client_ops
{
35 const char *aco_minor_prefix
;
36 void *(*aco_dev_init
)(audio_dev_t
*);
37 void (*aco_dev_fini
)(void *);
38 int (*aco_open
)(audio_client_t
*, int);
39 void (*aco_close
)(audio_client_t
*);
40 int (*aco_read
)(audio_client_t
*, struct uio
*, cred_t
*);
41 int (*aco_write
)(audio_client_t
*, struct uio
*, cred_t
*);
42 int (*aco_ioctl
)(audio_client_t
*, int, intptr_t, int,
44 int (*aco_chpoll
)(audio_client_t
*, short, int, short *,
46 int (*aco_mmap
)(audio_client_t
*, ...);
47 void (*aco_input
)(audio_client_t
*);
48 void (*aco_output
)(audio_client_t
*);
49 void (*aco_drain
)(audio_client_t
*);
51 void (*aco_wput
)(audio_client_t
*, mblk_t
*);
52 void (*aco_wsrv
)(audio_client_t
*);
53 void (*aco_rsrv
)(audio_client_t
*);
56 void *auclnt_get_private(audio_client_t
*);
57 void auclnt_set_private(audio_client_t
*, void *);
59 int auclnt_drain(audio_client_t
*);
60 int auclnt_start_drain(audio_client_t
*);
62 int auclnt_set_rate(audio_stream_t
*, int);
63 int auclnt_get_rate(audio_stream_t
*);
65 int auclnt_set_format(audio_stream_t
*, int);
66 int auclnt_get_format(audio_stream_t
*);
68 int auclnt_set_channels(audio_stream_t
*, int);
69 int auclnt_get_channels(audio_stream_t
*);
71 void auclnt_set_gain(audio_stream_t
*, uint8_t);
72 uint8_t auclnt_get_gain(audio_stream_t
*);
74 void auclnt_set_muted(audio_stream_t
*, boolean_t
);
75 boolean_t
auclnt_get_muted(audio_stream_t
*);
77 uint64_t auclnt_get_samples(audio_stream_t
*);
78 void auclnt_set_samples(audio_stream_t
*, uint64_t);
80 uint64_t auclnt_get_errors(audio_stream_t
*);
81 void auclnt_set_errors(audio_stream_t
*, uint64_t);
83 uint64_t auclnt_get_eof(audio_stream_t
*);
84 void auclnt_set_eof(audio_stream_t
*, uint64_t);
86 boolean_t
auclnt_is_running(audio_stream_t
*);
87 void auclnt_start(audio_stream_t
*);
88 void auclnt_stop(audio_stream_t
*);
90 void auclnt_set_paused(audio_stream_t
*);
91 void auclnt_clear_paused(audio_stream_t
*);
92 boolean_t
auclnt_is_paused(audio_stream_t
*);
94 void auclnt_flush(audio_stream_t
*);
96 void auclnt_get_output_qlen(audio_client_t
*, uint_t
*, uint_t
*);
98 uint_t
auclnt_get_fragsz(audio_stream_t
*);
99 uint_t
auclnt_get_framesz(audio_stream_t
*);
100 uint_t
auclnt_get_nfrags(audio_stream_t
*);
101 uint_t
auclnt_get_nframes(audio_stream_t
*);
102 uint_t
auclnt_get_count(audio_stream_t
*);
103 uint64_t auclnt_get_head(audio_stream_t
*);
104 uint64_t auclnt_get_tail(audio_stream_t
*);
105 uint_t
auclnt_get_hidx(audio_stream_t
*);
106 uint_t
auclnt_get_tidx(audio_stream_t
*);
108 void auclnt_set_latency(audio_stream_t
*, uint_t
, uint_t
);
110 audio_stream_t
*auclnt_input_stream(audio_client_t
*);
111 audio_stream_t
*auclnt_output_stream(audio_client_t
*);
113 int auclnt_get_oflag(audio_client_t
*);
115 int auclnt_open(audio_client_t
*, int);
116 void auclnt_close(audio_client_t
*);
118 void auclnt_register_ops(minor_t
, audio_client_ops_t
*);
120 minor_t
auclnt_get_minor(audio_client_t
*);
121 minor_t
auclnt_get_original_minor(audio_client_t
*);
122 minor_t
auclnt_get_minor_type(audio_client_t
*);
123 queue_t
*auclnt_get_rq(audio_client_t
*);
124 queue_t
*auclnt_get_wq(audio_client_t
*);
126 uint_t
auclnt_produce(audio_stream_t
*, uint_t
);
127 uint_t
auclnt_produce_data(audio_stream_t
*, caddr_t
, uint_t
);
128 uint_t
auclnt_consume(audio_stream_t
*, uint_t
);
129 uint_t
auclnt_consume_data(audio_stream_t
*, caddr_t
, uint_t
);
130 int auclnt_read(audio_client_t
*, struct uio
*);
131 int auclnt_write(audio_client_t
*, struct uio
*);
132 int auclnt_chpoll(audio_client_t
*, short, int, short *, struct pollhead
**);
133 void auclnt_pollwakeup(audio_client_t
*, short);
136 * Return the process id that performed the original open() of the client.
138 pid_t
auclnt_get_pid(audio_client_t
*);
141 * Return the credentials of the process that opened the client.
143 cred_t
*auclnt_get_cred(audio_client_t
*);
146 * Get an opaque handle the underlying device for an audio client.
148 audio_dev_t
*auclnt_get_dev(audio_client_t
*);
149 audio_dev_t
*auclnt_hold_dev_by_index(int);
150 void auclnt_release_dev(audio_dev_t
*);
151 int auclnt_get_dev_index(audio_dev_t
*);
152 int auclnt_get_dev_number(audio_dev_t
*);
153 void auclnt_set_dev_number(audio_dev_t
*, int);
154 const char *auclnt_get_dev_name(audio_dev_t
*);
155 const char *auclnt_get_dev_driver(audio_dev_t
*);
156 dev_info_t
*auclnt_get_dev_devinfo(audio_dev_t
*);
157 int auclnt_get_dev_instance(audio_dev_t
*);
158 const char *auclnt_get_dev_description(audio_dev_t
*);
159 const char *auclnt_get_dev_version(audio_dev_t
*);
160 const char *auclnt_get_dev_hw_info(audio_dev_t
*, void **);
161 uint_t
auclnt_get_dev_capab(audio_dev_t
*);
162 #define AUDIO_CLIENT_CAP_PLAY (1U << 0)
163 #define AUDIO_CLIENT_CAP_RECORD (1U << 1)
164 #define AUDIO_CLIENT_CAP_DUPLEX (1U << 2)
165 #define AUDIO_CLIENT_CAP_SNDSTAT (1U << 3)
166 #define AUDIO_CLIENT_CAP_OPAQUE (1U << 4)
169 * Walk all the open client structures for a named audio device.
170 * Clients can use this to find "peer" clients accessing the same
171 * audio device. (This is useful for implementing special linkages,
172 * e.g. between /dev/audio and /dev/audioctl.)
174 void auclnt_dev_walk_clients(audio_dev_t
*,
175 int (*)(audio_client_t
*, void *), void *);
178 * This is used to check for updates to volume and control status.
179 * Its a polling-based interface because that's what our clients (OSS)
180 * need, and its far lighter weight than forcing an asynchronous
181 * callback on everything.
183 uint_t
auclnt_dev_get_serial(audio_dev_t
*);
186 * Audio control functions for use by clients.
190 * This will walk all controls registered to my device and callback
191 * to walker for each one with its audio_ctrl_desc_t..
193 * Note that walk_func may return values to continue (AUDIO_WALK_CONTINUE)
194 * or stop walk (AUDIO_WALK_STOP).
197 void auclnt_walk_controls(audio_dev_t
*,
198 int (*)(audio_ctrl_t
*, void *), void *);
201 * This will search all controls attached to a clients
202 * audio device for a control with the desired name.
204 * On successful return a ctrl handle will be returned. On
205 * failure NULL is returned.
207 audio_ctrl_t
*auclnt_find_control(audio_dev_t
*, const char *);
210 * Given a known control, get its attributes.
212 * The caller must supply a audio_ctrl_desc_t structure. Also the
213 * values in the structure are ignored when making the call and filled
214 * in by this function.
216 * If an error occurs then a non-zero is returned.
218 int auclnt_control_describe(audio_ctrl_t
*, audio_ctrl_desc_t
*);
222 * This is used to read the current value of a control.
223 * Note, this will cause a callback into the driver to get the value.
225 * On return zero is returned on success else errno is returned.
227 int auclnt_control_read(audio_ctrl_t
*, uint64_t *);
230 * This is used to write a value to a control.
231 * Note, this will cause a callback into the driver to write the value.
233 * On return zero is returned on success else errno is returned.
236 int auclnt_control_write(audio_ctrl_t
*, uint64_t);
239 * Walk all the audio devices on the system. Useful for clients
240 * like sndstat, which may need to inquire about every audio device
243 void auclnt_walk_devs(int (*walker
)(audio_dev_t
*, void *), void *);
244 void auclnt_walk_devs_by_number(int (*walker
)(audio_dev_t
*, void *), void *);
246 audio_client_t
*auclnt_hold_by_devt(dev_t
);
247 void auclnt_release(audio_client_t
*);
248 void auclnt_hold(audio_client_t
*);
249 int auclnt_serialize(audio_client_t
*);
250 void auclnt_unserialize(audio_client_t
*);
253 * Engine rlated accesses. Note that normally clients don't need this level
256 void auclnt_dev_walk_engines(audio_dev_t
*,
257 int (*)(audio_engine_t
*, void *), void *);
258 int auclnt_engine_get_format(audio_engine_t
*);
259 int auclnt_engine_get_rate(audio_engine_t
*);
260 int auclnt_engine_get_channels(audio_engine_t
*);
261 uint_t
auclnt_engine_get_capab(audio_engine_t
*);
264 * Retrieve minor-specific data for the instance. This allows for
265 * personality modules to store persistent state data on a physical
266 * device (e.g. to store persistent settings.) Synchronization of
267 * stored settings between personality modules is up to the
268 * personality modules themselves.
270 void *auclnt_get_minor_data(audio_client_t
*, minor_t
);
271 void *auclnt_get_dev_minor_data(audio_dev_t
*, minor_t
);
274 * Simpler warning message, alternative to cmn_err.
276 void auclnt_warn(audio_client_t
*, const char *fmt
, ...);
278 #endif /* _AUDIO_CLIENT_H */