diff options
Diffstat (limited to 'sound/drivers/opl4/opl4_local.h')
-rw-r--r-- | sound/drivers/opl4/opl4_local.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/sound/drivers/opl4/opl4_local.h b/sound/drivers/opl4/opl4_local.h new file mode 100644 index 000000000000..c455680843f6 --- /dev/null +++ b/sound/drivers/opl4/opl4_local.h | |||
@@ -0,0 +1,232 @@ | |||
1 | /* | ||
2 | * Local definitions for the OPL4 driver | ||
3 | * | ||
4 | * Copyright (c) 2003 by Clemens Ladisch <clemens@ladisch.de> | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Redistribution and use in source and binary forms, with or without | ||
8 | * modification, are permitted provided that the following conditions | ||
9 | * are met: | ||
10 | * 1. Redistributions of source code must retain the above copyright | ||
11 | * notice, this list of conditions, and the following disclaimer, | ||
12 | * without modification. | ||
13 | * 2. The name of the author may not be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * Alternatively, this software may be distributed and/or modified under the | ||
17 | * terms of the GNU General Public License as published by the Free Software | ||
18 | * Foundation; either version 2 of the License, or (at your option) any later | ||
19 | * version. | ||
20 | * | ||
21 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR | ||
25 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
31 | * SUCH DAMAGE. | ||
32 | */ | ||
33 | |||
34 | #ifndef __OPL4_LOCAL_H | ||
35 | #define __OPL4_LOCAL_H | ||
36 | |||
37 | #include <sound/opl4.h> | ||
38 | |||
39 | /* | ||
40 | * Register numbers | ||
41 | */ | ||
42 | |||
43 | #define OPL4_REG_TEST0 0x00 | ||
44 | #define OPL4_REG_TEST1 0x01 | ||
45 | |||
46 | #define OPL4_REG_MEMORY_CONFIGURATION 0x02 | ||
47 | #define OPL4_MODE_BIT 0x01 | ||
48 | #define OPL4_MTYPE_BIT 0x02 | ||
49 | #define OPL4_TONE_HEADER_MASK 0x1c | ||
50 | #define OPL4_DEVICE_ID_MASK 0xe0 | ||
51 | |||
52 | #define OPL4_REG_MEMORY_ADDRESS_HIGH 0x03 | ||
53 | #define OPL4_REG_MEMORY_ADDRESS_MID 0x04 | ||
54 | #define OPL4_REG_MEMORY_ADDRESS_LOW 0x05 | ||
55 | #define OPL4_REG_MEMORY_DATA 0x06 | ||
56 | |||
57 | /* | ||
58 | * Offsets to the register banks for voices. To get the | ||
59 | * register number just add the voice number to the bank offset. | ||
60 | * | ||
61 | * Wave Table Number low bits (0x08 to 0x1F) | ||
62 | */ | ||
63 | #define OPL4_REG_TONE_NUMBER 0x08 | ||
64 | |||
65 | /* Wave Table Number high bit, F-Number low bits (0x20 to 0x37) */ | ||
66 | #define OPL4_REG_F_NUMBER 0x20 | ||
67 | #define OPL4_TONE_NUMBER_BIT8 0x01 | ||
68 | #define OPL4_F_NUMBER_LOW_MASK 0xfe | ||
69 | |||
70 | /* F-Number high bits, Octave, Pseudo-Reverb (0x38 to 0x4F) */ | ||
71 | #define OPL4_REG_OCTAVE 0x38 | ||
72 | #define OPL4_F_NUMBER_HIGH_MASK 0x07 | ||
73 | #define OPL4_BLOCK_MASK 0xf0 | ||
74 | #define OPL4_PSEUDO_REVERB_BIT 0x08 | ||
75 | |||
76 | /* Total Level, Level Direct (0x50 to 0x67) */ | ||
77 | #define OPL4_REG_LEVEL 0x50 | ||
78 | #define OPL4_TOTAL_LEVEL_MASK 0xfe | ||
79 | #define OPL4_LEVEL_DIRECT_BIT 0x01 | ||
80 | |||
81 | /* Key On, Damp, LFO RST, CH, Panpot (0x68 to 0x7F) */ | ||
82 | #define OPL4_REG_MISC 0x68 | ||
83 | #define OPL4_KEY_ON_BIT 0x80 | ||
84 | #define OPL4_DAMP_BIT 0x40 | ||
85 | #define OPL4_LFO_RESET_BIT 0x20 | ||
86 | #define OPL4_OUTPUT_CHANNEL_BIT 0x10 | ||
87 | #define OPL4_PAN_POT_MASK 0x0f | ||
88 | |||
89 | /* LFO, VIB (0x80 to 0x97) */ | ||
90 | #define OPL4_REG_LFO_VIBRATO 0x80 | ||
91 | #define OPL4_LFO_FREQUENCY_MASK 0x38 | ||
92 | #define OPL4_VIBRATO_DEPTH_MASK 0x07 | ||
93 | #define OPL4_CHORUS_SEND_MASK 0xc0 /* ML only */ | ||
94 | |||
95 | /* Attack / Decay 1 rate (0x98 to 0xAF) */ | ||
96 | #define OPL4_REG_ATTACK_DECAY1 0x98 | ||
97 | #define OPL4_ATTACK_RATE_MASK 0xf0 | ||
98 | #define OPL4_DECAY1_RATE_MASK 0x0f | ||
99 | |||
100 | /* Decay level / 2 rate (0xB0 to 0xC7) */ | ||
101 | #define OPL4_REG_LEVEL_DECAY2 0xb0 | ||
102 | #define OPL4_DECAY_LEVEL_MASK 0xf0 | ||
103 | #define OPL4_DECAY2_RATE_MASK 0x0f | ||
104 | |||
105 | /* Release rate / Rate correction (0xC8 to 0xDF) */ | ||
106 | #define OPL4_REG_RELEASE_CORRECTION 0xc8 | ||
107 | #define OPL4_RELEASE_RATE_MASK 0x0f | ||
108 | #define OPL4_RATE_INTERPOLATION_MASK 0xf0 | ||
109 | |||
110 | /* AM (0xE0 to 0xF7) */ | ||
111 | #define OPL4_REG_TREMOLO 0xe0 | ||
112 | #define OPL4_TREMOLO_DEPTH_MASK 0x07 | ||
113 | #define OPL4_REVERB_SEND_MASK 0xe0 /* ML only */ | ||
114 | |||
115 | /* Mixer */ | ||
116 | #define OPL4_REG_MIX_CONTROL_FM 0xf8 | ||
117 | #define OPL4_REG_MIX_CONTROL_PCM 0xf9 | ||
118 | #define OPL4_MIX_LEFT_MASK 0x07 | ||
119 | #define OPL4_MIX_RIGHT_MASK 0x38 | ||
120 | |||
121 | #define OPL4_REG_ATC 0xfa | ||
122 | #define OPL4_ATC_BIT 0x01 /* ???, ML only */ | ||
123 | |||
124 | /* bits in the OPL3 Status register */ | ||
125 | #define OPL4_STATUS_BUSY 0x01 | ||
126 | #define OPL4_STATUS_LOAD 0x02 | ||
127 | |||
128 | |||
129 | #define OPL4_MAX_VOICES 24 | ||
130 | |||
131 | #define SNDRV_SEQ_DEV_ID_OPL4 "opl4-synth" | ||
132 | |||
133 | |||
134 | typedef struct opl4_sound { | ||
135 | u16 tone; | ||
136 | s16 pitch_offset; | ||
137 | u8 key_scaling; | ||
138 | s8 panpot; | ||
139 | u8 vibrato; | ||
140 | u8 tone_attenuate; | ||
141 | u8 volume_factor; | ||
142 | u8 reg_lfo_vibrato; | ||
143 | u8 reg_attack_decay1; | ||
144 | u8 reg_level_decay2; | ||
145 | u8 reg_release_correction; | ||
146 | u8 reg_tremolo; | ||
147 | } opl4_sound_t; | ||
148 | |||
149 | typedef struct opl4_region { | ||
150 | u8 key_min, key_max; | ||
151 | opl4_sound_t sound; | ||
152 | } opl4_region_t; | ||
153 | |||
154 | typedef struct opl4_region_ptr { | ||
155 | int count; | ||
156 | const opl4_region_t *regions; | ||
157 | } opl4_region_ptr_t; | ||
158 | |||
159 | typedef struct opl4_voice { | ||
160 | struct list_head list; | ||
161 | int number; | ||
162 | snd_midi_channel_t *chan; | ||
163 | int note; | ||
164 | int velocity; | ||
165 | const opl4_sound_t *sound; | ||
166 | u8 level_direct; | ||
167 | u8 reg_f_number; | ||
168 | u8 reg_misc; | ||
169 | u8 reg_lfo_vibrato; | ||
170 | } opl4_voice_t; | ||
171 | |||
172 | struct opl4 { | ||
173 | unsigned long fm_port; | ||
174 | unsigned long pcm_port; | ||
175 | struct resource *res_fm_port; | ||
176 | struct resource *res_pcm_port; | ||
177 | unsigned short hardware; | ||
178 | spinlock_t reg_lock; | ||
179 | snd_card_t *card; | ||
180 | |||
181 | #ifdef CONFIG_PROC_FS | ||
182 | snd_info_entry_t *proc_entry; | ||
183 | int memory_access; | ||
184 | #endif | ||
185 | struct semaphore access_mutex; | ||
186 | |||
187 | #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE) | ||
188 | int used; | ||
189 | |||
190 | int seq_dev_num; | ||
191 | int seq_client; | ||
192 | snd_seq_device_t *seq_dev; | ||
193 | |||
194 | snd_midi_channel_set_t *chset; | ||
195 | opl4_voice_t voices[OPL4_MAX_VOICES]; | ||
196 | struct list_head off_voices; | ||
197 | struct list_head on_voices; | ||
198 | #endif | ||
199 | }; | ||
200 | |||
201 | /* opl4_lib.c */ | ||
202 | void snd_opl4_write(opl4_t *opl4, u8 reg, u8 value); | ||
203 | u8 snd_opl4_read(opl4_t *opl4, u8 reg); | ||
204 | void snd_opl4_read_memory(opl4_t *opl4, char *buf, int offset, int size); | ||
205 | void snd_opl4_write_memory(opl4_t *opl4, const char *buf, int offset, int size); | ||
206 | |||
207 | /* opl4_mixer.c */ | ||
208 | int snd_opl4_create_mixer(opl4_t *opl4); | ||
209 | |||
210 | #ifdef CONFIG_PROC_FS | ||
211 | /* opl4_proc.c */ | ||
212 | int snd_opl4_create_proc(opl4_t *opl4); | ||
213 | void snd_opl4_free_proc(opl4_t *opl4); | ||
214 | #endif | ||
215 | |||
216 | /* opl4_seq.c */ | ||
217 | extern int volume_boost; | ||
218 | |||
219 | /* opl4_synth.c */ | ||
220 | void snd_opl4_synth_reset(opl4_t *opl4); | ||
221 | void snd_opl4_synth_shutdown(opl4_t *opl4); | ||
222 | void snd_opl4_note_on(void *p, int note, int vel, snd_midi_channel_t *chan); | ||
223 | void snd_opl4_note_off(void *p, int note, int vel, snd_midi_channel_t *chan); | ||
224 | void snd_opl4_terminate_note(void *p, int note, snd_midi_channel_t *chan); | ||
225 | void snd_opl4_control(void *p, int type, snd_midi_channel_t *chan); | ||
226 | void snd_opl4_sysex(void *p, unsigned char *buf, int len, int parsed, snd_midi_channel_set_t *chset); | ||
227 | |||
228 | /* yrw801.c */ | ||
229 | int snd_yrw801_detect(opl4_t *opl4); | ||
230 | extern const opl4_region_ptr_t snd_yrw801_regions[]; | ||
231 | |||
232 | #endif /* __OPL4_LOCAL_H */ | ||