UINT8 ListAll( void ) /* 以广度优先的算法枚举整个U盘中的所有文件及目录 */ { UINT8 s, Song_th=1; UINT16 OldFileCount; // UINT16 RealReadCount;
u8 *pu8Temp = u8SectorBuf; u32 u32FileLen = 0; u32 u32DataCnt = 0; u32 m; u8 j, nameLen; char *pExt;
u32 file_pos=0; //记录文件播放的长度
FileNameBuffer[ 0 ].Name[0] = '/'; /* 根目录,是完整路径名,除根目录是绝对路径之外都是相对路径 */ FileNameBuffer[ 0 ].Name[1] = 0; FileNameBuffer[ 0 ].DirStartClust = 0; /* 根目录的起始簇号 */ FileNameBuffer[ 0 ].Attr = ATTR_DIRECTORY; /* 根目录也是目录,作为第一个记录保存 */ for ( OldFileCount = 0, FileCount = 1; OldFileCount < FileCount; OldFileCount ++ ) { /* 尚有新枚举到的文件名结构未进行分析,FileCount处于变化之中 */ if ( FileNameBuffer[ OldFileCount ].Attr & ATTR_DIRECTORY ) { /* 是目录则继续进行深度搜索 */ s = ListFile( OldFileCount ); /* 枚举目录,记录保存到结构中,FileCount可能会改变 */ if ( s != USB_INT_SUCCESS ) return( s ); } }
/* U盘中的文件及目录全部枚举完毕,下面开始根据结构记录依次打开文件 */ printf( "Total file&dir = %d, Open every file:\n", FileCount ); for ( OldFileCount = 0; OldFileCount < FileCount; OldFileCount ++ ) { if ( ( FileNameBuffer[ OldFileCount ].Attr & ATTR_DIRECTORY ) == 0 ) { /* 是文件则打开,目录则跳过 */ // USART1_SendByte(0xe4); LCD_ShowString(100,110,"is file"); nameLen = strlen( (char const *)(FileNameBuffer[ OldFileCount ].Name) ); if(nameLen < 4) continue; pExt = ((char *)(FileNameBuffer[ OldFileCount ].Name)) + nameLen - 4; if(strcmp(pExt, (char *)".MP3") == 0 ){ // printf( "Open file: %s\n", FileNameBuffer[ OldFileCount ].Name ); CH376WriteVar32( VAR_START_CLUSTER, FileNameBuffer[ OldFileCount ].DirStartClust ); /* 将当前文件所在上级目录的起始簇号设置为当前簇号,相当于打开上级目录 */ s = CH376FileOpen( FileNameBuffer[ OldFileCount ].Name ); /* 打开文件 */ USART1_SendByte(s); if ( s == USB_INT_SUCCESS ) { /* 成功打开了文件 */ // USART1_SendByte(0xe5); LCD_ShowString(50,120,"file OPEN!"); // timer=5;//设置到一个不可能的值,初始化信息栏 u32FileLen = CH376GetFileSize(); /* 获取文件大小 */ while (u32DataCnt < u32FileLen) { SPI2_SetSpeed(SPI2_SPEED_4);//高速 pu8Temp = u8SectorBuf; CH376SecRead(pu8Temp, 1, 0); /*以扇区为单位从当前位置读取数据块,不支持SD卡*/ u32DataCnt += 512;
// MP3_PROG(file_pos,u32FileLen);//MP3进度显示/播放时间
MP3_Msg_Show(u32FileLen,Song_th,255,file_pos); //MP3进度显示/播放时间
SPI1_SetSpeed(SPI1_SPEED_8); //高速,对VS1003B,设置为4.5M LCD_ShowString(160,180,"PLAY!"); m = 0; while (m < 512) //循环发送512个字节 { while (VS_DREQ == 0); //等待DREQ为高 VS_XDCS = 0; for (j=0; j<32; j++) { SPI1_ReadWriteByte(*pu8Temp++); } m += 32; VS_XDCS = 1; // } } file_pos++;//增加512个字节 if(file_pos>(u32FileLen/512))break;//文件长度到了 结束了,跳出 } Song_th++; // CH376FileClose( FALSE ); /* 不做写操作可以无需关闭 */ LCD_ShowString(50,120,"file close!"); Mp3Reset(); Vs1003SoftReset(); } } }
}
return( s ); }