linux/include/sound/wavefront.h
<<
>>
Prefs
   1#ifndef __SOUND_WAVEFRONT_H__
   2#define __SOUND_WAVEFRONT_H__
   3
   4/*
   5 *  Driver for Turtle Beach Wavefront cards (Maui,Tropez,Tropez+)
   6 *
   7 *  Copyright (c) by Paul Barton-Davis <pbd@op.net>
   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#if (!defined(__GNUC__) && !defined(__GNUG__))
  25
  26     You will not be able to compile this file correctly without gcc, because
  27     it is necessary to pack the "wavefront_alias" structure to a size
  28     of 22 bytes, corresponding to 16-bit alignment (as would have been
  29     the case on the original platform, MS-DOS). If this is not done,
  30     then WavePatch-format files cannot be read/written correctly.
  31     The method used to do this here ("__attribute__((packed)") is
  32     completely compiler dependent.
  33     
  34     All other wavefront_* types end up aligned to 32 bit values and
  35     still have the same (correct) size.
  36
  37#else
  38
  39     /* However, note that as of G++ 2.7.3.2, g++ was unable to
  40        correctly parse *type* __attribute__ tags. It will do the
  41        right thing if we use the "packed" attribute on each struct
  42        member, which has the same semantics anyway. 
  43     */
  44
  45#endif /* __GNUC__ */
  46
  47/***************************** WARNING ********************************
  48  PLEASE DO NOT MODIFY THIS FILE IN ANY WAY THAT AFFECTS ITS ABILITY TO 
  49  BE USED WITH EITHER C *OR* C++.
  50 **********************************************************************/
  51
  52#ifndef NUM_MIDIKEYS 
  53#define NUM_MIDIKEYS 128
  54#endif  /* NUM_MIDIKEYS */
  55
  56#ifndef NUM_MIDICHANNELS
  57#define NUM_MIDICHANNELS 16
  58#endif  /* NUM_MIDICHANNELS */
  59
  60/* These are very useful/important. the original wavefront interface
  61   was developed on a 16 bit system, where sizeof(int) = 2
  62   bytes. Defining things like this makes the code much more portable, and
  63   easier to understand without having to toggle back and forth
  64   between a 16-bit view of the world and a 32-bit one. 
  65 */   
  66
  67#ifndef __KERNEL__
  68/* keep them for compatibility */
  69typedef short s16;
  70typedef unsigned short u16;
  71typedef int s32;
  72typedef unsigned int u32;
  73typedef char s8;
  74typedef unsigned char u8;
  75typedef s16 INT16;
  76typedef u16 UINT16;
  77typedef s32 INT32;
  78typedef u32 UINT32;
  79typedef s8 CHAR8;
  80typedef u8 UCHAR8;
  81#endif
  82
  83/* Pseudo-commands not part of the WaveFront command set.
  84   These are used for various driver controls and direct
  85   hardware control.
  86 */
  87
  88#define WFC_DEBUG_DRIVER                0
  89#define WFC_FX_IOCTL                    1
  90#define WFC_PATCH_STATUS                2
  91#define WFC_PROGRAM_STATUS              3
  92#define WFC_SAMPLE_STATUS               4
  93#define WFC_DISABLE_INTERRUPTS          5
  94#define WFC_ENABLE_INTERRUPTS           6
  95#define WFC_INTERRUPT_STATUS            7
  96#define WFC_ROMSAMPLES_RDONLY           8
  97#define WFC_IDENTIFY_SLOT_TYPE          9
  98
  99/* Wavefront synth commands
 100 */
 101
 102#define WFC_DOWNLOAD_SAMPLE             0x80
 103#define WFC_DOWNLOAD_BLOCK              0x81
 104#define WFC_DOWNLOAD_MULTISAMPLE        0x82
 105#define WFC_DOWNLOAD_SAMPLE_ALIAS       0x83
 106#define WFC_DELETE_SAMPLE               0x84
 107#define WFC_REPORT_FREE_MEMORY          0x85
 108#define WFC_DOWNLOAD_PATCH              0x86
 109#define WFC_DOWNLOAD_PROGRAM            0x87
 110#define WFC_SET_SYNTHVOL                0x89
 111#define WFC_SET_NVOICES                 0x8B
 112#define WFC_DOWNLOAD_DRUM               0x90
 113#define WFC_GET_SYNTHVOL                0x92
 114#define WFC_GET_NVOICES                 0x94
 115#define WFC_DISABLE_CHANNEL             0x9A
 116#define WFC_ENABLE_CHANNEL              0x9B
 117#define WFC_MISYNTH_OFF                 0x9D
 118#define WFC_MISYNTH_ON                  0x9E
 119#define WFC_FIRMWARE_VERSION            0x9F
 120#define WFC_GET_NSAMPLES                0xA0
 121#define WFC_DISABLE_DRUM_PROGRAM        0xA2
 122#define WFC_UPLOAD_PATCH                0xA3
 123#define WFC_UPLOAD_PROGRAM              0xA4
 124#define WFC_SET_TUNING                  0xA6
 125#define WFC_GET_TUNING                  0xA7
 126#define WFC_VMIDI_ON                    0xA8
 127#define WFC_VMIDI_OFF                   0xA9
 128#define WFC_MIDI_STATUS                 0xAA
 129#define WFC_GET_CHANNEL_STATUS          0xAB
 130#define WFC_DOWNLOAD_SAMPLE_HEADER      0xAC
 131#define WFC_UPLOAD_SAMPLE_HEADER        0xAD
 132#define WFC_UPLOAD_MULTISAMPLE          0xAE
 133#define WFC_UPLOAD_SAMPLE_ALIAS         0xAF
 134#define WFC_IDENTIFY_SAMPLE_TYPE        0xB0
 135#define WFC_DOWNLOAD_EDRUM_PROGRAM      0xB1
 136#define WFC_UPLOAD_EDRUM_PROGRAM        0xB2
 137#define WFC_SET_EDRUM_CHANNEL           0xB3
 138#define WFC_INSTOUT_LEVELS              0xB4
 139#define WFC_PEAKOUT_LEVELS              0xB5
 140#define WFC_REPORT_CHANNEL_PROGRAMS     0xB6
 141#define WFC_HARDWARE_VERSION            0xCF
 142#define WFC_UPLOAD_SAMPLE_PARAMS        0xD7
 143#define WFC_DOWNLOAD_OS                 0xF1
 144#define WFC_NOOP                        0xFF
 145
 146#define WF_MAX_SAMPLE   512
 147#define WF_MAX_PATCH    256
 148#define WF_MAX_PROGRAM  128
 149
 150#define WF_SECTION_MAX  44   /* longest OS section length */
 151
 152/* # of bytes we send to the board when sending it various kinds of
 153   substantive data, such as samples, patches and programs.
 154*/
 155
 156#define WF_PROGRAM_BYTES 32
 157#define WF_PATCH_BYTES 132
 158#define WF_SAMPLE_BYTES 27
 159#define WF_SAMPLE_HDR_BYTES 25
 160#define WF_ALIAS_BYTES 25
 161#define WF_DRUM_BYTES 9
 162#define WF_MSAMPLE_BYTES 259 /* (MIDI_KEYS * 2) + 3 */
 163
 164#define WF_ACK     0x80
 165#define WF_DMA_ACK 0x81
 166
 167/* OR-values for MIDI status bits */
 168
 169#define WF_MIDI_VIRTUAL_ENABLED 0x1
 170#define WF_MIDI_VIRTUAL_IS_EXTERNAL 0x2
 171#define WF_MIDI_IN_TO_SYNTH_DISABLED 0x4
 172
 173/* slot indexes for struct address_info: makes code a little more mnemonic */
 174
 175#define WF_SYNTH_SLOT         0
 176#define WF_INTERNAL_MIDI_SLOT 1
 177#define WF_EXTERNAL_MIDI_SLOT 2
 178
 179/* Magic MIDI bytes used to switch I/O streams on the ICS2115 MPU401
 180   emulation. Note these NEVER show up in output from the device and
 181   should NEVER be used in input unless Virtual MIDI mode has been 
 182   disabled. If they do show up as input, the results are unpredictable.
 183*/
 184
 185#define WF_EXTERNAL_SWITCH  0xFD
 186#define WF_INTERNAL_SWITCH  0xF9
 187
 188/* Debugging flags */
 189
 190#define WF_DEBUG_CMD 0x1
 191#define WF_DEBUG_DATA 0x2
 192#define WF_DEBUG_LOAD_PATCH 0x4
 193#define WF_DEBUG_IO 0x8
 194
 195/* WavePatch file format stuff */
 196
 197#define WF_WAVEPATCH_VERSION     120;  /*  Current version number (1.2)  */
 198#define WF_MAX_COMMENT           64    /*  Comment length */
 199#define WF_NUM_LAYERS            4
 200#define WF_NAME_LENGTH           32
 201#define WF_SOURCE_LENGTH         260
 202
 203#define BankFileID     "Bank"
 204#define DrumkitFileID  "DrumKit"
 205#define ProgramFileID  "Program"
 206
 207struct wf_envelope
 208{
 209    u8 attack_time:7;
 210    u8 Unused1:1;
 211
 212    u8 decay1_time:7;
 213    u8 Unused2:1;
 214
 215    u8 decay2_time:7;
 216    u8 Unused3:1;
 217
 218    u8 sustain_time:7;
 219    u8 Unused4:1;
 220
 221    u8 release_time:7;
 222    u8 Unused5:1;
 223
 224    u8 release2_time:7;
 225    u8 Unused6:1;
 226
 227    s8 attack_level;
 228    s8 decay1_level;
 229    s8 decay2_level;
 230    s8 sustain_level;
 231    s8 release_level;
 232
 233    u8 attack_velocity:7;
 234    u8 Unused7:1;
 235
 236    u8 volume_velocity:7;
 237    u8 Unused8:1;
 238
 239    u8 keyboard_scaling:7;
 240    u8 Unused9:1;
 241};
 242typedef struct wf_envelope wavefront_envelope;
 243
 244struct wf_lfo
 245{
 246    u8 sample_number;
 247
 248    u8 frequency:7;
 249    u8 Unused1:1;
 250
 251    u8 am_src:4;
 252    u8 fm_src:4;
 253
 254    s8 fm_amount;
 255    s8 am_amount;
 256    s8 start_level;
 257    s8 end_level;
 258
 259    u8 ramp_delay:7;
 260    u8 wave_restart:1; /* for LFO2 only */
 261
 262    u8 ramp_time:7;
 263    u8 Unused2:1;
 264};
 265typedef struct wf_lfo wavefront_lfo;
 266
 267struct wf_patch
 268{
 269    s16  frequency_bias;         /*  ** THIS IS IN MOTOROLA FORMAT!! ** */
 270
 271    u8 amplitude_bias:7;
 272    u8 Unused1:1;
 273
 274    u8 portamento:7;
 275    u8 Unused2:1;
 276
 277    u8 sample_number;
 278
 279    u8 pitch_bend:4;
 280    u8 sample_msb:1;
 281    u8 Unused3:3;
 282
 283    u8 mono:1;
 284    u8 retrigger:1;
 285    u8 nohold:1;
 286    u8 restart:1;
 287    u8 filterconfig:2; /* SDK says "not used" */
 288    u8 reuse:1;
 289    u8 reset_lfo:1;    
 290
 291    u8 fm_src2:4;
 292    u8 fm_src1:4;   
 293
 294    s8 fm_amount1;
 295    s8 fm_amount2;
 296
 297    u8 am_src:4;
 298    u8 Unused4:4;
 299
 300    s8 am_amount;
 301
 302    u8 fc1_mode:4;
 303    u8 fc2_mode:4;
 304
 305    s8 fc1_mod_amount;
 306    s8 fc1_keyboard_scaling;
 307    s8 fc1_bias;
 308    s8 fc2_mod_amount;
 309    s8 fc2_keyboard_scaling;
 310    s8 fc2_bias;
 311
 312    u8 randomizer:7;
 313    u8 Unused5:1;
 314
 315    struct wf_envelope envelope1;
 316    struct wf_envelope envelope2;
 317    struct wf_lfo lfo1;
 318    struct wf_lfo lfo2;
 319};
 320typedef struct wf_patch wavefront_patch;
 321
 322struct wf_layer
 323{
 324    u8 patch_number;
 325
 326    u8 mix_level:7;
 327    u8 mute:1;
 328
 329    u8 split_point:7;
 330    u8 play_below:1;
 331
 332    u8 pan_mod_src:2;
 333    u8 pan_or_mod:1;
 334    u8 pan:4;
 335    u8 split_type:1;
 336};
 337typedef struct wf_layer wavefront_layer;
 338
 339struct wf_program
 340{
 341    struct wf_layer layer[WF_NUM_LAYERS];
 342};
 343typedef struct wf_program wavefront_program;
 344
 345struct wf_sample_offset
 346{
 347    s32 Fraction:4;
 348    s32 Integer:20;
 349    s32 Unused:8;
 350};
 351typedef struct wf_sample_offset wavefront_sample_offset;          
 352     
 353/* Sample slot types */
 354
 355#define WF_ST_SAMPLE      0
 356#define WF_ST_MULTISAMPLE 1
 357#define WF_ST_ALIAS       2
 358#define WF_ST_EMPTY       3
 359
 360/* pseudo's */
 361
 362#define WF_ST_DRUM        4
 363#define WF_ST_PROGRAM     5
 364#define WF_ST_PATCH       6
 365#define WF_ST_SAMPLEHDR   7
 366
 367#define WF_ST_MASK        0xf
 368
 369/* Flags for slot status. These occupy the upper bits of the same byte
 370   as a sample type.
 371*/
 372
 373#define WF_SLOT_USED      0x80   /* XXX don't rely on this being accurate */
 374#define WF_SLOT_FILLED    0x40
 375#define WF_SLOT_ROM       0x20
 376
 377#define WF_SLOT_MASK      0xf0
 378
 379/* channel constants */
 380
 381#define WF_CH_MONO  0
 382#define WF_CH_LEFT  1
 383#define WF_CH_RIGHT 2
 384
 385/* Sample formats */
 386
 387#define LINEAR_16BIT 0
 388#define WHITE_NOISE  1
 389#define LINEAR_8BIT  2
 390#define MULAW_8BIT   3
 391
 392#define WF_SAMPLE_IS_8BIT(smpl) ((smpl)->SampleResolution&2)
 393
 394
 395/* 
 396
 397  Because most/all of the sample data we pass in via pointers has
 398  never been copied (just mmap-ed into user space straight from the
 399  disk), it would be nice to allow handling of multi-channel sample
 400  data without forcing user-level extraction of the relevant bytes.
 401  
 402  So, we need a way of specifying which channel to use (the WaveFront
 403  only handles mono samples in a given slot), and the only way to do
 404  this without using some struct other than wavefront_sample as the
 405  interface is the awful hack of using the unused bits in a
 406  wavefront_sample:
 407  
 408  Val      Meaning
 409  ---      -------
 410  0        no channel selection (use channel 1, sample is MONO)
 411  1        use first channel, and skip one
 412  2        use second channel, and skip one
 413  3        use third channel, and skip two
 414  4        use fourth channel, skip three
 415  5        use fifth channel, skip four
 416  6        use six channel, skip five
 417
 418
 419  This can handle up to 4 channels, and anyone downloading >4 channels
 420  of sample data just to select one of them needs to find some tools
 421  like sox ...
 422
 423  NOTE: values 0, 1 and 2 correspond to WF_CH_* above. This is 
 424  important.
 425
 426*/
 427
 428#define WF_SET_CHANNEL(samp,chn) \
 429 (samp)->Unused1 = chn & 0x1; \
 430 (samp)->Unused2 = chn & 0x2; \
 431 (samp)->Unused3 = chn & 0x4 
 432  
 433#define WF_GET_CHANNEL(samp) \
 434  (((samp)->Unused3 << 2)|((samp)->Unused2<<1)|(samp)->Unused1)
 435  
 436typedef struct wf_sample {
 437    struct wf_sample_offset sampleStartOffset;
 438    struct wf_sample_offset loopStartOffset;
 439    struct wf_sample_offset loopEndOffset;
 440    struct wf_sample_offset sampleEndOffset;
 441    s16 FrequencyBias;
 442    u8 SampleResolution:2;  /* sample_format */
 443    u8 Unused1:1;
 444    u8 Loop:1;
 445    u8 Bidirectional:1;
 446    u8 Unused2:1;
 447    u8 Reverse:1;
 448    u8 Unused3:1;
 449} wavefront_sample;
 450
 451typedef struct wf_multisample {
 452    s16 NumberOfSamples;   /* log2 of the number of samples */
 453    s16 SampleNumber[NUM_MIDIKEYS];
 454} wavefront_multisample;
 455
 456typedef struct wf_alias {
 457    s16 OriginalSample;
 458
 459    struct wf_sample_offset sampleStartOffset;
 460    struct wf_sample_offset loopStartOffset;
 461    struct wf_sample_offset sampleEndOffset;
 462    struct wf_sample_offset loopEndOffset;
 463
 464    s16  FrequencyBias;
 465
 466    u8 SampleResolution:2;
 467    u8 Unused1:1;
 468    u8 Loop:1;
 469    u8 Bidirectional:1;
 470    u8 Unused2:1;
 471    u8 Reverse:1;
 472    u8 Unused3:1;
 473    
 474    /* This structure is meant to be padded only to 16 bits on their
 475       original. Of course, whoever wrote their documentation didn't
 476       realize that sizeof(struct) can be >=
 477       sum(sizeof(struct-fields)) and so thought that giving a C level
 478       description of the structs used in WavePatch files was
 479       sufficient. I suppose it was, as long as you remember the 
 480       standard 16->32 bit issues.
 481    */
 482
 483    u8 sixteen_bit_padding;
 484} __attribute__((packed)) wavefront_alias;
 485
 486typedef struct wf_drum {
 487    u8 PatchNumber;
 488    u8 MixLevel:7;
 489    u8 Unmute:1;
 490    u8 Group:4;
 491    u8 Unused1:4;
 492    u8 PanModSource:2;
 493    u8 PanModulated:1;
 494    u8 PanAmount:4;
 495    u8 Unused2:1;
 496} wavefront_drum;
 497
 498typedef struct wf_drumkit {
 499    struct wf_drum drum[NUM_MIDIKEYS];
 500} wavefront_drumkit;
 501
 502typedef struct wf_channel_programs {
 503    u8 Program[NUM_MIDICHANNELS];
 504} wavefront_channel_programs;
 505
 506/* How to get MIDI channel status from the data returned by
 507   a WFC_GET_CHANNEL_STATUS command (a struct wf_channel_programs)
 508*/
 509
 510#define WF_CHANNEL_STATUS(ch,wcp) (wcp)[(ch/7)] & (1<<((ch)%7))
 511
 512typedef union wf_any {
 513    wavefront_sample s;
 514    wavefront_multisample ms;
 515    wavefront_alias a;
 516    wavefront_program pr;
 517    wavefront_patch p;
 518    wavefront_drum d;
 519} wavefront_any;
 520
 521/* Hannu Solvainen hoped that his "patch_info" struct in soundcard.h
 522   might work for other wave-table based patch loading situations.
 523   Alas, his fears were correct. The WaveFront doesn't even come with
 524   just "patches", but several different kind of structures that
 525   control the sound generation process.
 526 */
 527
 528typedef struct wf_patch_info {
 529    
 530    /* the first two fields are used by the OSS "patch loading" interface
 531       only, and are unused by the current user-level library.
 532    */
 533
 534    s16   key;               /* Use WAVEFRONT_PATCH here */
 535    u16  devno;             /* fill in when sending */
 536    u8  subkey;            /* WF_ST_{SAMPLE,ALIAS,etc.} */
 537
 538#define WAVEFRONT_FIND_FREE_SAMPLE_SLOT 999
 539
 540    u16  number;            /* patch/sample/prog number */
 541
 542    u32  size;              /* size of any data included in 
 543                                  one of the fields in `hdrptr', or
 544                                  as `dataptr'.
 545
 546                                  NOTE: for actual samples, this is
 547                                  the size of the *SELECTED CHANNEL*
 548                                  even if more data is actually available.
 549                                  
 550                                  So, a stereo sample (2 channels) of
 551                                  6000 bytes total has `size' = 3000.
 552
 553                                  See the macros and comments for
 554                                  WF_{GET,SET}_CHANNEL above.
 555
 556                               */
 557    wavefront_any __user *hdrptr;      /* user-space ptr to hdr bytes */
 558    u16 __user *dataptr;            /* actual sample data */
 559
 560    wavefront_any hdr;          /* kernel-space copy of hdr bytes */         
 561} wavefront_patch_info;
 562
 563/* The maximum number of bytes we will ever move to or from user space
 564   in response to a WFC_* command.  This obviously doesn't cover
 565   actual sample data.
 566*/
 567
 568#define WF_MAX_READ sizeof(wavefront_multisample)
 569#define WF_MAX_WRITE sizeof(wavefront_multisample)
 570
 571/*
 572   This allows us to execute any WF command except the download/upload
 573   ones, which are handled differently due to copyin/copyout issues as
 574   well as data-nybbling to/from the card.
 575 */
 576
 577typedef struct wavefront_control {
 578    int cmd;                           /* WFC_* */
 579    char status;                       /* return status to user-space */
 580    unsigned char rbuf[WF_MAX_READ];   /* bytes read from card */
 581    unsigned char wbuf[WF_MAX_WRITE];  /* bytes written to card */
 582} wavefront_control;
 583
 584#define WFCTL_WFCMD    0x1
 585#define WFCTL_LOAD_SPP 0x2
 586
 587/* Modulator table */
 588
 589#define WF_MOD_LFO1      0
 590#define WF_MOD_LFO2      1
 591#define WF_MOD_ENV1      2
 592#define WF_MOD_ENV2      3
 593#define WF_MOD_KEYBOARD  4
 594#define WF_MOD_LOGKEY    5
 595#define WF_MOD_VELOCITY  6
 596#define WF_MOD_LOGVEL    7
 597#define WF_MOD_RANDOM    8
 598#define WF_MOD_PRESSURE  9
 599#define WF_MOD_MOD_WHEEL 10
 600#define WF_MOD_1         WF_MOD_MOD_WHEEL 
 601#define WF_MOD_BREATH    11
 602#define WF_MOD_2         WF_MOD_BREATH
 603#define WF_MOD_FOOT      12
 604#define WF_MOD_4         WF_MOD_FOOT
 605#define WF_MOD_VOLUME    13
 606#define WF_MOD_7         WF_MOD_VOLUME
 607#define WF_MOD_PAN       14
 608#define WF_MOD_10        WF_MOD_PAN
 609#define WF_MOD_EXPR      15
 610#define WF_MOD_11        WF_MOD_EXPR
 611
 612/* FX-related material */
 613
 614typedef struct wf_fx_info {
 615    int request;             /* see list below */
 616    long data[4];             /* we don't need much */
 617} wavefront_fx_info;
 618
 619/* support for each of these will be forthcoming once I or someone 
 620   else has figured out which of the addresses on page 6 and page 7 of 
 621   the YSS225 control each parameter. Incidentally, these come from
 622   the Windows driver interface, but again, Turtle Beach didn't
 623   document the API to use them.
 624*/
 625
 626#define WFFX_SETOUTGAIN                 0
 627#define WFFX_SETSTEREOOUTGAIN           1
 628#define WFFX_SETREVERBIN1GAIN           2
 629#define WFFX_SETREVERBIN2GAIN           3
 630#define WFFX_SETREVERBIN3GAIN           4
 631#define WFFX_SETCHORUSINPORT            5
 632#define WFFX_SETREVERBIN1PORT           6
 633#define WFFX_SETREVERBIN2PORT           7
 634#define WFFX_SETREVERBIN3PORT           8
 635#define WFFX_SETEFFECTPORT              9
 636#define WFFX_SETAUXPORT                 10
 637#define WFFX_SETREVERBTYPE              11
 638#define WFFX_SETREVERBDELAY             12
 639#define WFFX_SETCHORUSLFO               13
 640#define WFFX_SETCHORUSPMD               14
 641#define WFFX_SETCHORUSAMD               15
 642#define WFFX_SETEFFECT                  16
 643#define WFFX_SETBASEALL                 17
 644#define WFFX_SETREVERBALL               18
 645#define WFFX_SETCHORUSALL               20
 646#define WFFX_SETREVERBDEF               22
 647#define WFFX_SETCHORUSDEF               23
 648#define WFFX_DELAYSETINGAIN             24
 649#define WFFX_DELAYSETFBGAIN             25
 650#define WFFX_DELAYSETFBLPF              26
 651#define WFFX_DELAYSETGAIN               27
 652#define WFFX_DELAYSETTIME               28
 653#define WFFX_DELAYSETFBTIME             29
 654#define WFFX_DELAYSETALL                30
 655#define WFFX_DELAYSETDEF                32
 656#define WFFX_SDELAYSETINGAIN            33
 657#define WFFX_SDELAYSETFBGAIN            34
 658#define WFFX_SDELAYSETFBLPF             35
 659#define WFFX_SDELAYSETGAIN              36
 660#define WFFX_SDELAYSETTIME              37
 661#define WFFX_SDELAYSETFBTIME            38
 662#define WFFX_SDELAYSETALL               39
 663#define WFFX_SDELAYSETDEF               41
 664#define WFFX_DEQSETINGAIN               42
 665#define WFFX_DEQSETFILTER               43
 666#define WFFX_DEQSETALL                  44
 667#define WFFX_DEQSETDEF                  46
 668#define WFFX_MUTE                       47
 669#define WFFX_FLANGESETBALANCE           48      
 670#define WFFX_FLANGESETDELAY             49
 671#define WFFX_FLANGESETDWFFX_TH          50
 672#define WFFX_FLANGESETFBGAIN            51
 673#define WFFX_FLANGESETINGAIN            52
 674#define WFFX_FLANGESETLFO               53
 675#define WFFX_FLANGESETALL               54
 676#define WFFX_FLANGESETDEF               56
 677#define WFFX_PITCHSETSHIFT              57
 678#define WFFX_PITCHSETBALANCE            58
 679#define WFFX_PITCHSETALL                59
 680#define WFFX_PITCHSETDEF                61
 681#define WFFX_SRSSETINGAIN               62
 682#define WFFX_SRSSETSPACE                63
 683#define WFFX_SRSSETCENTER               64
 684#define WFFX_SRSSETGAIN                 65
 685#define WFFX_SRSSETMODE                 66
 686#define WFFX_SRSSETDEF                  68
 687
 688/* Allow direct user-space control over FX memory/coefficient data.
 689   In theory this could be used to download the FX microprogram,
 690   but it would be a little slower, and involve some weird code.
 691 */
 692
 693#define WFFX_MEMSET              69
 694
 695#endif /* __SOUND_WAVEFRONT_H__ */
 696