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