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