/[svn]/linuxsampler/trunk/src/engines/EngineChannelBase.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/EngineChannelBase.h

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

revision 2611 by schoenebeck, Mon Jun 9 19:20:37 2014 UTC revision 2837 by persson, Sun Aug 23 06:14:00 2015 UTC
# Line 4  Line 4 
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-2008 Christian Schoenebeck                         *
7   *   Copyright (C) 2009-2013 Christian Schoenebeck and Grigor Iliev        *   *   Copyright (C) 2009-2015 Christian Schoenebeck and Grigor Iliev        *
8   *                                                                         *   *                                                                         *
9   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
10   *   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 39  namespace LinuxSampler { Line 39  namespace LinuxSampler {
39              bool bChangeInstrument;       ///< Set to true by the loader when the channel should change instrument.              bool bChangeInstrument;       ///< Set to true by the loader when the channel should change instrument.
40              I* pInstrument;               ///< The new instrument. Also used by the loader to read the previously loaded instrument.              I* pInstrument;               ///< The new instrument. Also used by the loader to read the previously loaded instrument.
41              RTList<R*>* pRegionsInUse; ///< List of dimension regions in use by the currently loaded instrument. Continuously updated by the audio thread.              RTList<R*>* pRegionsInUse; ///< List of dimension regions in use by the currently loaded instrument. Continuously updated by the audio thread.
42              InstrumentScript* pScript; ///< Instrument script to be executed for this instrument, or NULL if instrument does not have a script.              InstrumentScript* pScript; ///< Instrument script to be executed for this instrument. This is never NULL, it is always a valid InstrumentScript pointer. Use InstrumentScript::bHasValidScript whether it reflects a valid instrument script to be executed.
43      };      };
44    
45      template<class R>      template<class R>
# Line 60  namespace LinuxSampler { Line 60  namespace LinuxSampler {
60              typedef typename RTList<R*>::Iterator RTListRegionIterator;              typedef typename RTList<R*>::Iterator RTListRegionIterator;
61              typedef typename MidiKeyboardManager<V>::MidiKey MidiKey;              typedef typename MidiKeyboardManager<V>::MidiKey MidiKey;
62    
63                virtual MidiKeyboardManagerBase* GetMidiKeyboardManager() OVERRIDE {
64                    return this;
65                }
66    
67              virtual void HandBack(I* Instrument) {              virtual void HandBack(I* Instrument) {
68                  ResourceManager<InstrumentManager::instrument_id_t, I>* mgr =                  ResourceManager<InstrumentManager::instrument_id_t, I>* mgr =
69                      dynamic_cast<ResourceManager<InstrumentManager::instrument_id_t, I>*>(pEngine->GetInstrumentManager());                      dynamic_cast<ResourceManager<InstrumentManager::instrument_id_t, I>*>(pEngine->GetInstrumentManager());
# Line 85  namespace LinuxSampler { Line 89  namespace LinuxSampler {
89              }              }
90    
91              virtual void DeleteRegionsInUse() {              virtual void DeleteRegionsInUse() {
92                    RTList<R*>* previous = NULL; // prevent double free
93                  {                  {
94                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
95                      if (cmd.pRegionsInUse) {                      if (cmd.pRegionsInUse) {
96                            previous = cmd.pRegionsInUse;
97                          delete cmd.pRegionsInUse;                          delete cmd.pRegionsInUse;
98                          cmd.pRegionsInUse = NULL;                          cmd.pRegionsInUse = NULL;
99                      }                      }
# Line 96  namespace LinuxSampler { Line 102  namespace LinuxSampler {
102                  {                  {
103                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();
104                      if (cmd.pRegionsInUse) {                      if (cmd.pRegionsInUse) {
105                          delete cmd.pRegionsInUse;                          if (cmd.pRegionsInUse != previous)
106                                delete cmd.pRegionsInUse;
107                          cmd.pRegionsInUse = NULL;                          cmd.pRegionsInUse = NULL;
108                      }                      }
109                      cmd.bChangeInstrument = false;                      cmd.bChangeInstrument = false;
# Line 180  namespace LinuxSampler { Line 187  namespace LinuxSampler {
187                      ResetInternal();                      ResetInternal();
188    
189                      DeleteRegionsInUse();                      DeleteRegionsInUse();
190                        UnloadScriptInUse();
191    
192                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
193                      if (cmd.pInstrument) {                      if (cmd.pInstrument) {
# Line 263  namespace LinuxSampler { Line 271  namespace LinuxSampler {
271               */               */
272              virtual void OnResourceProgress(float fProgress) OVERRIDE {              virtual void OnResourceProgress(float fProgress) OVERRIDE {
273                  this->InstrumentStat = int(fProgress * 100.0f);                  this->InstrumentStat = int(fProgress * 100.0f);
274                  dmsg(7,("EngineChannelBase: progress %d%", InstrumentStat));                  dmsg(7,("EngineChannelBase: progress %d%%", InstrumentStat));
275                  bStatusChanged = true; // status of engine has changed, so set notify flag                  bStatusChanged = true; // status of engine has changed, so set notify flag
276              }              }
277    
# Line 281  namespace LinuxSampler { Line 289  namespace LinuxSampler {
289              template<class TV, class TRR, class TR, class TD, class TIM, class TI> friend class EngineBase;              template<class TV, class TRR, class TR, class TD, class TIM, class TI> friend class EngineBase;
290    
291          protected:          protected:
292              EngineChannelBase() : InstrumentChangeCommandReader(InstrumentChangeCommand) {              EngineChannelBase() :
293                    MidiKeyboardManager<V>(this),
294                    InstrumentChangeCommandReader(InstrumentChangeCommand)
295                {
296                  pInstrument = NULL;                  pInstrument = NULL;
297    
298                  // reset the instrument change command struct (need to be done                  // reset the instrument change command struct (need to be done
# Line 303  namespace LinuxSampler { Line 314  namespace LinuxSampler {
314              }              }
315    
316              virtual ~EngineChannelBase() {              virtual ~EngineChannelBase() {
317                    InstrumentScript* previous = NULL; // prevent double free
318                  {                  {
319                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
320                      if (cmd.pScript) delete cmd.pScript;                      if (cmd.pScript) {
321                            previous = cmd.pScript;
322                            delete cmd.pScript;
323                            cmd.pScript = NULL;
324                        }
325                  }                  }
326                  {                  {
327                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();
328                      if (cmd.pScript) delete cmd.pScript;                      if (cmd.pScript) {
329                            if (previous != cmd.pScript)
330                                delete cmd.pScript;
331                            cmd.pScript = NULL;
332                        }
333                  }                  }
334              }              }
335    
# Line 364  namespace LinuxSampler { Line 384  namespace LinuxSampler {
384              }              }
385    
386              /**              /**
387                 * Unload the currently used and loaded real-time instrument script.
388                 * The source code of the script is retained, so that it can still
389                 * be reloaded.
390                 */
391                void UnloadScriptInUse() {
392                    {
393                        InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
394                        if (cmd.pScript) cmd.pScript->unload();
395                    }
396                    {
397                        InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();
398                        if (cmd.pScript) cmd.pScript->unload();
399                    }
400                    InstrumentChangeCommand.SwitchConfig(); // switch back to original one
401                }
402    
403                /**
404               * Load real-time instrument script and all its resources required               * Load real-time instrument script and all its resources required
405               * for the upcoming instrument change.               * for the upcoming instrument change.
406               *               *
# Line 371  namespace LinuxSampler { Line 408  namespace LinuxSampler {
408               */               */
409              void LoadInstrumentScript(const String& text) {              void LoadInstrumentScript(const String& text) {
410                  InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();                  InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
                 // unload *PRE*-previous script  
                 cmd.pScript->reset(); //TODO: previous script should be freed as soon as the EngineBase switched the instrument, right now 2 scripts are kept in memory all the time, even though the old one is not used anymore  
411                  // load the new script                  // load the new script
412                  cmd.pScript->load(text);                  cmd.pScript->load(text);
413              }              }

Legend:
Removed from v.2611  
changed lines
  Added in v.2837

  ViewVC Help
Powered by ViewVC