关于多线程中实时显示歌词的后端是如何处理歌词文件的?

✅*歌词信息结构体(链表)

typedef struct lylics{

uint time; //歌词对应的时间

char lrc[lrc_length]; //歌词

struct lylics *next; //下一句歌词

}LRC;

✅*歌词句柄(链表+指针数组)

typedef struct lylics_ptr

{LRC *lrc_head; //链表首地址

LRC **lrc_arry; //存放链表节点指针的指针数组

uint lrc_arry_size; //指针数组的大小

}LRC_PTR;

✅static char *open_lrc(char *addr):打开歌词文件,读数据到缓冲区

*参数: 歌词文件地址:addr

*返回值: 缓冲区首地址

✅static LRC *add_lrc_to_link(LRC *head, uint time, char *lrc):增加一个歌词信息节点至链表结尾,维护静态LRC temp减少索引次数

*参数: 链表的表头:LRC *head

歌词时间: uint time

歌词:char *lrc

*返回值: 链表的表头:head

✅void print_lrc_link(LRC_PTR lrc);遍历输出链表

*参数: 歌词句柄:lrc

*返回值: 无

✅static void get_dispose_line(char *lycris_buf, LRC_PTR *lrc);返回每一行歌词(不带换行符号'\n')

*参数: 缓冲区首地址:lycris_buf

歌词句柄:lrc

*返回值: 无

✅LRC *dispose_lrc(char *name, LRC_PTR *lrc);处理歌词文件

*参数: 歌词文件名 :name

歌词句柄:lrc

*返回值: 歌词信息结构体(链表)

歌词文件示例:

流程图:

函数中关键性操作:

dispose_lrc

get_dispose_line

lrc->lrc_head = dispose_line(line_ptr, lrc->lrc_head);

增加LRC链表歌词操作

static void inorder_link(LRC_PTR *lrc)

链表的元素按时间大小从小到大排序,排序方法是冒泡排序。
需要将链表转换为数组才能使用冒泡排序。
也就是存放链表节点指针的指针数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值