linux/include/sound/emux_synth.h
<<
>>
Prefs
   1#ifndef __SOUND_EMUX_SYNTH_H
   2#define __SOUND_EMUX_SYNTH_H
   3
   4/*
   5 *  Defines for the Emu-series WaveTable chip
   6 *
   7 *  Copyright (C) 2000 Takashi Iwai <tiwai@suse.de>
   8 *
   9 *   This program is free software; you can redistribute it and/or modify
  10 *   it under the terms of the GNU General Public License as published by
  11 *   the Free Software Foundation; either version 2 of the License, or
  12 *   (at your option) any later version.
  13 *
  14 *   This program is distributed in the hope that it will be useful,
  15 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 *   GNU General Public License for more details.
  18 *
  19 *   You should have received a copy of the GNU General Public License
  20 *   along with this program; if not, write to the Free Software
  21 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22 */
  23
  24#include "seq_kernel.h"
  25#include "seq_device.h"
  26#include "soundfont.h"
  27#include "seq_midi_emul.h"
  28#ifdef CONFIG_SND_SEQUENCER_OSS
  29#include "seq_oss.h"
  30#endif
  31#include "emux_legacy.h"
  32#include "seq_virmidi.h"
  33
  34/*
  35 * compile flags
  36 */
  37#define SNDRV_EMUX_USE_RAW_EFFECT
  38
  39struct snd_emux;
  40struct snd_emux_port;
  41struct snd_emux_voice;
  42struct snd_emux_effect_table;
  43
  44/*
  45 * operators
  46 */
  47struct snd_emux_operators {
  48        struct module *owner;
  49        struct snd_emux_voice *(*get_voice)(struct snd_emux *emu,
  50                                            struct snd_emux_port *port);
  51        int (*prepare)(struct snd_emux_voice *vp);
  52        void (*trigger)(struct snd_emux_voice *vp);
  53        void (*release)(struct snd_emux_voice *vp);
  54        void (*update)(struct snd_emux_voice *vp, int update);
  55        void (*terminate)(struct snd_emux_voice *vp);
  56        void (*free_voice)(struct snd_emux_voice *vp);
  57        void (*reset)(struct snd_emux *emu, int ch);
  58        /* the first parameters are struct snd_emux */
  59        int (*sample_new)(struct snd_emux *emu, struct snd_sf_sample *sp,
  60                          struct snd_util_memhdr *hdr,
  61                          const void __user *data, long count);
  62        int (*sample_free)(struct snd_emux *emu, struct snd_sf_sample *sp,
  63                           struct snd_util_memhdr *hdr);
  64        void (*sample_reset)(struct snd_emux *emu);
  65        int (*load_fx)(struct snd_emux *emu, int type, int arg,
  66                       const void __user *data, long count);
  67        void (*sysex)(struct snd_emux *emu, char *buf, int len, int parsed,
  68                      struct snd_midi_channel_set *chset);
  69#ifdef CONFIG_SND_SEQUENCER_OSS
  70        int (*oss_ioctl)(struct snd_emux *emu, int cmd, int p1, int p2);
  71#endif
  72};
  73
  74
  75/*
  76 * constant values
  77 */
  78#define SNDRV_EMUX_MAX_PORTS            32      /* max # of sequencer ports */
  79#define SNDRV_EMUX_MAX_VOICES           64      /* max # of voices */
  80#define SNDRV_EMUX_MAX_MULTI_VOICES     16      /* max # of playable voices
  81                                                 * simultineously
  82                                                 */
  83
  84/*
  85 * flags
  86 */
  87#define SNDRV_EMUX_ACCEPT_ROM           (1<<0)
  88
  89/*
  90 * emuX wavetable
  91 */
  92struct snd_emux {
  93
  94        struct snd_card *card;  /* assigned card */
  95
  96        /* following should be initialized before registration */
  97        int max_voices;         /* Number of voices */
  98        int mem_size;           /* memory size (in byte) */
  99        int num_ports;          /* number of ports to be created */
 100        int pitch_shift;        /* pitch shift value (for Emu10k1) */
 101        struct snd_emux_operators ops;  /* operators */
 102        void *hw;               /* hardware */
 103        unsigned long flags;    /* other conditions */
 104        int midi_ports;         /* number of virtual midi devices */
 105        int midi_devidx;        /* device offset of virtual midi */
 106        unsigned int linear_panning: 1; /* panning is linear (sbawe = 1, emu10k1 = 0) */
 107        int hwdep_idx;          /* hwdep device index */
 108        struct snd_hwdep *hwdep;        /* hwdep device */
 109
 110        /* private */
 111        int num_voices;         /* current number of voices */
 112        struct snd_sf_list *sflist;     /* root of SoundFont list */
 113        struct snd_emux_voice *voices;  /* Voices (EMU 'channel') */
 114        int use_time;   /* allocation counter */
 115        spinlock_t voice_lock;  /* Lock for voice access */
 116        struct mutex register_mutex;
 117        int client;             /* For the sequencer client */
 118        int ports[SNDRV_EMUX_MAX_PORTS];        /* The ports for this device */
 119        struct snd_emux_port *portptrs[SNDRV_EMUX_MAX_PORTS];
 120        int used;       /* use counter */
 121        char *name;     /* name of the device (internal) */
 122        struct snd_rawmidi **vmidi;
 123        struct timer_list tlist;        /* for pending note-offs */
 124        int timer_active;
 125
 126        struct snd_util_memhdr *memhdr; /* memory chunk information */
 127
 128#ifdef CONFIG_PROC_FS
 129        struct snd_info_entry *proc;
 130#endif
 131
 132#ifdef CONFIG_SND_SEQUENCER_OSS
 133        struct snd_seq_device *oss_synth;
 134#endif
 135};
 136
 137
 138/*
 139 * sequencer port information
 140 */
 141struct snd_emux_port {
 142
 143        struct snd_midi_channel_set chset;
 144        struct snd_emux *emu;
 145
 146        char port_mode;                 /* operation mode */
 147        int volume_atten;               /* emuX raw attenuation */
 148        unsigned long drum_flags;       /* drum bitmaps */
 149        int ctrls[EMUX_MD_END];         /* control parameters */
 150#ifdef SNDRV_EMUX_USE_RAW_EFFECT
 151        struct snd_emux_effect_table *effect;
 152#endif
 153#ifdef CONFIG_SND_SEQUENCER_OSS
 154        struct snd_seq_oss_arg *oss_arg;
 155#endif
 156};
 157
 158/* port_mode */
 159#define SNDRV_EMUX_PORT_MODE_MIDI               0       /* normal MIDI port */
 160#define SNDRV_EMUX_PORT_MODE_OSS_SYNTH  1       /* OSS synth port */
 161#define SNDRV_EMUX_PORT_MODE_OSS_MIDI   2       /* OSS multi channel synth port */
 162
 163/*
 164 * A structure to keep track of each hardware voice
 165 */
 166struct snd_emux_voice {
 167        int  ch;                /* Hardware channel number */
 168
 169        int  state;             /* status */
 170#define SNDRV_EMUX_ST_OFF               0x00    /* Not playing, and inactive */
 171#define SNDRV_EMUX_ST_ON                0x01    /* Note on */
 172#define SNDRV_EMUX_ST_RELEASED  (0x02|SNDRV_EMUX_ST_ON) /* Note released */
 173#define SNDRV_EMUX_ST_SUSTAINED (0x04|SNDRV_EMUX_ST_ON) /* Note sustained */
 174#define SNDRV_EMUX_ST_STANDBY   (0x08|SNDRV_EMUX_ST_ON) /* Waiting to be triggered */
 175#define SNDRV_EMUX_ST_PENDING   (0x10|SNDRV_EMUX_ST_ON) /* Note will be released */
 176#define SNDRV_EMUX_ST_LOCKED            0x100   /* Not accessible */
 177
 178        unsigned int  time;     /* An allocation time */
 179        unsigned char note;     /* Note currently assigned to this voice */
 180        unsigned char key;
 181        unsigned char velocity; /* Velocity of current note */
 182
 183        struct snd_sf_zone *zone;       /* Zone assigned to this note */
 184        void *block;            /* sample block pointer (optional) */
 185        struct snd_midi_channel *chan;  /* Midi channel for this note */
 186        struct snd_emux_port *port;     /* associated port */
 187        struct snd_emux *emu;   /* assigned root info */
 188        void *hw;               /* hardware pointer (emu8000 or emu10k1) */
 189        unsigned long ontime;   /* jiffies at note triggered */
 190        
 191        /* Emu8k/Emu10k1 registers */
 192        struct soundfont_voice_info reg;
 193
 194        /* additional registers */
 195        int avol;               /* volume attenuation */
 196        int acutoff;            /* cutoff target */
 197        int apitch;             /* pitch offset */
 198        int apan;               /* pan/aux pair */
 199        int aaux;
 200        int ptarget;            /* pitch target */
 201        int vtarget;            /* volume target */
 202        int ftarget;            /* filter target */
 203
 204};
 205
 206/*
 207 * update flags (can be combined)
 208 */
 209#define SNDRV_EMUX_UPDATE_VOLUME                (1<<0)
 210#define SNDRV_EMUX_UPDATE_PITCH         (1<<1)
 211#define SNDRV_EMUX_UPDATE_PAN           (1<<2)
 212#define SNDRV_EMUX_UPDATE_FMMOD         (1<<3)
 213#define SNDRV_EMUX_UPDATE_TREMFREQ      (1<<4)
 214#define SNDRV_EMUX_UPDATE_FM2FRQ2               (1<<5)
 215#define SNDRV_EMUX_UPDATE_Q             (1<<6)
 216
 217
 218#ifdef SNDRV_EMUX_USE_RAW_EFFECT
 219/*
 220 * effect table
 221 */
 222struct snd_emux_effect_table {
 223        /* Emu8000 specific effects */
 224        short val[EMUX_NUM_EFFECTS];
 225        unsigned char flag[EMUX_NUM_EFFECTS];
 226};
 227#endif /* SNDRV_EMUX_USE_RAW_EFFECT */
 228
 229
 230/*
 231 * prototypes - interface to Emu10k1 and Emu8k routines
 232 */
 233int snd_emux_new(struct snd_emux **remu);
 234int snd_emux_register(struct snd_emux *emu, struct snd_card *card, int index, char *name);
 235int snd_emux_free(struct snd_emux *emu);
 236
 237/*
 238 * exported functions
 239 */
 240void snd_emux_terminate_all(struct snd_emux *emu);
 241void snd_emux_lock_voice(struct snd_emux *emu, int voice);
 242void snd_emux_unlock_voice(struct snd_emux *emu, int voice);
 243
 244#endif /* __SOUND_EMUX_SYNTH_H */
 245