mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
Now VBRFix correctly handles all types of files, with or without ID3 tags
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3514 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
11edfa8d96
commit
6edea74ea6
1 changed files with 62 additions and 33 deletions
|
@ -117,16 +117,13 @@ static void xingupdate(int percent)
|
|||
extern unsigned char mp3buf[];
|
||||
extern unsigned char mp3end[];
|
||||
|
||||
static int insert_space_in_file(char *fname, int num_bytes)
|
||||
static int insert_space_in_file(char *fname, int fpos, int num_bytes)
|
||||
{
|
||||
int readlen;
|
||||
int rc;
|
||||
int orig_fd, fd;
|
||||
char tmpname[MAX_PATH];
|
||||
|
||||
/* Use the mp3 buffer to write 0's in the file */
|
||||
memset(mp3buf, 0, num_bytes);
|
||||
|
||||
snprintf(tmpname, MAX_PATH, "%s.tmp", fname);
|
||||
|
||||
orig_fd = open(fname, O_RDONLY);
|
||||
|
@ -142,12 +139,35 @@ static int insert_space_in_file(char *fname, int num_bytes)
|
|||
return 10*fd - 2;
|
||||
}
|
||||
|
||||
/* First, copy the initial portion (the ID3 tag) */
|
||||
if(fpos)
|
||||
{
|
||||
readlen = read(orig_fd, mp3buf, fpos);
|
||||
if(readlen < 0)
|
||||
{
|
||||
close(fd);
|
||||
close(orig_fd);
|
||||
return 10*readlen - 3;
|
||||
}
|
||||
|
||||
rc = write(fd, mp3buf, readlen);
|
||||
if(rc < 0)
|
||||
{
|
||||
close(fd);
|
||||
close(orig_fd);
|
||||
return 10*rc - 4;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now insert some 0's in the file */
|
||||
memset(mp3buf, 0, num_bytes);
|
||||
|
||||
rc = write(fd, mp3buf, num_bytes);
|
||||
if(rc < 0)
|
||||
{
|
||||
close(orig_fd);
|
||||
close(fd);
|
||||
return 10*rc - 3;
|
||||
return 10*rc - 5;
|
||||
}
|
||||
|
||||
rc = lseek(orig_fd, 0, SEEK_SET);
|
||||
|
@ -155,7 +175,7 @@ static int insert_space_in_file(char *fname, int num_bytes)
|
|||
{
|
||||
close(orig_fd);
|
||||
close(fd);
|
||||
return 10*rc - 4;
|
||||
return 10*rc - 6;
|
||||
}
|
||||
|
||||
/* Copy the file */
|
||||
|
@ -166,7 +186,7 @@ static int insert_space_in_file(char *fname, int num_bytes)
|
|||
{
|
||||
close(fd);
|
||||
close(orig_fd);
|
||||
return 10*readlen - 5;
|
||||
return 10*readlen - 7;
|
||||
}
|
||||
|
||||
rc = write(fd, mp3buf, readlen);
|
||||
|
@ -174,7 +194,7 @@ static int insert_space_in_file(char *fname, int num_bytes)
|
|||
{
|
||||
close(fd);
|
||||
close(orig_fd);
|
||||
return 10*rc - 6;
|
||||
return 10*rc - 8;
|
||||
}
|
||||
} while(readlen > 0);
|
||||
|
||||
|
@ -185,14 +205,14 @@ static int insert_space_in_file(char *fname, int num_bytes)
|
|||
rc = remove(fname);
|
||||
if(rc < 0)
|
||||
{
|
||||
return 10*rc - 7;
|
||||
return 10*rc - 9;
|
||||
}
|
||||
|
||||
/* Replace the old file with the new */
|
||||
rc = rename(tmpname, fname);
|
||||
if(rc < 0)
|
||||
{
|
||||
return 10*rc - 8;
|
||||
return 10*rc - 9;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -207,6 +227,7 @@ static bool vbr_fix(void)
|
|||
int flen;
|
||||
int num_frames;
|
||||
int fpos;
|
||||
int numbytes;
|
||||
|
||||
if(mpeg_status())
|
||||
{
|
||||
|
@ -222,11 +243,17 @@ static bool vbr_fix(void)
|
|||
|
||||
rc = mp3info(&entry, selected_file);
|
||||
if(rc < 0)
|
||||
return rc * 10 - 1;
|
||||
{
|
||||
splash(HZ*2, 0, true, "File error: %d", rc);
|
||||
return true;
|
||||
}
|
||||
|
||||
fd = open(selected_file, O_RDWR);
|
||||
if(fd < 0)
|
||||
return fd * 10 - 2;
|
||||
{
|
||||
splash(HZ*2, 0, true, "File error: %d", fd);
|
||||
return true;
|
||||
}
|
||||
|
||||
flen = lseek(fd, 0, SEEK_END);
|
||||
|
||||
|
@ -259,31 +286,33 @@ static bool vbr_fix(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
/* If not, insert some space, but only if there is no ID3
|
||||
tag in the file */
|
||||
/* If not, insert some space. If there is an ID3 tag in the
|
||||
file we only insert just enough to squeeze the Xing header
|
||||
in. If not, we insert 4K. */
|
||||
close(fd);
|
||||
if(entry.first_frame_offset == 0)
|
||||
{
|
||||
rc = insert_space_in_file(selected_file, 4096);
|
||||
if(entry.first_frame_offset)
|
||||
numbytes = 417;
|
||||
else
|
||||
numbytes = 4096;
|
||||
|
||||
rc = insert_space_in_file(selected_file,
|
||||
entry.first_frame_offset, numbytes);
|
||||
|
||||
if(rc < 0)
|
||||
{
|
||||
splash(HZ*2, 0, true, "File error: %d", rc);
|
||||
return rc * 10 - 3;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Reopen the file */
|
||||
fd = open(selected_file, O_RDWR);
|
||||
if(fd < 0)
|
||||
return fd * 10 - 4;
|
||||
|
||||
fpos = 4096-417;
|
||||
}
|
||||
else
|
||||
{
|
||||
splash(HZ*2, 0, true,
|
||||
"There is no room for a Xing header");
|
||||
return -3;
|
||||
splash(HZ*2, 0, true, "File reopen error: %d", fd);
|
||||
return true;
|
||||
}
|
||||
|
||||
fpos = numbytes - 417;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue