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

📄 lrc_parser.lst

📁 智原mp3 SDK 开发包 与巨力 有mp3 wma ogg decoder
💻 LST
字号:
C51 COMPILER V7.50   LRC_PARSER                                                            08/18/2008 13:43:43 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE LRC_PARSER
OBJECT MODULE PLACED IN ..\output\output_bin\output_mp3\lrc_parser.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\code\ap_mp3\src\lrc_parser.c LARGE OPTIMIZE(9,SIZE) BROWSE INCDIR(..\
                    -..\..\bsp\include;..\..\code\ap_mp3\src\include;..\..\code\global;..\..\code\include) DEFINE(CONFIG_ASIC,dynamic_load) D
                    -EBUG OBJECTEXTEND PRINT(..\output\output_bin\output_mp3\lrc_parser.lst) OBJECT(..\output\output_bin\output_mp3\lrc_parse
                    -r.obj)

line level    source

   1          #include <string.h>
   2          #include "api.h"
   3          #include "lrc_parser.h"
   4          
   5          INT8U pSec2LrcStr[MAX_MUSIC_LRC_LENGTH];
   6          INT8U u8LrcStr[MAX_LRC_SEGMENT_COUNT][LCD_WIDTH];
   7          
   8          INT8U u8LrcStrCount;
   9          INT8U u8line_buffer[128];
  10          
  11          FILE_t* stream;
  12          
  13          INT8U u8RemainBytes;
  14          INT8U u8LineBufferPos;
  15          INT8U u8LineBuffer[16];
  16          BOOLEAN bIsLast;
  17          INT8U timetok[9];
  18          INT16U u16Time[10];
  19          INT8U u8TimeCount;
  20          INT8U u8LRCpos;
  21          
  22          static BOOLEAN bGetLine(INT8U* buf)
  23          {
  24   1         INT8U i = 0;
  25   1         INT8U tok;
  26   1         
  27   1         while(1)
  28   1         {
  29   2            if(u8RemainBytes == 0)
  30   2            {
  31   3               if(bIsLast)
  32   3                  return FALSE;
  33   3               u8LineBufferPos = 0;   
  34   3               u8RemainBytes = api_u16FileRead(u8LineBuffer, 16, stream);
  35   3               if(u8RemainBytes < 16)
  36   3                  bIsLast = TRUE;
  37   3            }
  38   2         
  39   2            while(u8RemainBytes)
  40   2            {
  41   3               tok = u8LineBuffer[u8LineBufferPos++];
  42   3               u8RemainBytes--;
  43   3               if(tok == 0x0d)
  44   3                  continue;
  45   3               else if(tok == 0x0a)
  46   3               {
  47   4                  buf[i++] = 0;
  48   4                  return TRUE;      
  49   4               }
  50   3               buf[i++] = tok;
  51   3            }
  52   2         }
C51 COMPILER V7.50   LRC_PARSER                                                            08/18/2008 13:43:43 PAGE 2   

  53   1            
  54   1         return TRUE;
  55   1      }
  56          
  57          //only for these formats "[01:08.47]" and "[01:08]"
  58          static int u16ParseTime(INT8U* buf)
  59          {
  60   1         return ((buf[0]-'0')*10 + (buf[1]-'0'))*60 + (buf[3]-'0')*10 + (buf[4]-'0');
  61   1      }
  62          
  63          static BOOLEAN bGetTime(INT8U* buf)
  64          {
  65   1         INT8U tok;
  66   1         INT8U i=0, j=0;
  67   1         BOOLEAN bFindL;
  68   1         
  69   1         bFindL = FALSE;
  70   1         while((tok = buf[i++]) != 0)
  71   1         {
  72   2            switch(tok)
  73   2            {
  74   3               case '[':
  75   3                  bFindL = TRUE;
  76   3                  break;
  77   3               case ']':
  78   3                  if(!bFindL)
  79   3                     return FALSE;
  80   3                  timetok[j++] = 0; 
  81   3                  u16Time[u8TimeCount++] = u16ParseTime(timetok);
  82   3                  j = 0;
  83   3                  bFindL = FALSE;
  84   3                  if('[' != buf[i])
  85   3                  {
  86   4                     u8LRCpos = i;
  87   4                     return TRUE;
  88   4                  }
  89   3                  break;
  90   3               default:
  91   3                  timetok[j++] = tok;
  92   3                  break;      
  93   3            }
  94   2         }
  95   1         
  96   1         return TRUE;
  97   1      }
  98          
  99          BOOLEAN bParseLRC(INT8U* filename)
 100          {
 101   1              INT8U i, j, k, len, tok;   
 102   1              INT8U pos;
 103   1              INT8U ptr[12];
 104   1      //      INT16U u16i;
 105   1              BOOLEAN bline_end;
 106   1        
 107   1              memset(pSec2LrcStr, 0xFF, MAX_MUSIC_LRC_LENGTH);
 108   1              for(i=0;i<MAX_LRC_SEGMENT_COUNT;i++)
 109   1                      u8LrcStr[i][0]='\0';
 110   1      //      u8LrcStr[MAX_LRC_SEGMENT_COUNT][LCD_WIDTH];
 111   1              u8RemainBytes = 0;
 112   1              bIsLast = FALSE;
 113   1              u8LrcStrCount = 0;
 114   1        
C51 COMPILER V7.50   LRC_PARSER                                                            08/18/2008 13:43:43 PAGE 3   

 115   1              stream = NULL;
 116   1              if( (stream = api_pFileOpen(filename)) == NULL )
 117   1                      return FALSE;
 118   1        
 119   1              while(1)
 120   1              {
 121   2                      if(FALSE == bGetLine(u8line_buffer))                    //Get Line data from LRC
 122   2                              break;
 123   2                      u8TimeCount = 0;
 124   2                      if(bGetTime(u8line_buffer))                                                                             //Get time information from Line data
 125   2                      {
 126   3                              pos = u8LRCpos;
 127   3                              j = 0;                                                                                                                                                  //*ptr position
 128   3                              len = 0;                                                                                                                                                //number
 129   3                              k = 0;                                                                                                                                                  //time counter in one line
 130   3                              while(1)
 131   3                              {       
 132   4                                      if((tok = u8line_buffer[pos++]) != 0)                   
 133   4                                      { 
 134   5                                              ptr[j++] = tok; 
 135   5                                              len++;                                                                                          //Record data
 136   5                                              if(tok > 0x80)
 137   5                                              {
 138   6                                                      ptr[j++] = u8line_buffer[pos++];
 139   6                                                      len++;
 140   6                                              }
 141   5                                      }
 142   4                                      else                                                                                                                                                    //Line end
 143   4                                      {       
 144   5                                              if(j)                                                                                                                                           
 145   5                                              {       
 146   6                                                      len = LCD_WIDTH;                                                                                        //last data in this line
 147   6                                                      bline_end = 1;
 148   6                                              }
 149   5                                              else                                                                                                                                            
 150   5                                                      break;                                                                                                                          //no data , go to next line
 151   5                                      }   
 152   4                                                              
 153   4                                      if(len >= LCD_WIDTH)
 154   4                                      { 
 155   5                                              len = 0;                                                                                                                                //clear len for compare before
 156   5                                              i=0;
 157   5                                              while((len++)<u8LrcStrCount)
 158   5                                              {       
 159   6                                                      for(i=0;i<j;i++)                                                                                        //Compare ptr to u8LrcStr[len]
 160   6                                                      { 
 161   7                                                              if(ptr[i] != u8LrcStr[len][i])
 162   7                                                                      break;
 163   7                                                      }
 164   6                                                      if(i == j)                                                                                                              
 165   6                                                              break;
 166   6                                              }
 167   5                                              if(i == j)                                                                                                                      //data is the same
 168   5                                              {       
 169   6                                                      for(i=0; i<u8TimeCount; i++)
 170   6                                                              pSec2LrcStr[u16Time[i]+k] = len;                //Record lyrics position
 171   6                                              }
 172   5                                              else                                                                                                                                            //data is not the same, need to add
 173   5                                              {       
 174   6                                                      if(j<=(LCD_WIDTH-1))
 175   6                                                              ptr[j++] = 0;
 176   6                                                      for(i=0;i<j;i++)
C51 COMPILER V7.50   LRC_PARSER                                                            08/18/2008 13:43:43 PAGE 4   

 177   6                                                              u8LrcStr[u8LrcStrCount][i]=ptr[i];      //Record lyrics
 178   6                                                      for(i=0; i<u8TimeCount; i++)
 179   6                                                              pSec2LrcStr[u16Time[i]+k] = u8LrcStrCount;//Record lyrics position
 180   6                                                      u8LrcStrCount++;        
 181   6                                              }
 182   5                                              if(u8LrcStrCount == MAX_LRC_SEGMENT_COUNT)//avoid exceeding boundary
 183   5                                                      break;
 184   5                                              j = 0;
 185   5                                              len = 0;
 186   5                                              k++;
 187   5                                      }
 188   4                                      if(bline_end)                                                                                                                   //go to next line
 189   4                                      {       
 190   5                                              bline_end = 0;
 191   5                                              break;
 192   5                                      }  
 193   4                              }
 194   3                      }
 195   2                      if(u8LrcStrCount == MAX_LRC_SEGMENT_COUNT)              //avoid exceeding boundary
 196   2                              break;
 197   2              }
 198   1              api_vFileClose(stream);
 199   1              return TRUE;   
 200   1      }
 201          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    958    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   1621      29
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -