soundcard.h revision 1258
1719Swollman#ifndef _SOUNDCARD_H_ 2719Swollman#define _SOUNDCARD_H_ 1 3652Sjkh/* 4652Sjkh * Copyright by Hannu Savolainen 1993 5652Sjkh * 6652Sjkh * Redistribution and use in source and binary forms, with or without 7652Sjkh * modification, are permitted provided that the following conditions 8652Sjkh * are met: 9652Sjkh * 1. Redistributions of source code must retain the above copyright 10652Sjkh * notice, this list of conditions and the following disclaimer. 11652Sjkh * 2. Redistributions in binary form must reproduce the above copyright 12652Sjkh * notice, this list of conditions and the following disclaimer in the 13652Sjkh * documentation and/or other materials provided with the distribution. 14652Sjkh * 15805Sache * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16652Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17652Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18805Sache * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19652Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20652Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21652Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22652Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23652Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24652Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25652Sjkh * SUCH DAMAGE. 26652Sjkh * 27652Sjkh * 28652Sjkh */ 29652Sjkh 30652Sjkh /* 31652Sjkh * If you make modifications to this file, please contact me before 32652Sjkh * distributing the modified version. There is already enough 331258Sswallace * divercity in the world. 34652Sjkh * 35652Sjkh * Regards, 36652Sjkh * Hannu Savolainen 37652Sjkh * hsavolai@cs.helsinki.fi 38652Sjkh */ 39652Sjkh 401258Sswallace#define SOUND_VERSION 203 411258Sswallace#define VOXWARE 42652Sjkh 43652Sjkh#include <sys/ioctl.h> 44652Sjkh 45652Sjkh/* 46652Sjkh * Supported card ID numbers (Should be somewhere else?) 47652Sjkh */ 48652Sjkh 49652Sjkh#define SNDCARD_ADLIB 1 50652Sjkh#define SNDCARD_SB 2 51652Sjkh#define SNDCARD_PAS 3 52652Sjkh#define SNDCARD_GUS 4 53652Sjkh#define SNDCARD_MPU401 5 541258Sswallace#define SNDCARD_SB16 6 551258Sswallace#define SNDCARD_SB16MIDI 7 56652Sjkh 57652Sjkh/*********************************** 58652Sjkh * IOCTL Commands for /dev/sequencer 59652Sjkh */ 60652Sjkh 61652Sjkh#ifndef _IOWR 62652Sjkh/* @(#)ioctlp.h */ 63652Sjkh 64652Sjkh/* Ioctl's have the command encoded in the lower word, 65652Sjkh * and the size of any in or out parameters in the upper 66652Sjkh * word. The high 2 bits of the upper word are used 67652Sjkh * to encode the in/out status of the parameter; for now 68652Sjkh * we restrict parameters to at most 128 bytes. 69652Sjkh */ 70652Sjkh/* #define IOCTYPE (0xff<<8) */ 71652Sjkh#define IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */ 721258Sswallace#define IOC_VOID 0x00000000 /* no parameters */ 731258Sswallace#define IOC_OUT 0x20000000 /* copy out parameters */ 741258Sswallace#define IOC_IN 0x40000000 /* copy in parameters */ 75652Sjkh#define IOC_INOUT (IOC_IN|IOC_OUT) 76652Sjkh/* the 0x20000000 is so we can distinguish new ioctl's from old */ 77652Sjkh#define _IO(x,y) ((int)(IOC_VOID|(x<<8)|y)) 78652Sjkh#define _IOR(x,y,t) ((int)(IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)) 79652Sjkh#define _IOW(x,y,t) ((int)(IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)) 80652Sjkh/* this should be _IORW, but stdio got there first */ 81652Sjkh#define _IOWR(x,y,t) ((int)(IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)) 82652Sjkh#endif /* !_IOWR */ 83652Sjkh 84652Sjkh#define SNDCTL_SEQ_RESET _IO ('Q', 0) 85652Sjkh#define SNDCTL_SEQ_SYNC _IO ('Q', 1) 86652Sjkh#define SNDCTL_SYNTH_INFO _IOWR('Q', 2, struct synth_info) 87652Sjkh#define SNDCTL_SEQ_CTRLRATE _IOWR('Q', 3, int) /* Set/get timer resolution (HZ) */ 88652Sjkh#define SNDCTL_SEQ_GETOUTCOUNT _IOR ('Q', 4, int) 89652Sjkh#define SNDCTL_SEQ_GETINCOUNT _IOR ('Q', 5, int) 90652Sjkh#define SNDCTL_SEQ_PERCMODE _IOW ('Q', 6, int) 91652Sjkh#define SNDCTL_FM_LOAD_INSTR _IOW ('Q', 7, struct sbi_instrument) /* Valid for FM only */ 92652Sjkh#define SNDCTL_SEQ_TESTMIDI _IOW ('Q', 8, int) 93652Sjkh#define SNDCTL_SEQ_RESETSAMPLES _IOW ('Q', 9, int) 94652Sjkh#define SNDCTL_SEQ_NRSYNTHS _IOR ('Q',10, int) 95652Sjkh#define SNDCTL_SEQ_NRMIDIS _IOR ('Q',11, int) 96652Sjkh#define SNDCTL_MIDI_INFO _IOWR('Q',12, struct midi_info) 97652Sjkh#define SNDCTL_SEQ_TRESHOLD _IOW ('Q',13, int) 98652Sjkh#define SNDCTL_SYNTH_MEMAVL _IOWR('Q',14, int) /* in=dev#, out=memsize */ 99652Sjkh#define SNDCTL_FM_4OP_ENABLE _IOW ('Q',15, int) /* in=dev# */ 100652Sjkh#define SNDCTL_PMGR_ACCESS _IOWR('Q',16, struct patmgr_info) 101652Sjkh 102652Sjkh/* 103652Sjkh * Sample loading mechanism for internal synthesizers (/dev/sequencer) 104652Sjkh * The following patch_info structure has been designed to support 105652Sjkh * Gravis UltraSound. It tries to be universal format for uploading 106652Sjkh * sample based patches but is propably too limited. 107652Sjkh */ 108652Sjkh 109652Sjkhstruct patch_info { 110652Sjkh short key; /* Use GUS_PATCH here */ 111652Sjkh#define GUS_PATCH 0x04fd 112652Sjkh#define OBSOLETE_GUS_PATCH 0x02fd 113652Sjkh short device_no; /* Synthesizer number */ 114652Sjkh short instr_no; /* Midi pgm# */ 115652Sjkh 116652Sjkh unsigned long mode; 117652Sjkh/* 118652Sjkh * The least significant byte has the same format than the GUS .PAT 119652Sjkh * files 120652Sjkh */ 121652Sjkh#define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ 122652Sjkh#define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ 123652Sjkh#define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ 124652Sjkh#define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ 125652Sjkh#define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ 126652Sjkh#define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3)*/ 127652Sjkh#define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ 128652Sjkh /* (use the env_rate/env_offs fields). */ 129652Sjkh/* Linux specific bits */ 130652Sjkh#define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ 131652Sjkh#define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ 132652Sjkh#define WAVE_SCALE 0x00040000 /* The scaling info is valid */ 133652Sjkh/* Other bits must be zeroed */ 134652Sjkh 135652Sjkh long len; /* Size of the wave data in bytes */ 136652Sjkh long loop_start, loop_end; /* Byte offsets from the beginning */ 137652Sjkh 138652Sjkh/* 139652Sjkh * The base_freq and base_note fields are used when computing the 140652Sjkh * playback speed for a note. The base_note defines the tone frequency 141652Sjkh * which is heard if the sample is played using the base_freq as the 142652Sjkh * playback speed. 143652Sjkh * 144652Sjkh * The low_note and high_note fields define the minimum and maximum note 145652Sjkh * frequencies for which this sample is valid. It is possible to define 146652Sjkh * more than one samples for a instrument number at the same time. The 147652Sjkh * low_note and high_note fields are used to select the most suitable one. 148652Sjkh * 149652Sjkh * The fields base_note, high_note and low_note should contain 150652Sjkh * the note frequency multiplied by 1000. For example value for the 151652Sjkh * middle A is 440*1000. 152652Sjkh */ 153652Sjkh 154652Sjkh unsigned int base_freq; 155652Sjkh unsigned long base_note; 156652Sjkh unsigned long high_note; 157652Sjkh unsigned long low_note; 158652Sjkh int panning; /* -128=left, 127=right */ 159652Sjkh int detuning; 160652Sjkh 161652Sjkh/* New fields introduced in version 1.99.5 */ 162652Sjkh 163652Sjkh /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ 164652Sjkh unsigned char env_rate[ 6 ]; /* GUS HW ramping rate */ 165652Sjkh unsigned char env_offset[ 6 ]; /* 255 == 100% */ 166652Sjkh 167652Sjkh /* 168652Sjkh * The tremolo, vibrato and scale info are not supported yet. 169652Sjkh * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or 170652Sjkh * WAVE_SCALE 171652Sjkh */ 172652Sjkh 173652Sjkh unsigned char tremolo_sweep; 174652Sjkh unsigned char tremolo_rate; 175652Sjkh unsigned char tremolo_depth; 176652Sjkh 177652Sjkh unsigned char vibrato_sweep; 178652Sjkh unsigned char vibrato_rate; 179652Sjkh unsigned char vibrato_depth; 180652Sjkh 181652Sjkh int scale_frequency; 182652Sjkh unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */ 183652Sjkh 184652Sjkh int volume; 185652Sjkh int spare[4]; 1861258Sswallace char data[1]; /* The waveform data starts here */ 187652Sjkh }; 188652Sjkh 189652Sjkh 190652Sjkh/* 191652Sjkh * Patch management interface (/dev/sequencer, /dev/patmgr#) 192652Sjkh * Don't use these calls if you want to maintain compatibility with 193652Sjkh * the future versions of the driver. 194652Sjkh */ 195652Sjkh 196652Sjkh#define PS_NO_PATCHES 0 /* No patch support on device */ 197652Sjkh#define PS_MGR_NOT_OK 1 /* Plain patch support (no mgr) */ 198652Sjkh#define PS_MGR_OK 2 /* Patch manager supported */ 199652Sjkh#define PS_MANAGED 3 /* Patch manager running */ 200652Sjkh 201652Sjkh#define SNDCTL_PMGR_IFACE _IOWR('P', 1, struct patmgr_info) 202652Sjkh 203652Sjkh/* 204652Sjkh * The patmgr_info is a fixed size structure which is used for two 205652Sjkh * different purposes. The intended use is for communication between 206652Sjkh * the application using /dev/sequencer and the patch manager daemon 207652Sjkh * associated with a synthesizer device (ioctl(SNDCTL_PMGR_ACCESS)). 208652Sjkh * 209652Sjkh * This structure is also used with ioctl(SNDCTL_PGMR_IFACE) which allows 210652Sjkh * a patch manager daemon to read and write device parameters. This 211652Sjkh * ioctl available through /dev/sequencer also. Avoid using it since it's 212652Sjkh * extremely hardware dependent. In addition access trough /dev/sequencer 213652Sjkh * may confuse the patch manager daemon. 214652Sjkh */ 215652Sjkh 216652Sjkhstruct patmgr_info { /* Note! size must be < 4k since kmalloc() is used */ 217652Sjkh unsigned long key; /* Don't worry. Reserved for communication 218652Sjkh between the patch manager and the driver. */ 219652Sjkh#define PM_K_EVENT 1 /* Event from the /dev/sequencer driver */ 220652Sjkh#define PM_K_COMMAND 2 /* Request from a application */ 221652Sjkh#define PM_K_RESPONSE 3 /* From patmgr to application */ 222652Sjkh#define PM_ERROR 4 /* Error returned by the patmgr */ 223652Sjkh int device; 224652Sjkh int command; 225652Sjkh 226652Sjkh/* 227652Sjkh * Commands 0x000 to 0xfff reserved for patch manager programs 228652Sjkh */ 229652Sjkh#define PM_GET_DEVTYPE 1 /* Returns type of the patch mgr interface of dev */ 230652Sjkh#define PMTYPE_FM2 1 /* 2 OP fm */ 231652Sjkh#define PMTYPE_FM4 2 /* Mixed 4 or 2 op FM (OPL-3) */ 232652Sjkh#define PMTYPE_WAVE 3 /* Wave table synthesizer (GUS) */ 233652Sjkh#define PM_GET_NRPGM 2 /* Returns max # of midi programs in parm1 */ 234652Sjkh#define PM_GET_PGMMAP 3 /* Returns map of loaded midi programs in data8 */ 235652Sjkh#define PM_GET_PGM_PATCHES 4 /* Return list of patches of a program (parm1) */ 236652Sjkh#define PM_GET_PATCH 5 /* Return patch header of patch parm1 */ 237652Sjkh#define PM_SET_PATCH 6 /* Set patch header of patch parm1 */ 238652Sjkh#define PM_READ_PATCH 7 /* Read patch (wave) data */ 239652Sjkh#define PM_WRITE_PATCH 8 /* Write patch (wave) data */ 240652Sjkh 241652Sjkh/* 242652Sjkh * Commands 0x1000 to 0xffff are for communication between the patch manager 243652Sjkh * and the client 244652Sjkh */ 245652Sjkh#define _PM_LOAD_PATCH 0x100 246652Sjkh 247652Sjkh/* 248652Sjkh * Commands above 0xffff reserved for device specific use 249652Sjkh */ 250652Sjkh 251652Sjkh long parm1; 252652Sjkh long parm2; 253652Sjkh long parm3; 254652Sjkh 255652Sjkh union { 256652Sjkh unsigned char data8[4000]; 257652Sjkh unsigned short data16[2000]; 258652Sjkh unsigned long data32[1000]; 259652Sjkh struct patch_info patch; 260652Sjkh } data; 261652Sjkh }; 262652Sjkh 263652Sjkh/* 264652Sjkh * When a patch manager daemon is present, it will be informed by the 265652Sjkh * driver when something important happens. For example when the 266652Sjkh * /dev/sequencer is opened or closed. A record with key == PM_K_EVENT is 267652Sjkh * returned. The command field contains the event type: 268652Sjkh */ 269652Sjkh#define PM_E_OPENED 1 /* /dev/sequencer opened */ 270652Sjkh#define PM_E_CLOSED 2 /* /dev/sequencer closed */ 271652Sjkh#define PM_E_PATCH_RESET 3 /* SNDCTL_RESETSAMPLES called */ 272652Sjkh#define PM_E_PATCH_LOADED 4 /* A patch has been loaded by appl */ 273652Sjkh 274652Sjkh/* 275652Sjkh * /dev/sequencer input events. 276652Sjkh * 277652Sjkh * The data written to the /dev/sequencer is a stream of events. Events 278652Sjkh * are records of 4 or 8 bytes. The first byte defines the size. 279652Sjkh * Any number of events can be written with a write call. There 280652Sjkh * is a set of macros for sending these events. Use these macros if you 281652Sjkh * want to maximize portability of your program. 282652Sjkh * 283652Sjkh * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. 284652Sjkh * (All input events are currently 4 bytes long. Be prepared to support 285652Sjkh * 8 byte events also. If you receive any event having first byte >= 0xf0, 286652Sjkh * it's a 8 byte event. 287652Sjkh * 288652Sjkh * The events are documented at the end of this file. 289652Sjkh * 290652Sjkh * Normal events (4 bytes) 291652Sjkh * There is also a 8 byte version of most of the 4 byte events. The 292652Sjkh * 8 byte one is recommended. 293652Sjkh */ 294652Sjkh#define SEQ_NOTEOFF 0 295652Sjkh#define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ 296652Sjkh#define SEQ_NOTEON 1 297652Sjkh#define SEQ_FMNOTEON SEQ_NOTEON 298652Sjkh#define SEQ_WAIT 2 299652Sjkh#define SEQ_PGMCHANGE 3 300652Sjkh#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE 301652Sjkh#define SEQ_SYNCTIMER 4 302652Sjkh#define SEQ_MIDIPUTC 5 303652Sjkh#define SEQ_DRUMON 6 /*** OBSOLETE ***/ 304652Sjkh#define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ 305652Sjkh#define SEQ_ECHO 8 /* For synching programs with output */ 306652Sjkh#define SEQ_AFTERTOUCH 9 307652Sjkh#define SEQ_CONTROLLER 10 308652Sjkh#define CTRL_PITCH_BENDER 255 309652Sjkh#define CTRL_PITCH_BENDER_RANGE 254 310652Sjkh#define CTRL_EXPRESSION 253 311652Sjkh#define CTRL_MAIN_VOLUME 252 312652Sjkh#define SEQ_BALANCE 11 313652Sjkh 314652Sjkh/* 315652Sjkh * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as 316652Sjkh * input events. 317652Sjkh */ 318652Sjkh 319652Sjkh/* 320652Sjkh * Event codes 0xf0 to 0xfc are reserved for future extensions. 321652Sjkh */ 322652Sjkh 323652Sjkh#define SEQ_FULLSIZE 0xfd /* Long events */ 324652Sjkh/* 325652Sjkh * SEQ_FULLSIZE events are used for loading patches/samples to the 326652Sjkh * synthesizer devices. These events are passed directly to the driver 327652Sjkh * of the associated synthesizer device. There is no limit to the size 328652Sjkh * of the extended events. These events are not queued but executed 329652Sjkh * immediately when the write() is called (execution can take several 330652Sjkh * seconds of time). 331652Sjkh * 332652Sjkh * When a SEQ_FULLSIZE message is written to the device, it must 333652Sjkh * be written using exactly one write() call. Other events cannot 334652Sjkh * be mixed to the same write. 335652Sjkh * 336652Sjkh * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the 337652Sjkh * /dev/sequencer. Don't write other data together with the instrument structure 338652Sjkh * Set the key field of the structure to FM_PATCH. The device field is used to 339652Sjkh * route the patch to the corresponding device. 340652Sjkh * 341652Sjkh * For Gravis UltraSound use struct patch_info. Initialize the key field 342652Sjkh * to GUS_PATCH. 343652Sjkh */ 344652Sjkh#define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ 345652Sjkh#define SEQ_EXTENDED 0xff /* Extended events (8 bytes) */ 346652Sjkh 347652Sjkh/* 348652Sjkh * Extended events for synthesizers (8 bytes) 349652Sjkh * 350652Sjkh * Format: 351652Sjkh * 352652Sjkh * b0 = SEQ_EXTENDED 353652Sjkh * b1 = command 354652Sjkh * b2 = device 355652Sjkh * b3-b7 = parameters 356652Sjkh * 357652Sjkh * Command b3 b4 b5 b6 b7 358652Sjkh * ---------------------------------------------------------------------------- 359652Sjkh * SEQ_NOTEON voice note volume 0 0 360652Sjkh * SEQ_NOTEOFF voice note volume 0 0 361652Sjkh * SEQ_PGMCHANGE voice pgm 0 0 0 362652Sjkh * SEQ_DRUMON (voice) drum# volume 0 0 363652Sjkh * SEQ_DRUMOFF (voice) drum# volume 0 0 364652Sjkh */ 365652Sjkh 366652Sjkh/* 367652Sjkh * Record for FM patches 368652Sjkh */ 369652Sjkh 370652Sjkhtypedef unsigned char sbi_instr_data[32]; 371652Sjkh 372652Sjkhstruct sbi_instrument { 373652Sjkh unsigned short key; /* Initialize to FM_PATCH or OPL3_PATCH */ 374652Sjkh#define FM_PATCH 0x01fd 375652Sjkh#define OPL3_PATCH 0x03fd 376652Sjkh short device; /* Synth# (0-4) */ 377652Sjkh int channel; /* Program# to be initialized */ 378652Sjkh sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */ 379652Sjkh }; 380652Sjkh 381652Sjkhstruct synth_info { /* Read only */ 382652Sjkh char name[30]; 383652Sjkh int device; /* 0-N. INITIALIZE BEFORE CALLING */ 384652Sjkh int synth_type; 385652Sjkh#define SYNTH_TYPE_FM 0 386652Sjkh#define SYNTH_TYPE_SAMPLE 1 387652Sjkh 388652Sjkh int synth_subtype; 389652Sjkh#define FM_TYPE_ADLIB 0x00 390652Sjkh#define FM_TYPE_OPL3 0x01 391652Sjkh 392652Sjkh#define SAMPLE_TYPE_GUS 0x10 393652Sjkh 394652Sjkh int perc_mode; /* No longer supported */ 395652Sjkh int nr_voices; 396652Sjkh int nr_drums; /* Obsolete field */ 397652Sjkh int instr_bank_size; 398652Sjkh unsigned long capabilities; 399652Sjkh#define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ 400652Sjkh#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ 401652Sjkh int dummies[19]; /* Reserve space */ 402652Sjkh }; 403652Sjkh 404652Sjkhstruct midi_info { 405652Sjkh char name[30]; 406652Sjkh int device; /* 0-N. INITIALIZE BEFORE CALLING */ 407652Sjkh unsigned long capabilities; /* To be defined later */ 4081258Sswallace int dev_type; 4091258Sswallace int dummies[18]; /* Reserve space */ 410652Sjkh }; 411652Sjkh 412652Sjkh/******************************************** 413652Sjkh * IOCTL commands for /dev/dsp and /dev/audio 414652Sjkh */ 415652Sjkh 416652Sjkh#define SNDCTL_DSP_RESET _IO ('P', 0) 417652Sjkh#define SNDCTL_DSP_SYNC _IO ('P', 1) 418652Sjkh#define SNDCTL_DSP_SPEED _IOWR('P', 2, int) 419652Sjkh#define SNDCTL_DSP_STEREO _IOWR('P', 3, int) 420652Sjkh#define SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int) 421652Sjkh#define SNDCTL_DSP_SAMPLESIZE _IOWR('P', 5, int) /* 8, 12 or 16 */ 422652Sjkh#define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int) 423652Sjkh#define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int) 424652Sjkh#define SNDCTL_DSP_POST _IO ('P', 8) 4251258Sswallace#define SNDCTL_DSP_SUBDIVIDE _IOWR('P', 9, int) 426652Sjkh 427652Sjkh#define SOUND_PCM_READ_RATE _IOR ('P', 2, int) 428652Sjkh#define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int) 429652Sjkh#define SOUND_PCM_READ_BITS _IOR ('P', 5, int) 430652Sjkh#define SOUND_PCM_READ_FILTER _IOR ('P', 7, int) 431652Sjkh 432652Sjkh/* Some alias names */ 433652Sjkh#define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SAMPLESIZE 434652Sjkh#define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED 435652Sjkh#define SOUND_PCM_POST SNDCTL_DSP_POST 436652Sjkh#define SOUND_PCM_RESET SNDCTL_DSP_RESET 437652Sjkh#define SOUND_PCM_SYNC SNDCTL_DSP_SYNC 4381258Sswallace#define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE 439652Sjkh 440652Sjkh/********************************************* 441652Sjkh * IOCTL commands for /dev/mixer 442652Sjkh */ 443652Sjkh 444652Sjkh/* 445652Sjkh * Mixer devices 446652Sjkh * 447652Sjkh * There can be up to 20 different analog mixer channels. The 448652Sjkh * SOUND_MIXER_NRDEVICES gives the currently supported maximum. 449652Sjkh * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells 450652Sjkh * the devices supported by the particular mixer. 451652Sjkh */ 452652Sjkh 453652Sjkh#define SOUND_MIXER_NRDEVICES 12 454652Sjkh#define SOUND_MIXER_VOLUME 0 455652Sjkh#define SOUND_MIXER_BASS 1 456652Sjkh#define SOUND_MIXER_TREBLE 2 457652Sjkh#define SOUND_MIXER_SYNTH 3 458652Sjkh#define SOUND_MIXER_PCM 4 459652Sjkh#define SOUND_MIXER_SPEAKER 5 460652Sjkh#define SOUND_MIXER_LINE 6 461652Sjkh#define SOUND_MIXER_MIC 7 462652Sjkh#define SOUND_MIXER_CD 8 463652Sjkh#define SOUND_MIXER_IMIX 9 /* Recording monitor */ 464652Sjkh#define SOUND_MIXER_ALTPCM 10 465652Sjkh#define SOUND_MIXER_RECLEV 11 /* Recording level */ 466652Sjkh 467652Sjkh/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */ 468652Sjkh/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ 469652Sjkh#define SOUND_ONOFF_MIN 28 470652Sjkh#define SOUND_ONOFF_MAX 30 471652Sjkh#define SOUND_MIXER_MUTE 28 /* 0 or 1 */ 472652Sjkh#define SOUND_MIXER_ENHANCE 29 /* Enhanced stereo (0, 40, 60 or 80) */ 473652Sjkh#define SOUND_MIXER_LOUD 30 /* 0 or 1 */ 474652Sjkh 475652Sjkh/* Note! Number 31 cannot be used since the sign bit is reserved */ 476652Sjkh 477652Sjkh#define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \ 478652Sjkh "Mic ", "CD ", "Mix ", "Pcm2 ", "rec"} 479652Sjkh 480652Sjkh#define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ 481652Sjkh "mic", "cd", "mix", "pcm2", "rec"} 482652Sjkh 483652Sjkh/* Device bitmask identifiers */ 484652Sjkh 485652Sjkh#define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */ 486652Sjkh#define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */ 487652Sjkh#define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */ 488652Sjkh#define SOUND_MIXER_CAPS 0xfc 489652Sjkh #define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */ 490652Sjkh#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ 491652Sjkh 492652Sjkh/* Device mask bits */ 493652Sjkh 494652Sjkh#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) 495652Sjkh#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) 496652Sjkh#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) 497652Sjkh#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) 498652Sjkh#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) 499652Sjkh#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) 500652Sjkh#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) 501652Sjkh#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) 502652Sjkh#define SOUND_MASK_CD (1 << SOUND_MIXER_CD) 503652Sjkh#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) 504652Sjkh#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) 505652Sjkh#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) 506652Sjkh 507652Sjkh#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) 508652Sjkh#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) 509652Sjkh#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) 510652Sjkh 511652Sjkh#define MIXER_READ(dev) _IOR('M', dev, int) 512652Sjkh#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) 513652Sjkh#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) 514652Sjkh#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) 515652Sjkh#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) 516652Sjkh#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) 517652Sjkh#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) 518652Sjkh#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) 519652Sjkh#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) 520652Sjkh#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) 521652Sjkh#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) 522652Sjkh#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) 523652Sjkh#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) 524652Sjkh#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) 525652Sjkh#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) 526652Sjkh#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) 527652Sjkh 528652Sjkh#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) 529652Sjkh#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) 530652Sjkh#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) 531652Sjkh#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) 532652Sjkh#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) 533652Sjkh 534652Sjkh#define MIXER_WRITE(dev) _IOWR('M', dev, int) 535652Sjkh#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) 536652Sjkh#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) 537652Sjkh#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) 538652Sjkh#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) 539652Sjkh#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) 540652Sjkh#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) 541652Sjkh#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) 542652Sjkh#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) 543652Sjkh#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) 544652Sjkh#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) 545652Sjkh#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) 546652Sjkh#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) 547652Sjkh#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) 548652Sjkh#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) 549652Sjkh#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) 550652Sjkh 551652Sjkh#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) 552652Sjkh 553652Sjkh/* 554652Sjkh * The following mixer ioctl calls are compatible with the BSD driver by 555652Sjkh * Steve Haehnichen <shaehnic@ucsd.edu> 556652Sjkh * 557652Sjkh * Since this interface is entirely SB specific, it will be dropped in the 558652Sjkh * near future. 559652Sjkh */ 560652Sjkh 561652Sjkhtypedef unsigned char S_BYTE; 562652Sjkhtypedef unsigned char S_FLAG; 563652Sjkhstruct stereo_vol 564652Sjkh{ 565652Sjkh S_BYTE l; /* Left volume */ 566652Sjkh S_BYTE r; /* Right volume */ 567652Sjkh}; 568652Sjkh 569652Sjkh#define MIXER_IOCTL_SET_LEVELS _IOW ('s', 20, struct sb_mixer_levels) 570652Sjkh#define MIXER_IOCTL_SET_PARAMS _IOW ('s', 21, struct sb_mixer_params) 571652Sjkh#define MIXER_IOCTL_READ_LEVELS _IOR ('s', 22, struct sb_mixer_levels) 572652Sjkh#define MIXER_IOCTL_READ_PARAMS _IOR ('s', 23, struct sb_mixer_params) 573652Sjkh#define MIXER_IOCTL_RESET _IO ('s', 24) 574652Sjkh 575652Sjkh/* 576652Sjkh * Mixer volume levels for MIXER_IOCTL_SET_VOL & MIXER_IOCTL_READ_VOL 577652Sjkh */ 578652Sjkhstruct sb_mixer_levels 579652Sjkh{ 580652Sjkh struct stereo_vol master; /* Master volume */ 581652Sjkh struct stereo_vol voc; /* DSP Voice volume */ 582652Sjkh struct stereo_vol fm; /* FM volume */ 583652Sjkh struct stereo_vol line; /* Line-in volume */ 584652Sjkh struct stereo_vol cd; /* CD audio */ 585652Sjkh S_BYTE mic; /* Microphone level */ 586652Sjkh}; 587652Sjkh 588652Sjkh/* 589652Sjkh * Mixer parameters for MIXER_IOCTL_SET_PARAMS & MIXER_IOCTL_READ_PARAMS 590652Sjkh */ 591652Sjkhstruct sb_mixer_params 592652Sjkh{ 593652Sjkh S_BYTE record_source; /* Recording source (See SRC_xxx below) */ 594652Sjkh S_FLAG hifreq_filter; /* Filter frequency (hi/low) */ 595652Sjkh S_FLAG filter_input; /* ANFI input filter */ 596652Sjkh S_FLAG filter_output; /* DNFI output filter */ 597652Sjkh S_FLAG dsp_stereo; /* 1 if DSP is in Stereo mode */ 598652Sjkh}; 599652Sjkh 600652Sjkh#define SRC_MIC 1 /* Select Microphone recording source */ 601652Sjkh#define SRC_CD 3 /* Select CD recording source */ 602652Sjkh#define SRC_LINE 7 /* Use Line-in for recording source */ 603652Sjkh 604652Sjkh#if !defined(KERNEL) && !defined(INKERNEL) 605652Sjkh/* 606652Sjkh * Some convenience macros to simplify programming of the 607652Sjkh * /dev/sequencer interface 608652Sjkh * 609652Sjkh * These macros define the API which should be used when possible. 610652Sjkh */ 611652Sjkh 612805Sachevoid seqbuf_dump(void); /* This function must be provided by programs */ 613652Sjkh 614652Sjkh/* Sample seqbuf_dump() implementation: 615652Sjkh * 616652Sjkh * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes 617652Sjkh * 618652Sjkh * int seqfd; -- The file descriptor for /dev/sequencer. 619652Sjkh * 620652Sjkh * void 621652Sjkh * seqbuf_dump () 622652Sjkh * { 623652Sjkh * if (_seqbufptr) 624652Sjkh * if (write (seqfd, _seqbuf, _seqbufptr) == -1) 625652Sjkh * { 626652Sjkh * perror ("write /dev/sequencer"); 627652Sjkh * exit (-1); 628652Sjkh * } 629652Sjkh * _seqbufptr = 0; 630652Sjkh * } 631652Sjkh */ 632652Sjkh 633652Sjkh#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len, _seqbufptr = 0 634652Sjkh#define SEQ_PM_DEFINES struct patmgr_info _pm_info 635652Sjkh#define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump() 636652Sjkh#define _SEQ_ADVBUF(len) _seqbufptr += len 637652Sjkh#define SEQ_DUMPBUF seqbuf_dump 638652Sjkh#define PM_LOAD_PATCH(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ 639652Sjkh _pm_info.device=dev, _pm_info.data.data8[0]=pgm, \ 640652Sjkh _pm_info.parm1 = bank, _pm_info.parm2 = 1, \ 641652Sjkh ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info)) 642652Sjkh#define PM_LOAD_PATCHES(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ 643652Sjkh _pm_info.device=dev, memcpy(_pm_info.data.data8, pgm, 128), \ 644652Sjkh _pm_info.parm1 = bank, _pm_info.parm2 = 128, \ 645652Sjkh ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info)) 646652Sjkh 647652Sjkh#define SEQ_START_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\ 648652Sjkh _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 649652Sjkh _seqbuf[_seqbufptr+1] = SEQ_NOTEON;\ 650652Sjkh _seqbuf[_seqbufptr+2] = (dev);\ 651652Sjkh _seqbuf[_seqbufptr+3] = (voice);\ 652652Sjkh _seqbuf[_seqbufptr+4] = (note);\ 653652Sjkh _seqbuf[_seqbufptr+5] = (vol);\ 654652Sjkh _seqbuf[_seqbufptr+6] = 0;\ 655652Sjkh _seqbuf[_seqbufptr+7] = 0;\ 656652Sjkh _SEQ_ADVBUF(8);} 657652Sjkh 658652Sjkh#define SEQ_STOP_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\ 659652Sjkh _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 660652Sjkh _seqbuf[_seqbufptr+1] = SEQ_NOTEOFF;\ 661652Sjkh _seqbuf[_seqbufptr+2] = (dev);\ 662652Sjkh _seqbuf[_seqbufptr+3] = (voice);\ 663652Sjkh _seqbuf[_seqbufptr+4] = (note);\ 664652Sjkh _seqbuf[_seqbufptr+5] = (vol);\ 665652Sjkh _seqbuf[_seqbufptr+6] = 0;\ 666652Sjkh _seqbuf[_seqbufptr+7] = 0;\ 667652Sjkh _SEQ_ADVBUF(8);} 668652Sjkh 669652Sjkh#define SEQ_CHN_PRESSURE(dev, voice, pressure) {_SEQ_NEEDBUF(8);\ 670652Sjkh _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 671652Sjkh _seqbuf[_seqbufptr+1] = SEQ_AFTERTOUCH;\ 672652Sjkh _seqbuf[_seqbufptr+2] = (dev);\ 673652Sjkh _seqbuf[_seqbufptr+3] = (voice);\ 674652Sjkh _seqbuf[_seqbufptr+4] = (pressure);\ 675652Sjkh _seqbuf[_seqbufptr+5] = 0;\ 676652Sjkh _seqbuf[_seqbufptr+6] = 0;\ 677652Sjkh _seqbuf[_seqbufptr+7] = 0;\ 678652Sjkh _SEQ_ADVBUF(8);} 679652Sjkh 680652Sjkh#define SEQ_PANNING(dev, voice, pos) {_SEQ_NEEDBUF(8);\ 681652Sjkh _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 682652Sjkh _seqbuf[_seqbufptr+1] = SEQ_BALANCE;\ 683652Sjkh _seqbuf[_seqbufptr+2] = (dev);\ 684652Sjkh _seqbuf[_seqbufptr+3] = (voice);\ 685652Sjkh (char)_seqbuf[_seqbufptr+4] = (pos);\ 686652Sjkh _seqbuf[_seqbufptr+5] = 0;\ 687652Sjkh _seqbuf[_seqbufptr+6] = 0;\ 688652Sjkh _seqbuf[_seqbufptr+7] = 0;\ 689652Sjkh _SEQ_ADVBUF(8);} 690652Sjkh 691652Sjkh#define SEQ_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\ 692652Sjkh _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 693652Sjkh _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\ 694652Sjkh _seqbuf[_seqbufptr+2] = (dev);\ 695652Sjkh _seqbuf[_seqbufptr+3] = (voice);\ 696652Sjkh _seqbuf[_seqbufptr+4] = (controller);\ 697652Sjkh *(short *)&_seqbuf[_seqbufptr+5] = (value);\ 698652Sjkh _seqbuf[_seqbufptr+7] = 0;\ 699652Sjkh _SEQ_ADVBUF(8);} 700652Sjkh 701652Sjkh#define SEQ_PITCHBEND(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER, value) 702652Sjkh#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value) 703652Sjkh#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_EXPRESSION, value) 704652Sjkh#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_MAIN_VOLUME, value) 705652Sjkh 706652Sjkh#define SEQ_START_TIMER() {_SEQ_NEEDBUF(4);\ 707652Sjkh _seqbuf[_seqbufptr] = SEQ_SYNCTIMER;\ 708652Sjkh _seqbuf[_seqbufptr+1] = 0;\ 709652Sjkh _seqbuf[_seqbufptr+2] = 0;\ 710652Sjkh _seqbuf[_seqbufptr+3] = 0;\ 711652Sjkh _SEQ_ADVBUF(4);} 712652Sjkh#define SEQ_SET_PATCH(dev, voice, patch) {_SEQ_NEEDBUF(8);\ 713652Sjkh _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 714652Sjkh _seqbuf[_seqbufptr+1] = SEQ_PGMCHANGE;\ 715652Sjkh _seqbuf[_seqbufptr+2] = (dev);\ 716652Sjkh _seqbuf[_seqbufptr+3] = (voice);\ 717652Sjkh _seqbuf[_seqbufptr+4] = (patch);\ 718652Sjkh _seqbuf[_seqbufptr+5] = 0;\ 719652Sjkh _seqbuf[_seqbufptr+6] = 0;\ 720652Sjkh _seqbuf[_seqbufptr+7] = 0;\ 721652Sjkh _SEQ_ADVBUF(8);} 722652Sjkh 723652Sjkh#define SEQ_WAIT_TIME(ticks) {_SEQ_NEEDBUF(4);\ 724652Sjkh *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_WAIT | ((ticks) << 8);\ 725652Sjkh _SEQ_ADVBUF(4);} 726652Sjkh 727652Sjkh#define SEQ_ECHO_BACK(key) {_SEQ_NEEDBUF(4);\ 728652Sjkh *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_ECHO | ((key) << 8);\ 729652Sjkh _SEQ_ADVBUF(4);} 730652Sjkh 731652Sjkh#define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\ 732652Sjkh _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\ 733652Sjkh _seqbuf[_seqbufptr+1] = (byte);\ 734652Sjkh _seqbuf[_seqbufptr+2] = (device);\ 735652Sjkh _seqbuf[_seqbufptr+3] = 0;\ 736652Sjkh _SEQ_ADVBUF(4);} 737652Sjkh#define SEQ_WRPATCH(patch, len) {if (_seqbufptr) seqbuf_dump();\ 738652Sjkh if (write(seqfd, (char*)(patch), len)==-1) \ 739652Sjkh perror("Write patch: /dev/sequencer");} 740652Sjkh 741652Sjkh#endif 742652Sjkhlong soundcard_init(long mem_start); 743719Swollman#endif /* _SOUNDCARD_H_ */ 744