summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-07-22 16:05:46 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-07-22 16:05:46 +0000
commit4e69f82c8f0feb124710ac1f6ce44040cb1acc2c (patch)
tree52e234d7ba34665a9884b46f252194444a48c3e8 /firmware
parent6f75d1739fa6e1f76753a62e4417761df812c072 (diff)
downloadrockbox-4e69f82c8f0feb124710ac1f6ce44040cb1acc2c.tar.gz
rockbox-4e69f82c8f0feb124710ac1f6ce44040cb1acc2c.zip
Now continues searching for good frames if a bad one is found. Patch by Hardeep Sidhu
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1398 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/id3.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/firmware/id3.c b/firmware/id3.c
index 16a155dd44..021b817704 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -396,6 +396,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
396 int freqindex; 396 int freqindex;
397 int frequency; 397 int frequency;
398 int chmode; 398 int chmode;
399 int bytecount;
399 400
400 long bpf; 401 long bpf;
401 long tpf; 402 long tpf;
@@ -413,12 +414,18 @@ static int getsonglength(int fd, struct mp3entry *entry)
413 } 414 }
414 415
415 /* Loop trough file until we find a frame header */ 416 /* Loop trough file until we find a frame header */
417 bytecount = 0;
416 restart: 418 restart:
417 do { 419 do {
418 header <<= 8; 420 header <<= 8;
419 if(!read(fd, &tmp, 1)) 421 if(!read(fd, &tmp, 1))
420 return -1; 422 return -1;
421 header |= tmp; 423 header |= tmp;
424
425 /* Quit if we haven't found a valid header within 128K */
426 bytecount++;
427 if(bytecount > 0x20000)
428 return -1;
422 } while(!mp3frameheader(header)); 429 } while(!mp3frameheader(header));
423 430
424 /* 431 /*
@@ -444,7 +451,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
444 version = 1; 451 version = 1;
445 break; 452 break;
446 default: 453 default:
447 return -1; 454 goto restart;
448 } 455 }
449 456
450 /* Layer */ 457 /* Layer */
@@ -459,20 +466,20 @@ static int getsonglength(int fd, struct mp3entry *entry)
459 layer = 1; 466 layer = 1;
460 break; 467 break;
461 default: 468 default:
462 return -1; 469 goto restart;
463 } 470 }
464 471
465 /* Bitrate */ 472 /* Bitrate */
466 bitindex = (header & 0xF000) >> 12; 473 bitindex = (header & 0xF000) >> 12;
467 bitrate = bitrate_table[version-1][layer-1][bitindex]; 474 bitrate = bitrate_table[version-1][layer-1][bitindex];
468 if(bitrate == 0) 475 if(bitrate == 0)
469 return -1; 476 goto restart;
470 477
471 /* Sampling frequency */ 478 /* Sampling frequency */
472 freqindex = (header & 0x0C00) >> 10; 479 freqindex = (header & 0x0C00) >> 10;
473 frequency = freqtab[version-1][freqindex]; 480 frequency = freqtab[version-1][freqindex];
474 if(frequency == 0) 481 if(frequency == 0)
475 return -1; 482 goto restart;
476 483
477#ifdef DEBUG_VERBOSE 484#ifdef DEBUG_VERBOSE
478 DEBUGF( "Version %i, lay %i, biti %i, bitr %i, freqi %i, freq %i, chmode %d\n", 485 DEBUGF( "Version %i, lay %i, biti %i, bitr %i, freqi %i, freq %i, chmode %d\n",
@@ -500,7 +507,7 @@ static int getsonglength(int fd, struct mp3entry *entry)
500 } 507 }
501 508
502 /* Calculate time per frame */ 509 /* Calculate time per frame */
503 tpf = bs[layer] / freqtab[version-1][freqindex] << (version - 1); 510 tpf = bs[layer] / (freqtab[version-1][freqindex] << (version - 1));
504 511
505 /* OK, we have found a frame. Let's see if it has a Xing header */ 512 /* OK, we have found a frame. Let's see if it has a Xing header */
506 if(read(fd, frame, sizeof frame) < 0) 513 if(read(fd, frame, sizeof frame) < 0)