brintos

brintos / linux-shallow public Read only

0
0
Text · 16.3 KiB · ef6f46a Raw
632 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2#ifndef __SOUND_WAVEFRONT_H__3#define __SOUND_WAVEFRONT_H__4 5/*6 *  Driver for Turtle Beach Wavefront cards (Maui,Tropez,Tropez+)7 *8 *  Copyright (c) by Paul Barton-Davis <pbd@op.net>9 */10 11#ifndef NUM_MIDIKEYS 12#define NUM_MIDIKEYS 12813#endif  /* NUM_MIDIKEYS */14 15#ifndef NUM_MIDICHANNELS16#define NUM_MIDICHANNELS 1617#endif  /* NUM_MIDICHANNELS */18 19/* Pseudo-commands not part of the WaveFront command set.20   These are used for various driver controls and direct21   hardware control.22 */23 24#define WFC_DEBUG_DRIVER                025#define WFC_FX_IOCTL                    126#define WFC_PATCH_STATUS                227#define WFC_PROGRAM_STATUS              328#define WFC_SAMPLE_STATUS               429#define WFC_DISABLE_INTERRUPTS          530#define WFC_ENABLE_INTERRUPTS           631#define WFC_INTERRUPT_STATUS            732#define WFC_ROMSAMPLES_RDONLY           833#define WFC_IDENTIFY_SLOT_TYPE          934 35/* Wavefront synth commands36 */37 38#define WFC_DOWNLOAD_SAMPLE		0x8039#define WFC_DOWNLOAD_BLOCK		0x8140#define WFC_DOWNLOAD_MULTISAMPLE	0x8241#define WFC_DOWNLOAD_SAMPLE_ALIAS	0x8342#define WFC_DELETE_SAMPLE		0x8443#define WFC_REPORT_FREE_MEMORY		0x8544#define WFC_DOWNLOAD_PATCH		0x8645#define WFC_DOWNLOAD_PROGRAM		0x8746#define WFC_SET_SYNTHVOL		0x8947#define WFC_SET_NVOICES			0x8B48#define WFC_DOWNLOAD_DRUM		0x9049#define WFC_GET_SYNTHVOL		0x9250#define WFC_GET_NVOICES			0x9451#define WFC_DISABLE_CHANNEL		0x9A52#define WFC_ENABLE_CHANNEL		0x9B53#define WFC_MISYNTH_OFF			0x9D54#define WFC_MISYNTH_ON			0x9E55#define WFC_FIRMWARE_VERSION		0x9F56#define WFC_GET_NSAMPLES		0xA057#define WFC_DISABLE_DRUM_PROGRAM	0xA258#define WFC_UPLOAD_PATCH		0xA359#define WFC_UPLOAD_PROGRAM		0xA460#define WFC_SET_TUNING			0xA661#define WFC_GET_TUNING			0xA762#define WFC_VMIDI_ON			0xA863#define WFC_VMIDI_OFF			0xA964#define WFC_MIDI_STATUS			0xAA65#define WFC_GET_CHANNEL_STATUS		0xAB66#define WFC_DOWNLOAD_SAMPLE_HEADER	0xAC67#define WFC_UPLOAD_SAMPLE_HEADER	0xAD68#define WFC_UPLOAD_MULTISAMPLE		0xAE69#define WFC_UPLOAD_SAMPLE_ALIAS		0xAF70#define WFC_IDENTIFY_SAMPLE_TYPE	0xB071#define WFC_DOWNLOAD_EDRUM_PROGRAM	0xB172#define WFC_UPLOAD_EDRUM_PROGRAM	0xB273#define WFC_SET_EDRUM_CHANNEL		0xB374#define WFC_INSTOUT_LEVELS		0xB475#define WFC_PEAKOUT_LEVELS		0xB576#define WFC_REPORT_CHANNEL_PROGRAMS	0xB677#define WFC_HARDWARE_VERSION		0xCF78#define WFC_UPLOAD_SAMPLE_PARAMS	0xD779#define WFC_DOWNLOAD_OS			0xF180#define WFC_NOOP                        0xFF81 82#define WF_MAX_SAMPLE   51283#define WF_MAX_PATCH    25684#define WF_MAX_PROGRAM  12885 86#define WF_SECTION_MAX  44   /* longest OS section length */87 88/* # of bytes we send to the board when sending it various kinds of89   substantive data, such as samples, patches and programs.90*/91 92#define WF_PROGRAM_BYTES 3293#define WF_PATCH_BYTES 13294#define WF_SAMPLE_BYTES 2795#define WF_SAMPLE_HDR_BYTES 2596#define WF_ALIAS_BYTES 2597#define WF_DRUM_BYTES 998#define WF_MSAMPLE_BYTES 259 /* (MIDI_KEYS * 2) + 3 */99 100#define WF_ACK     0x80101#define WF_DMA_ACK 0x81102 103/* OR-values for MIDI status bits */104 105#define WF_MIDI_VIRTUAL_ENABLED 0x1106#define WF_MIDI_VIRTUAL_IS_EXTERNAL 0x2107#define WF_MIDI_IN_TO_SYNTH_DISABLED 0x4108 109/* slot indexes for struct address_info: makes code a little more mnemonic */110 111#define WF_SYNTH_SLOT         0112#define WF_INTERNAL_MIDI_SLOT 1113#define WF_EXTERNAL_MIDI_SLOT 2114 115/* Magic MIDI bytes used to switch I/O streams on the ICS2115 MPU401116   emulation. Note these NEVER show up in output from the device and117   should NEVER be used in input unless Virtual MIDI mode has been 118   disabled. If they do show up as input, the results are unpredictable.119*/120 121#define WF_EXTERNAL_SWITCH  0xFD122#define WF_INTERNAL_SWITCH  0xF9123 124/* Debugging flags */125 126#define WF_DEBUG_CMD 0x1127#define WF_DEBUG_DATA 0x2128#define WF_DEBUG_LOAD_PATCH 0x4129#define WF_DEBUG_IO 0x8130 131/* WavePatch file format stuff */132 133#define WF_WAVEPATCH_VERSION     120;  /*  Current version number (1.2)  */134#define WF_MAX_COMMENT           64    /*  Comment length */135#define WF_NUM_LAYERS            4136#define WF_NAME_LENGTH           32137#define WF_SOURCE_LENGTH         260138 139#define BankFileID     "Bank"140#define DrumkitFileID  "DrumKit"141#define ProgramFileID  "Program"142 143struct wf_envelope144{145    u8 attack_time:7;146    u8 Unused1:1;147 148    u8 decay1_time:7;149    u8 Unused2:1;150 151    u8 decay2_time:7;152    u8 Unused3:1;153 154    u8 sustain_time:7;155    u8 Unused4:1;156 157    u8 release_time:7;158    u8 Unused5:1;159 160    u8 release2_time:7;161    u8 Unused6:1;162 163    s8 attack_level;164    s8 decay1_level;165    s8 decay2_level;166    s8 sustain_level;167    s8 release_level;168 169    u8 attack_velocity:7;170    u8 Unused7:1;171 172    u8 volume_velocity:7;173    u8 Unused8:1;174 175    u8 keyboard_scaling:7;176    u8 Unused9:1;177};178typedef struct wf_envelope wavefront_envelope;179 180struct wf_lfo181{182    u8 sample_number;183 184    u8 frequency:7;185    u8 Unused1:1;186 187    u8 am_src:4;188    u8 fm_src:4;189 190    s8 fm_amount;191    s8 am_amount;192    s8 start_level;193    s8 end_level;194 195    u8 ramp_delay:7;196    u8 wave_restart:1; /* for LFO2 only */197 198    u8 ramp_time:7;199    u8 Unused2:1;200};201typedef struct wf_lfo wavefront_lfo;202 203struct wf_patch204{205    s16  frequency_bias;         /*  ** THIS IS IN MOTOROLA FORMAT!! ** */206 207    u8 amplitude_bias:7;208    u8 Unused1:1;209 210    u8 portamento:7;211    u8 Unused2:1;212 213    u8 sample_number;214 215    u8 pitch_bend:4;216    u8 sample_msb:1;217    u8 Unused3:3;218 219    u8 mono:1;220    u8 retrigger:1;221    u8 nohold:1;222    u8 restart:1;223    u8 filterconfig:2; /* SDK says "not used" */224    u8 reuse:1;225    u8 reset_lfo:1;    226 227    u8 fm_src2:4;228    u8 fm_src1:4;   229 230    s8 fm_amount1;231    s8 fm_amount2;232 233    u8 am_src:4;234    u8 Unused4:4;235 236    s8 am_amount;237 238    u8 fc1_mode:4;239    u8 fc2_mode:4;240 241    s8 fc1_mod_amount;242    s8 fc1_keyboard_scaling;243    s8 fc1_bias;244    s8 fc2_mod_amount;245    s8 fc2_keyboard_scaling;246    s8 fc2_bias;247 248    u8 randomizer:7;249    u8 Unused5:1;250 251    struct wf_envelope envelope1;252    struct wf_envelope envelope2;253    struct wf_lfo lfo1;254    struct wf_lfo lfo2;255};256typedef struct wf_patch wavefront_patch;257 258struct wf_layer259{260    u8 patch_number;261 262    u8 mix_level:7;263    u8 mute:1;264 265    u8 split_point:7;266    u8 play_below:1;267 268    u8 pan_mod_src:2;269    u8 pan_or_mod:1;270    u8 pan:4;271    u8 split_type:1;272};273typedef struct wf_layer wavefront_layer;274 275struct wf_program276{277    struct wf_layer layer[WF_NUM_LAYERS];278};279typedef struct wf_program wavefront_program;280 281struct wf_sample_offset282{283    s32 Fraction:4;284    s32 Integer:20;285    s32 Unused:8;286};287typedef struct wf_sample_offset wavefront_sample_offset;          288     289/* Sample slot types */290 291#define WF_ST_SAMPLE      0292#define WF_ST_MULTISAMPLE 1293#define WF_ST_ALIAS       2294#define WF_ST_EMPTY       3295 296/* pseudo's */297 298#define WF_ST_DRUM        4299#define WF_ST_PROGRAM     5300#define WF_ST_PATCH       6301#define WF_ST_SAMPLEHDR   7302 303#define WF_ST_MASK        0xf304 305/* Flags for slot status. These occupy the upper bits of the same byte306   as a sample type.307*/308 309#define WF_SLOT_USED      0x80   /* XXX don't rely on this being accurate */310#define WF_SLOT_FILLED    0x40311#define WF_SLOT_ROM       0x20312 313#define WF_SLOT_MASK      0xf0314 315/* channel constants */316 317#define WF_CH_MONO  0318#define WF_CH_LEFT  1319#define WF_CH_RIGHT 2320 321/* Sample formats */322 323#define LINEAR_16BIT 0324#define WHITE_NOISE  1325#define LINEAR_8BIT  2326#define MULAW_8BIT   3327 328#define WF_SAMPLE_IS_8BIT(smpl) ((smpl)->SampleResolution&2)329 330 331/* 332 333  Because most/all of the sample data we pass in via pointers has334  never been copied (just mmap-ed into user space straight from the335  disk), it would be nice to allow handling of multi-channel sample336  data without forcing user-level extraction of the relevant bytes.337  338  So, we need a way of specifying which channel to use (the WaveFront339  only handles mono samples in a given slot), and the only way to do340  this without using some struct other than wavefront_sample as the341  interface is the awful hack of using the unused bits in a342  wavefront_sample:343  344  Val      Meaning345  ---      -------346  0        no channel selection (use channel 1, sample is MONO)347  1        use first channel, and skip one348  2        use second channel, and skip one349  3        use third channel, and skip two350  4        use fourth channel, skip three351  5        use fifth channel, skip four352  6        use six channel, skip five353 354 355  This can handle up to 4 channels, and anyone downloading >4 channels356  of sample data just to select one of them needs to find some tools357  like sox ...358 359  NOTE: values 0, 1 and 2 correspond to WF_CH_* above. This is 360  important.361 362*/363 364#define WF_SET_CHANNEL(samp,chn) \365 (samp)->Unused1 = chn & 0x1; \366 (samp)->Unused2 = chn & 0x2; \367 (samp)->Unused3 = chn & 0x4 368  369#define WF_GET_CHANNEL(samp) \370  (((samp)->Unused3 << 2)|((samp)->Unused2<<1)|(samp)->Unused1)371  372typedef struct wf_sample {373    struct wf_sample_offset sampleStartOffset;374    struct wf_sample_offset loopStartOffset;375    struct wf_sample_offset loopEndOffset;376    struct wf_sample_offset sampleEndOffset;377    s16 FrequencyBias;378    u8 SampleResolution:2;  /* sample_format */379    u8 Unused1:1;380    u8 Loop:1;381    u8 Bidirectional:1;382    u8 Unused2:1;383    u8 Reverse:1;384    u8 Unused3:1;385} wavefront_sample;386 387typedef struct wf_multisample {388    s16 NumberOfSamples;   /* log2 of the number of samples */389    s16 SampleNumber[NUM_MIDIKEYS];390} wavefront_multisample;391 392typedef struct wf_alias {393    s16 OriginalSample;394 395    struct wf_sample_offset sampleStartOffset;396    struct wf_sample_offset loopStartOffset;397    struct wf_sample_offset sampleEndOffset;398    struct wf_sample_offset loopEndOffset;399 400    s16  FrequencyBias;401 402    u8 SampleResolution:2;403    u8 Unused1:1;404    u8 Loop:1;405    u8 Bidirectional:1;406    u8 Unused2:1;407    u8 Reverse:1;408    u8 Unused3:1;409    410    /* This structure is meant to be padded only to 16 bits on their411       original. Of course, whoever wrote their documentation didn't412       realize that sizeof(struct) can be >=413       sum(sizeof(struct-fields)) and so thought that giving a C level414       description of the structs used in WavePatch files was415       sufficient. I suppose it was, as long as you remember the 416       standard 16->32 bit issues.417    */418 419    u8 sixteen_bit_padding;420} __packed wavefront_alias;421 422typedef struct wf_drum {423    u8 PatchNumber;424    u8 MixLevel:7;425    u8 Unmute:1;426    u8 Group:4;427    u8 Unused1:4;428    u8 PanModSource:2;429    u8 PanModulated:1;430    u8 PanAmount:4;431    u8 Unused2:1;432} wavefront_drum;433 434typedef struct wf_drumkit {435    struct wf_drum drum[NUM_MIDIKEYS];436} wavefront_drumkit;437 438typedef struct wf_channel_programs {439    u8 Program[NUM_MIDICHANNELS];440} wavefront_channel_programs;441 442/* How to get MIDI channel status from the data returned by443   a WFC_GET_CHANNEL_STATUS command (a struct wf_channel_programs)444*/445 446#define WF_CHANNEL_STATUS(ch,wcp) (wcp)[(ch/7)] & (1<<((ch)%7))447 448typedef union wf_any {449    wavefront_sample s;450    wavefront_multisample ms;451    wavefront_alias a;452    wavefront_program pr;453    wavefront_patch p;454    wavefront_drum d;455} wavefront_any;456 457/* Hannu Solvainen hoped that his "patch_info" struct in soundcard.h458   might work for other wave-table based patch loading situations.459   Alas, his fears were correct. The WaveFront doesn't even come with460   just "patches", but several different kind of structures that461   control the sound generation process.462 */463 464typedef struct wf_patch_info {465    466    /* the first two fields are used by the OSS "patch loading" interface467       only, and are unused by the current user-level library.468    */469 470    s16   key;               /* Use WAVEFRONT_PATCH here */471    u16  devno;             /* fill in when sending */472    u8  subkey;            /* WF_ST_{SAMPLE,ALIAS,etc.} */473 474#define WAVEFRONT_FIND_FREE_SAMPLE_SLOT 999475 476    u16  number;            /* patch/sample/prog number */477 478    u32  size;              /* size of any data included in 479				  one of the fields in `hdrptr', or480				  as `dataptr'.481 482				  NOTE: for actual samples, this is483				  the size of the *SELECTED CHANNEL*484				  even if more data is actually available.485				  486				  So, a stereo sample (2 channels) of487				  6000 bytes total has `size' = 3000.488 489				  See the macros and comments for490				  WF_{GET,SET}_CHANNEL above.491 492			       */493    wavefront_any __user *hdrptr;      /* user-space ptr to hdr bytes */494    u16 __user *dataptr;            /* actual sample data */495 496    wavefront_any hdr;          /* kernel-space copy of hdr bytes */         497} wavefront_patch_info;498 499/* The maximum number of bytes we will ever move to or from user space500   in response to a WFC_* command.  This obviously doesn't cover501   actual sample data.502*/503 504#define WF_MAX_READ sizeof(wavefront_multisample)505#define WF_MAX_WRITE sizeof(wavefront_multisample)506 507/*508   This allows us to execute any WF command except the download/upload509   ones, which are handled differently due to copyin/copyout issues as510   well as data-nybbling to/from the card.511 */512 513typedef struct wavefront_control {514    int cmd;                           /* WFC_* */515    char status;                       /* return status to user-space */516    unsigned char rbuf[WF_MAX_READ];   /* bytes read from card */517    unsigned char wbuf[WF_MAX_WRITE];  /* bytes written to card */518} wavefront_control;519 520#define WFCTL_WFCMD    0x1521#define WFCTL_LOAD_SPP 0x2522 523/* Modulator table */524 525#define WF_MOD_LFO1      0526#define WF_MOD_LFO2      1527#define WF_MOD_ENV1      2528#define WF_MOD_ENV2      3529#define WF_MOD_KEYBOARD  4530#define WF_MOD_LOGKEY    5531#define WF_MOD_VELOCITY  6532#define WF_MOD_LOGVEL    7533#define WF_MOD_RANDOM    8534#define WF_MOD_PRESSURE  9535#define WF_MOD_MOD_WHEEL 10536#define WF_MOD_1         WF_MOD_MOD_WHEEL 537#define WF_MOD_BREATH    11538#define WF_MOD_2         WF_MOD_BREATH539#define WF_MOD_FOOT      12540#define WF_MOD_4         WF_MOD_FOOT541#define WF_MOD_VOLUME    13542#define WF_MOD_7         WF_MOD_VOLUME543#define WF_MOD_PAN       14544#define WF_MOD_10        WF_MOD_PAN545#define WF_MOD_EXPR      15546#define WF_MOD_11        WF_MOD_EXPR547 548/* FX-related material */549 550typedef struct wf_fx_info {551    int request;             /* see list below */552    long data[4];             /* we don't need much */553} wavefront_fx_info;554 555/* support for each of these will be forthcoming once I or someone 556   else has figured out which of the addresses on page 6 and page 7 of 557   the YSS225 control each parameter. Incidentally, these come from558   the Windows driver interface, but again, Turtle Beach didn't559   document the API to use them.560*/561 562#define WFFX_SETOUTGAIN		        0563#define WFFX_SETSTEREOOUTGAIN		1564#define WFFX_SETREVERBIN1GAIN		2565#define WFFX_SETREVERBIN2GAIN		3566#define WFFX_SETREVERBIN3GAIN		4567#define WFFX_SETCHORUSINPORT		5568#define WFFX_SETREVERBIN1PORT		6569#define WFFX_SETREVERBIN2PORT		7570#define WFFX_SETREVERBIN3PORT		8571#define WFFX_SETEFFECTPORT		9572#define WFFX_SETAUXPORT		        10573#define WFFX_SETREVERBTYPE		11574#define WFFX_SETREVERBDELAY		12575#define WFFX_SETCHORUSLFO		13576#define WFFX_SETCHORUSPMD		14577#define WFFX_SETCHORUSAMD		15578#define WFFX_SETEFFECT		        16579#define WFFX_SETBASEALL		        17580#define WFFX_SETREVERBALL		18581#define WFFX_SETCHORUSALL		20582#define WFFX_SETREVERBDEF		22583#define WFFX_SETCHORUSDEF		23584#define WFFX_DELAYSETINGAIN		24585#define WFFX_DELAYSETFBGAIN	        25586#define WFFX_DELAYSETFBLPF		26587#define WFFX_DELAYSETGAIN		27588#define WFFX_DELAYSETTIME		28589#define WFFX_DELAYSETFBTIME		29590#define WFFX_DELAYSETALL		30591#define WFFX_DELAYSETDEF		32592#define WFFX_SDELAYSETINGAIN		33593#define WFFX_SDELAYSETFBGAIN		34594#define WFFX_SDELAYSETFBLPF		35595#define WFFX_SDELAYSETGAIN		36596#define WFFX_SDELAYSETTIME		37597#define WFFX_SDELAYSETFBTIME		38598#define WFFX_SDELAYSETALL		39599#define WFFX_SDELAYSETDEF		41600#define WFFX_DEQSETINGAIN		42601#define WFFX_DEQSETFILTER		43602#define WFFX_DEQSETALL		        44603#define WFFX_DEQSETDEF		        46604#define WFFX_MUTE		        47605#define WFFX_FLANGESETBALANCE	        48	606#define WFFX_FLANGESETDELAY		49607#define WFFX_FLANGESETDWFFX_TH		50608#define WFFX_FLANGESETFBGAIN		51609#define WFFX_FLANGESETINGAIN		52610#define WFFX_FLANGESETLFO		53611#define WFFX_FLANGESETALL		54612#define WFFX_FLANGESETDEF		56613#define WFFX_PITCHSETSHIFT		57614#define WFFX_PITCHSETBALANCE		58615#define WFFX_PITCHSETALL		59616#define WFFX_PITCHSETDEF		61617#define WFFX_SRSSETINGAIN		62618#define WFFX_SRSSETSPACE		63619#define WFFX_SRSSETCENTER		64620#define WFFX_SRSSETGAIN		        65621#define WFFX_SRSSETMODE	        	66622#define WFFX_SRSSETDEF		        68623 624/* Allow direct user-space control over FX memory/coefficient data.625   In theory this could be used to download the FX microprogram,626   but it would be a little slower, and involve some weird code.627 */628 629#define WFFX_MEMSET              69630 631#endif /* __SOUND_WAVEFRONT_H__ */632