1/* $NetBSD$ */ 2 3/*- 4 * Copyright (c) 2002 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by TAMURA Kent 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32/* 33 * Copyright (c) 1991-1993 Regents of the University of California. 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. All advertising materials mentioning features or use of this software 45 * must display the following acknowledgement: 46 * This product includes software developed by the Computer Systems 47 * Engineering Group at Lawrence Berkeley Laboratory. 48 * 4. Neither the name of the University nor of the Laboratory may be used 49 * to endorse or promote products derived from this software without 50 * specific prior written permission. 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 62 * SUCH DAMAGE. 63 * 64 * From: Header: audiovar.h,v 1.3 93/07/18 14:07:25 mccanne Exp (LBL) 65 */ 66#ifndef _SYS_DEV_AUDIOVAR_H_ 67#define _SYS_DEV_AUDIOVAR_H_ 68 69#include <sys/condvar.h> 70 71#include <dev/audio_if.h> 72 73/* 74 * Initial/default block duration is both configurable and patchable. 75 */ 76#ifndef AUDIO_BLK_MS 77#define AUDIO_BLK_MS 50 /* 50 ms */ 78#endif 79 80#ifndef AU_RING_SIZE 81#define AU_RING_SIZE 65536 82#endif 83 84#define AUMINBUF 512 85#define AUMINBLK 32 86#define AUMINNOBLK 3 87struct audio_ringbuffer { 88 audio_stream_t s; 89 int blksize; /* I/O block size (bytes) */ 90 int maxblks; /* no of blocks in ring */ 91 int usedlow; /* start writer when used falls below this */ 92 int usedhigh; /* stop writer when used goes above this */ 93 u_long stamp; /* bytes transferred */ 94 u_long stamp_last; /* old value of bytes transferred */ 95 u_long fstamp; /* bytes transferred from/to the buffer near to userland */ 96 u_long drops; /* missed samples from over/underrun */ 97 u_long pdrops; /* paused samples */ 98 bool pause; /* transfer is paused */ 99 bool copying; /* data is being copied */ 100 bool needfill; /* buffer needs filling when copying is done */ 101 bool mmapped; /* device is mmap()-ed */ 102}; 103 104#define AUDIO_N_PORTS 4 105 106struct au_mixer_ports { 107 int index; /* index of port-selector mixerctl */ 108 int master; /* index of master mixerctl */ 109 int nports; /* number of selectable ports */ 110 bool isenum; /* selector is enum type */ 111 u_int allports; /* all aumasks or'd */ 112 u_int aumask[AUDIO_N_PORTS]; /* exposed value of "ports" */ 113 u_int misel [AUDIO_N_PORTS]; /* ord of port, for selector */ 114 u_int miport[AUDIO_N_PORTS]; /* index of port's mixerctl */ 115 bool isdual; /* has working mixerout */ 116 int mixerout; /* ord of mixerout, for dual case */ 117 int cur_port; /* the port that gain actually controls when 118 mixerout is selected, for dual case */ 119}; 120 121/* 122 * Software state, per audio device. 123 */ 124struct audio_softc { 125 device_t dev; 126 void *hw_hdl; /* Hardware driver handle */ 127 const struct audio_hw_if *hw_if; /* Hardware interface */ 128 device_t sc_dev; /* Hardware device struct */ 129 u_char sc_open; /* single use device */ 130#define AUOPEN_READ 0x01 131#define AUOPEN_WRITE 0x02 132 u_char sc_mode; /* bitmask for RECORD/PLAY */ 133 134 struct selinfo sc_wsel; /* write selector */ 135 struct selinfo sc_rsel; /* read selector */ 136 pid_t sc_async_audio; /* process who wants audio SIGIO */ 137 void *sc_sih_rd; 138 void *sc_sih_wr; 139 struct mixer_asyncs { 140 struct mixer_asyncs *next; 141 pid_t pid; 142 } *sc_async_mixer; /* processes who want mixer SIGIO */ 143 144 /* Locks and sleep channels for reading, writing and draining. */ 145 kmutex_t *sc_intr_lock; 146 kmutex_t *sc_lock; 147 kcondvar_t sc_rchan; 148 kcondvar_t sc_wchan; 149 kcondvar_t sc_lchan; 150 int sc_dvlock; 151 bool sc_dying; 152 153 bool sc_blkset; /* Blocksize has been set */ 154 155 uint8_t *sc_sil_start; /* start of silence in buffer */ 156 int sc_sil_count; /* # of silence bytes */ 157 158 bool sc_rbus; /* input DMA in progress */ 159 bool sc_pbus; /* output DMA in progress */ 160 161 /** 162 * userland 163 * | write(2) & uiomove(9) 164 * sc_pstreams[0] <sc_pparams> == sc_pustream; 165 * | sc_pfilters[0] 166 * sc_pstreams[1] <list_t::filters[n-1].param> 167 * : 168 * sc_pstreams[n-1] <list_t::filters[1].param> 169 * | sc_pfilters[n-1] 170 * sc_pr <list_t::filters[0].param> 171 * | 172 * hardware 173 */ 174 audio_params_t sc_pparams; /* play encoding parameters */ 175 audio_stream_t *sc_pustream; /* the first buffer */ 176 int sc_npfilters; /* number of filters */ 177 audio_stream_t sc_pstreams[AUDIO_MAX_FILTERS]; 178 stream_filter_t *sc_pfilters[AUDIO_MAX_FILTERS]; 179 struct audio_ringbuffer sc_pr; /* Play ring */ 180 181 /** 182 * hardware 183 * | 184 * sc_rr <list_t::filters[0].param> 185 * | sc_rfilters[0] 186 * sc_rstreams[0] <list_t::filters[1].param> 187 * | sc_rfilters[1] 188 * sc_rstreams[1] <list_t::filters[2].param> 189 * : 190 * | sc_rfilters[n-1] 191 * sc_rstreams[n-1] <sc_rparams> == sc_rustream 192 * | uiomove(9) & read(2) 193 * userland 194 */ 195 struct audio_ringbuffer sc_rr; /* Record ring */ 196 int sc_nrfilters; /* number of filters */ 197 stream_filter_t *sc_rfilters[AUDIO_MAX_FILTERS]; 198 audio_stream_t sc_rstreams[AUDIO_MAX_FILTERS]; 199 audio_stream_t *sc_rustream; /* the last buffer */ 200 audio_params_t sc_rparams; /* record encoding parameters */ 201 202 int sc_eof; /* EOF, i.e. zero sized write, counter */ 203 u_long sc_wstamp; /* # of bytes read with read(2) */ 204 u_long sc_playdrop; 205 206 int sc_full_duplex; /* device in full duplex mode */ 207 208 struct au_mixer_ports sc_inports, sc_outports; 209 int sc_monitor_port; 210 211#ifdef AUDIO_INTR_TIME 212 u_long sc_pfirstintr; /* first time we saw a play interrupt */ 213 int sc_pnintr; /* number of interrupts */ 214 u_long sc_plastintr; /* last time we saw a play interrupt */ 215 long sc_pblktime; /* nominal time between interrupts */ 216 u_long sc_rfirstintr; /* first time we saw a rec interrupt */ 217 int sc_rnintr; /* number of interrupts */ 218 u_long sc_rlastintr; /* last time we saw a rec interrupt */ 219 long sc_rblktime; /* nominal time between interrupts */ 220#endif 221 222 u_int sc_lastgain; 223 struct audio_info sc_lastinfo; 224 bool sc_lastinfovalid; 225 226 mixer_ctrl_t *sc_mixer_state; 227 int sc_nmixer_states; 228}; 229 230#endif /* _SYS_DEV_AUDIOVAR_H_ */ 231