summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2005-10-30 15:07:40 +0000
committerDave Chapman <dave@dchapman.com>2005-10-30 15:07:40 +0000
commit15a830bdba2589de8b24f2aebe4ab9797da53b32 (patch)
tree82f02855bd3cf54ed98f2b6d8be71dd170b7ace5 /apps
parenta4c190f7d47b4ea8998f7dcab468ccfb3a16aca9 (diff)
downloadrockbox-15a830bdba2589de8b24f2aebe4ab9797da53b32.zip
rockbox-15a830bdba2589de8b24f2aebe4ab9797da53b32.tar.gz
rockbox-15a830bdba2589de8b24f2aebe4ab9797da53b32.tar.bz2
rockbox-15a830bdba2589de8b24f2aebe4ab9797da53b32.tar.xz
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
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs/flac.c19
-rw-r--r--apps/metadata.c20
2 files changed, 34 insertions, 5 deletions
diff --git a/apps/codecs/flac.c b/apps/codecs/flac.c
index d975c1f..bbd45ec 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 d8aa120..f3fed96 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;