📄 main.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 + -