blob: 7ae13b975c2af230ae86dc3552e9aabcefd65e79 [file] [log] [blame]
Elliott Hughes180edef2023-11-02 00:08:05 +00001/*
2 * This file is auto-generated. Modifications will be lost.
3 *
4 * See https://android.googlesource.com/platform/bionic/+/master/libc/kernel/
5 * for more information.
6 */
Ben Cheng655a7c02013-10-16 16:09:24 -07007#ifndef _UAPISOUNDCARD_H
8#define _UAPISOUNDCARD_H
9#define SOUND_VERSION 0x030802
10#define OPEN_SOUND_SYSTEM
Ben Cheng655a7c02013-10-16 16:09:24 -070011#include <linux/ioctl.h>
12#include <endian.h>
13#define SNDCARD_ADLIB 1
14#define SNDCARD_SB 2
Ben Cheng655a7c02013-10-16 16:09:24 -070015#define SNDCARD_PAS 3
16#define SNDCARD_GUS 4
17#define SNDCARD_MPU401 5
18#define SNDCARD_SB16 6
Ben Cheng655a7c02013-10-16 16:09:24 -070019#define SNDCARD_SB16MIDI 7
20#define SNDCARD_UART6850 8
21#define SNDCARD_GUS16 9
22#define SNDCARD_MSS 10
Ben Cheng655a7c02013-10-16 16:09:24 -070023#define SNDCARD_PSS 11
24#define SNDCARD_SSCAPE 12
25#define SNDCARD_PSS_MPU 13
26#define SNDCARD_PSS_MSS 14
Ben Cheng655a7c02013-10-16 16:09:24 -070027#define SNDCARD_SSCAPE_MSS 15
28#define SNDCARD_TRXPRO 16
29#define SNDCARD_TRXPRO_SB 17
30#define SNDCARD_TRXPRO_MPU 18
Ben Cheng655a7c02013-10-16 16:09:24 -070031#define SNDCARD_MAD16 19
32#define SNDCARD_MAD16_MPU 20
33#define SNDCARD_CS4232 21
34#define SNDCARD_CS4232_MPU 22
Ben Cheng655a7c02013-10-16 16:09:24 -070035#define SNDCARD_MAUI 23
36#define SNDCARD_PSEUDO_MSS 24
37#define SNDCARD_GUSPNP 25
38#define SNDCARD_UART401 26
Ben Cheng655a7c02013-10-16 16:09:24 -070039#ifndef _SIOWR
40#if defined(_IOWR) && (defined(_AIX) || !defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__))
41#define SIOCPARM_MASK IOCPARM_MASK
42#define SIOC_VOID IOC_VOID
Ben Cheng655a7c02013-10-16 16:09:24 -070043#define SIOC_OUT IOC_OUT
44#define SIOC_IN IOC_IN
45#define SIOC_INOUT IOC_INOUT
46#define _SIOC_SIZE _IOC_SIZE
Ben Cheng655a7c02013-10-16 16:09:24 -070047#define _SIOC_DIR _IOC_DIR
48#define _SIOC_NONE _IOC_NONE
49#define _SIOC_READ _IOC_READ
50#define _SIOC_WRITE _IOC_WRITE
Ben Cheng655a7c02013-10-16 16:09:24 -070051#define _SIO _IO
52#define _SIOR _IOR
53#define _SIOW _IOW
54#define _SIOWR _IOWR
Ben Cheng655a7c02013-10-16 16:09:24 -070055#else
56#define SIOCPARM_MASK 0x1fff
57#define SIOC_VOID 0x00000000
58#define SIOC_OUT 0x20000000
Ben Cheng655a7c02013-10-16 16:09:24 -070059#define SIOC_IN 0x40000000
Tao Baod7db5942015-01-28 10:07:51 -080060#define SIOC_INOUT (SIOC_IN | SIOC_OUT)
61#define _SIO(x,y) ((int) (SIOC_VOID | (x << 8) | y))
62#define _SIOR(x,y,t) ((int) (SIOC_OUT | ((sizeof(t) & SIOCPARM_MASK) << 16) | (x << 8) | y))
Tao Baod7db5942015-01-28 10:07:51 -080063#define _SIOW(x,y,t) ((int) (SIOC_IN | ((sizeof(t) & SIOCPARM_MASK) << 16) | (x << 8) | y))
64#define _SIOWR(x,y,t) ((int) (SIOC_INOUT | ((sizeof(t) & SIOCPARM_MASK) << 16) | (x << 8) | y))
65#define _SIOC_SIZE(x) ((x >> 16) & SIOCPARM_MASK)
Ben Cheng655a7c02013-10-16 16:09:24 -070066#define _SIOC_DIR(x) (x & 0xf0000000)
Ben Cheng655a7c02013-10-16 16:09:24 -070067#define _SIOC_NONE SIOC_VOID
68#define _SIOC_READ SIOC_OUT
69#define _SIOC_WRITE SIOC_IN
70#endif
Ben Cheng655a7c02013-10-16 16:09:24 -070071#endif
Tao Baod7db5942015-01-28 10:07:51 -080072#define SNDCTL_SEQ_RESET _SIO('Q', 0)
73#define SNDCTL_SEQ_SYNC _SIO('Q', 1)
Ben Cheng655a7c02013-10-16 16:09:24 -070074#define SNDCTL_SYNTH_INFO _SIOWR('Q', 2, struct synth_info)
Ben Cheng655a7c02013-10-16 16:09:24 -070075#define SNDCTL_SEQ_CTRLRATE _SIOWR('Q', 3, int)
Tao Baod7db5942015-01-28 10:07:51 -080076#define SNDCTL_SEQ_GETOUTCOUNT _SIOR('Q', 4, int)
77#define SNDCTL_SEQ_GETINCOUNT _SIOR('Q', 5, int)
78#define SNDCTL_SEQ_PERCMODE _SIOW('Q', 6, int)
Tao Baod7db5942015-01-28 10:07:51 -080079#define SNDCTL_FM_LOAD_INSTR _SIOW('Q', 7, struct sbi_instrument)
80#define SNDCTL_SEQ_TESTMIDI _SIOW('Q', 8, int)
81#define SNDCTL_SEQ_RESETSAMPLES _SIOW('Q', 9, int)
82#define SNDCTL_SEQ_NRSYNTHS _SIOR('Q', 10, int)
Tao Baod7db5942015-01-28 10:07:51 -080083#define SNDCTL_SEQ_NRMIDIS _SIOR('Q', 11, int)
84#define SNDCTL_MIDI_INFO _SIOWR('Q', 12, struct midi_info)
85#define SNDCTL_SEQ_THRESHOLD _SIOW('Q', 13, int)
86#define SNDCTL_SYNTH_MEMAVL _SIOWR('Q', 14, int)
Tao Baod7db5942015-01-28 10:07:51 -080087#define SNDCTL_FM_4OP_ENABLE _SIOW('Q', 15, int)
88#define SNDCTL_SEQ_PANIC _SIO('Q', 17)
89#define SNDCTL_SEQ_OUTOFBAND _SIOW('Q', 18, struct seq_event_rec)
90#define SNDCTL_SEQ_GETTIME _SIOR('Q', 19, int)
Tao Baod7db5942015-01-28 10:07:51 -080091#define SNDCTL_SYNTH_ID _SIOWR('Q', 20, struct synth_info)
92#define SNDCTL_SYNTH_CONTROL _SIOWR('Q', 21, struct synth_control)
93#define SNDCTL_SYNTH_REMOVESAMPLE _SIOWR('Q', 22, struct remove_sample)
94typedef struct synth_control {
Tao Baod7db5942015-01-28 10:07:51 -080095 int devno;
96 char data[4000];
97} synth_control;
98typedef struct remove_sample {
Tao Baod7db5942015-01-28 10:07:51 -080099 int devno;
100 int bankno;
101 int instrno;
Ben Cheng655a7c02013-10-16 16:09:24 -0700102} remove_sample;
Tao Baod7db5942015-01-28 10:07:51 -0800103typedef struct seq_event_rec {
104 unsigned char arr[8];
Ben Cheng655a7c02013-10-16 16:09:24 -0700105} seq_event_rec;
106#define SNDCTL_TMR_TIMEBASE _SIOWR('T', 1, int)
Tao Baod7db5942015-01-28 10:07:51 -0800107#define SNDCTL_TMR_START _SIO('T', 2)
108#define SNDCTL_TMR_STOP _SIO('T', 3)
109#define SNDCTL_TMR_CONTINUE _SIO('T', 4)
Ben Cheng655a7c02013-10-16 16:09:24 -0700110#define SNDCTL_TMR_TEMPO _SIOWR('T', 5, int)
111#define SNDCTL_TMR_SOURCE _SIOWR('T', 6, int)
112#define TMR_INTERNAL 0x00000001
Ben Cheng655a7c02013-10-16 16:09:24 -0700113#define TMR_EXTERNAL 0x00000002
114#define TMR_MODE_MIDI 0x00000010
115#define TMR_MODE_FSK 0x00000020
116#define TMR_MODE_CLS 0x00000040
Ben Cheng655a7c02013-10-16 16:09:24 -0700117#define TMR_MODE_SMPTE 0x00000080
Tao Baod7db5942015-01-28 10:07:51 -0800118#define SNDCTL_TMR_METRONOME _SIOW('T', 7, int)
Tao Baod7db5942015-01-28 10:07:51 -0800119#define SNDCTL_TMR_SELECT _SIOW('T', 8, int)
120#define _LINUX_PATCHKEY_H_INDIRECT
Ben Cheng655a7c02013-10-16 16:09:24 -0700121#include <linux/patchkey.h>
122#undef _LINUX_PATCHKEY_H_INDIRECT
123#ifdef __BYTE_ORDER
124#if __BYTE_ORDER == __BIG_ENDIAN
Ben Cheng655a7c02013-10-16 16:09:24 -0700125#define AFMT_S16_NE AFMT_S16_BE
Tao Baod7db5942015-01-28 10:07:51 -0800126#elif __BYTE_ORDER==__LITTLE_ENDIAN
Ben Cheng655a7c02013-10-16 16:09:24 -0700127#define AFMT_S16_NE AFMT_S16_LE
128#else
Ben Cheng655a7c02013-10-16 16:09:24 -0700129#error "could not determine byte order"
130#endif
131#endif
132struct patch_info {
Tao Baod7db5942015-01-28 10:07:51 -0800133 unsigned short key;
Ben Cheng655a7c02013-10-16 16:09:24 -0700134#define WAVE_PATCH _PATCHKEY(0x04)
135#define GUS_PATCH WAVE_PATCH
136#define WAVEFRONT_PATCH _PATCHKEY(0x06)
Tao Baod7db5942015-01-28 10:07:51 -0800137 short device_no;
138 short instr_no;
Tao Baod7db5942015-01-28 10:07:51 -0800139 unsigned int mode;
Ben Cheng655a7c02013-10-16 16:09:24 -0700140#define WAVE_16_BITS 0x01
Ben Cheng655a7c02013-10-16 16:09:24 -0700141#define WAVE_UNSIGNED 0x02
142#define WAVE_LOOPING 0x04
143#define WAVE_BIDIR_LOOP 0x08
144#define WAVE_LOOP_BACK 0x10
Ben Cheng655a7c02013-10-16 16:09:24 -0700145#define WAVE_SUSTAIN_ON 0x20
146#define WAVE_ENVELOPES 0x40
147#define WAVE_FAST_RELEASE 0x80
148#define WAVE_VIBRATO 0x00010000
Ben Cheng655a7c02013-10-16 16:09:24 -0700149#define WAVE_TREMOLO 0x00020000
150#define WAVE_SCALE 0x00040000
151#define WAVE_FRACTIONS 0x00080000
152#define WAVE_ROM 0x40000000
Ben Cheng655a7c02013-10-16 16:09:24 -0700153#define WAVE_MULAW 0x20000000
Tao Baod7db5942015-01-28 10:07:51 -0800154 int len;
Tao Baod7db5942015-01-28 10:07:51 -0800155 int loop_start, loop_end;
156 unsigned int base_freq;
157 unsigned int base_note;
158 unsigned int high_note;
Tao Baod7db5942015-01-28 10:07:51 -0800159 unsigned int low_note;
160 int panning;
161 int detuning;
162 unsigned char env_rate[6];
Tao Baod7db5942015-01-28 10:07:51 -0800163 unsigned char env_offset[6];
164 unsigned char tremolo_sweep;
165 unsigned char tremolo_rate;
166 unsigned char tremolo_depth;
Tao Baod7db5942015-01-28 10:07:51 -0800167 unsigned char vibrato_sweep;
168 unsigned char vibrato_rate;
169 unsigned char vibrato_depth;
170 int scale_frequency;
Tao Baod7db5942015-01-28 10:07:51 -0800171 unsigned int scale_factor;
172 int volume;
173 int fractions;
174 int reserved1;
Tao Baod7db5942015-01-28 10:07:51 -0800175 int spare[2];
176 char data[1];
177};
Ben Cheng655a7c02013-10-16 16:09:24 -0700178struct sysex_info {
Tao Baod7db5942015-01-28 10:07:51 -0800179 short key;
Ben Cheng655a7c02013-10-16 16:09:24 -0700180#define SYSEX_PATCH _PATCHKEY(0x05)
Ben Cheng655a7c02013-10-16 16:09:24 -0700181#define MAUI_PATCH _PATCHKEY(0x06)
Tao Baod7db5942015-01-28 10:07:51 -0800182 short device_no;
Tao Baod7db5942015-01-28 10:07:51 -0800183 int len;
184 unsigned char data[1];
185};
Ben Cheng655a7c02013-10-16 16:09:24 -0700186#define SEQ_NOTEOFF 0
187#define SEQ_FMNOTEOFF SEQ_NOTEOFF
188#define SEQ_NOTEON 1
Ben Cheng655a7c02013-10-16 16:09:24 -0700189#define SEQ_FMNOTEON SEQ_NOTEON
190#define SEQ_WAIT TMR_WAIT_ABS
191#define SEQ_PGMCHANGE 3
192#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE
Ben Cheng655a7c02013-10-16 16:09:24 -0700193#define SEQ_SYNCTIMER TMR_START
194#define SEQ_MIDIPUTC 5
195#define SEQ_DRUMON 6
196#define SEQ_DRUMOFF 7
Ben Cheng655a7c02013-10-16 16:09:24 -0700197#define SEQ_ECHO TMR_ECHO
198#define SEQ_AFTERTOUCH 9
199#define SEQ_CONTROLLER 10
200#define CTL_BANK_SELECT 0x00
Ben Cheng655a7c02013-10-16 16:09:24 -0700201#define CTL_MODWHEEL 0x01
202#define CTL_BREATH 0x02
203#define CTL_FOOT 0x04
204#define CTL_PORTAMENTO_TIME 0x05
Ben Cheng655a7c02013-10-16 16:09:24 -0700205#define CTL_DATA_ENTRY 0x06
206#define CTL_MAIN_VOLUME 0x07
207#define CTL_BALANCE 0x08
208#define CTL_PAN 0x0a
Ben Cheng655a7c02013-10-16 16:09:24 -0700209#define CTL_EXPRESSION 0x0b
210#define CTL_GENERAL_PURPOSE1 0x10
211#define CTL_GENERAL_PURPOSE2 0x11
212#define CTL_GENERAL_PURPOSE3 0x12
Ben Cheng655a7c02013-10-16 16:09:24 -0700213#define CTL_GENERAL_PURPOSE4 0x13
214#define CTL_DAMPER_PEDAL 0x40
215#define CTL_SUSTAIN 0x40
216#define CTL_HOLD 0x40
Ben Cheng655a7c02013-10-16 16:09:24 -0700217#define CTL_PORTAMENTO 0x41
218#define CTL_SOSTENUTO 0x42
219#define CTL_SOFT_PEDAL 0x43
220#define CTL_HOLD2 0x45
Ben Cheng655a7c02013-10-16 16:09:24 -0700221#define CTL_GENERAL_PURPOSE5 0x50
222#define CTL_GENERAL_PURPOSE6 0x51
223#define CTL_GENERAL_PURPOSE7 0x52
224#define CTL_GENERAL_PURPOSE8 0x53
Ben Cheng655a7c02013-10-16 16:09:24 -0700225#define CTL_EXT_EFF_DEPTH 0x5b
226#define CTL_TREMOLO_DEPTH 0x5c
227#define CTL_CHORUS_DEPTH 0x5d
228#define CTL_DETUNE_DEPTH 0x5e
Ben Cheng655a7c02013-10-16 16:09:24 -0700229#define CTL_CELESTE_DEPTH 0x5e
230#define CTL_PHASER_DEPTH 0x5f
231#define CTL_DATA_INCREMENT 0x60
232#define CTL_DATA_DECREMENT 0x61
Ben Cheng655a7c02013-10-16 16:09:24 -0700233#define CTL_NONREG_PARM_NUM_LSB 0x62
234#define CTL_NONREG_PARM_NUM_MSB 0x63
235#define CTL_REGIST_PARM_NUM_LSB 0x64
236#define CTL_REGIST_PARM_NUM_MSB 0x65
Ben Cheng655a7c02013-10-16 16:09:24 -0700237#define CTRL_PITCH_BENDER 255
238#define CTRL_PITCH_BENDER_RANGE 254
239#define CTRL_EXPRESSION 253
240#define CTRL_MAIN_VOLUME 252
Ben Cheng655a7c02013-10-16 16:09:24 -0700241#define SEQ_BALANCE 11
242#define SEQ_VOLMODE 12
243#define VOL_METHOD_ADAGIO 1
244#define VOL_METHOD_LINEAR 2
Ben Cheng655a7c02013-10-16 16:09:24 -0700245#define SEQ_FULLSIZE 0xfd
246#define SEQ_PRIVATE 0xfe
247#define SEQ_EXTENDED 0xff
248typedef unsigned char sbi_instr_data[32];
Ben Cheng655a7c02013-10-16 16:09:24 -0700249struct sbi_instrument {
Tao Baod7db5942015-01-28 10:07:51 -0800250 unsigned short key;
Ben Cheng655a7c02013-10-16 16:09:24 -0700251#define FM_PATCH _PATCHKEY(0x01)
252#define OPL3_PATCH _PATCHKEY(0x03)
Tao Baod7db5942015-01-28 10:07:51 -0800253 short device;
254 int channel;
Tao Baod7db5942015-01-28 10:07:51 -0800255 sbi_instr_data operators;
256};
Ben Cheng655a7c02013-10-16 16:09:24 -0700257struct synth_info {
Tao Baod7db5942015-01-28 10:07:51 -0800258 char name[30];
Tao Baod7db5942015-01-28 10:07:51 -0800259 int device;
260 int synth_type;
Ben Cheng655a7c02013-10-16 16:09:24 -0700261#define SYNTH_TYPE_FM 0
262#define SYNTH_TYPE_SAMPLE 1
Tao Baod7db5942015-01-28 10:07:51 -0800263#define SYNTH_TYPE_MIDI 2
264 int synth_subtype;
Ben Cheng655a7c02013-10-16 16:09:24 -0700265#define FM_TYPE_ADLIB 0x00
266#define FM_TYPE_OPL3 0x01
267#define MIDI_TYPE_MPU401 0x401
268#define SAMPLE_TYPE_BASIC 0x10
Ben Cheng655a7c02013-10-16 16:09:24 -0700269#define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC
270#define SAMPLE_TYPE_WAVEFRONT 0x11
Tao Baod7db5942015-01-28 10:07:51 -0800271 int perc_mode;
272 int nr_voices;
273 int nr_drums;
274 int instr_bank_size;
Tao Baod7db5942015-01-28 10:07:51 -0800275 unsigned int capabilities;
Ben Cheng655a7c02013-10-16 16:09:24 -0700276#define SYNTH_CAP_PERCMODE 0x00000001
Ben Cheng655a7c02013-10-16 16:09:24 -0700277#define SYNTH_CAP_OPL3 0x00000002
278#define SYNTH_CAP_INPUT 0x00000004
Tao Baod7db5942015-01-28 10:07:51 -0800279 int dummies[19];
280};
Ben Cheng655a7c02013-10-16 16:09:24 -0700281struct sound_timer_info {
Tao Baod7db5942015-01-28 10:07:51 -0800282 char name[32];
Tao Baod7db5942015-01-28 10:07:51 -0800283 int caps;
284};
Ben Cheng655a7c02013-10-16 16:09:24 -0700285#define MIDI_CAP_MPU401 1
286struct midi_info {
Tao Baod7db5942015-01-28 10:07:51 -0800287 char name[30];
288 int device;
289 unsigned int capabilities;
290 int dev_type;
Tao Baod7db5942015-01-28 10:07:51 -0800291 int dummies[18];
292};
Ben Cheng655a7c02013-10-16 16:09:24 -0700293typedef struct {
Tao Baod7db5942015-01-28 10:07:51 -0800294 unsigned char cmd;
Tao Baod7db5942015-01-28 10:07:51 -0800295 char nr_args, nr_returns;
296 unsigned char data[30];
297} mpu_command_rec;
Ben Cheng655a7c02013-10-16 16:09:24 -0700298#define SNDCTL_MIDI_PRETIME _SIOWR('m', 0, int)
299#define SNDCTL_MIDI_MPUMODE _SIOWR('m', 1, int)
300#define SNDCTL_MIDI_MPUCMD _SIOWR('m', 2, mpu_command_rec)
Tao Baod7db5942015-01-28 10:07:51 -0800301#define SNDCTL_DSP_RESET _SIO('P', 0)
302#define SNDCTL_DSP_SYNC _SIO('P', 1)
Ben Cheng655a7c02013-10-16 16:09:24 -0700303#define SNDCTL_DSP_SPEED _SIOWR('P', 2, int)
304#define SNDCTL_DSP_STEREO _SIOWR('P', 3, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700305#define SNDCTL_DSP_GETBLKSIZE _SIOWR('P', 4, int)
306#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT
307#define SNDCTL_DSP_CHANNELS _SIOWR('P', 6, int)
308#define SOUND_PCM_WRITE_CHANNELS SNDCTL_DSP_CHANNELS
Ben Cheng655a7c02013-10-16 16:09:24 -0700309#define SOUND_PCM_WRITE_FILTER _SIOWR('P', 7, int)
Tao Baod7db5942015-01-28 10:07:51 -0800310#define SNDCTL_DSP_POST _SIO('P', 8)
Tao Baod7db5942015-01-28 10:07:51 -0800311#define SNDCTL_DSP_SUBDIVIDE _SIOWR('P', 9, int)
312#define SNDCTL_DSP_SETFRAGMENT _SIOWR('P', 10, int)
313#define SNDCTL_DSP_GETFMTS _SIOR('P', 11, int)
314#define SNDCTL_DSP_SETFMT _SIOWR('P', 5, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700315#define AFMT_QUERY 0x00000000
316#define AFMT_MU_LAW 0x00000001
Ben Cheng655a7c02013-10-16 16:09:24 -0700317#define AFMT_A_LAW 0x00000002
318#define AFMT_IMA_ADPCM 0x00000004
319#define AFMT_U8 0x00000008
320#define AFMT_S16_LE 0x00000010
Ben Cheng655a7c02013-10-16 16:09:24 -0700321#define AFMT_S16_BE 0x00000020
322#define AFMT_S8 0x00000040
323#define AFMT_U16_LE 0x00000080
324#define AFMT_U16_BE 0x00000100
Ben Cheng655a7c02013-10-16 16:09:24 -0700325#define AFMT_MPEG 0x00000200
326#define AFMT_AC3 0x00000400
327typedef struct audio_buf_info {
Tao Baod7db5942015-01-28 10:07:51 -0800328 int fragments;
329 int fragstotal;
330 int fragsize;
Tao Baod7db5942015-01-28 10:07:51 -0800331 int bytes;
332} audio_buf_info;
333#define SNDCTL_DSP_GETOSPACE _SIOR('P', 12, audio_buf_info)
334#define SNDCTL_DSP_GETISPACE _SIOR('P', 13, audio_buf_info)
Tao Baod7db5942015-01-28 10:07:51 -0800335#define SNDCTL_DSP_NONBLOCK _SIO('P', 14)
336#define SNDCTL_DSP_GETCAPS _SIOR('P', 15, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700337#define DSP_CAP_REVISION 0x000000ff
338#define DSP_CAP_DUPLEX 0x00000100
339#define DSP_CAP_REALTIME 0x00000200
340#define DSP_CAP_BATCH 0x00000400
Ben Cheng655a7c02013-10-16 16:09:24 -0700341#define DSP_CAP_COPROC 0x00000800
342#define DSP_CAP_TRIGGER 0x00001000
343#define DSP_CAP_MMAP 0x00002000
344#define DSP_CAP_MULTI 0x00004000
Ben Cheng655a7c02013-10-16 16:09:24 -0700345#define DSP_CAP_BIND 0x00008000
Tao Baod7db5942015-01-28 10:07:51 -0800346#define SNDCTL_DSP_GETTRIGGER _SIOR('P', 16, int)
Tao Baod7db5942015-01-28 10:07:51 -0800347#define SNDCTL_DSP_SETTRIGGER _SIOW('P', 16, int)
348#define PCM_ENABLE_INPUT 0x00000001
Ben Cheng655a7c02013-10-16 16:09:24 -0700349#define PCM_ENABLE_OUTPUT 0x00000002
350typedef struct count_info {
Tao Baod7db5942015-01-28 10:07:51 -0800351 int bytes;
352 int blocks;
353 int ptr;
354} count_info;
Tao Baod7db5942015-01-28 10:07:51 -0800355#define SNDCTL_DSP_GETIPTR _SIOR('P', 17, count_info)
356#define SNDCTL_DSP_GETOPTR _SIOR('P', 18, count_info)
Ben Cheng655a7c02013-10-16 16:09:24 -0700357typedef struct buffmem_desc {
Tao Baod7db5942015-01-28 10:07:51 -0800358 unsigned * buffer;
Tao Baod7db5942015-01-28 10:07:51 -0800359 int size;
360} buffmem_desc;
361#define SNDCTL_DSP_MAPINBUF _SIOR('P', 19, buffmem_desc)
362#define SNDCTL_DSP_MAPOUTBUF _SIOR('P', 20, buffmem_desc)
Tao Baod7db5942015-01-28 10:07:51 -0800363#define SNDCTL_DSP_SETSYNCRO _SIO('P', 21)
364#define SNDCTL_DSP_SETDUPLEX _SIO('P', 22)
365#define SNDCTL_DSP_GETODELAY _SIOR('P', 23, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700366#define SNDCTL_DSP_GETCHANNELMASK _SIOWR('P', 64, int)
367#define SNDCTL_DSP_BIND_CHANNEL _SIOWR('P', 65, int)
368#define DSP_BIND_QUERY 0x00000000
Ben Cheng655a7c02013-10-16 16:09:24 -0700369#define DSP_BIND_FRONT 0x00000001
370#define DSP_BIND_SURR 0x00000002
371#define DSP_BIND_CENTER_LFE 0x00000004
372#define DSP_BIND_HANDSET 0x00000008
Ben Cheng655a7c02013-10-16 16:09:24 -0700373#define DSP_BIND_MIC 0x00000010
374#define DSP_BIND_MODEM1 0x00000020
375#define DSP_BIND_MODEM2 0x00000040
376#define DSP_BIND_I2S 0x00000080
Ben Cheng655a7c02013-10-16 16:09:24 -0700377#define DSP_BIND_SPDIF 0x00000100
Tao Baod7db5942015-01-28 10:07:51 -0800378#define SNDCTL_DSP_SETSPDIF _SIOW('P', 66, int)
Tao Baod7db5942015-01-28 10:07:51 -0800379#define SNDCTL_DSP_GETSPDIF _SIOR('P', 67, int)
380#define SPDIF_PRO 0x0001
Ben Cheng655a7c02013-10-16 16:09:24 -0700381#define SPDIF_N_AUD 0x0002
382#define SPDIF_COPY 0x0004
383#define SPDIF_PRE 0x0008
384#define SPDIF_CC 0x07f0
Ben Cheng655a7c02013-10-16 16:09:24 -0700385#define SPDIF_L 0x0800
386#define SPDIF_DRS 0x4000
Tao Baod7db5942015-01-28 10:07:51 -0800387#define SPDIF_V 0x8000
388#define SNDCTL_DSP_PROFILE _SIOW('P', 23, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700389#define APF_NORMAL 0
390#define APF_NETWORK 1
391#define APF_CPUINTENS 2
Tao Baod7db5942015-01-28 10:07:51 -0800392#define SOUND_PCM_READ_RATE _SIOR('P', 2, int)
393#define SOUND_PCM_READ_CHANNELS _SIOR('P', 6, int)
394#define SOUND_PCM_READ_BITS _SIOR('P', 5, int)
Tao Baod7db5942015-01-28 10:07:51 -0800395#define SOUND_PCM_READ_FILTER _SIOR('P', 7, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700396#define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SETFMT
Ben Cheng655a7c02013-10-16 16:09:24 -0700397#define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED
398#define SOUND_PCM_POST SNDCTL_DSP_POST
399#define SOUND_PCM_RESET SNDCTL_DSP_RESET
400#define SOUND_PCM_SYNC SNDCTL_DSP_SYNC
Ben Cheng655a7c02013-10-16 16:09:24 -0700401#define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE
402#define SOUND_PCM_SETFRAGMENT SNDCTL_DSP_SETFRAGMENT
403#define SOUND_PCM_GETFMTS SNDCTL_DSP_GETFMTS
404#define SOUND_PCM_SETFMT SNDCTL_DSP_SETFMT
Ben Cheng655a7c02013-10-16 16:09:24 -0700405#define SOUND_PCM_GETOSPACE SNDCTL_DSP_GETOSPACE
406#define SOUND_PCM_GETISPACE SNDCTL_DSP_GETISPACE
407#define SOUND_PCM_NONBLOCK SNDCTL_DSP_NONBLOCK
408#define SOUND_PCM_GETCAPS SNDCTL_DSP_GETCAPS
Ben Cheng655a7c02013-10-16 16:09:24 -0700409#define SOUND_PCM_GETTRIGGER SNDCTL_DSP_GETTRIGGER
410#define SOUND_PCM_SETTRIGGER SNDCTL_DSP_SETTRIGGER
411#define SOUND_PCM_SETSYNCRO SNDCTL_DSP_SETSYNCRO
412#define SOUND_PCM_GETIPTR SNDCTL_DSP_GETIPTR
Ben Cheng655a7c02013-10-16 16:09:24 -0700413#define SOUND_PCM_GETOPTR SNDCTL_DSP_GETOPTR
414#define SOUND_PCM_MAPINBUF SNDCTL_DSP_MAPINBUF
415#define SOUND_PCM_MAPOUTBUF SNDCTL_DSP_MAPOUTBUF
416typedef struct copr_buffer {
Tao Baod7db5942015-01-28 10:07:51 -0800417 int command;
418 int flags;
Ben Cheng655a7c02013-10-16 16:09:24 -0700419#define CPF_NONE 0x0000
420#define CPF_FIRST 0x0001
Ben Cheng655a7c02013-10-16 16:09:24 -0700421#define CPF_LAST 0x0002
Tao Baod7db5942015-01-28 10:07:51 -0800422 int len;
Tao Baod7db5942015-01-28 10:07:51 -0800423 int offs;
424 unsigned char data[4000];
425} copr_buffer;
Ben Cheng655a7c02013-10-16 16:09:24 -0700426typedef struct copr_debug_buf {
Tao Baod7db5942015-01-28 10:07:51 -0800427 int command;
428 int parm1;
429 int parm2;
430 int flags;
Tao Baod7db5942015-01-28 10:07:51 -0800431 int len;
432} copr_debug_buf;
Ben Cheng655a7c02013-10-16 16:09:24 -0700433typedef struct copr_msg {
Tao Baod7db5942015-01-28 10:07:51 -0800434 int len;
Tao Baod7db5942015-01-28 10:07:51 -0800435 unsigned char data[4000];
436} copr_msg;
437#define SNDCTL_COPR_RESET _SIO('C', 0)
Ben Cheng655a7c02013-10-16 16:09:24 -0700438#define SNDCTL_COPR_LOAD _SIOWR('C', 1, copr_buffer)
439#define SNDCTL_COPR_RDATA _SIOWR('C', 2, copr_debug_buf)
440#define SNDCTL_COPR_RCODE _SIOWR('C', 3, copr_debug_buf)
Tao Baod7db5942015-01-28 10:07:51 -0800441#define SNDCTL_COPR_WDATA _SIOW('C', 4, copr_debug_buf)
442#define SNDCTL_COPR_WCODE _SIOW('C', 5, copr_debug_buf)
Ben Cheng655a7c02013-10-16 16:09:24 -0700443#define SNDCTL_COPR_RUN _SIOWR('C', 6, copr_debug_buf)
444#define SNDCTL_COPR_HALT _SIOWR('C', 7, copr_debug_buf)
Ben Cheng655a7c02013-10-16 16:09:24 -0700445#define SNDCTL_COPR_SENDMSG _SIOWR('C', 8, copr_msg)
Tao Baod7db5942015-01-28 10:07:51 -0800446#define SNDCTL_COPR_RCVMSG _SIOR('C', 9, copr_msg)
Ben Cheng655a7c02013-10-16 16:09:24 -0700447#define SOUND_MIXER_NRDEVICES 25
448#define SOUND_MIXER_VOLUME 0
Ben Cheng655a7c02013-10-16 16:09:24 -0700449#define SOUND_MIXER_BASS 1
450#define SOUND_MIXER_TREBLE 2
451#define SOUND_MIXER_SYNTH 3
452#define SOUND_MIXER_PCM 4
Ben Cheng655a7c02013-10-16 16:09:24 -0700453#define SOUND_MIXER_SPEAKER 5
454#define SOUND_MIXER_LINE 6
455#define SOUND_MIXER_MIC 7
456#define SOUND_MIXER_CD 8
Ben Cheng655a7c02013-10-16 16:09:24 -0700457#define SOUND_MIXER_IMIX 9
458#define SOUND_MIXER_ALTPCM 10
459#define SOUND_MIXER_RECLEV 11
460#define SOUND_MIXER_IGAIN 12
Ben Cheng655a7c02013-10-16 16:09:24 -0700461#define SOUND_MIXER_OGAIN 13
462#define SOUND_MIXER_LINE1 14
463#define SOUND_MIXER_LINE2 15
464#define SOUND_MIXER_LINE3 16
Ben Cheng655a7c02013-10-16 16:09:24 -0700465#define SOUND_MIXER_DIGITAL1 17
466#define SOUND_MIXER_DIGITAL2 18
467#define SOUND_MIXER_DIGITAL3 19
468#define SOUND_MIXER_PHONEIN 20
Ben Cheng655a7c02013-10-16 16:09:24 -0700469#define SOUND_MIXER_PHONEOUT 21
470#define SOUND_MIXER_VIDEO 22
471#define SOUND_MIXER_RADIO 23
472#define SOUND_MIXER_MONITOR 24
Ben Cheng655a7c02013-10-16 16:09:24 -0700473#define SOUND_ONOFF_MIN 28
474#define SOUND_ONOFF_MAX 30
475#define SOUND_MIXER_NONE 31
476#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE
Ben Cheng655a7c02013-10-16 16:09:24 -0700477#define SOUND_MIXER_MUTE SOUND_MIXER_NONE
478#define SOUND_MIXER_LOUD SOUND_MIXER_NONE
Tao Baod7db5942015-01-28 10:07:51 -0800479#define SOUND_DEVICE_LABELS { "Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor" }
480#define SOUND_DEVICE_NAMES { "vol", "bass", "treble", "synth", "pcm", "speaker", "line", "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", "line1", "line2", "line3", "dig1", "dig2", "dig3", "phin", "phout", "video", "radio", "monitor" }
Ben Cheng655a7c02013-10-16 16:09:24 -0700481#define SOUND_MIXER_RECSRC 0xff
482#define SOUND_MIXER_DEVMASK 0xfe
483#define SOUND_MIXER_RECMASK 0xfd
484#define SOUND_MIXER_CAPS 0xfc
Ben Cheng655a7c02013-10-16 16:09:24 -0700485#define SOUND_CAP_EXCL_INPUT 0x00000001
486#define SOUND_MIXER_STEREODEVS 0xfb
487#define SOUND_MIXER_OUTSRC 0xfa
488#define SOUND_MIXER_OUTMASK 0xf9
Ben Cheng655a7c02013-10-16 16:09:24 -0700489#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)
490#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)
491#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)
492#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)
Ben Cheng655a7c02013-10-16 16:09:24 -0700493#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)
494#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)
495#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)
496#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)
Ben Cheng655a7c02013-10-16 16:09:24 -0700497#define SOUND_MASK_CD (1 << SOUND_MIXER_CD)
498#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)
499#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)
500#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)
Ben Cheng655a7c02013-10-16 16:09:24 -0700501#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN)
502#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN)
503#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1)
504#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2)
Ben Cheng655a7c02013-10-16 16:09:24 -0700505#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3)
506#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1)
507#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2)
508#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3)
Ben Cheng655a7c02013-10-16 16:09:24 -0700509#define SOUND_MASK_PHONEIN (1 << SOUND_MIXER_PHONEIN)
510#define SOUND_MASK_PHONEOUT (1 << SOUND_MIXER_PHONEOUT)
511#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO)
512#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO)
Ben Cheng655a7c02013-10-16 16:09:24 -0700513#define SOUND_MASK_MONITOR (1 << SOUND_MIXER_MONITOR)
514#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)
515#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)
516#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)
Ben Cheng655a7c02013-10-16 16:09:24 -0700517#define MIXER_READ(dev) _SIOR('M', dev, int)
518#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)
519#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)
520#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)
Ben Cheng655a7c02013-10-16 16:09:24 -0700521#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)
522#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)
523#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)
524#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)
Ben Cheng655a7c02013-10-16 16:09:24 -0700525#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)
526#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)
527#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)
528#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)
Ben Cheng655a7c02013-10-16 16:09:24 -0700529#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)
530#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN)
531#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN)
532#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1)
Ben Cheng655a7c02013-10-16 16:09:24 -0700533#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2)
534#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3)
535#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE)
536#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE)
Ben Cheng655a7c02013-10-16 16:09:24 -0700537#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD)
538#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)
539#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)
540#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)
Ben Cheng655a7c02013-10-16 16:09:24 -0700541#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)
542#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)
543#define MIXER_WRITE(dev) _SIOWR('M', dev, int)
544#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)
Ben Cheng655a7c02013-10-16 16:09:24 -0700545#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)
546#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)
547#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)
548#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)
Ben Cheng655a7c02013-10-16 16:09:24 -0700549#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)
550#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)
551#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)
552#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)
Ben Cheng655a7c02013-10-16 16:09:24 -0700553#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)
554#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)
555#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)
556#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN)
Ben Cheng655a7c02013-10-16 16:09:24 -0700557#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN)
558#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1)
559#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2)
560#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3)
Ben Cheng655a7c02013-10-16 16:09:24 -0700561#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE)
562#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE)
563#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD)
564#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)
Tao Baod7db5942015-01-28 10:07:51 -0800565typedef struct mixer_info {
566 char id[16];
Tao Baod7db5942015-01-28 10:07:51 -0800567 char name[32];
568 int modify_counter;
569 int fillers[10];
Ben Cheng655a7c02013-10-16 16:09:24 -0700570} mixer_info;
Tao Baod7db5942015-01-28 10:07:51 -0800571typedef struct _old_mixer_info {
572 char id[16];
573 char name[32];
Ben Cheng655a7c02013-10-16 16:09:24 -0700574} _old_mixer_info;
Tao Baod7db5942015-01-28 10:07:51 -0800575#define SOUND_MIXER_INFO _SIOR('M', 101, mixer_info)
576#define SOUND_OLD_MIXER_INFO _SIOR('M', 101, _old_mixer_info)
Ben Cheng655a7c02013-10-16 16:09:24 -0700577typedef unsigned char mixer_record[128];
578#define SOUND_MIXER_ACCESS _SIOWR('M', 102, mixer_record)
Ben Cheng655a7c02013-10-16 16:09:24 -0700579#define SOUND_MIXER_AGC _SIOWR('M', 103, int)
580#define SOUND_MIXER_3DSE _SIOWR('M', 104, int)
581#define SOUND_MIXER_PRIVATE1 _SIOWR('M', 111, int)
582#define SOUND_MIXER_PRIVATE2 _SIOWR('M', 112, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700583#define SOUND_MIXER_PRIVATE3 _SIOWR('M', 113, int)
584#define SOUND_MIXER_PRIVATE4 _SIOWR('M', 114, int)
585#define SOUND_MIXER_PRIVATE5 _SIOWR('M', 115, int)
586typedef struct mixer_vol_table {
Tao Baod7db5942015-01-28 10:07:51 -0800587 int num;
588 char name[32];
589 int levels[32];
Ben Cheng655a7c02013-10-16 16:09:24 -0700590} mixer_vol_table;
Ben Cheng655a7c02013-10-16 16:09:24 -0700591#define SOUND_MIXER_GETLEVELS _SIOWR('M', 116, mixer_vol_table)
592#define SOUND_MIXER_SETLEVELS _SIOWR('M', 117, mixer_vol_table)
Tao Baod7db5942015-01-28 10:07:51 -0800593#define OSS_GETVERSION _SIOR('M', 118, int)
Ben Cheng655a7c02013-10-16 16:09:24 -0700594#define EV_SEQ_LOCAL 0x80
Ben Cheng655a7c02013-10-16 16:09:24 -0700595#define EV_TIMING 0x81
596#define EV_CHN_COMMON 0x92
597#define EV_CHN_VOICE 0x93
598#define EV_SYSEX 0x94
Ben Cheng655a7c02013-10-16 16:09:24 -0700599#define MIDI_NOTEOFF 0x80
600#define MIDI_NOTEON 0x90
601#define MIDI_KEY_PRESSURE 0xA0
602#define MIDI_CTL_CHANGE 0xB0
Ben Cheng655a7c02013-10-16 16:09:24 -0700603#define MIDI_PGM_CHANGE 0xC0
604#define MIDI_CHN_PRESSURE 0xD0
605#define MIDI_PITCH_BEND 0xE0
606#define MIDI_SYSTEM_PREFIX 0xF0
Ben Cheng655a7c02013-10-16 16:09:24 -0700607#define TMR_WAIT_REL 1
608#define TMR_WAIT_ABS 2
609#define TMR_STOP 3
610#define TMR_START 4
Ben Cheng655a7c02013-10-16 16:09:24 -0700611#define TMR_CONTINUE 5
612#define TMR_TEMPO 6
613#define TMR_ECHO 8
614#define TMR_CLOCK 9
Ben Cheng655a7c02013-10-16 16:09:24 -0700615#define TMR_SPP 10
616#define TMR_TIMESIG 11
617#define LOCL_STARTAUDIO 1
618#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF()
Ben Cheng655a7c02013-10-16 16:09:24 -0700619#define SEQ_PM_DEFINES int __foo_bar___
Tao Baod7db5942015-01-28 10:07:51 -0800620#define SEQ_LOAD_GMINSTR(dev,instr)
621#define SEQ_LOAD_GMDRUM(dev,drum)
Ben Cheng655a7c02013-10-16 16:09:24 -0700622#define _SEQ_EXTERN extern
Tao Baod7db5942015-01-28 10:07:51 -0800623#define SEQ_USE_EXTBUF() _SEQ_EXTERN unsigned char _seqbuf[]; _SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr
Ben Cheng655a7c02013-10-16 16:09:24 -0700624#ifndef USE_SIMPLE_MACROS
Tao Baod7db5942015-01-28 10:07:51 -0800625#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len; int _seqbufptr = 0
626#define _SEQ_NEEDBUF(len) if((_seqbufptr + (len)) > _seqbuflen) seqbuf_dump()
Ben Cheng655a7c02013-10-16 16:09:24 -0700627#define _SEQ_ADVBUF(len) _seqbufptr += len
628#define SEQ_DUMPBUF seqbuf_dump
629#else
630#define _SEQ_NEEDBUF(len)
Ben Cheng655a7c02013-10-16 16:09:24 -0700631#endif
Tao Baod7db5942015-01-28 10:07:51 -0800632#define SEQ_VOLUME_MODE(dev,mode) { _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr] = SEQ_EXTENDED; _seqbuf[_seqbufptr + 1] = SEQ_VOLMODE; _seqbuf[_seqbufptr + 2] = (dev); _seqbuf[_seqbufptr + 3] = (mode); _seqbuf[_seqbufptr + 4] = 0; _seqbuf[_seqbufptr + 5] = 0; _seqbuf[_seqbufptr + 6] = 0; _seqbuf[_seqbufptr + 7] = 0; _SEQ_ADVBUF(8); }
633#define _CHN_VOICE(dev,event,chn,note,parm) { _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr] = EV_CHN_VOICE; _seqbuf[_seqbufptr + 1] = (dev); _seqbuf[_seqbufptr + 2] = (event); _seqbuf[_seqbufptr + 3] = (chn); _seqbuf[_seqbufptr + 4] = (note); _seqbuf[_seqbufptr + 5] = (parm); _seqbuf[_seqbufptr + 6] = (0); _seqbuf[_seqbufptr + 7] = 0; _SEQ_ADVBUF(8); }
634#define SEQ_START_NOTE(dev,chn,note,vol) _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)
Tao Baod7db5942015-01-28 10:07:51 -0800635#define SEQ_STOP_NOTE(dev,chn,note,vol) _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)
636#define SEQ_KEY_PRESSURE(dev,chn,note,pressure) _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)
637#define _CHN_COMMON(dev,event,chn,p1,p2,w14) { _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr] = EV_CHN_COMMON; _seqbuf[_seqbufptr + 1] = (dev); _seqbuf[_seqbufptr + 2] = (event); _seqbuf[_seqbufptr + 3] = (chn); _seqbuf[_seqbufptr + 4] = (p1); _seqbuf[_seqbufptr + 5] = (p2); * (short *) & _seqbuf[_seqbufptr + 6] = (w14); _SEQ_ADVBUF(8); }
638#define SEQ_SYSEX(dev,buf,len) { int ii, ll = (len); unsigned char * bufp = buf; if(ll > 6) ll = 6; _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr] = EV_SYSEX; _seqbuf[_seqbufptr + 1] = (dev); for(ii = 0; ii < ll; ii ++) _seqbuf[_seqbufptr + ii + 2] = bufp[ii]; for(ii = ll; ii < 6; ii ++) _seqbuf[_seqbufptr + ii + 2] = 0xff; _SEQ_ADVBUF(8); }
Tao Baod7db5942015-01-28 10:07:51 -0800639#define SEQ_CHN_PRESSURE(dev,chn,pressure) _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
Ben Cheng655a7c02013-10-16 16:09:24 -0700640#define SEQ_SET_PATCH SEQ_PGM_CHANGE
Tao Baod7db5942015-01-28 10:07:51 -0800641#define SEQ_PGM_CHANGE(dev,chn,patch) _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
642#define SEQ_CONTROL(dev,chn,controller,value) _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
Tao Baod7db5942015-01-28 10:07:51 -0800643#define SEQ_BENDER(dev,chn,value) _CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)
644#define SEQ_V2_X_CONTROL(dev,voice,controller,value) { _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr] = SEQ_EXTENDED; _seqbuf[_seqbufptr + 1] = SEQ_CONTROLLER; _seqbuf[_seqbufptr + 2] = (dev); _seqbuf[_seqbufptr + 3] = (voice); _seqbuf[_seqbufptr + 4] = (controller); _seqbuf[_seqbufptr + 5] = ((value) & 0xff); _seqbuf[_seqbufptr + 6] = ((value >> 8) & 0xff); _seqbuf[_seqbufptr + 7] = 0; _SEQ_ADVBUF(8); }
645#define SEQ_PITCHBEND(dev,voice,value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)
646#define SEQ_BENDER_RANGE(dev,voice,value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
Tao Baod7db5942015-01-28 10:07:51 -0800647#define SEQ_EXPRESSION(dev,voice,value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value * 128)
648#define SEQ_MAIN_VOLUME(dev,voice,value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value * 16383) / 100)
649#define SEQ_PANNING(dev,voice,pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos + 128) / 2)
650#define _TIMER_EVENT(ev,parm) { _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr + 0] = EV_TIMING; _seqbuf[_seqbufptr + 1] = (ev); _seqbuf[_seqbufptr + 2] = 0; _seqbuf[_seqbufptr + 3] = 0; * (unsigned int *) & _seqbuf[_seqbufptr + 4] = (parm); _SEQ_ADVBUF(8); }
Ben Cheng655a7c02013-10-16 16:09:24 -0700651#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0)
652#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0)
653#define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0)
654#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks)
Ben Cheng655a7c02013-10-16 16:09:24 -0700655#define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks)
656#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key)
657#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value)
658#define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos)
Ben Cheng655a7c02013-10-16 16:09:24 -0700659#define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig)
Tao Baod7db5942015-01-28 10:07:51 -0800660#define _LOCAL_EVENT(ev,parm) { _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr + 0] = EV_SEQ_LOCAL; _seqbuf[_seqbufptr + 1] = (ev); _seqbuf[_seqbufptr + 2] = 0; _seqbuf[_seqbufptr + 3] = 0; * (unsigned int *) & _seqbuf[_seqbufptr + 4] = (parm); _SEQ_ADVBUF(8); }
Ben Cheng655a7c02013-10-16 16:09:24 -0700661#define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask)
Tao Baod7db5942015-01-28 10:07:51 -0800662#define SEQ_MIDIOUT(device,byte) { _SEQ_NEEDBUF(4); _seqbuf[_seqbufptr] = SEQ_MIDIPUTC; _seqbuf[_seqbufptr + 1] = (byte); _seqbuf[_seqbufptr + 2] = (device); _seqbuf[_seqbufptr + 3] = 0; _SEQ_ADVBUF(4); }
Tao Baod7db5942015-01-28 10:07:51 -0800663#define SEQ_WRPATCH(patchx,len) { if(_seqbufptr) SEQ_DUMPBUF(); if(write(seqfd, (char *) (patchx), len) == - 1) perror("Write patch: /dev/sequencer"); }
664#define SEQ_WRPATCH2(patchx,len) (SEQ_DUMPBUF(), write(seqfd, (char *) (patchx), len))
Ben Cheng655a7c02013-10-16 16:09:24 -0700665#endif