xref: /onnv-gate/usr/src/uts/common/io/audio/impl/audio_client.h (revision 12165:e481916a5729)
19484Sgarrett.damore@Sun.COM /*
29484Sgarrett.damore@Sun.COM  * CDDL HEADER START
39484Sgarrett.damore@Sun.COM  *
49484Sgarrett.damore@Sun.COM  * The contents of this file are subject to the terms of the
59484Sgarrett.damore@Sun.COM  * Common Development and Distribution License (the "License").
69484Sgarrett.damore@Sun.COM  * You may not use this file except in compliance with the License.
79484Sgarrett.damore@Sun.COM  *
89484Sgarrett.damore@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99484Sgarrett.damore@Sun.COM  * or http://www.opensolaris.org/os/licensing.
109484Sgarrett.damore@Sun.COM  * See the License for the specific language governing permissions
119484Sgarrett.damore@Sun.COM  * and limitations under the License.
129484Sgarrett.damore@Sun.COM  *
139484Sgarrett.damore@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
149484Sgarrett.damore@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159484Sgarrett.damore@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
169484Sgarrett.damore@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
179484Sgarrett.damore@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
189484Sgarrett.damore@Sun.COM  *
199484Sgarrett.damore@Sun.COM  * CDDL HEADER END
209484Sgarrett.damore@Sun.COM  */
219484Sgarrett.damore@Sun.COM 
229484Sgarrett.damore@Sun.COM /*
23*12165Sgdamore@opensolaris.org  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
249484Sgarrett.damore@Sun.COM  */
259484Sgarrett.damore@Sun.COM 
269484Sgarrett.damore@Sun.COM #ifndef	_AUDIO_CLIENT_H
279484Sgarrett.damore@Sun.COM #define	_AUDIO_CLIENT_H
289484Sgarrett.damore@Sun.COM 
299484Sgarrett.damore@Sun.COM /*
309484Sgarrett.damore@Sun.COM  * Structure implementation in audio_impl.h
319484Sgarrett.damore@Sun.COM  */
329484Sgarrett.damore@Sun.COM #include <sys/audio/audio_common.h>
339484Sgarrett.damore@Sun.COM 
349484Sgarrett.damore@Sun.COM typedef struct audio_client_ops {
359484Sgarrett.damore@Sun.COM 	const char	*aco_minor_prefix;
369484Sgarrett.damore@Sun.COM 	void		*(*aco_dev_init)(audio_dev_t *);
379484Sgarrett.damore@Sun.COM 	void		(*aco_dev_fini)(void *);
389484Sgarrett.damore@Sun.COM 	int		(*aco_open)(audio_client_t *, int);
399484Sgarrett.damore@Sun.COM 	void		(*aco_close)(audio_client_t *);
409484Sgarrett.damore@Sun.COM 	int		(*aco_read)(audio_client_t *, struct uio *, cred_t *);
419484Sgarrett.damore@Sun.COM 	int		(*aco_write)(audio_client_t *, struct uio *, cred_t *);
429484Sgarrett.damore@Sun.COM 	int		(*aco_ioctl)(audio_client_t *, int, intptr_t, int,
439484Sgarrett.damore@Sun.COM 			    cred_t *, int *);
449484Sgarrett.damore@Sun.COM 	int		(*aco_chpoll)(audio_client_t *, short, int, short *,
459484Sgarrett.damore@Sun.COM 			    struct pollhead **);
469484Sgarrett.damore@Sun.COM 	int		(*aco_mmap)(audio_client_t *, ...);
479484Sgarrett.damore@Sun.COM 	void		(*aco_input)(audio_client_t *);
489484Sgarrett.damore@Sun.COM 	void		(*aco_output)(audio_client_t *);
499484Sgarrett.damore@Sun.COM 	void		(*aco_drain)(audio_client_t *);
5010157Sgdamore@opensolaris.org 
5110157Sgdamore@opensolaris.org 	void		(*aco_wput)(audio_client_t *, mblk_t *);
5210157Sgdamore@opensolaris.org 	void		(*aco_wsrv)(audio_client_t *);
5310632Sgdamore@opensolaris.org 	void		(*aco_rsrv)(audio_client_t *);
549484Sgarrett.damore@Sun.COM } audio_client_ops_t;
559484Sgarrett.damore@Sun.COM 
569484Sgarrett.damore@Sun.COM void *auclnt_get_private(audio_client_t *);
579484Sgarrett.damore@Sun.COM void auclnt_set_private(audio_client_t *, void *);
589484Sgarrett.damore@Sun.COM 
599484Sgarrett.damore@Sun.COM int auclnt_drain(audio_client_t *);
609484Sgarrett.damore@Sun.COM int auclnt_start_drain(audio_client_t *);
619484Sgarrett.damore@Sun.COM 
629484Sgarrett.damore@Sun.COM int auclnt_set_rate(audio_stream_t *, int);
639484Sgarrett.damore@Sun.COM int auclnt_get_rate(audio_stream_t *);
649484Sgarrett.damore@Sun.COM 
659484Sgarrett.damore@Sun.COM int auclnt_set_format(audio_stream_t *, int);
669484Sgarrett.damore@Sun.COM int auclnt_get_format(audio_stream_t *);
679484Sgarrett.damore@Sun.COM 
689484Sgarrett.damore@Sun.COM int auclnt_set_channels(audio_stream_t *, int);
699484Sgarrett.damore@Sun.COM int auclnt_get_channels(audio_stream_t *);
709484Sgarrett.damore@Sun.COM 
719484Sgarrett.damore@Sun.COM void auclnt_set_gain(audio_stream_t *, uint8_t);
729484Sgarrett.damore@Sun.COM uint8_t auclnt_get_gain(audio_stream_t *);
739484Sgarrett.damore@Sun.COM 
749484Sgarrett.damore@Sun.COM void auclnt_set_muted(audio_stream_t *, boolean_t);
759484Sgarrett.damore@Sun.COM boolean_t auclnt_get_muted(audio_stream_t *);
769484Sgarrett.damore@Sun.COM 
779484Sgarrett.damore@Sun.COM uint64_t auclnt_get_samples(audio_stream_t *);
789484Sgarrett.damore@Sun.COM void auclnt_set_samples(audio_stream_t *, uint64_t);
799484Sgarrett.damore@Sun.COM 
809484Sgarrett.damore@Sun.COM uint64_t auclnt_get_errors(audio_stream_t *);
819484Sgarrett.damore@Sun.COM void auclnt_set_errors(audio_stream_t *, uint64_t);
829484Sgarrett.damore@Sun.COM 
839484Sgarrett.damore@Sun.COM uint64_t auclnt_get_eof(audio_stream_t *);
849484Sgarrett.damore@Sun.COM void auclnt_set_eof(audio_stream_t *, uint64_t);
859484Sgarrett.damore@Sun.COM 
8610172Sgdamore@opensolaris.org boolean_t auclnt_is_running(audio_stream_t *);
879484Sgarrett.damore@Sun.COM void auclnt_start(audio_stream_t *);
889484Sgarrett.damore@Sun.COM void auclnt_stop(audio_stream_t *);
899484Sgarrett.damore@Sun.COM 
909484Sgarrett.damore@Sun.COM void auclnt_set_paused(audio_stream_t *);
919484Sgarrett.damore@Sun.COM void auclnt_clear_paused(audio_stream_t *);
929484Sgarrett.damore@Sun.COM boolean_t auclnt_is_paused(audio_stream_t *);
939484Sgarrett.damore@Sun.COM 
949484Sgarrett.damore@Sun.COM void auclnt_flush(audio_stream_t *);
959484Sgarrett.damore@Sun.COM 
9611936Sgdamore@opensolaris.org void auclnt_get_output_qlen(audio_client_t *, uint_t *, uint_t *);
979484Sgarrett.damore@Sun.COM 
9811936Sgdamore@opensolaris.org uint_t auclnt_get_fragsz(audio_stream_t *);
9911936Sgdamore@opensolaris.org uint_t auclnt_get_framesz(audio_stream_t *);
10011936Sgdamore@opensolaris.org uint_t auclnt_get_nfrags(audio_stream_t *);
10111936Sgdamore@opensolaris.org uint_t auclnt_get_nframes(audio_stream_t *);
10211936Sgdamore@opensolaris.org uint_t auclnt_get_count(audio_stream_t *);
1039484Sgarrett.damore@Sun.COM uint64_t auclnt_get_head(audio_stream_t *);
1049484Sgarrett.damore@Sun.COM uint64_t auclnt_get_tail(audio_stream_t *);
10511936Sgdamore@opensolaris.org uint_t auclnt_get_hidx(audio_stream_t *);
10611936Sgdamore@opensolaris.org uint_t auclnt_get_tidx(audio_stream_t *);
1079484Sgarrett.damore@Sun.COM 
10811936Sgdamore@opensolaris.org void auclnt_set_latency(audio_stream_t *, uint_t, uint_t);
1099558Sgdamore@opensolaris.org 
1109484Sgarrett.damore@Sun.COM audio_stream_t *auclnt_input_stream(audio_client_t *);
1119484Sgarrett.damore@Sun.COM audio_stream_t *auclnt_output_stream(audio_client_t *);
1129484Sgarrett.damore@Sun.COM 
1139484Sgarrett.damore@Sun.COM int auclnt_get_oflag(audio_client_t *);
1149484Sgarrett.damore@Sun.COM 
115*12165Sgdamore@opensolaris.org int auclnt_open(audio_client_t *, int);
1169484Sgarrett.damore@Sun.COM void auclnt_close(audio_client_t *);
1179484Sgarrett.damore@Sun.COM 
1189484Sgarrett.damore@Sun.COM void auclnt_register_ops(minor_t, audio_client_ops_t *);
1199484Sgarrett.damore@Sun.COM 
1209484Sgarrett.damore@Sun.COM minor_t	auclnt_get_minor(audio_client_t *);
1219484Sgarrett.damore@Sun.COM minor_t auclnt_get_original_minor(audio_client_t *);
1229484Sgarrett.damore@Sun.COM minor_t auclnt_get_minor_type(audio_client_t *);
12310157Sgdamore@opensolaris.org queue_t *auclnt_get_rq(audio_client_t *);
12410157Sgdamore@opensolaris.org queue_t *auclnt_get_wq(audio_client_t *);
1259484Sgarrett.damore@Sun.COM 
12611936Sgdamore@opensolaris.org uint_t auclnt_produce(audio_stream_t *, uint_t);
12711936Sgdamore@opensolaris.org uint_t auclnt_produce_data(audio_stream_t *, caddr_t, uint_t);
12811936Sgdamore@opensolaris.org uint_t auclnt_consume(audio_stream_t *, uint_t);
12911936Sgdamore@opensolaris.org uint_t auclnt_consume_data(audio_stream_t *, caddr_t, uint_t);
1309484Sgarrett.damore@Sun.COM int auclnt_read(audio_client_t *, struct uio *);
1319484Sgarrett.damore@Sun.COM int auclnt_write(audio_client_t *, struct uio *);
1329484Sgarrett.damore@Sun.COM int auclnt_chpoll(audio_client_t *, short, int, short *, struct pollhead **);
1339484Sgarrett.damore@Sun.COM void auclnt_pollwakeup(audio_client_t *, short);
1349484Sgarrett.damore@Sun.COM 
1359484Sgarrett.damore@Sun.COM /*
1369484Sgarrett.damore@Sun.COM  * Return the process id that performed the original open() of the client.
1379484Sgarrett.damore@Sun.COM  */
1389484Sgarrett.damore@Sun.COM pid_t auclnt_get_pid(audio_client_t *);
1399484Sgarrett.damore@Sun.COM 
1409484Sgarrett.damore@Sun.COM /*
1419484Sgarrett.damore@Sun.COM  * Return the credentials of the process that opened the client.
1429484Sgarrett.damore@Sun.COM  */
1439484Sgarrett.damore@Sun.COM cred_t *auclnt_get_cred(audio_client_t *);
1449484Sgarrett.damore@Sun.COM 
1459484Sgarrett.damore@Sun.COM /*
1469484Sgarrett.damore@Sun.COM  * Get an opaque handle the underlying device for an audio client.
1479484Sgarrett.damore@Sun.COM  */
1489484Sgarrett.damore@Sun.COM audio_dev_t *auclnt_get_dev(audio_client_t *);
1499484Sgarrett.damore@Sun.COM audio_dev_t *auclnt_hold_dev_by_index(int);
1509484Sgarrett.damore@Sun.COM void auclnt_release_dev(audio_dev_t *);
1519484Sgarrett.damore@Sun.COM int auclnt_get_dev_index(audio_dev_t *);
1529484Sgarrett.damore@Sun.COM int auclnt_get_dev_number(audio_dev_t *);
1539484Sgarrett.damore@Sun.COM void auclnt_set_dev_number(audio_dev_t *, int);
1549484Sgarrett.damore@Sun.COM const char *auclnt_get_dev_name(audio_dev_t *);
1559484Sgarrett.damore@Sun.COM const char *auclnt_get_dev_driver(audio_dev_t *);
1569484Sgarrett.damore@Sun.COM dev_info_t *auclnt_get_dev_devinfo(audio_dev_t *);
1579484Sgarrett.damore@Sun.COM int auclnt_get_dev_instance(audio_dev_t *);
1589484Sgarrett.damore@Sun.COM const char *auclnt_get_dev_description(audio_dev_t *);
1599484Sgarrett.damore@Sun.COM const char *auclnt_get_dev_version(audio_dev_t *);
1609484Sgarrett.damore@Sun.COM const char *auclnt_get_dev_hw_info(audio_dev_t *, void **);
16111936Sgdamore@opensolaris.org uint_t auclnt_get_dev_capab(audio_dev_t *);
1629484Sgarrett.damore@Sun.COM #define	AUDIO_CLIENT_CAP_PLAY		(1U << 0)
1639484Sgarrett.damore@Sun.COM #define	AUDIO_CLIENT_CAP_RECORD		(1U << 1)
1649484Sgarrett.damore@Sun.COM #define	AUDIO_CLIENT_CAP_DUPLEX		(1U << 2)
1659484Sgarrett.damore@Sun.COM #define	AUDIO_CLIENT_CAP_SNDSTAT	(1U << 3)
16610477SGarrett.Damore@Sun.COM #define	AUDIO_CLIENT_CAP_OPAQUE		(1U << 4)
1679484Sgarrett.damore@Sun.COM 
1689484Sgarrett.damore@Sun.COM /*
1699484Sgarrett.damore@Sun.COM  * Walk all the open client structures for a named audio device.
1709484Sgarrett.damore@Sun.COM  * Clients can use this to find "peer" clients accessing the same
1719484Sgarrett.damore@Sun.COM  * audio device.  (This is useful for implementing special linkages,
1729484Sgarrett.damore@Sun.COM  * e.g. between /dev/audio and /dev/audioctl.)
1739484Sgarrett.damore@Sun.COM  */
1749484Sgarrett.damore@Sun.COM void auclnt_dev_walk_clients(audio_dev_t *,
1759484Sgarrett.damore@Sun.COM     int (*)(audio_client_t *, void *), void *);
1769484Sgarrett.damore@Sun.COM 
1779484Sgarrett.damore@Sun.COM /*
17810632Sgdamore@opensolaris.org  * This is used to check for updates to volume and control status.
17910632Sgdamore@opensolaris.org  * Its a polling-based interface because that's what our clients (OSS)
18010632Sgdamore@opensolaris.org  * need, and its far lighter weight than forcing an asynchronous
18110632Sgdamore@opensolaris.org  * callback on everything.
18210632Sgdamore@opensolaris.org  */
18311936Sgdamore@opensolaris.org uint_t auclnt_dev_get_serial(audio_dev_t *);
18410632Sgdamore@opensolaris.org 
18510632Sgdamore@opensolaris.org /*
1869484Sgarrett.damore@Sun.COM  * Audio control functions for use by clients.
1879484Sgarrett.damore@Sun.COM  */
1889484Sgarrett.damore@Sun.COM 
1899484Sgarrett.damore@Sun.COM /*
1909484Sgarrett.damore@Sun.COM  * This will walk all controls registered to my device and callback
1919484Sgarrett.damore@Sun.COM  * to walker for each one with its audio_ctrl_desc_t..
1929484Sgarrett.damore@Sun.COM  *
1939484Sgarrett.damore@Sun.COM  * Note that walk_func may return values to continue (AUDIO_WALK_CONTINUE)
1949484Sgarrett.damore@Sun.COM  * or stop walk (AUDIO_WALK_STOP).
1959484Sgarrett.damore@Sun.COM  *
1969484Sgarrett.damore@Sun.COM  */
1979484Sgarrett.damore@Sun.COM void auclnt_walk_controls(audio_dev_t *,
1989484Sgarrett.damore@Sun.COM     int (*)(audio_ctrl_t *, void *), void *);
1999484Sgarrett.damore@Sun.COM 
2009484Sgarrett.damore@Sun.COM /*
2019484Sgarrett.damore@Sun.COM  * This will search all controls attached to a clients
2029484Sgarrett.damore@Sun.COM  * audio device for a control with the desired name.
2039484Sgarrett.damore@Sun.COM  *
2049484Sgarrett.damore@Sun.COM  * On successful return a ctrl handle will be returned. On
2059484Sgarrett.damore@Sun.COM  * failure NULL is returned.
2069484Sgarrett.damore@Sun.COM  */
2079484Sgarrett.damore@Sun.COM audio_ctrl_t *auclnt_find_control(audio_dev_t *, const char *);
2089484Sgarrett.damore@Sun.COM 
2099484Sgarrett.damore@Sun.COM /*
2109484Sgarrett.damore@Sun.COM  * Given a known control, get its attributes.
2119484Sgarrett.damore@Sun.COM  *
2129484Sgarrett.damore@Sun.COM  * The caller must supply a audio_ctrl_desc_t structure.  Also the
2139484Sgarrett.damore@Sun.COM  * values in the structure are ignored when making the call and filled
2149484Sgarrett.damore@Sun.COM  * in by this function.
2159484Sgarrett.damore@Sun.COM  *
2169484Sgarrett.damore@Sun.COM  * If an error occurs then a non-zero is returned.
2179484Sgarrett.damore@Sun.COM  */
2189484Sgarrett.damore@Sun.COM int auclnt_control_describe(audio_ctrl_t *, audio_ctrl_desc_t *);
2199484Sgarrett.damore@Sun.COM 
2209484Sgarrett.damore@Sun.COM 
2219484Sgarrett.damore@Sun.COM /*
2229484Sgarrett.damore@Sun.COM  * This is used to read the current value of a control.
2239484Sgarrett.damore@Sun.COM  * Note, this will cause a callback into the driver to get the value.
2249484Sgarrett.damore@Sun.COM  *
2259484Sgarrett.damore@Sun.COM  * On return zero is returned on success else errno is returned.
2269484Sgarrett.damore@Sun.COM  */
2279484Sgarrett.damore@Sun.COM int auclnt_control_read(audio_ctrl_t *, uint64_t *);
2289484Sgarrett.damore@Sun.COM 
2299484Sgarrett.damore@Sun.COM /*
2309484Sgarrett.damore@Sun.COM  * This is used to write a value to a control.
2319484Sgarrett.damore@Sun.COM  * Note, this will cause a callback into the driver to write the value.
2329484Sgarrett.damore@Sun.COM  *
2339484Sgarrett.damore@Sun.COM  * On return zero is returned on success else errno is returned.
2349484Sgarrett.damore@Sun.COM  *
2359484Sgarrett.damore@Sun.COM  */
2369484Sgarrett.damore@Sun.COM int auclnt_control_write(audio_ctrl_t *, uint64_t);
2379484Sgarrett.damore@Sun.COM 
2389484Sgarrett.damore@Sun.COM /*
2399484Sgarrett.damore@Sun.COM  * Walk all the audio devices on the system.  Useful for clients
2409484Sgarrett.damore@Sun.COM  * like sndstat, which may need to inquire about every audio device
2419484Sgarrett.damore@Sun.COM  * on the system.
2429484Sgarrett.damore@Sun.COM  */
2439484Sgarrett.damore@Sun.COM void auclnt_walk_devs(int (*walker)(audio_dev_t *, void *), void *);
2449484Sgarrett.damore@Sun.COM void auclnt_walk_devs_by_number(int (*walker)(audio_dev_t *, void *), void *);
2459484Sgarrett.damore@Sun.COM 
2469484Sgarrett.damore@Sun.COM audio_client_t *auclnt_hold_by_devt(dev_t);
2479484Sgarrett.damore@Sun.COM void auclnt_release(audio_client_t *);
24811936Sgdamore@opensolaris.org void auclnt_hold(audio_client_t *);
24911936Sgdamore@opensolaris.org int auclnt_serialize(audio_client_t *);
25011936Sgdamore@opensolaris.org void auclnt_unserialize(audio_client_t *);
2519484Sgarrett.damore@Sun.COM 
2529484Sgarrett.damore@Sun.COM /*
2539484Sgarrett.damore@Sun.COM  * Engine rlated accesses.  Note that normally clients don't need this level
2549484Sgarrett.damore@Sun.COM  * of information.
2559484Sgarrett.damore@Sun.COM  */
2569484Sgarrett.damore@Sun.COM void auclnt_dev_walk_engines(audio_dev_t *,
2579484Sgarrett.damore@Sun.COM     int (*)(audio_engine_t *, void *), void *);
2589484Sgarrett.damore@Sun.COM int auclnt_engine_get_format(audio_engine_t *);
2599484Sgarrett.damore@Sun.COM int auclnt_engine_get_rate(audio_engine_t *);
2609484Sgarrett.damore@Sun.COM int auclnt_engine_get_channels(audio_engine_t *);
26111936Sgdamore@opensolaris.org uint_t auclnt_engine_get_capab(audio_engine_t *);
2629484Sgarrett.damore@Sun.COM 
2639484Sgarrett.damore@Sun.COM /*
2649484Sgarrett.damore@Sun.COM  * Retrieve minor-specific data for the instance.  This allows for
2659484Sgarrett.damore@Sun.COM  * personality modules to store persistent state data on a physical
2669484Sgarrett.damore@Sun.COM  * device (e.g. to store persistent settings.)  Synchronization of
2679484Sgarrett.damore@Sun.COM  * stored settings between personality modules is up to the
2689484Sgarrett.damore@Sun.COM  * personality modules themselves.
2699484Sgarrett.damore@Sun.COM  */
2709484Sgarrett.damore@Sun.COM void *auclnt_get_minor_data(audio_client_t *, minor_t);
2719484Sgarrett.damore@Sun.COM void *auclnt_get_dev_minor_data(audio_dev_t *, minor_t);
2729484Sgarrett.damore@Sun.COM 
2739484Sgarrett.damore@Sun.COM /*
2749484Sgarrett.damore@Sun.COM  * Simpler warning message, alternative to cmn_err.
2759484Sgarrett.damore@Sun.COM  */
2769484Sgarrett.damore@Sun.COM void auclnt_warn(audio_client_t *, const char *fmt, ...);
2779484Sgarrett.damore@Sun.COM 
2789484Sgarrett.damore@Sun.COM #endif	/* _AUDIO_CLIENT_H */
279