电子-lyric.zip

  • L4_326223
    了解作者
  • 5.7KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-13 02:23
    上传日期
电子-lyric.zip,单片机/嵌入式STM32-F0/F1/F2
lyric.zip
  • lyric.c
    22KB
内容介绍
/* * ===================================================================================== * * Filename: lyric.c * * Description: 歌词模块 * * Version: 1.0 * Created: 2014/5/30 22:01:30 * 叙述: * 歌词格式: * 1)歌词lrc文件的每一名歌词是以[分:秒.毫秒]歌词内容回车换行符的形式组成; * 2)对于歌词重复的,那么就会有连续[分:秒.毫秒][分:秒.毫秒]...时间TAG连接; * 3)一个歌词文件如下: * [ti:来生缘] * [ar:刘德华] * [offset:4000] * [00:15.46] * [00:18.40]寻寻觅觅在无声无息中消逝 * [00:25.21]总是找不到回忆找不到曾被遗忘的真实 * [00:31.40] * [00:32.31]一生一世的过去你一点一滴的遗弃 * [02:46.51][01:42.47][00:39.34]痛苦痛悲痛心痛恨痛失去你 * [02:52.60][01:48.98][00:44.99] * [02:53.72][01:50.16][00:46.53]也许分开不容易也许相亲相爱不可以 * [03:00.63][01:57.02][00:53.43]痛苦痛悲痛心痛恨痛失自己 * [03:05.96][02:03.22][00:59.89] * [03:07.82][02:03.87][01:00.64]情深缘浅不得意 你我也知道去珍惜 * [03:22.19][03:14.50][02:10.70][01:07.62]只好等在来生里再踏上彼此故事的开始 * [02:25.52][01:21.62]生生世世在无穷无尽的梦里 * [02:32.46][01:28.52]偶而翻起了日记翻起了你我之间的故事 * [02:38.34][01:34.38] * [02:39.23][01:35.43]一段一段的回忆回忆已经没有意义 * [02:45.50][01:41.55] * [03:30.32] * [03:33.49] * 如此可知:.1)歌词时间TAG为8个字符,歌词文件每一句歌词以回车换行符结束; * * 4)歌词文件解码: * .1)每一句歌词都有其出现的时间; * .2)每一句歌词都是以回车换行符结束; * .3)每一句歌词时间值与歌词之间的读指针偏移为一个常数; * .4)解码过程如下: * .1)先f_open(...)打开歌词文件,得到歌词文件存储信息; * .2)从初始化读指针开始,调用f_gets(...)函数读取512字节的信息,此函数只要读取到回车换行符'\n',立即返回指针; * .3)对读出的每条歌词信息进行分析,得到其时间值及指针偏移值(地址值),建立表格一一对应,即什么时候对应哪一句 * 歌词,也就是每个时间对应一条歌词; * .4)当歌词文件读取完毕时,就建立完成了歌词出现的时间值,及相应时间值歌词地址值的表格; * .5)对表格按时间顺序进行排列,在表格内低时间值在最前面,并由此对应地址值,因而完全建立了一个随时间的歌词映射表; * ===================================================================================== */ #include "lyric.h" /* * ===================================================================================== * Name: void lrc_chg_suffix(u8 *name,u8 *sfx) * Description: 函数功能:把后缀名改为sfx所指示的后缀名 * 入口参数:1)name * 2)sfx 指向新的后缀名 * 出口参数:无 * ===================================================================================== */ void lrc_chg_suffix(u8 *name,u8 *sfx){ /* 更换后缀名 */ while(*name!='\0'){ /* 直到name尾部 */ name++; /* 指向下一个字符位 */ } while(*name!='.'){ /* 找到后缀名起始位 */ name--; /* 由尾部向前部找寻 */ } *(++name)=sfx[0]; *(++name)=sfx[1]; *(++name)=sfx[2]; /* 将后缀名更换为lrc */ *(++name)='\0'; /* 添加字符串结束符 */ } /* * ===================================================================================== * Name: _lyric_obj* lrc_creat(void) * Description: 函数功能:创建歌词结构体 * 入口参数:无 * 出口参数:返回歌词结构体指针 * ===================================================================================== */ _lyric_obj *lrc_creat(void){ /* 创建歌词 */ _lyric_obj *lrc_crt; /* 歌词控制块结构体指针 */ lrc_crt=(_lyric_obj*)GUI_MemoryInteralMalloc(sizeof(_lyric_obj));/* 分配内存 */ if(lrc_crt==NULL){ /* 内存分配不够 */ return(NULL); /* 返回空指针 */ } GUI_MemorySet((u8 *)lrc_crt,0,sizeof(_lyric_obj)); /* 内存区清零 */ lrc_crt->flrc=(FIL*)GUI_MemoryInteralMalloc(sizeof(FIL)); /* 分配内存,用于歌词文件 */ if(lrc_crt->flrc==NULL){ /* 内存分配不够 */ GUI_MemoryInternalFree(lrc_crt); /* 释放前面申请的歌词控制块数据 */ return(NULL); /* 返回空指针 */ } GUI_MemorySet((u8 *)lrc_crt->flrc,0,sizeof(FIL)); /* 否则,清零内存区 */ return(lrc_crt); /* 返回歌词控制块结构体 */ } /* * ===================================================================================== * Name: void lrc_delete(_lyric_obj* lcrdelete) * Description: 函数功能:释放LRC所申请的内存 * 入口参数:1)lcrdelete 歌词结构体指针 * 出口参数:无 * ===================================================================================== */ void lrc_delete(_lyric_obj* lcrdelete){ GUI_MemoryInternalFree(lcrdelete->flrc); /* 删除歌词文件结构体 */ GUI_MemoryInternalFree(lcrdelete); /* 删除歌词结构体 */ } /* * ===================================================================================== * Name: u8 lrc_str2num(u8 *str) * Description: 函数功能:将2个数字符转为数字 * 入口参数:1)str 字符串指针 * 出口参数:返回数字值; * Notes: 1)歌词格式如下; *[ti:来生缘] *[ar:刘德华] *[offset:4000] * [00:15.46] * [00:18.40]寻寻觅觅在无声无息中消逝 * [00:25.21]总是找不到回忆找不到曾被遗忘的真实 * [00:31.40] * [00:32.31]一生一世的过去你一点一滴的遗弃 * [02:46.51][01:42.47][00:39.34]痛苦痛悲痛心痛恨痛失去你 * [02:52.60][01:48.98][00:44.99] * [02:53.72][01:50.16][00:46.53]也许分开不容易也许相亲相爱不可以 * [03:00.63][01:57.02][00:53.43]痛苦痛悲痛心痛恨痛失自己 * [03:05.96][02:03.22][00:59.89] * [03:07.82][02:03.87][01:00.64]情深缘浅不得意 你我也知道去珍惜 * [03:22.19][03:14.50][02:10.70][01:07.62]只好等在来生里再踏上彼此故事的开始 * [02:25.52][01:21.62]生生世世在无穷无尽的梦里 * [02:32.46][01:28.52]偶而翻起了日记翻起了你我之间的故事 * [02:38.34][01:34.38] * [02:39.23][01:35.43]一段一段的回忆回忆已经没有意义 * [02:45.50][01:41.55] * [03:30.32] * [03:33.49] * ===================================================================================== */ u8 lrc_str2num(u8 *str){ u8 chr; /* 存府字符 */ if(*str==':'||*str=='.'||*str=='\0'){ /* 第一个数据就是:/.,错误的数据TAG */ return(0); } chr=*str; /* 存储第一个字符值 */ str++; /* 指向下一个位置 */ if(*str==':'||*str=='.'||*str=='\0'){ /* 下一个字符是:或者.,即表示只有一位数值数据 */ return(chr-'0'); /* 将数字字符转换成数值 */ } return((chr-'0')*10+(*str-'0')); /* 否则,为两位数的数值 */ } /* * ===================================================================================== * Name: void lrc_analyze(_lyric_obj *lrcx,u16 lrcpos,u8 *str) * Description: 函数功能:歌词TAG分析 * 入口参数:1)lrcx 歌词控制块结构体指针 * 2)lrcpos 当前string的起始地址 * 3)str 当前string指针,其所指的字符串必须以'['开头,以回车换行符结束或结束符 * 结束,否则为错误的歌词格式; * * Notes: 1)变量status格式: * status[7]=1,表示是时间TA
评论
    相关推荐