88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * CDDL HEADER START
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * The contents of this file are subject to the terms of the
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Common Development and Distribution License (the "License").
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * You may not use this file except in compliance with the License.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * or http://www.opensolaris.org/os/licensing.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * See the License for the specific language governing permissions
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * and limitations under the License.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * When distributing Covered Code, include this CDDL HEADER in each
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * If applicable, add the following below this CDDL HEADER, with the
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * fields enclosed by brackets "[]" replaced with your own identifying
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * information: Portions Copyright [yyyy] [name of copyright owner]
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * CDDL HEADER END
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#ifndef _AUDIO_CLIENT_H
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define _AUDIO_CLIENT_H
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Structure implementation in audio_impl.h
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#include <sys/audio/audio_common.h>
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoretypedef struct audio_client_ops {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore const char *aco_minor_prefix;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *(*aco_dev_init)(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void (*aco_dev_fini)(void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*aco_open)(audio_client_t *, int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void (*aco_close)(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*aco_read)(audio_client_t *, struct uio *, cred_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*aco_write)(audio_client_t *, struct uio *, cred_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*aco_ioctl)(audio_client_t *, int, intptr_t, int,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore cred_t *, int *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*aco_chpoll)(audio_client_t *, short, int, short *,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore struct pollhead **);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*aco_mmap)(audio_client_t *, ...);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void (*aco_input)(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void (*aco_output)(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void (*aco_drain)(audio_client_t *);
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore void (*aco_wput)(audio_client_t *, mblk_t *);
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore void (*aco_wsrv)(audio_client_t *);
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore void (*aco_rsrv)(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore} audio_client_ops_t;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid *auclnt_get_private(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_private(audio_client_t *, void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_drain(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_start_drain(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_set_rate(audio_stream_t *, int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_get_rate(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_set_format(audio_stream_t *, int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_get_format(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_set_channels(audio_stream_t *, int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_get_channels(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_gain(audio_stream_t *, uint8_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreuint8_t auclnt_get_gain(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_muted(audio_stream_t *, boolean_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreboolean_t auclnt_get_muted(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreuint64_t auclnt_get_samples(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_samples(audio_stream_t *, uint64_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreuint64_t auclnt_get_errors(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_errors(audio_stream_t *, uint64_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreuint64_t auclnt_get_eof(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_eof(audio_stream_t *, uint64_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
622a30bf9ccf91e4468f9c8a7f5e60d628fee4b2Garrett D'Amoreboolean_t auclnt_is_running(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_start(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_stop(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_paused(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_clear_paused(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreboolean_t auclnt_is_paused(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_flush(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auclnt_get_output_qlen(audio_client_t *, uint_t *, uint_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_fragsz(audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_framesz(audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_nfrags(audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_nframes(audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_count(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreuint64_t auclnt_get_head(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreuint64_t auclnt_get_tail(audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_hidx(audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_tidx(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auclnt_set_latency(audio_stream_t *, uint_t, uint_t);
a702341c8e6cc834a456108a8bf5d22f031da3beGarrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_stream_t *auclnt_input_stream(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_stream_t *auclnt_output_stream(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_get_oflag(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amoreint auclnt_open(audio_client_t *, int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_close(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_register_ops(minor_t, audio_client_ops_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreminor_t auclnt_get_minor(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreminor_t auclnt_get_original_minor(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreminor_t auclnt_get_minor_type(audio_client_t *);
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amorequeue_t *auclnt_get_rq(audio_client_t *);
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amorequeue_t *auclnt_get_wq(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_produce(audio_stream_t *, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_produce_data(audio_stream_t *, caddr_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_consume(audio_stream_t *, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_consume_data(audio_stream_t *, caddr_t, uint_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_read(audio_client_t *, struct uio *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_write(audio_client_t *, struct uio *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_chpoll(audio_client_t *, short, int, short *, struct pollhead **);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_pollwakeup(audio_client_t *, short);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Return the process id that performed the original open() of the client.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorepid_t auclnt_get_pid(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Return the credentials of the process that opened the client.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorecred_t *auclnt_get_cred(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Get an opaque handle the underlying device for an audio client.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_dev_t *auclnt_get_dev(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_dev_t *auclnt_hold_dev_by_index(int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_release_dev(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_get_dev_index(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_get_dev_number(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_set_dev_number(audio_dev_t *, int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreconst char *auclnt_get_dev_name(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreconst char *auclnt_get_dev_driver(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoredev_info_t *auclnt_get_dev_devinfo(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_get_dev_instance(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreconst char *auclnt_get_dev_description(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreconst char *auclnt_get_dev_version(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreconst char *auclnt_get_dev_hw_info(audio_dev_t *, void **);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_get_dev_capab(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_CLIENT_CAP_PLAY (1U << 0)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_CLIENT_CAP_RECORD (1U << 1)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_CLIENT_CAP_DUPLEX (1U << 2)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_CLIENT_CAP_SNDSTAT (1U << 3)
260256302ac564fcfed9ebfa5a6c98a2e6ef3808Garrett D'Amore#define AUDIO_CLIENT_CAP_OPAQUE (1U << 4)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Walk all the open client structures for a named audio device.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Clients can use this to find "peer" clients accessing the same
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * audio device. (This is useful for implementing special linkages,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * e.g. between /dev/audio and /dev/audioctl.)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_dev_walk_clients(audio_dev_t *,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*)(audio_client_t *, void *), void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore/*
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore * This is used to check for updates to volume and control status.
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore * Its a polling-based interface because that's what our clients (OSS)
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore * need, and its far lighter weight than forcing an asynchronous
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore * callback on everything.
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_dev_get_serial(audio_dev_t *);
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Audio control functions for use by clients.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * This will walk all controls registered to my device and callback
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * to walker for each one with its audio_ctrl_desc_t..
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Note that walk_func may return values to continue (AUDIO_WALK_CONTINUE)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * or stop walk (AUDIO_WALK_STOP).
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_walk_controls(audio_dev_t *,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*)(audio_ctrl_t *, void *), void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * This will search all controls attached to a clients
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * audio device for a control with the desired name.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * On successful return a ctrl handle will be returned. On
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * failure NULL is returned.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_ctrl_t *auclnt_find_control(audio_dev_t *, const char *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Given a known control, get its attributes.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * The caller must supply a audio_ctrl_desc_t structure. Also the
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * values in the structure are ignored when making the call and filled
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * in by this function.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * If an error occurs then a non-zero is returned.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_control_describe(audio_ctrl_t *, audio_ctrl_desc_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * This is used to read the current value of a control.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Note, this will cause a callback into the driver to get the value.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * On return zero is returned on success else errno is returned.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_control_read(audio_ctrl_t *, uint64_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * This is used to write a value to a control.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Note, this will cause a callback into the driver to write the value.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * On return zero is returned on success else errno is returned.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_control_write(audio_ctrl_t *, uint64_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Walk all the audio devices on the system. Useful for clients
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * like sndstat, which may need to inquire about every audio device
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * on the system.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_walk_devs(int (*walker)(audio_dev_t *, void *), void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_walk_devs_by_number(int (*walker)(audio_dev_t *, void *), void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_client_t *auclnt_hold_by_devt(dev_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_release(audio_client_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auclnt_hold(audio_client_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreint auclnt_serialize(audio_client_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auclnt_unserialize(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Engine rlated accesses. Note that normally clients don't need this level
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * of information.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_dev_walk_engines(audio_dev_t *,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*)(audio_engine_t *, void *), void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_engine_get_format(audio_engine_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_engine_get_rate(audio_engine_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auclnt_engine_get_channels(audio_engine_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreuint_t auclnt_engine_get_capab(audio_engine_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Retrieve minor-specific data for the instance. This allows for
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * personality modules to store persistent state data on a physical
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * device (e.g. to store persistent settings.) Synchronization of
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * stored settings between personality modules is up to the
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * personality modules themselves.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid *auclnt_get_minor_data(audio_client_t *, minor_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid *auclnt_get_dev_minor_data(audio_dev_t *, minor_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Simpler warning message, alternative to cmn_err.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auclnt_warn(audio_client_t *, const char *fmt, ...);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#endif /* _AUDIO_CLIENT_H */