1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 Dave Chapman
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
29 #include "metadata_common.h"
30 #include "metadata_parsers.h"
33 bool get_flac_metadata(int fd
, struct mp3entry
* id3
)
35 /* A simple parser to read vital metadata from a FLAC file - length,
36 * frequency, bitrate etc. This code should either be moved to a
37 * seperate file, or discarded in favour of the libFLAC code.
38 * The FLAC stream specification can be found at
39 * http://flac.sourceforge.net/format.html#stream
42 /* Use the trackname part of the id3 structure as a temporary buffer */
43 unsigned char* buf
= (unsigned char *)id3
->path
;
44 bool last_metadata
= false;
47 if (!skip_id3v2(fd
, id3
) || (read(fd
, buf
, 4) < 4))
52 if (memcmp(buf
, "fLaC", 4) != 0)
57 while (!last_metadata
)
62 if (read(fd
, buf
, 4) < 0)
67 last_metadata
= buf
[0] & 0x80;
69 /* The length of the block */
70 i
= (buf
[1] << 16) | (buf
[2] << 8) | buf
[3];
72 if (type
== 0) /* 0 is the STREAMINFO block */
74 unsigned long totalsamples
;
76 if (i
>= sizeof(id3
->path
) || read(fd
, buf
, i
) < 0)
81 id3
->vbr
= true; /* All FLAC files are VBR */
82 id3
->filesize
= filesize(fd
);
83 id3
->frequency
= (buf
[10] << 12) | (buf
[11] << 4)
84 | ((buf
[12] & 0xf0) >> 4);
85 rc
= true; /* Got vital metadata */
87 /* totalsamples is a 36-bit field, but we assume <= 32 bits are used */
88 totalsamples
= get_long_be(&buf
[14]);
90 /* Calculate track length (in ms) and estimate the bitrate (in kbit/s) */
91 id3
->length
= ((int64_t) totalsamples
* 1000) / id3
->frequency
;
95 logf("flac length invalid!");
99 id3
->bitrate
= ((int64_t) id3
->filesize
* 8) / id3
->length
;
101 else if (type
== 4) /* 4 is the VORBIS_COMMENT block */
103 /* The next i bytes of the file contain the VORBIS COMMENTS. */
104 if (read_vorbis_tags(fd
, id3
, i
) == 0)
109 else if (!last_metadata
)
111 /* Skip to next metadata block */
112 if (lseek(fd
, i
, SEEK_CUR
) < 0)