/[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 3952 by schoenebeck, Sat Jun 19 09:10:33 2021 UTC revision 3977 by schoenebeck, Mon Jul 19 14:31:43 2021 UTC
# Line 1346  namespace { Line 1346  namespace {
1346    
1347          // if this is the last write, update the checksum chunk in the          // if this is the last write, update the checksum chunk in the
1348          // file          // file
1349          if (pCkData->GetPos() == pCkData->GetSize()) {          if (pCkData->GetPos() == std::min(pCkData->GetSize(), pCkData->GetNewSize())) {
1350              __finalizeCRC(crc);              __finalizeCRC(crc);
1351              File* pFile = static_cast<File*>(GetParent());              File* pFile = static_cast<File*>(GetParent());
1352              pFile->SetSampleChecksum(this, crc);              pFile->SetSampleChecksum(this, crc);
# Line 5308  namespace { Line 5308  namespace {
5308       * @param pos - position of sought Region in region list       * @param pos - position of sought Region in region list
5309       * @returns pointer address to requested region or @c NULL if @a pos is       * @returns pointer address to requested region or @c NULL if @a pos is
5310       *          out of bounds       *          out of bounds
5311         * @see CountRegions()
5312       */       */
5313      Region* Instrument::GetRegionAt(size_t pos) {      Region* Instrument::GetRegionAt(size_t pos) {
5314          if (!pRegions) return NULL;          if (!pRegions) return NULL;
# Line 5352  namespace { Line 5353  namespace {
5353          if (!lrgn)  lrgn = pCkInstrument->AddSubList(LIST_TYPE_LRGN);          if (!lrgn)  lrgn = pCkInstrument->AddSubList(LIST_TYPE_LRGN);
5354          RIFF::List* rgn = lrgn->AddSubList(LIST_TYPE_RGN);          RIFF::List* rgn = lrgn->AddSubList(LIST_TYPE_RGN);
5355          Region* pNewRegion = new Region(this, rgn);          Region* pNewRegion = new Region(this, rgn);
5356            const size_t idxIt = RegionsIterator - pRegions->begin();
5357          pRegions->push_back(pNewRegion);          pRegions->push_back(pNewRegion);
5358            RegionsIterator = pRegions->begin() + std::min(idxIt, pRegions->size()); // avoid iterator invalidation
5359          Regions = (uint32_t) pRegions->size();          Regions = (uint32_t) pRegions->size();
5360          // update Region key table for fast lookup          // update Region key table for fast lookup
5361          UpdateRegionKeyTable();          UpdateRegionKeyTable();
# Line 5600  namespace { Line 5603  namespace {
5603       * @param index1 - index of the first script slot to swap       * @param index1 - index of the first script slot to swap
5604       * @param index2 - index of the second script slot to swap       * @param index2 - index of the second script slot to swap
5605       */       */
5606      void Instrument::SwapScriptSlots(uint index1, uint index2) {      void Instrument::SwapScriptSlots(size_t index1, size_t index2) {
5607          LoadScripts();          LoadScripts();
5608          if (index1 >= pScriptRefs->size() || index2 >= pScriptRefs->size())          if (index1 >= pScriptRefs->size() || index2 >= pScriptRefs->size())
5609              return;              return;
# Line 5615  namespace { Line 5618  namespace {
5618       *       *
5619       * @param index - index of script slot to remove       * @param index - index of script slot to remove
5620       */       */
5621      void Instrument::RemoveScriptSlot(uint index) {      void Instrument::RemoveScriptSlot(size_t index) {
5622          LoadScripts();          LoadScripts();
5623          if (index >= pScriptRefs->size()) return;          if (index >= pScriptRefs->size()) return;
5624          pScriptRefs->erase( pScriptRefs->begin() + index );          pScriptRefs->erase( pScriptRefs->begin() + index );
# Line 5656  namespace { Line 5659  namespace {
5659       * GigaStudio 4 software. It will currently only work with LinuxSampler and       * GigaStudio 4 software. It will currently only work with LinuxSampler and
5660       * gigedit.       * gigedit.
5661       */       */
5662      uint Instrument::ScriptSlotCount() const {      size_t Instrument::ScriptSlotCount() const {
5663          return uint(pScriptRefs ? pScriptRefs->size() : scriptPoolFileOffsets.size());          return pScriptRefs ? pScriptRefs->size() : scriptPoolFileOffsets.size();
5664      }      }
5665    
5666      /** @brief Whether script execution shall be skipped.      /** @brief Whether script execution shall be skipped.
# Line 5676  namespace { Line 5679  namespace {
5679       * @param index - index of the script slot on this instrument       * @param index - index of the script slot on this instrument
5680       * @see Script::Bypass       * @see Script::Bypass
5681       */       */
5682      bool Instrument::IsScriptSlotBypassed(uint index) {      bool Instrument::IsScriptSlotBypassed(size_t index) {
5683          if (index >= ScriptSlotCount()) return false;          if (index >= ScriptSlotCount()) return false;
5684          return pScriptRefs ? pScriptRefs->at(index).bypass          return pScriptRefs ? pScriptRefs->at(index).bypass
5685                             : scriptPoolFileOffsets.at(index).bypass;                             : scriptPoolFileOffsets.at(index).bypass;
# Line 5696  namespace { Line 5699  namespace {
5699       * @param bBypass - if true, the script slot will be skipped by the sampler       * @param bBypass - if true, the script slot will be skipped by the sampler
5700       * @see Script::Bypass       * @see Script::Bypass
5701       */       */
5702      void Instrument::SetScriptSlotBypassed(uint index, bool bBypass) {      void Instrument::SetScriptSlotBypassed(size_t index, bool bBypass) {
5703          if (index >= ScriptSlotCount()) return;          if (index >= ScriptSlotCount()) return;
5704          if (pScriptRefs)          if (pScriptRefs)
5705              pScriptRefs->at(index).bypass = bBypass;              pScriptRefs->at(index).bypass = bBypass;
# Line 5716  namespace { Line 5719  namespace {
5719       * the @c Script identified by passed @p uuid.       * the @c Script identified by passed @p uuid.
5720       */       */
5721      bool Instrument::ReferencesScriptWithUuid(const _UUID& uuid) {      bool Instrument::ReferencesScriptWithUuid(const _UUID& uuid) {
5722          const uint nSlots = ScriptSlotCount();          const size_t nSlots = ScriptSlotCount();
5723          for (uint iSlot = 0; iSlot < nSlots; ++iSlot)          for (size_t iSlot = 0; iSlot < nSlots; ++iSlot)
5724              if (_UUIDFromCArray(&GetScriptOfSlot(iSlot)->Uuid[0]) == uuid)              if (_UUIDFromCArray(&GetScriptOfSlot(iSlot)->Uuid[0]) == uuid)
5725                  return true;                  return true;
5726          return false;          return false;
# Line 5742  namespace { Line 5745  namespace {
5745       * @param slot - script slot index of the variable to be retrieved       * @param slot - script slot index of the variable to be retrieved
5746       * @param variable - name of the 'patch' variable in that script       * @param variable - name of the 'patch' variable in that script
5747       */       */
5748      bool Instrument::IsScriptPatchVariableSet(int slot, String variable) {      bool Instrument::IsScriptPatchVariableSet(size_t slot, String variable) {
5749          if (variable.empty()) return false;          if (variable.empty()) return false;
5750          Script* script = GetScriptOfSlot(slot);          Script* script = GetScriptOfSlot(slot);
5751          if (!script) return false;          if (!script) return false;
# Line 5776  namespace { Line 5779  namespace {
5779       *       *
5780       * @param slot - script slot index of the variable to be retrieved       * @param slot - script slot index of the variable to be retrieved
5781       */       */
5782      std::map<String,String> Instrument::GetScriptPatchVariables(int slot) {      std::map<String,String> Instrument::GetScriptPatchVariables(size_t slot) {
5783          Script* script = GetScriptOfSlot(slot);          Script* script = GetScriptOfSlot(slot);
5784          if (!script) return std::map<String,String>();          if (!script) return std::map<String,String>();
5785          const _UUID uuid = _UUIDFromCArray(&script->Uuid[0]);          const _UUID uuid = _UUIDFromCArray(&script->Uuid[0]);
# Line 5808  namespace { Line 5811  namespace {
5811       * @param slot - script slot index of the variable to be retrieved       * @param slot - script slot index of the variable to be retrieved
5812       * @param variable - name of the 'patch' variable in that script       * @param variable - name of the 'patch' variable in that script
5813       */       */
5814      String Instrument::GetScriptPatchVariable(int slot, String variable) {      String Instrument::GetScriptPatchVariable(size_t slot, String variable) {
5815          std::map<String,String> vars = GetScriptPatchVariables(slot);          std::map<String,String> vars = GetScriptPatchVariables(slot);
5816          return (vars.count(variable)) ? vars.find(variable)->second : "";          return (vars.count(variable)) ? vars.find(variable)->second : "";
5817      }      }
# Line 5835  namespace { Line 5838  namespace {
5838       * @throws gig::Exception if given script @p slot index is invalid or given       * @throws gig::Exception if given script @p slot index is invalid or given
5839       *         @p variable name is empty       *         @p variable name is empty
5840       */       */
5841      void Instrument::SetScriptPatchVariable(int slot, String variable, String value) {      void Instrument::SetScriptPatchVariable(size_t slot, String variable, String value) {
5842          if (variable.empty())          if (variable.empty())
5843              throw Exception("Variable name must not be empty");              throw Exception("Variable name must not be empty");
5844          Script* script = GetScriptOfSlot(slot);          Script* script = GetScriptOfSlot(slot);
# Line 5876  namespace { Line 5879  namespace {
5879       * @param slot - script slot index of the variable to be unset       * @param slot - script slot index of the variable to be unset
5880       * @param variable - name of the 'patch' variable in that script       * @param variable - name of the 'patch' variable in that script
5881       */       */
5882      void Instrument::UnsetScriptPatchVariable(int slot, String variable) {      void Instrument::UnsetScriptPatchVariable(ssize_t slot, String variable) {
5883          Script* script = GetScriptOfSlot(slot);          Script* script = GetScriptOfSlot(slot);
5884    
5885          // option 1: unset a particular variable of one particular script slot          // option 1: unset a particular variable of one particular script slot
# Line 6388  namespace { Line 6391  namespace {
6391         wave->AddSubChunk(CHUNK_ID_FMT, 16);         wave->AddSubChunk(CHUNK_ID_FMT, 16);
6392         wave->AddSubList(LIST_TYPE_INFO);         wave->AddSubList(LIST_TYPE_INFO);
6393    
6394           const size_t idxIt = SamplesIterator - pSamples->begin();
6395         pSamples->push_back(pSample);         pSamples->push_back(pSample);
6396           SamplesIterator = pSamples->begin() + std::min(idxIt, pSamples->size()); // avoid iterator invalidation
6397         return pSample;         return pSample;
6398      }      }
6399    
# Line 6405  namespace { Line 6410  namespace {
6410          if (!pSamples || !pSamples->size()) throw gig::Exception("Could not delete sample as there are no samples");          if (!pSamples || !pSamples->size()) throw gig::Exception("Could not delete sample as there are no samples");
6411          SampleList::iterator iter = find(pSamples->begin(), pSamples->end(), (DLS::Sample*) pSample);          SampleList::iterator iter = find(pSamples->begin(), pSamples->end(), (DLS::Sample*) pSample);
6412          if (iter == pSamples->end()) throw gig::Exception("Could not delete sample, could not find given sample");          if (iter == pSamples->end()) throw gig::Exception("Could not delete sample, could not find given sample");
6413          if (SamplesIterator != pSamples->end() && *SamplesIterator == pSample) ++SamplesIterator; // avoid iterator invalidation          const size_t idxIt = SamplesIterator - pSamples->begin();
6414          pSamples->erase(iter);          pSamples->erase(iter);
6415            SamplesIterator = pSamples->begin() + std::min(idxIt, pSamples->size()); // avoid iterator invalidation
6416          pSample->DeleteChunks();          pSample->DeleteChunks();
6417          delete pSample;          delete pSample;
6418    
# Line 6513  namespace { Line 6519  namespace {
6519              ExtensionFiles.push_back(pExtFile);              ExtensionFiles.push_back(pExtFile);
6520          }          }
6521    
6522          // load samples from extension files (if required)          // load all samples (both from this/main .gig file as well as from
6523            // extension files if required)
6524          for (int i = 0; i < poolFiles.size(); i++) {          for (int i = 0; i < poolFiles.size(); i++) {
6525              RIFF::File* file = poolFiles[i];              RIFF::File* file = poolFiles[i];
6526              RIFF::List* wvpl = file->GetSubList(LIST_TYPE_WVPL);              RIFF::List* wvpl = file->GetSubList(LIST_TYPE_WVPL);
6527              if (wvpl) {              if (wvpl) {
6528                  file_offset_t wvplFileOffset = wvpl->GetFilePos() -                  file_offset_t wvplFileOffset = wvpl->GetFilePos() -
6529                                                 wvpl->GetPos(); // should be zero, but just to be sure                                                 wvpl->GetPos(); // should be zero, but just to be sure
6530                  size_t i = 0;                  size_t iWaveCk = 0;
6531                  for (RIFF::List* wave = wvpl->GetSubListAt(i); wave;                  for (RIFF::List* wave = wvpl->GetSubListAt(iWaveCk); wave;
6532                       wave = wvpl->GetSubListAt(++i))                       wave = wvpl->GetSubListAt(++iWaveCk))
6533                  {                  {
6534                      if (wave->GetListType() == LIST_TYPE_WAVE) {                      if (wave->GetListType() == LIST_TYPE_WAVE) {
6535                          // notify current progress                          // notify current progress

Legend:
Removed from v.3952  
changed lines
  Added in v.3977

  ViewVC Help
Powered by ViewVC