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

📄 main.c

📁 自己写的
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include "recordAPI.h"typedef struct{                          //ADDR LEN  TYPE    COMMEMTS    char  riff[5];         //00H   4   char    "RIFF"标志    long  fileLen;         //04H   4   long    文件长度    char  wave[5];         //08H   4   char    "WAVE"标志    char  fmt[5];          //0CH   4   char    "fmt"标志                           //10H   4   long    过渡字节(不定)    short audioFormat;     //14H   2   short   格式类别(10H为PCM形式的声音数据)    short channels;        //16H   2   short   通道数,单声道为1,双声道为2    long  sampleRate;      //18H   4   long    采样率(每秒样本数),表示每个通道的播放速度,    long  bytesPerSecond;  //1CH   4   long    波形音频数据传送速率,其值为						   //                  通道数×每秒数据位数×每样本的数据位数/8。						   //                  播放软件利用此值可以估计缓冲区的大小。    short bytesPerBlock;   //20H   2   short   数据块的调整数(按字节算的),其值为						   //                  通道数×每样本的数据位值/8。						   //                  播放软件需要一次处理多个该值大小的字节数据,以便将其 值用于缓冲区的调整。    short bitsPerSample;   //22H   2   short   每样本的数据位数,表示每个声道中各个样本的数据位数。						   //                  如果有多个声道,对每个声道而言,样本大小都一样。    char  data[5];         //24H   4   char    数据标记符"data"    long  dataLen;         //28H   4   long    语音数据的长度    long  timeSize;} WAV_STRUCTURE;void wav_write(FILE *fpr, WAV_STRUCTURE *pwav){	int temp = 16;    rewind(fpr);    fwrite( (pwav->riff),   4,1, fpr);//RIFF    fwrite(&(pwav->fileLen),4,1, fpr);//lenth    fwrite( (pwav->wave),   4,1, fpr);//WAVE	fwrite( (pwav->fmt),    4,1, fpr);//fmt    //fseek( fpr, 20, SEEK_SET );	fwrite(           &temp,    4,1, fpr);//fmt    fwrite(&(pwav->audioFormat),2,1, fpr);    fwrite(&(pwav->channels),   2,1, fpr);    fwrite(&(pwav->sampleRate), 4,1, fpr);    fwrite(&(pwav->bytesPerSecond),4,1, fpr);    fwrite(&(pwav->bytesPerBlock), 2,1, fpr);    fwrite(&(pwav->bitsPerSample), 2,1, fpr);    fwrite( (pwav->data),   4,1, fpr);    fwrite(&(pwav->dataLen),4,1, fpr);    //Generallay the fileLen = dataLen + 36; the following code is a commend methods.    //pwav->dataLen = pwav->fileLen - 36;    //pwav->timeStamp = 0;    //pwav->timeSize  = 0;}void add_wavHeader(int rate,int channel,int bits, int fileLen,FILE *fp){	WAV_STRUCTURE wavHeader;	wavHeader.audioFormat = 0x1;	wavHeader.bitsPerSample = bits;	wavHeader.sampleRate = rate;	wavHeader.channels = channel;	wavHeader.fileLen = fileLen;	wavHeader.bytesPerSecond = (wavHeader.sampleRate)* (wavHeader.channels) * 2;	wavHeader.bytesPerBlock = (wavHeader.channels) * 2;	wavHeader.riff[0]='R';wavHeader.riff[1]='I';wavHeader.riff[2]='F';wavHeader.riff[3]='F';	wavHeader.wave[0]='W';wavHeader.wave[1]='A';wavHeader.wave[2]='V';wavHeader.wave[3]='E';	wavHeader.fmt[0] ='f';wavHeader.fmt[1] ='m';wavHeader.fmt[2] ='t';wavHeader.fmt[3] =' ';	wavHeader.data[0]='d';wavHeader.data[1]='a';wavHeader.data[2]='t';wavHeader.data[3]='a';	wavHeader.dataLen = wavHeader.fileLen - 36;	wav_write(fp,&wavHeader);}void wav_print(FILE *fpr){	WAV_STRUCTURE wavHeader;	WAV_STRUCTURE *pwav;	pwav = &wavHeader;    rewind(fpr);    fread( (pwav->riff),   4,1, fpr);    pwav->riff[4]='\0';	printf("pwav->riff[4]=%s\n",pwav->riff);    fread(&(pwav->fileLen),4,1, fpr);	printf("pwav->fileLen=%d\n",pwav->fileLen);    fread( (pwav->wave),   4,1, fpr);    pwav->wave[4]='\0';	printf("pwav->wave[4]=%s\n",pwav->wave);	fread( (pwav->fmt),    4,1, fpr);    pwav->fmt[3]='\0';	printf("pwav->fmt[4]=%s\n",pwav->fmt);    fseek( fpr, 20, SEEK_SET );    fread(&(pwav->audioFormat),2,1, fpr);	printf("pwav->audioFormat=%d\n",pwav->audioFormat);    fread(&(pwav->channels),   2,1, fpr);	printf("pwav->channels=%d\n",pwav->channels);    fread(&(pwav->sampleRate), 4,1, fpr);	printf("pwav->sampleRate=%d\n",pwav->sampleRate);    fread(&(pwav->bytesPerSecond),4,1, fpr);	printf("pwav->bytesPerSecond=%d\n",pwav->bytesPerSecond);    fread(&(pwav->bytesPerBlock), 2,1, fpr);	printf("pwav->bytesPerBlock=%d\n",pwav->bytesPerBlock);    fread(&(pwav->bitsPerSample), 2,1, fpr);	printf("pwav->bitsPerSample=%d\n",pwav->bitsPerSample);    fread( (pwav->data),   4,1, fpr);    pwav->data[4]='\0';	printf("pwav->data[4]=%s\n",pwav->data);    fread(&(pwav->dataLen),4,1, fpr);	printf("pwav->dataLen=%d\n",pwav->dataLen);    }int main(int argc, char *argv[]){	FILE *fp_recorded;	int sample_rate, channels, bit_persample;	int i,j;	char *buff;	int dataEachTime = 2048;	//initialize the variables from input;	//memset(buff,0,8192);	sample_rate = 32000;	channels = 1;	bit_persample = 16;	dataEachTime = atoi(argv[1]);	printf("dataEachTime=%d\n", dataEachTime);	buff = (char *)malloc(dataEachTime*channels*2);	memset(buff,0,dataEachTime*channels*2);	fp_recorded = fopen("recorded.wav","wb+");	if(fp_recorded == NULL) 	{		printf("open file error\n");		return 1;	}	printf("open device for recording\nOB");	AAI_record_open("default");	AAI_set_params(sample_rate,channels,bit_persample);	fwrite(buff,1,44,fp_recorded);	sleep(1);    	for(i = 0; i < 100; i++) 	{		j=AAI_pcm_read(buff,dataEachTime);		if(j != dataEachTime) 		{			printf("[%3d]input:%d !=output:%d!!!!!!!!!!!!!!!!!!!\n",i,dataEachTime,j);		}        		fwrite(buff,2,j,fp_recorded);	}	AAI_record_close();	add_wavHeader(sample_rate,channels,bit_persample,(4*dataEachTime*100+36),fp_recorded);	wav_print(fp_recorded);	fclose(fp_recorded);	free(buff);	return 0;}/*	stream = SND_PCM_STREAM_CAPTURE;	file_type = FORMAT_WAVE;	command = "arecord";	start_delay = 1;	//initialize the driver	err = snd_pcm_open(&handle, pcm_name, stream, open_mode);	if (err < 0) {		error(_("audio open error: %s"), snd_strerror(err));		return 1;	}	if ((err = snd_pcm_info(handle, info)) < 0) {		error(_("info error: %s"), snd_strerror(err));		return 1;	}	chunk_size = 1024;	hwparams = rhwparams;	audiobuf = (u_char *)malloc(1024);	if (audiobuf == NULL) {		error(_("not enough memory"));		return 1;	}		case 'r':			tmp = strtol(optarg, NULL, 0);			if (tmp < 300)				tmp *= 1000;			rhwparams.rate = tmp;			if (tmp < 2000 || tmp > 192000) {				error(_("bad speed value %i"), tmp);				return 1;			}			break;		case 'd':			timelimit = strtol(optarg, NULL, 0);			break;		case 'R':			start_delay = strtol(optarg, NULL, 0);			break;		case 'T':			stop_delay = strtol(optarg, NULL, 0);			break;		case 'c':			rhwparams.channels = strtol(optarg, NULL, 0);			if (rhwparams.channels < 1 || rhwparams.channels > 32) {				error(_("value %i for channels is invalid"), rhwparams.channels);				return 1;			}			break;*/

⌨️ 快捷键说明

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