summaryrefslogtreecommitdiff
path: root/firmware/mp3data.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/mp3data.c')
-rw-r--r--firmware/mp3data.c75
1 files changed, 39 insertions, 36 deletions
diff --git a/firmware/mp3data.c b/firmware/mp3data.c
index 670934d38d..83d916ff9f 100644
--- a/firmware/mp3data.c
+++ b/firmware/mp3data.c
@@ -212,7 +212,7 @@ static bool mp3headerinfo(struct mp3info *info, unsigned long header)
212 return true; 212 return true;
213} 213}
214 214
215unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long last_header) 215static unsigned long __find_next_frame(int fd, int *offset, int max_offset, unsigned long last_header, int(*getfunc)(int fd, unsigned char *c))
216{ 216{
217 unsigned long header=0; 217 unsigned long header=0;
218 unsigned char tmp; 218 unsigned char tmp;
@@ -227,7 +227,7 @@ unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long
227 /* Fill up header with first 24 bits */ 227 /* Fill up header with first 24 bits */
228 for(i = 0; i < 3; i++) { 228 for(i = 0; i < 3; i++) {
229 header <<= 8; 229 header <<= 8;
230 if(!read(fd, &tmp, 1)) 230 if(!getfunc(fd, &tmp))
231 return 0; 231 return 0;
232 header |= tmp; 232 header |= tmp;
233 pos++; 233 pos++;
@@ -235,7 +235,7 @@ unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long
235 235
236 do { 236 do {
237 header <<= 8; 237 header <<= 8;
238 if(!read(fd, &tmp, 1)) 238 if(!getfunc(fd, &tmp))
239 return 0; 239 return 0;
240 header |= tmp; 240 header |= tmp;
241 pos++; 241 pos++;
@@ -254,6 +254,16 @@ unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long
254 return header; 254 return header;
255} 255}
256 256
257static int fileread(int fd, unsigned char *c)
258{
259 return read(fd, c, 1);
260}
261
262unsigned long find_next_frame(int fd, int *offset, int max_offset, unsigned long last_header)
263{
264 return __find_next_frame(fd, offset, max_offset, last_header, fileread);
265}
266
257static int fnf_read_index; 267static int fnf_read_index;
258static int fnf_buf_len; 268static int fnf_buf_len;
259 269
@@ -315,44 +325,37 @@ static void buf_init(void)
315unsigned long buf_find_next_frame(int fd, int *offset, int max_offset, 325unsigned long buf_find_next_frame(int fd, int *offset, int max_offset,
316 unsigned long last_header) 326 unsigned long last_header)
317{ 327{
318 unsigned long header=0; 328 return __find_next_frame(fd, offset, max_offset, last_header, buf_getbyte);
319 unsigned char tmp; 329}
320 int i;
321
322 int pos = 0;
323 330
324 /* We remember the last header we found, to use as a template to see if 331static int mp3buflen;
325 the header we find has the same frequency, layer etc */ 332static int mem_pos;
326 last_header &= 0xffff0c00; 333static int mem_cnt;
334static int mem_maxlen;
327 335
328 /* Fill up header with first 24 bits */ 336static int mem_getbyte(int dummy, unsigned char *c)
329 for(i = 0; i < 3; i++) { 337{
330 header <<= 8; 338 dummy = dummy;
331 if(!buf_getbyte(fd, &tmp)) 339
332 return 0; 340 *c = mp3buf[mem_pos++];
333 header |= tmp; 341 if(mem_pos >= mp3buflen)
334 pos++; 342 mem_pos = 0;
335 }
336 343
337 do { 344 if(mem_cnt++ >= mem_maxlen)
338 header <<= 8; 345 return 0;
339 if(!buf_getbyte(fd, &tmp)) 346 else
340 return 0; 347 return 1;
341 header |= tmp; 348}
342 pos++;
343 if(max_offset > 0 && pos > max_offset)
344 return 0;
345 } while(!is_mp3frameheader(header) ||
346 (last_header?((header & 0xffff0c00) != last_header):false));
347 349
348 *offset = pos - 4; 350unsigned long mem_find_next_frame(int startpos, int *offset, int max_offset,
351 unsigned long last_header)
352{
353 mp3buflen = mp3end - mp3buf;
354 mem_pos = startpos;
355 mem_cnt = 0;
356 mem_maxlen = max_offset;
349 357
350#ifdef DEBUG 358 return __find_next_frame(0, offset, max_offset, last_header, mem_getbyte);
351 if(*offset)
352 DEBUGF("Warning: skipping %d bytes of garbage\n", *offset);
353#endif
354
355 return header;
356} 359}
357 360
358int get_mp3file_info(int fd, struct mp3info *info) 361int get_mp3file_info(int fd, struct mp3info *info)