diff --git a/taglib/ape/apeproperties.cpp b/taglib/ape/apeproperties.cpp index 89a11be3..233399ef 100644 --- a/taglib/ape/apeproperties.cpp +++ b/taglib/ape/apeproperties.cpp @@ -33,6 +33,8 @@ #include "id3v2tag.h" #include "apeproperties.h" #include "apefile.h" +#include "apetag.h" +#include "apefooter.h" using namespace TagLib; @@ -149,10 +151,18 @@ void APE::Properties::read(File *file) else analyzeOld(file); + long streamLength = file->length() - offset; + + if(file->hasID3v1Tag()) + streamLength -= 128; + + if(file->hasAPETag()) + streamLength -= file->APETag()->footer()->completeTagSize(); + if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / d->sampleRate; d->length = static_cast(length + 0.5); - d->bitrate = static_cast(file->length() * 8.0 / length + 0.5); + d->bitrate = static_cast(streamLength * 8.0 / length + 0.5); } } diff --git a/tests/data/mac-399-tagged.ape b/tests/data/mac-399-tagged.ape new file mode 100644 index 00000000..3f5a656e Binary files /dev/null and b/tests/data/mac-399-tagged.ape differ diff --git a/tests/test_ape.cpp b/tests/test_ape.cpp index c2b0d3dc..1ac73255 100644 --- a/tests/test_ape.cpp +++ b/tests/test_ape.cpp @@ -14,6 +14,7 @@ class TestAPE : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestAPE); CPPUNIT_TEST(testProperties399); + CPPUNIT_TEST(testProperties399Tagged); CPPUNIT_TEST(testProperties396); CPPUNIT_TEST(testProperties390); CPPUNIT_TEST(testFuzzedFile1); @@ -37,6 +38,21 @@ public: CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); } + void testProperties399Tagged() + { + APE::File f(TEST_FILE_PATH_C("mac-399-tagged.ape")); + CPPUNIT_ASSERT(f.audioProperties()); + CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); + CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); + CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); + CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); + CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); + CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); + CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); + CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); + CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); + } + void testProperties396() { APE::File f(TEST_FILE_PATH_C("mac-396.ape"));