1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/init.h>
27#include <linux/module.h>
28#include <linux/delay.h>
29
30
31
32
33
34
35#include "sound_config.h"
36
37#include "opl3_hw.h"
38
39#define MAX_VOICE 18
40#define OFFS_4OP 11
41
42struct voice_info
43{
44 unsigned char keyon_byte;
45 long bender;
46 long bender_range;
47 unsigned long orig_freq;
48 unsigned long current_freq;
49 int volume;
50 int mode;
51 int panning;
52};
53
54typedef struct opl_devinfo
55{
56 int base;
57 int left_io, right_io;
58 int nr_voice;
59 int lv_map[MAX_VOICE];
60
61 struct voice_info voc[MAX_VOICE];
62 struct voice_alloc_info *v_alloc;
63 struct channel_info *chn_info;
64
65 struct sbi_instrument i_map[SBFM_MAXINSTR];
66 struct sbi_instrument *act_i[MAX_VOICE];
67
68 struct synth_info fm_info;
69
70 int busy;
71 int model;
72 unsigned char cmask;
73
74 int is_opl4;
75} opl_devinfo;
76
77static struct opl_devinfo *devc = NULL;
78
79static int detected_model;
80
81static int store_instr(int instr_no, struct sbi_instrument *instr);
82static void freq_to_fnum(int freq, int *block, int *fnum);
83static void opl3_command(int io_addr, unsigned int addr, unsigned int val);
84static int opl3_kill_note(int dev, int voice, int note, int velocity);
85
86static void enter_4op_mode(void)
87{
88 int i;
89 static int v4op[MAX_VOICE] = {
90 0, 1, 2, 9, 10, 11, 6, 7, 8, 15, 16, 17
91 };
92
93 devc->cmask = 0x3f;
94 opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x3f);
95
96 for (i = 0; i < 3; i++)
97 pv_map[i].voice_mode = 4;
98 for (i = 3; i < 6; i++)
99 pv_map[i].voice_mode = 0;
100
101 for (i = 9; i < 12; i++)
102 pv_map[i].voice_mode = 4;
103 for (i = 12; i < 15; i++)
104 pv_map[i].voice_mode = 0;
105
106 for (i = 0; i < 12; i++)
107 devc->lv_map[i] = v4op[i];
108 devc->v_alloc->max_voice = devc->nr_voice = 12;
109}
110
111static int opl3_ioctl(int dev, unsigned int cmd, void __user * arg)
112{
113 struct sbi_instrument ins;
114
115 switch (cmd) {
116 case SNDCTL_FM_LOAD_INSTR:
117 printk(KERN_WARNING "Warning: Obsolete ioctl(SNDCTL_FM_LOAD_INSTR) used. Fix the program.\n");
118 if (copy_from_user(&ins, arg, sizeof(ins)))
119 return -EFAULT;
120 if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR) {
121 printk(KERN_WARNING "FM Error: Invalid instrument number %d\n", ins.channel);
122 return -EINVAL;
123 }
124 return store_instr(ins.channel, &ins);
125
126 case SNDCTL_SYNTH_INFO:
127 devc->fm_info.nr_voices = (devc->nr_voice == 12) ? 6 : devc->nr_voice;
128 if (copy_to_user(arg, &devc->fm_info, sizeof(devc->fm_info)))
129 return -EFAULT;
130 return 0;
131
132 case SNDCTL_SYNTH_MEMAVL:
133 return 0x7fffffff;
134
135 case SNDCTL_FM_4OP_ENABLE:
136 if (devc->model == 2)
137 enter_4op_mode();
138 return 0;
139
140 default:
141 return -EINVAL;
142 }
143}
144
145static int opl3_detect(int ioaddr)
146{
147
148
149
150
151
152
153
154
155
156
157
158 unsigned char stat1, signature;
159 int i;
160
161 if (devc != NULL)
162 {
163 printk(KERN_ERR "opl3: Only one OPL3 supported.\n");
164 return 0;
165 }
166
167 devc = kzalloc(sizeof(*devc), GFP_KERNEL);
168
169 if (devc == NULL)
170 {
171 printk(KERN_ERR "opl3: Can't allocate memory for the device control "
172 "structure \n ");
173 return 0;
174 }
175
176 strcpy(devc->fm_info.name, "OPL2");
177
178 if (!request_region(ioaddr, 4, devc->fm_info.name)) {
179 printk(KERN_WARNING "opl3: I/O port 0x%x already in use\n", ioaddr);
180 goto cleanup_devc;
181 }
182
183 devc->base = ioaddr;
184
185
186 opl3_command(ioaddr, TIMER_CONTROL_REGISTER, TIMER1_MASK | TIMER2_MASK);
187
188
189 opl3_command(ioaddr, TIMER_CONTROL_REGISTER, IRQ_RESET);
190
191 signature = stat1 = inb(ioaddr);
192
193 if (signature != 0x00 && signature != 0x06 && signature != 0x02 &&
194 signature != 0x0f)
195 {
196 MDB(printk(KERN_INFO "OPL3 not detected %x\n", signature));
197 goto cleanup_region;
198 }
199
200 if (signature == 0x06)
201 {
202 detected_model = 2;
203 }
204 else if (signature == 0x00 || signature == 0x0f)
205 {
206 unsigned char tmp;
207
208 detected_model = 3;
209
210
211
212
213
214
215
216 opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0x00);
217 opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, OPL3_ENABLE | OPL4_ENABLE);
218
219 if ((tmp = inb(ioaddr)) == 0x02)
220 {
221 detected_model = 4;
222 }
223
224 if (request_region(ioaddr - 8, 2, "OPL4"))
225 {
226 int tmp;
227
228 outb((0x02), ioaddr - 8);
229 udelay(10);
230 tmp = inb(ioaddr - 7);
231 udelay(10);
232
233 if (tmp == 0x20)
234 {
235 detected_model = 4;
236 outb((0xF8), ioaddr - 8);
237 udelay(10);
238 outb((0x1B), ioaddr - 7);
239 udelay(10);
240 }
241 else
242 {
243 release_region(ioaddr - 8, 2);
244 detected_model = 3;
245 }
246 }
247 opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0);
248 }
249 for (i = 0; i < 9; i++)
250 opl3_command(ioaddr, KEYON_BLOCK + i, 0);
251
252
253
254 opl3_command(ioaddr, TEST_REGISTER, ENABLE_WAVE_SELECT);
255 opl3_command(ioaddr, PERCOSSION_REGISTER, 0x00);
256
257
258 return 1;
259cleanup_region:
260 release_region(ioaddr, 4);
261cleanup_devc:
262 kfree(devc);
263 devc = NULL;
264 return 0;
265}
266
267static int opl3_kill_note (int devno, int voice, int note, int velocity)
268{
269 struct physical_voice_info *map;
270
271 if (voice < 0 || voice >= devc->nr_voice)
272 return 0;
273
274 devc->v_alloc->map[voice] = 0;
275
276 map = &pv_map[devc->lv_map[voice]];
277 DEB(printk("Kill note %d\n", voice));
278
279 if (map->voice_mode == 0)
280 return 0;
281
282 opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, devc->voc[voice].keyon_byte & ~0x20);
283 devc->voc[voice].keyon_byte = 0;
284 devc->voc[voice].bender = 0;
285 devc->voc[voice].volume = 64;
286 devc->voc[voice].panning = 0xffff;
287 devc->voc[voice].bender_range = 200;
288 devc->voc[voice].orig_freq = 0;
289 devc->voc[voice].current_freq = 0;
290 devc->voc[voice].mode = 0;
291 return 0;
292}
293
294#define HIHAT 0
295#define CYMBAL 1
296#define TOMTOM 2
297#define SNARE 3
298#define BDRUM 4
299#define UNDEFINED TOMTOM
300#define DEFAULT TOMTOM
301
302static int store_instr(int instr_no, struct sbi_instrument *instr)
303{
304 if (instr->key != FM_PATCH && (instr->key != OPL3_PATCH || devc->model != 2))
305 printk(KERN_WARNING "FM warning: Invalid patch format field (key) 0x%x\n", instr->key);
306 memcpy((char *) &(devc->i_map[instr_no]), (char *) instr, sizeof(*instr));
307 return 0;
308}
309
310static int opl3_set_instr (int dev, int voice, int instr_no)
311{
312 if (voice < 0 || voice >= devc->nr_voice)
313 return 0;
314 if (instr_no < 0 || instr_no >= SBFM_MAXINSTR)
315 instr_no = 0;
316
317 devc->act_i[voice] = &devc->i_map[instr_no];
318 return 0;
319}
320
321
322
323
324
325
326
327
328
329
330
331static char fm_volume_table[128] =
332{
333 -64, -48, -40, -35, -32, -29, -27, -26,
334 -24, -23, -21, -20, -19, -18, -18, -17,
335 -16, -15, -15, -14, -13, -13, -12, -12,
336 -11, -11, -10, -10, -10, -9, -9, -8,
337 -8, -8, -7, -7, -7, -6, -6, -6,
338 -5, -5, -5, -5, -4, -4, -4, -4,
339 -3, -3, -3, -3, -2, -2, -2, -2,
340 -2, -1, -1, -1, -1, 0, 0, 0,
341 0, 0, 0, 1, 1, 1, 1, 1,
342 1, 2, 2, 2, 2, 2, 2, 2,
343 3, 3, 3, 3, 3, 3, 3, 4,
344 4, 4, 4, 4, 4, 4, 4, 5,
345 5, 5, 5, 5, 5, 5, 5, 5,
346 6, 6, 6, 6, 6, 6, 6, 6,
347 6, 7, 7, 7, 7, 7, 7, 7,
348 7, 7, 7, 8, 8, 8, 8, 8
349};
350
351static void calc_vol(unsigned char *regbyte, int volume, int main_vol)
352{
353 int level = (~*regbyte & 0x3f);
354
355 if (main_vol > 127)
356 main_vol = 127;
357 volume = (volume * main_vol) / 127;
358
359 if (level)
360 level += fm_volume_table[volume];
361
362 if (level > 0x3f)
363 level = 0x3f;
364 if (level < 0)
365 level = 0;
366
367 *regbyte = (*regbyte & 0xc0) | (~level & 0x3f);
368}
369
370static void set_voice_volume(int voice, int volume, int main_vol)
371{
372 unsigned char vol1, vol2, vol3, vol4;
373 struct sbi_instrument *instr;
374 struct physical_voice_info *map;
375
376 if (voice < 0 || voice >= devc->nr_voice)
377 return;
378
379 map = &pv_map[devc->lv_map[voice]];
380 instr = devc->act_i[voice];
381
382 if (!instr)
383 instr = &devc->i_map[0];
384
385 if (instr->channel < 0)
386 return;
387
388 if (devc->voc[voice].mode == 0)
389 return;
390
391 if (devc->voc[voice].mode == 2)
392 {
393 vol1 = instr->operators[2];
394 vol2 = instr->operators[3];
395 if ((instr->operators[10] & 0x01))
396 {
397 calc_vol(&vol1, volume, main_vol);
398 calc_vol(&vol2, volume, main_vol);
399 }
400 else
401 {
402 calc_vol(&vol2, volume, main_vol);
403 }
404 opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
405 opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
406 }
407 else
408 {
409
410
411 int connection;
412
413 vol1 = instr->operators[2];
414 vol2 = instr->operators[3];
415 vol3 = instr->operators[OFFS_4OP + 2];
416 vol4 = instr->operators[OFFS_4OP + 3];
417
418
419
420
421
422
423 connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01);
424
425 switch (connection)
426 {
427 case 0:
428 calc_vol(&vol4, volume, main_vol);
429 break;
430
431 case 1:
432 calc_vol(&vol2, volume, main_vol);
433 calc_vol(&vol4, volume, main_vol);
434 break;
435
436 case 2:
437 calc_vol(&vol1, volume, main_vol);
438 calc_vol(&vol4, volume, main_vol);
439 break;
440
441 case 3:
442 calc_vol(&vol1, volume, main_vol);
443 calc_vol(&vol3, volume, main_vol);
444 calc_vol(&vol4, volume, main_vol);
445 break;
446
447 default:
448 ;
449 }
450 opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
451 opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
452 opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], vol3);
453 opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], vol4);
454 }
455}
456
457static int opl3_start_note (int dev, int voice, int note, int volume)
458{
459 unsigned char data, fpc;
460 int block, fnum, freq, voice_mode, pan;
461 struct sbi_instrument *instr;
462 struct physical_voice_info *map;
463
464 if (voice < 0 || voice >= devc->nr_voice)
465 return 0;
466
467 map = &pv_map[devc->lv_map[voice]];
468 pan = devc->voc[voice].panning;
469
470 if (map->voice_mode == 0)
471 return 0;
472
473 if (note == 255)
474
475
476 {
477 set_voice_volume(voice, volume, devc->voc[voice].volume);
478 return 0;
479 }
480
481
482
483
484
485 opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], 0xff);
486
487
488
489
490 opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], 0xff);
491
492
493
494
495 if (map->voice_mode == 4)
496 {
497 opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], 0xff);
498 opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], 0xff);
499 }
500
501 opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, 0x00);
502
503
504
505
506 instr = devc->act_i[voice];
507
508 if (!instr)
509 instr = &devc->i_map[0];
510
511 if (instr->channel < 0)
512 {
513 printk(KERN_WARNING "opl3: Initializing voice %d with undefined instrument\n", voice);
514 return 0;
515 }
516
517 if (map->voice_mode == 2 && instr->key == OPL3_PATCH)
518 return 0;
519
520
521
522 voice_mode = map->voice_mode;
523
524 if (voice_mode == 4)
525 {
526 int voice_shift;
527
528 voice_shift = (map->ioaddr == devc->left_io) ? 0 : 3;
529 voice_shift += map->voice_num;
530
531 if (instr->key != OPL3_PATCH)
532
533
534 {
535 voice_mode = 2;
536 devc->cmask &= ~(1 << voice_shift);
537 }
538 else
539 {
540 devc->cmask |= (1 << voice_shift);
541 }
542
543 opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
544 }
545
546
547
548
549
550 opl3_command(map->ioaddr, AM_VIB + map->op[0], instr->operators[0]);
551 opl3_command(map->ioaddr, AM_VIB + map->op[1], instr->operators[1]);
552
553
554
555
556
557 opl3_command(map->ioaddr, ATTACK_DECAY + map->op[0], instr->operators[4]);
558 opl3_command(map->ioaddr, ATTACK_DECAY + map->op[1], instr->operators[5]);
559
560
561
562
563
564 opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[0], instr->operators[6]);
565 opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[1], instr->operators[7]);
566
567
568
569
570
571 opl3_command(map->ioaddr, WAVE_SELECT + map->op[0], instr->operators[8]);
572 opl3_command(map->ioaddr, WAVE_SELECT + map->op[1], instr->operators[9]);
573
574
575
576
577
578 fpc = instr->operators[10];
579
580 if (pan != 0xffff)
581 {
582 fpc &= ~STEREO_BITS;
583 if (pan < -64)
584 fpc |= VOICE_TO_LEFT;
585 else
586 if (pan > 64)
587 fpc |= VOICE_TO_RIGHT;
588 else
589 fpc |= (VOICE_TO_LEFT | VOICE_TO_RIGHT);
590 }
591
592 if (!(fpc & 0x30))
593 fpc |= 0x30;
594
595
596 opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num, fpc);
597
598
599
600
601
602 if (voice_mode == 4)
603 {
604
605
606
607
608 opl3_command(map->ioaddr, AM_VIB + map->op[2], instr->operators[OFFS_4OP + 0]);
609 opl3_command(map->ioaddr, AM_VIB + map->op[3], instr->operators[OFFS_4OP + 1]);
610
611
612
613
614
615 opl3_command(map->ioaddr, ATTACK_DECAY + map->op[2], instr->operators[OFFS_4OP + 4]);
616 opl3_command(map->ioaddr, ATTACK_DECAY + map->op[3], instr->operators[OFFS_4OP + 5]);
617
618
619
620
621
622 opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[2], instr->operators[OFFS_4OP + 6]);
623 opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[3], instr->operators[OFFS_4OP + 7]);
624
625
626
627
628
629 opl3_command(map->ioaddr, WAVE_SELECT + map->op[2], instr->operators[OFFS_4OP + 8]);
630 opl3_command(map->ioaddr, WAVE_SELECT + map->op[3], instr->operators[OFFS_4OP + 9]);
631
632
633
634
635
636 fpc = instr->operators[OFFS_4OP + 10];
637 if (!(fpc & 0x30))
638 fpc |= 0x30;
639
640
641 opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num + 3, fpc);
642 }
643
644 devc->voc[voice].mode = voice_mode;
645 set_voice_volume(voice, volume, devc->voc[voice].volume);
646
647 freq = devc->voc[voice].orig_freq = note_to_freq(note) / 1000;
648
649
650
651
652
653
654 freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range, 0);
655 devc->voc[voice].current_freq = freq;
656
657 freq_to_fnum(freq, &block, &fnum);
658
659
660
661
662
663 data = fnum & 0xff;
664
665
666 opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data);
667
668 data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3);
669 devc->voc[voice].keyon_byte = data;
670 opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data);
671 if (voice_mode == 4)
672 opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num + 3, data);
673
674 return 0;
675}
676
677static void freq_to_fnum (int freq, int *block, int *fnum)
678{
679 int f, octave;
680
681
682
683
684
685
686
687
688 f = freq;
689
690 octave = 5;
691
692 if (f == 0)
693 octave = 0;
694 else if (f < 261)
695 {
696 while (f < 261)
697 {
698 octave--;
699 f <<= 1;
700 }
701 }
702 else if (f > 493)
703 {
704 while (f > 493)
705 {
706 octave++;
707 f >>= 1;
708 }
709 }
710
711 if (octave > 7)
712 octave = 7;
713
714 *fnum = freq * (1 << (20 - octave)) / 49716;
715 *block = octave;
716}
717
718static void opl3_command (int io_addr, unsigned int addr, unsigned int val)
719{
720 int i;
721
722
723
724
725
726
727 outb(((unsigned char) (addr & 0xff)), io_addr);
728
729 if (devc->model != 2)
730 udelay(10);
731 else
732 for (i = 0; i < 2; i++)
733 inb(io_addr);
734
735 outb(((unsigned char) (val & 0xff)), io_addr + 1);
736
737 if (devc->model != 2)
738 udelay(30);
739 else
740 for (i = 0; i < 2; i++)
741 inb(io_addr);
742}
743
744static void opl3_reset(int devno)
745{
746 int i;
747
748 for (i = 0; i < 18; i++)
749 devc->lv_map[i] = i;
750
751 for (i = 0; i < devc->nr_voice; i++)
752 {
753 opl3_command(pv_map[devc->lv_map[i]].ioaddr,
754 KSL_LEVEL + pv_map[devc->lv_map[i]].op[0], 0xff);
755
756 opl3_command(pv_map[devc->lv_map[i]].ioaddr,
757 KSL_LEVEL + pv_map[devc->lv_map[i]].op[1], 0xff);
758
759 if (pv_map[devc->lv_map[i]].voice_mode == 4)
760 {
761 opl3_command(pv_map[devc->lv_map[i]].ioaddr,
762 KSL_LEVEL + pv_map[devc->lv_map[i]].op[2], 0xff);
763
764 opl3_command(pv_map[devc->lv_map[i]].ioaddr,
765 KSL_LEVEL + pv_map[devc->lv_map[i]].op[3], 0xff);
766 }
767
768 opl3_kill_note(devno, i, 0, 64);
769 }
770
771 if (devc->model == 2)
772 {
773 devc->v_alloc->max_voice = devc->nr_voice = 18;
774
775 for (i = 0; i < 18; i++)
776 pv_map[i].voice_mode = 2;
777
778 }
779}
780
781static int opl3_open(int dev, int mode)
782{
783 int i;
784
785 if (devc->busy)
786 return -EBUSY;
787 devc->busy = 1;
788
789 devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
790 devc->v_alloc->timestamp = 0;
791
792 for (i = 0; i < 18; i++)
793 {
794 devc->v_alloc->map[i] = 0;
795 devc->v_alloc->alloc_times[i] = 0;
796 }
797
798 devc->cmask = 0x00;
799
800
801 if (devc->model == 2)
802 opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
803 return 0;
804}
805
806static void opl3_close(int dev)
807{
808 devc->busy = 0;
809 devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
810
811 devc->fm_info.nr_drums = 0;
812 devc->fm_info.perc_mode = 0;
813
814 opl3_reset(dev);
815}
816
817static void opl3_hw_control(int dev, unsigned char *event)
818{
819}
820
821static int opl3_load_patch(int dev, int format, const char __user *addr,
822 int offs, int count, int pmgr_flag)
823{
824 struct sbi_instrument ins;
825
826 if (count <sizeof(ins))
827 {
828 printk(KERN_WARNING "FM Error: Patch record too short\n");
829 return -EINVAL;
830 }
831
832
833
834
835
836 if(copy_from_user(&((char *) &ins)[offs], addr + offs, sizeof(ins) - offs))
837 return -EFAULT;
838
839 if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR)
840 {
841 printk(KERN_WARNING "FM Error: Invalid instrument number %d\n", ins.channel);
842 return -EINVAL;
843 }
844 ins.key = format;
845
846 return store_instr(ins.channel, &ins);
847}
848
849static void opl3_panning(int dev, int voice, int value)
850{
851 devc->voc[voice].panning = value;
852}
853
854static void opl3_volume_method(int dev, int mode)
855{
856}
857
858#define SET_VIBRATO(cell) { \
859 tmp = instr->operators[(cell-1)+(((cell-1)/2)*OFFS_4OP)]; \
860 if (pressure > 110) \
861 tmp |= 0x40; \
862 opl3_command (map->ioaddr, AM_VIB + map->op[cell-1], tmp);}
863
864static void opl3_aftertouch(int dev, int voice, int pressure)
865{
866 int tmp;
867 struct sbi_instrument *instr;
868 struct physical_voice_info *map;
869
870 if (voice < 0 || voice >= devc->nr_voice)
871 return;
872
873 map = &pv_map[devc->lv_map[voice]];
874
875 DEB(printk("Aftertouch %d\n", voice));
876
877 if (map->voice_mode == 0)
878 return;
879
880
881
882
883
884 instr = devc->act_i[voice];
885
886 if (!instr)
887 instr = &devc->i_map[0];
888
889 if (devc->voc[voice].mode == 4)
890 {
891 int connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01);
892
893 switch (connection)
894 {
895 case 0:
896 SET_VIBRATO(4);
897 break;
898
899 case 1:
900 SET_VIBRATO(2);
901 SET_VIBRATO(4);
902 break;
903
904 case 2:
905 SET_VIBRATO(1);
906 SET_VIBRATO(4);
907 break;
908
909 case 3:
910 SET_VIBRATO(1);
911 SET_VIBRATO(3);
912 SET_VIBRATO(4);
913 break;
914
915 }
916
917
918
919 }
920 else
921 {
922 SET_VIBRATO(1);
923
924 if ((instr->operators[10] & 0x01))
925
926
927 SET_VIBRATO(2);
928 }
929}
930
931#undef SET_VIBRATO
932
933static void bend_pitch(int dev, int voice, int value)
934{
935 unsigned char data;
936 int block, fnum, freq;
937 struct physical_voice_info *map;
938
939 map = &pv_map[devc->lv_map[voice]];
940
941 if (map->voice_mode == 0)
942 return;
943
944 devc->voc[voice].bender = value;
945 if (!value)
946 return;
947 if (!(devc->voc[voice].keyon_byte & 0x20))
948 return;
949
950
951
952 freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range, 0);
953 devc->voc[voice].current_freq = freq;
954
955 freq_to_fnum(freq, &block, &fnum);
956
957 data = fnum & 0xff;
958
959
960 opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data);
961
962 data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3);
963 devc->voc[voice].keyon_byte = data;
964 opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data);
965}
966
967static void opl3_controller (int dev, int voice, int ctrl_num, int value)
968{
969 if (voice < 0 || voice >= devc->nr_voice)
970 return;
971
972 switch (ctrl_num)
973 {
974 case CTRL_PITCH_BENDER:
975 bend_pitch(dev, voice, value);
976 break;
977
978 case CTRL_PITCH_BENDER_RANGE:
979 devc->voc[voice].bender_range = value;
980 break;
981
982 case CTL_MAIN_VOLUME:
983 devc->voc[voice].volume = value / 128;
984 break;
985
986 case CTL_PAN:
987 devc->voc[voice].panning = (value * 2) - 128;
988 break;
989 }
990}
991
992static void opl3_bender(int dev, int voice, int value)
993{
994 if (voice < 0 || voice >= devc->nr_voice)
995 return;
996
997 bend_pitch(dev, voice, value - 8192);
998}
999
1000static int opl3_alloc_voice(int dev, int chn, int note, struct voice_alloc_info *alloc)
1001{
1002 int i, p, best, first, avail, best_time = 0x7fffffff;
1003 struct sbi_instrument *instr;
1004 int is4op;
1005 int instr_no;
1006
1007 if (chn < 0 || chn > 15)
1008 instr_no = 0;
1009 else
1010 instr_no = devc->chn_info[chn].pgm_num;
1011
1012 instr = &devc->i_map[instr_no];
1013 if (instr->channel < 0 ||
1014 devc->nr_voice != 12)
1015 is4op = 0;
1016 else if (devc->nr_voice == 12)
1017 is4op = (instr->key == OPL3_PATCH);
1018 else
1019 is4op = 0;
1020
1021 if (is4op)
1022 {
1023 first = p = 0;
1024 avail = 6;
1025 }
1026 else
1027 {
1028 if (devc->nr_voice == 12)
1029 first = p = 6;
1030 else
1031 first = p = 0;
1032 avail = devc->nr_voice;
1033 }
1034
1035
1036
1037
1038 best = first;
1039
1040 for (i = 0; i < avail; i++)
1041 {
1042 if (alloc->map[p] == 0)
1043 {
1044 return p;
1045 }
1046 if (alloc->alloc_times[p] < best_time)
1047 {
1048 best_time = alloc->alloc_times[p];
1049 best = p;
1050 }
1051 p = (p + 1) % avail;
1052 }
1053
1054
1055
1056
1057
1058 if (best < 0)
1059 best = 0;
1060 if (best > devc->nr_voice)
1061 best -= devc->nr_voice;
1062
1063 return best;
1064}
1065
1066static void opl3_setup_voice(int dev, int voice, int chn)
1067{
1068 struct channel_info *info =
1069 &synth_devs[dev]->chn_info[chn];
1070
1071 opl3_set_instr(dev, voice, info->pgm_num);
1072
1073 devc->voc[voice].bender = 0;
1074 devc->voc[voice].bender_range = info->bender_range;
1075 devc->voc[voice].volume = info->controllers[CTL_MAIN_VOLUME];
1076 devc->voc[voice].panning = (info->controllers[CTL_PAN] * 2) - 128;
1077}
1078
1079static struct synth_operations opl3_operations =
1080{
1081 .owner = THIS_MODULE,
1082 .id = "OPL",
1083 .info = NULL,
1084 .midi_dev = 0,
1085 .synth_type = SYNTH_TYPE_FM,
1086 .synth_subtype = FM_TYPE_ADLIB,
1087 .open = opl3_open,
1088 .close = opl3_close,
1089 .ioctl = opl3_ioctl,
1090 .kill_note = opl3_kill_note,
1091 .start_note = opl3_start_note,
1092 .set_instr = opl3_set_instr,
1093 .reset = opl3_reset,
1094 .hw_control = opl3_hw_control,
1095 .load_patch = opl3_load_patch,
1096 .aftertouch = opl3_aftertouch,
1097 .controller = opl3_controller,
1098 .panning = opl3_panning,
1099 .volume_method = opl3_volume_method,
1100 .bender = opl3_bender,
1101 .alloc_voice = opl3_alloc_voice,
1102 .setup_voice = opl3_setup_voice
1103};
1104
1105static int opl3_init(int ioaddr, struct module *owner)
1106{
1107 int i;
1108 int me;
1109
1110 if (devc == NULL)
1111 {
1112 printk(KERN_ERR "opl3: Device control structure not initialized.\n");
1113 return -1;
1114 }
1115
1116 if ((me = sound_alloc_synthdev()) == -1)
1117 {
1118 printk(KERN_WARNING "opl3: Too many synthesizers\n");
1119 return -1;
1120 }
1121
1122 devc->nr_voice = 9;
1123
1124 devc->fm_info.device = 0;
1125 devc->fm_info.synth_type = SYNTH_TYPE_FM;
1126 devc->fm_info.synth_subtype = FM_TYPE_ADLIB;
1127 devc->fm_info.perc_mode = 0;
1128 devc->fm_info.nr_voices = 9;
1129 devc->fm_info.nr_drums = 0;
1130 devc->fm_info.instr_bank_size = SBFM_MAXINSTR;
1131 devc->fm_info.capabilities = 0;
1132 devc->left_io = ioaddr;
1133 devc->right_io = ioaddr + 2;
1134
1135 if (detected_model <= 2)
1136 devc->model = 1;
1137 else
1138 {
1139 devc->model = 2;
1140 if (detected_model == 4)
1141 devc->is_opl4 = 1;
1142 }
1143
1144 opl3_operations.info = &devc->fm_info;
1145
1146 synth_devs[me] = &opl3_operations;
1147
1148 if (owner)
1149 synth_devs[me]->owner = owner;
1150
1151 sequencer_init();
1152 devc->v_alloc = &opl3_operations.alloc;
1153 devc->chn_info = &opl3_operations.chn_info[0];
1154
1155 if (devc->model == 2)
1156 {
1157 if (devc->is_opl4)
1158 strcpy(devc->fm_info.name, "Yamaha OPL4/OPL3 FM");
1159 else
1160 strcpy(devc->fm_info.name, "Yamaha OPL3");
1161
1162 devc->v_alloc->max_voice = devc->nr_voice = 18;
1163 devc->fm_info.nr_drums = 0;
1164 devc->fm_info.synth_subtype = FM_TYPE_OPL3;
1165 devc->fm_info.capabilities |= SYNTH_CAP_OPL3;
1166
1167 for (i = 0; i < 18; i++)
1168 {
1169 if (pv_map[i].ioaddr == USE_LEFT)
1170 pv_map[i].ioaddr = devc->left_io;
1171 else
1172 pv_map[i].ioaddr = devc->right_io;
1173 }
1174 opl3_command(devc->right_io, OPL3_MODE_REGISTER, OPL3_ENABLE);
1175 opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x00);
1176 }
1177 else
1178 {
1179 strcpy(devc->fm_info.name, "Yamaha OPL2");
1180 devc->v_alloc->max_voice = devc->nr_voice = 9;
1181 devc->fm_info.nr_drums = 0;
1182
1183 for (i = 0; i < 18; i++)
1184 pv_map[i].ioaddr = devc->left_io;
1185 };
1186 conf_printf2(devc->fm_info.name, ioaddr, 0, -1, -1);
1187
1188 for (i = 0; i < SBFM_MAXINSTR; i++)
1189 devc->i_map[i].channel = -1;
1190
1191 return me;
1192}
1193
1194static int me;
1195
1196static int io = -1;
1197
1198module_param(io, int, 0);
1199
1200static int __init init_opl3 (void)
1201{
1202 printk(KERN_INFO "YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1996\n");
1203
1204 if (io != -1)
1205 {
1206 if (!opl3_detect(io))
1207 {
1208 return -ENODEV;
1209 }
1210
1211 me = opl3_init(io, THIS_MODULE);
1212 }
1213
1214 return 0;
1215}
1216
1217static void __exit cleanup_opl3(void)
1218{
1219 if (devc && io != -1)
1220 {
1221 if (devc->base) {
1222 release_region(devc->base,4);
1223 if (devc->is_opl4)
1224 release_region(devc->base - 8, 2);
1225 }
1226 kfree(devc);
1227 devc = NULL;
1228 sound_unload_synthdev(me);
1229 }
1230}
1231
1232module_init(init_opl3);
1233module_exit(cleanup_opl3);
1234
1235#ifndef MODULE
1236static int __init setup_opl3(char *str)
1237{
1238
1239 int ints[2];
1240
1241 str = get_options(str, ARRAY_SIZE(ints), ints);
1242
1243 io = ints[1];
1244
1245 return 1;
1246}
1247
1248__setup("opl3=", setup_opl3);
1249#endif
1250MODULE_LICENSE("GPL");
1251