From 22c63269749aa6471235f9547e53bc9d6f8ce41b Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Thu, 8 Aug 2019 16:49:16 -0400 Subject: Improvements for vbrfix plugin: * Properly account for ID3v1 tags * Play time computation fixes * Add speech feedback Patch by Igor Poretsky Change-Id: Ia6df8fb171882a88527cfa9d3b76b705f09becdd --- lib/rbcodec/metadata/mp3.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'lib/rbcodec/metadata/mp3.c') diff --git a/lib/rbcodec/metadata/mp3.c b/lib/rbcodec/metadata/mp3.c index 661fea8e51..2096e70898 100644 --- a/lib/rbcodec/metadata/mp3.c +++ b/lib/rbcodec/metadata/mp3.c @@ -71,7 +71,9 @@ static int getsonglength(int fd, struct mp3entry *entry) if(bytecount < 0) return -1; - bytecount += entry->id3v2len; + /* Subtract the meta information from the file size to get + the true size of the MP3 stream */ + entry->filesize -= entry->id3v1len + entry->id3v2len; /* Validate byte count, in case the file has been edited without * updating the header. @@ -99,6 +101,9 @@ static int getsonglength(int fd, struct mp3entry *entry) } } + entry->filesize -= bytecount; + bytecount += entry->id3v2len; + entry->bitrate = info.bitrate; entry->frequency = info.frequency; entry->layer = info.layer; @@ -127,7 +132,7 @@ static int getsonglength(int fd, struct mp3entry *entry) if (info.bitrate < 8) filetime = 0; else - filetime = (entry->filesize - bytecount) / (info.bitrate / 8); + filetime = entry->filesize / (info.bitrate >> 3); /* bitrate is in kbps so this delivers milliseconds. Doing bitrate / 8 * instead of filesize * 8 is exact, because mpeg audio bitrates are * always multiples of 8, and it avoids overflows. */ @@ -163,6 +168,7 @@ bool get_mp3_metadata(int fd, struct mp3entry *entry) { entry->title = NULL; entry->filesize = filesize(fd); + entry->id3v1len = getid3v1len(fd); entry->id3v2len = getid3v2len(fd); entry->tracknum = 0; entry->discnum = 0; @@ -174,10 +180,6 @@ bool get_mp3_metadata(int fd, struct mp3entry *entry) return false; entry->length = len; - /* Subtract the meta information from the file size to get - the true size of the MP3 stream */ - entry->filesize -= entry->first_frame_offset; - /* only seek to end of file if no id3v2 tags were found */ if (!entry->id3v2len) { setid3v1title(fd, entry); -- cgit v1.2.3