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

📄 load_it.c

📁 wince下著名的视频播放器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* 2.16 : IT 2.14p3 with resonant filters */	/* 2.15 : IT 2.14p3 (improved compression) */	if((mh->cwt<=0x219)&&(mh->cwt>=0x217))		of.modtype=strdup(IT_Version[mh->cmwt<0x214?4:5]);	else if (mh->cwt>=0x215)		of.modtype=strdup(IT_Version[mh->cmwt<0x214?2:3]);	else {		of.modtype     = strdup(IT_Version[mh->cmwt<0x214?0:1]);		of.modtype[mh->cmwt<0x214?15:26] = (mh->cwt>>8)+'0';		of.modtype[mh->cmwt<0x214?17:28] = ((mh->cwt>>4)&0xf)+'0';		of.modtype[mh->cmwt<0x214?18:29] = ((mh->cwt)&0xf)+'0';	}	if(mh->flags&8)		of.flags |= UF_XMPERIODS | UF_LINEAR;	if((mh->cwt>=0x106)&&(mh->flags&16))		old_effect=S3MIT_OLDSTYLE;	else		old_effect=0;	/* set panning positions */	if (mh->flags & 1)		for(t=0;t<64;t++) {			mh->pantable[t]&=0x7f;			if(mh->pantable[t]<64)				of.panning[t]=mh->pantable[t]<<2;			else if(mh->pantable[t]==64)				of.panning[t]=255;			else if(mh->pantable[t]==100)				of.panning[t]=PAN_SURROUND;			else if(mh->pantable[t]==127)				of.panning[t]=PAN_CENTER;			else {				_mm_errno=MMERR_LOADING_HEADER;				return 0;			}		}	else		for(t=0;t<64;t++)			of.panning[t]=PAN_CENTER;	/* set channel volumes */	memcpy(of.chanvol,mh->voltable,64);	/* read the order data */	if(!AllocPositions(mh->ordnum)) return 0;	if(!(origpositions=_mm_calloc(mh->ordnum,sizeof(UWORD)))) return 0;	for(t=0;t<mh->ordnum;t++) {		origpositions[t]=_mm_read_UBYTE(modreader);		if((origpositions[t]>mh->patnum)&&(origpositions[t]<254))			origpositions[t]=255;	}	if(_mm_eof(modreader)) {		_mm_errno = MMERR_LOADING_HEADER;		return 0;	}	poslookupcnt=mh->ordnum;	S3MIT_CreateOrders(curious);	if(!(paraptr=(ULONG*)_mm_malloc((mh->insnum+mh->smpnum+of.numpat)*	                               sizeof(ULONG)))) return 0;	/* read the instrument, sample, and pattern parapointers */	_mm_read_I_ULONGS(paraptr,mh->insnum+mh->smpnum+of.numpat,modreader);	if(_mm_eof(modreader)) {		_mm_errno = MMERR_LOADING_HEADER;		return 0;	}	/* Check for and load midi information for resonant filters */	if(mh->cmwt>=0x216) {		if(mh->special&8) {			IT_LoadMidiConfiguration(modreader);			if(_mm_eof(modreader)) {				_mm_errno = MMERR_LOADING_HEADER;				return 0;			}		} else			IT_LoadMidiConfiguration(NULL);		filters=1;	}	/* Check for and load song comment */	if((mh->special&1)&&(mh->cwt>=0x104)&&(mh->msglength)) {		_mm_fseek(modreader,(long)(mh->msgoffset),SEEK_SET);		if(!ReadComment(mh->msglength)) return 0;	}	if(!(mh->flags&4)) of.numins=of.numsmp;	if(!AllocSamples()) return 0;	if(!AllocLinear()) return 0;	/* Load all samples */	q = of.samples;	for(t=0;t<mh->smpnum;t++) {		ITSAMPLE s;		/* seek to sample position */		_mm_fseek(modreader,(long)(paraptr[mh->insnum+t]+4),SEEK_SET);		/* load sample info */		_mm_read_string(s.filename,12,modreader);		s.zerobyte    = _mm_read_UBYTE(modreader);		s.globvol     = _mm_read_UBYTE(modreader);		s.flag        = _mm_read_UBYTE(modreader);		s.volume      = _mm_read_UBYTE(modreader);		_mm_read_string(s.sampname,26,modreader);		s.convert     = _mm_read_UBYTE(modreader);		s.panning     = _mm_read_UBYTE(modreader);		s.length      = _mm_read_I_ULONG(modreader);		s.loopbeg     = _mm_read_I_ULONG(modreader);		s.loopend     = _mm_read_I_ULONG(modreader);		s.c5spd       = _mm_read_I_ULONG(modreader);		s.susbegin    = _mm_read_I_ULONG(modreader);		s.susend      = _mm_read_I_ULONG(modreader);		s.sampoffset  = _mm_read_I_ULONG(modreader);		s.vibspeed    = _mm_read_UBYTE(modreader);		s.vibdepth    = _mm_read_UBYTE(modreader);		s.vibrate     = _mm_read_UBYTE(modreader);		s.vibwave     = _mm_read_UBYTE(modreader);		/* Generate an error if c5spd is > 512k, or samplelength > 256 megs		   (nothing would EVER be that high) */		if(_mm_eof(modreader)||(s.c5spd>0x7ffffL)||(s.length>0xfffffffUL)) {			_mm_errno = MMERR_LOADING_SAMPLEINFO;			return 0;		}		/* Reality check for sample loop information */		if((s.flag&16)&&		   ((s.loopbeg>0xfffffffUL)||(s.loopend>0xfffffffUL))) {			_mm_errno = MMERR_LOADING_SAMPLEINFO;			return 0;		}		q->samplename = DupStr(s.sampname,26,0);		q->speed      = s.c5spd / 2;		q->panning    = ((s.panning&127)==64)?255:(s.panning&127)<<2;		q->length     = s.length;		q->loopstart  = s.loopbeg;		q->loopend    = s.loopend;		q->volume     = s.volume;		q->globvol    = s.globvol;		q->seekpos    = s.sampoffset;		/* Convert speed to XM linear finetune */		if(of.flags&UF_LINEAR)			q->speed=speed_to_finetune(s.c5spd,t);		if(s.panning&128) q->flags|=SF_OWNPAN;		if(s.vibrate) {			q->vibflags |= AV_IT;			q->vibtype   = s.vibwave;			q->vibsweep  = s.vibrate * 2;			q->vibdepth  = s.vibdepth;			q->vibrate   = s.vibspeed;		}		if(s.flag&2) q->flags|=SF_16BITS;		if((s.flag&8)&&(mh->cwt>=0x214)) {			q->flags|=SF_ITPACKED;			compressed=1;		}		if(s.flag&16) q->flags|=SF_LOOP;		if(s.flag&64) q->flags|=SF_BIDI;		if(mh->cwt>=0x200) {			if(s.convert&1) q->flags|=SF_SIGNED;			if(s.convert&4) q->flags|=SF_DELTA;   		}		q++;	}	/* Load instruments if instrument mode flag enabled */	if(mh->flags&4) {		if(!AllocInstruments()) return 0;		d=of.instruments;		of.flags|=UF_NNA|UF_INST;		for(t=0;t<mh->insnum;t++) {			ITINSTHEADER ih;			/* seek to instrument position */			_mm_fseek(modreader,paraptr[t]+4,SEEK_SET);			/* load instrument info */			_mm_read_string(ih.filename,12,modreader);			ih.zerobyte  = _mm_read_UBYTE(modreader);			if(mh->cwt<0x200) {				/* load IT 1.xx inst header */				ih.volflg    = _mm_read_UBYTE(modreader);				ih.volbeg    = _mm_read_UBYTE(modreader);				ih.volend    = _mm_read_UBYTE(modreader);				ih.volsusbeg = _mm_read_UBYTE(modreader);				ih.volsusend = _mm_read_UBYTE(modreader);				_mm_read_I_UWORD(modreader);				ih.fadeout   = _mm_read_I_UWORD(modreader);				ih.nna       = _mm_read_UBYTE(modreader);				ih.dnc       = _mm_read_UBYTE(modreader);			} else {				/* Read IT200+ header */				ih.nna       = _mm_read_UBYTE(modreader);				ih.dct       = _mm_read_UBYTE(modreader);				ih.dca       = _mm_read_UBYTE(modreader);				ih.fadeout   = _mm_read_I_UWORD(modreader);				ih.ppsep     = _mm_read_UBYTE(modreader);				ih.ppcenter  = _mm_read_UBYTE(modreader);				ih.globvol   = _mm_read_UBYTE(modreader);				ih.chanpan   = _mm_read_UBYTE(modreader);				ih.rvolvar   = _mm_read_UBYTE(modreader);				ih.rpanvar   = _mm_read_UBYTE(modreader);			}			ih.trkvers   = _mm_read_I_UWORD(modreader);			ih.numsmp    = _mm_read_UBYTE(modreader);			_mm_read_UBYTE(modreader);			_mm_read_string(ih.name,26,modreader);			_mm_read_UBYTES(ih.blank01,6,modreader);			_mm_read_I_UWORDS(ih.samptable,ITNOTECNT,modreader);			if(mh->cwt<0x200) {				/* load IT 1xx volume envelope */				_mm_read_UBYTES(ih.volenv,200,modreader);				for(lp=0;lp<ITENVCNT;lp++) {					ih.oldvoltick[lp] = _mm_read_UBYTE(modreader);					ih.volnode[lp]    = _mm_read_UBYTE(modreader);				} 			} else {				/* load IT 2xx volume, pan and pitch envelopes */#if defined __STDC__ || defined _MSC_VER || defined MPW_C#define IT_LoadEnvelope(name,type) 										\				ih. name##flg   =_mm_read_UBYTE(modreader);				\				ih. name##pts   =_mm_read_UBYTE(modreader);				\				ih. name##beg   =_mm_read_UBYTE(modreader);				\				ih. name##end   =_mm_read_UBYTE(modreader);				\				ih. name##susbeg=_mm_read_UBYTE(modreader);				\				ih. name##susend=_mm_read_UBYTE(modreader);				\				for(lp=0;lp<ITENVCNT;lp++) {							\					ih. name##node[lp]=_mm_read_##type (modreader);		\					ih. name##tick[lp]=_mm_read_I_UWORD(modreader);		\				}														\				_mm_read_UBYTE(modreader)#else#define IT_LoadEnvelope(name,type) 										\				ih. name/**/flg   =_mm_read_UBYTE(modreader);			\				ih. name/**/pts   =_mm_read_UBYTE(modreader);			\				ih. name/**/beg   =_mm_read_UBYTE(modreader);			\				ih. name/**/end   =_mm_read_UBYTE(modreader);			\				ih. name/**/susbeg=_mm_read_UBYTE(modreader);			\				ih. name/**/susend=_mm_read_UBYTE(modreader);			\				for(lp=0;lp<ITENVCNT;lp++) {							\					ih. name/**/node[lp]=_mm_read_/**/type (modreader);	\					ih. name/**/tick[lp]=_mm_read_I_UWORD(modreader);	\				}														\				_mm_read_UBYTE(modreader)#endif				IT_LoadEnvelope(vol,UBYTE);				IT_LoadEnvelope(pan,SBYTE);				IT_LoadEnvelope(pit,SBYTE);#undef IT_LoadEnvelope			} 			if(_mm_eof(modreader)) {				_mm_errno = MMERR_LOADING_SAMPLEINFO;				return 0;			}			d->volflg|=EF_VOLENV;			d->insname = DupStr(ih.name,26,0);			d->nnatype = ih.nna & NNA_MASK;			if(mh->cwt<0x200) {				d->volfade=ih.fadeout<< 6;				if(ih.dnc) {					d->dct=DCT_NOTE;					d->dca=DCA_CUT;				}				if(ih.volflg&1) d->volflg|=EF_ON;				if(ih.volflg&2) d->volflg|=EF_LOOP;				if(ih.volflg&4) d->volflg|=EF_SUSTAIN;      				/* XM conversion of IT envelope Array */				d->volbeg    = ih.volbeg;   				d->volend    = ih.volend;				d->volsusbeg = ih.volsusbeg;				d->volsusend = ih.volsusend;				if(ih.volflg&1) {					for(u=0;u<ITENVCNT;u++)						if(ih.oldvoltick[d->volpts]!=0xff) {							d->volenv[d->volpts].val=(ih.volnode[d->volpts]<<2);							d->volenv[d->volpts].pos=ih.oldvoltick[d->volpts];							d->volpts++;						} else							break;				}  			} else {				d->panning=((ih.chanpan&127)==64)?255:(ih.chanpan&127)<<2;				if(!(ih.chanpan&128)) d->flags|=IF_OWNPAN;				if(!(ih.ppsep & 128)) {					d->pitpansep=ih.ppsep<<2;					d->pitpancenter=ih.ppcenter;					d->flags|=IF_PITCHPAN;				}				d->globvol=ih.globvol>>1;				d->volfade=ih.fadeout<<5;				d->dct    =ih.dct;				d->dca    =ih.dca;				if(mh->cwt>=0x204) {					d->rvolvar = ih.rvolvar;					d->rpanvar = ih.rpanvar;				}#if defined __STDC__ || defined _MSC_VER || defined MPW_C#define IT_ProcessEnvelope(name) 										\				if(ih. name##flg&1) d-> name##flg|=EF_ON;				\				if(ih. name##flg&2) d-> name##flg|=EF_LOOP;				\				if(ih. name##flg&4) d-> name##flg|=EF_SUSTAIN;			\				d-> name##pts=ih. name##pts;							\				d-> name##beg=ih. name##beg;							\				d-> name##end=ih. name##end;							\				d-> name##susbeg=ih. name##susbeg;						\				d-> name##susend=ih. name##susend;						\																		\				for(u=0;u<ih. name##pts;u++)							\					d-> name##env[u].pos=ih. name##tick[u];				\																		\				if((d-> name##flg&EF_ON)&&(d-> name##pts<2))			\					d-> name##flg&=~EF_ON#else#define IT_ProcessEnvelope(name) 									\				if(ih. name/**/flg&1) d-> name/**/flg|=EF_ON;		\				if(ih. name/**/flg&2) d-> name/**/flg|=EF_LOOP;		\				if(ih. name/**/flg&4) d-> name/**/flg|=EF_SUSTAIN;	\				d-> name/**/pts=ih. name/**/pts;					\				d-> name/**/beg=ih. name/**/beg;					\				d-> name/**/end=ih. name/**/end;					\				d-> name/**/susbeg=ih. name/**/susbeg;				\				d-> name/**/susend=ih. name/**/susend;				\																	\				for(u=0;u<ih. name/**/pts;u++)						\					d-> name/**/env[u].pos=ih. name/**/tick[u];		\																	\				if((d-> name/**/flg&EF_ON)&&(d-> name/**/pts<2))	\					d-> name/**/flg&=~EF_ON#endif				IT_ProcessEnvelope(vol);				for(u=0;u<ih.volpts;u++)					d->volenv[u].val=(ih.volnode[u]<<2);				IT_ProcessEnvelope(pan);				for(u=0;u<ih.panpts;u++)					d->panenv[u].val=					  ih.pannode[u]==32?255:(ih.pannode[u]+32)<<2;				IT_ProcessEnvelope(pit);				for(u=0;u<ih.pitpts;u++)					d->pitenv[u].val=ih.pitnode[u]+32;#undef IT_ProcessEnvelope				if(ih.pitflg&0x80) {					/* filter envelopes not supported yet */					d->pitflg&=~EF_ON;					ih.pitpts=ih.pitbeg=ih.pitend=0;#ifdef MIKMOD_DEBUG					{						static int warn=0;												if(!warn)							fprintf(stderr, "\rFilter envelopes not supported yet\n");						warn=1;					}#endif				}			}			for(u=0;u<ITNOTECNT;u++) {				d->samplenote[u]=(ih.samptable[u]&255);				d->samplenumber[u]=				  (ih.samptable[u]>>8)?((ih.samptable[u]>>8)-1):0xffff;				if(d->samplenumber[u]>=of.numsmp)					d->samplenote[u]=255;				else if (of.flags&UF_LINEAR) {					int note=(int)d->samplenote[u]+noteindex[d->samplenumber[u]];					d->samplenote[u]=(note<0)?0:(note>255?255:note);				}			}			d++;                  		}	} else if(of.flags & UF_LINEAR) {		if(!AllocInstruments()) return 0;		d=of.instruments;		of.flags|=UF_INST;		for(t=0;t<mh->smpnum;t++,d++)			for(u=0;u<ITNOTECNT;u++) {				if(d->samplenumber[u]>=of.numsmp)					d->samplenote[u]=255;				else {					int note=(int)d->samplenote[u]+noteindex[d->samplenumber[u]];					d->samplenote[u]=(note<0)?0:(note>255?255:note);				}			}	}	/* Figure out how many channels this song actually uses */	of.numchn=0;	memset(remap,-1,UF_MAXCHAN*sizeof(UBYTE));	for(t=0;t<of.numpat;t++) {		UWORD packlen;		/* seek to pattern position */		if(paraptr[mh->insnum+mh->smpnum+t]) { /* 0 -> empty 64 row pattern */			_mm_fseek(modreader,((long)paraptr[mh->insnum+mh->smpnum+t]),SEEK_SET);			_mm_read_I_UWORD(modreader);			/* read pattern length (# of rows)			   Impulse Tracker never creates patterns with less than 32 rows,			   but some other trackers do, so we only check for more than 256			   rows */			packlen=_mm_read_I_UWORD(modreader);			if(packlen>256) {				_mm_errno=MMERR_LOADING_PATTERN;				return 0;			}			_mm_read_I_ULONG(modreader);			if(IT_GetNumChannels(packlen)) return 0;		}	}	/* give each of them a different number */	for(t=0;t<UF_MAXCHAN;t++) 		if(!remap[t])			remap[t]=of.numchn++;	of.numtrk = of.numpat*of.numchn;	if(of.numvoices)		if (of.numvoices<of.numchn) of.numvoices=of.numchn;	if(!AllocPatterns()) return 0;	if(!AllocTracks()) return 0;	for(t=0;t<of.numpat;t++) {		UWORD packlen;		/* seek to pattern position */		if(!paraptr[mh->insnum+mh->smpnum+t]) { /* 0 -> empty 64 row pattern */			of.pattrows[t]=64;			for(u=0;u<of.numchn;u++) {				int k;				UniReset();				for(k=0;k<64;k++) UniNewline();				of.tracks[numtrk++]=UniDup();			}		} else {			_mm_fseek(modreader,((long)paraptr[mh->insnum+mh->smpnum+t]),SEEK_SET);			packlen=_mm_read_I_UWORD(modreader);			of.pattrows[t]=_mm_read_I_UWORD(modreader);			_mm_read_I_ULONG(modreader);			if(!IT_ReadPattern(of.pattrows[t])) return 0;		}	}	return 1;}CHAR *IT_LoadTitle(void){	CHAR s[26];	_mm_fseek(modreader,4,SEEK_SET);	if(!_mm_read_UBYTES(s,26,modreader)) return NULL;   	return(DupStr(s,26,0));}/*========== Loader information */MIKMODAPI MLOADER load_it={	NULL,	"IT",	"IT (Impulse Tracker)",	IT_Init,	IT_Test,	IT_Load,	IT_Cleanup,	IT_LoadTitle};/* ex:set ts=4: */

⌨️ 快捷键说明

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