audio_impl.h revision 10632:704f6d4f41c9
1169695Skan/* 2169695Skan * CDDL HEADER START 3169695Skan * 4169695Skan * The contents of this file are subject to the terms of the 5169695Skan * Common Development and Distribution License (the "License"). 6169695Skan * You may not use this file except in compliance with the License. 7169695Skan * 8169695Skan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9169695Skan * or http://www.opensolaris.org/os/licensing. 10169695Skan * See the License for the specific language governing permissions 11169695Skan * and limitations under the License. 12169695Skan * 13169695Skan * When distributing Covered Code, include this CDDL HEADER in each 14169695Skan * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15169695Skan * If applicable, add the following below this CDDL HEADER, with the 16169695Skan * fields enclosed by brackets "[]" replaced with your own identifying 17169695Skan * information: Portions Copyright [yyyy] [name of copyright owner] 18169695Skan * 19169695Skan * CDDL HEADER END 20169695Skan */ 21169695Skan/* 22169695Skan * Copyright (C) 4Front Technologies 1996-2008. 23169695Skan * 24169695Skan * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 25169695Skan * Use is subject to license terms. 26169695Skan */ 27169695Skan 28169695Skan#ifndef _AUDIO_IMPL_H 29169695Skan#define _AUDIO_IMPL_H 30169695Skan 31169695Skan#include <sys/types.h> 32169695Skan#include <sys/list.h> 33169695Skan#include <sys/poll.h> 34169695Skan 35169695Skan#include <sys/audio/audio_driver.h> 36169695Skan#include "audio_client.h" 37169695Skan 38169695Skan#define AUDIO_MAX_OPENS 256 39169695Skan#define AUDIO_MAX_CHANNELS 16 40169695Skan#define AUDIO_UNIT_EXPAND 1024 41169695Skan#define AUDIO_CHBUFS 2048 /* samples for mixing */ 42169695Skan#define AUDIO_VOL_SCALE 256 43169695Skan#define AUDIO_DB_SIZE 50 44169695Skan 45169695Skanstruct audio_parms { 46169695Skan int p_format; 47169695Skan int p_rate; 48169695Skan int p_nchan; 49169695Skan}; 50169695Skan 51169695Skantypedef int (*audio_cnv_func_t)(audio_stream_t *, int); 52169695Skan 53169695Skanstruct audio_buffer { 54169695Skan caddr_t b_data; 55169695Skan uint64_t b_head; 56169695Skan uint64_t b_tail; 57169695Skan unsigned b_hidx; /* head % nframes */ 58169695Skan unsigned b_tidx; /* tail % nframes */ 59169695Skan unsigned b_fragfr; /* frames per frag */ 60169695Skan unsigned b_fragbytes; /* bytes per frag */ 61169695Skan unsigned b_nframes; /* total frames */ 62169695Skan unsigned b_nbytes; /* total bytes */ 63169695Skan unsigned b_nfrags; /* total frags */ 64169695Skan unsigned b_framesz; /* bytes per frame */ 65169695Skan}; 66169695Skan 67169695Skan/* 68169695Skan * struct audio_stream: This structure represents a virtual stream exposed 69169695Skan * to a single client. Each client will have at most two of these (one for 70169695Skan * record, one for playback.) 71169695Skan */ 72169695Skanstruct audio_stream { 73169695Skan audio_buffer_t s_buf; 74169695Skan#define s_data s_buf.b_data 75169695Skan#define s_bufsz s_buf.b_size 76169695Skan#define s_head s_buf.b_head 77169695Skan#define s_tail s_buf.b_tail 78169695Skan#define s_nfrags s_buf.b_nfrags 79169695Skan#define s_framesz s_buf.b_framesz 80169695Skan#define s_fragfr s_buf.b_fragfr 81169695Skan#define s_fragbytes s_buf.b_fragbytes 82169695Skan#define s_nframes s_buf.b_nframes 83169695Skan#define s_nbytes s_buf.b_nbytes 84169695Skan#define s_tidx s_buf.b_tidx 85169695Skan#define s_hidx s_buf.b_hidx 86169695Skan ddi_umem_cookie_t s_cookie; 87169695Skan uint32_t s_allocsz; 88169695Skan uint32_t s_hintsz; /* latency hints */ 89169695Skan uint16_t s_hintfrags; 90169695Skan 91169695Skan /* 92169695Skan * Various counters. 93169695Skan */ 94169695Skan uint64_t s_samples; 95169695Skan uint64_t s_errors; /* underrun or overrun count */ 96169695Skan 97169695Skan boolean_t s_running; 98169695Skan boolean_t s_paused; /* stream paused */ 99169695Skan boolean_t s_draining; /* stream draining */ 100169695Skan 101169695Skan /* 102169695Skan * Sample rate conversion (SRC) and format conversion details. 103169695Skan */ 104169695Skan struct grc3state *s_src_state[AUDIO_MAX_CHANNELS]; 105169695Skan unsigned s_src_quality; 106169695Skan int s_cnv_max; 107169695Skan audio_cnv_func_t s_converter; 108169695Skan uint32_t *s_cnv_buf0; 109169695Skan uint32_t *s_cnv_buf1; 110169695Skan void *s_cnv_src; 111169695Skan void *s_cnv_dst; 112169695Skan audio_parms_t s_cnv_src_parms; 113169695Skan#define s_cnv_src_nchan s_cnv_src_parms.p_nchan 114169695Skan#define s_cnv_src_rate s_cnv_src_parms.p_rate 115169695Skan#define s_cnv_src_format s_cnv_src_parms.p_format 116169695Skan 117169695Skan audio_parms_t s_cnv_dst_parms; 118169695Skan#define s_cnv_dst_nchan s_cnv_dst_parms.p_nchan 119169695Skan#define s_cnv_dst_rate s_cnv_dst_parms.p_rate 120169695Skan#define s_cnv_dst_format s_cnv_dst_parms.p_format 121169695Skan 122169695Skan size_t s_cnv_cnt; 123169695Skan int32_t *s_cnv_ptr; 124169695Skan 125169695Skan audio_parms_t *s_user_parms; 126169695Skan audio_parms_t *s_phys_parms; 127169695Skan 128169695Skan /* 129169695Skan * Volume. 130169695Skan */ 131169695Skan uint8_t s_gain_master; 132169695Skan uint8_t s_gain_pct; 133169695Skan uint16_t s_gain_scaled; 134169695Skan uint16_t s_gain_eff; 135169695Skan boolean_t s_muted; 136169695Skan 137169695Skan /* 138169695Skan * Callbacks. 139169695Skan */ 140169695Skan uint64_t s_drain_idx; /* engine index */ 141169695Skan 142169695Skan /* 143169695Skan * Other per stream details, e.g. channel offset, etc. 144169695Skan */ 145169695Skan kmutex_t s_lock; 146169695Skan kcondvar_t s_cv; 147169695Skan list_node_t s_eng_linkage; /* place on engine list */ 148169695Skan audio_client_t *s_client; 149169695Skan audio_engine_t *s_engine; 150169695Skan int s_choffs; 151169695Skan 152169695Skan /* 153169695Skan * Other bits. 154169695Skan */ 155169695Skan unsigned s_engcap; /* ENGINE_xxx_CAP */ 156169695Skan}; 157169695Skan 158169695Skan/* 159169695Skan * struct audio_client: This structure represents a logical port, 160169695Skan * associated with an open file, etc. These are the entities that are 161169695Skan * mixed. 162169695Skan */ 163169695Skanstruct audio_client { 164169695Skan audio_stream_t c_istream; 165169695Skan audio_stream_t c_ostream; 166169695Skan void *c_private; 167169695Skan 168169695Skan /* 169169695Skan * DDI support. 170169695Skan */ 171169695Skan major_t c_major; 172169695Skan minor_t c_minor; 173169695Skan minor_t c_origminor; 174169695Skan queue_t *c_rq; 175169695Skan queue_t *c_wq; 176169695Skan 177169695Skan /* 178169695Skan * Linkage for per-device list of clients. 179169695Skan */ 180169695Skan list_node_t c_global_linkage; 181169695Skan list_node_t c_dev_linkage; 182169695Skan int c_refcnt; 183169695Skan 184169695Skan kmutex_t c_lock; 185169695Skan kcondvar_t c_cv; 186169695Skan boolean_t c_is_active; 187169695Skan 188169695Skan /* 189169695Skan * Client wide settings... e.g. ops vector, etc. 190169695Skan */ 191169695Skan unsigned c_omode; /* open mode */ 192169695Skan pid_t c_pid; /* opening process id */ 193169695Skan audio_dev_t *c_dev; 194169695Skan cred_t *c_cred; 195169695Skan audio_client_ops_t c_ops; 196169695Skan#define c_open c_ops.aco_open 197169695Skan#define c_close c_ops.aco_close 198169695Skan#define c_read c_ops.aco_read 199169695Skan#define c_write c_ops.aco_write 200169695Skan#define c_ioctl c_ops.aco_ioctl 201169695Skan#define c_chpoll c_ops.aco_chpoll 202169695Skan#define c_output c_ops.aco_output 203169695Skan#define c_input c_ops.aco_input 204169695Skan#define c_notify c_ops.aco_notify 205169695Skan#define c_drain c_ops.aco_drain 206169695Skan#define c_wput c_ops.aco_wput 207169695Skan#define c_wsrv c_ops.aco_wsrv 208169695Skan#define c_rsrv c_ops.aco_rsrv 209169695Skan 210169695Skan struct pollhead c_pollhead; 211169695Skan 212169695Skan}; 213169695Skan 214169695Skanstruct audio_infostr { 215169695Skan char i_line[100]; 216169695Skan list_node_t i_linkage; 217169695Skan}; 218169695Skan 219169695Skanstruct audio_stats { 220169695Skan kstat_named_t st_head; 221169695Skan kstat_named_t st_tail; 222169695Skan kstat_named_t st_flags; 223169695Skan kstat_named_t st_fragfr; 224169695Skan kstat_named_t st_nfrags; 225169695Skan kstat_named_t st_framesz; 226169695Skan kstat_named_t st_nbytes; 227169695Skan kstat_named_t st_hidx; 228169695Skan kstat_named_t st_tidx; 229169695Skan kstat_named_t st_format; 230169695Skan kstat_named_t st_nchan; 231169695Skan kstat_named_t st_rate; 232169695Skan kstat_named_t st_intrs; 233169695Skan kstat_named_t st_errors; 234169695Skan kstat_named_t st_engine_underruns; 235169695Skan kstat_named_t st_engine_overruns; 236169695Skan kstat_named_t st_stream_underruns; 237169695Skan kstat_named_t st_stream_overruns; 238169695Skan kstat_named_t st_suspended; 239169695Skan}; 240169695Skan 241169695Skan/* 242169695Skan * An audio engine corresponds to a single DMA transfer channel. It can 243169695Skan * represent either record or playback, but not both at the same time. 244169695Skan * A device that supports simultaneous record and playback will register 245169695Skan * separate channels. 246169695Skan */ 247169695Skanstruct audio_engine { 248169695Skan audio_engine_ops_t e_ops; 249169695Skan void *e_private; 250169695Skan unsigned e_flags; 251169695Skan 252169695Skan /* 253169695Skan * Mixing related fields. 254169695Skan */ 255169695Skan unsigned e_limiter_state; 256169695Skan int32_t *e_chbufs[AUDIO_MAX_CHANNELS]; 257169695Skan unsigned e_choffs[AUDIO_MAX_CHANNELS]; 258169695Skan unsigned e_chincr[AUDIO_MAX_CHANNELS]; 259169695Skan void (*e_export)(audio_engine_t *); 260169695Skan void (*e_import)(audio_engine_t *, audio_stream_t *); 261169695Skan 262169695Skan /* 263169695Skan * Underlying physical buffer shared with device driver. 264169695Skan */ 265169695Skan audio_buffer_t e_buf; 266169695Skan#define e_head e_buf.b_head 267169695Skan#define e_tail e_buf.b_tail 268169695Skan#define e_data e_buf.b_data 269169695Skan#define e_fragfr e_buf.b_fragfr 270169695Skan#define e_fragbytes e_buf.b_fragbytes 271169695Skan#define e_framesz e_buf.b_framesz 272169695Skan#define e_nbytes e_buf.b_nbytes 273169695Skan#define e_nframes e_buf.b_nframes 274169695Skan#define e_nfrags e_buf.b_nfrags 275169695Skan#define e_hidx e_buf.b_hidx 276169695Skan#define e_tidx e_buf.b_tidx 277169695Skan 278169695Skan int e_intrs; 279169695Skan int e_errors; 280169695Skan int e_overruns; 281169695Skan int e_underruns; 282169695Skan int e_stream_overruns; 283169695Skan int e_stream_underruns; 284169695Skan 285169695Skan audio_parms_t e_parms; 286169695Skan#define e_format e_parms.p_format 287169695Skan#define e_nchan e_parms.p_nchan 288169695Skan#define e_rate e_parms.p_rate 289169695Skan 290169695Skan /* 291169695Skan * Statistics. 292169695Skan */ 293169695Skan kstat_t *e_ksp; 294169695Skan struct audio_stats e_stats; 295169695Skan 296169695Skan 297169695Skan /* 298169695Skan * Synchronization. 299169695Skan */ 300169695Skan kmutex_t e_lock; 301169695Skan 302169695Skan /* 303169695Skan * Linkage for per-device list. 304169695Skan */ 305169695Skan list_node_t e_dev_linkage; 306169695Skan audio_dev_t *e_dev; 307169695Skan int e_num; /* arbitrary engine number */ 308169695Skan 309169695Skan /* 310169695Skan * List of of streams attached to this engine. 311169695Skan */ 312169695Skan list_t e_streams; 313169695Skan int e_nrunning; 314169695Skan boolean_t e_suspended; 315169695Skan}; 316169695Skan 317169695Skanstruct audio_dev { 318169695Skan dev_info_t *d_dip; 319169695Skan major_t d_major; 320169695Skan int d_instance; 321169695Skan 322169695Skan uint32_t d_flags; 323169695Skan#define DEV_OUTPUT_CAP (1U << 0) 324169695Skan#define DEV_INPUT_CAP (1U << 1) 325169695Skan#define DEV_DUPLEX_CAP (1U << 2) 326169695Skan#define DEV_SNDSTAT_CAP (1U << 3) 327169695Skan#define DEV_OPAQUE_CAP (1U << 4) /* AC3 are not mixable */ 328169695Skan 329169695Skan char d_name[128]; /* generic description */ 330169695Skan char d_desc[128]; /* detailed config descr */ 331169695Skan char d_vers[128]; /* detailed version descr */ 332169695Skan int d_number; /* global /dev/audioXX # */ 333169695Skan int d_index; /* master device index */ 334169695Skan int d_engno; /* engine counter */ 335169695Skan 336169695Skan list_t d_hwinfo; /* strings of hw info */ 337169695Skan 338169695Skan /* 339169695Skan * Synchronization. 340169695Skan */ 341169695Skan kmutex_t d_lock; 342169695Skan kcondvar_t d_cv; 343169695Skan krwlock_t d_ctrl_lock; /* leaf lock */ 344169695Skan krwlock_t d_clnt_lock; 345169695Skan unsigned d_refcnt; 346169695Skan 347169695Skan /* 348169695Skan * Lists of virtual clients, controls and engines. Protected by 349169695Skan * the d_lock field above. 350169695Skan */ 351169695Skan list_t d_clients; 352169695Skan list_t d_engines; 353169695Skan list_t d_controls; 354169695Skan audio_ctrl_t *d_pcmvol_ctrl; 355169695Skan uint64_t d_pcmvol; 356169695Skan 357169695Skan volatile unsigned d_serial; 358169695Skan 359169695Skan /* 360169695Skan * Linkage onto global list of devices. 361169695Skan */ 362169695Skan list_node_t d_by_index; 363169695Skan list_node_t d_by_number; 364169695Skan 365169695Skan /* 366169695Skan * Personality specific data. 367169695Skan */ 368169695Skan void *d_minor_data[1 << AUDIO_MN_TYPE_NBITS]; 369169695Skan}; 370169695Skan 371169695Skan/* 372169695Skan * Each audio_dev optionally can have controls attached to it. 373169695Skan * Controls are separate from audio engines. They are methods of 374169695Skan * adjusting pharameters or reading metrics that usually relate to 375169695Skan * hardware on devices engine by the driver. They can be things like 376169695Skan * master volume for example. 377169695Skan * 378169695Skan * If the driver does not support controls then it must insure 379169695Skan * that any hardware controls are initialized to a usable state. 380169695Skan * 381169695Skan * For the framework/user-apps to be able to change controls 382169695Skan * the driver must create, enable and configure controls with 383169695Skan * control API's. 384169695Skan * 385169695Skan * There are a number of common controls (well-known) that most 386169695Skan * hardware supports. These have known names and known ctrl numbers. 387169695Skan * In addition a driver can have any number of extention 388169695Skan * controls (device-private). These can have any name and any ctrl 389169695Skan * number other then the ones, defined as well-knonw ones. 390169695Skan * 391169695Skan * Only controls created through control API's will be available, 392169695Skan * well-known or device-private. 393169695Skan */ 394169695Skanstruct audio_ctrl { 395169695Skan audio_ctrl_desc_t ctrl_des; 396169695Skan#define ctrl_name ctrl_des.acd_name 397169695Skan#define ctrl_type ctrl_des.acd_type 398169695Skan#define ctrl_enum ctrl_des.acd_enum 399169695Skan#define ctrl_flags ctrl_des.acd_flags 400169695Skan audio_dev_t *ctrl_dev; 401169695Skan audio_ctrl_rd_t ctrl_read_fn; 402169695Skan audio_ctrl_wr_t ctrl_write_fn; 403169695Skan list_node_t ctrl_linkage; 404169695Skan kmutex_t ctrl_lock; 405169695Skan void *ctrl_arg; 406169695Skan}; 407169695Skan 408169695Skan 409169695Skan/* 410169695Skan * Prototypes. 411169695Skan */ 412169695Skan 413169695Skan/* audio_format.c */ 414169695Skanint auimpl_format_alloc(audio_stream_t *); 415169695Skanvoid auimpl_format_free(audio_stream_t *); 416169695Skanint auimpl_format_setup(audio_stream_t *, audio_parms_t *); 417169695Skan 418169695Skan/* audio_output.c */ 419169695Skanvoid auimpl_export_16ne(audio_engine_t *); 420169695Skanvoid auimpl_export_16oe(audio_engine_t *); 421169695Skanvoid auimpl_export_24ne(audio_engine_t *); 422169695Skanvoid auimpl_export_24oe(audio_engine_t *); 423169695Skanvoid auimpl_export_32ne(audio_engine_t *); 424169695Skanvoid auimpl_export_32oe(audio_engine_t *); 425169695Skanvoid auimpl_output_callback(audio_engine_t *); 426169695Skan 427169695Skan/* audio_input.c */ 428169695Skanvoid auimpl_import_16ne(audio_engine_t *, audio_stream_t *); 429169695Skanvoid auimpl_import_16oe(audio_engine_t *, audio_stream_t *); 430169695Skanvoid auimpl_import_24ne(audio_engine_t *, audio_stream_t *); 431169695Skanvoid auimpl_import_24oe(audio_engine_t *, audio_stream_t *); 432169695Skanvoid auimpl_import_32ne(audio_engine_t *, audio_stream_t *); 433169695Skanvoid auimpl_import_32oe(audio_engine_t *, audio_stream_t *); 434169695Skanvoid auimpl_input_callback(audio_engine_t *); 435169695Skanint auimpl_input_drain(audio_stream_t *); 436169695Skan 437169695Skan/* audio_client.c */ 438169695Skanvoid auimpl_client_init(void); 439169695Skanvoid auimpl_client_fini(void); 440169695Skanaudio_client_t *auimpl_client_create(dev_t); 441169695Skanvoid auimpl_client_destroy(audio_client_t *); 442169695Skanvoid auimpl_client_activate(audio_client_t *); 443169695Skanvoid auimpl_client_deactivate(audio_client_t *); 444169695Skanint auimpl_create_minors(audio_dev_t *); 445169695Skanvoid auimpl_remove_minors(audio_dev_t *); 446169695Skanint auimpl_set_pcmvol(void *, uint64_t); 447169695Skanint auimpl_get_pcmvol(void *, uint64_t *); 448169695Skan 449169695Skan/* audio_engine.c */ 450169695Skanvoid auimpl_dev_init(void); 451169695Skanvoid auimpl_dev_fini(void); 452169695Skanvoid auimpl_dev_hold(audio_dev_t *); 453169695Skanaudio_dev_t *auimpl_dev_hold_by_devt(dev_t); 454169695Skanaudio_dev_t *auimpl_dev_hold_by_index(int); 455169695Skanvoid auimpl_dev_release(audio_dev_t *); 456169695Skanint auimpl_choose_format(int); 457169695Skan 458169695Skanint auimpl_engine_open(audio_dev_t *, int, int, audio_stream_t *); 459169695Skanvoid auimpl_engine_close(audio_stream_t *); 460169695Skan 461169695Skanvoid auimpl_dev_walk_engines(audio_dev_t *, 462169695Skan int (*)(audio_engine_t *, void *), void *); 463169695Skan 464169695Skanvoid auimpl_dev_vwarn(audio_dev_t *, const char *, va_list); 465169695Skan 466169695Skan/* engine operations */ 467169695Skan#define E_OP(e, entry) ((e)->e_ops.audio_engine_##entry) 468169695Skan#define E_PRV(e) ((e)->e_private) 469169695Skan#define ENG_FORMAT(e) E_OP(e, format)(E_PRV(e)) 470169695Skan#define ENG_RATE(e) E_OP(e, rate)(E_PRV(e)) 471169695Skan#define ENG_CHANNELS(e) E_OP(e, channels)(E_PRV(e)) 472169695Skan#define ENG_SYNC(e, num) E_OP(e, sync)(E_PRV(e), num) 473169695Skan#define ENG_START(e) E_OP(e, start)(E_PRV(e)) 474169695Skan#define ENG_STOP(e) E_OP(e, stop)(E_PRV(e)) 475169695Skan#define ENG_COUNT(e) E_OP(e, count)(E_PRV(e)) 476169695Skan#define ENG_QLEN(e) E_OP(e, qlen)(E_PRV(e)) 477169695Skan#define ENG_CLOSE(e) E_OP(e, close)(E_PRV(e)) 478169695Skan#define ENG_OPEN(e, s, nf, d) E_OP(e, open)(E_PRV(e), e->e_flags, s, nf, d) 479169695Skan#define ENG_CHINFO(e, c, o, i) E_OP(e, chinfo(E_PRV(e), c, o, i)) 480169695Skan 481169695Skan/* audio_sun.c */ 482169695Skanvoid auimpl_sun_init(void); 483169695Skan 484169695Skan/* audio_oss.c */ 485169695Skanvoid auimpl_oss_init(void); 486169695Skan 487169695Skan#endif /* _AUDIO_IMPL_H */ 488169695Skan