This fixes KDE Bug 130185 as reported by the user that is to say for episode 18 of season 3 of LUG radio. Contrarily to what some people have been writing before even looking at the file itself, there is a Xing header in this file. Robert Hegemann of the LAME project actually found what the problem in taglib is (comment 20 of the bug report). As always this patches has been tested against my test database and did not introduce any regression. Also as always, the patch has to be applied after my other patches. diff -ruN taglib.old/taglib/mpeg/mpegheader.h taglib/taglib/mpeg/mpegheader.h --- taglib.old/taglib/mpeg/mpegheader.h 2007-01-24 12:09:15.000000000 +0100 +++ taglib/taglib/mpeg/mpegheader.h 2007-01-24 12:09:31.000000000 +0100 @@ -139,6 +139,11 @@ int frameLength() const; /*! + * Returns the number of samples per frame. + */ + int samplesPerFrame() const; + + /*! * Makes a shallow copy of the header. */ Header &operator=(const Header &h); diff -ruN taglib.old/taglib/mpeg/mpegheader.cpp taglib/taglib/mpeg/mpegheader.cpp --- taglib.old/taglib/mpeg/mpegheader.cpp 2007-01-24 12:09:12.000000000 +0100 +++ taglib/taglib/mpeg/mpegheader.cpp 2007-01-24 12:09:32.000000000 +0100 @@ -38,6 +38,7 @@ layer(0), protectionEnabled(false), sampleRate(0), + samplesPerFrame(0), isPadded(false), channelMode(Stereo), isCopyrighted(false), @@ -50,6 +51,7 @@ bool protectionEnabled; int bitrate; int sampleRate; + int samplesPerFrame; bool isPadded; ChannelMode channelMode; bool isCopyrighted; @@ -133,6 +135,11 @@ return d->frameLength; } +int MPEG::Header::samplesPerFrame() const +{ + return d->samplesPerFrame; +} + MPEG::Header &MPEG::Header::operator=(const Header &h) { if(&h == this) @@ -235,6 +242,15 @@ d->channelMode = ChannelMode((uchar(data[3]) & 0xC0) >> 6); + // Calculate the number of samples per frame + + static const int samplesPerFrames[2][3] = { + { 384, 1152, 1152 }, // Version 1 + { 384, 1152, 576 } // Version 2 and 2.5 + }; + + d->samplesPerFrame = samplesPerFrames[versionIndex][layerIndex]; + // TODO: Add mode extension for completeness d->isOriginal = flags[2]; diff -ruN taglib.old/taglib/mpeg/mpegproperties.cpp taglib/taglib/mpeg/mpegproperties.cpp --- taglib.old/taglib/mpeg/mpegproperties.cpp 2007-01-24 12:24:44.000000000 +0100 +++ taglib/taglib/mpeg/mpegproperties.cpp 2007-01-24 12:25:08.000000000 +0100 @@ -211,9 +211,7 @@ firstHeader.sampleRate() > 0 && d->xingHeader->totalFrames() > 0) { - static const int blockSize[] = { 0, 384, 1152, 1152 }; - - d->length = (blockSize[firstHeader.layer()] * d->xingHeader->totalFrames()) / firstHeader.sampleRate(); + d->length = (firstHeader.samplesPerFrame() * d->xingHeader->totalFrames()) / firstHeader.sampleRate(); d->bitrate = d->length > 0 ? d->xingHeader->totalSize() * 8 / d->length / 1000 : 0; } else { _______________________________________________ taglib-devel mailing list taglib-devel@kde.org https://mail.kde.org/mailman/listinfo/taglib-devel