forked from len0rd/rockbox
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
This commit is contained in:
parent
a4c190f7d4
commit
15a830bdba
4 changed files with 36 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue