summaryrefslogtreecommitdiff
path: root/apps/metadata.c
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2007-06-16 13:00:52 +0000
committerMagnus Holmgren <magnushol@gmail.com>2007-06-16 13:00:52 +0000
commitc3206a455a455fadb282d09f9af482c66b6bdf8e (patch)
treeebdddf413b84612d55291c8d64ee233f725dc316 /apps/metadata.c
parent93af4feae9f7890846934f4293d1291daa2901c7 (diff)
downloadrockbox-c3206a455a455fadb282d09f9af482c66b6bdf8e.zip
rockbox-c3206a455a455fadb282d09f9af482c66b6bdf8e.tar.gz
rockbox-c3206a455a455fadb282d09f9af482c66b6bdf8e.tar.bz2
rockbox-c3206a455a455fadb282d09f9af482c66b6bdf8e.tar.xz
AAC: Add support for iTunes-style gapless playback.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13636 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/metadata.c')
-rw-r--r--apps/metadata.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/apps/metadata.c b/apps/metadata.c
index 357c5e6..a0c2f31 100644
--- a/apps/metadata.c
+++ b/apps/metadata.c
@@ -206,6 +206,43 @@ static long get_slong(void* buf)
return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
}
+
+static char* skip_space(char* str)
+{
+ while (isspace(*str))
+ {
+ str++;
+ }
+
+ return str;
+}
+
+static unsigned long get_itunes_int32(char* value, int count)
+{
+ static const char hexdigits[] = "0123456789ABCDEF";
+ const char* c;
+ int r = 0;
+
+ while (count-- > 0)
+ {
+ value = skip_space(value);
+
+ while (*value && !isspace(*value))
+ {
+ value++;
+ }
+ }
+
+ value = skip_space(value);
+
+ while (*value && ((c = strchr(hexdigits, toupper(*value))) != NULL))
+ {
+ r = (r << 4) | (c - hexdigits);
+ value++;
+ }
+
+ return r;
+}
/* Parse the tag (the name-value pair) and fill id3 and buffer accordingly.
* String values to keep are written to buf. Returns number of bytes written
@@ -1520,6 +1557,19 @@ static bool read_mp4_tags(int fd, struct mp3entry* id3,
{
read_mp4_tag_string(fd, size, &buffer, &buffer_left,
&id3->composer);
+ }
+ else if (strcasecmp(tag_name, "iTunSMPB") == 0)
+ {
+ char value[TAG_VALUE_LENGTH];
+ char* value_p = value;
+ char* any;
+ unsigned int length = sizeof(value);
+
+ read_mp4_tag_string(fd, size, &value_p, &length, &any);
+ id3->lead_trim = get_itunes_int32(value, 1);
+ id3->tail_trim = get_itunes_int32(value, 2);
+ DEBUGF("AAC: lead_trim %d, tail_trim %d\n",
+ id3->lead_trim, id3->tail_trim);
}
else
{