Initial import from FreeBSD RELENG_4:
[games.git] / sys / dev / sound / isa / i386 / sb / sb_mixer.h
1 /*
2  * sound/sb_mixer.h
3  * 
4  * Definitions for the SB Pro and SB16 mixers
5  * 
6  * Copyright by Hannu Savolainen 1993
7  * 
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are
10  * met: 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer. 2.
12  * Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  * 
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  * 
28  * Modified: Hunyue Yau Jan 6 1994 Added defines for the Sound Galaxy NX Pro
29  * mixer.
30  * 
31  */
32
33 #define SBPRO_RECORDING_DEVICES (SOUND_MASK_LINE | SOUND_MASK_MIC | SOUND_MASK_CD)
34
35 /* Same as SB Pro, unless I find otherwise */
36 #define SGNXPRO_RECORDING_DEVICES SBPRO_RECORDING_DEVICES
37
38 #define SBPRO_MIXER_DEVICES             (SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_LINE | SOUND_MASK_MIC | \
39                                          SOUND_MASK_CD | SOUND_MASK_VOLUME)
40
41 /*
42  * SG NX Pro has treble and bass settings on the mixer. The 'speaker' channel
43  * is the COVOX/DisneySoundSource emulation volume control on the mixer. It
44  * does NOT control speaker volume. Should have own mask eventually?
45  */
46 #define SGNXPRO_MIXER_DEVICES   (SBPRO_MIXER_DEVICES|SOUND_MASK_BASS| \
47                                  SOUND_MASK_TREBLE|SOUND_MASK_SPEAKER )
48
49 #define SB16_RECORDING_DEVICES          (SOUND_MASK_SYNTH | SOUND_MASK_LINE | SOUND_MASK_MIC | \
50                                          SOUND_MASK_CD)
51
52 #define SB16_MIXER_DEVICES              (SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_SPEAKER | SOUND_MASK_LINE | SOUND_MASK_MIC | \
53                                          SOUND_MASK_CD | \
54                                          SOUND_MASK_IGAIN | SOUND_MASK_OGAIN | \
55                                          SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE)
56
57 /*
58  * Mixer registers
59  * 
60  * NOTE!        RECORD_SRC == IN_FILTER
61  */
62
63 /*
64  * Mixer registers of SB Pro
65  */
66 #define VOC_VOL         0x04
67 #define MIC_VOL         0x0A
68 #define MIC_MIX         0x0A
69 #define RECORD_SRC      0x0C
70 #define IN_FILTER       0x0C
71 #define OUT_FILTER      0x0E
72 #define MASTER_VOL      0x22
73 #define FM_VOL          0x26
74 #define CD_VOL          0x28
75 #define LINE_VOL        0x2E
76 #define IRQ_NR          0x80
77 #define DMA_NR          0x81
78 #define IRQ_STAT        0x82
79 #define OPSW            0x3c
80
81 /*
82  * Additional registers on the SG NX Pro
83  */
84 #define COVOX_VOL       0x42
85 #define TREBLE_LVL      0x44
86 #define BASS_LVL        0x46
87
88 #define FREQ_HI         (1 << 3)/* Use High-frequency ANFI filters */
89 #define FREQ_LOW        0       /* Use Low-frequency ANFI filters */
90 #define FILT_ON         0       /* Yes, 0 to turn it on, 1 for off */
91 #define FILT_OFF        (1 << 5)
92
93 #define MONO_DAC        0x00
94 #define STEREO_DAC      0x02
95
96 /*
97  * Mixer registers of SB16
98  */
99 #define SB16_IMASK_L    0x3d
100 #define SB16_IMASK_R    0x3e
101
102 #define LEFT_CHN        0
103 #define RIGHT_CHN       1
104
105 struct mixer_def {
106         unsigned int    regno:8;
107         unsigned int    bitoffs:4;
108         unsigned int    nbits:4;
109 };
110
111
112 typedef struct mixer_def mixer_tab[32][2];
113 typedef struct mixer_def mixer_ent;
114
115 #define MIX_ENT(name, reg_l, bit_l, len_l, reg_r, bit_r, len_r) \
116         {{reg_l, bit_l, len_l}, {reg_r, bit_r, len_r}}
117
118 #ifdef __SB_MIXER_C__
119 mixer_tab       sbpro_mix = {
120         MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4),
121         MIX_ENT(SOUND_MIXER_BASS, 0x00, 0, 0, 0x00, 0, 0),
122         MIX_ENT(SOUND_MIXER_TREBLE, 0x00, 0, 0, 0x00, 0, 0),
123         MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4),
124         MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4),
125         MIX_ENT(SOUND_MIXER_SPEAKER, 0x00, 0, 0, 0x00, 0, 0),
126         MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4),
127         MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0),
128         MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4),
129         MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0),
130         MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0),
131         MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0)
132 };
133
134 #ifdef  __SGNXPRO__
135 mixer_tab       sgnxpro_mix = {
136         MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4),
137         MIX_ENT(SOUND_MIXER_BASS, 0x46, 2, 3, 0x00, 0, 0),
138         MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 2, 3, 0x00, 0, 0),
139         MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4),
140         MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4),
141         MIX_ENT(SOUND_MIXER_SPEAKER, 0x42, 2, 3, 0x00, 0, 0),
142         MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4),
143         MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0),
144         MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4),
145         MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0),
146         MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0),
147         MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0),
148         MIX_ENT(SOUND_MIXER_IGAIN, 0x00, 0, 0, 0x00, 0, 0),
149         MIX_ENT(SOUND_MIXER_OGAIN, 0x00, 0, 0, 0x00, 0, 0)
150 };
151 #endif
152
153 mixer_tab       sb16_mix = {
154         MIX_ENT(SOUND_MIXER_VOLUME, 0x30, 7, 5, 0x31, 7, 5),
155         MIX_ENT(SOUND_MIXER_BASS, 0x46, 7, 4, 0x47, 7, 4),
156         MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 7, 4, 0x45, 7, 4),
157         MIX_ENT(SOUND_MIXER_SYNTH, 0x34, 7, 5, 0x35, 7, 5),
158         MIX_ENT(SOUND_MIXER_PCM, 0x32, 7, 5, 0x33, 7, 5),
159         MIX_ENT(SOUND_MIXER_SPEAKER, 0x3b, 7, 2, 0x00, 0, 0),
160         MIX_ENT(SOUND_MIXER_LINE, 0x38, 7, 5, 0x39, 7, 5),
161         MIX_ENT(SOUND_MIXER_MIC, 0x3a, 7, 5, 0x00, 0, 0),
162         MIX_ENT(SOUND_MIXER_CD, 0x36, 7, 5, 0x37, 7, 5),
163         MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0),
164         MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0),
165         MIX_ENT(SOUND_MIXER_RECLEV, 0x3f, 7, 2, 0x40, 7, 2),    /* Obsolete. Use IGAIN */
166         MIX_ENT(SOUND_MIXER_IGAIN, 0x3f, 7, 2, 0x40, 7, 2),
167         MIX_ENT(SOUND_MIXER_OGAIN, 0x41, 7, 2, 0x42, 7, 2)
168 };
169
170 #ifdef SM_GAMES                 /* Master volume is lower and PCM & FM
171                                  * volumes higher than with SB Pro. This
172                                  * improves the sound quality */
173
174 static unsigned short levels[SOUND_MIXER_NRDEVICES] =
175 {
176         0x2020,                 /* Master Volume */
177         0x4b4b,                 /* Bass */
178         0x4b4b,                 /* Treble */
179         0x6464,                 /* FM */
180         0x6464,                 /* PCM */
181         0x4b4b,                 /* PC Speaker */
182         0x4b4b,                 /* Ext Line */
183         0x0000,                 /* Mic */
184         0x4b4b,                 /* CD */
185         0x4b4b,                 /* Recording monitor */
186         0x4b4b,                 /* SB PCM */
187         0x4b4b,                 /* Recording level */
188         0x4b4b,                 /* Input gain */
189 0x4b4b};                        /* Output gain */
190
191 #else                           /* If the user selected just plain SB Pro */
192
193 static unsigned short levels[SOUND_MIXER_NRDEVICES] =
194 {
195         0x5a5a,                 /* Master Volume */
196         0x4b4b,                 /* Bass */
197         0x4b4b,                 /* Treble */
198         0x4b4b,                 /* FM */
199         0x4b4b,                 /* PCM */
200         0x4b4b,                 /* PC Speaker */
201         0x4b4b,                 /* Ext Line */
202         0x1010,                 /* Mic */
203         0x4b4b,                 /* CD */
204         0x4b4b,                 /* Recording monitor */
205         0x4b4b,                 /* SB PCM */
206         0x4b4b,                 /* Recording level */
207         0x4b4b,                 /* Input gain */
208 0x4b4b};                        /* Output gain */
209 #endif                          /* SM_GAMES */
210
211 static unsigned char sb16_recmasks_L[SOUND_MIXER_NRDEVICES] =
212 {
213         0x00,                   /* SOUND_MIXER_VOLUME    */
214         0x00,                   /* SOUND_MIXER_BASS      */
215         0x00,                   /* SOUND_MIXER_TREBLE    */
216         0x40,                   /* SOUND_MIXER_SYNTH     */
217         0x00,                   /* SOUND_MIXER_PCM       */
218         0x00,                   /* SOUND_MIXER_SPEAKER   */
219         0x10,                   /* SOUND_MIXER_LINE      */
220         0x01,                   /* SOUND_MIXER_MIC       */
221         0x04,                   /* SOUND_MIXER_CD        */
222         0x00,                   /* SOUND_MIXER_IMIX      */
223         0x00,                   /* SOUND_MIXER_ALTPCM    */
224         0x00,                   /* SOUND_MIXER_RECLEV    */
225         0x00,                   /* SOUND_MIXER_IGAIN     */
226         0x00                    /* SOUND_MIXER_OGAIN     */
227 };
228
229 static unsigned char sb16_recmasks_R[SOUND_MIXER_NRDEVICES] =
230 {
231         0x00,                   /* SOUND_MIXER_VOLUME    */
232         0x00,                   /* SOUND_MIXER_BASS      */
233         0x00,                   /* SOUND_MIXER_TREBLE    */
234         0x20,                   /* SOUND_MIXER_SYNTH     */
235         0x00,                   /* SOUND_MIXER_PCM       */
236         0x00,                   /* SOUND_MIXER_SPEAKER   */
237         0x08,                   /* SOUND_MIXER_LINE      */
238         0x01,                   /* SOUND_MIXER_MIC       */
239         0x02,                   /* SOUND_MIXER_CD        */
240         0x00,                   /* SOUND_MIXER_IMIX      */
241         0x00,                   /* SOUND_MIXER_ALTPCM    */
242         0x00,                   /* SOUND_MIXER_RECLEV    */
243         0x00,                   /* SOUND_MIXER_IGAIN     */
244         0x00                    /* SOUND_MIXER_OGAIN     */
245 };
246
247 /*
248  * Recording sources (SB Pro)
249  */
250
251 #define SRC_MIC         1       /* Select Microphone recording source */
252 #define SRC_CD          3       /* Select CD recording source */
253 #define SRC_LINE        7       /* Use Line-in for recording source */
254
255 #endif