From 15a830bdba2589de8b24f2aebe4ab9797da53b32 Mon Sep 17 00:00:00 2001 From: Dave Chapman Date: Sun, 30 Oct 2005 15:07:40 +0000 Subject: [PATCH] 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 --- apps/codecs/flac.c | 19 ++++++++++++++----- apps/metadata.c | 20 ++++++++++++++++++++ firmware/export/id3.h | 1 + firmware/id3.c | 2 +- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/apps/codecs/flac.c b/apps/codecs/flac.c index d975c1fbfe..bbd45ece89 100644 --- a/apps/codecs/flac.c +++ b/apps/codecs/flac.c @@ -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; } diff --git a/apps/metadata.c b/apps/metadata.c index d8aa12085b..f3fed96b84 100644 --- a/apps/metadata.c +++ b/apps/metadata.c @@ -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; diff --git a/firmware/export/id3.h b/firmware/export/id3.h index 1e75353d89..0ef3d52a5f 100644 --- a/firmware/export/id3.h +++ b/firmware/export/id3.h @@ -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 diff --git a/firmware/id3.c b/firmware/id3.c index ceea15a0df..1ca8bd46b5 100644 --- a/firmware/id3.c +++ b/firmware/id3.c @@ -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;