1*1a59d1b8SThomas 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