protected void AnalyzeOld(APEFileInfo m_APEFileInfo) throws IOException {
APEHeaderOld header = APEHeaderOld.read(m_pIO);
// fail on 0 length APE files (catches non-finalized APE files)
if (header.nTotalFrames == 0)
throw new JMACException("Unsupported Format");
int nPeakLevel = -1;
if ((header.nFormatFlags & MAC_FORMAT_FLAG_HAS_PEAK_LEVEL) > 0)
nPeakLevel = m_pIO.readIntBack();
if ((header.nFormatFlags & MAC_FORMAT_FLAG_HAS_SEEK_ELEMENTS) > 0)
m_APEFileInfo.nSeekTableElements = m_pIO.readIntBack();
else
m_APEFileInfo.nSeekTableElements = (int) header.nTotalFrames;
// fill the APE info structure
m_APEFileInfo.nVersion = header.nVersion;
m_APEFileInfo.nCompressionLevel = header.nCompressionLevel;
m_APEFileInfo.nFormatFlags = header.nFormatFlags;
m_APEFileInfo.nTotalFrames = (int) header.nTotalFrames;
m_APEFileInfo.nFinalFrameBlocks = (int) header.nFinalFrameBlocks;
m_APEFileInfo.nBlocksPerFrame = ((header.nVersion >= 3900) || ((header.nVersion >= 3800) && (header.nCompressionLevel == CompressionLevel.COMPRESSION_LEVEL_EXTRA_HIGH))) ? 73728 : 9216;
if (header.nVersion >= 3950)
m_APEFileInfo.nBlocksPerFrame = 73728 * 4;
m_APEFileInfo.nChannels = header.nChannels;
m_APEFileInfo.nSampleRate = (int) header.nSampleRate;
m_APEFileInfo.nBitsPerSample = (m_APEFileInfo.nFormatFlags & MAC_FORMAT_FLAG_8_BIT) > 0 ? 8 : ((m_APEFileInfo.nFormatFlags & MAC_FORMAT_FLAG_24_BIT) > 0 ? 24 : 16);
m_APEFileInfo.nBytesPerSample = m_APEFileInfo.nBitsPerSample / 8;
m_APEFileInfo.nBlockAlign = m_APEFileInfo.nBytesPerSample * m_APEFileInfo.nChannels;
m_APEFileInfo.nTotalBlocks = (int) ((header.nTotalFrames == 0) ? 0 : ((header.nTotalFrames - 1) * m_APEFileInfo.nBlocksPerFrame) + header.nFinalFrameBlocks);
m_APEFileInfo.nWAVHeaderBytes = (int) ((header.nFormatFlags & MAC_FORMAT_FLAG_CREATE_WAV_HEADER) > 0 ? WaveHeader.WAVE_HEADER_BYTES : header.nHeaderBytes);
m_APEFileInfo.nWAVTerminatingBytes = (int) header.nTerminatingBytes;
m_APEFileInfo.nWAVDataBytes = m_APEFileInfo.nTotalBlocks * m_APEFileInfo.nBlockAlign;
m_APEFileInfo.nWAVTotalBytes = m_APEFileInfo.nWAVDataBytes + m_APEFileInfo.nWAVHeaderBytes + m_APEFileInfo.nWAVTerminatingBytes;
m_APEFileInfo.nAPETotalBytes = m_pIO.isLocal() ? (int) m_pIO.length() : -1;
m_APEFileInfo.nLengthMS = (int) ((m_APEFileInfo.nTotalBlocks * 1000L) / m_APEFileInfo.nSampleRate);
m_APEFileInfo.nAverageBitrate = (int) ((m_APEFileInfo.nLengthMS <= 0) ? 0 : ((m_APEFileInfo.nAPETotalBytes * 8L) / m_APEFileInfo.nLengthMS));
m_APEFileInfo.nDecompressedBitrate = (m_APEFileInfo.nBlockAlign * m_APEFileInfo.nSampleRate * 8) / 1000;
m_APEFileInfo.nPeakLevel = nPeakLevel;
// get the wave header
if ((header.nFormatFlags & MAC_FORMAT_FLAG_CREATE_WAV_HEADER) <= 0) {
if (header.nHeaderBytes > Integer.MAX_VALUE)
throw new JMACException("The HeaderBytes Parameter Is Too Big");
m_APEFileInfo.spWaveHeaderData = new byte[(int) header.nHeaderBytes];
try {
m_pIO.readFully(m_APEFileInfo.spWaveHeaderData);
} catch (EOFException e) {
throw new JMACException("Can't Read Wave Header Data");
}
}
// get the seek tables (really no reason to get the whole thing if there's extra)
m_APEFileInfo.spSeekByteTable = new int[m_APEFileInfo.nSeekTableElements];
for (int i = 0; i < m_APEFileInfo.nSeekTableElements; i++)
m_APEFileInfo.spSeekByteTable[i] = m_pIO.readIntBack();
if (header.nVersion <= 3800) {
m_APEFileInfo.spSeekBitTable = new byte[m_APEFileInfo.nSeekTableElements];
try {
m_pIO.readFully(m_APEFileInfo.spSeekBitTable);
} catch (EOFException e) {
throw new JMACException("Can't Read Seek Bit Table");
}
}
}