88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Copyright (C) 4Front Technologies 1996-2008.
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amore * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define AUDIO_CHBUFS 2048 /* samples for mixing */
68c47f65208790c466e5e484f2293d3baed71c6aGarrett D'Amore#define AUDIO_INTRHZ_MIN 50 /* 20 msec max */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoretypedef int (*audio_cnv_func_t)(audio_stream_t *, int);
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 * Various counters.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint64_t s_errors; /* underrun or overrun count */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Sample rate conversion (SRC) and format conversion details.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore struct grc3state *s_src_state[AUDIO_MAX_CHANNELS];
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#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 * Other per stream details, e.g. channel offset, etc.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore list_node_t s_eng_linkage; /* place on engine list */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Other bits.
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
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.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * DDI support.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Linkage for per-device list of clients.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Client wide settings... e.g. ops vector, etc.
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);
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 * Mixing related fields.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Underlying physical buffer shared with device driver.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Statistics.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Synchronization.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Linkage for per-device list.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * List of of streams attached to this engine.
260256302ac564fcfed9ebfa5a6c98a2e6ef3808Garrett D'Amore#define DEV_OPAQUE_CAP (1U << 4) /* AC3 are not mixable */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore char d_desc[128]; /* detailed config descr */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore char d_vers[128]; /* detailed version descr */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Synchronization.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Lists of virtual clients, controls and engines. Protected by
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * the d_lock field above.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Linkage onto global list of devices.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Personality specific data.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *d_minor_data[1 << AUDIO_MN_TYPE_NBITS];
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 * 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 * 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 * 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 * Only controls created through control API's will be available,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * well-known or device-private.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Prototypes.
2c30fa4582c5d6c659e059e719c5f6163f7ef1e3Garrett D'Amoreint auimpl_format_setup(audio_stream_t *, audio_parms_t *, uint_t);
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_preload(audio_engine_t *);
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 *);
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 *);
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'Amore int (*)(audio_engine_t *, void *), void *);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amorevoid auimpl_dev_vwarn(audio_dev_t *, const char *, va_list);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore/* engine operations */
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define E_OP(e, entry) ((e)->e_ops.audio_engine_##entry)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore#define ENG_FORMAT(e) E_OP(e, format)(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_COUNT(e) E_OP(e, count)(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#endif /* _AUDIO_IMPL_H */