soundcard.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 1,046 行 · 第 1/3 页
H
1,046 行
/* Device bitmask identifiers */#define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */#define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */#define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */#define SOUND_MIXER_CAPS 0xfc #define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo *//* Device mask bits */#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)#define SOUND_MASK_CD (1 << SOUND_MIXER_CD)#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN)#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN)#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1)#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2)#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3)#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)#define MIXER_READ(dev) _IOR('M', dev, int)#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN)#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN)#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1)#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2)#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3)#define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE)#define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE)#define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD)#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)#define MIXER_WRITE(dev) _IOWR('M', dev, int)#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN)#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN)#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1)#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2)#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3)#define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE)#define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE)#define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD)#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)/* * Level 2 event types for /dev/sequencer *//* * The 4 most significant bits of byte 0 specify the class of * the event: * * 0x8X = system level events, * 0x9X = device/port specific events, event[1] = device/port, * The last 4 bits give the subtype: * 0x02 = Channel event (event[3] = chn). * 0x01 = note event (event[4] = note). * (0x01 is not used alone but always with bit 0x02). * event[2] = MIDI message code (0x80=note off etc.) * */#define EV_SEQ_LOCAL 0x80#define EV_TIMING 0x81#define EV_CHN_COMMON 0x92#define EV_CHN_VOICE 0x93/* * Event types 200 to 220 are reserved for application use. * These numbers will not be used by the driver. *//* * Events for event type EV_CHN_VOICE */#define MIDI_NOTEOFF 0x80#define MIDI_NOTEON 0x90#define MIDI_KEY_PRESSURE 0xA0/* * Events for event type EV_CHN_COMMON */#define MIDI_CTL_CHANGE 0xB0#define MIDI_PGM_CHANGE 0xC0#define MIDI_CHN_PRESSURE 0xD0#define MIDI_PITCH_BEND 0xE0#define MIDI_SYSTEM_PREFIX 0xF0/* * Timer event types */#define TMR_WAIT_REL 1 /* Time relative to the prev time */#define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */#define TMR_STOP 3#define TMR_START 4#define TMR_CONTINUE 5#define TMR_TEMPO 6#define TMR_ECHO 8#define TMR_CLOCK 9 /* MIDI clock */#define TMR_SPP 10 /* Song position pointer */#define TMR_TIMESIG 11 /* Time signature */#if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS) /* * Some convenience macros to simplify programming of the * /dev/sequencer interface * * These macros define the API which should be used when possible. */#ifndef USE_SIMPLE_MACROSvoid seqbuf_dump(void); /* This function must be provided by programs *//* Sample seqbuf_dump() implementation: * * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes * * int seqfd; -- The file descriptor for /dev/sequencer. * * void * seqbuf_dump () * { * if (_seqbufptr) * if (write (seqfd, _seqbuf, _seqbufptr) == -1) * { * perror ("write /dev/sequencer"); * exit (-1); * } * _seqbufptr = 0; * } */#define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0#define SEQ_USE_EXTBUF() extern unsigned char _seqbuf[]; extern int _seqbuflen;extern int _seqbufptr#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF()#define SEQ_PM_DEFINES struct patmgr_info _pm_info#define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()#define _SEQ_ADVBUF(len) _seqbufptr += len#define SEQ_DUMPBUF seqbuf_dump#else/* * This variation of the sequencer macros is used just to format one event * using fixed buffer. * * The program using the macro library must define the following macros before * using this library. * * #define _seqbuf name of the buffer (unsigned char[]) * #define _SEQ_ADVBUF(len) If the applic needs to know the exact * size of the event, this macro can be used. * Otherwise this must be defined as empty. * #define _seqbufptr Define the name of index variable or 0 if * not required. */#define _SEQ_NEEDBUF(len) /* empty */#endif#define PM_LOAD_PATCH(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ _pm_info.device=dev, _pm_info.data.data8[0]=pgm, \ _pm_info.parm1 = bank, _pm_info.parm2 = 1, \ ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))#define PM_LOAD_PATCHES(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \ _pm_info.device=dev, memcpy(_pm_info.data.data8, pgm, 128), \ _pm_info.parm1 = bank, _pm_info.parm2 = 128, \ ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))#define SEQ_VOLUME_MODE(dev, mode) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (mode);\ _seqbuf[_seqbufptr+4] = 0;\ _seqbuf[_seqbufptr+5] = 0;\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);}/* * Midi voice messages */#define _CHN_VOICE(dev, event, chn, note, parm) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (note);\ _seqbuf[_seqbufptr+5] = (parm);\ _seqbuf[_seqbufptr+6] = (0);\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);}#define SEQ_START_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol)#define SEQ_STOP_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol)#define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure)/* * Midi channel messages */#define _CHN_COMMON(dev, event, chn, p1, p2, w14) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (p1);\ _seqbuf[_seqbufptr+5] = (p2);\ *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ _SEQ_ADVBUF(8);}#define SEQ_CHN_PRESSURE(dev, chn, pressure) \ _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)#define SEQ_SET_PATCH(dev, chn, patch) \ _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)#define SEQ_CONTROL(dev, chn, controller, value) \ _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)#define SEQ_BENDER(dev, chn, value) \ _CHN_COMMON(dev, MIDI_PITCH_BEND, chn, 0, 0, value)#define SEQ_V2_X_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (voice);\ _seqbuf[_seqbufptr+4] = (controller);\ *(short *)&_seqbuf[_seqbufptr+5] = (value);\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);}/* * The following 5 macros are incorrectly implemented and obsolete. * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead. */#define SEQ_PITCHBEND(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128)#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100)#define SEQ_PANNING(dev, voice, pos) SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2)#if 0#define SEQ_PANNING(dev, voice, pos) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_BALANCE;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (voice);\ (char)_seqbuf[_seqbufptr+4] = (pos);\ _seqbuf[_seqbufptr+5] = 0;\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 1;\ _SEQ_ADVBUF(8);}#endif/* * Timing and syncronization macros */#define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr+0] = EV_TIMING; \ _seqbuf[_seqbufptr+1] = (ev); \ _seqbuf[_seqbufptr+2] = 0;\ _seqbuf[_seqbufptr+3] = 0;\ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ _SEQ_ADVBUF(8);}#define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0)#define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0)#define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0)#define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks)#define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks)#define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key)#define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value)#define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos)#define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig)/* * Events for the level 1 interface only */#define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\ _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\ _seqbuf[_seqbufptr+1] = (byte);\ _seqbuf[_seqbufptr+2] = (device);\ _seqbuf[_seqbufptr+3] = 0;\ _SEQ_ADVBUF(4);}/* * Patch loading. */#define SEQ_WRPATCH(patchx, len) {if (_seqbufptr) seqbuf_dump();\ if (write(seqfd, (char*)(patchx), len)==-1) \ perror("Write patch: /dev/sequencer");}#define SEQ_WRPATCH2(patchx, len) (seqbuf_dump(), write(seqfd, (char*)(patchx), len))#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?