📄 play._c
字号:
while((PIND & DREQ) == 0); //加载数据
{ mp3InData();
for(i=0;i<32;i++)
{
spiSend(0x00);//填充
data_pointer++;
}
mp3OutData();
if(data_pointer == 2047)break;
}
}//while(data_pointer<2048)
SoftReset(); //软件复位
#endif
KEYBUF_NULL;
while(1)
{
if(keybuf == K_ESC) break;
if(type == 1){
if(keybuf == K_RIFT) break;
if(keybuf == K_LIFT) break;
}
mCmdParam.ReadX.mDataBuffer = &mp3buf[0];//指向文件数据缓冲区
mCmdParam.Read.mSectorCount =1; // 指定读取的扇区数
mStopIfError(CH375FileReadX()); //读文件
ps = &mp3buf[0]; //指向文件数据缓冲区
data_pointer=0;
while(data_pointer<512)
{
while((PIND & DREQ) == 0); //等待VS1003空闲加载数据
mp3InData();
for(i=0;i<32;i++)
{
spiSend(*ps++);
data_pointer++;
}
mp3OutData();
if (data_pointer==512) break; //如果现在的数据不够了,则跳出来
}//while(data_pointer<512)
if(mCmdParam.Read.mSectorCount<1 ) break; // 实际读出的扇区数较小则说明文件已经结束
////////////
//输出方音时间
time_temp = mp3ReadReg(0x04);
if(time != time_temp) {time = time_temp;
play_record_tiem(time);
}
/////////////
}//while(1)
mStopIfError(CH375FileClose( ));//关闭文件
}
///////////////////
//调试录音
///////////////////
uchar recordmStopIfError( uchar iError )
{
if ( iError == ERR_SUCCESS ) return 1; /* 操作成功 */
else {Print_str("Error code =");
Print_val(iError);
Print_str("\r\n");
return 0;
}
}
void del_file(char *ps)
{
strcpy( (char *)mCmdParam.Erase.mPathName, ps ); //将被删除的文件名,在根目录下
CH375FileErase( ); //删除文件并关闭
}
#define SCI_HDAT0 0x08
#define SCI_HDAT1 0x09
extern unsigned char const record_now[];
extern struct time_now timebuf;
#include "../Ds1302/ds1302.h"
extern void Read_InfoDs1302buf(void);
void RecordAdpcm1003(void)
{ /* VS1003b/VS1023 */
uint ii=0;
uint w = 0, idx = 0;
unsigned long int n;
unsigned long int temp;
uchar time1=0;
uint time2=0;
/* Check and locate free space on disk */
make_newfile(); //创建文件
show_clear();
show_lcd(0, 0, 192, 2, &record_now[0],0);
show_play(&Filename[0],3,0);
record_init(); //初始化录音器
Print_str("进入录音状态\r\n");
for (idx=0; idx < sizeof(header); idx++)
{ /* Save header first */
mp3buf[idx] = header[idx];
}
/* Fix rate if needed */
/*mp3buf[24] = rate;*/
/*mp3buf[25] = rate>>8;*/
/* Record loop */
KEYBUF_NULL;
n=0;
while (1)
{
do {
w = mp3ReadReg(SCI_HDAT1);
} while (w < 256 || w > 896);
while (idx < 512) {
w = mp3ReadReg(SCI_HDAT0);
while ((idx & 255) == sizeof(header)+2 && (w & 0xFF))
{
do {
w = mp3ReadReg(SCI_HDAT1);
} while (w < 256);
w = mp3ReadReg(SCI_HDAT0);
}
mp3buf[idx++] = w>>8;
mp3buf[idx++] = w&0xFF;
}//end while (idx < 512)
idx = 0;
mCmdParam.WriteX.mSectorCount =1; // 指定读取的扇区数
mCmdParam.WriteX.mDataBuffer = &mp3buf[0]; /* 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
if(recordmStopIfError(CH375FileWriteX()) == 0) break; /* 向文件写入数据 */
n += 1;
////////////
//输出录音时间
if(++time1 == 8){time1=0;play_record_tiem(++time2);}
/////////////
if(keybuf != K_ESC){KEYBUF_NULL;continue;}
break;
}
close_make_file();
delay_ms(250);
//下面写入文件信息
strcpy( (char *)mCmdParam.Open.mPathName,&Filename[0]);
mStopIfError(CH375FileOpen( ));
mCmdParam.ReadX.mDataBuffer = &mp3buf[0];//指向文件数据缓冲区
mCmdParam.Read.mSectorCount =1; // 指定读取的扇区数
Print_str("读取文件第一个扇区\r\n");
mStopIfError(CH375FileReadX()); //读文件第一个扇区
mStopIfError(CH375FileClose( ));//关闭文件
delay_ms(250);
/* Fix WAV header information */
/* Then update FAT information */
/* Normal reset, restore default settings */
n *= 2;
temp = n*256+52;
mp3buf[4] = (uchar)temp;
temp >>= 8;
mp3buf[5] = (uchar)temp;
temp >>= 8;
mp3buf[6] = (uchar)temp;
temp >>= 8;
mp3buf[7] = (uchar)temp;
//采样平率8KHZ
temp = 8000;
mp3buf[24] = (uchar)temp;
temp >>= 8;
mp3buf[25] = (uchar)temp;
temp >>= 8;
mp3buf[26] = (uchar)temp;
temp >>= 8;
mp3buf[27] = (uchar)temp;
temp = 8000*256;
temp /= 505;
mp3buf[28] = (uchar)temp;
temp >>= 8;
mp3buf[29] = (uchar)temp;
temp >>= 8;
mp3buf[30] = (uchar)temp;
temp >>= 8;
mp3buf[31] = (uchar)temp;
temp = n*505;
mp3buf[48] = (uchar)temp;
temp >>= 8;
mp3buf[49] = (uchar)temp;
temp >>= 8;
mp3buf[50] = (uchar)temp;
temp >>= 8;
mp3buf[51] = (uchar)temp;
temp = n * 256;
mp3buf[56] = (uchar)temp;
temp >>= 8;
mp3buf[57] = (uchar)temp;
temp >>= 8;
mp3buf[58] = (uchar)temp;
temp >>= 8;
mp3buf[59] = (uchar)temp;
strcpy( (char *)mCmdParam.Open.mPathName,&Filename[0]);
mStopIfError(CH375FileOpen( ));
mCmdParam.WriteX.mSectorCount =1; // 指定读取的扇区数
mCmdParam.WriteX.mDataBuffer = &mp3buf[0]; /* 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
Print_str("新信息写入文件\r\n");
mStopIfError(CH375FileWriteX()); /* 向文件写入数据 */
//下面是在更新文件日期时间信息
Read_InfoDs1302buf();
time1 = timebuf.hour;
time1 >>= 4;
time1 *= 10;
time1 += (timebuf.hour&0x0f);
ii = timebuf.min;
ii >>= 4;
ii *= 10;
ii += (timebuf.min&0x0f);
w = timebuf.sec;
w >>= 4;
w *= 10;
w += (timebuf.sec&0x0f);
idx = timebuf.year;
idx >>= 4;
idx *= 10;
idx += (timebuf.year&0x0f);
idx += 2000;
n = timebuf.month;
n >>= 4;
n *= 10;
n += (timebuf.month&0x0f);
temp = timebuf.date;
temp >>= 4;
temp *= 10;
temp += (timebuf.date&0x0f);
mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */
mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( time1, ii, w ); /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */
mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( idx, n, temp ); /* 输入参数: 新的文件日期: 2004.05.18 */
mCmdParam.Modify.mFileSize = 0xFFFFFFFF; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */
mStopIfError(CH375FileModify( )); /* 修改当前文件的信息,修改日期和长度 */
Print_str("文件新日期时间信息写入完成\r\n");
mStopIfError(CH375FileClose( ));//关闭文件
Print_str("Record ok\r\n");
SoftReset();
}
uchar test_file(uchar *s) //文件名过滤器
{
uchar ii;
while(ii != 30){//文件名不要超过30个字节
if(*s++ != '.'){ii++; continue;}
if((*s == 'W')|(*s == 'w')) return 1;
if((*s == 'M')|(*s == 'm')) return 0;
return 0;
}
return 0;
}
/****************************************************************
*下面是随机播放文件的程序,一旦执行可以用退出键退出
****************************************************************/
void Play_audio(uchar *path)
{
uchar c;
uint i;
uchar file=0;
/*枚举根目寻下的MP3文件*/
for ( c = 0; c < 255; c ++ )
{ /* 最多搜索前255个文件 */
strcpy( mCmdParam.Open.mPathName,path); /* 搜索根目录下文件名*/
i = strlen( (char *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */
mCmdParam.Open.mPathName[ i ] =0xFF; /* 将结束符替换为255说明序号在变量中 */
CH375vFileSize=c; /*指定搜索的序号,几乎没有上限*/
i = CH375FileEnumer( ); /* 文件名中含有通配符*,则为搜索文件而不打开 */
if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
if ( i != ERR_SUCCESS ) break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
if(test_file((char *)mCmdParam.Open.mPathName) != 0){
if(CH375vFileSize!=0xFFFFFFFF) /*播放枚举到的文件*/
{
mp3_play((char *)mCmdParam.Open.mPathName,1);
file = 1;
if(keybuf == K_ESC) break;
}
}
}//end for
if(file == 0){show_lcd(2, 0, 192, 4, &nofile[0],0);
delay_1s();
delay_1s();
}
}
/****************************************************************
*下面是选择播放文件的程序,一旦执行可以用退出键退出
*只能查看前50个文件
****************************************************************/
void show_file_name(uchar point, uchar type)
{
uchar ii;
ii = 0;
while(1){
show_clear();
show_lcd(0, 0, 192, 2, &tab[0],0);
if(point > 0)
show_play(&filename[0][0],2,0);
if(point > 1)
show_play(&filename[1][0],4,0);
if(point > 2)
show_play(&filename[2][0],6,0);
switch(ii){
case 0: show_play(&filename[0][0],2,1);break;
case 1: show_play(&filename[1][0],4,1);break;
case 2: show_play(&filename[2][0],6,1);break;
}
KEYBUF_NULL;
while(keybuf == NULL);
if(keybuf == K_UP) {
if(--ii == 255) break;
}
if(keybuf == K_DOWN){if(++ii == point){
if(point == 3) break;
ii = 0;
}
}
if(keybuf == K_ESC) break;
if(keybuf == K_ENTER) {
if(type == 0) mp3_play(&filename[ii][0],0);
else {strcpy(&Filename[0],&filename[ii][0]);
break;
}
}
}
}
void Play_xuanzhe(uchar *path,uchar type)
{
uchar point;
uchar temp;
uchar c;
uint i;
uchar file=0;
point = 0;
/*枚举根目寻下的MP3文件*/
while(1){
for ( c = 0; c < 255; c ++ )
{ /* 最多搜索前255个文件 */
strcpy( mCmdParam.Open.mPathName,path ); /* 搜索根目录下文件名*/
i = strlen( (char *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */
mCmdParam.Open.mPathName[ i ] =0xFF; /* 将结束符替换为255说明序号在变量中 */
CH375vFileSize=c; /*指定搜索的序号,几乎没有上限*/
i = CH375FileEnumer( ); /* 文件名中含有通配符*,则为搜索文件而不打开 */
if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
if ( i != ERR_SUCCESS ) break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
if(test_file((char *)mCmdParam.Open.mPathName) != 0){
if(CH375vFileSize!=0xFFFFFFFF) /*播放枚举到的文件*/
{
strcpy(&filename[point][0],(char *)mCmdParam.Open.mPathName);
point++;
file = 1;
}
}
if(point != 3) continue;
KEYBUF_NULL;
show_file_name(point,type);
if(type != 0){
if(keybuf == K_ENTER) return;
if(keybuf == K_ESC) {Filename[0]= 0x00; return;}
}
else if(keybuf == K_ESC) return;
point = 0;
}//end for
if((point != 0)&(point != 3)) {file = 1;
show_file_name(point, type);
point = 0;
if(type != 0){
if(keybuf == K_ENTER) return;
if(keybuf == K_ESC) {Filename[0]= 0x00; return;}
}
else if(keybuf == K_ESC) return;
}
if(file == 0){
show_lcd(2, 0, 192, 4, &nofile[0],0);
delay_1s();
delay_1s();
keybuf = K_ESC;
break;
}
}//while(1)
}
//磁盘文件系统检查
void test_file_system(void)
{ uchar ii;
Print_str("开始磁盘目录检查\r\n");
strcpy((char *)mCmdParam.Create.mPathName,"\\RECORD\\TEST.TXT"); /* 新文件名,在根目录下的RECORD下 */
ii = CH375FileCreate();
if(ii != 0){
show_lcd(0, 0, 192, 8, &DIR[0],0);
Print_val("磁盘下没有RECORD工作目录\r\n");
while(1);
}
CH375FileClose( );//关闭文件
del_file("\\RECORD\\TEST.TXT");
strcpy((char *)mCmdParam.Create.mPathName,"\\MUSIC\\TEST.TXT"); /* 新文件名,在根目录下的RECORD下 */
ii = CH375FileCreate();
if(ii != 0){
show_lcd(0, 0, 192, 8, &DIR[0],0);
Print_val("磁盘下没有MUSIC工作目录\r\n");
while(1);
}
CH375FileClose( );//关闭文件
del_file("\\MUSIC\\TEST.TXT");
Print_val("磁盘工作目录检查完毕\r\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -