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