130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright by Hannu Savolainen 1993-1997 330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Redistribution and use in source and binary forms, with or without 530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * modification, are permitted provided that the following conditions are 630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * met: 1. Redistributions of source code must retain the above copyright 730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * notice, this list of conditions and the following disclaimer. 2. 830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Redistributions in binary form must reproduce the above copyright notice, 930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * this list of conditions and the following disclaimer in the documentation 1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and/or other materials provided with the distribution. 1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY 1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SUCH DAMAGE. 2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _UAPISOUNDCARD_H 2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _UAPISOUNDCARD_H 2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * OSS interface version. With versions earlier than 3.6 this value is 3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * an integer with value less than 361. In versions 3.6 and later 3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * it's a six digit hexadecimal value. For example value 3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of 0x030600 represents OSS version 3.6.0. 3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Use ioctl(fd, OSS_GETVERSION, &int) to get the version number of 3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the currently active driver. 3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_VERSION 0x030802 3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define OPEN_SOUND_SYSTEM 3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* In Linux we need to be prepared for cross compiling */ 4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/ioctl.h> 4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Endian macros. */ 4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef __KERNEL__ 4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# include <endian.h> 4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif 4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Supported card ID numbers (Should be somewhere else?) 4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_ADLIB 1 5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SB 2 5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PAS 3 5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_GUS 4 5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MPU401 5 5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SB16 6 5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SB16MIDI 7 5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_UART6850 8 5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_GUS16 9 6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MSS 10 6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSS 11 6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SSCAPE 12 6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSS_MPU 13 6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSS_MSS 14 6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_SSCAPE_MSS 15 6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_TRXPRO 16 6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_TRXPRO_SB 17 6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_TRXPRO_MPU 18 6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MAD16 19 7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MAD16_MPU 20 7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_CS4232 21 7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_CS4232_MPU 22 7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_MAUI 23 7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_PSEUDO_MSS 24 7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_GUSPNP 25 7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCARD_UART401 26 7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Sound card numbers 27 to N are reserved. Don't add more numbers here. */ 7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*********************************** 8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IOCTL Commands for /dev/sequencer 8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _SIOWR 8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#if defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__sparc__) && !defined(__INCioctlh) && !defined(__Lynx__))) 8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Use already defined ioctl defines if they exist (except with Sun or Sparc) */ 8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOCPARM_MASK IOCPARM_MASK 8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_VOID IOC_VOID 8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_OUT IOC_OUT 8930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_IN IOC_IN 9030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_INOUT IOC_INOUT 9130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_SIZE _IOC_SIZE 9230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_DIR _IOC_DIR 9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_NONE _IOC_NONE 9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_READ _IOC_READ 9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_WRITE _IOC_WRITE 9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIO _IO 9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOR _IOR 9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOW _IOW 9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOWR _IOWR 10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#else 10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Ioctl's have the command encoded in the lower word, 10330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and the size of any in or out parameters in the upper 10430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * word. The high 2 bits of the upper word are used 10530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * to encode the in/out status of the parameter; for now 10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * we restrict parameters to at most 8191 bytes. 10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* #define SIOCTYPE (0xff<<8) */ 10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */ 11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_VOID 0x00000000 /* no parameters */ 11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_OUT 0x20000000 /* copy out parameters */ 11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_IN 0x40000000 /* copy in parameters */ 11330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SIOC_INOUT (SIOC_IN|SIOC_OUT) 11430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* the 0x20000000 is so we can distinguish new ioctl's from old */ 11530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIO(x,y) ((int)(SIOC_VOID|(x<<8)|y)) 11630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOR(x,y,t) ((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) 11730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOW(x,y,t) ((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) 11830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* this should be _SIORW, but stdio got there first */ 11930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOWR(x,y,t) ((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) 12030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_SIZE(x) ((x>>16)&SIOCPARM_MASK) 12130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_DIR(x) (x & 0xf0000000) 12230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_NONE SIOC_VOID 12330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_READ SIOC_OUT 12430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SIOC_WRITE SIOC_IN 12530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# endif /* _IOWR */ 12630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* !_SIOWR */ 12730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 12830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_RESET _SIO ('Q', 0) 12930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_SYNC _SIO ('Q', 1) 13030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_INFO _SIOWR('Q', 2, struct synth_info) 13130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_CTRLRATE _SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */ 13230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_GETOUTCOUNT _SIOR ('Q', 4, int) 13330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_GETINCOUNT _SIOR ('Q', 5, int) 13430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_PERCMODE _SIOW ('Q', 6, int) 13530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_FM_LOAD_INSTR _SIOW ('Q', 7, struct sbi_instrument) /* Obsolete. Don't use!!!!!! */ 13630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_TESTMIDI _SIOW ('Q', 8, int) 13730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_RESETSAMPLES _SIOW ('Q', 9, int) 13830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_NRSYNTHS _SIOR ('Q',10, int) 13930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_NRMIDIS _SIOR ('Q',11, int) 14030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_INFO _SIOWR('Q',12, struct midi_info) 14130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_THRESHOLD _SIOW ('Q',13, int) 14230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_MEMAVL _SIOWR('Q',14, int) /* in=dev#, out=memsize */ 14330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_FM_4OP_ENABLE _SIOW ('Q',15, int) /* in=dev# */ 14430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_PANIC _SIO ('Q',17) 14530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_OUTOFBAND _SIOW ('Q',18, struct seq_event_rec) 14630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SEQ_GETTIME _SIOR ('Q',19, int) 14730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_ID _SIOWR('Q',20, struct synth_info) 14830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_CONTROL _SIOWR('Q',21, struct synth_control) 14930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_SYNTH_REMOVESAMPLE _SIOWR('Q',22, struct remove_sample) 15030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 15130692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct synth_control 15230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{ 15330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int devno; /* Synthesizer # */ 15430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char data[4000]; /* Device spesific command/data record */ 15530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng}synth_control; 15630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 15730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct remove_sample 15830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{ 15930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int devno; /* Synthesizer # */ 16030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int bankno; /* MIDI bank # (0=General MIDI) */ 16130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int instrno; /* MIDI instrument number */ 16230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} remove_sample; 16330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 16430692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct seq_event_rec { 16530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char arr[8]; 16630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} seq_event_rec; 16730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 16830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_TIMEBASE _SIOWR('T', 1, int) 16930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_START _SIO ('T', 2) 17030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_STOP _SIO ('T', 3) 17130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_CONTINUE _SIO ('T', 4) 17230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_TEMPO _SIOWR('T', 5, int) 17330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_SOURCE _SIOWR('T', 6, int) 17430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define TMR_INTERNAL 0x00000001 17530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define TMR_EXTERNAL 0x00000002 17630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define TMR_MODE_MIDI 0x00000010 17730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define TMR_MODE_FSK 0x00000020 17830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define TMR_MODE_CLS 0x00000040 17930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define TMR_MODE_SMPTE 0x00000080 18030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_METRONOME _SIOW ('T', 7, int) 18130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_TMR_SELECT _SIOW ('T', 8, int) 18230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 18330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 18430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Some big endian/little endian handling macros 18530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 18630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 18730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _LINUX_PATCHKEY_H_INDIRECT 18830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/patchkey.h> 18930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#undef _LINUX_PATCHKEY_H_INDIRECT 19030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 19130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#if !defined(__KERNEL__) 19230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# if defined(__BYTE_ORDER) 19330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# if __BYTE_ORDER == __BIG_ENDIAN 19430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_S16_NE AFMT_S16_BE 19530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# elif __BYTE_ORDER == __LITTLE_ENDIAN 19630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_S16_NE AFMT_S16_LE 19730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# else 19830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# error "could not determine byte order" 19930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# endif 20030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# endif 20130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif 20230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 20330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 20430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Sample loading mechanism for internal synthesizers (/dev/sequencer) 20530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The following patch_info structure has been designed to support 20630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Gravis UltraSound. It tries to be universal format for uploading 20730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * sample based patches but is probably too limited. 20830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 20930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (PBD) As Hannu guessed, the GUS structure is too limited for 21030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the WaveFront, but this is the right place for a constant definition. 21130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 21230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 21330692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct patch_info { 21430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned short key; /* Use WAVE_PATCH here */ 21530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_PATCH _PATCHKEY(0x04) 21630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define GUS_PATCH WAVE_PATCH 21730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVEFRONT_PATCH _PATCHKEY(0x06) 21830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 21930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng short device_no; /* Synthesizer number */ 22030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng short instr_no; /* Midi pgm# */ 22130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 22230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int mode; 22330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 22430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The least significant byte has the same format than the GUS .PAT 22530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * files 22630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 22730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ 22830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ 22930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ 23030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ 23130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ 23230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3)*/ 23330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ 23430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_FAST_RELEASE 0x80 /* bit 7 = Shut off immediately after note off */ 23530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* (use the env_rate/env_offs fields). */ 23630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Linux specific bits */ 23730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ 23830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ 23930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_SCALE 0x00040000 /* The scaling info is valid */ 24030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_FRACTIONS 0x00080000 /* Fraction information is valid */ 24130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Reserved bits */ 24230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_ROM 0x40000000 /* For future use */ 24330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define WAVE_MULAW 0x20000000 /* For future use */ 24430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Other bits must be zeroed */ 24530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 24630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int len; /* Size of the wave data in bytes */ 24730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int loop_start, loop_end; /* Byte offsets from the beginning */ 24830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 24930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 25030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The base_freq and base_note fields are used when computing the 25130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * playback speed for a note. The base_note defines the tone frequency 25230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * which is heard if the sample is played using the base_freq as the 25330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * playback speed. 25430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 25530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The low_note and high_note fields define the minimum and maximum note 25630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * frequencies for which this sample is valid. It is possible to define 25730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * more than one samples for an instrument number at the same time. The 25830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * low_note and high_note fields are used to select the most suitable one. 25930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 26030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The fields base_note, high_note and low_note should contain 26130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the note frequency multiplied by 1000. For example value for the 26230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * middle A is 440*1000. 26330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 26430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 26530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int base_freq; 26630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int base_note; 26730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int high_note; 26830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int low_note; 26930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int panning; /* -128=left, 127=right */ 27030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int detuning; 27130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 27230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* New fields introduced in version 1.99.5 */ 27330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 27430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ 27530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char env_rate[ 6 ]; /* GUS HW ramping rate */ 27630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char env_offset[ 6 ]; /* 255 == 100% */ 27730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 27830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* 27930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The tremolo, vibrato and scale info are not supported yet. 28030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or 28130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * WAVE_SCALE 28230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 28330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 28430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char tremolo_sweep; 28530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char tremolo_rate; 28630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char tremolo_depth; 28730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 28830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char vibrato_sweep; 28930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char vibrato_rate; 29030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char vibrato_depth; 29130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 29230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int scale_frequency; 29330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */ 29430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 29530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int volume; 29630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int fractions; 29730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int reserved1; 29830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int spare[2]; 29930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char data[1]; /* The waveform data starts here */ 30030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng }; 30130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 30230692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct sysex_info { 30330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng short key; /* Use SYSEX_PATCH or MAUI_PATCH here */ 30430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYSEX_PATCH _PATCHKEY(0x05) 30530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MAUI_PATCH _PATCHKEY(0x06) 30630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng short device_no; /* Synthesizer number */ 30730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int len; /* Size of the sysex data in bytes */ 30830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char data[1]; /* Sysex data starts here */ 30930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng }; 31030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 31130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 31230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * /dev/sequencer input events. 31330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 31430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The data written to the /dev/sequencer is a stream of events. Events 31530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are records of 4 or 8 bytes. The first byte defines the size. 31630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Any number of events can be written with a write call. There 31730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * is a set of macros for sending these events. Use these macros if you 31830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * want to maximize portability of your program. 31930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 32030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. 32130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (All input events are currently 4 bytes long. Be prepared to support 32230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 8 byte events also. If you receive any event having first byte >= 128, 32330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * it's a 8 byte event. 32430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 32530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The events are documented at the end of this file. 32630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 32730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Normal events (4 bytes) 32830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * There is also a 8 byte version of most of the 4 byte events. The 32930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 8 byte one is recommended. 33030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 33130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_NOTEOFF 0 33230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ 33330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_NOTEON 1 33430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_FMNOTEON SEQ_NOTEON 33530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WAIT TMR_WAIT_ABS 33630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PGMCHANGE 3 33730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_FMPGMCHANGE SEQ_PGMCHANGE 33830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SYNCTIMER TMR_START 33930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_MIDIPUTC 5 34030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DRUMON 6 /*** OBSOLETE ***/ 34130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ 34230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_ECHO TMR_ECHO /* For synching programs with output */ 34330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_AFTERTOUCH 9 34430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CONTROLLER 10 34530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 34630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/******************************************* 34730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Midi controller numbers 34830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng ******************************************* 34930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Controllers 0 to 31 (0x00 to 0x1f) and 35030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 32 to 63 (0x20 to 0x3f) are continuous 35130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * controllers. 35230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * In the MIDI 1.0 these controllers are sent using 35330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * two messages. Controller numbers 0 to 31 are used 35430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * to send the MSB and the controller numbers 32 to 63 35530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are for the LSB. Note that just 7 bits are used in MIDI bytes. 35630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 35730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 35830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_BANK_SELECT 0x00 35930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_MODWHEEL 0x01 36030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_BREATH 0x02 36130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x03 */ 36230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_FOOT 0x04 36330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_PORTAMENTO_TIME 0x05 36430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_DATA_ENTRY 0x06 36530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_MAIN_VOLUME 0x07 36630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_BALANCE 0x08 36730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x09 */ 36830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_PAN 0x0a 36930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_EXPRESSION 0x0b 37030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x0c */ 37130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x0d */ 37230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x0e */ 37330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x0f */ 37430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE1 0x10 37530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE2 0x11 37630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE3 0x12 37730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE4 0x13 37830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x14 - 0x1f */ 37930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 38030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x20 */ 38130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* The controller numbers 0x21 to 0x3f are reserved for the */ 38230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* least significant bytes of the controllers 0x00 to 0x1f. */ 38330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* These controllers are not recognised by the driver. */ 38430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 38530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */ 38630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 0=OFF and 127=ON (intermediate values are possible) */ 38730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_DAMPER_PEDAL 0x40 38830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_SUSTAIN 0x40 /* Alias */ 38930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_HOLD 0x40 /* Alias */ 39030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_PORTAMENTO 0x41 39130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_SOSTENUTO 0x42 39230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_SOFT_PEDAL 0x43 39330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x44 */ 39430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_HOLD2 0x45 39530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x46 - 0x4f */ 39630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 39730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE5 0x50 39830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE6 0x51 39930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE7 0x52 40030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_GENERAL_PURPOSE8 0x53 40130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x54 - 0x5a */ 40230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_EXT_EFF_DEPTH 0x5b 40330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_TREMOLO_DEPTH 0x5c 40430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_CHORUS_DEPTH 0x5d 40530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_DETUNE_DEPTH 0x5e 40630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_CELESTE_DEPTH 0x5e /* Alias for the above one */ 40730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_PHASER_DEPTH 0x5f 40830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_DATA_INCREMENT 0x60 40930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_DATA_DECREMENT 0x61 41030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_NONREG_PARM_NUM_LSB 0x62 41130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_NONREG_PARM_NUM_MSB 0x63 41230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_REGIST_PARM_NUM_LSB 0x64 41330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTL_REGIST_PARM_NUM_MSB 0x65 41430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* undefined 0x66 - 0x78 */ 41530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* reserved 0x79 - 0x7f */ 41630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 41730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Pseudo controllers (not midi compatible) */ 41830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTRL_PITCH_BENDER 255 41930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTRL_PITCH_BENDER_RANGE 254 42030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTRL_EXPRESSION 253 /* Obsolete */ 42130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CTRL_MAIN_VOLUME 252 /* Obsolete */ 42230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_BALANCE 11 42330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_VOLMODE 12 42430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 42530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 42630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Volume mode decides how volumes are used 42730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 42830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 42930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define VOL_METHOD_ADAGIO 1 43030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define VOL_METHOD_LINEAR 2 43130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 43230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 43330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as 43430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * input events. 43530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 43630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 43730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 43830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Event codes 0xf0 to 0xfc are reserved for future extensions. 43930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 44030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 44130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_FULLSIZE 0xfd /* Long events */ 44230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 44330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SEQ_FULLSIZE events are used for loading patches/samples to the 44430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * synthesizer devices. These events are passed directly to the driver 44530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of the associated synthesizer device. There is no limit to the size 44630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of the extended events. These events are not queued but executed 44730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * immediately when the write() is called (execution can take several 44830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * seconds of time). 44930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 45030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * When a SEQ_FULLSIZE message is written to the device, it must 45130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * be written using exactly one write() call. Other events cannot 45230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * be mixed to the same write. 45330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 45430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the 45530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * /dev/sequencer. Don't write other data together with the instrument structure 45630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Set the key field of the structure to FM_PATCH. The device field is used to 45730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * route the patch to the corresponding device. 45830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 45930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * For wave table use struct patch_info. Initialize the key field 46030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * to WAVE_PATCH. 46130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 46230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ 46330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */ 46430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 46530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 46630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Record for FM patches 46730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 46830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 46930692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef unsigned char sbi_instr_data[32]; 47030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 47130692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct sbi_instrument { 47230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned short key; /* FM_PATCH or OPL3_PATCH */ 47330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define FM_PATCH _PATCHKEY(0x01) 47430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define OPL3_PATCH _PATCHKEY(0x03) 47530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng short device; /* Synth# (0-4) */ 47630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int channel; /* Program# to be initialized */ 47730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */ 47830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng }; 47930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 48030692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct synth_info { /* Read only */ 48130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char name[30]; 48230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int device; /* 0-N. INITIALIZE BEFORE CALLING */ 48330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int synth_type; 48430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_TYPE_FM 0 48530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_TYPE_SAMPLE 1 48630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_TYPE_MIDI 2 /* Midi interface */ 48730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 48830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int synth_subtype; 48930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define FM_TYPE_ADLIB 0x00 49030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define FM_TYPE_OPL3 0x01 49130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_TYPE_MPU401 0x401 49230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 49330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SAMPLE_TYPE_BASIC 0x10 49430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC 49530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SAMPLE_TYPE_WAVEFRONT 0x11 49630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 49730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int perc_mode; /* No longer supported */ 49830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int nr_voices; 49930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int nr_drums; /* Obsolete field */ 50030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int instr_bank_size; 50130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int capabilities; 50230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ 50330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ 50430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */ 50530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int dummies[19]; /* Reserve space */ 50630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng }; 50730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 50830692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct sound_timer_info { 50930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char name[32]; 51030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int caps; 51130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng }; 51230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 51330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_CAP_MPU401 1 /* MPU-401 intelligent mode */ 51430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 51530692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct midi_info { 51630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char name[30]; 51730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int device; /* 0-N. INITIALIZE BEFORE CALLING */ 51830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned int capabilities; /* To be defined later */ 51930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int dev_type; 52030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int dummies[18]; /* Reserve space */ 52130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng }; 52230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 52330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/******************************************** 52430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ioctl commands for the /dev/midi## 52530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 52630692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct { 52730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char cmd; 52830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char nr_args, nr_returns; 52930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char data[30]; 53030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } mpu_command_rec; 53130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 53230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_PRETIME _SIOWR('m', 0, int) 53330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_MPUMODE _SIOWR('m', 1, int) 53430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_MIDI_MPUCMD _SIOWR('m', 2, mpu_command_rec) 53530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 53630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/******************************************** 53730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IOCTL commands for /dev/dsp and /dev/audio 53830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 53930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 54030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_RESET _SIO ('P', 0) 54130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SYNC _SIO ('P', 1) 54230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SPEED _SIOWR('P', 2, int) 54330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_STEREO _SIOWR('P', 3, int) 54430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETBLKSIZE _SIOWR('P', 4, int) 54530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT 54630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_CHANNELS _SIOWR('P', 6, int) 54730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_CHANNELS SNDCTL_DSP_CHANNELS 54830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_FILTER _SIOWR('P', 7, int) 54930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_POST _SIO ('P', 8) 55030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SUBDIVIDE _SIOWR('P', 9, int) 55130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETFRAGMENT _SIOWR('P',10, int) 55230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 55330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */ 55430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETFMTS _SIOR ('P',11, int) /* Returns a mask */ 55530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETFMT _SIOWR('P',5, int) /* Selects ONE fmt*/ 55630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_QUERY 0x00000000 /* Return current fmt */ 55730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_MU_LAW 0x00000001 55830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_A_LAW 0x00000002 55930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_IMA_ADPCM 0x00000004 56030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_U8 0x00000008 56130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_S16_LE 0x00000010 /* Little endian signed 16*/ 56230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_S16_BE 0x00000020 /* Big endian signed 16 */ 56330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_S8 0x00000040 56430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_U16_LE 0x00000080 /* Little endian U16 */ 56530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_U16_BE 0x00000100 /* Big endian U16 */ 56630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_MPEG 0x00000200 /* MPEG (2) audio */ 56730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define AFMT_AC3 0x00000400 /* Dolby Digital AC3 */ 56830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 56930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 57030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Buffer status queries. 57130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 57230692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct audio_buf_info { 57330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int fragments; /* # of available fragments (partially usend ones not counted) */ 57430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int fragstotal; /* Total # of fragments allocated */ 57530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int fragsize; /* Size of a fragment in bytes */ 57630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 57730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int bytes; /* Available space in bytes (includes partially used fragments) */ 57830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* Note! 'bytes' could be more than fragments*fragsize */ 57930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } audio_buf_info; 58030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 58130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETOSPACE _SIOR ('P',12, audio_buf_info) 58230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETISPACE _SIOR ('P',13, audio_buf_info) 58330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_NONBLOCK _SIO ('P',14) 58430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETCAPS _SIOR ('P',15, int) 58530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_REVISION 0x000000ff /* Bits for revision level (0 to 255) */ 58630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */ 58730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_REALTIME 0x00000200 /* Real time capability */ 58830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_BATCH 0x00000400 /* Device has some kind of */ 58930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* internal buffers which may */ 59030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* cause some delays and */ 59130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* decrease precision of timing */ 59230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_COPROC 0x00000800 /* Has a coprocessor */ 59330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* Sometimes it's a DSP */ 59430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng /* but usually not */ 59530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */ 59630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_MMAP 0x00002000 /* Supports mmap() */ 59730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_MULTI 0x00004000 /* support multiple open */ 59830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_CAP_BIND 0x00008000 /* channel binding to front/rear/cneter/lfe */ 59930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 60030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 60130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETTRIGGER _SIOR ('P',16, int) 60230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETTRIGGER _SIOW ('P',16, int) 60330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define PCM_ENABLE_INPUT 0x00000001 60430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define PCM_ENABLE_OUTPUT 0x00000002 60530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 60630692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct count_info { 60730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int bytes; /* Total # of bytes processed */ 60830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int blocks; /* # of fragment transitions since last time */ 60930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int ptr; /* Current DMA pointer value */ 61030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } count_info; 61130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 61230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETIPTR _SIOR ('P',17, count_info) 61330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETOPTR _SIOR ('P',18, count_info) 61430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 61530692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct buffmem_desc { 61630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned *buffer; 61730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int size; 61830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } buffmem_desc; 61930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_MAPINBUF _SIOR ('P', 19, buffmem_desc) 62030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_MAPOUTBUF _SIOR ('P', 20, buffmem_desc) 62130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETSYNCRO _SIO ('P', 21) 62230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETDUPLEX _SIO ('P', 22) 62330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETODELAY _SIOR ('P', 23, int) 62430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 62530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETCHANNELMASK _SIOWR('P', 64, int) 62630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_BIND_CHANNEL _SIOWR('P', 65, int) 62730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_QUERY 0x00000000 62830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_FRONT 0x00000001 62930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_SURR 0x00000002 63030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_CENTER_LFE 0x00000004 63130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_HANDSET 0x00000008 63230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_MIC 0x00000010 63330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_MODEM1 0x00000020 63430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_MODEM2 0x00000040 63530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_I2S 0x00000080 63630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define DSP_BIND_SPDIF 0x00000100 63730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 63830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_SETSPDIF _SIOW ('P', 66, int) 63930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_GETSPDIF _SIOR ('P', 67, int) 64030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_PRO 0x0001 64130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_N_AUD 0x0002 64230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_COPY 0x0004 64330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_PRE 0x0008 64430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_CC 0x07f0 64530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_L 0x0800 64630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_DRS 0x4000 64730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SPDIF_V 0x8000 64830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 64930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 65030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Application's profile defines the way how playback underrun situations should be handled. 65130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 65230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the 65330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * playback buffer whenever an underrun occurs. This consumes some time 65430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * prevents looping the existing buffer. 65530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * APF_CPUINTENS is intended to be set by CPU intensive applications which 65630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are likely to run out of time occasionally. In this mode the buffer cleanup is 65730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * disabled which saves CPU time but also let's the previous buffer content to 65830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * be played during the "pause" after the underrun. 65930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 66030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_DSP_PROFILE _SIOW ('P', 23, int) 66130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define APF_NORMAL 0 /* Normal applications */ 66230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define APF_NETWORK 1 /* Underruns probably caused by an "external" delay */ 66330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define APF_CPUINTENS 2 /* Underruns probably caused by "overheating" the CPU */ 66430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 66530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_RATE _SIOR ('P', 2, int) 66630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_CHANNELS _SIOR ('P', 6, int) 66730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_BITS _SIOR ('P', 5, int) 66830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_READ_FILTER _SIOR ('P', 7, int) 66930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 67030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Some alias names */ 67130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SETFMT 67230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED 67330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_POST SNDCTL_DSP_POST 67430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_RESET SNDCTL_DSP_RESET 67530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SYNC SNDCTL_DSP_SYNC 67630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE 67730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETFRAGMENT SNDCTL_DSP_SETFRAGMENT 67830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETFMTS SNDCTL_DSP_GETFMTS 67930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETFMT SNDCTL_DSP_SETFMT 68030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETOSPACE SNDCTL_DSP_GETOSPACE 68130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETISPACE SNDCTL_DSP_GETISPACE 68230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_NONBLOCK SNDCTL_DSP_NONBLOCK 68330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETCAPS SNDCTL_DSP_GETCAPS 68430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETTRIGGER SNDCTL_DSP_GETTRIGGER 68530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETTRIGGER SNDCTL_DSP_SETTRIGGER 68630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_SETSYNCRO SNDCTL_DSP_SETSYNCRO 68730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETIPTR SNDCTL_DSP_GETIPTR 68830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_GETOPTR SNDCTL_DSP_GETOPTR 68930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_MAPINBUF SNDCTL_DSP_MAPINBUF 69030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_PCM_MAPOUTBUF SNDCTL_DSP_MAPOUTBUF 69130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 69230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 69330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ioctl calls to be used in communication with coprocessors and 69430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * DSP chips. 69530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 69630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 69730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct copr_buffer { 69830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int command; /* Set to 0 if not used */ 69930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int flags; 70030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CPF_NONE 0x0000 70130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CPF_FIRST 0x0001 /* First block */ 70230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CPF_LAST 0x0002 /* Last block */ 70330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int len; 70430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int offs; /* If required by the device (0 if not used) */ 70530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 70630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char data[4000]; /* NOTE! 4000 is not 4k */ 70730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } copr_buffer; 70830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 70930692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct copr_debug_buf { 71030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int command; /* Used internally. Set to 0 */ 71130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int parm1; 71230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int parm2; 71330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int flags; 71430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int len; /* Length of data in bytes */ 71530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } copr_debug_buf; 71630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 71730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct copr_msg { 71830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int len; 71930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char data[4000]; 72030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng } copr_msg; 72130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 72230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RESET _SIO ('C', 0) 72330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_LOAD _SIOWR('C', 1, copr_buffer) 72430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RDATA _SIOWR('C', 2, copr_debug_buf) 72530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RCODE _SIOWR('C', 3, copr_debug_buf) 72630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_WDATA _SIOW ('C', 4, copr_debug_buf) 72730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_WCODE _SIOW ('C', 5, copr_debug_buf) 72830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RUN _SIOWR('C', 6, copr_debug_buf) 72930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_HALT _SIOWR('C', 7, copr_debug_buf) 73030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_SENDMSG _SIOWR('C', 8, copr_msg) 73130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SNDCTL_COPR_RCVMSG _SIOR ('C', 9, copr_msg) 73230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 73330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/********************************************* 73430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IOCTL commands for /dev/mixer 73530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 73630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 73730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 73830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Mixer devices 73930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 74030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * There can be up to 20 different analog mixer channels. The 74130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SOUND_MIXER_NRDEVICES gives the currently supported maximum. 74230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells 74330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the devices supported by the particular mixer. 74430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 74530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 74630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_NRDEVICES 25 74730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_VOLUME 0 74830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_BASS 1 74930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_TREBLE 2 75030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_SYNTH 3 75130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PCM 4 75230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_SPEAKER 5 75330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE 6 75430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_MIC 7 75530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_CD 8 75630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_IMIX 9 /* Recording monitor */ 75730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_ALTPCM 10 75830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RECLEV 11 /* Recording level */ 75930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_IGAIN 12 /* Input gain */ 76030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_OGAIN 13 /* Output gain */ 76130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 76230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The AD1848 codec and compatibles have three line level inputs 76330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (line, aux1 and aux2). Since each card manufacturer have assigned 76430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * different meanings to these inputs, it's inpractical to assign 76530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * specific meanings (line, cd, synth etc.) to them. 76630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 76730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */ 76830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */ 76930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */ 77030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DIGITAL1 17 /* Digital (input) 1 */ 77130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DIGITAL2 18 /* Digital (input) 2 */ 77230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DIGITAL3 19 /* Digital (input) 3 */ 77330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PHONEIN 20 /* Phone input */ 77430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PHONEOUT 21 /* Phone output */ 77530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */ 77630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RADIO 23 /* Radio in */ 77730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_MONITOR 24 /* Monitor (usually mic) volume */ 77830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 77930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */ 78030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ 78130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_ONOFF_MIN 28 78230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_ONOFF_MAX 30 78330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 78430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Note! Number 31 cannot be used since the sign bit is reserved */ 78530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_NONE 31 78630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 78730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 78830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The following unsupported macros are no longer functional. 78930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Use SOUND_MIXER_PRIVATE# macros in future. 79030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 79130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE 79230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_MUTE SOUND_MIXER_NONE 79330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_LOUD SOUND_MIXER_NONE 79430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 79530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 79630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \ 79730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \ 79830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng "Line1", "Line2", "Line3", "Digital1", "Digital2", "Digital3", \ 79930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng "PhoneIn", "PhoneOut", "Video", "Radio", "Monitor"} 80030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 80130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ 80230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \ 80330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng "line1", "line2", "line3", "dig1", "dig2", "dig3", \ 80430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng "phin", "phout", "video", "radio", "monitor"} 80530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 80630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Device bitmask identifiers */ 80730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 80830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */ 80930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */ 81030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */ 81130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_CAPS 0xfc 81230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */ 81330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ 81430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_OUTSRC 0xfa /* Arg contains a bit for each input source to output */ 81530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_OUTMASK 0xf9 /* Arg contains a bit for each supported input source to output */ 81630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 81730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Device mask bits */ 81830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 81930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) 82030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) 82130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) 82230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) 82330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) 82430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) 82530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) 82630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) 82730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_CD (1 << SOUND_MIXER_CD) 82830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) 82930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) 83030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) 83130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN) 83230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN) 83330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1) 83430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2) 83530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3) 83630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1) 83730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2) 83830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3) 83930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_PHONEIN (1 << SOUND_MIXER_PHONEIN) 84030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_PHONEOUT (1 << SOUND_MIXER_PHONEOUT) 84130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO) 84230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO) 84330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_MONITOR (1 << SOUND_MIXER_MONITOR) 84430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 84530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Obsolete macros */ 84630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) 84730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) 84830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) 84930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 85030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIXER_READ(dev) _SIOR('M', dev, int) 85130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) 85230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) 85330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) 85430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) 85530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) 85630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) 85730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) 85830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) 85930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) 86030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) 86130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) 86230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) 86330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN) 86430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN) 86530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1) 86630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2) 86730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3) 86830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 86930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Obsolete macros */ 87030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) 87130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) 87230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) 87330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 87430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) 87530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) 87630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) 87730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) 87830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) 87930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 88030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIXER_WRITE(dev) _SIOWR('M', dev, int) 88130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) 88230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) 88330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) 88430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) 88530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) 88630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) 88730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) 88830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) 88930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) 89030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) 89130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) 89230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) 89330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN) 89430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN) 89530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1) 89630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2) 89730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3) 89830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 89930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Obsolete macros */ 90030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) 90130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) 90230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) 90330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 90430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) 90530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 90630692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct mixer_info 90730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{ 90830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char id[16]; 90930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char name[32]; 91030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int modify_counter; 91130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int fillers[10]; 91230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} mixer_info; 91330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 91430692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct _old_mixer_info /* Obsolete */ 91530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng{ 91630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char id[16]; 91730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char name[32]; 91830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} _old_mixer_info; 91930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 92030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_INFO _SIOR ('M', 101, mixer_info) 92130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_OLD_MIXER_INFO _SIOR ('M', 101, _old_mixer_info) 92230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 92330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 92430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * A mechanism for accessing "proprietary" mixer features. This method 92530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * permits passing 128 bytes of arbitrary data between a mixer application 92630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and the mixer driver. Interpretation of the record is defined by 92730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the particular mixer driver. 92830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 92930692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef unsigned char mixer_record[128]; 93030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 93130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_ACCESS _SIOWR('M', 102, mixer_record) 93230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 93330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 93430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Two ioctls for special souncard function 93530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 93630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_AGC _SIOWR('M', 103, int) 93730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_3DSE _SIOWR('M', 104, int) 93830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 93930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 94030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers. 94130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * These features can be used when accessing device specific features. 94230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 94330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE1 _SIOWR('M', 111, int) 94430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE2 _SIOWR('M', 112, int) 94530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE3 _SIOWR('M', 113, int) 94630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE4 _SIOWR('M', 114, int) 94730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_PRIVATE5 _SIOWR('M', 115, int) 94830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 94930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 95030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used 95130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * for querying current mixer settings from the driver and for loading 95230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * default volume settings _prior_ activating the mixer (loading 95330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * doesn't affect current state of the mixer hardware). These calls 95430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * are for internal use only. 95530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 95630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 95730692c65c4174412c90e79489e98ab85c1a7412fBen Chengtypedef struct mixer_vol_table { 95830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int num; /* Index to volume table */ 95930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng char name[32]; 96030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng int levels[32]; 96130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng} mixer_vol_table; 96230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 96330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_GETLEVELS _SIOWR('M', 116, mixer_vol_table) 96430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOUND_MIXER_SETLEVELS _SIOWR('M', 117, mixer_vol_table) 96530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 96630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 96730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * An ioctl for identifying the driver version. It will return value 96830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of the SOUND_VERSION macro used when compiling the driver. 96930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This call was introduced in OSS version 3.6 and it will not work 97030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * with earlier versions (returns EINVAL). 97130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 97230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define OSS_GETVERSION _SIOR ('M', 118, int) 97330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 97430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 97530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Level 2 event types for /dev/sequencer 97630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 97730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 97830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 97930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The 4 most significant bits of byte 0 specify the class of 98030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the event: 98130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 98230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 0x8X = system level events, 98330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 0x9X = device/port specific events, event[1] = device/port, 98430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The last 4 bits give the subtype: 98530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 0x02 = Channel event (event[3] = chn). 98630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 0x01 = note event (event[4] = note). 98730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * (0x01 is not used alone but always with bit 0x02). 98830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * event[2] = MIDI message code (0x80=note off etc.) 98930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 99030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 99130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 99230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_SEQ_LOCAL 0x80 99330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_TIMING 0x81 99430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_CHN_COMMON 0x92 99530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_CHN_VOICE 0x93 99630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define EV_SYSEX 0x94 99730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 99830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Event types 200 to 220 are reserved for application use. 99930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * These numbers will not be used by the driver. 100030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 100130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 100230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 100330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events for event type EV_CHN_VOICE 100430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 100530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 100630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_NOTEOFF 0x80 100730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_NOTEON 0x90 100830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_KEY_PRESSURE 0xA0 100930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 101030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 101130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events for event type EV_CHN_COMMON 101230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 101330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 101430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_CTL_CHANGE 0xB0 101530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_PGM_CHANGE 0xC0 101630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_CHN_PRESSURE 0xD0 101730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_PITCH_BEND 0xE0 101830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 101930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define MIDI_SYSTEM_PREFIX 0xF0 102030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 102130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 102230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Timer event types 102330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 102430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_WAIT_REL 1 /* Time relative to the prev time */ 102530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */ 102630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_STOP 3 102730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_START 4 102830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_CONTINUE 5 102930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_TEMPO 6 103030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_ECHO 8 103130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_CLOCK 9 /* MIDI clock */ 103230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_SPP 10 /* Song position pointer */ 103330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define TMR_TIMESIG 11 /* Time signature */ 103430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 103530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 103630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Local event types 103730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 103830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define LOCL_STARTAUDIO 1 103930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 104030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#if !defined(__KERNEL__) || defined(USE_SEQ_MACROS) 104130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 104230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Some convenience macros to simplify programming of the 104330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * /dev/sequencer interface 104430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 104530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This is a legacy interface for applications written against 104630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the OSSlib-3.8 style interface. It is no longer possible 104730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * to actually link against OSSlib with this header, but we 104830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * still provide these macros for programs using them. 104930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 105030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * If you want to use OSSlib, it is recommended that you get 105130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the GPL version of OSS-4.x and build against that version 105230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of the header. 105330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 105430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * We redefine the extern keyword so that make headers_check 105530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * does not complain about SEQ_USE_EXTBUF. 105630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 105730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF() 105830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 105930692c65c4174412c90e79489e98ab85c1a7412fBen Chengvoid seqbuf_dump(void); /* This function must be provided by programs */ 106030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 106130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PM_DEFINES int __foo_bar___ 106230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 106330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_LOAD_GMINSTR(dev, instr) 106430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_LOAD_GMDRUM(dev, drum) 106530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 106630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_EXTERN extern 106730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_USE_EXTBUF() \ 106830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_EXTERN unsigned char _seqbuf[]; \ 106930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr 107030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 107130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef USE_SIMPLE_MACROS 107230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Sample seqbuf_dump() implementation: 107330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 107430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes 107530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 107630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * int seqfd; -- The file descriptor for /dev/sequencer. 107730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 107830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * void 107930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * seqbuf_dump () 108030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * { 108130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * if (_seqbufptr) 108230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * if (write (seqfd, _seqbuf, _seqbufptr) == -1) 108330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * { 108430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * perror ("write /dev/sequencer"); 108530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * exit (-1); 108630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * } 108730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * _seqbufptr = 0; 108830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * } 108930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 109030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 109130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0 109230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump() 109330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_ADVBUF(len) _seqbufptr += len 109430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DUMPBUF seqbuf_dump 109530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#else 109630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 109730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This variation of the sequencer macros is used just to format one event 109830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * using fixed buffer. 109930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 110030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The program using the macro library must define the following macros before 110130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * using this library. 110230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 110330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * #define _seqbuf name of the buffer (unsigned char[]) 110430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * #define _SEQ_ADVBUF(len) If the applic needs to know the exact 110530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * size of the event, this macro can be used. 110630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Otherwise this must be defined as empty. 110730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * #define _seqbufptr Define the name of index variable or 0 if 110830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * not required. 110930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 111030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _SEQ_NEEDBUF(len) /* empty */ 111130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif 111230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 111330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_VOLUME_MODE(dev, mode) {_SEQ_NEEDBUF(8);\ 111430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 111530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ 111630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+2] = (dev);\ 111730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+3] = (mode);\ 111830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+4] = 0;\ 111930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+5] = 0;\ 112030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+6] = 0;\ 112130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+7] = 0;\ 112230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(8);} 112330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 112430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 112530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Midi voice messages 112630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 112730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 112830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _CHN_VOICE(dev, event, chn, note, parm) \ 112930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng {_SEQ_NEEDBUF(8);\ 113030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ 113130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = (dev);\ 113230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+2] = (event);\ 113330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+3] = (chn);\ 113430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+4] = (note);\ 113530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+5] = (parm);\ 113630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+6] = (0);\ 113730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+7] = 0;\ 113830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(8);} 113930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 114030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_START_NOTE(dev, chn, note, vol) \ 114130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol) 114230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 114330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_STOP_NOTE(dev, chn, note, vol) \ 114430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol) 114530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 114630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ 114730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure) 114830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 114930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 115030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Midi channel messages 115130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 115230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 115330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \ 115430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng {_SEQ_NEEDBUF(8);\ 115530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ 115630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = (dev);\ 115730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+2] = (event);\ 115830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+3] = (chn);\ 115930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+4] = (p1);\ 116030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+5] = (p2);\ 116130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ 116230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(8);} 116330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 116430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits 116530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * sending any MIDI bytes but it's absolutely not possible. Trying to do 116630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * so _will_ cause problems with MPU401 intelligent mode). 116730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 116830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be 116930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * sent by calling SEQ_SYSEX() several times (there must be no other events 117030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * between them). First sysex fragment must have 0xf0 in the first byte 117130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte 117230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * between these sysex start and end markers cannot be larger than 0x7f. Also 117330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * lengths of each fragments (except the last one) must be 6. 117430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 117530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Breaking the above rules may work with some MIDI ports but is likely to 117630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * cause fatal problems with some other devices (such as MPU401). 117730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 117830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SYSEX(dev, buf, len) \ 117930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng {int ii, ll=(len); \ 118030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng unsigned char *bufp=buf;\ 118130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng if (ll>6)ll=6;\ 118230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_NEEDBUF(8);\ 118330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr] = EV_SYSEX;\ 118430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = (dev);\ 118530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng for(ii=0;ii<ll;ii++)\ 118630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+ii+2] = bufp[ii];\ 118730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng for(ii=ll;ii<6;ii++)\ 118830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+ii+2] = 0xff;\ 118930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(8);} 119030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 119130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CHN_PRESSURE(dev, chn, pressure) \ 119230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0) 119330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 119430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SET_PATCH SEQ_PGM_CHANGE 119530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PGM_CHANGE(dev, chn, patch) \ 119630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0) 119730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 119830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CONTROL(dev, chn, controller, value) \ 119930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value) 120030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 120130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_BENDER(dev, chn, value) \ 120230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value) 120330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 120430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 120530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_V2_X_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\ 120630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ 120730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\ 120830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+2] = (dev);\ 120930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+3] = (voice);\ 121030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+4] = (controller);\ 121130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+5] = ((value)&0xff);\ 121230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\ 121330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+7] = 0;\ 121430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(8);} 121530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 121630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The following 5 macros are incorrectly implemented and obsolete. 121730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead. 121830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 121930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value) 122030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value) 122130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128) 122230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100) 122330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2) 122430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 122530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 122630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Timing and synchronization macros 122730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 122830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 122930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ 123030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+0] = EV_TIMING; \ 123130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = (ev); \ 123230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+2] = 0;\ 123330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+3] = 0;\ 123430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ 123530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(8);} 123630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 123730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0) 123830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0) 123930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0) 124030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks) 124130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks) 124230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key) 124330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value) 124430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos) 124530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig) 124630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 124730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 124830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Local control events 124930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 125030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 125130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _LOCAL_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ 125230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \ 125330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = (ev); \ 125430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+2] = 0;\ 125530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+3] = 0;\ 125630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ 125730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(8);} 125830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 125930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask) 126030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 126130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Events for the level 1 interface only 126230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 126330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 126430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\ 126530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\ 126630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+1] = (byte);\ 126730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+2] = (device);\ 126830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _seqbuf[_seqbufptr+3] = 0;\ 126930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng _SEQ_ADVBUF(4);} 127030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 127130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* 127230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Patch loading. 127330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */ 127430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WRPATCH(patchx, len) \ 127530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng {if (_seqbufptr) SEQ_DUMPBUF();\ 127630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng if (write(seqfd, (char*)(patchx), len)==-1) \ 127730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng perror("Write patch: /dev/sequencer");} 127830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SEQ_WRPATCH2(patchx, len) \ 127930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len)) 128030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng 128130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif 128230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* _UAPISOUNDCARD_H */ 1283