📄 soundcard.h
字号:
unsigned short key; /* Initialize to FM_PATCH or OPL3_PATCH */#define FM_PATCH 0x01fd#define OPL3_PATCH 0x03fd short device; /* Synth# (0-4) */ int channel; /* Program# to be initialized */ sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */ };struct synth_info { /* Read only */ char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ int synth_type;#define SYNTH_TYPE_FM 0#define SYNTH_TYPE_SAMPLE 1 int synth_subtype;#define FM_TYPE_ADLIB 0x00#define FM_TYPE_OPL3 0x01#define SAMPLE_TYPE_GUS 0x10 int perc_mode; /* No longer supported */ int nr_voices; int nr_drums; /* Obsolete field */ int instr_bank_size; unsigned long capabilities; #define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */#define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ int dummies[19]; /* Reserve space */ };struct midi_info { char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ unsigned long capabilities; /* To be defined later */ int dev_type; int dummies[18]; /* Reserve space */ };/******************************************** * IOCTL commands for /dev/dsp and /dev/audio */#define SNDCTL_DSP_RESET _IO ('P', 0)#define SNDCTL_DSP_SYNC _IO ('P', 1)#define SNDCTL_DSP_SPEED _IOWR('P', 2, int)#define SNDCTL_DSP_STEREO _IOWR('P', 3, int)#define SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int)#define SNDCTL_DSP_SAMPLESIZE _IOWR('P', 5, int) /* 8, 12 or 16 */#define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int)#define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int)#define SNDCTL_DSP_POST _IO ('P', 8)#define SNDCTL_DSP_SUBDIVIDE _IOWR('P', 9, int)#define SOUND_PCM_READ_RATE _IOR ('P', 2, int)#define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int)#define SOUND_PCM_READ_BITS _IOR ('P', 5, int)#define SOUND_PCM_READ_FILTER _IOR ('P', 7, int)/* Some alias names */#define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SAMPLESIZE#define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED#define SOUND_PCM_POST SNDCTL_DSP_POST#define SOUND_PCM_RESET SNDCTL_DSP_RESET#define SOUND_PCM_SYNC SNDCTL_DSP_SYNC#define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE/********************************************* * IOCTL commands for /dev/mixer */ /* * Mixer devices * * There can be up to 20 different analog mixer channels. The * SOUND_MIXER_NRDEVICES gives the currently supported maximum. * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells * the devices supported by the particular mixer. */#define SOUND_MIXER_NRDEVICES 12#define SOUND_MIXER_VOLUME 0#define SOUND_MIXER_BASS 1#define SOUND_MIXER_TREBLE 2#define SOUND_MIXER_SYNTH 3#define SOUND_MIXER_PCM 4#define SOUND_MIXER_SPEAKER 5#define SOUND_MIXER_LINE 6#define SOUND_MIXER_MIC 7#define SOUND_MIXER_CD 8#define SOUND_MIXER_IMIX 9 /* Recording monitor */#define SOUND_MIXER_ALTPCM 10#define SOUND_MIXER_RECLEV 11 /* Recording level *//* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) *//* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */#define SOUND_ONOFF_MIN 28#define SOUND_ONOFF_MAX 30#define SOUND_MIXER_MUTE 28 /* 0 or 1 */#define SOUND_MIXER_ENHANCE 29 /* Enhanced stereo (0, 40, 60 or 80) */#define SOUND_MIXER_LOUD 30 /* 0 or 1 *//* Note! Number 31 cannot be used since the sign bit is reserved */#define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \ "Mic ", "CD ", "Mix ", "Pcm2 ", "rec"}#define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ "mic", "cd", "mix", "pcm2", "rec"}/* 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_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_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_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)/* * The following mixer ioctl calls are compatible with the BSD driver by * Steve Haehnichen <shaehnic@ucsd.edu> * * Since this interface is entirely SB specific, it will be dropped in the * near future. */typedef unsigned char S_BYTE;typedef unsigned char S_FLAG;struct stereo_vol{ S_BYTE l; /* Left volume */ S_BYTE r; /* Right volume */};#define MIXER_IOCTL_SET_LEVELS _IOW ('s', 20, struct sb_mixer_levels)#define MIXER_IOCTL_SET_PARAMS _IOW ('s', 21, struct sb_mixer_params)#define MIXER_IOCTL_READ_LEVELS _IOR ('s', 22, struct sb_mixer_levels)#define MIXER_IOCTL_READ_PARAMS _IOR ('s', 23, struct sb_mixer_params)#define MIXER_IOCTL_RESET _IO ('s', 24)/* * Mixer volume levels for MIXER_IOCTL_SET_VOL & MIXER_IOCTL_READ_VOL */struct sb_mixer_levels{ struct stereo_vol master; /* Master volume */ struct stereo_vol voc; /* DSP Voice volume */ struct stereo_vol fm; /* FM volume */ struct stereo_vol line; /* Line-in volume */ struct stereo_vol cd; /* CD audio */ S_BYTE mic; /* Microphone level */};/* * Mixer parameters for MIXER_IOCTL_SET_PARAMS & MIXER_IOCTL_READ_PARAMS */struct sb_mixer_params{ S_BYTE record_source; /* Recording source (See SRC_xxx below) */ S_FLAG hifreq_filter; /* Filter frequency (hi/low) */ S_FLAG filter_input; /* ANFI input filter */ S_FLAG filter_output; /* DNFI output filter */ S_FLAG dsp_stereo; /* 1 if DSP is in Stereo mode */};#define SRC_MIC 1 /* Select Microphone recording source */#define SRC_CD 3 /* Select CD recording source */#define SRC_LINE 7 /* Use Line-in for recording source */#if !defined(KERNEL) && !defined(INKERNEL)/* * Some convenience macros to simplify programming of the * /dev/sequencer interface * * These macros define the API which should be used when possible. */void 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, _seqbufptr = 0#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#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_START_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_NOTEON;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (voice);\ _seqbuf[_seqbufptr+4] = (note);\ _seqbuf[_seqbufptr+5] = (vol);\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);}#define SEQ_STOP_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_NOTEOFF;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (voice);\ _seqbuf[_seqbufptr+4] = (note);\ _seqbuf[_seqbufptr+5] = (vol);\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);}#define SEQ_CHN_PRESSURE(dev, voice, pressure) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_AFTERTOUCH;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (voice);\ _seqbuf[_seqbufptr+4] = (pressure);\ _seqbuf[_seqbufptr+5] = 0;\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);}#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] = 0;\ _SEQ_ADVBUF(8);}#define SEQ_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);}#define SEQ_PITCHBEND(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)#define SEQ_BENDER_RANGE(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)#define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_EXPRESSION, value)#define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_MAIN_VOLUME, value)#define SEQ_START_TIMER() {_SEQ_NEEDBUF(4);\ _seqbuf[_seqbufptr] = SEQ_SYNCTIMER;\ _seqbuf[_seqbufptr+1] = 0;\ _seqbuf[_seqbufptr+2] = 0;\ _seqbuf[_seqbufptr+3] = 0;\ _SEQ_ADVBUF(4);}#define SEQ_SET_PATCH(dev, voice, patch) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_PGMCHANGE;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (voice);\ _seqbuf[_seqbufptr+4] = (patch);\ _seqbuf[_seqbufptr+5] = 0;\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);}#define SEQ_WAIT_TIME(ticks) {_SEQ_NEEDBUF(4);\ *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_WAIT | ((ticks) << 8);\ _SEQ_ADVBUF(4);}#define SEQ_ECHO_BACK(key) {_SEQ_NEEDBUF(4);\ *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_ECHO | ((key) << 8);\ _SEQ_ADVBUF(4);}#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);}#define SEQ_WRPATCH(patch, len) {if (_seqbufptr) seqbuf_dump();\ if (write(seqfd, (char*)(patch), len)==-1) \ perror("Write patch: /dev/sequencer");}#endiflong soundcard_init(long mem_start);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -