diff options
| -rw-r--r-- | src/drumgizmo.cc | 14 | ||||
| -rw-r--r-- | src/drumkitloader.cc | 25 | ||||
| -rw-r--r-- | src/drumkitloader.h | 7 | 
3 files changed, 37 insertions, 9 deletions
| diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 32ad66e..8ba45f5 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -56,6 +56,7 @@ DrumGizmo::~DrumGizmo()      i++;    }    */ +  loader.stop();  }  /* @@ -144,6 +145,8 @@ bool DrumGizmo::loadkit(std::string file)    DEBUG(drumgizmo, "loadkit(%s)\n", kitfile.c_str()); +  loader.skip(); +    kit.clear();    DrumKitParser parser(kitfile, kit); @@ -287,7 +290,6 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)          continue;        } -#if 1        if(i->group() != "") {          // Add event to ramp down all existing events with the same groupname.          Channels::iterator j = kit.channels.begin(); @@ -310,7 +312,6 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)            j++;          }        } -#endif           Sample *s = i->sample(evs[e].velocity, evs[e].offset + pos); @@ -347,7 +348,6 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)    //    // Write audio    // -      for(size_t c = 0; c < kit.channels.size(); c++) {      sample_t *buf = samples;      bool internal = false; @@ -355,9 +355,11 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)        buf = oe->getBuffer(c);        internal = true;      } -    memset(buf, 0, nsamples * sizeof(sample_t)); -    getSamples(c, pos, buf, nsamples); -    if(!internal) oe->run(c, samples, nsamples); +    if(buf) { +      memset(buf, 0, nsamples * sizeof(sample_t)); +      getSamples(c, pos, buf, nsamples); +      if(!internal) oe->run(c, samples, nsamples); +    }    }    ie->post(); diff --git a/src/drumkitloader.cc b/src/drumkitloader.cc index be74624..79d000a 100644 --- a/src/drumkitloader.cc +++ b/src/drumkitloader.cc @@ -36,15 +36,30 @@ DrumKitLoader::DrumKitLoader(DrumGizmo *dg)    drumgizmo = dg;    is_done = false;    quitit = false; +  skipit = false;  }  DrumKitLoader::~DrumKitLoader()  { +  if(!quitit) { +    stop(); +  } +} + +void DrumKitLoader::stop() +{    quitit = true;    semaphore.post();    wait_stop();  } +void DrumKitLoader::skip() +{ +  skipit = true; +  semaphore.post(); +  skip_semaphore.wait(); +} +  bool DrumKitLoader::isDone()  {    bool done; @@ -67,8 +82,6 @@ void DrumKitLoader::loadKit(DrumKit *kit)    semaphore.post();  } - -  void DrumKitLoader::thread_main()  {    while(1) { @@ -79,6 +92,12 @@ void DrumKitLoader::thread_main()      if(quitit) return; +    if(skipit) { +      skip_semaphore.post(); +      skipit = false; +      continue; +    } +      unsigned int count = 0;      if(kit && !kit->isValid()) goto finish; @@ -125,6 +144,8 @@ void DrumKitLoader::thread_main()            drumgizmo->sendGUIMessage(ls);            a++; + +          if(skipit) goto finish;          }          i++; diff --git a/src/drumkitloader.h b/src/drumkitloader.h index b9bc102..50b8236 100644 --- a/src/drumkitloader.h +++ b/src/drumkitloader.h @@ -48,13 +48,18 @@ public:    bool isDone(); +  void stop(); +  void skip(); +  private:    DrumGizmo *drumgizmo;    Semaphore semaphore; +  Semaphore skip_semaphore;    DrumKit *kit;    bool is_done;    Mutex mutex; -  bool quitit; +  volatile bool quitit; +  volatile bool skipit;  };  #endif/*__DRUMGIZMO_DRUMKITLOADER_H__*/ | 
