xref: /openbmc/linux/include/sound/wavefront.h (revision 1a59d1b8)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds #ifndef __SOUND_WAVEFRONT_H__
31da177e4SLinus Torvalds #define __SOUND_WAVEFRONT_H__
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds  *  Driver for Turtle Beach Wavefront cards (Maui,Tropez,Tropez+)
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  *  Copyright (c) by Paul Barton-Davis <pbd@op.net>
91da177e4SLinus Torvalds  */
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #if (!defined(__GNUC__) && !defined(__GNUG__))
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds      You will not be able to compile this file correctly without gcc, because
141da177e4SLinus Torvalds      it is necessary to pack the "wavefront_alias" structure to a size
151da177e4SLinus Torvalds      of 22 bytes, corresponding to 16-bit alignment (as would have been
161da177e4SLinus Torvalds      the case on the original platform, MS-DOS). If this is not done,
171da177e4SLinus Torvalds      then WavePatch-format files cannot be read/written correctly.
181da177e4SLinus Torvalds      The method used to do this here ("__attribute__((packed)") is
191da177e4SLinus Torvalds      completely compiler dependent.
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds      All other wavefront_* types end up aligned to 32 bit values and
221da177e4SLinus Torvalds      still have the same (correct) size.
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds #else
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds      /* However, note that as of G++ 2.7.3.2, g++ was unable to
271da177e4SLinus Torvalds 	correctly parse *type* __attribute__ tags. It will do the
281da177e4SLinus Torvalds 	right thing if we use the "packed" attribute on each struct
291da177e4SLinus Torvalds 	member, which has the same semantics anyway.
301da177e4SLinus Torvalds      */
311da177e4SLinus Torvalds 
321da177e4SLinus Torvalds #endif /* __GNUC__ */
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds /***************************** WARNING ********************************
351da177e4SLinus Torvalds   PLEASE DO NOT MODIFY THIS FILE IN ANY WAY THAT AFFECTS ITS ABILITY TO
361da177e4SLinus Torvalds   BE USED WITH EITHER C *OR* C++.
371da177e4SLinus Torvalds  **********************************************************************/
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds #ifndef NUM_MIDIKEYS
401da177e4SLinus Torvalds #define NUM_MIDIKEYS 128
411da177e4SLinus Torvalds #endif  /* NUM_MIDIKEYS */
421da177e4SLinus Torvalds 
431da177e4SLinus Torvalds #ifndef NUM_MIDICHANNELS
441da177e4SLinus Torvalds #define NUM_MIDICHANNELS 16
451da177e4SLinus Torvalds #endif  /* NUM_MIDICHANNELS */
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds /* These are very useful/important. the original wavefront interface
481da177e4SLinus Torvalds    was developed on a 16 bit system, where sizeof(int) = 2
491da177e4SLinus Torvalds    bytes. Defining things like this makes the code much more portable, and
501da177e4SLinus Torvalds    easier to understand without having to toggle back and forth
511da177e4SLinus Torvalds    between a 16-bit view of the world and a 32-bit one.
521da177e4SLinus Torvalds  */
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds #ifndef __KERNEL__
551da177e4SLinus Torvalds /* keep them for compatibility */
561da177e4SLinus Torvalds typedef short s16;
571da177e4SLinus Torvalds typedef unsigned short u16;
581da177e4SLinus Torvalds typedef int s32;
591da177e4SLinus Torvalds typedef unsigned int u32;
601da177e4SLinus Torvalds typedef char s8;
611da177e4SLinus Torvalds typedef unsigned char u8;
621da177e4SLinus Torvalds typedef s16 INT16;
631da177e4SLinus Torvalds typedef u16 UINT16;
641da177e4SLinus Torvalds typedef s32 INT32;
651da177e4SLinus Torvalds typedef u32 UINT32;
661da177e4SLinus Torvalds typedef s8 CHAR8;
671da177e4SLinus Torvalds typedef u8 UCHAR8;
681da177e4SLinus Torvalds #endif
691da177e4SLinus Torvalds 
701da177e4SLinus Torvalds /* Pseudo-commands not part of the WaveFront command set.
711da177e4SLinus Torvalds    These are used for various driver controls and direct
721da177e4SLinus Torvalds    hardware control.
731da177e4SLinus Torvalds  */
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds #define WFC_DEBUG_DRIVER                0
761da177e4SLinus Torvalds #define WFC_FX_IOCTL                    1
771da177e4SLinus Torvalds #define WFC_PATCH_STATUS                2
781da177e4SLinus Torvalds #define WFC_PROGRAM_STATUS              3
791da177e4SLinus Torvalds #define WFC_SAMPLE_STATUS               4
801da177e4SLinus Torvalds #define WFC_DISABLE_INTERRUPTS          5
811da177e4SLinus Torvalds #define WFC_ENABLE_INTERRUPTS           6
821da177e4SLinus Torvalds #define WFC_INTERRUPT_STATUS            7
831da177e4SLinus Torvalds #define WFC_ROMSAMPLES_RDONLY           8
841da177e4SLinus Torvalds #define WFC_IDENTIFY_SLOT_TYPE          9
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds /* Wavefront synth commands
871da177e4SLinus Torvalds  */
881da177e4SLinus Torvalds 
891da177e4SLinus Torvalds #define WFC_DOWNLOAD_SAMPLE		0x80
901da177e4SLinus Torvalds #define WFC_DOWNLOAD_BLOCK		0x81
911da177e4SLinus Torvalds #define WFC_DOWNLOAD_MULTISAMPLE	0x82
921da177e4SLinus Torvalds #define WFC_DOWNLOAD_SAMPLE_ALIAS	0x83
931da177e4SLinus Torvalds #define WFC_DELETE_SAMPLE		0x84
941da177e4SLinus Torvalds #define WFC_REPORT_FREE_MEMORY		0x85
951da177e4SLinus Torvalds #define WFC_DOWNLOAD_PATCH		0x86
961da177e4SLinus Torvalds #define WFC_DOWNLOAD_PROGRAM		0x87
971da177e4SLinus Torvalds #define WFC_SET_SYNTHVOL		0x89
981da177e4SLinus Torvalds #define WFC_SET_NVOICES			0x8B
991da177e4SLinus Torvalds #define WFC_DOWNLOAD_DRUM		0x90
1001da177e4SLinus Torvalds #define WFC_GET_SYNTHVOL		0x92
1011da177e4SLinus Torvalds #define WFC_GET_NVOICES			0x94
1021da177e4SLinus Torvalds #define WFC_DISABLE_CHANNEL		0x9A
1031da177e4SLinus Torvalds #define WFC_ENABLE_CHANNEL		0x9B
1041da177e4SLinus Torvalds #define WFC_MISYNTH_OFF			0x9D
1051da177e4SLinus Torvalds #define WFC_MISYNTH_ON			0x9E
1061da177e4SLinus Torvalds #define WFC_FIRMWARE_VERSION		0x9F
1071da177e4SLinus Torvalds #define WFC_GET_NSAMPLES		0xA0
1081da177e4SLinus Torvalds #define WFC_DISABLE_DRUM_PROGRAM	0xA2
1091da177e4SLinus Torvalds #define WFC_UPLOAD_PATCH		0xA3
1101da177e4SLinus Torvalds #define WFC_UPLOAD_PROGRAM		0xA4
1111da177e4SLinus Torvalds #define WFC_SET_TUNING			0xA6
1121da177e4SLinus Torvalds #define WFC_GET_TUNING			0xA7
1131da177e4SLinus Torvalds #define WFC_VMIDI_ON			0xA8
1141da177e4SLinus Torvalds #define WFC_VMIDI_OFF			0xA9
1151da177e4SLinus Torvalds #define WFC_MIDI_STATUS			0xAA
1161da177e4SLinus Torvalds #define WFC_GET_CHANNEL_STATUS		0xAB
1171da177e4SLinus Torvalds #define WFC_DOWNLOAD_SAMPLE_HEADER	0xAC
1181da177e4SLinus Torvalds #define WFC_UPLOAD_SAMPLE_HEADER	0xAD
1191da177e4SLinus Torvalds #define WFC_UPLOAD_MULTISAMPLE		0xAE
1201da177e4SLinus Torvalds #define WFC_UPLOAD_SAMPLE_ALIAS		0xAF
1211da177e4SLinus Torvalds #define WFC_IDENTIFY_SAMPLE_TYPE	0xB0
1221da177e4SLinus Torvalds #define WFC_DOWNLOAD_EDRUM_PROGRAM	0xB1
1231da177e4SLinus Torvalds #define WFC_UPLOAD_EDRUM_PROGRAM	0xB2
1241da177e4SLinus Torvalds #define WFC_SET_EDRUM_CHANNEL		0xB3
1251da177e4SLinus Torvalds #define WFC_INSTOUT_LEVELS		0xB4
1261da177e4SLinus Torvalds #define WFC_PEAKOUT_LEVELS		0xB5
1271da177e4SLinus Torvalds #define WFC_REPORT_CHANNEL_PROGRAMS	0xB6
1281da177e4SLinus Torvalds #define WFC_HARDWARE_VERSION		0xCF
1291da177e4SLinus Torvalds #define WFC_UPLOAD_SAMPLE_PARAMS	0xD7
1301da177e4SLinus Torvalds #define WFC_DOWNLOAD_OS			0xF1
1311da177e4SLinus Torvalds #define WFC_NOOP                        0xFF
1321da177e4SLinus Torvalds 
1331da177e4SLinus Torvalds #define WF_MAX_SAMPLE   512
1341da177e4SLinus Torvalds #define WF_MAX_PATCH    256
1351da177e4SLinus Torvalds #define WF_MAX_PROGRAM  128
1361da177e4SLinus Torvalds 
1371da177e4SLinus Torvalds #define WF_SECTION_MAX  44   /* longest OS section length */
1381da177e4SLinus Torvalds 
1391da177e4SLinus Torvalds /* # of bytes we send to the board when sending it various kinds of
1401da177e4SLinus Torvalds    substantive data, such as samples, patches and programs.
1411da177e4SLinus Torvalds */
1421da177e4SLinus Torvalds 
1431da177e4SLinus Torvalds #define WF_PROGRAM_BYTES 32
1441da177e4SLinus Torvalds #define WF_PATCH_BYTES 132
1451da177e4SLinus Torvalds #define WF_SAMPLE_BYTES 27
1461da177e4SLinus Torvalds #define WF_SAMPLE_HDR_BYTES 25
1471da177e4SLinus Torvalds #define WF_ALIAS_BYTES 25
1481da177e4SLinus Torvalds #define WF_DRUM_BYTES 9
1491da177e4SLinus Torvalds #define WF_MSAMPLE_BYTES 259 /* (MIDI_KEYS * 2) + 3 */
1501da177e4SLinus Torvalds 
1511da177e4SLinus Torvalds #define WF_ACK     0x80
1521da177e4SLinus Torvalds #define WF_DMA_ACK 0x81
1531da177e4SLinus Torvalds 
1541da177e4SLinus Torvalds /* OR-values for MIDI status bits */
1551da177e4SLinus Torvalds 
1561da177e4SLinus Torvalds #define WF_MIDI_VIRTUAL_ENABLED 0x1
1571da177e4SLinus Torvalds #define WF_MIDI_VIRTUAL_IS_EXTERNAL 0x2
1581da177e4SLinus Torvalds #define WF_MIDI_IN_TO_SYNTH_DISABLED 0x4
1591da177e4SLinus Torvalds 
1601da177e4SLinus Torvalds /* slot indexes for struct address_info: makes code a little more mnemonic */
1611da177e4SLinus Torvalds 
1621da177e4SLinus Torvalds #define WF_SYNTH_SLOT         0
1631da177e4SLinus Torvalds #define WF_INTERNAL_MIDI_SLOT 1
1641da177e4SLinus Torvalds #define WF_EXTERNAL_MIDI_SLOT 2
1651da177e4SLinus Torvalds 
1661da177e4SLinus Torvalds /* Magic MIDI bytes used to switch I/O streams on the ICS2115 MPU401
1671da177e4SLinus Torvalds    emulation. Note these NEVER show up in output from the device and
1681da177e4SLinus Torvalds    should NEVER be used in input unless Virtual MIDI mode has been
1691da177e4SLinus Torvalds    disabled. If they do show up as input, the results are unpredictable.
1701da177e4SLinus Torvalds */
1711da177e4SLinus Torvalds 
1721da177e4SLinus Torvalds #define WF_EXTERNAL_SWITCH  0xFD
1731da177e4SLinus Torvalds #define WF_INTERNAL_SWITCH  0xF9
1741da177e4SLinus Torvalds 
1751da177e4SLinus Torvalds /* Debugging flags */
1761da177e4SLinus Torvalds 
1771da177e4SLinus Torvalds #define WF_DEBUG_CMD 0x1
1781da177e4SLinus Torvalds #define WF_DEBUG_DATA 0x2
1791da177e4SLinus Torvalds #define WF_DEBUG_LOAD_PATCH 0x4
1801da177e4SLinus Torvalds #define WF_DEBUG_IO 0x8
1811da177e4SLinus Torvalds 
1821da177e4SLinus Torvalds /* WavePatch file format stuff */
1831da177e4SLinus Torvalds 
1841da177e4SLinus Torvalds #define WF_WAVEPATCH_VERSION     120;  /*  Current version number (1.2)  */
1851da177e4SLinus Torvalds #define WF_MAX_COMMENT           64    /*  Comment length */
1861da177e4SLinus Torvalds #define WF_NUM_LAYERS            4
1871da177e4SLinus Torvalds #define WF_NAME_LENGTH           32
1881da177e4SLinus Torvalds #define WF_SOURCE_LENGTH         260
1891da177e4SLinus Torvalds 
1901da177e4SLinus Torvalds #define BankFileID     "Bank"
1911da177e4SLinus Torvalds #define DrumkitFileID  "DrumKit"
1921da177e4SLinus Torvalds #define ProgramFileID  "Program"
1931da177e4SLinus Torvalds 
1941da177e4SLinus Torvalds struct wf_envelope
1951da177e4SLinus Torvalds {
1961da177e4SLinus Torvalds     u8 attack_time:7;
1971da177e4SLinus Torvalds     u8 Unused1:1;
1981da177e4SLinus Torvalds 
1991da177e4SLinus Torvalds     u8 decay1_time:7;
2001da177e4SLinus Torvalds     u8 Unused2:1;
2011da177e4SLinus Torvalds 
2021da177e4SLinus Torvalds     u8 decay2_time:7;
2031da177e4SLinus Torvalds     u8 Unused3:1;
2041da177e4SLinus Torvalds 
2051da177e4SLinus Torvalds     u8 sustain_time:7;
2061da177e4SLinus Torvalds     u8 Unused4:1;
2071da177e4SLinus Torvalds 
2081da177e4SLinus Torvalds     u8 release_time:7;
2091da177e4SLinus Torvalds     u8 Unused5:1;
2101da177e4SLinus Torvalds 
2111da177e4SLinus Torvalds     u8 release2_time:7;
2121da177e4SLinus Torvalds     u8 Unused6:1;
2131da177e4SLinus Torvalds 
2141da177e4SLinus Torvalds     s8 attack_level;
2151da177e4SLinus Torvalds     s8 decay1_level;
2161da177e4SLinus Torvalds     s8 decay2_level;
2171da177e4SLinus Torvalds     s8 sustain_level;
2181da177e4SLinus Torvalds     s8 release_level;
2191da177e4SLinus Torvalds 
2201da177e4SLinus Torvalds     u8 attack_velocity:7;
2211da177e4SLinus Torvalds     u8 Unused7:1;
2221da177e4SLinus Torvalds 
2231da177e4SLinus Torvalds     u8 volume_velocity:7;
2241da177e4SLinus Torvalds     u8 Unused8:1;
2251da177e4SLinus Torvalds 
2261da177e4SLinus Torvalds     u8 keyboard_scaling:7;
2271da177e4SLinus Torvalds     u8 Unused9:1;
2281da177e4SLinus Torvalds };
2291da177e4SLinus Torvalds typedef struct wf_envelope wavefront_envelope;
2301da177e4SLinus Torvalds 
2311da177e4SLinus Torvalds struct wf_lfo
2321da177e4SLinus Torvalds {
2331da177e4SLinus Torvalds     u8 sample_number;
2341da177e4SLinus Torvalds 
2351da177e4SLinus Torvalds     u8 frequency:7;
2361da177e4SLinus Torvalds     u8 Unused1:1;
2371da177e4SLinus Torvalds 
2381da177e4SLinus Torvalds     u8 am_src:4;
2391da177e4SLinus Torvalds     u8 fm_src:4;
2401da177e4SLinus Torvalds 
2411da177e4SLinus Torvalds     s8 fm_amount;
2421da177e4SLinus Torvalds     s8 am_amount;
2431da177e4SLinus Torvalds     s8 start_level;
2441da177e4SLinus Torvalds     s8 end_level;
2451da177e4SLinus Torvalds 
2461da177e4SLinus Torvalds     u8 ramp_delay:7;
2471da177e4SLinus Torvalds     u8 wave_restart:1; /* for LFO2 only */
2481da177e4SLinus Torvalds 
2491da177e4SLinus Torvalds     u8 ramp_time:7;
2501da177e4SLinus Torvalds     u8 Unused2:1;
2511da177e4SLinus Torvalds };
2521da177e4SLinus Torvalds typedef struct wf_lfo wavefront_lfo;
2531da177e4SLinus Torvalds 
2541da177e4SLinus Torvalds struct wf_patch
2551da177e4SLinus Torvalds {
2561da177e4SLinus Torvalds     s16  frequency_bias;         /*  ** THIS IS IN MOTOROLA FORMAT!! ** */
2571da177e4SLinus Torvalds 
2581da177e4SLinus Torvalds     u8 amplitude_bias:7;
2591da177e4SLinus Torvalds     u8 Unused1:1;
2601da177e4SLinus Torvalds 
2611da177e4SLinus Torvalds     u8 portamento:7;
2621da177e4SLinus Torvalds     u8 Unused2:1;
2631da177e4SLinus Torvalds 
2641da177e4SLinus Torvalds     u8 sample_number;
2651da177e4SLinus Torvalds 
2661da177e4SLinus Torvalds     u8 pitch_bend:4;
2671da177e4SLinus Torvalds     u8 sample_msb:1;
2681da177e4SLinus Torvalds     u8 Unused3:3;
2691da177e4SLinus Torvalds 
2701da177e4SLinus Torvalds     u8 mono:1;
2711da177e4SLinus Torvalds     u8 retrigger:1;
2721da177e4SLinus Torvalds     u8 nohold:1;
2731da177e4SLinus Torvalds     u8 restart:1;
2741da177e4SLinus Torvalds     u8 filterconfig:2; /* SDK says "not used" */
2751da177e4SLinus Torvalds     u8 reuse:1;
2761da177e4SLinus Torvalds     u8 reset_lfo:1;
2771da177e4SLinus Torvalds 
2781da177e4SLinus Torvalds     u8 fm_src2:4;
2791da177e4SLinus Torvalds     u8 fm_src1:4;
2801da177e4SLinus Torvalds 
2811da177e4SLinus Torvalds     s8 fm_amount1;
2821da177e4SLinus Torvalds     s8 fm_amount2;
2831da177e4SLinus Torvalds 
2841da177e4SLinus Torvalds     u8 am_src:4;
2851da177e4SLinus Torvalds     u8 Unused4:4;
2861da177e4SLinus Torvalds 
2871da177e4SLinus Torvalds     s8 am_amount;
2881da177e4SLinus Torvalds 
2891da177e4SLinus Torvalds     u8 fc1_mode:4;
2901da177e4SLinus Torvalds     u8 fc2_mode:4;
2911da177e4SLinus Torvalds 
2921da177e4SLinus Torvalds     s8 fc1_mod_amount;
2931da177e4SLinus Torvalds     s8 fc1_keyboard_scaling;
2941da177e4SLinus Torvalds     s8 fc1_bias;
2951da177e4SLinus Torvalds     s8 fc2_mod_amount;
2961da177e4SLinus Torvalds     s8 fc2_keyboard_scaling;
2971da177e4SLinus Torvalds     s8 fc2_bias;
2981da177e4SLinus Torvalds 
2991da177e4SLinus Torvalds     u8 randomizer:7;
3001da177e4SLinus Torvalds     u8 Unused5:1;
3011da177e4SLinus Torvalds 
3021da177e4SLinus Torvalds     struct wf_envelope envelope1;
3031da177e4SLinus Torvalds     struct wf_envelope envelope2;
3041da177e4SLinus Torvalds     struct wf_lfo lfo1;
3051da177e4SLinus Torvalds     struct wf_lfo lfo2;
3061da177e4SLinus Torvalds };
3071da177e4SLinus Torvalds typedef struct wf_patch wavefront_patch;
3081da177e4SLinus Torvalds 
3091da177e4SLinus Torvalds struct wf_layer
3101da177e4SLinus Torvalds {
3111da177e4SLinus Torvalds     u8 patch_number;
3121da177e4SLinus Torvalds 
3131da177e4SLinus Torvalds     u8 mix_level:7;
3141da177e4SLinus Torvalds     u8 mute:1;
3151da177e4SLinus Torvalds 
3161da177e4SLinus Torvalds     u8 split_point:7;
3171da177e4SLinus Torvalds     u8 play_below:1;
3181da177e4SLinus Torvalds 
3191da177e4SLinus Torvalds     u8 pan_mod_src:2;
3201da177e4SLinus Torvalds     u8 pan_or_mod:1;
3211da177e4SLinus Torvalds     u8 pan:4;
3221da177e4SLinus Torvalds     u8 split_type:1;
3231da177e4SLinus Torvalds };
3241da177e4SLinus Torvalds typedef struct wf_layer wavefront_layer;
3251da177e4SLinus Torvalds 
3261da177e4SLinus Torvalds struct wf_program
3271da177e4SLinus Torvalds {
3281da177e4SLinus Torvalds     struct wf_layer layer[WF_NUM_LAYERS];
3291da177e4SLinus Torvalds };
3301da177e4SLinus Torvalds typedef struct wf_program wavefront_program;
3311da177e4SLinus Torvalds 
3321da177e4SLinus Torvalds struct wf_sample_offset
3331da177e4SLinus Torvalds {
3341da177e4SLinus Torvalds     s32 Fraction:4;
3351da177e4SLinus Torvalds     s32 Integer:20;
3361da177e4SLinus Torvalds     s32 Unused:8;
3371da177e4SLinus Torvalds };
3381da177e4SLinus Torvalds typedef struct wf_sample_offset wavefront_sample_offset;
3391da177e4SLinus Torvalds 
3401da177e4SLinus Torvalds /* Sample slot types */
3411da177e4SLinus Torvalds 
3421da177e4SLinus Torvalds #define WF_ST_SAMPLE      0
3431da177e4SLinus Torvalds #define WF_ST_MULTISAMPLE 1
3441da177e4SLinus Torvalds #define WF_ST_ALIAS       2
3451da177e4SLinus Torvalds #define WF_ST_EMPTY       3
3461da177e4SLinus Torvalds 
3471da177e4SLinus Torvalds /* pseudo's */
3481da177e4SLinus Torvalds 
3491da177e4SLinus Torvalds #define WF_ST_DRUM        4
3501da177e4SLinus Torvalds #define WF_ST_PROGRAM     5
3511da177e4SLinus Torvalds #define WF_ST_PATCH       6
3521da177e4SLinus Torvalds #define WF_ST_SAMPLEHDR   7
3531da177e4SLinus Torvalds 
3541da177e4SLinus Torvalds #define WF_ST_MASK        0xf
3551da177e4SLinus Torvalds 
3561da177e4SLinus Torvalds /* Flags for slot status. These occupy the upper bits of the same byte
3571da177e4SLinus Torvalds    as a sample type.
3581da177e4SLinus Torvalds */
3591da177e4SLinus Torvalds 
3601da177e4SLinus Torvalds #define WF_SLOT_USED      0x80   /* XXX don't rely on this being accurate */
3611da177e4SLinus Torvalds #define WF_SLOT_FILLED    0x40
3621da177e4SLinus Torvalds #define WF_SLOT_ROM       0x20
3631da177e4SLinus Torvalds 
3641da177e4SLinus Torvalds #define WF_SLOT_MASK      0xf0
3651da177e4SLinus Torvalds 
3661da177e4SLinus Torvalds /* channel constants */
3671da177e4SLinus Torvalds 
3681da177e4SLinus Torvalds #define WF_CH_MONO  0
3691da177e4SLinus Torvalds #define WF_CH_LEFT  1
3701da177e4SLinus Torvalds #define WF_CH_RIGHT 2
3711da177e4SLinus Torvalds 
3721da177e4SLinus Torvalds /* Sample formats */
3731da177e4SLinus Torvalds 
3741da177e4SLinus Torvalds #define LINEAR_16BIT 0
3751da177e4SLinus Torvalds #define WHITE_NOISE  1
3761da177e4SLinus Torvalds #define LINEAR_8BIT  2
3771da177e4SLinus Torvalds #define MULAW_8BIT   3
3781da177e4SLinus Torvalds 
3791da177e4SLinus Torvalds #define WF_SAMPLE_IS_8BIT(smpl) ((smpl)->SampleResolution&2)
3801da177e4SLinus Torvalds 
3811da177e4SLinus Torvalds 
3821da177e4SLinus Torvalds /*
3831da177e4SLinus Torvalds 
3841da177e4SLinus Torvalds   Because most/all of the sample data we pass in via pointers has
3851da177e4SLinus Torvalds   never been copied (just mmap-ed into user space straight from the
3861da177e4SLinus Torvalds   disk), it would be nice to allow handling of multi-channel sample
3871da177e4SLinus Torvalds   data without forcing user-level extraction of the relevant bytes.
3881da177e4SLinus Torvalds 
3891da177e4SLinus Torvalds   So, we need a way of specifying which channel to use (the WaveFront
3901da177e4SLinus Torvalds   only handles mono samples in a given slot), and the only way to do
3911da177e4SLinus Torvalds   this without using some struct other than wavefront_sample as the
3921da177e4SLinus Torvalds   interface is the awful hack of using the unused bits in a
3931da177e4SLinus Torvalds   wavefront_sample:
3941da177e4SLinus Torvalds 
3951da177e4SLinus Torvalds   Val      Meaning
3961da177e4SLinus Torvalds   ---      -------
3971da177e4SLinus Torvalds   0        no channel selection (use channel 1, sample is MONO)
3981da177e4SLinus Torvalds   1        use first channel, and skip one
3991da177e4SLinus Torvalds   2        use second channel, and skip one
4001da177e4SLinus Torvalds   3        use third channel, and skip two
4011da177e4SLinus Torvalds   4        use fourth channel, skip three
4021da177e4SLinus Torvalds   5        use fifth channel, skip four
4031da177e4SLinus Torvalds   6        use six channel, skip five
4041da177e4SLinus Torvalds 
4051da177e4SLinus Torvalds 
4061da177e4SLinus Torvalds   This can handle up to 4 channels, and anyone downloading >4 channels
4071da177e4SLinus Torvalds   of sample data just to select one of them needs to find some tools
4081da177e4SLinus Torvalds   like sox ...
4091da177e4SLinus Torvalds 
4101da177e4SLinus Torvalds   NOTE: values 0, 1 and 2 correspond to WF_CH_* above. This is
4111da177e4SLinus Torvalds   important.
4121da177e4SLinus Torvalds 
4131da177e4SLinus Torvalds */
4141da177e4SLinus Torvalds 
4151da177e4SLinus Torvalds #define WF_SET_CHANNEL(samp,chn) \
4161da177e4SLinus Torvalds  (samp)->Unused1 = chn & 0x1; \
4171da177e4SLinus Torvalds  (samp)->Unused2 = chn & 0x2; \
4181da177e4SLinus Torvalds  (samp)->Unused3 = chn & 0x4
4191da177e4SLinus Torvalds 
4201da177e4SLinus Torvalds #define WF_GET_CHANNEL(samp) \
4211da177e4SLinus Torvalds   (((samp)->Unused3 << 2)|((samp)->Unused2<<1)|(samp)->Unused1)
4221da177e4SLinus Torvalds 
4231da177e4SLinus Torvalds typedef struct wf_sample {
4241da177e4SLinus Torvalds     struct wf_sample_offset sampleStartOffset;
4251da177e4SLinus Torvalds     struct wf_sample_offset loopStartOffset;
4261da177e4SLinus Torvalds     struct wf_sample_offset loopEndOffset;
4271da177e4SLinus Torvalds     struct wf_sample_offset sampleEndOffset;
4281da177e4SLinus Torvalds     s16 FrequencyBias;
4291da177e4SLinus Torvalds     u8 SampleResolution:2;  /* sample_format */
4301da177e4SLinus Torvalds     u8 Unused1:1;
4311da177e4SLinus Torvalds     u8 Loop:1;
4321da177e4SLinus Torvalds     u8 Bidirectional:1;
4331da177e4SLinus Torvalds     u8 Unused2:1;
4341da177e4SLinus Torvalds     u8 Reverse:1;
4351da177e4SLinus Torvalds     u8 Unused3:1;
4361da177e4SLinus Torvalds } wavefront_sample;
4371da177e4SLinus Torvalds 
4381da177e4SLinus Torvalds typedef struct wf_multisample {
4391da177e4SLinus Torvalds     s16 NumberOfSamples;   /* log2 of the number of samples */
4401da177e4SLinus Torvalds     s16 SampleNumber[NUM_MIDIKEYS];
4411da177e4SLinus Torvalds } wavefront_multisample;
4421da177e4SLinus Torvalds 
4431da177e4SLinus Torvalds typedef struct wf_alias {
4446a878184SJan Blunck     s16 OriginalSample;
4451da177e4SLinus Torvalds 
4466a878184SJan Blunck     struct wf_sample_offset sampleStartOffset;
4476a878184SJan Blunck     struct wf_sample_offset loopStartOffset;
4486a878184SJan Blunck     struct wf_sample_offset sampleEndOffset;
4496a878184SJan Blunck     struct wf_sample_offset loopEndOffset;
4501da177e4SLinus Torvalds 
4516a878184SJan Blunck     s16  FrequencyBias;
4521da177e4SLinus Torvalds 
4536a878184SJan Blunck     u8 SampleResolution:2;
4546a878184SJan Blunck     u8 Unused1:1;
4556a878184SJan Blunck     u8 Loop:1;
4566a878184SJan Blunck     u8 Bidirectional:1;
4576a878184SJan Blunck     u8 Unused2:1;
4586a878184SJan Blunck     u8 Reverse:1;
4596a878184SJan Blunck     u8 Unused3:1;
4601da177e4SLinus Torvalds 
4611da177e4SLinus Torvalds     /* This structure is meant to be padded only to 16 bits on their
4621da177e4SLinus Torvalds        original. Of course, whoever wrote their documentation didn't
4631da177e4SLinus Torvalds        realize that sizeof(struct) can be >=
4641da177e4SLinus Torvalds        sum(sizeof(struct-fields)) and so thought that giving a C level
4651da177e4SLinus Torvalds        description of the structs used in WavePatch files was
4661da177e4SLinus Torvalds        sufficient. I suppose it was, as long as you remember the
4671da177e4SLinus Torvalds        standard 16->32 bit issues.
4681da177e4SLinus Torvalds     */
4691da177e4SLinus Torvalds 
4706a878184SJan Blunck     u8 sixteen_bit_padding;
4716a878184SJan Blunck } __attribute__((packed)) wavefront_alias;
4721da177e4SLinus Torvalds 
4731da177e4SLinus Torvalds typedef struct wf_drum {
4741da177e4SLinus Torvalds     u8 PatchNumber;
4751da177e4SLinus Torvalds     u8 MixLevel:7;
4761da177e4SLinus Torvalds     u8 Unmute:1;
4771da177e4SLinus Torvalds     u8 Group:4;
4781da177e4SLinus Torvalds     u8 Unused1:4;
4791da177e4SLinus Torvalds     u8 PanModSource:2;
4801da177e4SLinus Torvalds     u8 PanModulated:1;
4811da177e4SLinus Torvalds     u8 PanAmount:4;
4821da177e4SLinus Torvalds     u8 Unused2:1;
4831da177e4SLinus Torvalds } wavefront_drum;
4841da177e4SLinus Torvalds 
4851da177e4SLinus Torvalds typedef struct wf_drumkit {
4861da177e4SLinus Torvalds     struct wf_drum drum[NUM_MIDIKEYS];
4871da177e4SLinus Torvalds } wavefront_drumkit;
4881da177e4SLinus Torvalds 
4891da177e4SLinus Torvalds typedef struct wf_channel_programs {
4901da177e4SLinus Torvalds     u8 Program[NUM_MIDICHANNELS];
4911da177e4SLinus Torvalds } wavefront_channel_programs;
4921da177e4SLinus Torvalds 
4931da177e4SLinus Torvalds /* How to get MIDI channel status from the data returned by
4941da177e4SLinus Torvalds    a WFC_GET_CHANNEL_STATUS command (a struct wf_channel_programs)
4951da177e4SLinus Torvalds */
4961da177e4SLinus Torvalds 
4971da177e4SLinus Torvalds #define WF_CHANNEL_STATUS(ch,wcp) (wcp)[(ch/7)] & (1<<((ch)%7))
4981da177e4SLinus Torvalds 
4991da177e4SLinus Torvalds typedef union wf_any {
5001da177e4SLinus Torvalds     wavefront_sample s;
5011da177e4SLinus Torvalds     wavefront_multisample ms;
5021da177e4SLinus Torvalds     wavefront_alias a;
5031da177e4SLinus Torvalds     wavefront_program pr;
5041da177e4SLinus Torvalds     wavefront_patch p;
5051da177e4SLinus Torvalds     wavefront_drum d;
5061da177e4SLinus Torvalds } wavefront_any;
5071da177e4SLinus Torvalds 
5081da177e4SLinus Torvalds /* Hannu Solvainen hoped that his "patch_info" struct in soundcard.h
5091da177e4SLinus Torvalds    might work for other wave-table based patch loading situations.
5101da177e4SLinus Torvalds    Alas, his fears were correct. The WaveFront doesn't even come with
5111da177e4SLinus Torvalds    just "patches", but several different kind of structures that
5121da177e4SLinus Torvalds    control the sound generation process.
5131da177e4SLinus Torvalds  */
5141da177e4SLinus Torvalds 
5151da177e4SLinus Torvalds typedef struct wf_patch_info {
5161da177e4SLinus Torvalds 
5171da177e4SLinus Torvalds     /* the first two fields are used by the OSS "patch loading" interface
5181da177e4SLinus Torvalds        only, and are unused by the current user-level library.
5191da177e4SLinus Torvalds     */
5201da177e4SLinus Torvalds 
5211da177e4SLinus Torvalds     s16   key;               /* Use WAVEFRONT_PATCH here */
5221da177e4SLinus Torvalds     u16  devno;             /* fill in when sending */
5231da177e4SLinus Torvalds     u8  subkey;            /* WF_ST_{SAMPLE,ALIAS,etc.} */
5241da177e4SLinus Torvalds 
5251da177e4SLinus Torvalds #define WAVEFRONT_FIND_FREE_SAMPLE_SLOT 999
5261da177e4SLinus Torvalds 
5271da177e4SLinus Torvalds     u16  number;            /* patch/sample/prog number */
5281da177e4SLinus Torvalds 
5291da177e4SLinus Torvalds     u32  size;              /* size of any data included in
5301da177e4SLinus Torvalds 				  one of the fields in `hdrptr', or
5311da177e4SLinus Torvalds 				  as `dataptr'.
5321da177e4SLinus Torvalds 
5331da177e4SLinus Torvalds 				  NOTE: for actual samples, this is
5341da177e4SLinus Torvalds 				  the size of the *SELECTED CHANNEL*
5351da177e4SLinus Torvalds 				  even if more data is actually available.
5361da177e4SLinus Torvalds 
5371da177e4SLinus Torvalds 				  So, a stereo sample (2 channels) of
5381da177e4SLinus Torvalds 				  6000 bytes total has `size' = 3000.
5391da177e4SLinus Torvalds 
5401da177e4SLinus Torvalds 				  See the macros and comments for
5411da177e4SLinus Torvalds 				  WF_{GET,SET}_CHANNEL above.
5421da177e4SLinus Torvalds 
5431da177e4SLinus Torvalds 			       */
5441da177e4SLinus Torvalds     wavefront_any __user *hdrptr;      /* user-space ptr to hdr bytes */
5451da177e4SLinus Torvalds     u16 __user *dataptr;            /* actual sample data */
5461da177e4SLinus Torvalds 
5471da177e4SLinus Torvalds     wavefront_any hdr;          /* kernel-space copy of hdr bytes */
5481da177e4SLinus Torvalds } wavefront_patch_info;
5491da177e4SLinus Torvalds 
5501da177e4SLinus Torvalds /* The maximum number of bytes we will ever move to or from user space
5511da177e4SLinus Torvalds    in response to a WFC_* command.  This obviously doesn't cover
5521da177e4SLinus Torvalds    actual sample data.
5531da177e4SLinus Torvalds */
5541da177e4SLinus Torvalds 
5551da177e4SLinus Torvalds #define WF_MAX_READ sizeof(wavefront_multisample)
5561da177e4SLinus Torvalds #define WF_MAX_WRITE sizeof(wavefront_multisample)
5571da177e4SLinus Torvalds 
5581da177e4SLinus Torvalds /*
5591da177e4SLinus Torvalds    This allows us to execute any WF command except the download/upload
5601da177e4SLinus Torvalds    ones, which are handled differently due to copyin/copyout issues as
5611da177e4SLinus Torvalds    well as data-nybbling to/from the card.
5621da177e4SLinus Torvalds  */
5631da177e4SLinus Torvalds 
5641da177e4SLinus Torvalds typedef struct wavefront_control {
5651da177e4SLinus Torvalds     int cmd;                           /* WFC_* */
5661da177e4SLinus Torvalds     char status;                       /* return status to user-space */
5671da177e4SLinus Torvalds     unsigned char rbuf[WF_MAX_READ];   /* bytes read from card */
5681da177e4SLinus Torvalds     unsigned char wbuf[WF_MAX_WRITE];  /* bytes written to card */
5691da177e4SLinus Torvalds } wavefront_control;
5701da177e4SLinus Torvalds 
5711da177e4SLinus Torvalds #define WFCTL_WFCMD    0x1
5721da177e4SLinus Torvalds #define WFCTL_LOAD_SPP 0x2
5731da177e4SLinus Torvalds 
5741da177e4SLinus Torvalds /* Modulator table */
5751da177e4SLinus Torvalds 
5761da177e4SLinus Torvalds #define WF_MOD_LFO1      0
5771da177e4SLinus Torvalds #define WF_MOD_LFO2      1
5781da177e4SLinus Torvalds #define WF_MOD_ENV1      2
5791da177e4SLinus Torvalds #define WF_MOD_ENV2      3
5801da177e4SLinus Torvalds #define WF_MOD_KEYBOARD  4
5811da177e4SLinus Torvalds #define WF_MOD_LOGKEY    5
5821da177e4SLinus Torvalds #define WF_MOD_VELOCITY  6
5831da177e4SLinus Torvalds #define WF_MOD_LOGVEL    7
5841da177e4SLinus Torvalds #define WF_MOD_RANDOM    8
5851da177e4SLinus Torvalds #define WF_MOD_PRESSURE  9
5861da177e4SLinus Torvalds #define WF_MOD_MOD_WHEEL 10
5871da177e4SLinus Torvalds #define WF_MOD_1         WF_MOD_MOD_WHEEL
5881da177e4SLinus Torvalds #define WF_MOD_BREATH    11
5891da177e4SLinus Torvalds #define WF_MOD_2         WF_MOD_BREATH
5901da177e4SLinus Torvalds #define WF_MOD_FOOT      12
5911da177e4SLinus Torvalds #define WF_MOD_4         WF_MOD_FOOT
5921da177e4SLinus Torvalds #define WF_MOD_VOLUME    13
5931da177e4SLinus Torvalds #define WF_MOD_7         WF_MOD_VOLUME
5941da177e4SLinus Torvalds #define WF_MOD_PAN       14
5951da177e4SLinus Torvalds #define WF_MOD_10        WF_MOD_PAN
5961da177e4SLinus Torvalds #define WF_MOD_EXPR      15
5971da177e4SLinus Torvalds #define WF_MOD_11        WF_MOD_EXPR
5981da177e4SLinus Torvalds 
5991da177e4SLinus Torvalds /* FX-related material */
6001da177e4SLinus Torvalds 
6011da177e4SLinus Torvalds typedef struct wf_fx_info {
6021da177e4SLinus Torvalds     int request;             /* see list below */
6031da177e4SLinus Torvalds     long data[4];             /* we don't need much */
6041da177e4SLinus Torvalds } wavefront_fx_info;
6051da177e4SLinus Torvalds 
6061da177e4SLinus Torvalds /* support for each of these will be forthcoming once I or someone
6071da177e4SLinus Torvalds    else has figured out which of the addresses on page 6 and page 7 of
6081da177e4SLinus Torvalds    the YSS225 control each parameter. Incidentally, these come from
6091da177e4SLinus Torvalds    the Windows driver interface, but again, Turtle Beach didn't
6101da177e4SLinus Torvalds    document the API to use them.
6111da177e4SLinus Torvalds */
6121da177e4SLinus Torvalds 
6131da177e4SLinus Torvalds #define WFFX_SETOUTGAIN		        0
6141da177e4SLinus Torvalds #define WFFX_SETSTEREOOUTGAIN		1
6151da177e4SLinus Torvalds #define WFFX_SETREVERBIN1GAIN		2
6161da177e4SLinus Torvalds #define WFFX_SETREVERBIN2GAIN		3
6171da177e4SLinus Torvalds #define WFFX_SETREVERBIN3GAIN		4
6181da177e4SLinus Torvalds #define WFFX_SETCHORUSINPORT		5
6191da177e4SLinus Torvalds #define WFFX_SETREVERBIN1PORT		6
6201da177e4SLinus Torvalds #define WFFX_SETREVERBIN2PORT		7
6211da177e4SLinus Torvalds #define WFFX_SETREVERBIN3PORT		8
6221da177e4SLinus Torvalds #define WFFX_SETEFFECTPORT		9
6231da177e4SLinus Torvalds #define WFFX_SETAUXPORT		        10
6241da177e4SLinus Torvalds #define WFFX_SETREVERBTYPE		11
6251da177e4SLinus Torvalds #define WFFX_SETREVERBDELAY		12
6261da177e4SLinus Torvalds #define WFFX_SETCHORUSLFO		13
6271da177e4SLinus Torvalds #define WFFX_SETCHORUSPMD		14
6281da177e4SLinus Torvalds #define WFFX_SETCHORUSAMD		15
6291da177e4SLinus Torvalds #define WFFX_SETEFFECT		        16
6301da177e4SLinus Torvalds #define WFFX_SETBASEALL		        17
6311da177e4SLinus Torvalds #define WFFX_SETREVERBALL		18
6321da177e4SLinus Torvalds #define WFFX_SETCHORUSALL		20
6331da177e4SLinus Torvalds #define WFFX_SETREVERBDEF		22
6341da177e4SLinus Torvalds #define WFFX_SETCHORUSDEF		23
6351da177e4SLinus Torvalds #define WFFX_DELAYSETINGAIN		24
6361da177e4SLinus Torvalds #define WFFX_DELAYSETFBGAIN	        25
6371da177e4SLinus Torvalds #define WFFX_DELAYSETFBLPF		26
6381da177e4SLinus Torvalds #define WFFX_DELAYSETGAIN		27
6391da177e4SLinus Torvalds #define WFFX_DELAYSETTIME		28
6401da177e4SLinus Torvalds #define WFFX_DELAYSETFBTIME		29
6411da177e4SLinus Torvalds #define WFFX_DELAYSETALL		30
6421da177e4SLinus Torvalds #define WFFX_DELAYSETDEF		32
6431da177e4SLinus Torvalds #define WFFX_SDELAYSETINGAIN		33
6441da177e4SLinus Torvalds #define WFFX_SDELAYSETFBGAIN		34
6451da177e4SLinus Torvalds #define WFFX_SDELAYSETFBLPF		35
6461da177e4SLinus Torvalds #define WFFX_SDELAYSETGAIN		36
6471da177e4SLinus Torvalds #define WFFX_SDELAYSETTIME		37
6481da177e4SLinus Torvalds #define WFFX_SDELAYSETFBTIME		38
6491da177e4SLinus Torvalds #define WFFX_SDELAYSETALL		39
6501da177e4SLinus Torvalds #define WFFX_SDELAYSETDEF		41
6511da177e4SLinus Torvalds #define WFFX_DEQSETINGAIN		42
6521da177e4SLinus Torvalds #define WFFX_DEQSETFILTER		43
6531da177e4SLinus Torvalds #define WFFX_DEQSETALL		        44
6541da177e4SLinus Torvalds #define WFFX_DEQSETDEF		        46
6551da177e4SLinus Torvalds #define WFFX_MUTE		        47
6561da177e4SLinus Torvalds #define WFFX_FLANGESETBALANCE	        48
6571da177e4SLinus Torvalds #define WFFX_FLANGESETDELAY		49
6581da177e4SLinus Torvalds #define WFFX_FLANGESETDWFFX_TH		50
6591da177e4SLinus Torvalds #define WFFX_FLANGESETFBGAIN		51
6601da177e4SLinus Torvalds #define WFFX_FLANGESETINGAIN		52
6611da177e4SLinus Torvalds #define WFFX_FLANGESETLFO		53
6621da177e4SLinus Torvalds #define WFFX_FLANGESETALL		54
6631da177e4SLinus Torvalds #define WFFX_FLANGESETDEF		56
6641da177e4SLinus Torvalds #define WFFX_PITCHSETSHIFT		57
6651da177e4SLinus Torvalds #define WFFX_PITCHSETBALANCE		58
6661da177e4SLinus Torvalds #define WFFX_PITCHSETALL		59
6671da177e4SLinus Torvalds #define WFFX_PITCHSETDEF		61
6681da177e4SLinus Torvalds #define WFFX_SRSSETINGAIN		62
6691da177e4SLinus Torvalds #define WFFX_SRSSETSPACE		63
6701da177e4SLinus Torvalds #define WFFX_SRSSETCENTER		64
6711da177e4SLinus Torvalds #define WFFX_SRSSETGAIN		        65
6721da177e4SLinus Torvalds #define WFFX_SRSSETMODE	        	66
6731da177e4SLinus Torvalds #define WFFX_SRSSETDEF		        68
6741da177e4SLinus Torvalds 
6751da177e4SLinus Torvalds /* Allow direct user-space control over FX memory/coefficient data.
6761da177e4SLinus Torvalds    In theory this could be used to download the FX microprogram,
6771da177e4SLinus Torvalds    but it would be a little slower, and involve some weird code.
6781da177e4SLinus Torvalds  */
6791da177e4SLinus Torvalds 
6801da177e4SLinus Torvalds #define WFFX_MEMSET              69
6811da177e4SLinus Torvalds 
6821da177e4SLinus Torvalds #endif /* __SOUND_WAVEFRONT_H__ */
683