1283 lines · c
1/*2 * Copyright by Hannu Savolainen 1993-19973 *4 * Redistribution and use in source and binary forms, with or without5 * modification, are permitted provided that the following conditions are6 * met: 1. Redistributions of source code must retain the above copyright7 * notice, this list of conditions and the following disclaimer. 2.8 * Redistributions in binary form must reproduce the above copyright notice,9 * this list of conditions and the following disclaimer in the documentation10 * and/or other materials provided with the distribution.11 *12 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY13 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED14 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE15 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR16 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL17 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR18 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER19 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT20 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY21 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF22 * SUCH DAMAGE.23 */24#ifndef _UAPISOUNDCARD_H25#define _UAPISOUNDCARD_H26 27 28/*29 * OSS interface version. With versions earlier than 3.6 this value is30 * an integer with value less than 361. In versions 3.6 and later31 * it's a six digit hexadecimal value. For example value32 * of 0x030600 represents OSS version 3.6.0.33 * Use ioctl(fd, OSS_GETVERSION, &int) to get the version number of34 * the currently active driver.35 */36#define SOUND_VERSION 0x03080237#define OPEN_SOUND_SYSTEM38 39/* In Linux we need to be prepared for cross compiling */40#include <linux/ioctl.h>41 42/* Endian macros. */43#ifndef __KERNEL__44# include <endian.h>45#endif46 47/*48 * Supported card ID numbers (Should be somewhere else?)49 */50 51#define SNDCARD_ADLIB 152#define SNDCARD_SB 253#define SNDCARD_PAS 354#define SNDCARD_GUS 455#define SNDCARD_MPU401 556#define SNDCARD_SB16 657#define SNDCARD_SB16MIDI 758#define SNDCARD_UART6850 859#define SNDCARD_GUS16 960#define SNDCARD_MSS 1061#define SNDCARD_PSS 1162#define SNDCARD_SSCAPE 1263#define SNDCARD_PSS_MPU 1364#define SNDCARD_PSS_MSS 1465#define SNDCARD_SSCAPE_MSS 1566#define SNDCARD_TRXPRO 1667#define SNDCARD_TRXPRO_SB 1768#define SNDCARD_TRXPRO_MPU 1869#define SNDCARD_MAD16 1970#define SNDCARD_MAD16_MPU 2071#define SNDCARD_CS4232 2172#define SNDCARD_CS4232_MPU 2273#define SNDCARD_MAUI 2374#define SNDCARD_PSEUDO_MSS 2475#define SNDCARD_GUSPNP 2576#define SNDCARD_UART401 2677/* Sound card numbers 27 to N are reserved. Don't add more numbers here. */78 79/***********************************80 * IOCTL Commands for /dev/sequencer81 */82 83#ifndef _SIOWR84#if defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__)))85/* Use already defined ioctl defines if they exist (except with Sun or Sparc) */86#define SIOCPARM_MASK IOCPARM_MASK87#define SIOC_VOID IOC_VOID88#define SIOC_OUT IOC_OUT89#define SIOC_IN IOC_IN90#define SIOC_INOUT IOC_INOUT91#define _SIOC_SIZE _IOC_SIZE92#define _SIOC_DIR _IOC_DIR93#define _SIOC_NONE _IOC_NONE94#define _SIOC_READ _IOC_READ95#define _SIOC_WRITE _IOC_WRITE96#define _SIO _IO97#define _SIOR _IOR98#define _SIOW _IOW99#define _SIOWR _IOWR100#else101 102/* Ioctl's have the command encoded in the lower word,103 * and the size of any in or out parameters in the upper104 * word. The high 2 bits of the upper word are used105 * to encode the in/out status of the parameter; for now106 * we restrict parameters to at most 8191 bytes.107 */108/* #define SIOCTYPE (0xff<<8) */109#define SIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */110#define SIOC_VOID 0x00000000 /* no parameters */111#define SIOC_OUT 0x20000000 /* copy out parameters */112#define SIOC_IN 0x40000000 /* copy in parameters */113#define SIOC_INOUT (SIOC_IN|SIOC_OUT)114/* the 0x20000000 is so we can distinguish new ioctl's from old */115#define _SIO(x,y) ((int)(SIOC_VOID|(x<<8)|y))116#define _SIOR(x,y,t) ((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))117#define _SIOW(x,y,t) ((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))118/* this should be _SIORW, but stdio got there first */119#define _SIOWR(x,y,t) ((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y))120#define _SIOC_SIZE(x) ((x>>16)&SIOCPARM_MASK) 121#define _SIOC_DIR(x) (x & 0xf0000000)122#define _SIOC_NONE SIOC_VOID123#define _SIOC_READ SIOC_OUT124#define _SIOC_WRITE SIOC_IN125# endif /* _IOWR */126#endif /* !_SIOWR */127 128#define SNDCTL_SEQ_RESET _SIO ('Q', 0)129#define SNDCTL_SEQ_SYNC _SIO ('Q', 1)130#define SNDCTL_SYNTH_INFO _SIOWR('Q', 2, struct synth_info)131#define SNDCTL_SEQ_CTRLRATE _SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */132#define SNDCTL_SEQ_GETOUTCOUNT _SIOR ('Q', 4, int)133#define SNDCTL_SEQ_GETINCOUNT _SIOR ('Q', 5, int)134#define SNDCTL_SEQ_PERCMODE _SIOW ('Q', 6, int)135#define SNDCTL_FM_LOAD_INSTR _SIOW ('Q', 7, struct sbi_instrument) /* Obsolete. Don't use!!!!!! */136#define SNDCTL_SEQ_TESTMIDI _SIOW ('Q', 8, int)137#define SNDCTL_SEQ_RESETSAMPLES _SIOW ('Q', 9, int)138#define SNDCTL_SEQ_NRSYNTHS _SIOR ('Q',10, int)139#define SNDCTL_SEQ_NRMIDIS _SIOR ('Q',11, int)140#define SNDCTL_MIDI_INFO _SIOWR('Q',12, struct midi_info)141#define SNDCTL_SEQ_THRESHOLD _SIOW ('Q',13, int)142#define SNDCTL_SYNTH_MEMAVL _SIOWR('Q',14, int) /* in=dev#, out=memsize */143#define SNDCTL_FM_4OP_ENABLE _SIOW ('Q',15, int) /* in=dev# */144#define SNDCTL_SEQ_PANIC _SIO ('Q',17)145#define SNDCTL_SEQ_OUTOFBAND _SIOW ('Q',18, struct seq_event_rec)146#define SNDCTL_SEQ_GETTIME _SIOR ('Q',19, int)147#define SNDCTL_SYNTH_ID _SIOWR('Q',20, struct synth_info)148#define SNDCTL_SYNTH_CONTROL _SIOWR('Q',21, struct synth_control)149#define SNDCTL_SYNTH_REMOVESAMPLE _SIOWR('Q',22, struct remove_sample)150 151typedef struct synth_control152{153 int devno; /* Synthesizer # */154 char data[4000]; /* Device spesific command/data record */155}synth_control;156 157typedef struct remove_sample158{159 int devno; /* Synthesizer # */160 int bankno; /* MIDI bank # (0=General MIDI) */161 int instrno; /* MIDI instrument number */162} remove_sample;163 164typedef struct seq_event_rec {165 unsigned char arr[8];166} seq_event_rec;167 168#define SNDCTL_TMR_TIMEBASE _SIOWR('T', 1, int)169#define SNDCTL_TMR_START _SIO ('T', 2)170#define SNDCTL_TMR_STOP _SIO ('T', 3)171#define SNDCTL_TMR_CONTINUE _SIO ('T', 4)172#define SNDCTL_TMR_TEMPO _SIOWR('T', 5, int)173#define SNDCTL_TMR_SOURCE _SIOWR('T', 6, int)174# define TMR_INTERNAL 0x00000001175# define TMR_EXTERNAL 0x00000002176# define TMR_MODE_MIDI 0x00000010177# define TMR_MODE_FSK 0x00000020178# define TMR_MODE_CLS 0x00000040179# define TMR_MODE_SMPTE 0x00000080180#define SNDCTL_TMR_METRONOME _SIOW ('T', 7, int)181#define SNDCTL_TMR_SELECT _SIOW ('T', 8, int)182 183/*184 * Some big endian/little endian handling macros185 */186 187#define _LINUX_PATCHKEY_H_INDIRECT188#include <linux/patchkey.h>189#undef _LINUX_PATCHKEY_H_INDIRECT190 191#if !defined(__KERNEL__)192# if defined(__BYTE_ORDER)193# if __BYTE_ORDER == __BIG_ENDIAN194# define AFMT_S16_NE AFMT_S16_BE195# elif __BYTE_ORDER == __LITTLE_ENDIAN196# define AFMT_S16_NE AFMT_S16_LE197# else198# error "could not determine byte order"199# endif200# endif201#endif202 203/*204 * Sample loading mechanism for internal synthesizers (/dev/sequencer)205 * The following patch_info structure has been designed to support206 * Gravis UltraSound. It tries to be universal format for uploading207 * sample based patches but is probably too limited.208 *209 * (PBD) As Hannu guessed, the GUS structure is too limited for 210 * the WaveFront, but this is the right place for a constant definition.211 */212 213struct patch_info {214 unsigned short key; /* Use WAVE_PATCH here */215#define WAVE_PATCH _PATCHKEY(0x04)216#define GUS_PATCH WAVE_PATCH217#define WAVEFRONT_PATCH _PATCHKEY(0x06)218 219 short device_no; /* Synthesizer number */220 short instr_no; /* Midi pgm# */221 222 unsigned int mode;223/*224 * The least significant byte has the same format than the GUS .PAT225 * files226 */227#define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */228#define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */229#define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */230#define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */231#define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */232#define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3)*/233#define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */234#define WAVE_FAST_RELEASE 0x80 /* bit 7 = Shut off immediately after note off */235 /* (use the env_rate/env_offs fields). */236/* Linux specific bits */237#define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */238#define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */239#define WAVE_SCALE 0x00040000 /* The scaling info is valid */240#define WAVE_FRACTIONS 0x00080000 /* Fraction information is valid */241/* Reserved bits */242#define WAVE_ROM 0x40000000 /* For future use */243#define WAVE_MULAW 0x20000000 /* For future use */244/* Other bits must be zeroed */245 246 int len; /* Size of the wave data in bytes */247 int loop_start, loop_end; /* Byte offsets from the beginning */248 249/* 250 * The base_freq and base_note fields are used when computing the251 * playback speed for a note. The base_note defines the tone frequency252 * which is heard if the sample is played using the base_freq as the253 * playback speed.254 *255 * The low_note and high_note fields define the minimum and maximum note256 * frequencies for which this sample is valid. It is possible to define257 * more than one samples for an instrument number at the same time. The258 * low_note and high_note fields are used to select the most suitable one.259 *260 * The fields base_note, high_note and low_note should contain261 * the note frequency multiplied by 1000. For example value for the262 * middle A is 440*1000.263 */264 265 unsigned int base_freq;266 unsigned int base_note;267 unsigned int high_note;268 unsigned int low_note;269 int panning; /* -128=left, 127=right */270 int detuning;271 272/* New fields introduced in version 1.99.5 */273 274 /* Envelope. Enabled by mode bit WAVE_ENVELOPES */275 unsigned char env_rate[ 6 ]; /* GUS HW ramping rate */276 unsigned char env_offset[ 6 ]; /* 255 == 100% */277 278 /* 279 * The tremolo, vibrato and scale info are not supported yet.280 * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or281 * WAVE_SCALE282 */283 284 unsigned char tremolo_sweep;285 unsigned char tremolo_rate;286 unsigned char tremolo_depth;287 288 unsigned char vibrato_sweep;289 unsigned char vibrato_rate;290 unsigned char vibrato_depth;291 292 int scale_frequency;293 unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */294 295 int volume;296 int fractions;297 int reserved1;298 int spare[2];299 char data[1]; /* The waveform data starts here */300 };301 302struct sysex_info {303 short key; /* Use SYSEX_PATCH or MAUI_PATCH here */304#define SYSEX_PATCH _PATCHKEY(0x05)305#define MAUI_PATCH _PATCHKEY(0x06)306 short device_no; /* Synthesizer number */307 int len; /* Size of the sysex data in bytes */308 unsigned char data[1]; /* Sysex data starts here */309 };310 311/*312 * /dev/sequencer input events.313 *314 * The data written to the /dev/sequencer is a stream of events. Events315 * are records of 4 or 8 bytes. The first byte defines the size. 316 * Any number of events can be written with a write call. There317 * is a set of macros for sending these events. Use these macros if you318 * want to maximize portability of your program.319 *320 * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events.321 * (All input events are currently 4 bytes long. Be prepared to support322 * 8 byte events also. If you receive any event having first byte >= 128,323 * it's a 8 byte event.324 *325 * The events are documented at the end of this file.326 *327 * Normal events (4 bytes)328 * There is also a 8 byte version of most of the 4 byte events. The329 * 8 byte one is recommended.330 */331#define SEQ_NOTEOFF 0332#define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */333#define SEQ_NOTEON 1334#define SEQ_FMNOTEON SEQ_NOTEON335#define SEQ_WAIT TMR_WAIT_ABS336#define SEQ_PGMCHANGE 3337#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE338#define SEQ_SYNCTIMER TMR_START339#define SEQ_MIDIPUTC 5340#define SEQ_DRUMON 6 /*** OBSOLETE ***/341#define SEQ_DRUMOFF 7 /*** OBSOLETE ***/342#define SEQ_ECHO TMR_ECHO /* For synching programs with output */343#define SEQ_AFTERTOUCH 9344#define SEQ_CONTROLLER 10345 346/*******************************************347 * Midi controller numbers348 *******************************************349 * Controllers 0 to 31 (0x00 to 0x1f) and350 * 32 to 63 (0x20 to 0x3f) are continuous351 * controllers.352 * In the MIDI 1.0 these controllers are sent using353 * two messages. Controller numbers 0 to 31 are used354 * to send the MSB and the controller numbers 32 to 63355 * are for the LSB. Note that just 7 bits are used in MIDI bytes.356 */357 358#define CTL_BANK_SELECT 0x00359#define CTL_MODWHEEL 0x01360#define CTL_BREATH 0x02361/* undefined 0x03 */362#define CTL_FOOT 0x04363#define CTL_PORTAMENTO_TIME 0x05364#define CTL_DATA_ENTRY 0x06365#define CTL_MAIN_VOLUME 0x07366#define CTL_BALANCE 0x08367/* undefined 0x09 */368#define CTL_PAN 0x0a369#define CTL_EXPRESSION 0x0b370/* undefined 0x0c */371/* undefined 0x0d */372/* undefined 0x0e */373/* undefined 0x0f */374#define CTL_GENERAL_PURPOSE1 0x10375#define CTL_GENERAL_PURPOSE2 0x11376#define CTL_GENERAL_PURPOSE3 0x12377#define CTL_GENERAL_PURPOSE4 0x13378/* undefined 0x14 - 0x1f */379 380/* undefined 0x20 */381/* The controller numbers 0x21 to 0x3f are reserved for the */382/* least significant bytes of the controllers 0x00 to 0x1f. */383/* These controllers are not recognised by the driver. */384 385/* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */386/* 0=OFF and 127=ON (intermediate values are possible) */387#define CTL_DAMPER_PEDAL 0x40388#define CTL_SUSTAIN 0x40 /* Alias */389#define CTL_HOLD 0x40 /* Alias */390#define CTL_PORTAMENTO 0x41391#define CTL_SOSTENUTO 0x42392#define CTL_SOFT_PEDAL 0x43393/* undefined 0x44 */394#define CTL_HOLD2 0x45395/* undefined 0x46 - 0x4f */396 397#define CTL_GENERAL_PURPOSE5 0x50398#define CTL_GENERAL_PURPOSE6 0x51399#define CTL_GENERAL_PURPOSE7 0x52400#define CTL_GENERAL_PURPOSE8 0x53401/* undefined 0x54 - 0x5a */402#define CTL_EXT_EFF_DEPTH 0x5b403#define CTL_TREMOLO_DEPTH 0x5c404#define CTL_CHORUS_DEPTH 0x5d405#define CTL_DETUNE_DEPTH 0x5e406#define CTL_CELESTE_DEPTH 0x5e /* Alias for the above one */407#define CTL_PHASER_DEPTH 0x5f408#define CTL_DATA_INCREMENT 0x60409#define CTL_DATA_DECREMENT 0x61410#define CTL_NONREG_PARM_NUM_LSB 0x62411#define CTL_NONREG_PARM_NUM_MSB 0x63412#define CTL_REGIST_PARM_NUM_LSB 0x64413#define CTL_REGIST_PARM_NUM_MSB 0x65414/* undefined 0x66 - 0x78 */415/* reserved 0x79 - 0x7f */416 417/* Pseudo controllers (not midi compatible) */418#define CTRL_PITCH_BENDER 255419#define CTRL_PITCH_BENDER_RANGE 254420#define CTRL_EXPRESSION 253 /* Obsolete */421#define CTRL_MAIN_VOLUME 252 /* Obsolete */422#define SEQ_BALANCE 11423#define SEQ_VOLMODE 12424 425/*426 * Volume mode decides how volumes are used427 */428 429#define VOL_METHOD_ADAGIO 1430#define VOL_METHOD_LINEAR 2431 432/*433 * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as434 * input events.435 */436 437/*438 * Event codes 0xf0 to 0xfc are reserved for future extensions.439 */440 441#define SEQ_FULLSIZE 0xfd /* Long events */442/*443 * SEQ_FULLSIZE events are used for loading patches/samples to the444 * synthesizer devices. These events are passed directly to the driver445 * of the associated synthesizer device. There is no limit to the size446 * of the extended events. These events are not queued but executed447 * immediately when the write() is called (execution can take several448 * seconds of time). 449 *450 * When a SEQ_FULLSIZE message is written to the device, it must451 * be written using exactly one write() call. Other events cannot452 * be mixed to the same write.453 * 454 * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the 455 * /dev/sequencer. Don't write other data together with the instrument structure456 * Set the key field of the structure to FM_PATCH. The device field is used to457 * route the patch to the corresponding device.458 *459 * For wave table use struct patch_info. Initialize the key field460 * to WAVE_PATCH.461 */462#define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */463#define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */464 465/*466 * Record for FM patches467 */468 469typedef unsigned char sbi_instr_data[32];470 471struct sbi_instrument {472 unsigned short key; /* FM_PATCH or OPL3_PATCH */473#define FM_PATCH _PATCHKEY(0x01)474#define OPL3_PATCH _PATCHKEY(0x03)475 short device; /* Synth# (0-4) */476 int channel; /* Program# to be initialized */477 sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */478 };479 480struct synth_info { /* Read only */481 char name[30];482 int device; /* 0-N. INITIALIZE BEFORE CALLING */483 int synth_type;484#define SYNTH_TYPE_FM 0485#define SYNTH_TYPE_SAMPLE 1486#define SYNTH_TYPE_MIDI 2 /* Midi interface */487 488 int synth_subtype;489#define FM_TYPE_ADLIB 0x00490#define FM_TYPE_OPL3 0x01491#define MIDI_TYPE_MPU401 0x401492 493#define SAMPLE_TYPE_BASIC 0x10494#define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC495#define SAMPLE_TYPE_WAVEFRONT 0x11496 497 int perc_mode; /* No longer supported */498 int nr_voices;499 int nr_drums; /* Obsolete field */500 int instr_bank_size;501 unsigned int capabilities; 502#define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */503#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */504#define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */505 int dummies[19]; /* Reserve space */506 };507 508struct sound_timer_info {509 char name[32];510 int caps;511 };512 513#define MIDI_CAP_MPU401 1 /* MPU-401 intelligent mode */514 515struct midi_info {516 char name[30];517 int device; /* 0-N. INITIALIZE BEFORE CALLING */518 unsigned int capabilities; /* To be defined later */519 int dev_type;520 int dummies[18]; /* Reserve space */521 };522 523/********************************************524 * ioctl commands for the /dev/midi##525 */526typedef struct {527 unsigned char cmd;528 char nr_args, nr_returns;529 unsigned char data[30];530 } mpu_command_rec;531 532#define SNDCTL_MIDI_PRETIME _SIOWR('m', 0, int)533#define SNDCTL_MIDI_MPUMODE _SIOWR('m', 1, int)534#define SNDCTL_MIDI_MPUCMD _SIOWR('m', 2, mpu_command_rec)535 536/********************************************537 * IOCTL commands for /dev/dsp and /dev/audio538 */539 540#define SNDCTL_DSP_RESET _SIO ('P', 0)541#define SNDCTL_DSP_SYNC _SIO ('P', 1)542#define SNDCTL_DSP_SPEED _SIOWR('P', 2, int)543#define SNDCTL_DSP_STEREO _SIOWR('P', 3, int)544#define SNDCTL_DSP_GETBLKSIZE _SIOWR('P', 4, int)545#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT546#define SNDCTL_DSP_CHANNELS _SIOWR('P', 6, int)547#define SOUND_PCM_WRITE_CHANNELS SNDCTL_DSP_CHANNELS548#define SOUND_PCM_WRITE_FILTER _SIOWR('P', 7, int)549#define SNDCTL_DSP_POST _SIO ('P', 8)550#define SNDCTL_DSP_SUBDIVIDE _SIOWR('P', 9, int)551#define SNDCTL_DSP_SETFRAGMENT _SIOWR('P',10, int)552 553/* Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */554#define SNDCTL_DSP_GETFMTS _SIOR ('P',11, int) /* Returns a mask */555#define SNDCTL_DSP_SETFMT _SIOWR('P',5, int) /* Selects ONE fmt*/556# define AFMT_QUERY 0x00000000 /* Return current fmt */557# define AFMT_MU_LAW 0x00000001558# define AFMT_A_LAW 0x00000002559# define AFMT_IMA_ADPCM 0x00000004560# define AFMT_U8 0x00000008561# define AFMT_S16_LE 0x00000010 /* Little endian signed 16*/562# define AFMT_S16_BE 0x00000020 /* Big endian signed 16 */563# define AFMT_S8 0x00000040564# define AFMT_U16_LE 0x00000080 /* Little endian U16 */565# define AFMT_U16_BE 0x00000100 /* Big endian U16 */566# define AFMT_MPEG 0x00000200 /* MPEG (2) audio */567# define AFMT_AC3 0x00000400 /* Dolby Digital AC3 */568 569/*570 * Buffer status queries.571 */572typedef struct audio_buf_info {573 int fragments; /* # of available fragments (partially usend ones not counted) */574 int fragstotal; /* Total # of fragments allocated */575 int fragsize; /* Size of a fragment in bytes */576 577 int bytes; /* Available space in bytes (includes partially used fragments) */578 /* Note! 'bytes' could be more than fragments*fragsize */579 } audio_buf_info;580 581#define SNDCTL_DSP_GETOSPACE _SIOR ('P',12, audio_buf_info)582#define SNDCTL_DSP_GETISPACE _SIOR ('P',13, audio_buf_info)583#define SNDCTL_DSP_NONBLOCK _SIO ('P',14)584#define SNDCTL_DSP_GETCAPS _SIOR ('P',15, int)585# define DSP_CAP_REVISION 0x000000ff /* Bits for revision level (0 to 255) */586# define DSP_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */587# define DSP_CAP_REALTIME 0x00000200 /* Real time capability */588# define DSP_CAP_BATCH 0x00000400 /* Device has some kind of */589 /* internal buffers which may */590 /* cause some delays and */591 /* decrease precision of timing */592# define DSP_CAP_COPROC 0x00000800 /* Has a coprocessor */593 /* Sometimes it's a DSP */594 /* but usually not */595# define DSP_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */596# define DSP_CAP_MMAP 0x00002000 /* Supports mmap() */597# define DSP_CAP_MULTI 0x00004000 /* support multiple open */598# define DSP_CAP_BIND 0x00008000 /* channel binding to front/rear/cneter/lfe */599 600 601#define SNDCTL_DSP_GETTRIGGER _SIOR ('P',16, int)602#define SNDCTL_DSP_SETTRIGGER _SIOW ('P',16, int)603# define PCM_ENABLE_INPUT 0x00000001604# define PCM_ENABLE_OUTPUT 0x00000002605 606typedef struct count_info {607 int bytes; /* Total # of bytes processed */608 int blocks; /* # of fragment transitions since last time */609 int ptr; /* Current DMA pointer value */610 } count_info;611 612#define SNDCTL_DSP_GETIPTR _SIOR ('P',17, count_info)613#define SNDCTL_DSP_GETOPTR _SIOR ('P',18, count_info)614 615typedef struct buffmem_desc {616 unsigned *buffer;617 int size;618 } buffmem_desc;619#define SNDCTL_DSP_MAPINBUF _SIOR ('P', 19, buffmem_desc)620#define SNDCTL_DSP_MAPOUTBUF _SIOR ('P', 20, buffmem_desc)621#define SNDCTL_DSP_SETSYNCRO _SIO ('P', 21)622#define SNDCTL_DSP_SETDUPLEX _SIO ('P', 22)623#define SNDCTL_DSP_GETODELAY _SIOR ('P', 23, int)624 625#define SNDCTL_DSP_GETCHANNELMASK _SIOWR('P', 64, int)626#define SNDCTL_DSP_BIND_CHANNEL _SIOWR('P', 65, int)627# define DSP_BIND_QUERY 0x00000000628# define DSP_BIND_FRONT 0x00000001629# define DSP_BIND_SURR 0x00000002630# define DSP_BIND_CENTER_LFE 0x00000004631# define DSP_BIND_HANDSET 0x00000008632# define DSP_BIND_MIC 0x00000010633# define DSP_BIND_MODEM1 0x00000020634# define DSP_BIND_MODEM2 0x00000040635# define DSP_BIND_I2S 0x00000080636# define DSP_BIND_SPDIF 0x00000100637 638#define SNDCTL_DSP_SETSPDIF _SIOW ('P', 66, int)639#define SNDCTL_DSP_GETSPDIF _SIOR ('P', 67, int)640# define SPDIF_PRO 0x0001641# define SPDIF_N_AUD 0x0002642# define SPDIF_COPY 0x0004643# define SPDIF_PRE 0x0008644# define SPDIF_CC 0x07f0645# define SPDIF_L 0x0800646# define SPDIF_DRS 0x4000647# define SPDIF_V 0x8000648 649/*650 * Application's profile defines the way how playback underrun situations should be handled.651 * 652 * APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the653 * playback buffer whenever an underrun occurs. This consumes some time654 * prevents looping the existing buffer.655 * APF_CPUINTENS is intended to be set by CPU intensive applications which656 * are likely to run out of time occasionally. In this mode the buffer cleanup is657 * disabled which saves CPU time but also let's the previous buffer content to658 * be played during the "pause" after the underrun.659 */660#define SNDCTL_DSP_PROFILE _SIOW ('P', 23, int)661#define APF_NORMAL 0 /* Normal applications */662#define APF_NETWORK 1 /* Underruns probably caused by an "external" delay */663#define APF_CPUINTENS 2 /* Underruns probably caused by "overheating" the CPU */664 665#define SOUND_PCM_READ_RATE _SIOR ('P', 2, int)666#define SOUND_PCM_READ_CHANNELS _SIOR ('P', 6, int)667#define SOUND_PCM_READ_BITS _SIOR ('P', 5, int)668#define SOUND_PCM_READ_FILTER _SIOR ('P', 7, int)669 670/* Some alias names */671#define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SETFMT672#define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED673#define SOUND_PCM_POST SNDCTL_DSP_POST674#define SOUND_PCM_RESET SNDCTL_DSP_RESET675#define SOUND_PCM_SYNC SNDCTL_DSP_SYNC676#define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE677#define SOUND_PCM_SETFRAGMENT SNDCTL_DSP_SETFRAGMENT678#define SOUND_PCM_GETFMTS SNDCTL_DSP_GETFMTS679#define SOUND_PCM_SETFMT SNDCTL_DSP_SETFMT680#define SOUND_PCM_GETOSPACE SNDCTL_DSP_GETOSPACE681#define SOUND_PCM_GETISPACE SNDCTL_DSP_GETISPACE682#define SOUND_PCM_NONBLOCK SNDCTL_DSP_NONBLOCK683#define SOUND_PCM_GETCAPS SNDCTL_DSP_GETCAPS684#define SOUND_PCM_GETTRIGGER SNDCTL_DSP_GETTRIGGER685#define SOUND_PCM_SETTRIGGER SNDCTL_DSP_SETTRIGGER686#define SOUND_PCM_SETSYNCRO SNDCTL_DSP_SETSYNCRO687#define SOUND_PCM_GETIPTR SNDCTL_DSP_GETIPTR688#define SOUND_PCM_GETOPTR SNDCTL_DSP_GETOPTR689#define SOUND_PCM_MAPINBUF SNDCTL_DSP_MAPINBUF690#define SOUND_PCM_MAPOUTBUF SNDCTL_DSP_MAPOUTBUF691 692/*693 * ioctl calls to be used in communication with coprocessors and694 * DSP chips.695 */696 697typedef struct copr_buffer {698 int command; /* Set to 0 if not used */699 int flags;700#define CPF_NONE 0x0000701#define CPF_FIRST 0x0001 /* First block */702#define CPF_LAST 0x0002 /* Last block */703 int len;704 int offs; /* If required by the device (0 if not used) */705 706 unsigned char data[4000]; /* NOTE! 4000 is not 4k */707 } copr_buffer;708 709typedef struct copr_debug_buf {710 int command; /* Used internally. Set to 0 */711 int parm1;712 int parm2;713 int flags; 714 int len; /* Length of data in bytes */715 } copr_debug_buf;716 717typedef struct copr_msg {718 int len;719 unsigned char data[4000];720 } copr_msg;721 722#define SNDCTL_COPR_RESET _SIO ('C', 0)723#define SNDCTL_COPR_LOAD _SIOWR('C', 1, copr_buffer)724#define SNDCTL_COPR_RDATA _SIOWR('C', 2, copr_debug_buf)725#define SNDCTL_COPR_RCODE _SIOWR('C', 3, copr_debug_buf)726#define SNDCTL_COPR_WDATA _SIOW ('C', 4, copr_debug_buf)727#define SNDCTL_COPR_WCODE _SIOW ('C', 5, copr_debug_buf)728#define SNDCTL_COPR_RUN _SIOWR('C', 6, copr_debug_buf)729#define SNDCTL_COPR_HALT _SIOWR('C', 7, copr_debug_buf)730#define SNDCTL_COPR_SENDMSG _SIOWR('C', 8, copr_msg)731#define SNDCTL_COPR_RCVMSG _SIOR ('C', 9, copr_msg)732 733/*********************************************734 * IOCTL commands for /dev/mixer735 */736 737/* 738 * Mixer devices739 *740 * There can be up to 20 different analog mixer channels. The741 * SOUND_MIXER_NRDEVICES gives the currently supported maximum. 742 * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells743 * the devices supported by the particular mixer.744 */745 746#define SOUND_MIXER_NRDEVICES 25747#define SOUND_MIXER_VOLUME 0748#define SOUND_MIXER_BASS 1749#define SOUND_MIXER_TREBLE 2750#define SOUND_MIXER_SYNTH 3751#define SOUND_MIXER_PCM 4752#define SOUND_MIXER_SPEAKER 5753#define SOUND_MIXER_LINE 6754#define SOUND_MIXER_MIC 7755#define SOUND_MIXER_CD 8756#define SOUND_MIXER_IMIX 9 /* Recording monitor */757#define SOUND_MIXER_ALTPCM 10758#define SOUND_MIXER_RECLEV 11 /* Recording level */759#define SOUND_MIXER_IGAIN 12 /* Input gain */760#define SOUND_MIXER_OGAIN 13 /* Output gain */761/* 762 * The AD1848 codec and compatibles have three line level inputs763 * (line, aux1 and aux2). Since each card manufacturer have assigned764 * different meanings to these inputs, it's inpractical to assign765 * specific meanings (line, cd, synth etc.) to them.766 */767#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */768#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */769#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */770#define SOUND_MIXER_DIGITAL1 17 /* Digital (input) 1 */771#define SOUND_MIXER_DIGITAL2 18 /* Digital (input) 2 */772#define SOUND_MIXER_DIGITAL3 19 /* Digital (input) 3 */773#define SOUND_MIXER_PHONEIN 20 /* Phone input */774#define SOUND_MIXER_PHONEOUT 21 /* Phone output */775#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */776#define SOUND_MIXER_RADIO 23 /* Radio in */777#define SOUND_MIXER_MONITOR 24 /* Monitor (usually mic) volume */778 779/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */780/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */781#define SOUND_ONOFF_MIN 28782#define SOUND_ONOFF_MAX 30783 784/* Note! Number 31 cannot be used since the sign bit is reserved */785#define SOUND_MIXER_NONE 31786 787/*788 * The following unsupported macros are no longer functional.789 * Use SOUND_MIXER_PRIVATE# macros in future.790 */791#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE792#define SOUND_MIXER_MUTE SOUND_MIXER_NONE793#define SOUND_MIXER_LOUD SOUND_MIXER_NONE794 795 796#define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \797 "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \798 "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \799 "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"}800 801#define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \802 "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \803 "line1", "line2", "line3", "dig1", "dig2", "dig3", \804 "phin", "phout", "video", "radio", "monitor"}805 806/* Device bitmask identifiers */807 808#define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */809#define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */810#define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */811#define SOUND_MIXER_CAPS 0xfc812# define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */813#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */814#define SOUND_MIXER_OUTSRC 0xfa /* Arg contains a bit for each input source to output */815#define SOUND_MIXER_OUTMASK 0xf9 /* Arg contains a bit for each supported input source to output */816 817/* Device mask bits */818 819#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)820#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)821#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)822#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)823#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)824#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)825#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)826#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)827#define SOUND_MASK_CD (1 << SOUND_MIXER_CD)828#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)829#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)830#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)831#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN)832#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN)833#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1)834#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2)835#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3)836#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1)837#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2)838#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3)839#define SOUND_MASK_PHONEIN (1 << SOUND_MIXER_PHONEIN)840#define SOUND_MASK_PHONEOUT (1 << SOUND_MIXER_PHONEOUT)841#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO)842#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO)843#define SOUND_MASK_MONITOR (1 << SOUND_MIXER_MONITOR)844 845/* Obsolete macros */846#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)847#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)848#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)849 850#define MIXER_READ(dev) _SIOR('M', dev, int)851#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)852#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)853#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)854#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)855#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)856#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)857#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)858#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)859#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)860#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)861#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)862#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)863#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN)864#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN)865#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1)866#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2)867#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3)868 869/* Obsolete macros */870#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE)871#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE)872#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD)873 874#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)875#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)876#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)877#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)878#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)879 880#define MIXER_WRITE(dev) _SIOWR('M', dev, int)881#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)882#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)883#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)884#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)885#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)886#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)887#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)888#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)889#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)890#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)891#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)892#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)893#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN)894#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN)895#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1)896#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2)897#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3)898 899/* Obsolete macros */900#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE)901#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE)902#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD)903 904#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)905 906typedef struct mixer_info907{908 char id[16];909 char name[32];910 int modify_counter;911 int fillers[10];912} mixer_info;913 914typedef struct _old_mixer_info /* Obsolete */915{916 char id[16];917 char name[32];918} _old_mixer_info;919 920#define SOUND_MIXER_INFO _SIOR ('M', 101, mixer_info)921#define SOUND_OLD_MIXER_INFO _SIOR ('M', 101, _old_mixer_info)922 923/*924 * A mechanism for accessing "proprietary" mixer features. This method925 * permits passing 128 bytes of arbitrary data between a mixer application926 * and the mixer driver. Interpretation of the record is defined by927 * the particular mixer driver.928 */929typedef unsigned char mixer_record[128];930 931#define SOUND_MIXER_ACCESS _SIOWR('M', 102, mixer_record)932 933/*934 * Two ioctls for special souncard function935 */936#define SOUND_MIXER_AGC _SIOWR('M', 103, int)937#define SOUND_MIXER_3DSE _SIOWR('M', 104, int)938 939/*940 * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers.941 * These features can be used when accessing device specific features.942 */943#define SOUND_MIXER_PRIVATE1 _SIOWR('M', 111, int)944#define SOUND_MIXER_PRIVATE2 _SIOWR('M', 112, int)945#define SOUND_MIXER_PRIVATE3 _SIOWR('M', 113, int)946#define SOUND_MIXER_PRIVATE4 _SIOWR('M', 114, int)947#define SOUND_MIXER_PRIVATE5 _SIOWR('M', 115, int)948 949/*950 * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used951 * for querying current mixer settings from the driver and for loading952 * default volume settings _prior_ activating the mixer (loading953 * doesn't affect current state of the mixer hardware). These calls954 * are for internal use only.955 */956 957typedef struct mixer_vol_table {958 int num; /* Index to volume table */959 char name[32];960 int levels[32];961} mixer_vol_table;962 963#define SOUND_MIXER_GETLEVELS _SIOWR('M', 116, mixer_vol_table)964#define SOUND_MIXER_SETLEVELS _SIOWR('M', 117, mixer_vol_table)965 966/* 967 * An ioctl for identifying the driver version. It will return value968 * of the SOUND_VERSION macro used when compiling the driver.969 * This call was introduced in OSS version 3.6 and it will not work970 * with earlier versions (returns EINVAL).971 */972#define OSS_GETVERSION _SIOR ('M', 118, int)973 974/*975 * Level 2 event types for /dev/sequencer976 */977 978/*979 * The 4 most significant bits of byte 0 specify the class of980 * the event: 981 *982 * 0x8X = system level events,983 * 0x9X = device/port specific events, event[1] = device/port,984 * The last 4 bits give the subtype:985 * 0x02 = Channel event (event[3] = chn).986 * 0x01 = note event (event[4] = note).987 * (0x01 is not used alone but always with bit 0x02).988 * event[2] = MIDI message code (0x80=note off etc.)989 *990 */991 992#define EV_SEQ_LOCAL 0x80993#define EV_TIMING 0x81994#define EV_CHN_COMMON 0x92995#define EV_CHN_VOICE 0x93996#define EV_SYSEX 0x94997/*998 * Event types 200 to 220 are reserved for application use.999 * These numbers will not be used by the driver.1000 */1001 1002/*1003 * Events for event type EV_CHN_VOICE1004 */1005 1006#define MIDI_NOTEOFF 0x801007#define MIDI_NOTEON 0x901008#define MIDI_KEY_PRESSURE 0xA01009 1010/*1011 * Events for event type EV_CHN_COMMON1012 */1013 1014#define MIDI_CTL_CHANGE 0xB01015#define MIDI_PGM_CHANGE 0xC01016#define MIDI_CHN_PRESSURE 0xD01017#define MIDI_PITCH_BEND 0xE01018 1019#define MIDI_SYSTEM_PREFIX 0xF01020 1021/*1022 * Timer event types1023 */1024#define TMR_WAIT_REL 1 /* Time relative to the prev time */1025#define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */1026#define TMR_STOP 31027#define TMR_START 41028#define TMR_CONTINUE 51029#define TMR_TEMPO 61030#define TMR_ECHO 81031#define TMR_CLOCK 9 /* MIDI clock */1032#define TMR_SPP 10 /* Song position pointer */1033#define TMR_TIMESIG 11 /* Time signature */1034 1035/*1036 * Local event types1037 */1038#define LOCL_STARTAUDIO 11039 1040#if !defined(__KERNEL__) || defined(USE_SEQ_MACROS)1041/*1042 * Some convenience macros to simplify programming of the1043 * /dev/sequencer interface1044 *1045 * This is a legacy interface for applications written against1046 * the OSSlib-3.8 style interface. It is no longer possible1047 * to actually link against OSSlib with this header, but we1048 * still provide these macros for programs using them.1049 *1050 * If you want to use OSSlib, it is recommended that you get1051 * the GPL version of OSS-4.x and build against that version1052 * of the header.1053 *1054 * We redefine the extern keyword so that usr/include/headers_check.pl1055 * does not complain about SEQ_USE_EXTBUF.1056 */1057#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF()1058 1059void seqbuf_dump(void); /* This function must be provided by programs */1060 1061#define SEQ_PM_DEFINES int __foo_bar___1062 1063#define SEQ_LOAD_GMINSTR(dev, instr)1064#define SEQ_LOAD_GMDRUM(dev, drum)1065 1066#define _SEQ_EXTERN extern1067#define SEQ_USE_EXTBUF() \1068 _SEQ_EXTERN unsigned char _seqbuf[]; \1069 _SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr1070 1071#ifndef USE_SIMPLE_MACROS1072/* Sample seqbuf_dump() implementation:1073 *1074 * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes1075 *1076 * int seqfd; -- The file descriptor for /dev/sequencer.1077 *1078 * void1079 * seqbuf_dump ()1080 * {1081 * if (_seqbufptr)1082 * if (write (seqfd, _seqbuf, _seqbufptr) == -1)1083 * {1084 * perror ("write /dev/sequencer");1085 * exit (-1);1086 * }1087 * _seqbufptr = 0;1088 * }1089 */1090 1091#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 01092#define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()1093#define _SEQ_ADVBUF(len) _seqbufptr += len1094#define SEQ_DUMPBUF seqbuf_dump1095#else1096/*1097 * This variation of the sequencer macros is used just to format one event1098 * using fixed buffer.1099 * 1100 * The program using the macro library must define the following macros before1101 * using this library.1102 *1103 * #define _seqbuf name of the buffer (unsigned char[]) 1104 * #define _SEQ_ADVBUF(len) If the applic needs to know the exact1105 * size of the event, this macro can be used.1106 * Otherwise this must be defined as empty.1107 * #define _seqbufptr Define the name of index variable or 0 if1108 * not required. 1109 */1110#define _SEQ_NEEDBUF(len) /* empty */1111#endif1112 1113#define SEQ_VOLUME_MODE(dev, mode) {_SEQ_NEEDBUF(8);\1114 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\1115 _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\1116 _seqbuf[_seqbufptr+2] = (dev);\1117 _seqbuf[_seqbufptr+3] = (mode);\1118 _seqbuf[_seqbufptr+4] = 0;\1119 _seqbuf[_seqbufptr+5] = 0;\1120 _seqbuf[_seqbufptr+6] = 0;\1121 _seqbuf[_seqbufptr+7] = 0;\1122 _SEQ_ADVBUF(8);}1123 1124/*1125 * Midi voice messages1126 */1127 1128#define _CHN_VOICE(dev, event, chn, note, parm) \1129 {_SEQ_NEEDBUF(8);\1130 _seqbuf[_seqbufptr] = EV_CHN_VOICE;\1131 _seqbuf[_seqbufptr+1] = (dev);\1132 _seqbuf[_seqbufptr+2] = (event);\1133 _seqbuf[_seqbufptr+3] = (chn);\1134 _seqbuf[_seqbufptr+4] = (note);\1135 _seqbuf[_seqbufptr+5] = (parm);\1136 _seqbuf[_seqbufptr+6] = (0);\1137 _seqbuf[_seqbufptr+7] = 0;\1138 _SEQ_ADVBUF(8);}1139 1140#define SEQ_START_NOTE(dev, chn, note, vol) \1141 _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)1142 1143#define SEQ_STOP_NOTE(dev, chn, note, vol) \1144 _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)1145 1146#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \1147 _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)1148 1149/*1150 * Midi channel messages1151 */1152 1153#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \1154 {_SEQ_NEEDBUF(8);\1155 _seqbuf[_seqbufptr] = EV_CHN_COMMON;\1156 _seqbuf[_seqbufptr+1] = (dev);\1157 _seqbuf[_seqbufptr+2] = (event);\1158 _seqbuf[_seqbufptr+3] = (chn);\1159 _seqbuf[_seqbufptr+4] = (p1);\1160 _seqbuf[_seqbufptr+5] = (p2);\1161 *(short *)&_seqbuf[_seqbufptr+6] = (w14);\1162 _SEQ_ADVBUF(8);}1163/*1164 * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits1165 * sending any MIDI bytes but it's absolutely not possible. Trying to do1166 * so _will_ cause problems with MPU401 intelligent mode).1167 *1168 * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be 1169 * sent by calling SEQ_SYSEX() several times (there must be no other events1170 * between them). First sysex fragment must have 0xf0 in the first byte1171 * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte1172 * between these sysex start and end markers cannot be larger than 0x7f. Also1173 * lengths of each fragments (except the last one) must be 6.1174 *1175 * Breaking the above rules may work with some MIDI ports but is likely to1176 * cause fatal problems with some other devices (such as MPU401).1177 */1178#define SEQ_SYSEX(dev, buf, len) \1179 {int ii, ll=(len); \1180 unsigned char *bufp=buf;\1181 if (ll>6)ll=6;\1182 _SEQ_NEEDBUF(8);\1183 _seqbuf[_seqbufptr] = EV_SYSEX;\1184 _seqbuf[_seqbufptr+1] = (dev);\1185 for(ii=0;ii<ll;ii++)\1186 _seqbuf[_seqbufptr+ii+2] = bufp[ii];\1187 for(ii=ll;ii<6;ii++)\1188 _seqbuf[_seqbufptr+ii+2] = 0xff;\1189 _SEQ_ADVBUF(8);}1190 1191#define SEQ_CHN_PRESSURE(dev, chn, pressure) \1192 _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)1193 1194#define SEQ_SET_PATCH SEQ_PGM_CHANGE1195#define SEQ_PGM_CHANGE(dev, chn, patch) \1196 _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)1197 1198#define SEQ_CONTROL(dev, chn, controller, value) \1199 _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)1200 1201#define SEQ_BENDER(dev, chn, value) \1202 _CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)1203 1204 1205#define SEQ_V2_X_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\1206 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\1207 _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\1208 _seqbuf[_seqbufptr+2] = (dev);\1209 _seqbuf[_seqbufptr+3] = (voice);\1210 _seqbuf[_seqbufptr+4] = (controller);\1211 _seqbuf[_seqbufptr+5] = ((value)&0xff);\1212 _seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\1213 _seqbuf[_seqbufptr+7] = 0;\1214 _SEQ_ADVBUF(8);}1215/*1216 * The following 5 macros are incorrectly implemented and obsolete.1217 * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead.1218 */1219#define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)1220#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)1221#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128)1222#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100)1223#define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2)1224 1225/*1226 * Timing and synchronization macros1227 */1228 1229#define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\1230 _seqbuf[_seqbufptr+0] = EV_TIMING; \1231 _seqbuf[_seqbufptr+1] = (ev); \1232 _seqbuf[_seqbufptr+2] = 0;\1233 _seqbuf[_seqbufptr+3] = 0;\1234 *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \1235 _SEQ_ADVBUF(8);}1236 1237#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0)1238#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0)1239#define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0)1240#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks)1241#define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks)1242#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key)1243#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value)1244#define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos)1245#define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig)1246 1247/*1248 * Local control events1249 */1250 1251#define _LOCAL_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\1252 _seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \1253 _seqbuf[_seqbufptr+1] = (ev); \1254 _seqbuf[_seqbufptr+2] = 0;\1255 _seqbuf[_seqbufptr+3] = 0;\1256 *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \1257 _SEQ_ADVBUF(8);}1258 1259#define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask)1260/*1261 * Events for the level 1 interface only 1262 */1263 1264#define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\1265 _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\1266 _seqbuf[_seqbufptr+1] = (byte);\1267 _seqbuf[_seqbufptr+2] = (device);\1268 _seqbuf[_seqbufptr+3] = 0;\1269 _SEQ_ADVBUF(4);}1270 1271/*1272 * Patch loading.1273 */1274#define SEQ_WRPATCH(patchx, len) \1275 {if (_seqbufptr) SEQ_DUMPBUF();\1276 if (write(seqfd, (char*)(patchx), len)==-1) \1277 perror("Write patch: /dev/sequencer");}1278#define SEQ_WRPATCH2(patchx, len) \1279 (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))1280 1281#endif1282#endif /* _UAPISOUNDCARD_H */1283