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];
|
struct FLACseekpoints seekpoints[MAX_SUPPORTED_SEEKTABLE_SIZE];
|
||||||
int nseekpoints;
|
int nseekpoints;
|
||||||
|
|
||||||
static bool flac_init(FLACContext* fc)
|
static bool flac_init(FLACContext* fc, int first_frame_offset)
|
||||||
{
|
{
|
||||||
unsigned char buf[255];
|
unsigned char buf[255];
|
||||||
bool found_streaminfo=false;
|
bool found_streaminfo=false;
|
||||||
|
@ -87,6 +87,11 @@ static bool flac_init(FLACContext* fc)
|
||||||
ci->memset(fc,0,sizeof(FLACContext));
|
ci->memset(fc,0,sizeof(FLACContext));
|
||||||
nseekpoints=0;
|
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)
|
if (ci->read_filebuf(buf, 4) < 4)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -96,7 +101,7 @@ static bool flac_init(FLACContext* fc)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
fc->metadatalength = 4;
|
fc->metadatalength += 4;
|
||||||
|
|
||||||
while (!endofmetadata) {
|
while (!endofmetadata) {
|
||||||
if (ci->read_filebuf(buf, 4) < 4)
|
if (ci->read_filebuf(buf, 4) < 4)
|
||||||
|
@ -199,8 +204,7 @@ bool flac_seek(FLACContext* fc, uint32_t newsample) {
|
||||||
|
|
||||||
offset+=fc->metadatalength;
|
offset+=fc->metadatalength;
|
||||||
|
|
||||||
if ((off_t)offset < ci->filesize) {
|
if (ci->seek_buffer(offset)) {
|
||||||
ci->seek_buffer(offset);
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
@ -240,7 +244,12 @@ enum codec_status codec_start(struct codec_api* api)
|
||||||
|
|
||||||
next_track:
|
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");
|
LOGF("FLAC: Error initialising codec\n");
|
||||||
return CODEC_ERROR;
|
return CODEC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -785,6 +785,26 @@ static bool get_flac_metadata(int fd, struct mp3entry* id3)
|
||||||
return rc;
|
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)
|
if (memcmp(buf,"fLaC",4) != 0)
|
||||||
{
|
{
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -134,5 +134,6 @@ enum {
|
||||||
bool mp3info(struct mp3entry *entry, const char *filename, bool v1first);
|
bool mp3info(struct mp3entry *entry, const char *filename, bool v1first);
|
||||||
char* id3_get_genre(const struct mp3entry* id3);
|
char* id3_get_genre(const struct mp3entry* id3);
|
||||||
char* id3_get_codec(const struct mp3entry* id3);
|
char* id3_get_codec(const struct mp3entry* id3);
|
||||||
|
int getid3v2len(int fd);
|
||||||
|
|
||||||
#endif
|
#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
|
* Returns: the size of the tag or 0 if none was found
|
||||||
*/
|
*/
|
||||||
static int getid3v2len(int fd)
|
int getid3v2len(int fd)
|
||||||
{
|
{
|
||||||
char buf[6];
|
char buf[6];
|
||||||
int offset;
|
int offset;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue