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 + -
显示快捷键?