📄 lrc_parser.c
字号:
#include <string.h>
#include "api.h"
#include "lrc_parser.h"
INT8U pSec2LrcStr[MAX_MUSIC_LRC_LENGTH];
INT8U u8LrcStr[MAX_LRC_SEGMENT_COUNT][LCD_WIDTH];
INT8U u8LrcStrCount;
INT8U u8line_buffer[128];
FILE_t* stream;
INT8U u8RemainBytes;
INT8U u8LineBufferPos;
INT8U u8LineBuffer[16];
BOOLEAN bIsLast;
INT8U timetok[9];
INT16U u16Time[10];
INT8U u8TimeCount;
INT8U u8LRCpos;
static BOOLEAN bGetLine(INT8U* buf)
{
INT8U i = 0;
INT8U tok;
while(1)
{
if(u8RemainBytes == 0)
{
if(bIsLast)
return FALSE;
u8LineBufferPos = 0;
u8RemainBytes = api_u16FileRead(u8LineBuffer, 16, stream);
if(u8RemainBytes < 16)
bIsLast = TRUE;
}
while(u8RemainBytes)
{
tok = u8LineBuffer[u8LineBufferPos++];
u8RemainBytes--;
if(tok == 0x0d)
continue;
else if(tok == 0x0a)
{
buf[i++] = 0;
return TRUE;
}
buf[i++] = tok;
}
}
return TRUE;
}
//only for these formats "[01:08.47]" and "[01:08]"
static int u16ParseTime(INT8U* buf)
{
return ((buf[0]-'0')*10 + (buf[1]-'0'))*60 + (buf[3]-'0')*10 + (buf[4]-'0');
}
static BOOLEAN bGetTime(INT8U* buf)
{
INT8U tok;
INT8U i=0, j=0;
BOOLEAN bFindL;
bFindL = FALSE;
while((tok = buf[i++]) != 0)
{
switch(tok)
{
case '[':
bFindL = TRUE;
break;
case ']':
if(!bFindL)
return FALSE;
timetok[j++] = 0;
u16Time[u8TimeCount++] = u16ParseTime(timetok);
j = 0;
bFindL = FALSE;
if('[' != buf[i])
{
u8LRCpos = i;
return TRUE;
}
break;
default:
timetok[j++] = tok;
break;
}
}
return TRUE;
}
BOOLEAN bParseLRC(INT8U* filename)
{
INT8U i, j, k, len, tok;
INT8U pos;
INT8U ptr[12];
// INT16U u16i;
BOOLEAN bline_end;
memset(pSec2LrcStr, 0xFF, MAX_MUSIC_LRC_LENGTH);
for(i=0;i<MAX_LRC_SEGMENT_COUNT;i++)
u8LrcStr[i][0]='\0';
// u8LrcStr[MAX_LRC_SEGMENT_COUNT][LCD_WIDTH];
u8RemainBytes = 0;
bIsLast = FALSE;
u8LrcStrCount = 0;
stream = NULL;
if( (stream = api_pFileOpen(filename)) == NULL )
return FALSE;
while(1)
{
if(FALSE == bGetLine(u8line_buffer)) //Get Line data from LRC
break;
u8TimeCount = 0;
if(bGetTime(u8line_buffer)) //Get time information from Line data
{
pos = u8LRCpos;
j = 0; //*ptr position
len = 0; //number
k = 0; //time counter in one line
while(1)
{
if((tok = u8line_buffer[pos++]) != 0)
{
ptr[j++] = tok;
len++; //Record data
if(tok > 0x80)
{
ptr[j++] = u8line_buffer[pos++];
len++;
}
}
else //Line end
{
if(j)
{
len = LCD_WIDTH; //last data in this line
bline_end = 1;
}
else
break; //no data , go to next line
}
if(len >= LCD_WIDTH)
{
len = 0; //clear len for compare before
i=0;
while((len++)<u8LrcStrCount)
{
for(i=0;i<j;i++) //Compare ptr to u8LrcStr[len]
{
if(ptr[i] != u8LrcStr[len][i])
break;
}
if(i == j)
break;
}
if(i == j) //data is the same
{
for(i=0; i<u8TimeCount; i++)
pSec2LrcStr[u16Time[i]+k] = len; //Record lyrics position
}
else //data is not the same, need to add
{
if(j<=(LCD_WIDTH-1))
ptr[j++] = 0;
for(i=0;i<j;i++)
u8LrcStr[u8LrcStrCount][i]=ptr[i]; //Record lyrics
for(i=0; i<u8TimeCount; i++)
pSec2LrcStr[u16Time[i]+k] = u8LrcStrCount;//Record lyrics position
u8LrcStrCount++;
}
if(u8LrcStrCount == MAX_LRC_SEGMENT_COUNT)//avoid exceeding boundary
break;
j = 0;
len = 0;
k++;
}
if(bline_end) //go to next line
{
bline_end = 0;
break;
}
}
}
if(u8LrcStrCount == MAX_LRC_SEGMENT_COUNT) //avoid exceeding boundary
break;
}
api_vFileClose(stream);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -