Pull move-iosapic-to-acpi into release branch
[linux-2.6] / include / sound / ainstr_iw.h
1 /*
2  *  Advanced Linux Sound Architecture
3  *
4  *  InterWave FFFF Instrument Format
5  *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
6  *
7  *
8  *   This program is free software; you can redistribute it and/or modify
9  *   it under the terms of the GNU General Public License as published by
10  *   the Free Software Foundation; either version 2 of the License, or
11  *   (at your option) any later version.
12  *
13  *   This program is distributed in the hope that it will be useful,
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *   GNU General Public License for more details.
17  *
18  *   You should have received a copy of the GNU General Public License
19  *   along with this program; if not, write to the Free Software
20  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  *
22  */
23
24 #ifndef __SOUND_AINSTR_IW_H
25 #define __SOUND_AINSTR_IW_H
26
27 #ifndef __KERNEL__
28 #include <asm/types.h>
29 #include <asm/byteorder.h>
30 #endif
31
32 /*
33  *  share types (share ID 1)
34  */
35
36 #define IWFFFF_SHARE_FILE               0
37
38 /*
39  *  wave formats
40  */
41
42 #define IWFFFF_WAVE_16BIT               0x0001  /* 16-bit wave */
43 #define IWFFFF_WAVE_UNSIGNED            0x0002  /* unsigned wave */
44 #define IWFFFF_WAVE_INVERT              0x0002  /* same as unsigned wave */
45 #define IWFFFF_WAVE_BACKWARD            0x0004  /* backward mode (maybe used for reverb or ping-ping loop) */
46 #define IWFFFF_WAVE_LOOP                0x0008  /* loop mode */
47 #define IWFFFF_WAVE_BIDIR               0x0010  /* bidirectional mode */
48 #define IWFFFF_WAVE_ULAW                0x0020  /* uLaw compressed wave */
49 #define IWFFFF_WAVE_RAM                 0x0040  /* wave is _preloaded_ in RAM (it is used for ROM simulation) */
50 #define IWFFFF_WAVE_ROM                 0x0080  /* wave is in ROM */
51 #define IWFFFF_WAVE_STEREO              0x0100  /* wave is stereo */
52
53 /*
54  *  Wavetable definitions
55  */
56
57 typedef struct iwffff_wave {
58         unsigned int share_id[4];       /* share id - zero = no sharing */
59         unsigned int format;            /* wave format */
60
61         struct {
62                 unsigned int number;    /* some other ID for this wave */
63                 unsigned int memory;    /* begin of waveform in onboard memory */
64                 unsigned char *ptr;     /* pointer to waveform in system memory */
65         } address;
66
67         unsigned int size;              /* size of waveform in samples */
68         unsigned int start;             /* start offset in samples * 16 (lowest 4 bits - fraction) */
69         unsigned int loop_start;        /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
70         unsigned int loop_end;          /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
71         unsigned short loop_repeat;     /* loop repeat - 0 = forever */
72         unsigned int sample_ratio;      /* sample ratio (44100 * 1024 / rate) */
73         unsigned char attenuation;      /* 0 - 127 (no corresponding midi controller) */
74         unsigned char low_note;         /* lower frequency range for this waveform */
75         unsigned char high_note;        /* higher frequency range for this waveform */
76         unsigned char pad;
77   
78         struct iwffff_wave *next;
79 } iwffff_wave_t;
80
81 /*
82  *  Layer
83  */
84
85 #define IWFFFF_LFO_SHAPE_TRIANGLE       0
86 #define IWFFFF_LFO_SHAPE_POSTRIANGLE    1
87
88 typedef struct iwffff_lfo {
89         unsigned short freq;            /* (0-2047) 0.01Hz - 21.5Hz */
90         signed short depth;             /* volume +- (0-255) 0.48675dB/step */
91         signed short sweep;             /* 0 - 950 deciseconds */
92         unsigned char shape;            /* see to IWFFFF_LFO_SHAPE_XXXX */
93         unsigned char delay;            /* 0 - 255 deciseconds */
94 } iwffff_lfo_t;
95
96 #define IWFFFF_ENV_FLAG_RETRIGGER       0x0001  /* flag - retrigger */
97
98 #define IWFFFF_ENV_MODE_ONE_SHOT        0x0001  /* mode - one shot */
99 #define IWFFFF_ENV_MODE_SUSTAIN         0x0002  /* mode - sustain */
100 #define IWFFFF_ENV_MODE_NO_SUSTAIN      0x0003  /* mode - no sustain */
101
102 #define IWFFFF_ENV_INDEX_VELOCITY       0x0001  /* index - velocity */
103 #define IWFFFF_ENV_INDEX_FREQUENCY      0x0002  /* index - frequency */
104
105 typedef struct iwffff_env_point {
106         unsigned short offset;
107         unsigned short rate;
108 } iwffff_env_point_t;
109
110 typedef struct iwffff_env_record {
111         unsigned short nattack;
112         unsigned short nrelease;
113         unsigned short sustain_offset;
114         unsigned short sustain_rate;
115         unsigned short release_rate;
116         unsigned char hirange;
117         unsigned char pad;
118         struct iwffff_env_record *next;
119         /* points are stored here */
120         /* count of points = nattack + nrelease */
121 } iwffff_env_record_t;
122
123 typedef struct iwffff_env {
124         unsigned char flags;
125         unsigned char mode;
126         unsigned char index;
127         unsigned char pad;
128         struct iwffff_env_record *record;
129 } iwffff_env_t;
130
131 #define IWFFFF_LAYER_FLAG_RETRIGGER     0x0001  /* retrigger */
132
133 #define IWFFFF_LAYER_VELOCITY_TIME      0x0000  /* velocity mode = time */
134 #define IWFFFF_LAYER_VELOCITY_RATE      0x0001  /* velocity mode = rate */
135
136 #define IWFFFF_LAYER_EVENT_KUP          0x0000  /* layer event - key up */
137 #define IWFFFF_LAYER_EVENT_KDOWN        0x0001  /* layer event - key down */
138 #define IWFFFF_LAYER_EVENT_RETRIG       0x0002  /* layer event - retrigger */
139 #define IWFFFF_LAYER_EVENT_LEGATO       0x0003  /* layer event - legato */
140
141 typedef struct iwffff_layer {
142         unsigned char flags;
143         unsigned char velocity_mode;
144         unsigned char layer_event;
145         unsigned char low_range;        /* range for layer based */
146         unsigned char high_range;       /* on either velocity or frequency */
147         unsigned char pan;              /* pan offset from CC1 (0 left - 127 right) */
148         unsigned char pan_freq_scale;   /* position based on frequency (0-127) */
149         unsigned char attenuation;      /* 0-127 (no corresponding midi controller) */
150         iwffff_lfo_t tremolo;           /* tremolo effect */
151         iwffff_lfo_t vibrato;           /* vibrato effect */
152         unsigned short freq_scale;      /* 0-2048, 1024 is equal to semitone scaling */
153         unsigned char freq_center;      /* center for keyboard frequency scaling */
154         unsigned char pad;
155         iwffff_env_t penv;              /* pitch envelope */
156         iwffff_env_t venv;              /* volume envelope */
157
158         iwffff_wave_t *wave;
159         struct iwffff_layer *next;
160 } iwffff_layer_t;
161
162 /*
163  *  Instrument
164  */
165
166 #define IWFFFF_EXCLUDE_NONE             0x0000  /* exclusion mode - none */
167 #define IWFFFF_EXCLUDE_SINGLE           0x0001  /* exclude single - single note from the instrument group */
168 #define IWFFFF_EXCLUDE_MULTIPLE         0x0002  /* exclude multiple - stop only same note from this instrument */
169
170 #define IWFFFF_LAYER_NONE               0x0000  /* not layered */
171 #define IWFFFF_LAYER_ON                 0x0001  /* layered */
172 #define IWFFFF_LAYER_VELOCITY           0x0002  /* layered by velocity */
173 #define IWFFFF_LAYER_FREQUENCY          0x0003  /* layered by frequency */
174
175 #define IWFFFF_EFFECT_NONE              0
176 #define IWFFFF_EFFECT_REVERB            1
177 #define IWFFFF_EFFECT_CHORUS            2
178 #define IWFFFF_EFFECT_ECHO              3
179
180 typedef struct {
181         unsigned short exclusion;
182         unsigned short layer_type;
183         unsigned short exclusion_group; /* 0 - none, 1-65535 */
184
185         unsigned char effect1;          /* effect 1 */
186         unsigned char effect1_depth;    /* 0-127 */
187         unsigned char effect2;          /* effect 2 */
188         unsigned char effect2_depth;    /* 0-127 */
189
190         iwffff_layer_t *layer;          /* first layer */
191 } iwffff_instrument_t;
192
193 /*
194  *
195  *    Kernel <-> user space
196  *    Hardware (CPU) independent section
197  *
198  *    * = zero or more
199  *    + = one or more
200  *
201  *    iwffff_xinstrument                IWFFFF_STRU_INSTR
202  *      +iwffff_xlayer                  IWFFFF_STRU_LAYER
203  *        *iwffff_xenv_record           IWFFFF_STRU_ENV_RECT (tremolo)
204  *        *iwffff_xenv_record           IWFFFF_STRU_EVN_RECT (vibrato)
205  *          +iwffff_xwave               IWFFFF_STRU_WAVE
206  *
207  */
208
209 #define IWFFFF_STRU_WAVE        __cpu_to_be32(('W'<<24)|('A'<<16)|('V'<<8)|'E')
210 #define IWFFFF_STRU_ENV_RECP    __cpu_to_be32(('E'<<24)|('N'<<16)|('R'<<8)|'P')
211 #define IWFFFF_STRU_ENV_RECV    __cpu_to_be32(('E'<<24)|('N'<<16)|('R'<<8)|'V')
212 #define IWFFFF_STRU_LAYER       __cpu_to_be32(('L'<<24)|('A'<<16)|('Y'<<8)|'R')
213 #define IWFFFF_STRU_INSTR       __cpu_to_be32(('I'<<24)|('N'<<16)|('S'<<8)|'T')
214
215 /*
216  *  Wavetable definitions
217  */
218
219 typedef struct iwffff_xwave {
220         __u32 stype;                    /* structure type */
221
222         __u32 share_id[4];              /* share id - zero = no sharing */
223
224         __u32 format;                   /* wave format */
225         __u32 offset;                   /* offset to ROM (address) */
226
227         __u32 size;                     /* size of waveform in samples */
228         __u32 start;                    /* start offset in samples * 16 (lowest 4 bits - fraction) */
229         __u32 loop_start;               /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
230         __u32 loop_end;                 /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
231         __u16 loop_repeat;              /* loop repeat - 0 = forever */
232         __u32 sample_ratio;             /* sample ratio (44100 * 1024 / rate) */
233         __u8 attenuation;               /* 0 - 127 (no corresponding midi controller) */
234         __u8 low_note;                  /* lower frequency range for this waveform */
235         __u8 high_note;                 /* higher frequency range for this waveform */
236         __u8 pad;
237 } iwffff_xwave_t;
238
239 /*
240  *  Layer
241  */
242
243 typedef struct iwffff_xlfo {
244         __u16 freq;                     /* (0-2047) 0.01Hz - 21.5Hz */
245         __s16 depth;                    /* volume +- (0-255) 0.48675dB/step */
246         __s16 sweep;                    /* 0 - 950 deciseconds */
247         __u8 shape;                     /* see to ULTRA_IW_LFO_SHAPE_XXXX */
248         __u8 delay;                     /* 0 - 255 deciseconds */
249 } iwffff_xlfo_t;
250
251 typedef struct iwffff_xenv_point {
252         __u16 offset;
253         __u16 rate;
254 } iwffff_xenv_point_t;
255
256 typedef struct iwffff_xenv_record {
257         __u32 stype;
258         __u16 nattack;
259         __u16 nrelease;
260         __u16 sustain_offset;
261         __u16 sustain_rate;
262         __u16 release_rate;
263         __u8 hirange;
264         __u8 pad;
265         /* points are stored here.. */
266         /* count of points = nattack + nrelease */
267 } iwffff_xenv_record_t;
268
269 typedef struct iwffff_xenv {
270         __u8 flags;
271         __u8 mode;
272         __u8 index;
273         __u8 pad;
274 } iwffff_xenv_t;
275
276 typedef struct iwffff_xlayer {
277         __u32 stype;
278         __u8 flags;
279         __u8 velocity_mode;
280         __u8 layer_event;
281         __u8 low_range;                 /* range for layer based */
282         __u8 high_range;                /* on either velocity or frequency */
283         __u8 pan;                       /* pan offset from CC1 (0 left - 127 right) */
284         __u8 pan_freq_scale;            /* position based on frequency (0-127) */
285         __u8 attenuation;               /* 0-127 (no corresponding midi controller) */
286         iwffff_xlfo_t tremolo;          /* tremolo effect */
287         iwffff_xlfo_t vibrato;          /* vibrato effect */
288         __u16 freq_scale;               /* 0-2048, 1024 is equal to semitone scaling */
289         __u8 freq_center;               /* center for keyboard frequency scaling */
290         __u8 pad;
291         iwffff_xenv_t penv;             /* pitch envelope */
292         iwffff_xenv_t venv;             /* volume envelope */
293 } iwffff_xlayer_t;
294
295 /*
296  *  Instrument
297  */
298
299 typedef struct iwffff_xinstrument {
300         __u32 stype;
301         
302         __u16 exclusion;
303         __u16 layer_type;
304         __u16 exclusion_group;          /* 0 - none, 1-65535 */
305
306         __u8 effect1;                   /* effect 1 */
307         __u8 effect1_depth;             /* 0-127 */
308         __u8 effect2;                   /* effect 2 */
309         __u8 effect2_depth;             /* 0-127 */
310 } iwffff_xinstrument_t;
311
312 /*
313  *  ROM support
314  *    InterWave ROMs are Little-Endian (x86)
315  */
316
317 #define IWFFFF_ROM_HDR_SIZE     512
318
319 typedef struct {
320         __u8 iwave[8];
321         __u8 revision;
322         __u8 series_number;
323         __u8 series_name[16];
324         __u8 date[10];
325         __u16 vendor_revision_major;
326         __u16 vendor_revision_minor;
327         __u32 rom_size;
328         __u8 copyright[128];
329         __u8 vendor_name[64];
330         __u8 description[128];
331 } iwffff_rom_header_t;
332
333 /*
334  *  Instrument info
335  */
336
337 #define IWFFFF_INFO_LFO_VIBRATO         (1<<0)
338 #define IWFFFF_INFO_LFO_VIBRATO_SHAPE   (1<<1)
339 #define IWFFFF_INFO_LFO_TREMOLO         (1<<2)
340 #define IWFFFF_INFO_LFO_TREMOLO_SHAPE   (1<<3)
341
342 typedef struct iwffff_info {
343         unsigned int format;            /* supported format bits */
344         unsigned int effects;           /* supported effects (1 << IWFFFF_EFFECT*) */
345         unsigned int lfos;              /* LFO effects */
346         unsigned int max8_len;          /* maximum 8-bit wave length */
347         unsigned int max16_len;         /* maximum 16-bit wave length */
348 } iwffff_info_t;
349
350 #ifdef __KERNEL__
351
352 #include "seq_instr.h"
353
354 typedef struct {
355         void *private_data;
356         int (*info)(void *private_data, iwffff_info_t *info);
357         int (*put_sample)(void *private_data, iwffff_wave_t *wave,
358                           char __user *data, long len, int atomic);
359         int (*get_sample)(void *private_data, iwffff_wave_t *wave,
360                           char __user *data, long len, int atomic);
361         int (*remove_sample)(void *private_data, iwffff_wave_t *wave,
362                              int atomic);
363         void (*notify)(void *private_data, snd_seq_kinstr_t *instr, int what);
364         snd_seq_kinstr_ops_t kops;
365 } snd_iwffff_ops_t;
366
367 int snd_seq_iwffff_init(snd_iwffff_ops_t *ops,
368                         void *private_data,
369                         snd_seq_kinstr_ops_t *next);
370
371 #endif
372
373 #endif /* __SOUND_AINSTR_IW_H */