1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 Dave Chapman
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
27 #include "mp3_playback.h"
29 #include "rbunicode.h"
31 #include "replaygain.h"
37 enum tagtype
{ TAGTYPE_APE
= 1, TAGTYPE_VORBIS
};
39 #ifdef ROCKBOX_BIG_ENDIAN
40 #define IS_BIG_ENDIAN 1
42 #define IS_BIG_ENDIAN 0
45 #define APETAG_HEADER_LENGTH 32
46 #define APETAG_HEADER_FORMAT "8llll8"
47 #define APETAG_ITEM_HEADER_FORMAT "ll"
48 #define APETAG_ITEM_TYPE_MASK 3
50 #define TAG_NAME_LENGTH 32
51 #define TAG_VALUE_LENGTH 128
53 #define MP4_ID(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
55 #define MP4_3gp6 MP4_ID('3', 'g', 'p', '6')
56 #define MP4_alac MP4_ID('a', 'l', 'a', 'c')
57 #define MP4_calb MP4_ID(0xa9, 'a', 'l', 'b')
58 #define MP4_cART MP4_ID(0xa9, 'A', 'R', 'T')
59 #define MP4_cnam MP4_ID(0xa9, 'n', 'a', 'm')
60 #define MP4_cwrt MP4_ID(0xa9, 'w', 'r', 't')
61 #define MP4_esds MP4_ID('e', 's', 'd', 's')
62 #define MP4_ftyp MP4_ID('f', 't', 'y', 'p')
63 #define MP4_gnre MP4_ID('g', 'n', 'r', 'e')
64 #define MP4_hdlr MP4_ID('h', 'd', 'l', 'r')
65 #define MP4_ilst MP4_ID('i', 'l', 's', 't')
66 #define MP4_M4A MP4_ID('M', '4', 'A', ' ')
67 #define MP4_M4B MP4_ID('M', '4', 'B', ' ')
68 #define MP4_mdat MP4_ID('m', 'd', 'a', 't')
69 #define MP4_mdia MP4_ID('m', 'd', 'i', 'a')
70 #define MP4_mdir MP4_ID('m', 'd', 'i', 'r')
71 #define MP4_meta MP4_ID('m', 'e', 't', 'a')
72 #define MP4_minf MP4_ID('m', 'i', 'n', 'f')
73 #define MP4_moov MP4_ID('m', 'o', 'o', 'v')
74 #define MP4_mp4a MP4_ID('m', 'p', '4', 'a')
75 #define MP4_mp42 MP4_ID('m', 'p', '4', '2')
76 #define MP4_qt MP4_ID('q', 't', ' ', ' ')
77 #define MP4_soun MP4_ID('s', 'o', 'u', 'n')
78 #define MP4_stbl MP4_ID('s', 't', 'b', 'l')
79 #define MP4_stsd MP4_ID('s', 't', 's', 'd')
80 #define MP4_stts MP4_ID('s', 't', 't', 's')
81 #define MP4_trak MP4_ID('t', 'r', 'a', 'k')
82 #define MP4_trkn MP4_ID('t', 'r', 'k', 'n')
83 #define MP4_udta MP4_ID('u', 'd', 't', 'a')
84 #define MP4_extra MP4_ID('-', '-', '-', '-')
96 struct apetag_item_header
102 #if CONFIG_CODEC == SWCODEC
103 static const unsigned short a52_bitrates
[] =
105 32, 40, 48, 56, 64, 80, 96, 112, 128, 160,
106 192, 224, 256, 320, 384, 448, 512, 576, 640
109 /* Only store frame sizes for 44.1KHz - others are simply multiples
111 static const unsigned short a52_441framesizes
[] =
113 69 * 2, 70 * 2, 87 * 2, 88 * 2, 104 * 2, 105 * 2, 121 * 2,
114 122 * 2, 139 * 2, 140 * 2, 174 * 2, 175 * 2, 208 * 2, 209 * 2,
115 243 * 2, 244 * 2, 278 * 2, 279 * 2, 348 * 2, 349 * 2, 417 * 2,
116 418 * 2, 487 * 2, 488 * 2, 557 * 2, 558 * 2, 696 * 2, 697 * 2,
117 835 * 2, 836 * 2, 975 * 2, 976 * 2, 1114 * 2, 1115 * 2, 1253 * 2,
118 1254 * 2, 1393 * 2, 1394 * 2
121 static const long wavpack_sample_rates
[] =
123 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000,
124 32000, 44100, 48000, 64000, 88200, 96000, 192000
127 /* Read a string from the file. Read up to size bytes, or, if eos != -1,
128 * until the eos character is found (eos is not stored in buf, unless it is
129 * nil). Writes up to buf_size chars to buf, always terminating with a nil.
130 * Returns number of chars read or -1 on read error.
132 static long read_string(int fd
, char* buf
, long buf_size
, int eos
, long size
)
139 if (read(fd
, &c
, 1) != 1)
148 if ((eos
!= -1) && (eos
== (unsigned char) c
))
164 /* Read an unsigned 32-bit integer from a big-endian file. */
165 #ifdef ROCKBOX_BIG_ENDIAN
166 #define read_uint32be(fd,buf) read((fd), (buf), 4)
168 static int read_uint32be(int fd
, unsigned int* buf
)
172 n
= read(fd
, (char*) buf
, 4);
173 *buf
= betoh32(*buf
);
178 /* Read an unaligned 32-bit little endian long from buffer. */
179 static unsigned long get_long_le(void* buf
)
181 unsigned char* p
= (unsigned char*) buf
;
183 return p
[0] | (p
[1] << 8) | (p
[2] << 16) | (p
[3] << 24);
186 /* Read an unaligned 32-bit big endian long from buffer. */
187 static unsigned long get_long_be(void* buf
)
189 unsigned char* p
= (unsigned char*) buf
;
191 return (p
[0] << 24) | (p
[1] << 16) | (p
[2] << 8) | p
[3];
194 /* Read an unaligned 32-bit little endian long from buffer. */
195 static long get_slong(void* buf
)
197 unsigned char* p
= (unsigned char*) buf
;
199 return p
[0] | (p
[1] << 8) | (p
[2] << 16) | (p
[3] << 24);
202 /* Parse the tag (the name-value pair) and fill id3 and buffer accordingly.
203 * String values to keep are written to buf. Returns number of bytes written
204 * to buf (including end nil).
206 static long parse_tag(const char* name
, char* value
, struct mp3entry
* id3
,
207 char* buf
, long buf_remaining
, enum tagtype type
)
212 if ((((strcasecmp(name
, "track") == 0) && (type
== TAGTYPE_APE
)))
213 || ((strcasecmp(name
, "tracknumber") == 0) && (type
== TAGTYPE_VORBIS
)))
215 id3
->tracknum
= atoi(value
);
216 p
= &(id3
->track_string
);
218 else if (((strcasecmp(name
, "year") == 0) && (type
== TAGTYPE_APE
))
219 || ((strcasecmp(name
, "date") == 0) && (type
== TAGTYPE_VORBIS
)))
221 /* Date's can be in any format in Vorbis. However most of them
222 * are in ISO8601 format so if we try and parse the first part
223 * of the tag as a number, we should get the year. If we get crap,
224 * then act like we never parsed it.
226 id3
->year
= atoi(value
);
227 if (id3
->year
< 1900)
228 { /* yeah, not likely */
231 p
= &(id3
->year_string
);
233 else if (strcasecmp(name
, "title") == 0)
237 else if (strcasecmp(name
, "artist") == 0)
241 else if (strcasecmp(name
, "album") == 0)
245 else if (strcasecmp(name
, "genre") == 0)
247 p
= &(id3
->genre_string
);
249 else if (strcasecmp(name
, "composer") == 0)
251 p
= &(id3
->composer
);
253 else if (strcasecmp(name
, "comment") == 0)
257 else if (strcasecmp(name
, "albumartist") == 0)
259 p
= &(id3
->albumartist
);
261 else if (strcasecmp(name
, "album artist") == 0)
263 p
= &(id3
->albumartist
);
265 else if (strcasecmp(name
, "ensemble") == 0)
267 p
= &(id3
->albumartist
);
271 len
= parse_replaygain(name
, value
, id3
, buf
, buf_remaining
);
278 len
= MIN(len
, buf_remaining
- 1);
282 strncpy(buf
, value
, len
);
296 /* Read the items in an APEV2 tag. Only looks for a tag at the end of a
297 * file. Returns true if a tag was found and fully read, false otherwise.
299 static bool read_ape_tags(int fd
, struct mp3entry
* id3
)
301 struct apetag_header header
;
303 if ((lseek(fd
, -APETAG_HEADER_LENGTH
, SEEK_END
) < 0)
304 || (ecread(fd
, &header
, 1, APETAG_HEADER_FORMAT
, IS_BIG_ENDIAN
) != APETAG_HEADER_LENGTH
)
305 || (memcmp(header
.id
, "APETAGEX", sizeof(header
.id
))))
310 if ((header
.version
== 2000) && (header
.item_count
> 0)
311 && (header
.length
> APETAG_HEADER_LENGTH
))
313 char *buf
= id3
->id3v2buf
;
314 unsigned int buf_remaining
= sizeof(id3
->id3v2buf
)
315 + sizeof(id3
->id3v1buf
);
316 unsigned int tag_remaining
= header
.length
- APETAG_HEADER_LENGTH
;
319 if (lseek(fd
, -header
.length
, SEEK_END
) < 0)
324 for (i
= 0; i
< header
.item_count
; i
++)
326 struct apetag_item_header item
;
327 char name
[TAG_NAME_LENGTH
];
328 char value
[TAG_VALUE_LENGTH
];
331 if (tag_remaining
< sizeof(item
))
336 if (ecread(fd
, &item
, 1, APETAG_ITEM_HEADER_FORMAT
, IS_BIG_ENDIAN
) < (long) sizeof(item
))
341 tag_remaining
-= sizeof(item
);
342 r
= read_string(fd
, name
, sizeof(name
), 0, tag_remaining
);
349 tag_remaining
-= r
+ item
.length
;
351 if ((item
.flags
& APETAG_ITEM_TYPE_MASK
) == 0)
355 if (read_string(fd
, value
, sizeof(value
), -1, item
.length
)
361 len
= parse_tag(name
, value
, id3
, buf
, buf_remaining
,
364 buf_remaining
-= len
;
368 if (lseek(fd
, item
.length
, SEEK_CUR
) < 0)
379 /* Read the items in a Vorbis comment packet. Returns true the items were
380 * fully read, false otherwise.
382 static bool read_vorbis_tags(int fd
, struct mp3entry
*id3
,
385 char *buf
= id3
->id3v2buf
;
388 int buf_remaining
= sizeof(id3
->id3v2buf
) + sizeof(id3
->id3v1buf
);
391 if (ecread(fd
, &len
, 1, "l", IS_BIG_ENDIAN
) < (long) sizeof(len
))
396 if ((lseek(fd
, len
, SEEK_CUR
) < 0)
397 || (ecread(fd
, &comment_count
, 1, "l", IS_BIG_ENDIAN
)
398 < (long) sizeof(comment_count
)))
403 tag_remaining
-= len
+ sizeof(len
) + sizeof(comment_count
);
405 if (tag_remaining
<= 0)
410 for (i
= 0; i
< comment_count
; i
++)
412 char name
[TAG_NAME_LENGTH
];
413 char value
[TAG_VALUE_LENGTH
];
416 if (tag_remaining
< 4)
421 if (ecread(fd
, &len
, 1, "l", IS_BIG_ENDIAN
) < (long) sizeof(len
))
428 /* Quit if we've passed the end of the page */
429 if (tag_remaining
< len
)
434 tag_remaining
-= len
;
435 read_len
= read_string(fd
, name
, sizeof(name
), '=', len
);
444 if (read_string(fd
, value
, sizeof(value
), -1, len
) < 0)
449 len
= parse_tag(name
, value
, id3
, buf
, buf_remaining
,
452 buf_remaining
-= len
;
455 /* Skip to the end of the block */
458 if (lseek(fd
, tag_remaining
, SEEK_CUR
) < 0)
467 /* Skip an ID3v2 tag if it can be found. We assume the tag is located at the
468 * start of the file, which should be true in all cases where we need to skip it.
469 * Returns true if successfully skipped or not skipped, and false if
470 * something went wrong while skipping.
472 static bool skip_id3v2(int fd
, struct mp3entry
*id3
)
477 if (memcmp(buf
, "ID3", 3) == 0)
479 /* We have found an ID3v2 tag at the start of the file - find its
480 length and then skip it. */
481 if ((id3
->first_frame_offset
= getid3v2len(fd
)) == 0)
484 if ((lseek(fd
, id3
->first_frame_offset
, SEEK_SET
) < 0))
489 lseek(fd
, 0, SEEK_SET
);
490 id3
->first_frame_offset
= 0;
495 /* A simple parser to read vital metadata from an Ogg Speex file. Returns
496 * false if metadata needed by the Speex codec couldn't be read.
499 static bool get_speex_metadata(int fd
, struct mp3entry
* id3
)
501 /* An Ogg File is split into pages, each starting with the string
502 * "OggS". Each page has a timestamp (in PCM samples) referred to as
503 * the "granule position".
505 * An Ogg Speex has the following structure:
506 * 1) Identification header (containing samplerate, numchannels, etc)
507 Described in this page: (http://www.speex.org/manual2/node7.html)
508 * 2) Comment header - containing the Vorbis Comments
509 * 3) Many audio packets...
512 /* Use the path name of the id3 structure as a temporary buffer. */
513 unsigned char* buf
= (unsigned char*)id3
->path
;
516 long last_serial
= 0;
522 if ((lseek(fd
, 0, SEEK_SET
) < 0) || (read(fd
, buf
, 58) < 33))
527 if ((memcmp(buf
, "OggS", 4) != 0) || (memcmp(&buf
[28], "Speex", 5) != 0))
532 /* We need to ensure the serial number from this page is the same as the
533 * one from the last page (since we only support a single bitstream).
535 serial
= get_long_le(&buf
[14]);
536 if ((lseek(fd
, 33, SEEK_SET
) < 0)||(read(fd
, buf
, 58) < 4))
541 id3
->frequency
= get_slong(&buf
[31]);
542 last_serial
= get_long_le(&buf
[27]);/*temporary, header size*/
543 id3
->bitrate
= get_long_le(&buf
[47]);
544 id3
->vbr
= get_long_le(&buf
[55]);
545 id3
->filesize
= filesize(fd
);
546 /* Comments are in second Ogg page */
547 if (lseek(fd
, 28+last_serial
/*(temporary for header size)*/, SEEK_SET
) < 0)
552 /* Minimum header length for Ogg pages is 27. */
553 if (read(fd
, buf
, 27) < 27)
558 if (memcmp(buf
, "OggS", 4) !=0 )
564 /* read in segment table */
565 if (read(fd
, buf
, segments
) < segments
)
570 /* The second packet in a vorbis stream is the comment packet. It *may*
571 * extend beyond the second page, but usually does not. Here we find the
572 * length of the comment packet (or the rest of the page if the comment
573 * packet extends to the third page).
575 for (i
= 0; i
< segments
; i
++)
578 /* The last segment of a packet is always < 255 bytes */
585 comment_size
= remaining
;
587 /* Failure to read the tags isn't fatal. */
588 read_vorbis_tags(fd
, id3
, remaining
);
590 /* We now need to search for the last page in the file - identified by
591 * by ('O','g','g','S',0) and retrieve totalsamples.
594 /* A page is always < 64 kB */
595 if (lseek(fd
, -(MIN(64 * 1024, id3
->filesize
)), SEEK_END
) < 0)
604 r
= read(fd
, &buf
[remaining
], MAX_PATH
- remaining
);
615 /* Inefficient (but simple) search */
618 while (i
< (remaining
- 3))
620 if ((buf
[i
] == 'O') && (memcmp(&buf
[i
], "OggS", 4) == 0))
622 if (i
< (remaining
- 17))
624 /* Note that this only reads the low 32 bits of a
627 id3
->samples
= get_long_le(&buf
[i
+ 6]);
628 last_serial
= get_long_le(&buf
[i
+ 14]);
630 /* If this page is very small the beginning of the next
631 * header could be in buffer. Jump near end of this header
648 /* Move the remaining bytes to start of buffer.
649 * Reuse var 'segments' as it is no longer needed */
651 while (i
< remaining
)
653 buf
[segments
++] = buf
[i
++];
655 remaining
= segments
;
659 /* Discard the rest of the buffer */
664 /* This file has mutiple vorbis bitstreams (or is corrupt). */
665 /* FIXME we should display an error here. */
666 if (serial
!= last_serial
)
668 logf("serialno mismatch");
670 logf("%ld", last_serial
);
674 id3
->length
= (id3
->samples
/ id3
->frequency
) * 1000;
675 id3
->bitrate
= (((int64_t) id3
->filesize
- comment_size
) * 8) / id3
->length
;
680 /* A simple parser to read vital metadata from an Ogg Vorbis file.
681 * Calls get_speex_metadata if a speex file is identified. Returns
682 * false if metadata needed by the Vorbis codec couldn't be read.
684 static bool get_vorbis_metadata(int fd
, struct mp3entry
* id3
)
686 /* An Ogg File is split into pages, each starting with the string
687 * "OggS". Each page has a timestamp (in PCM samples) referred to as
688 * the "granule position".
690 * An Ogg Vorbis has the following structure:
691 * 1) Identification header (containing samplerate, numchannels, etc)
692 * 2) Comment header - containing the Vorbis Comments
693 * 3) Setup header - containing codec setup information
694 * 4) Many audio packets...
697 /* Use the path name of the id3 structure as a temporary buffer. */
698 unsigned char* buf
= (unsigned char *)id3
->path
;
701 long last_serial
= 0;
707 if ((lseek(fd
, 0, SEEK_SET
) < 0) || (read(fd
, buf
, 58) < 4))
712 if ((memcmp(buf
, "OggS", 4) != 0) || (memcmp(&buf
[29], "vorbis", 6) != 0))
714 if ((memcmp(buf
, "OggS", 4) != 0) || (memcmp(&buf
[28], "Speex", 5) != 0))
720 id3
->codectype
= AFMT_SPEEX
;
721 return get_speex_metadata(fd
, id3
);
725 /* We need to ensure the serial number from this page is the same as the
726 * one from the last page (since we only support a single bitstream).
728 serial
= get_long_le(&buf
[14]);
729 id3
->frequency
= get_long_le(&buf
[40]);
730 id3
->filesize
= filesize(fd
);
732 /* Comments are in second Ogg page */
733 if (lseek(fd
, 58, SEEK_SET
) < 0)
738 /* Minimum header length for Ogg pages is 27. */
739 if (read(fd
, buf
, 27) < 27)
744 if (memcmp(buf
, "OggS", 4) !=0 )
751 /* read in segment table */
752 if (read(fd
, buf
, segments
) < segments
)
757 /* The second packet in a vorbis stream is the comment packet. It *may*
758 * extend beyond the second page, but usually does not. Here we find the
759 * length of the comment packet (or the rest of the page if the comment
760 * packet extends to the third page).
762 for (i
= 0; i
< segments
; i
++)
766 /* The last segment of a packet is always < 255 bytes */
773 /* Now read in packet header (type and id string) */
774 if (read(fd
, buf
, 7) < 7)
779 comment_size
= remaining
;
782 /* The first byte of a packet is the packet type; comment packets are
785 if ((buf
[0] != 3) || (memcmp(buf
+ 1, "vorbis", 6) !=0))
790 /* Failure to read the tags isn't fatal. */
791 read_vorbis_tags(fd
, id3
, remaining
);
793 /* We now need to search for the last page in the file - identified by
794 * by ('O','g','g','S',0) and retrieve totalsamples.
797 /* A page is always < 64 kB */
798 if (lseek(fd
, -(MIN(64 * 1024, id3
->filesize
)), SEEK_END
) < 0)
807 r
= read(fd
, &buf
[remaining
], MAX_PATH
- remaining
);
818 /* Inefficient (but simple) search */
821 while (i
< (remaining
- 3))
823 if ((buf
[i
] == 'O') && (memcmp(&buf
[i
], "OggS", 4) == 0))
825 if (i
< (remaining
- 17))
827 /* Note that this only reads the low 32 bits of a
830 id3
->samples
= get_long_le(&buf
[i
+ 6]);
831 last_serial
= get_long_le(&buf
[i
+ 14]);
833 /* If this page is very small the beginning of the next
834 * header could be in buffer. Jump near end of this header
851 /* Move the remaining bytes to start of buffer.
852 * Reuse var 'segments' as it is no longer needed */
854 while (i
< remaining
)
856 buf
[segments
++] = buf
[i
++];
858 remaining
= segments
;
862 /* Discard the rest of the buffer */
867 /* This file has mutiple vorbis bitstreams (or is corrupt). */
868 /* FIXME we should display an error here. */
869 if (serial
!= last_serial
)
871 logf("serialno mismatch");
873 logf("%ld", last_serial
);
877 id3
->length
= ((int64_t) id3
->samples
* 1000) / id3
->frequency
;
879 if (id3
->length
<= 0)
881 logf("ogg length invalid!");
885 id3
->bitrate
= (((int64_t) id3
->filesize
- comment_size
) * 8) / id3
->length
;
891 static bool get_flac_metadata(int fd
, struct mp3entry
* id3
)
893 /* A simple parser to read vital metadata from a FLAC file - length,
894 * frequency, bitrate etc. This code should either be moved to a
895 * seperate file, or discarded in favour of the libFLAC code.
896 * The FLAC stream specification can be found at
897 * http://flac.sourceforge.net/format.html#stream
900 /* Use the trackname part of the id3 structure as a temporary buffer */
901 unsigned char* buf
= (unsigned char *)id3
->path
;
904 if (!skip_id3v2(fd
, id3
) || (read(fd
, buf
, 4) < 4))
909 if (memcmp(buf
, "fLaC", 4) != 0)
918 if (read(fd
, buf
, 4) < 0)
923 /* The length of the block */
924 i
= (buf
[1] << 16) | (buf
[2] << 8) | buf
[3];
926 if ((buf
[0] & 0x7f) == 0) /* 0 is the STREAMINFO block */
928 unsigned long totalsamples
;
930 /* FIXME: Don't trust the value of i */
931 if (read(fd
, buf
, i
) < 0)
936 id3
->vbr
= true; /* All FLAC files are VBR */
937 id3
->filesize
= filesize(fd
);
938 id3
->frequency
= (buf
[10] << 12) | (buf
[11] << 4)
939 | ((buf
[12] & 0xf0) >> 4);
940 rc
= true; /* Got vital metadata */
942 /* totalsamples is a 36-bit field, but we assume <= 32 bits are used */
943 totalsamples
= get_long_be(&buf
[14]);
945 /* Calculate track length (in ms) and estimate the bitrate (in kbit/s) */
946 id3
->length
= ((int64_t) totalsamples
* 1000) / id3
->frequency
;
948 if (id3
->length
<= 0)
950 logf("flac length invalid!");
954 id3
->bitrate
= (id3
->filesize
* 8) / id3
->length
;
956 else if ((buf
[0] & 0x7f) == 4) /* 4 is the VORBIS_COMMENT block */
958 /* The next i bytes of the file contain the VORBIS COMMENTS. */
959 if (!read_vorbis_tags(fd
, id3
, i
))
968 /* If we have reached the last metadata block, abort. */
973 /* Skip to next metadata block */
974 if (lseek(fd
, i
, SEEK_CUR
) < 0)
985 static bool get_wave_metadata(int fd
, struct mp3entry
* id3
)
987 /* Use the trackname part of the id3 structure as a temporary buffer */
988 unsigned char* buf
= (unsigned char *)id3
->path
;
989 unsigned long totalsamples
= 0;
990 unsigned long channels
= 0;
991 unsigned long bitspersample
= 0;
992 unsigned long numbytes
= 0;
996 /* get RIFF chunk header */
997 if ((lseek(fd
, 0, SEEK_SET
) < 0)
998 || ((read_bytes
= read(fd
, buf
, 12)) < 12))
1003 if ((memcmp(buf
, "RIFF",4) != 0)
1004 || (memcmp(&buf
[8], "WAVE", 4) !=0 ))
1009 /* iterate over WAVE chunks until 'data' chunk */
1012 /* get chunk header */
1013 if ((read_bytes
= read(fd
, buf
, 8)) < 8)
1017 i
= get_long_le(&buf
[4]);
1019 if (memcmp(buf
, "fmt ", 4) == 0)
1021 /* get rest of chunk */
1022 if ((read_bytes
= read(fd
, buf
, 16)) < 16)
1027 /* skipping wFormatTag */
1029 channels
= buf
[2] | (buf
[3] << 8);
1030 /* dwSamplesPerSec */
1031 id3
->frequency
= get_long_le(&buf
[4]);
1032 /* dwAvgBytesPerSec */
1033 id3
->bitrate
= (get_long_le(&buf
[8]) * 8) / 1000;
1034 /* skipping wBlockAlign */
1035 /* wBitsPerSample */
1036 bitspersample
= buf
[14] | (buf
[15] << 8);
1038 else if (memcmp(buf
, "data", 4) == 0)
1043 else if (memcmp(buf
, "fact", 4) == 0)
1045 /* dwSampleLength */
1048 /* get rest of chunk */
1049 if ((read_bytes
= read(fd
, buf
, 2)) < 2)
1053 totalsamples
= get_long_le(buf
);
1057 /* seek to next chunk (even chunk sizes must be padded) */
1061 if(lseek(fd
, i
, SEEK_CUR
) < 0)
1065 if ((numbytes
== 0) || (channels
== 0))
1070 if (totalsamples
== 0)
1073 totalsamples
= numbytes
1074 / ((((bitspersample
- 1) / 8) + 1) * channels
);
1077 id3
->vbr
= false; /* All WAV files are CBR */
1078 id3
->filesize
= filesize(fd
);
1080 /* Calculate track length (in ms) and estimate the bitrate (in kbit/s) */
1081 id3
->length
= ((int64_t) totalsamples
* 1000) / id3
->frequency
;
1086 /* Read the tag data from an MP4 file, storing up to buffer_size bytes in
1089 static unsigned long read_mp4_tag(int fd
, unsigned int size_left
, char* buffer
,
1090 unsigned int buffer_left
)
1092 unsigned int bytes_read
= 0;
1094 if (buffer_left
== 0)
1096 lseek(fd
, size_left
, SEEK_CUR
); /* Skip everything */
1100 /* Skip the data tag header - maybe we should parse it properly? */
1101 lseek(fd
, 16, SEEK_CUR
);
1104 if (size_left
> buffer_left
)
1106 read(fd
, buffer
, buffer_left
);
1107 lseek(fd
, size_left
- buffer_left
, SEEK_CUR
);
1108 bytes_read
= buffer_left
;
1112 read(fd
, buffer
, size_left
);
1113 bytes_read
= size_left
;
1120 /* Read a string tag from an MP4 file */
1121 static unsigned int read_mp4_tag_string(int fd
, int size_left
, char** buffer
,
1122 unsigned int* buffer_left
, char** dest
)
1124 unsigned int bytes_read
= read_mp4_tag(fd
, size_left
, *buffer
,
1126 unsigned int length
= 0;
1130 (*buffer
)[bytes_read
] = 0;
1132 length
= strlen(*buffer
) + 1;
1133 *buffer_left
-= length
;
1144 static unsigned int read_mp4_atom(int fd
, unsigned int* size
,
1145 unsigned int* type
, unsigned int size_left
)
1147 read_uint32be(fd
, size
);
1148 read_uint32be(fd
, type
);
1152 /* FAT32 doesn't support files this big, so something seems to
1153 * be wrong. (64-bit sizes should only be used when required.)
1162 if (*size
> size_left
)
1182 static unsigned int read_mp4_length(int fd
, unsigned int* size
)
1184 unsigned int length
= 0;
1193 length
= (length
<< 7) | (c
& 0x7F);
1195 while ((c
& 0x80) && (bytes
< 4) && (*size
> 0));
1200 static bool read_mp4_esds(int fd
, struct mp3entry
* id3
,
1203 unsigned char buf
[8];
1206 lseek(fd
, 4, SEEK_CUR
); /* Version and flags. */
1207 read(fd
, buf
, 1); /* Verify ES_DescrTag. */
1213 if (read_mp4_length(fd
, size
) < 20)
1218 lseek(fd
, 3, SEEK_CUR
);
1223 lseek(fd
, 2, SEEK_CUR
);
1227 read(fd
, buf
, 1); /* Verify DecoderConfigDescrTab. */
1235 if (read_mp4_length(fd
, size
) < 13)
1240 lseek(fd
, 13, SEEK_CUR
); /* Skip audio type, bit rates, etc. */
1244 if (*buf
!= 5) /* Verify DecSpecificInfoTag. */
1250 static const int sample_rates
[] =
1252 96000, 88200, 64000, 48000, 44100, 32000,
1253 24000, 22050, 16000, 12000, 11025, 8000
1256 unsigned int length
;
1260 /* Read the (leading part of the) decoder config. */
1261 length
= read_mp4_length(fd
, size
);
1262 length
= MIN(length
, *size
);
1263 length
= MIN(length
, sizeof(buf
));
1264 read(fd
, buf
, length
);
1267 /* Decoder config format:
1268 * Object type - 5 bits
1269 * Frequency index - 4 bits
1270 * Channel configuration - 4 bits
1272 bits
= get_long_be(buf
);
1274 index
= (bits
>> 23) & 0xf;
1276 if (index
< (sizeof(sample_rates
) / sizeof(*sample_rates
)))
1278 id3
->frequency
= sample_rates
[index
];
1284 /* Extended frequency index - 4 bits */
1285 index
= (bits
>> 15) & 0xf;
1289 /* 17 bits read so far... */
1290 bits
= get_long_be(&buf
[2]);
1291 id3
->frequency
= (bits
>> 7) & 0x00FFFFFF;
1293 else if (index
< (sizeof(sample_rates
) / sizeof(*sample_rates
)))
1295 id3
->frequency
= sample_rates
[index
];
1298 else if (id3
->frequency
< 24000)
1300 /* SBR not indicated, but the file might still contain SBR.
1301 * MPEG specification says that one should assume SBR if
1302 * samplerate <= 24000 Hz.
1304 id3
->frequency
*= 2;
1312 static bool read_mp4_tags(int fd
, struct mp3entry
* id3
,
1313 unsigned int size_left
)
1317 unsigned int buffer_left
= sizeof(id3
->id3v2buf
) + sizeof(id3
->id3v1buf
);
1318 char* buffer
= id3
->id3v2buf
;
1323 size_left
= read_mp4_atom(fd
, &size
, &type
, size_left
);
1325 /* DEBUGF("Tag atom: '%c%c%c%c' (%d bytes left)\n", type >> 24 & 0xff,
1326 type >> 16 & 0xff, type >> 8 & 0xff, type & 0xff, size); */
1331 read_mp4_tag_string(fd
, size
, &buffer
, &buffer_left
,
1336 read_mp4_tag_string(fd
, size
, &buffer
, &buffer_left
,
1341 read_mp4_tag_string(fd
, size
, &buffer
, &buffer_left
,
1346 read_mp4_tag_string(fd
, size
, &buffer
, &buffer_left
,
1353 unsigned short genre
;
1355 read_mp4_tag(fd
, size
, (char*) &genre
, sizeof(genre
));
1356 id3
->genre_string
= id3_get_num_genre(betoh16(genre
) - 1);
1362 unsigned short n
[2];
1364 read_mp4_tag(fd
, size
, (char*) &n
, sizeof(n
));
1365 id3
->tracknum
= betoh16(n
[1]);
1371 char tag_name
[TAG_NAME_LENGTH
];
1372 unsigned int sub_size
;
1375 read_uint32be(fd
, &sub_size
);
1377 lseek(fd
, sub_size
- 4, SEEK_CUR
);
1379 read_uint32be(fd
, &sub_size
);
1381 lseek(fd
, 8, SEEK_CUR
);
1384 if (sub_size
> sizeof(tag_name
) - 1)
1386 read(fd
, tag_name
, sizeof(tag_name
) - 1);
1387 lseek(fd
, sub_size
- sizeof(tag_name
) - 1, SEEK_CUR
);
1388 tag_name
[sizeof(tag_name
) - 1] = 0;
1392 read(fd
, tag_name
, sub_size
);
1393 tag_name
[sub_size
] = 0;
1396 if ((strcasecmp(tag_name
, "composer") == 0) && !cwrt
)
1398 read_mp4_tag_string(fd
, size
, &buffer
, &buffer_left
,
1404 unsigned int length
= read_mp4_tag_string(fd
, size
,
1405 &buffer
, &buffer_left
, &any
);
1409 /* Re-use the read buffer as the dest buffer... */
1411 buffer_left
+= length
;
1413 if (parse_replaygain(tag_name
, buffer
, id3
,
1414 buffer
, buffer_left
) > 0)
1416 /* Data used, keep it. */
1418 buffer_left
-= length
;
1426 lseek(fd
, size
, SEEK_CUR
);
1430 while ((size_left
> 0) && (errno
== 0));
1435 static bool read_mp4_container(int fd
, struct mp3entry
* id3
,
1436 unsigned int size_left
)
1440 unsigned int handler
= 0;
1445 size_left
= read_mp4_atom(fd
, &size
, &type
, size_left
);
1447 /* DEBUGF("Atom: '%c%c%c%c' (0x%08x, %d bytes left)\n",
1448 (type >> 24) & 0xff, (type >> 16) & 0xff, (type >> 8) & 0xff,
1449 type & 0xff, type, size); */
1457 read_uint32be(fd
, &id
);
1460 if ((id
!= MP4_M4A
) && (id
!= MP4_M4B
) && (id
!= MP4_mp42
)
1461 && (id
!= MP4_qt
) && (id
!= MP4_3gp6
))
1463 DEBUGF("Unknown MP4 file type: '%c%c%c%c'\n",
1464 id
>> 24 & 0xff, id
>> 16 & 0xff, id
>> 8 & 0xff,
1472 lseek(fd
, 4, SEEK_CUR
); /* Skip version */
1481 rc
= read_mp4_container(fd
, id3
, size
);
1486 if (handler
== MP4_mdir
)
1488 rc
= read_mp4_tags(fd
, id3
, size
);
1494 if (handler
== MP4_soun
)
1496 rc
= read_mp4_container(fd
, id3
, size
);
1502 lseek(fd
, 8, SEEK_CUR
);
1504 rc
= read_mp4_container(fd
, id3
, size
);
1509 lseek(fd
, 8, SEEK_CUR
);
1510 read_uint32be(fd
, &handler
);
1512 /* DEBUGF(" Handler '%c%c%c%c'\n", handler >> 24 & 0xff,
1513 handler >> 16 & 0xff, handler >> 8 & 0xff,handler & 0xff); */
1518 unsigned int entries
;
1521 lseek(fd
, 4, SEEK_CUR
);
1522 read_uint32be(fd
, &entries
);
1525 for (i
= 0; i
< entries
; i
++)
1530 read_uint32be(fd
, &n
);
1531 read_uint32be(fd
, &l
);
1532 id3
->samples
+= n
* l
;
1542 unsigned int frequency
;
1544 id3
->codectype
= (type
== MP4_mp4a
) ? AFMT_AAC
: AFMT_ALAC
;
1545 lseek(fd
, 22, SEEK_CUR
);
1546 read_uint32be(fd
, &frequency
);
1548 id3
->frequency
= frequency
;
1550 if (type
== MP4_mp4a
)
1552 unsigned int subsize
;
1553 unsigned int subtype
;
1555 /* Get frequency from the decoder info tag, if possible. */
1556 lseek(fd
, 2, SEEK_CUR
);
1557 /* The esds atom is a part of the mp4a atom, so ignore
1558 * the returned size (it's already accounted for).
1560 read_mp4_atom(fd
, &subsize
, &subtype
, size
);
1563 if (subtype
== MP4_esds
)
1565 read_mp4_esds(fd
, id3
, &size
);
1572 id3
->filesize
= size
;
1579 lseek(fd
, size
, SEEK_CUR
);
1581 while (rc
&& (size_left
> 0) && (errno
== 0) && (id3
->filesize
== 0));
1582 /* Break on non-zero filesize, since Rockbox currently doesn't support
1583 * metadata after the mdat atom (which sets the filesize field).
1589 static bool get_mp4_metadata(int fd
, struct mp3entry
* id3
)
1591 id3
->codectype
= AFMT_UNKNOWN
;
1595 if (read_mp4_container(fd
, id3
, filesize(fd
)) && (errno
== 0)
1596 && (id3
->samples
> 0) && (id3
->frequency
> 0)
1597 && (id3
->filesize
> 0))
1599 if (id3
->codectype
== AFMT_UNKNOWN
)
1601 logf("Not an ALAC or AAC file");
1605 id3
->length
= ((int64_t) id3
->samples
* 1000) / id3
->frequency
;
1607 if (id3
->length
<= 0)
1609 logf("mp4 length invalid!");
1613 id3
->bitrate
= ((int64_t) id3
->filesize
* 8) / id3
->length
;
1614 DEBUGF("MP4 bitrate %d, frequency %ld Hz, length %ld ms\n",
1615 id3
->bitrate
, id3
->frequency
, id3
->length
);
1619 logf("MP4 metadata error");
1620 DEBUGF("MP4 metadata error. errno %d, length %ld, frequency %ld, filesize %ld\n",
1621 errno
, id3
->length
, id3
->frequency
, id3
->filesize
);
1628 static bool get_musepack_metadata(int fd
, struct mp3entry
*id3
)
1630 const int32_t sfreqs_sv7
[4] = { 44100, 48000, 37800, 32000 };
1632 uint64_t samples
= 0;
1635 if (!skip_id3v2(fd
, id3
))
1637 if (read(fd
, header
, 4*8) != 4*8) return false;
1638 /* Musepack files are little endian, might need swapping */
1639 for (i
= 1; i
< 8; i
++)
1640 header
[i
] = letoh32(header
[i
]);
1641 if (!memcmp(header
, "MP+", 3)) { /* Compare to sig "MP+" */
1642 unsigned int streamversion
;
1644 header
[0] = letoh32(header
[0]);
1645 streamversion
= (header
[0] >> 24) & 15;
1646 if (streamversion
>= 8) {
1647 return false; /* SV8 or higher don't exist yet, so no support */
1648 } else if (streamversion
== 7) {
1649 unsigned int gapless
= (header
[5] >> 31) & 0x0001;
1650 unsigned int last_frame_samples
= (header
[5] >> 20) & 0x07ff;
1651 int track_gain
, album_gain
;
1652 unsigned int bufused
;
1654 id3
->frequency
= sfreqs_sv7
[(header
[2] >> 16) & 0x0003];
1655 samples
= (uint64_t)header
[1]*1152; /* 1152 is mpc frame size */
1657 samples
-= 1152 - last_frame_samples
;
1659 samples
-= 481; /* Musepack subband synth filter delay */
1661 /* Extract ReplayGain data from header */
1662 track_gain
= (int16_t)((header
[3] >> 16) & 0xffff);
1663 id3
->track_gain
= get_replaygain_int(track_gain
);
1664 id3
->track_peak
= ((uint16_t)(header
[3] & 0xffff)) << 9;
1666 album_gain
= (int16_t)((header
[4] >> 16) & 0xffff);
1667 id3
->album_gain
= get_replaygain_int(album_gain
);
1668 id3
->album_peak
= ((uint16_t)(header
[4] & 0xffff)) << 9;
1670 /* Write replaygain values to strings for use in id3 screen. We use
1671 the XING header as buffer space since Musepack files shouldn't
1672 need to use it in any other way */
1673 id3
->track_gain_string
= (char *)id3
->toc
;
1674 bufused
= snprintf(id3
->track_gain_string
, 45,
1675 "%d.%d dB", track_gain
/100, abs(track_gain
)%100);
1676 id3
->album_gain_string
= (char *)id3
->toc
+ bufused
+ 1;
1677 bufused
= snprintf(id3
->album_gain_string
, 45,
1678 "%d.%d dB", album_gain
/100, abs(album_gain
)%100);
1681 header
[0] = letoh32(header
[0]);
1682 unsigned int streamversion
= (header
[0] >> 11) & 0x03FF;
1683 if (streamversion
!= 4 && streamversion
!= 5 && streamversion
!= 6)
1685 id3
->frequency
= 44100;
1686 id3
->track_gain
= 0;
1687 id3
->track_peak
= 0;
1688 id3
->album_gain
= 0;
1689 id3
->album_peak
= 0;
1691 if (streamversion
>= 5)
1692 samples
= (uint64_t)header
[1]*1152; // 32 bit
1694 samples
= (uint64_t)(header
[1] >> 16)*1152; // 16 bit
1697 if (streamversion
< 6)
1702 /* Estimate bitrate, we should probably subtract the various header sizes
1703 here for super-accurate results */
1704 id3
->length
= ((int64_t) samples
* 1000) / id3
->frequency
;
1706 if (id3
->length
<= 0)
1708 logf("mpc length invalid!");
1712 id3
->filesize
= filesize(fd
);
1713 id3
->bitrate
= id3
->filesize
* 8 / id3
->length
;
1717 /* PSID metadata info is available here:
1718 http://www.unusedino.de/ec64/technical/formats/sidplay.html */
1719 static bool get_sid_metadata(int fd
, struct mp3entry
* id3
)
1721 /* Use the trackname part of the id3 structure as a temporary buffer */
1722 unsigned char* buf
= (unsigned char *)id3
->path
;
1727 if ((lseek(fd
, 0, SEEK_SET
) < 0)
1728 || ((read_bytes
= read(fd
, buf
, 0x80)) < 0x80))
1733 if ((memcmp(buf
, "PSID",4) != 0))
1740 /* Copy Title (assumed max 0x1f letters + 1 zero byte) */
1743 p
= iso_decode(&buf
[0x16], p
, 0, strlen(&buf
[0x16])+1);
1745 /* Copy Artist (assumed max 0x1f letters + 1 zero byte) */
1748 p
= iso_decode(&buf
[0x36], p
, 0, strlen(&buf
[0x36])+1);
1750 /* Copy Year (assumed max 4 letters + 1 zero byte) */
1752 id3
->year
= atoi(&buf
[0x56]);
1754 /* Copy Album (assumed max 0x1f-0x05 letters + 1 zero byte) */
1757 p
= iso_decode(&buf
[0x5b], p
, 0, strlen(&buf
[0x5b])+1);
1760 id3
->frequency
= 44100;
1761 /* New idea as posted by Marco Alanen (ravon):
1762 * Set the songlength in seconds to the number of subsongs
1763 * so every second represents a subsong.
1764 * Users can then skip the current subsong by seeking
1766 * Note: the number of songs is a 16bit value at 0xE, so this code only
1767 * uses the lower 8 bits of the counter.
1769 id3
->length
= (buf
[0xf]-1)*1000;
1771 id3
->filesize
= filesize(fd
);
1776 static bool get_adx_metadata(int fd
, struct mp3entry
* id3
)
1778 /* Use the trackname part of the id3 structure as a temporary buffer */
1779 unsigned char * buf
= (unsigned char *)id3
->path
;
1780 int chanstart
, channels
, read_bytes
;
1781 int looping
= 0, start_adr
= 0, end_adr
= 0;
1783 /* try to get the basic header */
1784 if ((lseek(fd
, 0, SEEK_SET
) < 0)
1785 || ((read_bytes
= read(fd
, buf
, 0x38)) < 0x38))
1787 DEBUGF("lseek or read failed\n");
1791 /* ADX starts with 0x80 */
1792 if (buf
[0] != 0x80) {
1793 DEBUGF("get_adx_metadata: wrong first byte %c\n",buf
[0]);
1797 /* check for a reasonable offset */
1798 chanstart
= ((buf
[2] << 8) | buf
[3]) + 4;
1799 if (chanstart
> 4096) {
1800 DEBUGF("get_adx_metadata: bad chanstart %i\n", chanstart
);
1804 /* check for a workable number of channels */
1806 if (channels
!= 1 && channels
!= 2) {
1807 DEBUGF("get_adx_metadata: bad channel count %i\n",channels
);
1811 id3
->frequency
= get_long_be(&buf
[8]);
1812 /* 32 samples per 18 bytes */
1813 id3
->bitrate
= id3
->frequency
* channels
* 18 * 8 / 32 / 1000;
1814 id3
->length
= get_long_be(&buf
[12]) / id3
->frequency
* 1000;
1816 id3
->filesize
= filesize(fd
);
1819 if (!memcmp(buf
+0x10,"\x01\xF4\x03\x00",4)) {
1820 /* Soul Calibur 2 style (type 03) */
1821 DEBUGF("get_adx_metadata: type 03 found\n");
1822 /* check if header is too small for loop data */
1823 if (chanstart
-6 < 0x2c) looping
=0;
1825 looping
= get_long_be(&buf
[0x18]);
1826 end_adr
= get_long_be(&buf
[0x28]);
1827 start_adr
= get_long_be(&buf
[0x1c])/32*channels
*18+chanstart
;
1829 } else if (!memcmp(buf
+0x10,"\x01\xF4\x04\x00",4)) {
1830 /* Standard (type 04) */
1831 DEBUGF("get_adx_metadata: type 04 found\n");
1832 /* check if header is too small for loop data */
1833 if (chanstart
-6 < 0x38) looping
=0;
1835 looping
= get_long_be(&buf
[0x24]);
1836 end_adr
= get_long_be(&buf
[0x34]);
1837 start_adr
= get_long_be(&buf
[0x28])/32*channels
*18+chanstart
;
1840 DEBUGF("get_adx_metadata: error, couldn't determine ADX type\n");
1845 /* 2 loops, 10 second fade */
1846 id3
->length
= (start_adr
-chanstart
+ 2*(end_adr
-start_adr
))
1847 *8 / id3
->bitrate
+ 10000;
1850 /* try to get the channel header */
1851 if ((lseek(fd
, chanstart
-6, SEEK_SET
) < 0)
1852 || ((read_bytes
= read(fd
, buf
, 6)) < 6))
1857 /* check channel header */
1858 if (memcmp(buf
, "(c)CRI", 6) != 0) return false;
1863 static bool get_spc_metadata(int fd
, struct mp3entry
* id3
)
1865 /* Use the trackname part of the id3 structure as a temporary buffer */
1866 unsigned char * buf
= (unsigned char *)id3
->path
;
1870 unsigned long length
;
1872 bool isbinary
= true;
1875 /* try to get the ID666 tag */
1876 if ((lseek(fd
, 0x2e, SEEK_SET
) < 0)
1877 || ((read_bytes
= read(fd
, buf
, 0xD2)) < 0xD2))
1879 DEBUGF("lseek or read failed\n");
1887 p
= iso_decode(buf
, p
, 0, 32);
1892 p
= iso_decode(buf
, p
, 0, 32);
1897 p
= iso_decode(buf
, p
, 0, 32);
1901 if(buf
[2] == '/' && buf
[5] == '/')
1904 /* Reserved bytes check */
1905 if(buf
[0xD2 - 0x2E - 112] >= '0' &&
1906 buf
[0xD2 - 0x2E - 112] <= '9' &&
1907 buf
[0xD3 - 0x2E - 112] == 0x00)
1910 /* is length & fade only digits? */
1912 (buf
[0xA9 - 0x2E - 112+i
]>='0'&&buf
[0xA9 - 0x2E - 112+i
]<='9') ||
1913 buf
[0xA9 - 0x2E - 112+i
]=='\0');
1915 if (i
==8) isbinary
= false;
1918 id3
->year
= buf
[0] | (buf
[1]<<8);
1921 length
= (buf
[0] | (buf
[1]<<8) | (buf
[2]<<16)) * 1000;
1924 fade
= (buf
[0] | (buf
[1]<<8) | (buf
[2]<<16) | (buf
[3]<<24));
1931 id3
->year
= atoi(buf
);
1934 memcpy(tbuf
, buf
, 3);
1936 length
= atoi(tbuf
) * 1000;
1939 memcpy(tbuf
, buf
, 5);
1947 p
= iso_decode(buf
, p
, 0, 32);
1950 length
=3*60*1000; /* 3 minutes */
1951 fade
=5*1000; /* 5 seconds */
1954 id3
->length
= length
+fade
;
1959 static bool get_aiff_metadata(int fd
, struct mp3entry
* id3
)
1961 /* Use the trackname part of the id3 structure as a temporary buffer */
1962 unsigned char* buf
= (unsigned char *)id3
->path
;
1963 unsigned long numChannels
= 0;
1964 unsigned long numSampleFrames
= 0;
1965 unsigned long sampleSize
= 0;
1966 unsigned long sampleRate
= 0;
1967 unsigned long numbytes
= 0;
1971 if ((lseek(fd
, 0, SEEK_SET
) < 0)
1972 || ((read_bytes
= read(fd
, buf
, sizeof(id3
->path
))) < 54))
1977 if ((memcmp(buf
, "FORM",4) != 0)
1978 || (memcmp(&buf
[8], "AIFF", 4) !=0 ))
1986 while ((numbytes
== 0) && (read_bytes
>= 8))
1989 i
= get_long_be(&buf
[4]);
1991 if (memcmp(buf
, "COMM", 4) == 0)
1994 numChannels
= ((buf
[8]<<8)|buf
[9]);
1995 /* numSampleFrames */
1996 numSampleFrames
= get_long_be(&buf
[10]);
1998 sampleSize
= ((buf
[14]<<8)|buf
[15]);
2000 sampleRate
= get_long_be(&buf
[18]);
2001 sampleRate
= sampleRate
>> (16+14-buf
[17]);
2002 /* save format infos */
2003 id3
->bitrate
= (sampleSize
* numChannels
* sampleRate
) / 1000;
2004 id3
->frequency
= sampleRate
;
2005 id3
->length
= ((int64_t) numSampleFrames
* 1000) / id3
->frequency
;
2007 id3
->vbr
= false; /* AIFF files are CBR */
2008 id3
->filesize
= filesize(fd
);
2010 else if (memcmp(buf
, "SSND", 4) == 0)
2017 i
++; /* odd chunk sizes must be padded */
2020 read_bytes
-= i
+ 8;
2023 if ((numbytes
== 0) || (numChannels
== 0))
2029 #endif /* CONFIG_CODEC == SWCODEC */
2032 /* Simple file type probing by looking at the filename extension. */
2033 unsigned int probe_file_format(const char *filename
)
2038 suffix
= strrchr(filename
, '.');
2042 return AFMT_UNKNOWN
;
2048 for (i
= 1; i
< AFMT_NUM_CODECS
; i
++)
2050 /* search extension list for type */
2051 const char *ext
= audio_formats
[i
].ext_list
;
2055 if (strcasecmp(suffix
, ext
) == 0)
2060 ext
+= strlen(ext
) + 1;
2062 while (*ext
!= '\0');
2065 return AFMT_UNKNOWN
;
2068 /* Get metadata for track - return false if parsing showed problems with the
2069 * file that would prevent playback.
2071 bool get_metadata(struct track_info
* track
, int fd
, const char* trackname
,
2074 #if CONFIG_CODEC == SWCODEC
2076 unsigned long totalsamples
;
2080 /* Take our best guess at the codec type based on file extension */
2081 track
->id3
.codectype
= probe_file_format(trackname
);
2083 /* Load codec specific track tag information and confirm the codec type. */
2084 switch (track
->id3
.codectype
)
2089 if (!get_mp3_metadata(fd
, &track
->id3
, trackname
, v1first
))
2096 #if CONFIG_CODEC == SWCODEC
2098 if (!get_flac_metadata(fd
, &(track
->id3
)))
2106 if (!get_musepack_metadata(fd
, &(track
->id3
)))
2108 read_ape_tags(fd
, &(track
->id3
));
2111 case AFMT_OGG_VORBIS
:
2112 if (!get_vorbis_metadata(fd
, &(track
->id3
)))/*detects and handles Ogg/Speex files*/
2120 if (!get_speex_metadata(fd
, &(track
->id3
)))
2128 if (!get_wave_metadata(fd
, &(track
->id3
)))
2136 /* A simple parser to read basic information from a WavPack file. This
2137 * now works with self-extrating WavPack files. This no longer fails on
2138 * WavPack files containing floating-point audio data because these are
2139 * now converted to standard Rockbox format in the decoder.
2142 /* Use the trackname part of the id3 structure as a temporary buffer */
2143 buf
= (unsigned char *)track
->id3
.path
;
2145 for (i
= 0; i
< 256; ++i
) {
2147 /* at every 256 bytes into file, try to read a WavPack header */
2149 if ((lseek(fd
, i
* 256, SEEK_SET
) < 0) || (read(fd
, buf
, 32) < 32))
2154 /* if valid WavPack 4 header version & not floating data, break */
2156 if (memcmp (buf
, "wvpk", 4) == 0 && buf
[9] == 4 &&
2157 (buf
[8] >= 2 && buf
[8] <= 0x10))
2164 logf ("%s is not a WavPack file\n", trackname
);
2168 track
->id3
.vbr
= true; /* All WavPack files are VBR */
2169 track
->id3
.filesize
= filesize (fd
);
2171 if ((buf
[20] | buf
[21] | buf
[22] | buf
[23]) &&
2172 (buf
[12] & buf
[13] & buf
[14] & buf
[15]) != 0xff)
2174 int srindx
= ((buf
[26] >> 7) & 1) + ((buf
[27] << 1) & 14);
2178 track
->id3
.frequency
= 44100;
2182 track
->id3
.frequency
= wavpack_sample_rates
[srindx
];
2185 totalsamples
= get_long_le(&buf
[12]);
2186 track
->id3
.length
= totalsamples
/ (track
->id3
.frequency
/ 100) * 10;
2187 track
->id3
.bitrate
= filesize (fd
) / (track
->id3
.length
/ 8);
2190 read_ape_tags(fd
, &track
->id3
); /* use any apetag info we find */
2194 /* Use the trackname part of the id3 structure as a temporary buffer */
2195 buf
= (unsigned char *)track
->id3
.path
;
2197 if ((lseek(fd
, 0, SEEK_SET
) < 0) || (read(fd
, buf
, 5) < 5))
2202 if ((buf
[0] != 0x0b) || (buf
[1] != 0x77))
2204 logf("%s is not an A52/AC3 file\n",trackname
);
2212 logf("A52: Invalid frmsizecod: %d\n",i
);
2216 track
->id3
.bitrate
= a52_bitrates
[i
>> 1];
2217 track
->id3
.vbr
= false;
2218 track
->id3
.filesize
= filesize(fd
);
2220 switch (buf
[4] & 0xc0)
2223 track
->id3
.frequency
= 48000;
2224 track
->id3
.bytesperframe
=track
->id3
.bitrate
* 2 * 2;
2228 track
->id3
.frequency
= 44100;
2229 track
->id3
.bytesperframe
= a52_441framesizes
[i
];
2233 track
->id3
.frequency
= 32000;
2234 track
->id3
.bytesperframe
= track
->id3
.bitrate
* 3 * 2;
2238 logf("A52: Invalid samplerate code: 0x%02x\n", buf
[4] & 0xc0);
2243 /* One A52 frame contains 6 blocks, each containing 256 samples */
2244 totalsamples
= track
->id3
.filesize
/ track
->id3
.bytesperframe
* 6 * 256;
2245 track
->id3
.length
= totalsamples
/ track
->id3
.frequency
* 1000;
2250 if (!get_mp4_metadata(fd
, &(track
->id3
)))
2258 track
->id3
.vbr
= true;
2259 track
->id3
.filesize
= filesize(fd
);
2260 if (!skip_id3v2(fd
, &(track
->id3
)))
2264 /* TODO: read the id3v2 header if it exists */
2268 if (!get_sid_metadata(fd
, &(track
->id3
)))
2274 if(!get_spc_metadata(fd
, &(track
->id3
)))
2276 DEBUGF("get_spc_metadata error\n");
2279 track
->id3
.filesize
= filesize(fd
);
2280 track
->id3
.genre_string
= id3_get_num_genre(36);
2283 if (!get_adx_metadata(fd
, &(track
->id3
)))
2285 DEBUGF("get_adx_metadata error\n");
2291 buf
= (unsigned char *)track
->id3
.path
;
2292 if ((lseek(fd
, 0, SEEK_SET
) < 0) || ((read(fd
, buf
, 8)) < 8))
2294 DEBUGF("lseek or read failed\n");
2297 track
->id3
.vbr
= false;
2298 track
->id3
.filesize
= filesize(fd
);
2299 if (memcmp(buf
,"NESM",4) && memcmp(buf
,"NSFE",4)) return false;
2303 if (!get_aiff_metadata(fd
, &(track
->id3
)))
2310 #endif /* CONFIG_CODEC == SWCODEC */
2313 /* If we don't know how to read the metadata, assume we can't play
2319 /* We have successfully read the metadata from the file */
2322 if (cuesheet_is_enabled() && look_for_cuesheet_file(trackname
))
2324 track
->id3
.cuesheet_type
= 1;
2328 lseek(fd
, 0, SEEK_SET
);
2329 strncpy(track
->id3
.path
, trackname
, sizeof(track
->id3
.path
));
2330 track
->taginfo_ready
= true;