/[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 823 by schoenebeck, Fri Dec 23 01:38:50 2005 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 = (char*) ck->LoadChunkData();              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;
# Line 1088  namespace DLS { Line 1099  namespace DLS {
1099          if (pWavePoolTable) delete[] pWavePoolTable;          if (pWavePoolTable) delete[] pWavePoolTable;
1100          if (pWavePoolTableHi) delete[] pWavePoolTableHi;          if (pWavePoolTableHi) delete[] pWavePoolTableHi;
1101          if (pVersion) delete pVersion;          if (pVersion) delete pVersion;
1102            for (std::list<RIFF::File*>::iterator i = ExtensionFiles.begin() ; i != ExtensionFiles.end() ; i++)
1103                delete *i;
1104      }      }
1105    
1106      Sample* File::GetFirstSample() {      Sample* File::GetFirstSample() {

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

  ViewVC Help
Powered by ViewVC