channelMode(Stereo),
isCopyrighted(false),
isOriginal(false),
- frameLength(0) {}
+ frameLength(0),
+ samplesPerFrame(0) {}
bool isValid;
Version version;
bool isCopyrighted;
bool isOriginal;
int frameLength;
+ int samplesPerFrame;
};
////////////////////////////////////////////////////////////////////////////////
return d->frameLength;
}
+int MPEG::Header::samplesPerFrame() const
+{
+ return d->samplesPerFrame;
+}
+
MPEG::Header &MPEG::Header::operator=(const Header &h)
{
if(&h == this)
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;
*/
int frameLength() const;
+ /*!
+ * Returns the number of frames per sample.
+ */
+ int samplesPerFrame() const;
+
/*!
* Makes a shallow copy of the header.
*/
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;
}