1#ifndef __SOUND_OPL3_H
2#define __SOUND_OPL3_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54#include <sound/core.h>
55#include <sound/hwdep.h>
56#include <sound/timer.h>
57#include <sound/seq_midi_emul.h>
58#ifdef CONFIG_SND_SEQUENCER_OSS
59#include <sound/seq_oss.h>
60#include <sound/seq_oss_legacy.h>
61#endif
62#include <sound/seq_device.h>
63#include <sound/asound_fm.h>
64
65
66
67
68
69#define OPL3_REG_TEST 0x01
70#define OPL3_ENABLE_WAVE_SELECT 0x20
71
72#define OPL3_REG_TIMER1 0x02
73#define OPL3_REG_TIMER2 0x03
74#define OPL3_REG_TIMER_CONTROL 0x04
75#define OPL3_IRQ_RESET 0x80
76#define OPL3_TIMER1_MASK 0x40
77#define OPL3_TIMER2_MASK 0x20
78#define OPL3_TIMER1_START 0x01
79#define OPL3_TIMER2_START 0x02
80
81#define OPL3_REG_CONNECTION_SELECT 0x04
82#define OPL3_LEFT_4OP_0 0x01
83#define OPL3_LEFT_4OP_1 0x02
84#define OPL3_LEFT_4OP_2 0x04
85#define OPL3_RIGHT_4OP_0 0x08
86#define OPL3_RIGHT_4OP_1 0x10
87#define OPL3_RIGHT_4OP_2 0x20
88
89#define OPL3_REG_MODE 0x05
90#define OPL3_OPL3_ENABLE 0x01
91#define OPL3_OPL4_ENABLE 0x02
92
93#define OPL3_REG_KBD_SPLIT 0x08
94#define OPL3_COMPOSITE_SINE_WAVE_MODE 0x80
95#define OPL3_KEYBOARD_SPLIT 0x40
96
97#define OPL3_REG_PERCUSSION 0xbd
98#define OPL3_TREMOLO_DEPTH 0x80
99#define OPL3_VIBRATO_DEPTH 0x40
100#define OPL3_PERCUSSION_ENABLE 0x20
101#define OPL3_BASSDRUM_ON 0x10
102#define OPL3_SNAREDRUM_ON 0x08
103#define OPL3_TOMTOM_ON 0x04
104#define OPL3_CYMBAL_ON 0x02
105#define OPL3_HIHAT_ON 0x01
106
107
108
109
110
111
112
113#define OPL3_REG_AM_VIB 0x20
114#define OPL3_TREMOLO_ON 0x80
115#define OPL3_VIBRATO_ON 0x40
116#define OPL3_SUSTAIN_ON 0x20
117#define OPL3_KSR 0x10
118#define OPL3_MULTIPLE_MASK 0x0f
119
120
121
122
123#define OPL3_REG_KSL_LEVEL 0x40
124#define OPL3_KSL_MASK 0xc0
125#define OPL3_TOTAL_LEVEL_MASK 0x3f
126
127
128
129
130#define OPL3_REG_ATTACK_DECAY 0x60
131#define OPL3_ATTACK_MASK 0xf0
132#define OPL3_DECAY_MASK 0x0f
133
134
135
136
137#define OPL3_REG_SUSTAIN_RELEASE 0x80
138#define OPL3_SUSTAIN_MASK 0xf0
139#define OPL3_RELEASE_MASK 0x0f
140
141
142
143
144#define OPL3_REG_WAVE_SELECT 0xe0
145#define OPL3_WAVE_SELECT_MASK 0x07
146
147
148
149
150
151
152
153#define OPL3_REG_FNUM_LOW 0xa0
154
155
156
157
158#define OPL3_REG_KEYON_BLOCK 0xb0
159#define OPL3_KEYON_BIT 0x20
160#define OPL3_BLOCKNUM_MASK 0x1c
161#define OPL3_FNUM_HIGH_MASK 0x03
162
163
164
165
166
167
168
169
170
171
172
173
174
175#define OPL3_REG_FEEDBACK_CONNECTION 0xc0
176#define OPL3_FEEDBACK_MASK 0x0e
177#define OPL3_CONNECTION_BIT 0x01
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212#define OPL3_STEREO_BITS 0x30
213#define OPL3_VOICE_TO_LEFT 0x10
214#define OPL3_VOICE_TO_RIGHT 0x20
215
216
217
218
219
220#define OPL3_LEFT 0x0000
221#define OPL3_RIGHT 0x0100
222
223#define OPL3_HW_AUTO 0x0000
224#define OPL3_HW_OPL2 0x0200
225#define OPL3_HW_OPL3 0x0300
226#define OPL3_HW_OPL3_SV 0x0301
227#define OPL3_HW_OPL3_CS 0x0302
228#define OPL3_HW_OPL3_FM801 0x0303
229#define OPL3_HW_OPL3_CS4281 0x0304
230#define OPL3_HW_OPL4 0x0400
231#define OPL3_HW_OPL4_ML 0x0401
232#define OPL3_HW_MASK 0xff00
233
234#define MAX_OPL2_VOICES 9
235#define MAX_OPL3_VOICES 18
236
237struct snd_opl3;
238
239
240
241
242
243
244struct fm_operator {
245 unsigned char am_vib;
246 unsigned char ksl_level;
247 unsigned char attack_decay;
248 unsigned char sustain_release;
249 unsigned char wave_select;
250} __attribute__((packed));
251
252
253struct fm_instrument {
254 struct fm_operator op[4];
255 unsigned char feedback_connection[2];
256 unsigned char echo_delay;
257 unsigned char echo_atten;
258 unsigned char chorus_spread;
259 unsigned char trnsps;
260 unsigned char fix_dur;
261 unsigned char modes;
262 unsigned char fix_key;
263};
264
265
266#define FM_PATCH_OPL2 0x01
267#define FM_PATCH_OPL3 0x02
268
269
270struct fm_patch {
271 unsigned char prog;
272 unsigned char bank;
273 unsigned char type;
274 struct fm_instrument inst;
275 char name[24];
276 struct fm_patch *next;
277};
278
279
280
281
282
283struct snd_opl3_voice {
284 int state;
285#define SNDRV_OPL3_ST_OFF 0
286#define SNDRV_OPL3_ST_ON_2OP 1
287#define SNDRV_OPL3_ST_ON_4OP 2
288#define SNDRV_OPL3_ST_NOT_AVAIL -1
289
290 unsigned int time;
291 unsigned char note;
292
293 unsigned long note_off;
294 int note_off_check;
295
296 unsigned char keyon_reg;
297
298 struct snd_midi_channel *chan;
299};
300
301struct snd_opl3 {
302 unsigned long l_port;
303 unsigned long r_port;
304 struct resource *res_l_port;
305 struct resource *res_r_port;
306 unsigned short hardware;
307
308 void (*command) (struct snd_opl3 * opl3, unsigned short cmd, unsigned char val);
309 unsigned short timer_enable;
310 int seq_dev_num;
311 struct snd_timer *timer1;
312 struct snd_timer *timer2;
313 spinlock_t timer_lock;
314
315 void *private_data;
316 void (*private_free)(struct snd_opl3 *);
317
318 struct snd_hwdep *hwdep;
319 spinlock_t reg_lock;
320 struct snd_card *card;
321 unsigned char fm_mode;
322 unsigned char rhythm;
323 unsigned char max_voices;
324#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
325#define SNDRV_OPL3_MODE_SYNTH 0
326#define SNDRV_OPL3_MODE_SEQ 1
327 int synth_mode;
328 int seq_client;
329
330 struct snd_seq_device *seq_dev;
331 struct snd_midi_channel_set * chset;
332
333#ifdef CONFIG_SND_SEQUENCER_OSS
334 struct snd_seq_device *oss_seq_dev;
335 struct snd_midi_channel_set * oss_chset;
336#endif
337
338#define OPL3_PATCH_HASH_SIZE 32
339 struct fm_patch *patch_table[OPL3_PATCH_HASH_SIZE];
340
341 struct snd_opl3_voice voices[MAX_OPL3_VOICES];
342 int use_time;
343
344 unsigned short connection_reg;
345 unsigned char drum_reg;
346
347 spinlock_t voice_lock;
348
349 struct timer_list tlist;
350 int sys_timer_status;
351 spinlock_t sys_timer_lock;
352#endif
353};
354
355
356void snd_opl3_interrupt(struct snd_hwdep * hw);
357int snd_opl3_new(struct snd_card *card, unsigned short hardware,
358 struct snd_opl3 **ropl3);
359int snd_opl3_init(struct snd_opl3 *opl3);
360int snd_opl3_create(struct snd_card *card,
361 unsigned long l_port, unsigned long r_port,
362 unsigned short hardware,
363 int integrated,
364 struct snd_opl3 ** opl3);
365int snd_opl3_timer_new(struct snd_opl3 * opl3, int timer1_dev, int timer2_dev);
366int snd_opl3_hwdep_new(struct snd_opl3 * opl3, int device, int seq_device,
367 struct snd_hwdep ** rhwdep);
368
369
370int snd_opl3_open(struct snd_hwdep * hw, struct file *file);
371int snd_opl3_ioctl(struct snd_hwdep * hw, struct file *file,
372 unsigned int cmd, unsigned long arg);
373int snd_opl3_release(struct snd_hwdep * hw, struct file *file);
374
375void snd_opl3_reset(struct snd_opl3 * opl3);
376
377#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
378long snd_opl3_write(struct snd_hwdep *hw, const char __user *buf, long count,
379 loff_t *offset);
380int snd_opl3_load_patch(struct snd_opl3 *opl3,
381 int prog, int bank, int type,
382 const char *name,
383 const unsigned char *ext,
384 const unsigned char *data);
385struct fm_patch *snd_opl3_find_patch(struct snd_opl3 *opl3, int prog, int bank,
386 int create_patch);
387void snd_opl3_clear_patches(struct snd_opl3 *opl3);
388#else
389#define snd_opl3_write NULL
390static inline void snd_opl3_clear_patches(struct snd_opl3 *opl3) {}
391#endif
392
393#endif
394