📄 lrc_parser.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 + -