初级会员

- 积分
- 127
- 金钱
- 127
- 注册时间
- 2013-10-20
- 在线时间
- 0 小时
|
5金钱
以下是基于迷你板子的recorder.c部分代码:
现在就是可以初始化完毕后进入录音模式,但是保存录音文件功能失效,哪位帮忙看看问题出在哪儿,万分感谢,附件是整体工程
//录音机
//所有录音文件,均保存在SD卡RECORDER文件夹内.
u8 recoder_play(void)
{
u8 res;
u8 key;
u8 rval=0;
__WaveHeader *wavhead=0;
u32 sectorsize=0;
FIL* f_rec=0; //文件
DIR recdir; //目录
u8 *recbuf; //数据内存
u16 w;
u16 idx=0;
u8 rec_sta=0; //录音状态
//[7]:0,没有录音;1,有录音;
//[6:1]:保留
//[0]:0,正在录音;1,暂停录音;
u8 *pname=0;
u8 timecnt=0; //计时器
u32 recsec=0; //录音时间
u8 recagc=4; //默认增益为4
u8 playFlag=0; //播放标志
Show_Str(60,130,200,16,"KEY1:REC/PAUSE",16,0);
Show_Str(60,150,200,16,"KEY0:STOP&SAVE",16,0);
Show_Str(60,170,200,16,"KEY_UP lay The File",16,0);
while(f_opendir(&recdir,"0:/RECORDER"))//打开录音文件夹
{
Show_Str(60,230,240,16,"RECORDER文件夹错误!",16,0);
delay_ms(200);
LCD_Fill(60,230,240,246,WHITE); //清除显示
delay_ms(200);
f_mkdir("0:/RECORDER"); //创建该目录
}
f_rec=(FIL *)mymalloc(SRAMIN,sizeof(FIL)); //开辟FIL字节的内存区域
if(f_rec==NULL)rval=1; //申请失败
wavhead=(__WaveHeader*)mymalloc(SRAMIN,sizeof(__WaveHeader));//开辟__WaveHeader字节的内存区域
if(wavhead==NULL)rval=1;
recbuf=mymalloc(SRAMIN,512);
if(recbuf==NULL)rval=1;
pname=mymalloc(SRAMIN,30); //申请30个字节内存,类似"0:RECORDER/REC00001.wav"
if(pname==NULL)rval=1;
if(rval==0) //内存申请OK
{
recoder_enter_rec_mode(1024*recagc);
while(VS_RD_Reg(SPI_HDAT1)>>8); //等到buf 较为空闲再开始
recoder_show_time(recsec); //显示时间
recoder_show_agc(recagc); //显示agc
pname[0]=0; //pname没有任何文件名
while(rval==0)
{
key=KEY_Scan();
switch(key)
{
case KEY0_VAL: //STOP&SAVE
if(rec_sta&0X80)//有录音
{
wavhead->riff.ChunkSize=sectorsize*512+36; //整个文件的大小-8;
wavhead->data.ChunkSize=sectorsize*512; //数据大小
f_lseek(f_rec,0); //偏移到文件头.
f_write(f_rec,(const void*)wavhead,sizeof(__WaveHeader),&bw);//写入头数据
f_close(f_rec);
sectorsize=0;
}
rec_sta=0;
recsec=0;
LED1=1; //关闭DS1
LCD_Fill(60,230,240,246,WHITE); //清除显示,清除之前显示的录音文件名
recoder_show_time(recsec); //显示时间
break;
case KEY1_VAL: //REC/PAUSE
if(rec_sta&0X01)//原来是暂停,继续录音
{
rec_sta&=0XFE;//取消暂停
}else if(rec_sta&0X80)//已经在录音了,暂停
{
rec_sta|=0X01; //暂停
}else //还没开始录音
{
rec_sta|=0X80; //开始录音
recoder_new_pathname(pname); //得到新的名字
Show_Str(60,230,240,16,pname+11,16,0); //显示当前录音文件名字
recoder_wav_init(wavhead); //初始化wav数据
res=f_open(f_rec,(const TCHAR*)pname, FA_CREATE_ALWAYS | FA_WRITE);
if(res) //文件创建失败
{
rec_sta=0; //创建文件失败,不能录音
rval=0XFE; //提示是否存在SD卡
}else res=f_write(f_rec,(const void*)wavhead,sizeof(__WaveHeader),&bw);//写入头数据
}
if(rec_sta&0X01)LED1=0; //提示正在暂停
else LED1=1;
break;
case KEY_UP_VAL:
playFlag = 1;
mp3_play();
break;
}
///////////////////////////////////////////////////////////
//读取数据
if(rec_sta==0X80)//已经在录音了
{
w=VS_RD_Reg(SPI_HDAT1);
if((w>=256)&&(w<896))
{
idx=0;
while(idx<512) //一次读取512字节
{
w=VS_RD_Reg(SPI_HDAT0);
recbuf[idx++]=w&0XFF;
recbuf[idx++]=w>>8;
}
res=f_write(f_rec,recbuf,512,&bw);//写入文件
if(res)
{
printf("err:%d\r\n",res);
printf("bw:%d\r\n",bw);
break;//写入出错.
}
sectorsize++;//扇区数增加1,约为32ms
}
}else//没有开始录音,则检测TPAD按键
{
if(playFlag&&pname[0])//如果触摸按键被按下,且pname不为空
{
playFlag = 0;
Show_Str(60,230,240,16,"播放:",16,0);
Show_Str(60+40,230,240,16,pname+11,16,0); //显示当播放的文件名字
rec_play_wav(pname); //播放pname
LCD_Fill(60,230,240,246,WHITE); //清除显示,清除之前显示的录音文件名
recoder_enter_rec_mode(1024*recagc); //重新进入录音模式
while(VS_RD_Reg(SPI_HDAT1)>>8); //等到buf 较为空闲再开始
recoder_show_time(recsec); //显示时间
recoder_show_agc(recagc); //显示agc
}
delay_ms(5);
timecnt++;
if((timecnt%20)==0)LED0=!LED0;//DS0闪烁
}
/////////////////////////////////////////////////////////////
if(recsec!=(sectorsize*4/125))//录音时间显示
{
LED0=!LED0;//DS0闪烁
recsec=sectorsize*4/125;
recoder_show_time(recsec);//显示时间
}
}
}
myfree(SRAMIN,wavhead);
myfree(SRAMIN,recbuf);
myfree(SRAMIN,f_rec);
myfree(SRAMIN,pname);
return rval;
}
现在就是可以初始化完毕后进入录音模式,但是保存录音文件功能失效,哪位帮忙看看问题出在哪儿,万分感谢,附件是整体工程 |
|