4 * A low level driver for Yamaha YM3812 and OPL-3 -chips
7 * Copyright (C) by Hannu Savolainen 1993-1997
9 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
10 * Version 2 (June 1991). See the "COPYING" file distributed with this software
15 * Thomas Sailer ioctl code reworked (vmalloc/vfree removed)
16 * Alan Cox modularisation, fixed sound_mem allocs.
17 * Christoph Hellwig Adapted to module_init/module_exit
18 * Arnaldo C. de Melo get rid of check_region, use request_region for
19 * OPL4, release it on exit, some cleanups.
22 * Believed to work. Badly needs rewriting a bit to support multiple
26 #include <linux/init.h>
27 #include <linux/module.h>
28 #include <linux/delay.h>
31 * Major improvements to the FM handling 30AUG92 by Rob Hooft,
35 #include "sound_config.h"
45 unsigned char keyon_byte
;
48 unsigned long orig_freq
;
49 unsigned long current_freq
;
52 int panning
; /* 0xffff means not set */
55 typedef struct opl_devinfo
58 int left_io
, right_io
;
60 int lv_map
[MAX_VOICE
];
62 struct voice_info voc
[MAX_VOICE
];
63 struct voice_alloc_info
*v_alloc
;
64 struct channel_info
*chn_info
;
66 struct sbi_instrument i_map
[SBFM_MAXINSTR
];
67 struct sbi_instrument
*act_i
[MAX_VOICE
];
69 struct synth_info fm_info
;
79 static struct opl_devinfo
*devc
= NULL
;
81 static int detected_model
;
83 static int store_instr(int instr_no
, struct sbi_instrument
*instr
);
84 static void freq_to_fnum(int freq
, int *block
, int *fnum
);
85 static void opl3_command(int io_addr
, unsigned int addr
, unsigned int val
);
86 static int opl3_kill_note(int dev
, int voice
, int note
, int velocity
);
88 static void enter_4op_mode(void)
91 static int v4op
[MAX_VOICE
] = {
92 0, 1, 2, 9, 10, 11, 6, 7, 8, 15, 16, 17
95 devc
->cmask
= 0x3f; /* Connect all possible 4 OP voice operators */
96 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, 0x3f);
98 for (i
= 0; i
< 3; i
++)
99 pv_map
[i
].voice_mode
= 4;
100 for (i
= 3; i
< 6; i
++)
101 pv_map
[i
].voice_mode
= 0;
103 for (i
= 9; i
< 12; i
++)
104 pv_map
[i
].voice_mode
= 4;
105 for (i
= 12; i
< 15; i
++)
106 pv_map
[i
].voice_mode
= 0;
108 for (i
= 0; i
< 12; i
++)
109 devc
->lv_map
[i
] = v4op
[i
];
110 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 12;
113 static int opl3_ioctl(int dev
, unsigned int cmd
, void __user
* arg
)
115 struct sbi_instrument ins
;
118 case SNDCTL_FM_LOAD_INSTR
:
119 printk(KERN_WARNING
"Warning: Obsolete ioctl(SNDCTL_FM_LOAD_INSTR) used. Fix the program.\n");
120 if (copy_from_user(&ins
, arg
, sizeof(ins
)))
122 if (ins
.channel
< 0 || ins
.channel
>= SBFM_MAXINSTR
) {
123 printk(KERN_WARNING
"FM Error: Invalid instrument number %d\n", ins
.channel
);
126 return store_instr(ins
.channel
, &ins
);
128 case SNDCTL_SYNTH_INFO
:
129 devc
->fm_info
.nr_voices
= (devc
->nr_voice
== 12) ? 6 : devc
->nr_voice
;
130 if (copy_to_user(arg
, &devc
->fm_info
, sizeof(devc
->fm_info
)))
134 case SNDCTL_SYNTH_MEMAVL
:
137 case SNDCTL_FM_4OP_ENABLE
:
138 if (devc
->model
== 2)
147 int opl3_detect(int ioaddr
, int *osp
)
150 * This function returns 1 if the FM chip is present at the given I/O port
151 * The detection algorithm plays with the timer built in the FM chip and
152 * looks for a change in the status register.
154 * Note! The timers of the FM chip are not connected to AdLib (and compatible)
157 * Note2! The chip is initialized if detected.
160 unsigned char stat1
, signature
;
165 printk(KERN_ERR
"opl3: Only one OPL3 supported.\n");
169 devc
= kzalloc(sizeof(*devc
), GFP_KERNEL
);
173 printk(KERN_ERR
"opl3: Can't allocate memory for the device control "
178 strcpy(devc
->fm_info
.name
, "OPL2");
180 if (!request_region(ioaddr
, 4, devc
->fm_info
.name
)) {
181 printk(KERN_WARNING
"opl3: I/O port 0x%x already in use\n", ioaddr
);
188 /* Reset timers 1 and 2 */
189 opl3_command(ioaddr
, TIMER_CONTROL_REGISTER
, TIMER1_MASK
| TIMER2_MASK
);
191 /* Reset the IRQ of the FM chip */
192 opl3_command(ioaddr
, TIMER_CONTROL_REGISTER
, IRQ_RESET
);
194 signature
= stat1
= inb(ioaddr
); /* Status register */
196 if (signature
!= 0x00 && signature
!= 0x06 && signature
!= 0x02 &&
199 MDB(printk(KERN_INFO
"OPL3 not detected %x\n", signature
));
203 if (signature
== 0x06) /* OPL2 */
207 else if (signature
== 0x00 || signature
== 0x0f) /* OPL3 or OPL4 */
214 * Detect availability of OPL4 (_experimental_). Works probably
215 * only after a cold boot. In addition the OPL4 port
216 * of the chip may not be connected to the PC bus at all.
219 opl3_command(ioaddr
+ 2, OPL3_MODE_REGISTER
, 0x00);
220 opl3_command(ioaddr
+ 2, OPL3_MODE_REGISTER
, OPL3_ENABLE
| OPL4_ENABLE
);
222 if ((tmp
= inb(ioaddr
)) == 0x02) /* Have a OPL4 */
227 if (request_region(ioaddr
- 8, 2, "OPL4")) /* OPL4 port was free */
231 outb((0x02), ioaddr
- 8); /* Select OPL4 ID register */
233 tmp
= inb(ioaddr
- 7); /* Read it */
236 if (tmp
== 0x20) /* OPL4 should return 0x20 here */
239 outb((0xF8), ioaddr
- 8); /* Select OPL4 FM mixer control */
241 outb((0x1B), ioaddr
- 7); /* Write value */
245 { /* release OPL4 port */
246 release_region(ioaddr
- 8, 2);
250 opl3_command(ioaddr
+ 2, OPL3_MODE_REGISTER
, 0);
252 for (i
= 0; i
< 9; i
++)
253 opl3_command(ioaddr
, KEYON_BLOCK
+ i
, 0); /*
257 opl3_command(ioaddr
, TEST_REGISTER
, ENABLE_WAVE_SELECT
);
258 opl3_command(ioaddr
, PERCOSSION_REGISTER
, 0x00); /*
263 release_region(ioaddr
, 4);
270 static int opl3_kill_note (int devno
, int voice
, int note
, int velocity
)
272 struct physical_voice_info
*map
;
274 if (voice
< 0 || voice
>= devc
->nr_voice
)
277 devc
->v_alloc
->map
[voice
] = 0;
279 map
= &pv_map
[devc
->lv_map
[voice
]];
280 DEB(printk("Kill note %d\n", voice
));
282 if (map
->voice_mode
== 0)
285 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, devc
->voc
[voice
].keyon_byte
& ~0x20);
286 devc
->voc
[voice
].keyon_byte
= 0;
287 devc
->voc
[voice
].bender
= 0;
288 devc
->voc
[voice
].volume
= 64;
289 devc
->voc
[voice
].panning
= 0xffff; /* Not set */
290 devc
->voc
[voice
].bender_range
= 200;
291 devc
->voc
[voice
].orig_freq
= 0;
292 devc
->voc
[voice
].current_freq
= 0;
293 devc
->voc
[voice
].mode
= 0;
302 #define UNDEFINED TOMTOM
303 #define DEFAULT TOMTOM
305 static int store_instr(int instr_no
, struct sbi_instrument
*instr
)
307 if (instr
->key
!= FM_PATCH
&& (instr
->key
!= OPL3_PATCH
|| devc
->model
!= 2))
308 printk(KERN_WARNING
"FM warning: Invalid patch format field (key) 0x%x\n", instr
->key
);
309 memcpy((char *) &(devc
->i_map
[instr_no
]), (char *) instr
, sizeof(*instr
));
313 static int opl3_set_instr (int dev
, int voice
, int instr_no
)
315 if (voice
< 0 || voice
>= devc
->nr_voice
)
317 if (instr_no
< 0 || instr_no
>= SBFM_MAXINSTR
)
318 instr_no
= 0; /* Acoustic piano (usually) */
320 devc
->act_i
[voice
] = &devc
->i_map
[instr_no
];
325 * The next table looks magical, but it certainly is not. Its values have
326 * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
327 * for i=0. This log-table converts a linear volume-scaling (0..127) to a
328 * logarithmic scaling as present in the FM-synthesizer chips. so : Volume
329 * 64 = 0 db = relative volume 0 and: Volume 32 = -6 db = relative
330 * volume -8 it was implemented as a table because it is only 128 bytes and
331 * it saves a lot of log() calculations. (RH)
334 static char fm_volume_table
[128] =
336 -64, -48, -40, -35, -32, -29, -27, -26,
337 -24, -23, -21, -20, -19, -18, -18, -17,
338 -16, -15, -15, -14, -13, -13, -12, -12,
339 -11, -11, -10, -10, -10, -9, -9, -8,
340 -8, -8, -7, -7, -7, -6, -6, -6,
341 -5, -5, -5, -5, -4, -4, -4, -4,
342 -3, -3, -3, -3, -2, -2, -2, -2,
343 -2, -1, -1, -1, -1, 0, 0, 0,
344 0, 0, 0, 1, 1, 1, 1, 1,
345 1, 2, 2, 2, 2, 2, 2, 2,
346 3, 3, 3, 3, 3, 3, 3, 4,
347 4, 4, 4, 4, 4, 4, 4, 5,
348 5, 5, 5, 5, 5, 5, 5, 5,
349 6, 6, 6, 6, 6, 6, 6, 6,
350 6, 7, 7, 7, 7, 7, 7, 7,
351 7, 7, 7, 8, 8, 8, 8, 8
354 static void calc_vol(unsigned char *regbyte
, int volume
, int main_vol
)
356 int level
= (~*regbyte
& 0x3f);
360 volume
= (volume
* main_vol
) / 127;
363 level
+= fm_volume_table
[volume
];
370 *regbyte
= (*regbyte
& 0xc0) | (~level
& 0x3f);
373 static void set_voice_volume(int voice
, int volume
, int main_vol
)
375 unsigned char vol1
, vol2
, vol3
, vol4
;
376 struct sbi_instrument
*instr
;
377 struct physical_voice_info
*map
;
379 if (voice
< 0 || voice
>= devc
->nr_voice
)
382 map
= &pv_map
[devc
->lv_map
[voice
]];
383 instr
= devc
->act_i
[voice
];
386 instr
= &devc
->i_map
[0];
388 if (instr
->channel
< 0)
391 if (devc
->voc
[voice
].mode
== 0)
394 if (devc
->voc
[voice
].mode
== 2)
396 vol1
= instr
->operators
[2];
397 vol2
= instr
->operators
[3];
398 if ((instr
->operators
[10] & 0x01))
400 calc_vol(&vol1
, volume
, main_vol
);
401 calc_vol(&vol2
, volume
, main_vol
);
405 calc_vol(&vol2
, volume
, main_vol
);
407 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[0], vol1
);
408 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[1], vol2
);
416 vol1
= instr
->operators
[2];
417 vol2
= instr
->operators
[3];
418 vol3
= instr
->operators
[OFFS_4OP
+ 2];
419 vol4
= instr
->operators
[OFFS_4OP
+ 3];
422 * The connection method for 4 OP devc->voc is defined by the rightmost
423 * bits at the offsets 10 and 10+OFFS_4OP
426 connection
= ((instr
->operators
[10] & 0x01) << 1) | (instr
->operators
[10 + OFFS_4OP
] & 0x01);
431 calc_vol(&vol4
, volume
, main_vol
);
435 calc_vol(&vol2
, volume
, main_vol
);
436 calc_vol(&vol4
, volume
, main_vol
);
440 calc_vol(&vol1
, volume
, main_vol
);
441 calc_vol(&vol4
, volume
, main_vol
);
445 calc_vol(&vol1
, volume
, main_vol
);
446 calc_vol(&vol3
, volume
, main_vol
);
447 calc_vol(&vol4
, volume
, main_vol
);
453 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[0], vol1
);
454 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[1], vol2
);
455 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[2], vol3
);
456 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[3], vol4
);
460 static int opl3_start_note (int dev
, int voice
, int note
, int volume
)
462 unsigned char data
, fpc
;
463 int block
, fnum
, freq
, voice_mode
, pan
;
464 struct sbi_instrument
*instr
;
465 struct physical_voice_info
*map
;
467 if (voice
< 0 || voice
>= devc
->nr_voice
)
470 map
= &pv_map
[devc
->lv_map
[voice
]];
471 pan
= devc
->voc
[voice
].panning
;
473 if (map
->voice_mode
== 0)
477 * Just change the volume
480 set_voice_volume(voice
, volume
, devc
->voc
[voice
].volume
);
485 * Kill previous note before playing
488 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[1], 0xff); /*
493 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[0], 0xff); /*
498 if (map
->voice_mode
== 4)
500 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[2], 0xff);
501 opl3_command(map
->ioaddr
, KSL_LEVEL
+ map
->op
[3], 0xff);
504 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, 0x00); /*
509 instr
= devc
->act_i
[voice
];
512 instr
= &devc
->i_map
[0];
514 if (instr
->channel
< 0)
516 printk(KERN_WARNING
"opl3: Initializing voice %d with undefined instrument\n", voice
);
520 if (map
->voice_mode
== 2 && instr
->key
== OPL3_PATCH
)
525 voice_mode
= map
->voice_mode
;
531 voice_shift
= (map
->ioaddr
== devc
->left_io
) ? 0 : 3;
532 voice_shift
+= map
->voice_num
;
534 if (instr
->key
!= OPL3_PATCH
) /*
539 devc
->cmask
&= ~(1 << voice_shift
);
543 devc
->cmask
|= (1 << voice_shift
);
546 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, devc
->cmask
);
550 * Set Sound Characteristics
553 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[0], instr
->operators
[0]);
554 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[1], instr
->operators
[1]);
560 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[0], instr
->operators
[4]);
561 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[1], instr
->operators
[5]);
564 * Set Sustain/Release
567 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[0], instr
->operators
[6]);
568 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[1], instr
->operators
[7]);
574 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[0], instr
->operators
[8]);
575 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[1], instr
->operators
[9]);
578 * Set Feedback/Connection
581 fpc
= instr
->operators
[10];
587 fpc
|= VOICE_TO_LEFT
;
590 fpc
|= VOICE_TO_RIGHT
;
592 fpc
|= (VOICE_TO_LEFT
| VOICE_TO_RIGHT
);
597 * Ensure that at least one chn is enabled
599 opl3_command(map
->ioaddr
, FEEDBACK_CONNECTION
+ map
->voice_num
, fpc
);
602 * If the voice is a 4 OP one, initialize the operators 3 and 4 also
608 * Set Sound Characteristics
611 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 0]);
612 opl3_command(map
->ioaddr
, AM_VIB
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 1]);
618 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 4]);
619 opl3_command(map
->ioaddr
, ATTACK_DECAY
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 5]);
622 * Set Sustain/Release
625 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 6]);
626 opl3_command(map
->ioaddr
, SUSTAIN_RELEASE
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 7]);
632 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[2], instr
->operators
[OFFS_4OP
+ 8]);
633 opl3_command(map
->ioaddr
, WAVE_SELECT
+ map
->op
[3], instr
->operators
[OFFS_4OP
+ 9]);
636 * Set Feedback/Connection
639 fpc
= instr
->operators
[OFFS_4OP
+ 10];
642 * Ensure that at least one chn is enabled
644 opl3_command(map
->ioaddr
, FEEDBACK_CONNECTION
+ map
->voice_num
+ 3, fpc
);
647 devc
->voc
[voice
].mode
= voice_mode
;
648 set_voice_volume(voice
, volume
, devc
->voc
[voice
].volume
);
650 freq
= devc
->voc
[voice
].orig_freq
= note_to_freq(note
) / 1000;
653 * Since the pitch bender may have been set before playing the note, we
654 * have to calculate the bending now.
657 freq
= compute_finetune(devc
->voc
[voice
].orig_freq
, devc
->voc
[voice
].bender
, devc
->voc
[voice
].bender_range
, 0);
658 devc
->voc
[voice
].current_freq
= freq
;
660 freq_to_fnum(freq
, &block
, &fnum
);
666 data
= fnum
& 0xff; /*
667 * Least significant bits of fnumber
669 opl3_command(map
->ioaddr
, FNUM_LOW
+ map
->voice_num
, data
);
671 data
= 0x20 | ((block
& 0x7) << 2) | ((fnum
>> 8) & 0x3);
672 devc
->voc
[voice
].keyon_byte
= data
;
673 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, data
);
675 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
+ 3, data
);
680 static void freq_to_fnum (int freq
, int *block
, int *fnum
)
685 * Converts the note frequency to block and fnum values for the FM chip
688 * First try to compute the block -value (octave) where the note belongs
717 *fnum
= freq
* (1 << (20 - octave
)) / 49716;
721 static void opl3_command (int io_addr
, unsigned int addr
, unsigned int val
)
726 * The original 2-OP synth requires a quite long delay after writing to a
727 * register. The OPL-3 survives with just two INBs
730 outb(((unsigned char) (addr
& 0xff)), io_addr
);
732 if (devc
->model
!= 2)
735 for (i
= 0; i
< 2; i
++)
738 outb(((unsigned char) (val
& 0xff)), io_addr
+ 1);
740 if (devc
->model
!= 2)
743 for (i
= 0; i
< 2; i
++)
747 static void opl3_reset(int devno
)
751 for (i
= 0; i
< 18; i
++)
754 for (i
= 0; i
< devc
->nr_voice
; i
++)
756 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
757 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[0], 0xff);
759 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
760 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[1], 0xff);
762 if (pv_map
[devc
->lv_map
[i
]].voice_mode
== 4)
764 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
765 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[2], 0xff);
767 opl3_command(pv_map
[devc
->lv_map
[i
]].ioaddr
,
768 KSL_LEVEL
+ pv_map
[devc
->lv_map
[i
]].op
[3], 0xff);
771 opl3_kill_note(devno
, i
, 0, 64);
774 if (devc
->model
== 2)
776 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 18;
778 for (i
= 0; i
< 18; i
++)
779 pv_map
[i
].voice_mode
= 2;
784 static int opl3_open(int dev
, int mode
)
792 devc
->v_alloc
->max_voice
= devc
->nr_voice
= (devc
->model
== 2) ? 18 : 9;
793 devc
->v_alloc
->timestamp
= 0;
795 for (i
= 0; i
< 18; i
++)
797 devc
->v_alloc
->map
[i
] = 0;
798 devc
->v_alloc
->alloc_times
[i
] = 0;
801 devc
->cmask
= 0x00; /*
804 if (devc
->model
== 2)
805 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, devc
->cmask
);
809 static void opl3_close(int dev
)
812 devc
->v_alloc
->max_voice
= devc
->nr_voice
= (devc
->model
== 2) ? 18 : 9;
814 devc
->fm_info
.nr_drums
= 0;
815 devc
->fm_info
.perc_mode
= 0;
820 static void opl3_hw_control(int dev
, unsigned char *event
)
824 static int opl3_load_patch(int dev
, int format
, const char __user
*addr
,
825 int offs
, int count
, int pmgr_flag
)
827 struct sbi_instrument ins
;
829 if (count
<sizeof(ins
))
831 printk(KERN_WARNING
"FM Error: Patch record too short\n");
836 * What the fuck is going on here? We leave junk in the beginning
837 * of ins and then check the field pretty close to that beginning?
839 if(copy_from_user(&((char *) &ins
)[offs
], addr
+ offs
, sizeof(ins
) - offs
))
842 if (ins
.channel
< 0 || ins
.channel
>= SBFM_MAXINSTR
)
844 printk(KERN_WARNING
"FM Error: Invalid instrument number %d\n", ins
.channel
);
849 return store_instr(ins
.channel
, &ins
);
852 static void opl3_panning(int dev
, int voice
, int value
)
854 devc
->voc
[voice
].panning
= value
;
857 static void opl3_volume_method(int dev
, int mode
)
861 #define SET_VIBRATO(cell) { \
862 tmp = instr->operators[(cell-1)+(((cell-1)/2)*OFFS_4OP)]; \
863 if (pressure > 110) \
864 tmp |= 0x40; /* Vibrato on */ \
865 opl3_command (map->ioaddr, AM_VIB + map->op[cell-1], tmp);}
867 static void opl3_aftertouch(int dev
, int voice
, int pressure
)
870 struct sbi_instrument
*instr
;
871 struct physical_voice_info
*map
;
873 if (voice
< 0 || voice
>= devc
->nr_voice
)
876 map
= &pv_map
[devc
->lv_map
[voice
]];
878 DEB(printk("Aftertouch %d\n", voice
));
880 if (map
->voice_mode
== 0)
884 * Adjust the amount of vibrato depending the pressure
887 instr
= devc
->act_i
[voice
];
890 instr
= &devc
->i_map
[0];
892 if (devc
->voc
[voice
].mode
== 4)
894 int connection
= ((instr
->operators
[10] & 0x01) << 1) | (instr
->operators
[10 + OFFS_4OP
] & 0x01);
920 * Not implemented yet
927 if ((instr
->operators
[10] & 0x01)) /*
936 static void bend_pitch(int dev
, int voice
, int value
)
939 int block
, fnum
, freq
;
940 struct physical_voice_info
*map
;
942 map
= &pv_map
[devc
->lv_map
[voice
]];
944 if (map
->voice_mode
== 0)
947 devc
->voc
[voice
].bender
= value
;
950 if (!(devc
->voc
[voice
].keyon_byte
& 0x20))
955 freq
= compute_finetune(devc
->voc
[voice
].orig_freq
, devc
->voc
[voice
].bender
, devc
->voc
[voice
].bender_range
, 0);
956 devc
->voc
[voice
].current_freq
= freq
;
958 freq_to_fnum(freq
, &block
, &fnum
);
960 data
= fnum
& 0xff; /*
961 * Least significant bits of fnumber
963 opl3_command(map
->ioaddr
, FNUM_LOW
+ map
->voice_num
, data
);
965 data
= 0x20 | ((block
& 0x7) << 2) | ((fnum
>> 8) & 0x3);
966 devc
->voc
[voice
].keyon_byte
= data
;
967 opl3_command(map
->ioaddr
, KEYON_BLOCK
+ map
->voice_num
, data
);
970 static void opl3_controller (int dev
, int voice
, int ctrl_num
, int value
)
972 if (voice
< 0 || voice
>= devc
->nr_voice
)
977 case CTRL_PITCH_BENDER
:
978 bend_pitch(dev
, voice
, value
);
981 case CTRL_PITCH_BENDER_RANGE
:
982 devc
->voc
[voice
].bender_range
= value
;
985 case CTL_MAIN_VOLUME
:
986 devc
->voc
[voice
].volume
= value
/ 128;
990 devc
->voc
[voice
].panning
= (value
* 2) - 128;
995 static void opl3_bender(int dev
, int voice
, int value
)
997 if (voice
< 0 || voice
>= devc
->nr_voice
)
1000 bend_pitch(dev
, voice
, value
- 8192);
1003 static int opl3_alloc_voice(int dev
, int chn
, int note
, struct voice_alloc_info
*alloc
)
1005 int i
, p
, best
, first
, avail
, best_time
= 0x7fffffff;
1006 struct sbi_instrument
*instr
;
1010 if (chn
< 0 || chn
> 15)
1013 instr_no
= devc
->chn_info
[chn
].pgm_num
;
1015 instr
= &devc
->i_map
[instr_no
];
1016 if (instr
->channel
< 0 || /* Instrument not loaded */
1017 devc
->nr_voice
!= 12) /* Not in 4 OP mode */
1019 else if (devc
->nr_voice
== 12) /* 4 OP mode */
1020 is4op
= (instr
->key
== OPL3_PATCH
);
1031 if (devc
->nr_voice
== 12) /* 4 OP mode. Use the '2 OP only' operators first */
1035 avail
= devc
->nr_voice
;
1039 * Now try to find a free voice
1043 for (i
= 0; i
< avail
; i
++)
1045 if (alloc
->map
[p
] == 0)
1049 if (alloc
->alloc_times
[p
] < best_time
) /* Find oldest playing note */
1051 best_time
= alloc
->alloc_times
[p
];
1054 p
= (p
+ 1) % avail
;
1058 * Insert some kind of priority mechanism here.
1063 if (best
> devc
->nr_voice
)
1064 best
-= devc
->nr_voice
;
1066 return best
; /* All devc->voc in use. Select the first one. */
1069 static void opl3_setup_voice(int dev
, int voice
, int chn
)
1071 struct channel_info
*info
=
1072 &synth_devs
[dev
]->chn_info
[chn
];
1074 opl3_set_instr(dev
, voice
, info
->pgm_num
);
1076 devc
->voc
[voice
].bender
= 0;
1077 devc
->voc
[voice
].bender_range
= info
->bender_range
;
1078 devc
->voc
[voice
].volume
= info
->controllers
[CTL_MAIN_VOLUME
];
1079 devc
->voc
[voice
].panning
= (info
->controllers
[CTL_PAN
] * 2) - 128;
1082 static struct synth_operations opl3_operations
=
1084 .owner
= THIS_MODULE
,
1088 .synth_type
= SYNTH_TYPE_FM
,
1089 .synth_subtype
= FM_TYPE_ADLIB
,
1091 .close
= opl3_close
,
1092 .ioctl
= opl3_ioctl
,
1093 .kill_note
= opl3_kill_note
,
1094 .start_note
= opl3_start_note
,
1095 .set_instr
= opl3_set_instr
,
1096 .reset
= opl3_reset
,
1097 .hw_control
= opl3_hw_control
,
1098 .load_patch
= opl3_load_patch
,
1099 .aftertouch
= opl3_aftertouch
,
1100 .controller
= opl3_controller
,
1101 .panning
= opl3_panning
,
1102 .volume_method
= opl3_volume_method
,
1103 .bender
= opl3_bender
,
1104 .alloc_voice
= opl3_alloc_voice
,
1105 .setup_voice
= opl3_setup_voice
1108 int opl3_init(int ioaddr
, int *osp
, struct module
*owner
)
1115 printk(KERN_ERR
"opl3: Device control structure not initialized.\n");
1119 if ((me
= sound_alloc_synthdev()) == -1)
1121 printk(KERN_WARNING
"opl3: Too many synthesizers\n");
1127 devc
->fm_info
.device
= 0;
1128 devc
->fm_info
.synth_type
= SYNTH_TYPE_FM
;
1129 devc
->fm_info
.synth_subtype
= FM_TYPE_ADLIB
;
1130 devc
->fm_info
.perc_mode
= 0;
1131 devc
->fm_info
.nr_voices
= 9;
1132 devc
->fm_info
.nr_drums
= 0;
1133 devc
->fm_info
.instr_bank_size
= SBFM_MAXINSTR
;
1134 devc
->fm_info
.capabilities
= 0;
1135 devc
->left_io
= ioaddr
;
1136 devc
->right_io
= ioaddr
+ 2;
1138 if (detected_model
<= 2)
1143 if (detected_model
== 4)
1147 opl3_operations
.info
= &devc
->fm_info
;
1149 synth_devs
[me
] = &opl3_operations
;
1152 synth_devs
[me
]->owner
= owner
;
1155 devc
->v_alloc
= &opl3_operations
.alloc
;
1156 devc
->chn_info
= &opl3_operations
.chn_info
[0];
1158 if (devc
->model
== 2)
1161 strcpy(devc
->fm_info
.name
, "Yamaha OPL4/OPL3 FM");
1163 strcpy(devc
->fm_info
.name
, "Yamaha OPL3");
1165 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 18;
1166 devc
->fm_info
.nr_drums
= 0;
1167 devc
->fm_info
.synth_subtype
= FM_TYPE_OPL3
;
1168 devc
->fm_info
.capabilities
|= SYNTH_CAP_OPL3
;
1170 for (i
= 0; i
< 18; i
++)
1172 if (pv_map
[i
].ioaddr
== USE_LEFT
)
1173 pv_map
[i
].ioaddr
= devc
->left_io
;
1175 pv_map
[i
].ioaddr
= devc
->right_io
;
1177 opl3_command(devc
->right_io
, OPL3_MODE_REGISTER
, OPL3_ENABLE
);
1178 opl3_command(devc
->right_io
, CONNECTION_SELECT_REGISTER
, 0x00);
1182 strcpy(devc
->fm_info
.name
, "Yamaha OPL2");
1183 devc
->v_alloc
->max_voice
= devc
->nr_voice
= 9;
1184 devc
->fm_info
.nr_drums
= 0;
1186 for (i
= 0; i
< 18; i
++)
1187 pv_map
[i
].ioaddr
= devc
->left_io
;
1189 conf_printf2(devc
->fm_info
.name
, ioaddr
, 0, -1, -1);
1191 for (i
= 0; i
< SBFM_MAXINSTR
; i
++)
1192 devc
->i_map
[i
].channel
= -1;
1197 EXPORT_SYMBOL(opl3_init
);
1198 EXPORT_SYMBOL(opl3_detect
);
1204 module_param(io
, int, 0);
1206 static int __init
init_opl3 (void)
1208 printk(KERN_INFO
"YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1996\n");
1210 if (io
!= -1) /* User loading pure OPL3 module */
1212 if (!opl3_detect(io
, NULL
))
1217 me
= opl3_init(io
, NULL
, THIS_MODULE
);
1223 static void __exit
cleanup_opl3(void)
1225 if (devc
&& io
!= -1)
1228 release_region(devc
->base
,4);
1230 release_region(devc
->base
- 8, 2);
1234 sound_unload_synthdev(me
);
1238 module_init(init_opl3
);
1239 module_exit(cleanup_opl3
);
1242 static int __init
setup_opl3(char *str
)
1247 str
= get_options(str
, ARRAY_SIZE(ints
), ints
);
1254 __setup("opl3=", setup_opl3
);
1256 MODULE_LICENSE("GPL");