Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 */ |