1 /*	$OpenBSD: audiovar.h,v 1.9 2002/08/26 16:20:04 mickey Exp $	*/
2 /*	$NetBSD: audiovar.h,v 1.18 1998/03/03 09:16:16 augustss Exp $	*/
3 
4 /*
5  * Copyright (c) 1991-1993 Regents of the University of California.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *	This product includes software developed by the Computer Systems
19  *	Engineering Group at Lawrence Berkeley Laboratory.
20  * 4. Neither the name of the University nor of the Laboratory may be used
21  *    to endorse or promote products derived from this software without
22  *    specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  *	From: Header: audiovar.h,v 1.3 93/07/18 14:07:25 mccanne Exp  (LBL)
37  */
38 
39 /*
40  * Initial/default block duration is both configurable and patchable.
41  */
42 #ifndef AUDIO_BLK_MS
43 #define AUDIO_BLK_MS	50	/* 50 ms */
44 #endif
45 
46 #ifndef AU_RING_SIZE
47 #define AU_RING_SIZE		65536
48 #endif
49 
50 #define AUMINBUF 512
51 #define AUMINBLK 32
52 #define AUMINNOBLK 2
53 struct audio_ringbuffer {
54 	int	bufsize;	/* allocated memory */
55 	int	blksize;	/* I/O block size */
56 	int	maxblks;	/* no of blocks in ring */
57 	u_char	*start;		/* start of buffer area */
58 	u_char	*end;		/* end of buffer area */
59 	u_char	*inp;		/* input pointer (to buffer) */
60 	u_char	*outp;		/* output pointer (from buffer) */
61 	int	used;		/* no of used bytes */
62 	int	usedlow;	/* start writer when used falls below this */
63 	int	usedhigh;	/* stop writer when used goes above this */
64 	u_long	stamp;		/* bytes transferred */
65 	u_long	stamp_last;	/* old value of bytes transferred */
66 	u_long	drops;		/* missed samples from over/underrun */
67 	u_long	pdrops;		/* paused samples */
68 	char	pause;		/* transfer is paused */
69 	char	copying;	/* data is being copied */
70 	char	needfill;	/* buffer needs filling when copying is done */
71 	char	mmapped;	/* device is mmap()-ed */
72 };
73 
74 #define AUDIO_N_PORTS 4
75 
76 struct au_mixer_ports {
77 	int	index;
78 	int	master;
79 	int	nports;
80 	u_char	isenum;
81 	u_int	allports;
82 	u_int	aumask[AUDIO_N_PORTS];
83 	u_int	misel [AUDIO_N_PORTS];
84 	u_int	miport[AUDIO_N_PORTS];
85 };
86 
87 /*
88  * Software state, per audio device.
89  */
90 struct audio_softc {
91 	struct	device dev;
92 	void	*hw_hdl;	/* Hardware driver handle */
93 	struct	audio_hw_if *hw_if; /* Hardware interface */
94 	struct	device *sc_dev;	/* Hardware device struct */
95 	u_char	sc_open;	/* single use device */
96 #define AUOPEN_READ	0x01
97 #define AUOPEN_WRITE	0x02
98 	u_char	sc_mode;	/* bitmask for RECORD/PLAY */
99 
100 	struct	selinfo sc_wsel; /* write selector */
101 	struct	selinfo sc_rsel; /* read selector */
102 	struct	proc *sc_async_audio;	/* process who wants audio SIGIO */
103 	struct	mixer_asyncs {
104 		struct mixer_asyncs *next;
105 		struct proc *proc;
106 	} *sc_async_mixer;  /* processes who want mixer SIGIO */
107 
108 	/* Sleep channels for reading and writing. */
109 	int	sc_rchan;
110 	int	sc_wchan;
111 
112 	/* Ring buffers, separate for record and play. */
113 	struct	audio_ringbuffer sc_rr; /* Record ring */
114 	struct	audio_ringbuffer sc_pr; /* Play ring */
115 
116 	u_char	sc_blkset;	/* Blocksize has been set */
117 
118 	u_char	*sc_sil_start;	/* start of silence in buffer */
119 	int	sc_sil_count;	/* # of silence bytes */
120 
121 	u_char	sc_rbus;	/* input dma in progress */
122 	u_char	sc_pbus;	/* output dma in progress */
123 
124 	struct	audio_params sc_pparams;	/* play encoding parameters */
125 	struct	audio_params sc_rparams;	/* record encoding parameters */
126 
127 	int	sc_eof;		/* EOF, i.e. zero sized write, counter */
128 	u_long	sc_wstamp;
129 	u_long	sc_playdrop;
130 
131 	int	sc_full_duplex;	/* device in full duplex mode */
132 
133 	struct	au_mixer_ports sc_inports, sc_outports;
134 	int	sc_monitor_port;
135 
136 	int     sc_refcnt;
137 	int     sc_dying;
138 
139 #ifdef AUDIO_INTR_TIME
140 	u_long	sc_pfirstintr;	/* first time we saw a play interrupt */
141 	int	sc_pnintr;	/* number of interrupts */
142 	u_long	sc_plastintr;	/* last time we saw a play interrupt */
143 	long	sc_pblktime;	/* nominal time between interrupts */
144 	u_long	sc_rfirstintr;	/* first time we saw a rec interrupt */
145 	int	sc_rnintr;	/* number of interrupts */
146 	u_long	sc_rlastintr;	/* last time we saw a rec interrupt */
147 	long	sc_rblktime;	/* nominal time between interrupts */
148 #endif
149 };
150