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