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

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

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

revision 1301 by persson, Sat Aug 25 09:59:53 2007 UTC revision 1335 by schoenebeck, Sun Sep 9 21:22:58 2007 UTC
# Line 1262  namespace { Line 1262  namespace {
1262      uint                               DimensionRegion::Instances       = 0;      uint                               DimensionRegion::Instances       = 0;
1263      DimensionRegion::VelocityTableMap* DimensionRegion::pVelocityTables = NULL;      DimensionRegion::VelocityTableMap* DimensionRegion::pVelocityTables = NULL;
1264    
1265      DimensionRegion::DimensionRegion(RIFF::List* _3ewl) : DLS::Sampler(_3ewl) {      DimensionRegion::DimensionRegion(Region* pParent, RIFF::List* _3ewl) : DLS::Sampler(_3ewl) {
1266          Instances++;          Instances++;
1267    
1268          pSample = NULL;          pSample = NULL;
1269            pRegion = pParent;
1270    
1271          if (_3ewl->GetSubChunk(CHUNK_ID_WSMP)) memcpy(&Crossfade, &SamplerOptions, 4);          if (_3ewl->GetSubChunk(CHUNK_ID_WSMP)) memcpy(&Crossfade, &SamplerOptions, 4);
1272          else memset(&Crossfade, 0, 4);          else memset(&Crossfade, 0, 4);
# Line 1572  namespace { Line 1573  namespace {
1573       * It will be called automatically when File::Save() was called.       * It will be called automatically when File::Save() was called.
1574       */       */
1575      void DimensionRegion::UpdateChunks() {      void DimensionRegion::UpdateChunks() {
         // check if wsmp is going to be created by  
         // DLS::Sampler::UpdateChunks  
         bool wsmp_created = !pParentList->GetSubChunk(CHUNK_ID_WSMP);  
   
1576          // first update base class's chunk          // first update base class's chunk
1577          DLS::Sampler::UpdateChunks();          DLS::Sampler::UpdateChunks();
1578    
# Line 1588  namespace { Line 1585  namespace {
1585    
1586          // make sure '3ewa' chunk exists          // make sure '3ewa' chunk exists
1587          RIFF::Chunk* _3ewa = pParentList->GetSubChunk(CHUNK_ID_3EWA);          RIFF::Chunk* _3ewa = pParentList->GetSubChunk(CHUNK_ID_3EWA);
1588          if (!_3ewa)  _3ewa = pParentList->AddSubChunk(CHUNK_ID_3EWA, 140);          if (!_3ewa) {
1589          else if (wsmp_created) {              File* pFile = (File*) GetParent()->GetParent()->GetParent();
1590              // make sure the chunk order is: wsmp, 3ewa              bool version3 = pFile->pVersion && pFile->pVersion->major == 3;
1591              pParentList->MoveSubChunk(_3ewa, 0);              _3ewa = pParentList->AddSubChunk(CHUNK_ID_3EWA, version3 ? 148 : 140);
1592          }          }
1593          pData = (uint8_t*) _3ewa->LoadChunkData();          pData = (uint8_t*) _3ewa->LoadChunkData();
1594    
# Line 1874  namespace { Line 1871  namespace {
1871          return table;          return table;
1872      }      }
1873    
1874        Region* DimensionRegion::GetParent() const {
1875            return pRegion;
1876        }
1877    
1878      leverage_ctrl_t DimensionRegion::DecodeLeverageController(_lev_ctrl_t EncodedController) {      leverage_ctrl_t DimensionRegion::DecodeLeverageController(_lev_ctrl_t EncodedController) {
1879          leverage_ctrl_t decodedcontroller;          leverage_ctrl_t decodedcontroller;
1880          switch (EncodedController) {          switch (EncodedController) {
# Line 2273  namespace { Line 2274  namespace {
2274              RIFF::List* _3prg = rgnList->GetSubList(LIST_TYPE_3PRG);              RIFF::List* _3prg = rgnList->GetSubList(LIST_TYPE_3PRG);
2275              if (!_3prg) _3prg = rgnList->AddSubList(LIST_TYPE_3PRG);              if (!_3prg) _3prg = rgnList->AddSubList(LIST_TYPE_3PRG);
2276              RIFF::List* _3ewl = _3prg->AddSubList(LIST_TYPE_3EWL);              RIFF::List* _3ewl = _3prg->AddSubList(LIST_TYPE_3EWL);
2277              pDimensionRegions[0] = new DimensionRegion(_3ewl);              pDimensionRegions[0] = new DimensionRegion(this, _3ewl);
2278              DimensionRegions = 1;              DimensionRegions = 1;
2279          }          }
2280      }      }
# Line 2297  namespace { Line 2298  namespace {
2298          // first update base class's chunks          // first update base class's chunks
2299          DLS::Region::UpdateChunks();          DLS::Region::UpdateChunks();
2300    
         File* pFile = (File*) GetParent()->GetParent();  
         bool version3 = pFile->pVersion && pFile->pVersion->major == 3;  
   
2301          // update dimension region's chunks          // update dimension region's chunks
2302          for (int i = 0; i < DimensionRegions; i++) {          for (int i = 0; i < DimensionRegions; i++) {
2303              DimensionRegion* d = pDimensionRegions[i];              pDimensionRegions[i]->UpdateChunks();
   
             // make sure '3ewa' chunk exists (we need to this before  
             // calling DimensionRegion::UpdateChunks, as  
             // DimensionRegion doesn't know which file version it is)  
             RIFF::Chunk* _3ewa = d->pParentList->GetSubChunk(CHUNK_ID_3EWA);  
             if (!_3ewa) d->pParentList->AddSubChunk(CHUNK_ID_3EWA, version3 ? 148 : 140);  
   
             d->UpdateChunks();  
2304          }          }
2305    
2306            File* pFile = (File*) GetParent()->GetParent();
2307            bool version3 = pFile->pVersion && pFile->pVersion->major == 3;
2308          const int iMaxDimensions =  version3 ? 8 : 5;          const int iMaxDimensions =  version3 ? 8 : 5;
2309          const int iMaxDimensionRegions = version3 ? 256 : 32;          const int iMaxDimensionRegions = version3 ? 256 : 32;
2310    
# Line 2368  namespace { Line 2360  namespace {
2360              RIFF::List* _3ewl = _3prg->GetFirstSubList();              RIFF::List* _3ewl = _3prg->GetFirstSubList();
2361              while (_3ewl) {              while (_3ewl) {
2362                  if (_3ewl->GetListType() == LIST_TYPE_3EWL) {                  if (_3ewl->GetListType() == LIST_TYPE_3EWL) {
2363                      pDimensionRegions[dimensionRegionNr] = new DimensionRegion(_3ewl);                      pDimensionRegions[dimensionRegionNr] = new DimensionRegion(this, _3ewl);
2364                      dimensionRegionNr++;                      dimensionRegionNr++;
2365                  }                  }
2366                  _3ewl = _3prg->GetNextSubList();                  _3ewl = _3prg->GetNextSubList();
# Line 2377  namespace { Line 2369  namespace {
2369          }          }
2370      }      }
2371    
2372        void Region::SetKeyRange(uint16_t Low, uint16_t High) {
2373            // update KeyRange struct and make sure regions are in correct order
2374            DLS::Region::SetKeyRange(Low, High);
2375            // update Region key table for fast lookup
2376            ((gig::Instrument*)GetParent())->UpdateRegionKeyTable();
2377        }
2378    
2379      void Region::UpdateVelocityTable() {      void Region::UpdateVelocityTable() {
2380          // get velocity dimension's index          // get velocity dimension's index
2381          int veldim = -1;          int veldim = -1;
# Line 2816  namespace { Line 2815  namespace {
2815      }      }
2816    
2817      void Instrument::UpdateRegionKeyTable() {      void Instrument::UpdateRegionKeyTable() {
2818            for (int i = 0; i < 128; i++) RegionKeyTable[i] = NULL;
2819          RegionList::iterator iter = pRegions->begin();          RegionList::iterator iter = pRegions->begin();
2820          RegionList::iterator end  = pRegions->end();          RegionList::iterator end  = pRegions->end();
2821          for (; iter != end; ++iter) {          for (; iter != end; ++iter) {
# Line 2883  namespace { Line 2883  namespace {
2883       *             there is no Region defined for the given \a Key       *             there is no Region defined for the given \a Key
2884       */       */
2885      Region* Instrument::GetRegion(unsigned int Key) {      Region* Instrument::GetRegion(unsigned int Key) {
2886          if (!pRegions || !pRegions->size() || Key > 127) return NULL;          if (!pRegions || pRegions->empty() || Key > 127) return NULL;
2887          return RegionKeyTable[Key];          return RegionKeyTable[Key];
2888    
2889          /*for (int i = 0; i < Regions; i++) {          /*for (int i = 0; i < Regions; i++) {

Legend:
Removed from v.1301  
changed lines
  Added in v.1335

  ViewVC Help
Powered by ViewVC