/[svn]/linuxsampler/trunk/src/engines/gig/InstrumentResourceManager.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/gig/InstrumentResourceManager.cpp

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

revision 1797 by persson, Thu Dec 4 19:33:13 2008 UTC revision 1852 by schoenebeck, Sun Mar 1 22:22:03 2009 UTC
# Line 3  Line 3 
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *
6   *   Copyright (C) 2005 - 2008 Christian Schoenebeck                       *   *   Copyright (C) 2005 - 2009 Christian Schoenebeck                       *
7   *                                                                         *   *                                                                         *
8   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
9   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 160  namespace LinuxSampler { namespace gig { Line 160  namespace LinuxSampler { namespace gig {
160                  gig->SetAutoLoad(false); // avoid time consuming samples scanning                  gig->SetAutoLoad(false); // avoid time consuming samples scanning
161                  pInstrument = gig->GetInstrument(ID.Index);                  pInstrument = gig->GetInstrument(ID.Index);
162              }              }
163                
164              if (!pInstrument) throw InstrumentManagerException("There is no instrument " + ToString(ID.Index) + " in " + ID.FileName);              if (!pInstrument) throw InstrumentManagerException("There is no instrument " + ToString(ID.Index) + " in " + ID.FileName);
165    
166              instrument_info_t info;              instrument_info_t info;
# Line 470  namespace LinuxSampler { namespace gig { Line 470  namespace LinuxSampler { namespace gig {
470          } else if (sStructType == "gig::Instrument") {          } else if (sStructType == "gig::Instrument") {
471              // resume all previously suspended engines              // resume all previously suspended engines
472              ResumeAllEngines();              ResumeAllEngines();
473            } else if (sStructType == "gig::Sample") {
474                // we're assuming here, that OnDataStructureToBeChanged() with
475                // "gig::File" was called previously, so we won't resume anything
476                // here, but just re-cache the given sample
477                Lock();
478                ::gig::Sample* pSample = (::gig::Sample*) pStruct;
479                ::gig::File* pFile = (::gig::File*) pSample->GetParent();
480                UncacheInitialSamples(pSample);
481                // now re-cache ...
482                std::vector< ::gig::Instrument*> instruments =
483                    GetInstrumentsCurrentlyUsedOf(pFile, false/*don't lock again*/);
484                for (int i = 0; i < instruments.size(); i++) {
485                    if (SampleReferencedByInstrument(pSample, instruments[i])) {
486                        std::set<gig::EngineChannel*> engineChannels =
487                            GetEngineChannelsUsing(instruments[i], false/*don't lock again*/);
488                        std::set<gig::EngineChannel*>::iterator iter = engineChannels.begin();
489                        std::set<gig::EngineChannel*>::iterator end  = engineChannels.end();
490                        for (; iter != end; ++iter)
491                            CacheInitialSamples(pSample, *iter);
492                    }
493                }
494                Unlock();
495          } else if (sStructType == "gig::Region") {          } else if (sStructType == "gig::Region") {
496              // advice the engines to resume the given region, that is to              // advice the engines to resume the given region, that is to
497              // using it for playback again              // using it for playback again
# Line 513  namespace LinuxSampler { namespace gig { Line 535  namespace LinuxSampler { namespace gig {
535              Lock();              Lock();
536              ::gig::Sample* pSample = (::gig::Sample*) pOldSample;              ::gig::Sample* pSample = (::gig::Sample*) pOldSample;
537              ::gig::File* pFile = (::gig::File*) pSample->GetParent();              ::gig::File* pFile = (::gig::File*) pSample->GetParent();
538                bool bSampleStillInUse = false;
539              std::vector< ::gig::Instrument*> instruments =              std::vector< ::gig::Instrument*> instruments =
540                  GetInstrumentsCurrentlyUsedOf(pFile, false/*don't lock again*/);                  GetInstrumentsCurrentlyUsedOf(pFile, false/*don't lock again*/);
541              for (int i = 0; i < instruments.size(); i++)              for (int i = 0; i < instruments.size(); i++) {
542                  if (!SampleReferencedByInstrument(pSample, instruments[i]))                  if (SampleReferencedByInstrument(pSample, instruments[i])) {
543                      UncacheInitialSamples(pSample);                      bSampleStillInUse = true;
544                        break;
545                    }
546                }
547                if (!bSampleStillInUse) UncacheInitialSamples(pSample);
548              Unlock();              Unlock();
549          }          }
550          // make sure new sample reference is cached          // make sure new sample reference is cached
# Line 760  namespace LinuxSampler { namespace gig { Line 787  namespace LinuxSampler { namespace gig {
787       */       */
788      std::set<gig::EngineChannel*> InstrumentResourceManager::GetEngineChannelsUsing(::gig::Instrument* pInstrument, bool bLock) {      std::set<gig::EngineChannel*> InstrumentResourceManager::GetEngineChannelsUsing(::gig::Instrument* pInstrument, bool bLock) {
789          if (bLock) Lock();          if (bLock) Lock();
790          std::set<gig::EngineChannel*> result;          std::set<gig::EngineChannel*> result;
791          std::set<ResourceConsumer< ::gig::Instrument>*> consumers = ConsumersOf(pInstrument);          std::set<ResourceConsumer< ::gig::Instrument>*> consumers = ConsumersOf(pInstrument);
792          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator iter = consumers.begin();          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator iter = consumers.begin();
793          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator end  = consumers.end();          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator end  = consumers.end();
# Line 783  namespace LinuxSampler { namespace gig { Line 810  namespace LinuxSampler { namespace gig {
810       */       */
811      std::set<gig::Engine*> InstrumentResourceManager::GetEnginesUsing(::gig::Instrument* pInstrument, bool bLock) {      std::set<gig::Engine*> InstrumentResourceManager::GetEnginesUsing(::gig::Instrument* pInstrument, bool bLock) {
812          if (bLock) Lock();          if (bLock) Lock();
813          std::set<gig::Engine*> result;          std::set<gig::Engine*> result;
814          std::set<ResourceConsumer< ::gig::Instrument>*> consumers = ConsumersOf(pInstrument);          std::set<ResourceConsumer< ::gig::Instrument>*> consumers = ConsumersOf(pInstrument);
815          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator iter = consumers.begin();          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator iter = consumers.begin();
816          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator end  = consumers.end();          std::set<ResourceConsumer< ::gig::Instrument>*>::iterator end  = consumers.end();

Legend:
Removed from v.1797  
changed lines
  Added in v.1852

  ViewVC Help
Powered by ViewVC