From b87c8f042bcd38d2a3cca72aef8e352635a9a58a Mon Sep 17 00:00:00 2001 From: Scott Wheeler Date: Thu, 31 Jan 2008 20:55:29 +0000 Subject: [PATCH] Meh, why not go ahead and expose this. Add a method to get the samples per frame. FEATURE:130755 git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@769207 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- taglib/mpeg/mpegheader.cpp | 20 +++++++++++++++++++- taglib/mpeg/mpegheader.h | 5 +++++ taglib/mpeg/mpegproperties.cpp | 12 ++---------- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/taglib/mpeg/mpegheader.cpp b/taglib/mpeg/mpegheader.cpp index 8d16d9cc..63cd14d8 100644 --- a/taglib/mpeg/mpegheader.cpp +++ b/taglib/mpeg/mpegheader.cpp @@ -46,7 +46,8 @@ public: channelMode(Stereo), isCopyrighted(false), isOriginal(false), - frameLength(0) {} + frameLength(0), + samplesPerFrame(0) {} bool isValid; Version version; @@ -59,6 +60,7 @@ public: bool isCopyrighted; bool isOriginal; int frameLength; + int samplesPerFrame; }; //////////////////////////////////////////////////////////////////////////////// @@ -137,6 +139,11 @@ int MPEG::Header::frameLength() const return d->frameLength; } +int MPEG::Header::samplesPerFrame() const +{ + return d->samplesPerFrame; +} + MPEG::Header &MPEG::Header::operator=(const Header &h) { if(&h == this) @@ -252,6 +259,17 @@ void MPEG::Header::parse(const ByteVector &data) else d->frameLength = 72000 * d->bitrate / d->sampleRate + int(d->isPadded); + // Samples per frame + + static const int samplesPerFrame[3][2] = { + // MPEG1, 2/2.5 + { 384, 384 }, // Layer I + { 1152, 1152 }, // Layer II + { 1152, 576 } // Layer III + }; + + d->samplesPerFrame = samplesPerFrame[layerIndex][versionIndex]; + // Now that we're done parsing, set this to be a valid frame. d->isValid = true; diff --git a/taglib/mpeg/mpegheader.h b/taglib/mpeg/mpegheader.h index cd9ac2e1..eb6d8642 100644 --- a/taglib/mpeg/mpegheader.h +++ b/taglib/mpeg/mpegheader.h @@ -144,6 +144,11 @@ namespace TagLib { */ int frameLength() const; + /*! + * Returns the number of frames per sample. + */ + int samplesPerFrame() const; + /*! * Makes a shallow copy of the header. */ diff --git a/taglib/mpeg/mpegproperties.cpp b/taglib/mpeg/mpegproperties.cpp index 76286b93..61700aed 100644 --- a/taglib/mpeg/mpegproperties.cpp +++ b/taglib/mpeg/mpegproperties.cpp @@ -215,17 +215,9 @@ void MPEG::Properties::read() firstHeader.sampleRate() > 0 && d->xingHeader->totalFrames() > 0) { - static const int blockSize[2][4] = { - // Version 1 - { 0, 384, 1152, 1152 }, - // Version 2 or 2.5 - { 0, 384, 1152, 576 } - }; - - int versionIndex = firstHeader.version() == Header::Version1 ? 0 : 1; double timePerFrame = - double(blockSize[versionIndex][firstHeader.layer()]) / - firstHeader.sampleRate(); + double(firstHeader.samplesPerFrame()) / firstHeader.sampleRate(); + d->length = int(timePerFrame * d->xingHeader->totalFrames()); d->bitrate = d->length > 0 ? d->xingHeader->totalSize() * 8 / d->length / 1000 : 0; }