1
0
Fork 0
forked from len0rd/rockbox

Skip ID3v2 tags at the start of a FLAC file.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7689 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dave Chapman 2005-10-30 15:07:40 +00:00
parent a4c190f7d4
commit 15a830bdba
4 changed files with 36 additions and 6 deletions

View file

@ -73,7 +73,7 @@ struct FLACseekpoints {
struct FLACseekpoints seekpoints[MAX_SUPPORTED_SEEKTABLE_SIZE];
int nseekpoints;
static bool flac_init(FLACContext* fc)
static bool flac_init(FLACContext* fc, int first_frame_offset)
{
unsigned char buf[255];
bool found_streaminfo=false;
@ -87,6 +87,11 @@ static bool flac_init(FLACContext* fc)
ci->memset(fc,0,sizeof(FLACContext));
nseekpoints=0;
/* Skip any foreign tags at start of file */
ci->seek_buffer(first_frame_offset);
fc->metadatalength = first_frame_offset;
if (ci->read_filebuf(buf, 4) < 4)
{
return false;
@ -96,7 +101,7 @@ static bool flac_init(FLACContext* fc)
{
return false;
}
fc->metadatalength = 4;
fc->metadatalength += 4;
while (!endofmetadata) {
if (ci->read_filebuf(buf, 4) < 4)
@ -199,8 +204,7 @@ bool flac_seek(FLACContext* fc, uint32_t newsample) {
offset+=fc->metadatalength;
if ((off_t)offset < ci->filesize) {
ci->seek_buffer(offset);
if (ci->seek_buffer(offset)) {
return true;
} else {
return false;
@ -240,7 +244,12 @@ enum codec_status codec_start(struct codec_api* api)
next_track:
if (!flac_init(&fc)) {
if (codec_init(api)) {
LOGF("FLAC: Error initialising codec\n");
return CODEC_ERROR;
}
if (!flac_init(&fc,ci->id3->first_frame_offset)) {
LOGF("FLAC: Error initialising codec\n");
return CODEC_ERROR;
}

View file

@ -785,6 +785,26 @@ static bool get_flac_metadata(int fd, struct mp3entry* id3)
return rc;
}
if (memcmp(buf,"ID3",3) == 0)
{
/* We have found an ID3v2 tag at the start of the file - find its
length and then skip it.
*/
if ((id3->first_frame_offset=getid3v2len(fd)) == 0)
{
return rc;
}
if ((lseek(fd, id3->first_frame_offset, SEEK_SET) < 0) ||
(read(fd, buf, 4) < 4))
{
return rc;
}
} else {
id3->first_frame_offset=0;
}
if (memcmp(buf,"fLaC",4) != 0)
{
return rc;

View file

@ -134,5 +134,6 @@ enum {
bool mp3info(struct mp3entry *entry, const char *filename, bool v1first);
char* id3_get_genre(const struct mp3entry* id3);
char* id3_get_codec(const struct mp3entry* id3);
int getid3v2len(int fd);
#endif

View file

@ -829,7 +829,7 @@ static void setid3v2title(int fd, struct mp3entry *entry)
*
* Returns: the size of the tag or 0 if none was found
*/
static int getid3v2len(int fd)
int getid3v2len(int fd)
{
char buf[6];
int offset;