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

📄 wavgd.c

📁 用主板上的小喇叭演奏的程序 C实现 挺有意思的
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include<process.h>
#include<dos.h>
#include<alloc.h>
#define NumberOfTimes1 50
#define NumberOfTimes2 100
#define OldTimerInt 0x60
#ifdef __cplusplus
    #define __CPPARGS ...
#else
    #define __CPPARGS
#endif
unsigned long Counter;
unsigned CounterInt8,fpI8;
unsigned Port=0x210;
char Found=0;
unsigned Cnt1,Cnt2;
FILE *fp;
long num;
int smp1;
unsigned char a[64000];

struct wavhead
{
	char riffid[4];
	long cksize;
	char fcctype[4];
	char fmtid[4];
	long ck16;
	unsigned fortag;
	unsigned nchan;
	long nsamps;
	long navgbgs;
	unsigned nblocka;
	unsigned wbpsam;
	char dataid[4];
	long datalen;
}wfhead;

void Testsb();
void PlayWavBg();
void interrupt NewTimer(__CPPARGS);
void SetTimer(void interrupt(*Rout)(__CPPARGS),unsigned freq);
void RestoreTimer();

void main(int argc,char *argv[])
{
argc=2;
argv[1]="a.wav";
	if(argc<2)
	{
		printf("\nUsage:display filename.wav!!!");
		exit(0);
	}
	if(!(strstr(argv[1],".wav")||strstr(argv[1],".WAV")))
	{
		printf("\ntype of the file is wrong!please insert *.wav\n");
		exit(0);
	}
	if((fp=fopen(argv[1],"r+b"))==NULL)
	{
		printf("cannot open the file\n");
		exit(0);
	}
	fseek(fp,22L,0);
	fread(&wfhead.nchan,sizeof(int),1,fp);
	fseek(fp,24L,0);
	fread(&wfhead.nsamps,sizeof(long),1,fp);
	fseek(fp,34L,0);
	fread(&wfhead.wbpsam,sizeof(int),1,fp);
	fseek(fp,40L,0);
	fread(&num,sizeof(long),1,fp);
	fread(a, sizeof(unsigned char), 64000, fp);
	Testsb();
	PlayWavBg();
	while(!kbhit())
		printf(".");
	fclose(fp);
	RestoreTimer();
}

void Testsb()
{
	Cnt1=NumberOfTimes1;
	while((Port<=0x260)&&!Found)
	{
		outportb(Port+0x6,1);
		outportb(Port+0x6,0);
		Cnt2=NumberOfTimes2;
		while((Cnt2>0)&&(inportb(Port+0xE)<128))
			--Cnt2;
		if((Cnt2==0)||(inportb(Port+0xA)!=0xAA))
		{
			--Cnt1;
			if(Cnt1==0)
			{
				Cnt1=NumberOfTimes1;
				Port=Port+0x10;
			}
		}
		else
			Found=1;
	}
	if(!Found)
	{
		printf("Nobase port found!\n");
		printf("\nDSP not reseted!\n");
		exit(0);
	}
}

void PlayWavBg()
{
	smp1=44100/wfhead.nsamps;
	Counter=1;
	fseek(fp,44L,0);
	if(wfhead.wbpsam==16)
		num=num/2;
	SetTimer(NewTimer,44100);
}

void SetTimer(void interrupt(*Rout)(__CPPARGS),unsigned freq)
{
	int ICnt;
	unsigned char intreg21;
	fpI8=(freq+9)/18;
	intreg21=inportb(0x21);
	outportb(0x21,255);
	ICnt=1193180/freq;
	outportb(0x43,0x36);
	outportb(0x40,ICnt&255);
	outportb(0x40,ICnt>>8);
	setvect(OldTimerInt,getvect(8));
	setvect(8,Rout);
	outportb(0x21,intreg21);
}

void RestoreTimer()
{
	unsigned char intreg21;
	intreg21=inportb(0x21);
	outportb(0x21,255);
	outportb(0x43,0x36);
	outportb(0x40,0);
	outportb(0x40,0);
	setvect(8,getvect(OldTimerInt));
	outportb(0x21,intreg21);
}

void interrupt NewTimer(__CPPARGS)
{
	struct REGPACK R;
	static long i=0;
	Counter++;
	if((Counter>=smp1&&i<num)||i==0)
	{
		i++;
		outportb(Port+0xC,0x10);
		while(inportb(Port+0xC)&0x80);
		outportb(Port+0xC,a[i%64000]);
		Counter=0;
	}

	if(--CounterInt8==0)
	{
		intr(OldTimerInt,&R);
		CounterInt8=fpI8;
	}
	else outportb(0x20,0x20);
}

⌨️ 快捷键说明

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