/[svn]/libgig/trunk/src/DLS.cpp
ViewVC logotype

Diff of /libgig/trunk/src/DLS.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 834 by persson, Mon Feb 6 17:58:21 2006 UTC revision 902 by persson, Sat Jul 22 14:22:01 2006 UTC
# Line 268  namespace DLS { Line 268  namespace DLS {
268      void Info::LoadString(uint32_t ChunkID, RIFF::List* lstINFO, String& s) {      void Info::LoadString(uint32_t ChunkID, RIFF::List* lstINFO, String& s) {
269          RIFF::Chunk* ck = lstINFO->GetSubChunk(ChunkID);          RIFF::Chunk* ck = lstINFO->GetSubChunk(ChunkID);
270          if (ck) {          if (ck) {
271              // TODO: no check for ZSTR terminated strings yet              const char* str = (char*)ck->LoadChunkData();
272              s.assign((char*) ck->LoadChunkData(), ck->GetSize());              int size = ck->GetSize();
273                int len;
274                for (len = 0 ; len < size ; len++)
275                    if (str[len] == '\0') break;
276                s.assign(str, len);
277              ck->ReleaseChunkData();              ck->ReleaseChunkData();
278          }          }
279      }      }
# Line 1039  namespace DLS { Line 1043  namespace DLS {
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          // Check for 64 bit offsets (used in gig v3 files)              WavePoolHeaderSize = ptbl->ReadUint32();
1054          b64BitWavePoolOffsets = (ptbl->GetSize() - WavePoolHeaderSize == WavePoolCount * 8);              WavePoolCount  = ptbl->ReadUint32();
1055          if (b64BitWavePoolOffsets) {              pWavePoolTable = new uint32_t[WavePoolCount];
1056              for (int i = 0 ; i < WavePoolCount ; i++) {              pWavePoolTableHi = new uint32_t[WavePoolCount];
1057                  pWavePoolTableHi[i] = ptbl->ReadUint32();              ptbl->SetPos(WavePoolHeaderSize);
1058                  pWavePoolTable[i] = ptbl->ReadUint32();  
1059                  if (pWavePoolTable[i] & 0x80000000)              // Check for 64 bit offsets (used in gig v3 files)
1060                      throw DLS::Exception("Files larger than 2 GB not yet supported");              b64BitWavePoolOffsets = (ptbl->GetSize() - WavePoolHeaderSize == WavePoolCount * 8);
1061                if (b64BitWavePoolOffsets) {
1062                    for (int i = 0 ; i < WavePoolCount ; i++) {
1063                        pWavePoolTableHi[i] = ptbl->ReadUint32();
1064                        pWavePoolTable[i] = ptbl->ReadUint32();
1065                        if (pWavePoolTable[i] & 0x80000000)
1066                            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;

Legend:
Removed from v.834  
changed lines
  Added in v.902

  ViewVC Help
Powered by ViewVC