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 * Copyright (C) 4Front Technologies 1996-2008.
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_IMPL_H
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define _AUDIO_IMPL_H
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#include <sys/types.h>
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#include <sys/list.h>
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#include <sys/poll.h>
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#include <sys/audio/audio_driver.h>
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#include "audio_client.h"
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_MAX_OPENS 256
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_MAX_CHANNELS 16
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_UNIT_EXPAND 1024
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_CHBUFS 2048 /* samples for mixing */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_VOL_SCALE 256
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_DB_SIZE 50
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore#define AUDIO_INTRHZ 100
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore#define AUDIO_INTRHZ_MIN 50 /* 20 msec max */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore#define AUDIO_INTRHZ_MAX 500
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_parms {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int p_format;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int p_rate;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int p_nchan;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoretypedef int (*audio_cnv_func_t)(audio_stream_t *, int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_buffer {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore caddr_t b_data;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint64_t b_head;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint64_t b_tail;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t b_hidx; /* head % nframes */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t b_tidx; /* tail % nframes */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t b_nframes; /* total frames */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t b_framesz; /* bytes per frame */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * struct audio_stream: This structure represents a virtual stream exposed
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * to a single client. Each client will have at most two of these (one for
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * record, one for playback.)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_stream {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_buffer_t s_buf;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_data s_buf.b_data
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_bufsz s_buf.b_size
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_head s_buf.b_head
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_tail s_buf.b_tail
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_framesz s_buf.b_framesz
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_nframes s_buf.b_nframes
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_tidx s_buf.b_tidx
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_hidx s_buf.b_hidx
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t s_nfrags;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t s_fragfr;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t s_nbytes;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t s_fragbytes;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ddi_umem_cookie_t s_cookie;
a702341c8e6cc834a456108a8bf5d22f031da3beGarrett D'Amore uint32_t s_allocsz;
a702341c8e6cc834a456108a8bf5d22f031da3beGarrett D'Amore uint32_t s_hintsz; /* latency hints */
a702341c8e6cc834a456108a8bf5d22f031da3beGarrett D'Amore uint16_t s_hintfrags;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Various counters.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint64_t s_samples;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint64_t s_errors; /* underrun or overrun count */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore boolean_t s_running;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore boolean_t s_paused; /* stream paused */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore boolean_t s_draining; /* stream draining */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Sample rate conversion (SRC) and format conversion details.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore struct grc3state *s_src_state[AUDIO_MAX_CHANNELS];
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t s_src_quality;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int s_cnv_max;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_cnv_func_t s_converter;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint32_t *s_cnv_buf0;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint32_t *s_cnv_buf1;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *s_cnv_src;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *s_cnv_dst;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_parms_t s_cnv_src_parms;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_cnv_src_nchan s_cnv_src_parms.p_nchan
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_cnv_src_rate s_cnv_src_parms.p_rate
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_cnv_src_format s_cnv_src_parms.p_format
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_parms_t s_cnv_dst_parms;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_cnv_dst_nchan s_cnv_dst_parms.p_nchan
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_cnv_dst_rate s_cnv_dst_parms.p_rate
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define s_cnv_dst_format s_cnv_dst_parms.p_format
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore size_t s_cnv_cnt;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int32_t *s_cnv_ptr;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_parms_t *s_user_parms;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_parms_t *s_phys_parms;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Volume.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint8_t s_gain_master;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint8_t s_gain_pct;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint16_t s_gain_scaled;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint16_t s_gain_eff;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore boolean_t s_muted;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Callbacks.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint64_t s_drain_idx; /* engine index */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Other per stream details, e.g. channel offset, etc.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kmutex_t s_lock;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kcondvar_t s_cv;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t s_eng_linkage; /* place on engine list */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_client_t *s_client;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_engine_t *s_engine;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int s_choffs;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Other bits.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t s_engcap; /* ENGINE_xxx_CAP */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * struct audio_client: This structure represents a logical port,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * associated with an open file, etc. These are the entities that are
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * mixed.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_client {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_stream_t c_istream;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_stream_t c_ostream;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *c_private;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore /*
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore * We can keep a linked list of clients to "notify" so that
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore * we can do this outside of locked context.
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore audio_client_t *c_next_input;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore audio_client_t *c_next_output;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore audio_client_t *c_next_drain;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * DDI support.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore major_t c_major;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore minor_t c_minor;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore minor_t c_origminor;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore queue_t *c_rq;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore queue_t *c_wq;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Linkage for per-device list of clients.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t c_global_linkage;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t c_dev_linkage;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int c_refcnt;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore boolean_t c_serialize;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kmutex_t c_lock;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kcondvar_t c_cv;
53a539a76c92f82105be30bb8827f8db4b79c7b0Garrett D'Amore boolean_t c_is_active;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Client wide settings... e.g. ops vector, etc.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t c_omode; /* open mode */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore pid_t c_pid; /* opening process id */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_dev_t *c_dev;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore cred_t *c_cred;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_client_ops_t c_ops;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_open c_ops.aco_open
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_close c_ops.aco_close
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_read c_ops.aco_read
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_write c_ops.aco_write
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_ioctl c_ops.aco_ioctl
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_chpoll c_ops.aco_chpoll
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_output c_ops.aco_output
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_input c_ops.aco_input
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_notify c_ops.aco_notify
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define c_drain c_ops.aco_drain
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore#define c_wput c_ops.aco_wput
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore#define c_wsrv c_ops.aco_wsrv
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore#define c_rsrv c_ops.aco_rsrv
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore struct pollhead c_pollhead;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_infostr {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore char i_line[100];
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t i_linkage;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_stats {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_head;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_tail;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_flags;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_nfrags;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_framesz;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_nbytes;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_hidx;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_tidx;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_format;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_nchan;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_rate;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_errors;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore kstat_named_t st_engine_underruns;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore kstat_named_t st_engine_overruns;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore kstat_named_t st_stream_underruns;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore kstat_named_t st_stream_overruns;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore kstat_named_t st_playahead;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_named_t st_suspended;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore kstat_named_t st_failed;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoretypedef void (*audio_import_fn_t)(audio_engine_t *, uint_t, audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoretypedef void (*audio_export_fn_t)(audio_engine_t *, uint_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * An audio engine corresponds to a single DMA transfer channel. It can
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * represent either record or playback, but not both at the same time.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * A device that supports simultaneous record and playback will register
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * separate channels.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_engine {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_engine_ops_t e_ops;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *e_private;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t e_flags;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Mixing related fields.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t e_limiter_state;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int32_t *e_chbufs[AUDIO_MAX_CHANNELS];
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t e_choffs[AUDIO_MAX_CHANNELS];
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t e_chincr[AUDIO_MAX_CHANNELS];
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore audio_export_fn_t e_export;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore audio_import_fn_t e_import;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Underlying physical buffer shared with device driver.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_buffer_t e_buf;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_head e_buf.b_head
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_tail e_buf.b_tail
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_data e_buf.b_data
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_framesz e_buf.b_framesz
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_nframes e_buf.b_nframes
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_hidx e_buf.b_hidx
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_tidx e_buf.b_tidx
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t e_fragfr;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t e_playahead;
f9ead4a57883f3ef04ef20d83cc47987d98c0687Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int e_errors;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore int e_overruns;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore int e_underruns;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore int e_stream_overruns;
a19bb1fa9f3f280f4a5e9125331ffb7f0825e4faGarrett D'Amore int e_stream_underruns;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_parms_t e_parms;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_format e_parms.p_format
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_nchan e_parms.p_nchan
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define e_rate e_parms.p_rate
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Statistics.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kstat_t *e_ksp;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore struct audio_stats e_stats;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Synchronization.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kmutex_t e_lock;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore kcondvar_t e_cv;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore ddi_periodic_t e_periodic;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Linkage for per-device list.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t e_dev_linkage;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_dev_t *e_dev;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int e_num; /* arbitrary engine number */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * List of of streams attached to this engine.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_t e_streams;
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore boolean_t e_suspended;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore boolean_t e_failed;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore boolean_t e_need_start;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_dev {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore dev_info_t *d_dip;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore major_t d_major;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int d_instance;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint32_t d_flags;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define DEV_OUTPUT_CAP (1U << 0)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define DEV_INPUT_CAP (1U << 1)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define DEV_DUPLEX_CAP (1U << 2)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define DEV_SNDSTAT_CAP (1U << 3)
260256302ac564fcfed9ebfa5a6c98a2e6ef3808Garrett D'Amore#define DEV_OPAQUE_CAP (1U << 4) /* AC3 are not mixable */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore char d_name[128]; /* generic description */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore char d_desc[128]; /* detailed config descr */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore char d_vers[128]; /* detailed version descr */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int d_number; /* global /dev/audioXX # */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int d_index; /* master device index */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int d_engno; /* engine counter */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_t d_hwinfo; /* strings of hw info */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Synchronization.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kmutex_t d_lock;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore kcondvar_t d_cv;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore kmutex_t d_ctrl_lock; /* leaf lock */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore kcondvar_t d_ctrl_cv;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore krwlock_t d_clnt_lock;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint_t d_refcnt;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore int d_suspended;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore boolean_t d_failed;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Lists of virtual clients, controls and engines. Protected by
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * the d_lock field above.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_t d_clients;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_t d_engines;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_t d_controls;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_ctrl_t *d_pcmvol_ctrl;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint64_t d_pcmvol;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore volatile uint_t d_serial;
682cb1044237d21ad6810702564bec833b8c410cGarrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Linkage onto global list of devices.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t d_by_index;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t d_by_number;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore /*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Personality specific data.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *d_minor_data[1 << AUDIO_MN_TYPE_NBITS];
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Each audio_dev optionally can have controls attached to it.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Controls are separate from audio engines. They are methods of
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * adjusting pharameters or reading metrics that usually relate to
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * hardware on devices engine by the driver. They can be things like
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * master volume for example.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * If the driver does not support controls then it must insure
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * that any hardware controls are initialized to a usable state.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * For the framework/user-apps to be able to change controls
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * the driver must create, enable and configure controls with
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * control API's.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * There are a number of common controls (well-known) that most
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * hardware supports. These have known names and known ctrl numbers.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * In addition a driver can have any number of extention
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * controls (device-private). These can have any name and any ctrl
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * number other then the ones, defined as well-knonw ones.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore *
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Only controls created through control API's will be available,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * well-known or device-private.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorestruct audio_ctrl {
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_ctrl_desc_t ctrl_des;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ctrl_name ctrl_des.acd_name
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ctrl_type ctrl_des.acd_type
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ctrl_enum ctrl_des.acd_enum
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ctrl_flags ctrl_des.acd_flags
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_dev_t *ctrl_dev;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_ctrl_rd_t ctrl_read_fn;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore audio_ctrl_wr_t ctrl_write_fn;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t ctrl_linkage;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *ctrl_arg;
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore uint64_t ctrl_saved; /* the saved value */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore boolean_t ctrl_saved_ok;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore};
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/*
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Prototypes.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* audio_format.c */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auimpl_format_alloc(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_format_free(audio_stream_t *);
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amoreint auimpl_format_setup(audio_stream_t *, audio_parms_t *, uint_t);
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore#define FORMAT_MSK_NONE (0x0)
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore#define FORMAT_MSK_FMT (0x1)
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore#define FORMAT_MSK_RATE (0x2)
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore#define FORMAT_MSK_CHAN (0x4)
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore#define FOMMAT_MSK_ALL (0x7)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* audio_output.c */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_export_16ne(audio_engine_t *, uint_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_export_16oe(audio_engine_t *, uint_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_export_24ne(audio_engine_t *, uint_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_export_24oe(audio_engine_t *, uint_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_export_32ne(audio_engine_t *, uint_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_export_32oe(audio_engine_t *, uint_t, uint_t);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_output_callback(void *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_output_preload(audio_engine_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* audio_input.c */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_import_16ne(audio_engine_t *, uint_t, audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_import_16oe(audio_engine_t *, uint_t, audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_import_24ne(audio_engine_t *, uint_t, audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_import_24oe(audio_engine_t *, uint_t, audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_import_32ne(audio_engine_t *, uint_t, audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_import_32oe(audio_engine_t *, uint_t, audio_stream_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amorevoid auimpl_input_callback(void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auimpl_input_drain(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* audio_client.c */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_client_init(void);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_client_fini(void);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_client_t *auimpl_client_create(dev_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_client_destroy(audio_client_t *);
53a539a76c92f82105be30bb8827f8db4b79c7b0Garrett D'Amorevoid auimpl_client_activate(audio_client_t *);
53a539a76c92f82105be30bb8827f8db4b79c7b0Garrett D'Amorevoid auimpl_client_deactivate(audio_client_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auimpl_create_minors(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_remove_minors(audio_dev_t *);
53a539a76c92f82105be30bb8827f8db4b79c7b0Garrett D'Amoreint auimpl_set_pcmvol(void *, uint64_t);
53a539a76c92f82105be30bb8827f8db4b79c7b0Garrett D'Amoreint auimpl_get_pcmvol(void *, uint64_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore/* audio_ctrl.c */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreint auimpl_save_controls(audio_dev_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreint auimpl_restore_controls(audio_dev_t *);
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* audio_engine.c */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amoreextern int audio_priority;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_dev_init(void);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_dev_fini(void);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_dev_hold(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_dev_t *auimpl_dev_hold_by_devt(dev_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreaudio_dev_t *auimpl_dev_hold_by_index(int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_dev_release(audio_dev_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoreint auimpl_choose_format(int);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amoreint auimpl_engine_open(audio_stream_t *, int);
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amoreint auimpl_engine_setup(audio_stream_t *, int, audio_parms_t *, uint_t);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_engine_close(audio_stream_t *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_dev_walk_engines(audio_dev_t *,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int (*)(audio_engine_t *, void *), void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_dev_vwarn(audio_dev_t *, const char *, va_list);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* engine operations */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define E_OP(e, entry) ((e)->e_ops.audio_engine_##entry)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define E_PRV(e) ((e)->e_private)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_FORMAT(e) E_OP(e, format)(E_PRV(e))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_RATE(e) E_OP(e, rate)(E_PRV(e))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_CHANNELS(e) E_OP(e, channels)(E_PRV(e))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_SYNC(e, num) E_OP(e, sync)(E_PRV(e), num)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_START(e) E_OP(e, start)(E_PRV(e))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_STOP(e) E_OP(e, stop)(E_PRV(e))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_COUNT(e) E_OP(e, count)(E_PRV(e))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_QLEN(e) E_OP(e, qlen)(E_PRV(e))
f9ead4a57883f3ef04ef20d83cc47987d98c0687Garrett D'Amore#define ENG_PLAYAHEAD(e) E_OP(e, playahead)(E_PRV(e))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_CLOSE(e) E_OP(e, close)(E_PRV(e))
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore#define ENG_OPEN(e, flg, nf, d) E_OP(e, open)(E_PRV(e), flg, nf, d)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_CHINFO(e, c, o, i) E_OP(e, chinfo(E_PRV(e), c, o, i))
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* audio_sun.c */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_sun_init(void);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* audio_oss.c */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_oss_init(void);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#endif /* _AUDIO_IMPL_H */