⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soundcard.h

📁 xmms-1.2.10.tar.gz学习使用的就下吧
💻 H
📖 第 1 页 / 共 5 页
字号:
#define TMR_CLOCK		9	/* MIDI clock */#define TMR_SPP			10	/* Song position pointer */#define TMR_TIMESIG		11	/* Time signature *//* *	Local event types */#define LOCL_STARTAUDIO		1#define LOCL_STARTAUDIO2	2#define LOCL_STARTAUDIO3	3#define LOCL_STARTAUDIO4	4#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. */#define SEQ_DECLAREBUF()		SEQ_USE_EXTBUF()void seqbuf_dump (void);	/* This function must be provided by programs */EXTERNC int OSS_init (int seqfd, int buflen);EXTERNC void OSS_seqbuf_dump (int fd, unsigned char *buf, int buflen);EXTERNC void OSS_seq_advbuf (int len, int fd, unsigned char *buf, int buflen);EXTERNC void OSS_seq_needbuf (int len, int fd, unsigned char *buf,			      int buflen);EXTERNC void OSS_patch_caching (int dev, int chn, int patch, int fd,				unsigned char *buf, int buflen);EXTERNC void OSS_drum_caching (int dev, int chn, int patch, int fd,			       unsigned char *buf, int buflen);EXTERNC void OSS_write_patch (int fd, unsigned char *buf, int len);EXTERNC int OSS_write_patch2 (int fd, unsigned char *buf, int len);#define SEQ_PM_DEFINES int __foo_bar___#ifdef OSSLIB#  define SEQ_USE_EXTBUF() \		EXTERNC unsigned char *_seqbuf; \		EXTERNC int _seqbuflen;EXTERNC int _seqbufptr#  define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len#  define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen)#  define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen)#  define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen)#  define SEQ_LOAD_GMINSTR(dev, instr) \		OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen)#  define SEQ_LOAD_GMDRUM(dev, drum) \		OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen)#else /* !OSSLIB */#  define SEQ_LOAD_GMINSTR(dev, instr)#  define SEQ_LOAD_GMDRUM(dev, drum)#  define SEQ_USE_EXTBUF() \		EXTERNC unsigned char _seqbuf[]; \		EXTERNC int _seqbuflen;EXTERNC int _seqbufptr#ifndef USE_SIMPLE_MACROS/* 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_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#endif /* !OSSLIB */#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);}/* * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits * sending any MIDI bytes but it's absolutely not possible. Trying to do * so _will_ cause problems with MPU401 intelligent mode). * * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be  * sent by calling SEQ_SYSEX() several times (there must be no other events * between them). First sysex fragment must have 0xf0 in the first byte * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte * between these sysex start and end markers cannot be larger than 0x7f. Also * lengths of each fragments (except the last one) must be 6. * * Breaking the above rules may work with some MIDI ports but is likely to * cause fatal problems with some other devices (such as MPU401). */#define SEQ_SYSEX(dev, buf, len) \					{int ii, ll=(len); \					 unsigned char *bufp=buf;\					 if (ll>6)ll=6;\					_SEQ_NEEDBUF(8);\					_seqbuf[_seqbufptr] = EV_SYSEX;\					_seqbuf[_seqbufptr+1] = (dev);\					for(ii=0;ii<ll;ii++)\					   _seqbuf[_seqbufptr+ii+2] = bufp[ii];\					for(ii=ll;ii<6;ii++)\					   _seqbuf[_seqbufptr+ii+2] = 0xff;\					_SEQ_ADVBUF(8);}#define SEQ_CHN_PRESSURE(dev, chn, pressure) \		_CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)#define SEQ_SET_PATCH SEQ_PGM_CHANGE#ifdef OSSLIB#   define SEQ_PGM_CHANGE(dev, chn, patch) \		{OSS_patch_caching(dev, chn, patch, seqfd, _seqbuf, _seqbuflen); \		 _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0);}#else#   define SEQ_PGM_CHANGE(dev, chn, patch) \		_CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)#endif#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);\					_seqbuf[_seqbufptr+5] = ((value)&0xff);\					_seqbuf[_seqbufptr+6] = ((value>>8)&0xff);\					_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)/* * 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)/* * Local control events */#define _LOCAL_EVENT(ev, parm)		{_SEQ_NEEDBUF(8);\				 	_seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \				 	_seqbuf[_seqbufptr+1] = (ev); \					_seqbuf[_seqbufptr+2] = 0;\					_seqbuf[_seqbufptr+3] = 0;\				 	*(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \					_SEQ_ADVBUF(8);}#define SEQ_PLAYAUDIO(devmask)		_LOCAL_EVENT(LOCL_STARTAUDIO, devmask)#define SEQ_PLAYAUDIO2(devmask)		_LOCAL_EVENT(LOCL_STARTAUDIO2, devmask)#define SEQ_PLAYAUDIO3(devmask)		_LOCAL_EVENT(LOCL_STARTAUDIO3, devmask)#define SEQ_PLAYAUDIO4(devmask)		_LOCAL_EVENT(LOCL_STARTAUDIO4, devmask)/* * 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. */#ifdef OSSLIB#   define SEQ_WRPATCH(patchx, len) \		OSS_write_patch(seqfd, (char*)(patchx), len)#   define SEQ_WRPATCH2(patchx, len) \		OSS_write_patch2(seqfd, (char*)(patchx), len)#else#   define SEQ_WRPATCH(patchx, len) \		{if (_seqbufptr) SEQ_DUMPBUF();\		 if (write(seqfd, (char*)(patchx), len)==-1) \		    perror("Write patch: /dev/sequencer");}#   define SEQ_WRPATCH2(patchx, len) \		(SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))#endif#endif#ifdef OSSLIBextern int osslib_open (const char *path, int flags, int dummy);extern void ossclose (int fd);extern int osslib_write (int fd, const void *buf, int count);extern int osslib_read (int fd, void *buf, int count);extern int osslib_ioctl (int fd, unsigned int request, void *arg);#else#  define osslib_open	open#  define osslib_close	close#  define osslib_write	write#  define osslib_read	read#  define osslib_ioctl	ioctl#endif/* * ioctl calls to be used in communication with coprocessors and * DSP chips. ******** OBSOLETE CALLS - OSS/Free only ********** */typedef struct copr_buffer {		int command;	/* Set to 0 if not used */		int flags;#define CPF_NONE		0x0000#define CPF_FIRST		0x0001	/* First block */#define CPF_LAST		0x0002	/* Last block */		int len;		int offs;	/* If required by the device (0 if not used) */		unsigned char data[4000]; /* NOTE! 4000 is not 4k */	} copr_buffer;typedef struct copr_debug_buf {		int command;	/* Used internally. Set to 0 */		int parm1;		int parm2;		int flags;			int len;	/* Length of data in bytes */	} copr_debug_buf;typedef struct copr_msg {		int len;		unsigned char data[4000];	} copr_msg;#define SNDCTL_COPR_RESET     __SIO  ('C',  0) /* OBSOLETE */#define SNDCTL_COPR_LOAD      __SIOWR('C',  1, copr_buffer) /* OBSOLETE */#define SNDCTL_COPR_RDATA     __SIOWR('C',  2, copr_debug_buf) /* OBSOLETE */#define SNDCTL_COPR_RCODE     __SIOWR('C',  3, copr_debug_buf) /* OBSOLETE */#define SNDCTL_COPR_WDATA     __SIOW ('C',  4, copr_debug_buf) /* OBSOLETE */#define SNDCTL_COPR_WCODE     __SIOW ('C',  5, copr_debug_buf) /* OBSOLETE */#define SNDCTL_COPR_RUN	      __SIOWR('C',  6, copr_debug_buf) /* OBSOLETE */#define SNDCTL_COPR_HALT      __SIOWR('C',  7, copr_debug_buf) /* OBSOLETE */#define SNDCTL_COPR_SENDMSG   __SIOWR('C',  8, copr_msg) /* OBSOLETE */#define SNDCTL_COPR_RCVMSG    __SIOR ('C',  9, copr_msg) /* OBSOLETE */#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -