WAV录音播放系统源代码.docx
- 文档编号:10090569
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:10
- 大小:17.33KB
WAV录音播放系统源代码.docx
《WAV录音播放系统源代码.docx》由会员分享,可在线阅读,更多相关《WAV录音播放系统源代码.docx(10页珍藏版)》请在冰豆网上搜索。
WAV录音播放系统源代码
/*filename:
wavrec.c*/
#include
#include
#include
#include
#include
#include
#include
#defineBUFSIZE512
#defineBLOCKS4000
voidwrite_header(FILE*,int);
structRIFF_Header//资源互换文件格式RIFF,树状结构,基本单位是chunk,整个文件有个chunk构成{
charRIFF_ID[4];
uint32_tRIFF_Size;
charRIFF_Format[4];
};
structChunk_Header//辨别码fmt和data,fmt的chunk下包含了一个PCMWAVEFORMAT数据结构,chunk之后是原始声音的采样数据{charChunk_ID[4];
uint32_tChunk_Size;
};
structWave_Format{uint16_tAudioFormat;//声音的格式代号
uint16_tNumChannels;//声音通道
uint32_tSampleRate;//采样率
uint32_tAvgBytesPerSec;//=采样率*区块对其单位
uint16_tBlockAlign;//区块对其单位=每个取样所需位数*声音通道/8
uint16_tBitsPerSample;//每个取样所需位数
};
structRIFF_Headerriff_header;
structChunk_Headerfmt_chunk,data_chunk;
structWave_Formatwavfmt;
voidinit(){printf("************************************\n");
printf("TeamNumber:
21\n");
printf("WAVPlayer\n");
printf("k1=recording;k2=playing;k3=exit\n");
printf("************************************\n");}voidinit1(){printf("************************************\n");
printf("k1=recording;k2=playing;k3=exit\n");
printf("************************************\n");}intmain(intargc,char*argv[]){charbuf[BUFSIZE];
FILE*fwave;//Storesinformationaboutcurrentstateofstream;usedinallstreamI/Ointsndfd,zh;
intstatus;
intarg;
intreadbytes;
intwritebytes;
intwrited,readed;
inttotal_len=BLOCKS*BUFSIZE;//4000*512;
intkeyid=0;
charbuttons[3]={'0','0','0'};
init();
buttons_fd=open("/dev/buttons",0);{perror("opendevicebuttons");
exit
(1);
operations.
intbuttons_fd;
if(buttons_fd<0)}for(;;){charcur_buttons[3]={'0','0','0'};
inti;
if(read(buttons_fd,cur_buttons,sizeof(cur_buttons))!
=sizeof(cur_buttons)){}for(i=0;i<3;i++){if(buttons[i]!
=cur_buttons[i]){}
switch(keyid){case1:
{keyid=0;
printf("rec:
\n");
/*if(argc<2)//Anintegerthatcontainsthecountofargumentsthat//Theargcparameterisalwaysgreaterthanorequalto
1.{
fprintf(stderr,"Usage:
waverec
fwave=fopen("/opt/rpk/arm.wav","w");//指向FILE的指针,argv[1]文件//Openafile.
//Eachofthesefunctionsreturnsapointertotheopenfile.Anullif(fwave==NULL){}
sndfd=open("/dev/dsp",O_RDONLY);//返回一个文件描述符,要打开的文if(sndfd<0)fprintf(stderr,"Can'topenfile%s\n",argv[1]);
exit(-1);
buttons[i]=cur_buttons[i];
keyid=(cur_buttons[i]%2)?
(i+1):
0;
printf("keyid=%d",keyid);
perror("readbuttonserror:
\n");
//exit(-1);
followinargv.
toastream.
}*/
名称,"w"只写方式打开一个文本文件
pointervalueindicatesanerror.
件路径和名称,读写打开,Opensfileforbothreadingandwriting{}
//文件写入WAV声音格式
write_header(fwave,total_len);
arg=wavfmt.BitsPerSample;
status=ioctl(sndfd,SOUND_PCM_WRITE_BITS,&arg);//设备驱动程序中对//其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用//备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有//cmd的意义相关的。
//Thismethodretrievesoperatingparametersassociatedwithesocket,if(status==-1)
arg=wavfmt.NumChannels;
status=ioctl(sndfd,SOUND_PCM_WRITE_CHANNELS,&arg);
if(status==-1)
arg=wavfmt.SampleRate;
status=ioctl(sndfd,SOUND_PCM_WRITE_RATE,&arg);
if(status==-1)
printf("beginrecordforafewseconds...\n");
for(zh=0;zh readbytes=read(sndfd,buf,BUFSIZE);//Extractsbytesfromthe//从文件描述符fd所指向的文件中读取count个字节的数据到buf所指向的if(readbytes! =BUFSIZE) perror("Readrec_deviceerror! "); writebytes=fwrite(buf,1,readbytes,fwave);//FILE*fp,char//unsignedlongsec_write_to) perror("SOUND_PCM_WRITE_RATEioctlfailed"); perror("SOUND_PCM_WRITE_CHANNELSioctlfailed"); perror("SOUND_PCM_WRITE_BITSioctlfailed"); perror("openof/dev/dspfailed"); exit(-1); 设备的I/O通道进行管理的函数 户程序对设 或没有是和 streamuntilthelimitnCountisreachedoruntiltheendoffileisreached. 缓存中 *filename,intsize,\}{ keyid=0; printf("play: \n"); fwave=fopen("/opt/rpk/arm.wav","r");//文件名,空则打不开if(fwave==NULL){} fread(&riff_header,1,sizeof(structRIFF_Header),fwave);//Readsdata//printheaderinformation printf("riff_header.RIFF_ID="); for(zh=0;zh<4;zh++) printf("%c",riff_header.RIFF_ID[zh]); printf("\nriff_header.RIFF_Size=%u\n",riff_header.RIFF_Size);printf("riff_header.RIFF_Format="); for(zh=0;zh<4;zh++) printf("%c",riff_header.RIFF_Format[zh]); printf("\n"); //endheaderinformation if(strncmp(riff_header.RIFF_ID,"RIFF",4)||{} sndfd=open("/dev/dsp",O_WRONLY);//返回一个文件描述符,要打开的文if(sndfd<0)fprintf(stderr,"Unknownfileformat.\n"); exit(-1); fprintf(stderr,"Can'topenfile%s\n",argv[1]); exit(-1);}fclose(fwave); close(sndfd); printf("recordisover\n"); init1(); break; if(writebytes! =readbytes) printf("Writewavefileerror! \n"); case2: fromastream. strncmp(riff_header.RIFF_Format,"WAVE",4)) 件路径和名称,读写打开,Opensfileforbothreadingandwriting{} fread(&fmt_chunk,1,sizeof(structChunk_Header),fwave);//Readsdata//printchunk_headerinformation printf("fmt_chunk.Chunk_ID="); for(zh=0;zh<4;zh++) printf("%c",fmt_chunk.Chunk_ID[zh]); printf("\n"); printf("fmt_chunk.Chunk_Size=%d\n",fmt_chunk.Chunk_Size);//endchunk_headerinformation if(! strncmp(fmt_chunk.Chunk_ID,"fmt",4)){/*thisisafmtchunk*/ fread(&wavfmt,1,sizeof(structWave_Format),fwave);//printwaveformatinformation printf("wavfmt.AudioFormat=%d\n",wavfmt.AudioFormat);printf("wavfmt.NumChannels=%d\n",wavfmt.NumChannels);printf("wavfmt.SampleRate=%d\n",wavfmt.SampleRate); printf("wavfmt.AvgBytesPerSec=%d\n",wavfmt.AvgBytesPerSec);printf("wavfmt.BlockAlign=%d\n",wavfmt.BlockAlign); printf("wavfmt.BitsPerSample=%d\n",wavfmt.BitsPerSample);//endwaveformatinformation arg=wavfmt.BitsPerSample; status=ioctl(sndfd,SOUND_PCM_WRITE_BITS,&arg); if(status==-1) arg=wavfmt.NumChannels; status=ioctl(sndfd,SOUND_PCM_WRITE_CHANNELS,&arg);if(status==-1) arg=wavfmt.SampleRate; status=ioctl(sndfd,SOUND_PCM_WRITE_RATE,&arg); if(status==-1)perror("SOUND_PCM_WRITE_CHANNELSioctlfailed");perror("unabletosetnumberofchannels"); if(arg! =wavfmt.NumChannels)perror("SOUND_PCM_WRITE_BITSioctlfailed"); perror("unabletosetsamplesize"); if(arg! =wavfmt.BitsPerSample) perror("openof/dev/dspfailed"); exit(-1); fromastream.}else{} while(fread(&data_chunk,1,sizeof(structChunk_Header),fwave)! =0){ if(! strncmp(data_chunk.Chunk_ID,"data",4)){} else} printf("readed=%d,writed=%d\n",readed,writed); readbytes=fread(buf,1,BUFSIZE,fwave);writebytes=write(sndfd,buf,readbytes);if(writebytes! =readbytes) // readed+=readbytes; writed+=writebytes;perror("wrotewrongnumberofbytes");//printdatachunkinformation printf("data_chunk.Chunk_ID=%s\n","data"); printf("data_chunk.Chunk_Size=%d\n",data_chunk.Chunk_Size);//endprintdatachunkinformation printf("BeginPlay\n"); /*thisisadatachunk*/ writed=0; readed=0; while(writed intsize; fprintf(stderr,"Can'tfindfmtchunk.\n"); exit(-1); /*skipextrabytes*/ fseek(fwave,fmt_chunk.Chunk_Size-16+fmt_chunk.Chunk_Size%2,printf("fseek=%d\n",fmt_chunk.Chunk_Size-16+ perror("SOUND_PCM_WRITEioctlfailed"); SEEK_CUR); fmt_chunk.Chunk_Size%2); stream. size=(data_chunk.Chunk_Size-writed>=BUFSIZE)? BUFSIZE: data_chunk.Chunk_Size-writed;printf("readbytes=%d,writebytes=%d\n",readbytes,writebytes);}fclose(fwave); close(sndfd); printf("playisover\n"); init1(); break;{}/*skipunknownchunks*/ fseek(fwave,data_chunk.Chunk_Size+fmt_chunk.Chunk_Size%2,SEEK_CUR);}case3: }voidwrite_header(FILE*fp,intlen){fmt_chunk.Chunk_ID[0]='f'; fmt_chunk.Chunk_ID[1]='m'; fmt_chunk.Chunk_ID[2]='t'; fmt_chunk.Chunk_ID[3]=''; fmt_chunk.Chunk_Size=sizeof(wavfmt); riff_header.RIFF_ID[0]='R'; riff_header.RIFF_ID[1]='I'; riff_header.RIFF_ID[2]='F'; riff_header.RIFF_ID[3]='F'; riff_header.RIFF_Size=len+44; riff_header.RIFF_Format[0]='W'; riff_header.RIFF_Format[1]='A'; riff_header.RIFF_Format[2]='V'; riff_header.RIFF_Format[3]='E';}return0; }{ exit(-1);}} }data_chunk.Chunk_ID[0]='d'; data_chunk.Chunk_ID[1]='a'; data_chunk.Chunk_ID[2]='t'; data_chunk.Chunk_ID[3]='a'; data_chunk.Chunk_Size=len; //Writesdatatoastream.size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILEfwrite(&riff_header,1,sizeof(riff_header),fp);//资源互换文件格式RIFF,树状结构,基本单位fwrite(&fmt_chunk,1,sizeof(fmt_chunk),fp);//辨别码fmt和data,fmt的chunk下包含了一个fwrite(&wavfmt,1,sizeof(wavfmt),fp);//fmt+sizeof(wavfmt) fwrite(&data_chunk,1,sizeof(data_chunk),fp);//* wavfmt.AudioFormat=1; wavfmt.NumChannels=2; wavfmt.SampleRate=22050; wavfmt.AvgBytesPerSec=88200; wavfmt.BlockAlign=4; wavfmt.BitsPerSample=16; *stream); 是chunk,整个文件有个chunk构成 PCMWAVEFORMAT数据结构,chunk之后是原始声音的采样数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WAV 录音 播放 系统 源代码