⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lrc_parser.c

📁 智原mp3 SDK 开发包 与巨力 有mp3 wma ogg decoder
💻 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 + -