diff --git a/taglib/riff/wav/wavproperties.cpp b/taglib/riff/wav/wavproperties.cpp index df7cdbae..181e3a6c 100644 --- a/taglib/riff/wav/wavproperties.cpp +++ b/taglib/riff/wav/wavproperties.cpp @@ -192,7 +192,7 @@ void RIFF::WAV::Properties::read(File *file) d->sampleRate = data.toUInt(4, false); d->bitsPerSample = data.toShort(14, false); - if(totalSamples > 0) + if(d->format != FORMAT_PCM) d->sampleFrames = totalSamples; else if(d->channels > 0 && d->bitsPerSample > 0) d->sampleFrames = streamLength / (d->channels * ((d->bitsPerSample + 7) / 8)); diff --git a/tests/data/pcm_with_fact_chunk.wav b/tests/data/pcm_with_fact_chunk.wav new file mode 100644 index 00000000..a6dc1d6c Binary files /dev/null and b/tests/data/pcm_with_fact_chunk.wav differ diff --git a/tests/test_wav.cpp b/tests/test_wav.cpp index cdb0ca58..f3bca479 100644 --- a/tests/test_wav.cpp +++ b/tests/test_wav.cpp @@ -25,6 +25,7 @@ class TestWAV : public CppUnit::TestFixture CPPUNIT_TEST(testFuzzedFile1); CPPUNIT_TEST(testFuzzedFile2); CPPUNIT_TEST(testStripAndProperties); + CPPUNIT_TEST(testPCMWithFactChunk); CPPUNIT_TEST_SUITE_END(); public: @@ -247,6 +248,22 @@ public: } } + void testPCMWithFactChunk() + { + RIFF::WAV::File f(TEST_FILE_PATH_C("pcm_with_fact_chunk.wav")); + CPPUNIT_ASSERT(f.audioProperties()); + CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); + CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); + CPPUNIT_ASSERT_EQUAL(3675, f.audioProperties()->lengthInMilliseconds()); + CPPUNIT_ASSERT_EQUAL(32, f.audioProperties()->bitrate()); + CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); + CPPUNIT_ASSERT_EQUAL(1000, f.audioProperties()->sampleRate()); + CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); + CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->sampleWidth()); + CPPUNIT_ASSERT_EQUAL(3675U, f.audioProperties()->sampleFrames()); + CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->format()); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestWAV);