|
分享一个STM32移植FAFTS文件系统遍历创建文件夹
|
F429I-DISC1体验报告(1)久经沙场,锋芒依旧丨TouchGFX开发F429丨国庆开发板测评活动
实战经验 | KEIL环境下printf导致程序无法执行的解决方案
经验分享 | 程序换个IDE就不运行了?
经验分享 | 常被误解的开、关总中断话题
【STM32U3评测】SPIDMA发送
【STM32U3评测】实现双通道串口通信系统
实战经验 | RT-Thread环境下Flash错误标志问题解析
OpenBLT移植到STM32F405开发板
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32 固件库使用手册的中文翻译版
微信公众号
手机版
#include <stdlib.h>
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值
/*****************************************************************************\
函数功能:歌词解析
形参说明:_cpLrcPath 歌词路径
返 回 值:0 - 成功 / 1 - 失败
\*****************************************************************************/
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
{
//变量定义
FIL fp; //文件指针
FRESULT res; //文件系统返回值
UINT br; //成功读取的字节数
uint16_t usTime = 0; //用于临时存放转换计算后的时间
uint32_t ulFileSize; //歌词文件总大小
uint32_t i = 0, j = 0; //临时变量
char *ptmp = NULL; //歌词内容指针
char *pbuff = NULL; //用于存放所有歌词内容
//打开文件
res = f_open(&fp, _cpLrcPath, FA_READ);
if (res == FR_OK)
{
//计算文件大小
ulFileSize = f_size(&fp);
//申请空间
pbuff = malloc(ulFileSize);
if (pbuff != NULL)
{
//一次性将总缓冲区读满
res = f_read(&fp, pbuff, ulFileSize, &br);
if (res == FR_OK && br == ulFileSize)
{
//找到歌词的起始位置
i = 0;
ptmp = strstr(pbuff, "[");
while (ptmp[i] != '\0') //遍历缓冲区中的信息
{
/**********************解析时间**********************/
//[00:40.452]
//[分:秒.毫秒]
usTime = 0;
//计算该行歌词播放时间(秒),毫秒部分四舍五入
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)
i++; // ':'
usTime += (ptmp[i++] - '0') * 10; //秒(十位)
usTime += (ptmp[i++] - '0') * 1; //秒(个位)
i++; // '.'
if (ptmp[i++] >= 5) usTime++;
//手动调整时间误差
if (usTime > 5) usTime -= (usTime / 10 + 1);
//保存时间
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
printf("%02d:%02d ", usTime/60, usTime%60);
/**********************拷贝歌词**********************/
j = 0;
//让指针偏移到歌词文本部分
while (ptmp[i++] != ']');
//拷贝歌词内容
while (ptmp[i] != '\0' && ptmp[i] != '[')
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];
}
//制作成字符串
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
g_ucLrcTableIndex++;
}
}
free(pbuff);
}
f_close(&fp);
}
if (i != 0) return 0;
else return 1;
}