channels(0),
version(0),
bitsPerSample(0),
+ sampleFrames(0),
file(file),
streamLength(streamLength) {}
int channels;
int version;
int bitsPerSample;
+ uint sampleFrames;
File *file;
long streamLength;
};
return d->bitsPerSample;
}
+uint APE::Properties::sampleFrames() const
+{
+ return d->sampleFrames;
+}
+
////////////////////////////////////////////////////////////////////////////////
// private members
////////////////////////////////////////////////////////////////////////////////
uint totalFrames = header.mid(12, 4).toUInt(false);
uint blocksPerFrame = header.mid(4, 4).toUInt(false);
uint finalFrameBlocks = header.mid(8, 4).toUInt(false);
- uint totalBlocks = totalFrames > 0 ? (totalFrames - 1) * blocksPerFrame + finalFrameBlocks : 0;
- d->length = d->sampleRate > 0 ? totalBlocks / d->sampleRate : 0;
+ d->sampleFrames = totalFrames > 0 ? (totalFrames - 1) * blocksPerFrame + finalFrameBlocks : 0;
+ d->length = d->sampleRate > 0 ? d->sampleFrames / d->sampleRate : 0;
d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0;
}
length(0),
bitrate(0),
sampleRate(0),
- channels(0) {}
+ channels(0),
+ totalFrames(0),
+ sampleFrames(0) {}
ByteVector data;
long streamLength;
int bitrate;
int sampleRate;
int channels;
+ uint totalFrames;
+ uint sampleFrames;
};
////////////////////////////////////////////////////////////////////////////////
return d->version;
}
+uint MPC::Properties::totalFrames() const
+{
+ return d->totalFrames;
+}
+
+uint MPC::Properties::sampleFrames() const
+{
+ return d->sampleFrames;
+}
+
////////////////////////////////////////////////////////////////////////////////
// private members
////////////////////////////////////////////////////////////////////////////////
d->version = d->data[3] & 15;
- unsigned int frames;
-
if(d->version >= 7) {
- frames = d->data.mid(4, 4).toUInt(false);
+ d->totalFrames = d->data.mid(4, 4).toUInt(false);
std::bitset<32> flags(TAGLIB_CONSTRUCT_BITSET(d->data.mid(8, 4).toUInt(false)));
d->sampleRate = sftable[flags[17] * 2 + flags[16]];
d->channels = 2;
+
+ uint gapless = d->data.mid(5, 4).toUInt(false);
+ bool trueGapless = (gapless >> 31) & 0x0001;
+ if(trueGapless) {
+ uint lastFrameSamples = (gapless >> 20) & 0x07FF;
+ d->sampleFrames = d->totalFrames * 1152 - lastFrameSamples;
+ }
+ else
+ d->sampleFrames = d->totalFrames * 1152 - 576;
}
else {
uint headerData = d->data.mid(0, 4).toUInt(false);
d->channels = 2;
if(d->version >= 5)
- frames = d->data.mid(4, 4).toUInt(false);
+ d->totalFrames = d->data.mid(4, 4).toUInt(false);
else
- frames = d->data.mid(6, 2).toUInt(false);
- }
+ d->totalFrames = d->data.mid(6, 2).toUInt(false);
- uint samples = frames * 1152 - 576;
+ d->sampleFrames = d->totalFrames * 1152 - 576;
+ }
- d->length = d->sampleRate > 0 ? (samples + (d->sampleRate / 2)) / d->sampleRate : 0;
+ d->length = d->sampleRate > 0 ? (d->sampleFrames + (d->sampleRate / 2)) / d->sampleRate : 0;
if(!d->bitrate)
d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0;
channels(0),
version(0),
bitsPerSample(0),
+ sampleFrames(0),
file(0) {}
ByteVector data;
int channels;
int version;
int bitsPerSample;
+ uint sampleFrames;
File *file;
};
return d->bitsPerSample;
}
+uint WavPack::Properties::sampleFrames() const
+{
+ return d->sampleFrames;
+}
+
////////////////////////////////////////////////////////////////////////////////
// private members
////////////////////////////////////////////////////////////////////////////////
}
}
d->length = d->sampleRate > 0 ? (samples + (d->sampleRate / 2)) / d->sampleRate : 0;
+ d->sampleFrames = samples;
d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0;
}