linux-old/drivers/sound/opl3.c
<<
>>
Prefs
   1/*
   2 * sound/opl3.c
   3 *
   4 * A low level driver for Yamaha YM3812 and OPL-3 -chips
   5 *
   6 *
   7 * Copyright (C) by Hannu Savolainen 1993-1997
   8 *
   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
  11 * for more info.
  12 *
  13 *
  14 * Changes
  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.
  20 *
  21 * Status
  22 *      Believed to work. Badly needs rewriting a bit to support multiple
  23 *      OPL3 devices.
  24 */
  25
  26#include <linux/init.h>
  27#include <linux/module.h>
  28#include <linux/delay.h>
  29
  30/*
  31 * Major improvements to the FM handling 30AUG92 by Rob Hooft,
  32 * hooft@chem.ruu.nl
  33 */
  34
  35#include "sound_config.h"
  36
  37#include "opl3.h"
  38#include "opl3_hw.h"
  39
  40#define MAX_VOICE       18
  41#define OFFS_4OP        11
  42
  43struct voice_info
  44{
  45        unsigned char   keyon_byte;
  46        long            bender;
  47        long            bender_range;
  48        unsigned long   orig_freq;
  49        unsigned long   current_freq;
  50        int             volume;
  51        int             mode;
  52        int             panning;        /* 0xffff means not set */
  53};
  54
  55typedef struct opl_devinfo
  56{
  57        int             base;
  58        int             left_io, right_io;
  59        int             nr_voice;
  60        int             lv_map[MAX_VOICE];
  61
  62        struct voice_info voc[MAX_VOICE];
  63        struct voice_alloc_info *v_alloc;
  64        struct channel_info *chn_info;
  65
  66        struct sbi_instrument i_map[SBFM_MAXINSTR];
  67        struct sbi_instrument *act_i[MAX_VOICE];
  68
  69        struct synth_info fm_info;
  70
  71        int             busy;
  72        int             model;
  73        unsigned char   cmask;
  74
  75        int             is_opl4;
  76        int            *osp;
  77} opl_devinfo;
  78
  79static struct opl_devinfo *devc = NULL;
  80
  81static int      detected_model;
  82
  83static int      store_instr(int instr_no, struct sbi_instrument *instr);
  84static void     freq_to_fnum(int freq, int *block, int *fnum);
  85static void     opl3_command(int io_addr, unsigned int addr, unsigned int val);
  86static int      opl3_kill_note(int dev, int voice, int note, int velocity);
  87
  88static void enter_4op_mode(void)
  89{
  90        int i;
  91        static int v4op[MAX_VOICE] = {
  92                0, 1, 2, 9, 10, 11, 6, 7, 8, 15, 16, 17
  93        };
  94
  95        devc->cmask = 0x3f;     /* Connect all possible 4 OP voice operators */
  96        opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x3f);
  97
  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;
 102
 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;
 107
 108        for (i = 0; i < 12; i++)
 109                devc->lv_map[i] = v4op[i];
 110        devc->v_alloc->max_voice = devc->nr_voice = 12;
 111}
 112
 113static int opl3_ioctl(int dev, unsigned int cmd, caddr_t arg)
 114{
 115        struct sbi_instrument ins;
 116        
 117        switch (cmd) {
 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)))
 121                                return -EFAULT;
 122                        if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR) {
 123                                printk(KERN_WARNING "FM Error: Invalid instrument number %d\n", ins.channel);
 124                                return -EINVAL;
 125                        }
 126                        return store_instr(ins.channel, &ins);
 127
 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)))
 131                                return -EFAULT;
 132                        return 0;
 133
 134                case SNDCTL_SYNTH_MEMAVL:
 135                        return 0x7fffffff;
 136
 137                case SNDCTL_FM_4OP_ENABLE:
 138                        if (devc->model == 2)
 139                                enter_4op_mode();
 140                        return 0;
 141
 142                default:
 143                        return -EINVAL;
 144        }
 145}
 146
 147int opl3_detect(int ioaddr, int *osp)
 148{
 149        /*
 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.
 153         *
 154         * Note! The timers of the FM chip are not connected to AdLib (and compatible)
 155         * boards.
 156         *
 157         * Note2! The chip is initialized if detected.
 158         */
 159
 160        unsigned char stat1, signature;
 161        int i;
 162
 163        if (devc != NULL)
 164        {
 165                printk(KERN_ERR "opl3: Only one OPL3 supported.\n");
 166                return 0;
 167        }
 168
 169        devc = (struct opl_devinfo *)kmalloc(sizeof(*devc), GFP_KERNEL);
 170
 171        if (devc == NULL)
 172        {
 173                printk(KERN_ERR "opl3: Can't allocate memory for the device control "
 174                        "structure \n ");
 175                return 0;
 176        }
 177
 178        memset(devc, 0, sizeof(*devc));
 179        strcpy(devc->fm_info.name, "OPL2");
 180
 181        if (!request_region(ioaddr, 4, devc->fm_info.name)) {
 182                printk(KERN_WARNING "opl3: I/O port 0x%x already in use\n", ioaddr);
 183                goto cleanup_devc;
 184        }
 185
 186        devc->osp = osp;
 187        devc->base = ioaddr;
 188
 189        /* Reset timers 1 and 2 */
 190        opl3_command(ioaddr, TIMER_CONTROL_REGISTER, TIMER1_MASK | TIMER2_MASK);
 191
 192        /* Reset the IRQ of the FM chip */
 193        opl3_command(ioaddr, TIMER_CONTROL_REGISTER, IRQ_RESET);
 194
 195        signature = stat1 = inb(ioaddr);        /* Status register */
 196
 197        if (signature != 0x00 && signature != 0x06 && signature != 0x02 &&
 198                signature != 0x0f)
 199        {
 200                MDB(printk(KERN_INFO "OPL3 not detected %x\n", signature));
 201                goto cleanup_region;
 202        }
 203
 204        if (signature == 0x06)          /* OPL2 */
 205        {
 206                detected_model = 2;
 207        }
 208        else if (signature == 0x00 || signature == 0x0f)        /* OPL3 or OPL4 */
 209        {
 210                unsigned char tmp;
 211
 212                detected_model = 3;
 213
 214                /*
 215                 * Detect availability of OPL4 (_experimental_). Works probably
 216                 * only after a cold boot. In addition the OPL4 port
 217                 * of the chip may not be connected to the PC bus at all.
 218                 */
 219
 220                opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0x00);
 221                opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, OPL3_ENABLE | OPL4_ENABLE);
 222
 223                if ((tmp = inb(ioaddr)) == 0x02)        /* Have a OPL4 */
 224                {
 225                        detected_model = 4;
 226                }
 227
 228                if (request_region(ioaddr - 8, 2, "OPL4"))      /* OPL4 port was free */
 229                {
 230                        int tmp;
 231
 232                        outb((0x02), ioaddr - 8);       /* Select OPL4 ID register */
 233                        udelay(10);
 234                        tmp = inb(ioaddr - 7);          /* Read it */
 235                        udelay(10);
 236
 237                        if (tmp == 0x20)        /* OPL4 should return 0x20 here */
 238                        {
 239                                detected_model = 4;
 240                                outb((0xF8), ioaddr - 8);       /* Select OPL4 FM mixer control */
 241                                udelay(10);
 242                                outb((0x1B), ioaddr - 7);       /* Write value */
 243                                udelay(10);
 244                        }
 245                        else
 246                        { /* release OPL4 port */
 247                                release_region(ioaddr - 8, 2);
 248                                detected_model = 3;
 249                        }
 250                }
 251                opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0);
 252        }
 253        for (i = 0; i < 9; i++)
 254                opl3_command(ioaddr, KEYON_BLOCK + i, 0);       /*
 255                                                                 * Note off
 256                                                                 */
 257
 258        opl3_command(ioaddr, TEST_REGISTER, ENABLE_WAVE_SELECT);
 259        opl3_command(ioaddr, PERCOSSION_REGISTER, 0x00);        /*
 260                                                                 * Melodic mode.
 261                                                                 */
 262        return 1;
 263cleanup_region:
 264        release_region(ioaddr, 4);
 265cleanup_devc:
 266        kfree(devc);
 267        devc = NULL;
 268        return 0;
 269}
 270
 271static int opl3_kill_note  (int devno, int voice, int note, int velocity)
 272{
 273         struct physical_voice_info *map;
 274
 275         if (voice < 0 || voice >= devc->nr_voice)
 276                 return 0;
 277
 278         devc->v_alloc->map[voice] = 0;
 279
 280         map = &pv_map[devc->lv_map[voice]];
 281         DEB(printk("Kill note %d\n", voice));
 282
 283         if (map->voice_mode == 0)
 284                 return 0;
 285
 286         opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, devc->voc[voice].keyon_byte & ~0x20);
 287         devc->voc[voice].keyon_byte = 0;
 288         devc->voc[voice].bender = 0;
 289         devc->voc[voice].volume = 64;
 290         devc->voc[voice].panning = 0xffff;     /* Not set */
 291         devc->voc[voice].bender_range = 200;
 292         devc->voc[voice].orig_freq = 0;
 293         devc->voc[voice].current_freq = 0;
 294         devc->voc[voice].mode = 0;
 295         return 0;
 296}
 297
 298#define HIHAT                   0
 299#define CYMBAL                  1
 300#define TOMTOM                  2
 301#define SNARE                   3
 302#define BDRUM                   4
 303#define UNDEFINED               TOMTOM
 304#define DEFAULT                 TOMTOM
 305
 306static int store_instr(int instr_no, struct sbi_instrument *instr)
 307{
 308        if (instr->key != FM_PATCH && (instr->key != OPL3_PATCH || devc->model != 2))
 309                printk(KERN_WARNING "FM warning: Invalid patch format field (key) 0x%x\n", instr->key);
 310        memcpy((char *) &(devc->i_map[instr_no]), (char *) instr, sizeof(*instr));
 311        return 0;
 312}
 313
 314static int opl3_set_instr  (int dev, int voice, int instr_no)
 315{
 316        if (voice < 0 || voice >= devc->nr_voice)
 317                return 0;
 318        if (instr_no < 0 || instr_no >= SBFM_MAXINSTR)
 319                instr_no = 0;   /* Acoustic piano (usually) */
 320
 321        devc->act_i[voice] = &devc->i_map[instr_no];
 322        return 0;
 323}
 324
 325/*
 326 * The next table looks magical, but it certainly is not. Its values have
 327 * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
 328 * for i=0. This log-table converts a linear volume-scaling (0..127) to a
 329 * logarithmic scaling as present in the FM-synthesizer chips. so :    Volume
 330 * 64 =  0 db = relative volume  0 and:    Volume 32 = -6 db = relative
 331 * volume -8 it was implemented as a table because it is only 128 bytes and
 332 * it saves a lot of log() calculations. (RH)
 333 */
 334
 335static char fm_volume_table[128] =
 336{
 337        -64, -48, -40, -35, -32, -29, -27, -26,
 338        -24, -23, -21, -20, -19, -18, -18, -17,
 339        -16, -15, -15, -14, -13, -13, -12, -12,
 340        -11, -11, -10, -10, -10, -9, -9, -8,
 341        -8, -8, -7, -7, -7, -6, -6, -6,
 342        -5, -5, -5, -5, -4, -4, -4, -4,
 343        -3, -3, -3, -3, -2, -2, -2, -2,
 344        -2, -1, -1, -1, -1, 0, 0, 0,
 345        0, 0, 0, 1, 1, 1, 1, 1,
 346        1, 2, 2, 2, 2, 2, 2, 2,
 347        3, 3, 3, 3, 3, 3, 3, 4,
 348        4, 4, 4, 4, 4, 4, 4, 5,
 349        5, 5, 5, 5, 5, 5, 5, 5,
 350        6, 6, 6, 6, 6, 6, 6, 6,
 351        6, 7, 7, 7, 7, 7, 7, 7,
 352        7, 7, 7, 8, 8, 8, 8, 8
 353};
 354
 355static void calc_vol(unsigned char *regbyte, int volume, int main_vol)
 356{
 357        int level = (~*regbyte & 0x3f);
 358
 359        if (main_vol > 127)
 360                main_vol = 127;
 361        volume = (volume * main_vol) / 127;
 362
 363        if (level)
 364                level += fm_volume_table[volume];
 365
 366        if (level > 0x3f)
 367                level = 0x3f;
 368        if (level < 0)
 369                level = 0;
 370
 371        *regbyte = (*regbyte & 0xc0) | (~level & 0x3f);
 372}
 373
 374static void set_voice_volume(int voice, int volume, int main_vol)
 375{
 376        unsigned char vol1, vol2, vol3, vol4;
 377        struct sbi_instrument *instr;
 378        struct physical_voice_info *map;
 379
 380        if (voice < 0 || voice >= devc->nr_voice)
 381                return;
 382
 383        map = &pv_map[devc->lv_map[voice]];
 384        instr = devc->act_i[voice];
 385
 386        if (!instr)
 387                instr = &devc->i_map[0];
 388
 389        if (instr->channel < 0)
 390                return;
 391
 392        if (devc->voc[voice].mode == 0)
 393                return;
 394
 395        if (devc->voc[voice].mode == 2)
 396        {
 397                vol1 = instr->operators[2];
 398                vol2 = instr->operators[3];
 399                if ((instr->operators[10] & 0x01))
 400                {
 401                        calc_vol(&vol1, volume, main_vol);
 402                        calc_vol(&vol2, volume, main_vol);
 403                }
 404                else
 405                {
 406                        calc_vol(&vol2, volume, main_vol);
 407                }
 408                opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
 409                opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
 410        }
 411        else
 412        {       /*
 413                 * 4 OP voice
 414                 */
 415                int connection;
 416
 417                vol1 = instr->operators[2];
 418                vol2 = instr->operators[3];
 419                vol3 = instr->operators[OFFS_4OP + 2];
 420                vol4 = instr->operators[OFFS_4OP + 3];
 421
 422                /*
 423                 * The connection method for 4 OP devc->voc is defined by the rightmost
 424                 * bits at the offsets 10 and 10+OFFS_4OP
 425                 */
 426
 427                connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01);
 428
 429                switch (connection)
 430                {
 431                        case 0:
 432                                calc_vol(&vol4, volume, main_vol);
 433                                break;
 434
 435                        case 1:
 436                                calc_vol(&vol2, volume, main_vol);
 437                                calc_vol(&vol4, volume, main_vol);
 438                                break;
 439
 440                        case 2:
 441                                calc_vol(&vol1, volume, main_vol);
 442                                calc_vol(&vol4, volume, main_vol);
 443                                break;
 444
 445                        case 3:
 446                                calc_vol(&vol1, volume, main_vol);
 447                                calc_vol(&vol3, volume, main_vol);
 448                                calc_vol(&vol4, volume, main_vol);
 449                                break;
 450
 451                        default:
 452                                ;
 453                }
 454                opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
 455                opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
 456                opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], vol3);
 457                opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], vol4);
 458        }
 459}
 460
 461static int opl3_start_note (int dev, int voice, int note, int volume)
 462{
 463        unsigned char data, fpc;
 464        int block, fnum, freq, voice_mode, pan;
 465        struct sbi_instrument *instr;
 466        struct physical_voice_info *map;
 467
 468        if (voice < 0 || voice >= devc->nr_voice)
 469                return 0;
 470
 471        map = &pv_map[devc->lv_map[voice]];
 472        pan = devc->voc[voice].panning;
 473
 474        if (map->voice_mode == 0)
 475                return 0;
 476
 477        if (note == 255)        /*
 478                                 * Just change the volume
 479                                 */
 480        {
 481                set_voice_volume(voice, volume, devc->voc[voice].volume);
 482                return 0;
 483        }
 484
 485        /*
 486         * Kill previous note before playing
 487         */
 488        
 489        opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], 0xff);        /*
 490                                                                         * Carrier
 491                                                                         * volume to
 492                                                                         * min
 493                                                                         */
 494        opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], 0xff);        /*
 495                                                                         * Modulator
 496                                                                         * volume to
 497                                                                         */
 498
 499        if (map->voice_mode == 4)
 500        {
 501                opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], 0xff);
 502                opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], 0xff);
 503        }
 504
 505        opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, 0x00);  /*
 506                                                                         * Note
 507                                                                         * off
 508                                                                         */
 509
 510        instr = devc->act_i[voice];
 511        
 512        if (!instr)
 513                instr = &devc->i_map[0];
 514
 515        if (instr->channel < 0)
 516        {
 517                printk(KERN_WARNING "opl3: Initializing voice %d with undefined instrument\n", voice);
 518                return 0;
 519        }
 520
 521        if (map->voice_mode == 2 && instr->key == OPL3_PATCH)
 522                return 0;       /*
 523                                 * Cannot play
 524                                 */
 525
 526        voice_mode = map->voice_mode;
 527
 528        if (voice_mode == 4)
 529        {
 530                int voice_shift;
 531
 532                voice_shift = (map->ioaddr == devc->left_io) ? 0 : 3;
 533                voice_shift += map->voice_num;
 534
 535                if (instr->key != OPL3_PATCH)   /*
 536                                                 * Just 2 OP patch
 537                                                 */
 538                {
 539                        voice_mode = 2;
 540                        devc->cmask &= ~(1 << voice_shift);
 541                }
 542                else
 543                {
 544                        devc->cmask |= (1 << voice_shift);
 545                }
 546
 547                opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
 548        }
 549
 550        /*
 551         * Set Sound Characteristics
 552         */
 553        
 554        opl3_command(map->ioaddr, AM_VIB + map->op[0], instr->operators[0]);
 555        opl3_command(map->ioaddr, AM_VIB + map->op[1], instr->operators[1]);
 556
 557        /*
 558         * Set Attack/Decay
 559         */
 560        
 561        opl3_command(map->ioaddr, ATTACK_DECAY + map->op[0], instr->operators[4]);
 562        opl3_command(map->ioaddr, ATTACK_DECAY + map->op[1], instr->operators[5]);
 563
 564        /*
 565         * Set Sustain/Release
 566         */
 567        
 568        opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[0], instr->operators[6]);
 569        opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[1], instr->operators[7]);
 570
 571        /*
 572         * Set Wave Select
 573         */
 574
 575        opl3_command(map->ioaddr, WAVE_SELECT + map->op[0], instr->operators[8]);
 576        opl3_command(map->ioaddr, WAVE_SELECT + map->op[1], instr->operators[9]);
 577
 578        /*
 579         * Set Feedback/Connection
 580         */
 581        
 582        fpc = instr->operators[10];
 583
 584        if (pan != 0xffff)
 585        {
 586                fpc &= ~STEREO_BITS;
 587                if (pan < -64)
 588                        fpc |= VOICE_TO_LEFT;
 589                else
 590                        if (pan > 64)
 591                                fpc |= VOICE_TO_RIGHT;
 592                        else
 593                                fpc |= (VOICE_TO_LEFT | VOICE_TO_RIGHT);
 594        }
 595
 596        if (!(fpc & 0x30))
 597                fpc |= 0x30;    /*
 598                                 * Ensure that at least one chn is enabled
 599                                 */
 600        opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num, fpc);
 601
 602        /*
 603         * If the voice is a 4 OP one, initialize the operators 3 and 4 also
 604         */
 605
 606        if (voice_mode == 4)
 607        {
 608                /*
 609                 * Set Sound Characteristics
 610                 */
 611        
 612                opl3_command(map->ioaddr, AM_VIB + map->op[2], instr->operators[OFFS_4OP + 0]);
 613                opl3_command(map->ioaddr, AM_VIB + map->op[3], instr->operators[OFFS_4OP + 1]);
 614
 615                /*
 616                 * Set Attack/Decay
 617                 */
 618                
 619                opl3_command(map->ioaddr, ATTACK_DECAY + map->op[2], instr->operators[OFFS_4OP + 4]);
 620                opl3_command(map->ioaddr, ATTACK_DECAY + map->op[3], instr->operators[OFFS_4OP + 5]);
 621
 622                /*
 623                 * Set Sustain/Release
 624                 */
 625                
 626                opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[2], instr->operators[OFFS_4OP + 6]);
 627                opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[3], instr->operators[OFFS_4OP + 7]);
 628
 629                /*
 630                 * Set Wave Select
 631                 */
 632                
 633                opl3_command(map->ioaddr, WAVE_SELECT + map->op[2], instr->operators[OFFS_4OP + 8]);
 634                opl3_command(map->ioaddr, WAVE_SELECT + map->op[3], instr->operators[OFFS_4OP + 9]);
 635
 636                /*
 637                 * Set Feedback/Connection
 638                 */
 639                
 640                fpc = instr->operators[OFFS_4OP + 10];
 641                if (!(fpc & 0x30))
 642                         fpc |= 0x30;   /*
 643                                         * Ensure that at least one chn is enabled
 644                                         */
 645                opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num + 3, fpc);
 646        }
 647
 648        devc->voc[voice].mode = voice_mode;
 649        set_voice_volume(voice, volume, devc->voc[voice].volume);
 650
 651        freq = devc->voc[voice].orig_freq = note_to_freq(note) / 1000;
 652
 653        /*
 654         * Since the pitch bender may have been set before playing the note, we
 655         * have to calculate the bending now.
 656         */
 657
 658        freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range, 0);
 659        devc->voc[voice].current_freq = freq;
 660
 661        freq_to_fnum(freq, &block, &fnum);
 662
 663        /*
 664         * Play note
 665         */
 666
 667        data = fnum & 0xff;     /*
 668                                 * Least significant bits of fnumber
 669                                 */
 670        opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data);
 671
 672        data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3);
 673                 devc->voc[voice].keyon_byte = data;
 674        opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data);
 675        if (voice_mode == 4)
 676                opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num + 3, data);
 677
 678        return 0;
 679}
 680
 681static void freq_to_fnum    (int freq, int *block, int *fnum)
 682{
 683        int f, octave;
 684
 685        /*
 686         * Converts the note frequency to block and fnum values for the FM chip
 687         */
 688        /*
 689         * First try to compute the block -value (octave) where the note belongs
 690         */
 691
 692        f = freq;
 693
 694        octave = 5;
 695
 696        if (f == 0)
 697                octave = 0;
 698        else if (f < 261)
 699        {
 700                while (f < 261)
 701                {
 702                        octave--;
 703                        f <<= 1;
 704                }
 705        }
 706        else if (f > 493)
 707        {
 708                while (f > 493)
 709                {
 710                         octave++;
 711                         f >>= 1;
 712                }
 713        }
 714
 715        if (octave > 7)
 716                octave = 7;
 717
 718        *fnum = freq * (1 << (20 - octave)) / 49716;
 719        *block = octave;
 720}
 721
 722static void opl3_command    (int io_addr, unsigned int addr, unsigned int val)
 723{
 724         int i;
 725
 726        /*
 727         * The original 2-OP synth requires a quite long delay after writing to a
 728         * register. The OPL-3 survives with just two INBs
 729         */
 730
 731        outb(((unsigned char) (addr & 0xff)), io_addr);
 732
 733        if (devc->model != 2)
 734                udelay(10);
 735        else
 736                for (i = 0; i < 2; i++)
 737                        inb(io_addr);
 738
 739        outb(((unsigned char) (val & 0xff)), io_addr + 1);
 740
 741        if (devc->model != 2)
 742                udelay(30);
 743        else
 744                for (i = 0; i < 2; i++)
 745                        inb(io_addr);
 746}
 747
 748static void opl3_reset(int devno)
 749{
 750        int i;
 751
 752        for (i = 0; i < 18; i++)
 753                devc->lv_map[i] = i;
 754
 755        for (i = 0; i < devc->nr_voice; i++)
 756        {
 757                opl3_command(pv_map[devc->lv_map[i]].ioaddr,
 758                        KSL_LEVEL + pv_map[devc->lv_map[i]].op[0], 0xff);
 759
 760                opl3_command(pv_map[devc->lv_map[i]].ioaddr,
 761                        KSL_LEVEL + pv_map[devc->lv_map[i]].op[1], 0xff);
 762
 763                if (pv_map[devc->lv_map[i]].voice_mode == 4)
 764                {
 765                        opl3_command(pv_map[devc->lv_map[i]].ioaddr,
 766                                KSL_LEVEL + pv_map[devc->lv_map[i]].op[2], 0xff);
 767
 768                        opl3_command(pv_map[devc->lv_map[i]].ioaddr,
 769                                KSL_LEVEL + pv_map[devc->lv_map[i]].op[3], 0xff);
 770                }
 771
 772                opl3_kill_note(devno, i, 0, 64);
 773        }
 774
 775        if (devc->model == 2)
 776        {
 777                devc->v_alloc->max_voice = devc->nr_voice = 18;
 778
 779                for (i = 0; i < 18; i++)
 780                        pv_map[i].voice_mode = 2;
 781
 782        }
 783}
 784
 785static int opl3_open(int dev, int mode)
 786{
 787        int i;
 788
 789        if (devc->busy)
 790                return -EBUSY;
 791        devc->busy = 1;
 792
 793        devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
 794        devc->v_alloc->timestamp = 0;
 795
 796        for (i = 0; i < 18; i++)
 797        {
 798                devc->v_alloc->map[i] = 0;
 799                devc->v_alloc->alloc_times[i] = 0;
 800        }
 801
 802        devc->cmask = 0x00;     /*
 803                                 * Just 2 OP mode
 804                                 */
 805        if (devc->model == 2)
 806                opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
 807        return 0;
 808}
 809
 810static void opl3_close(int dev)
 811{
 812        devc->busy = 0;
 813        devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
 814
 815        devc->fm_info.nr_drums = 0;
 816        devc->fm_info.perc_mode = 0;
 817
 818        opl3_reset(dev);
 819}
 820
 821static void opl3_hw_control(int dev, unsigned char *event)
 822{
 823}
 824
 825static int opl3_load_patch(int dev, int format, const char *addr,
 826                int offs, int count, int pmgr_flag)
 827{
 828        struct sbi_instrument ins;
 829
 830        if (count <sizeof(ins))
 831        {
 832                printk(KERN_WARNING "FM Error: Patch record too short\n");
 833                return -EINVAL;
 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;            /* Vibrato on */ \
 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         * Adjust the amount of vibrato depending the pressure
 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                 * Not implemented yet
 918                 */
 919        }
 920        else
 921        {
 922                SET_VIBRATO(1);
 923
 924                if ((instr->operators[10] & 0x01))      /*
 925                                                         * Additive synthesis
 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                         * Not keyed on
 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                                 * Least significant bits of fnumber
 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 ||       /* Instrument not loaded */
1014                devc->nr_voice != 12)   /* Not in 4 OP mode */
1015                is4op = 0;
1016        else if (devc->nr_voice == 12)  /* 4 OP mode */
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)       /* 4 OP mode. Use the '2 OP only' operators first */
1029                        first = p = 6;
1030                else
1031                        first = p = 0;
1032                avail = devc->nr_voice;
1033        }
1034
1035        /*
1036         *    Now try to find a free voice
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)          /* Find oldest playing note */
1047                {
1048                        best_time = alloc->alloc_times[p];
1049                        best = p;
1050                }
1051                p = (p + 1) % avail;
1052        }
1053
1054        /*
1055         *    Insert some kind of priority mechanism here.
1056         */
1057
1058        if (best < 0)
1059                best = 0;
1060        if (best > devc->nr_voice)
1061                best -= devc->nr_voice;
1062
1063        return best;    /* All devc->voc in use. Select the first one. */
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
1105int opl3_init(int ioaddr, int *osp, 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
1194EXPORT_SYMBOL(opl3_init);
1195EXPORT_SYMBOL(opl3_detect);
1196
1197static int me;
1198
1199static int io = -1;
1200
1201MODULE_PARM(io, "i");
1202
1203static int __init init_opl3 (void)
1204{
1205        printk(KERN_INFO "YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1996\n");
1206
1207        if (io != -1)   /* User loading pure OPL3 module */
1208        {
1209                if (!opl3_detect(io, NULL))
1210                {
1211                        return -ENODEV;
1212                }
1213
1214                me = opl3_init(io, NULL, THIS_MODULE);
1215        }
1216
1217        return 0;
1218}
1219
1220static void __exit cleanup_opl3(void)
1221{
1222        if (devc && io != -1)
1223        {
1224                if (devc->base) {
1225                        release_region(devc->base,4);
1226                        if (devc->is_opl4)
1227                                release_region(devc->base - 8, 2);
1228                }
1229                kfree(devc);
1230                devc = NULL;
1231                sound_unload_synthdev(me);
1232        }
1233}
1234
1235module_init(init_opl3);
1236module_exit(cleanup_opl3);
1237
1238#ifndef MODULE
1239static int __init setup_opl3(char *str)
1240{
1241        /* io  */
1242        int ints[2];
1243        
1244        str = get_options(str, ARRAY_SIZE(ints), ints);
1245        
1246        io = ints[1];
1247
1248        return 1;
1249}
1250
1251__setup("opl3=", setup_opl3);
1252#endif
1253MODULE_LICENSE("GPL");
1254
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.