1043 |
Instruments = colh->ReadUint32(); |
Instruments = colh->ReadUint32(); |
1044 |
|
|
1045 |
RIFF::Chunk* ptbl = pRIFF->GetSubChunk(CHUNK_ID_PTBL); |
RIFF::Chunk* ptbl = pRIFF->GetSubChunk(CHUNK_ID_PTBL); |
1046 |
if (!ptbl) throw DLS::Exception("Mandatory <ptbl> chunk not found."); |
if (!ptbl) { // pool table is missing - this is probably an ".art" file |
1047 |
WavePoolHeaderSize = ptbl->ReadUint32(); |
WavePoolCount = 0; |
1048 |
WavePoolCount = ptbl->ReadUint32(); |
pWavePoolTable = NULL; |
1049 |
pWavePoolTable = new uint32_t[WavePoolCount]; |
pWavePoolTableHi = NULL; |
1050 |
pWavePoolTableHi = new uint32_t[WavePoolCount]; |
WavePoolHeaderSize = 8; |
1051 |
ptbl->SetPos(WavePoolHeaderSize); |
b64BitWavePoolOffsets = false; |
1052 |
|
} else { |
1053 |
|
WavePoolHeaderSize = ptbl->ReadUint32(); |
1054 |
|
WavePoolCount = ptbl->ReadUint32(); |
1055 |
|
pWavePoolTable = new uint32_t[WavePoolCount]; |
1056 |
|
pWavePoolTableHi = new uint32_t[WavePoolCount]; |
1057 |
|
ptbl->SetPos(WavePoolHeaderSize); |
1058 |
|
|
1059 |
// Check for 64 bit offsets (used in gig v3 files) |
// Check for 64 bit offsets (used in gig v3 files) |
1060 |
b64BitWavePoolOffsets = (ptbl->GetSize() - WavePoolHeaderSize == WavePoolCount * 8); |
b64BitWavePoolOffsets = (ptbl->GetSize() - WavePoolHeaderSize == WavePoolCount * 8); |
1061 |
if (b64BitWavePoolOffsets) { |
if (b64BitWavePoolOffsets) { |
1062 |
for (int i = 0 ; i < WavePoolCount ; i++) { |
for (int i = 0 ; i < WavePoolCount ; i++) { |
1063 |
pWavePoolTableHi[i] = ptbl->ReadUint32(); |
pWavePoolTableHi[i] = ptbl->ReadUint32(); |
1064 |
pWavePoolTable[i] = ptbl->ReadUint32(); |
pWavePoolTable[i] = ptbl->ReadUint32(); |
1065 |
if (pWavePoolTable[i] & 0x80000000) |
if (pWavePoolTable[i] & 0x80000000) |
1066 |
throw DLS::Exception("Files larger than 2 GB not yet supported"); |
throw DLS::Exception("Files larger than 2 GB not yet supported"); |
1067 |
|
} |
1068 |
|
} else { // conventional 32 bit offsets |
1069 |
|
ptbl->Read(pWavePoolTable, WavePoolCount, sizeof(uint32_t)); |
1070 |
|
for (int i = 0 ; i < WavePoolCount ; i++) pWavePoolTableHi[i] = 0; |
1071 |
} |
} |
|
} else { // conventional 32 bit offsets |
|
|
ptbl->Read(pWavePoolTable, WavePoolCount, sizeof(uint32_t)); |
|
|
for (int i = 0 ; i < WavePoolCount ; i++) pWavePoolTableHi[i] = 0; |
|
1072 |
} |
} |
1073 |
|
|
1074 |
pSamples = NULL; |
pSamples = NULL; |