/[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 2072 by persson, Sat Mar 20 11:37:52 2010 UTC revision 2165 by persson, Sun Feb 20 14:20:22 2011 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-2010 Christian Schoenebeck and Grigor Iliev        *   *   Copyright (C) 2009-2011 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 68  namespace LinuxSampler { Line 68  namespace LinuxSampler {
68              virtual void ClearRegionsInUse() {              virtual void ClearRegionsInUse() {
69                  {                  {
70                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
71                      if(cmd.pRegionsInUse != NULL) cmd.pRegionsInUse->clear();                      if (cmd.pRegionsInUse) cmd.pRegionsInUse->clear();
72                        cmd.bChangeInstrument = false;
73                  }                  }
74                  {                  {
75                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();
76                      if(cmd.pRegionsInUse != NULL) cmd.pRegionsInUse->clear();                      if (cmd.pRegionsInUse) cmd.pRegionsInUse->clear();
77                        cmd.bChangeInstrument = false;
78                  }                  }
79              }              }
80    
# Line 84  namespace LinuxSampler { Line 86  namespace LinuxSampler {
86              virtual void DeleteRegionsInUse() {              virtual void DeleteRegionsInUse() {
87                  {                  {
88                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
89                      if(cmd.pRegionsInUse != NULL) {                      if (cmd.pRegionsInUse) {
90                          delete cmd.pRegionsInUse;                          delete cmd.pRegionsInUse;
91                          cmd.pRegionsInUse = NULL;                          cmd.pRegionsInUse = NULL;
92                      }                      }
93                        cmd.bChangeInstrument = false;
94                  }                  }
95                  {                  {
96                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();
97                      if(cmd.pRegionsInUse != NULL) {                      if (cmd.pRegionsInUse) {
98                          delete cmd.pRegionsInUse;                          delete cmd.pRegionsInUse;
99                          cmd.pRegionsInUse = NULL;                          cmd.pRegionsInUse = NULL;
100                      }                      }
101                        cmd.bChangeInstrument = false;
102                  }                  }
103              }              }
104    
# Line 102  namespace LinuxSampler { Line 106  namespace LinuxSampler {
106                  {                  {
107                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.GetConfigForUpdate();
108                      cmd.pRegionsInUse = new RTList<R*>(pRegionPool[0]);                      cmd.pRegionsInUse = new RTList<R*>(pRegionPool[0]);
109                        cmd.bChangeInstrument = false;
110                  }                  }
111                  {                  {
112                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();                      InstrumentChangeCmd<R, I>& cmd = InstrumentChangeCommand.SwitchConfig();
113                      cmd.pRegionsInUse = new RTList<R*>(pRegionPool[1]);                      cmd.pRegionsInUse = new RTList<R*>(pRegionPool[1]);
114                        cmd.bChangeInstrument = false;
115                  }                  }
116              }              }
117    
# Line 183  namespace LinuxSampler { Line 189  namespace LinuxSampler {
189    
190                      MidiKeyboardManager<V>::DeleteActiveVoices();                      MidiKeyboardManager<V>::DeleteActiveVoices();
191                      MidiKeyboardManager<V>::DeleteEvents();                      MidiKeyboardManager<V>::DeleteEvents();
192                        DeleteGroupEventLists();
193    
194                      AudioOutputDevice* oldAudioDevice = pEngine->pAudioOutputDevice;                      AudioOutputDevice* oldAudioDevice = pEngine->pAudioOutputDevice;
195                      pEngine = NULL;                      pEngine = NULL;
# Line 208  namespace LinuxSampler { Line 215  namespace LinuxSampler {
215                  // empty MIDI key specific event lists                  // empty MIDI key specific event lists
216                  ClearEventListsHandler handler;                  ClearEventListsHandler handler;
217                  ProcessActiveVoices(&handler);                  ProcessActiveVoices(&handler);
218    
219                    // empty exclusive group specific event lists
220                    ClearGroupEventLists();
221              }              }
222    
223              // implementation of abstract methods derived from interface class 'InstrumentConsumer'              // implementation of abstract methods derived from interface class 'InstrumentConsumer'
# Line 347  namespace LinuxSampler { Line 357  namespace LinuxSampler {
357              }              }
358    
359              virtual void ProcessKeySwitchChange(int key) = 0;              virtual void ProcessKeySwitchChange(int key) = 0;
   
             /**  
              * Handle key group (a.k.a. exclusive group) conflicts  
              */  
             void HandleKeyGroupConflicts(uint KeyGroup, Pool<Event>::Iterator& itNoteOnEvent, bool UseRelease = false) {  
                 if (KeyGroup) { // if this voice / key belongs to a key group  
                     uint* pKeyGroup = MidiKeyboardManager<V>::ActiveKeyGroups[KeyGroup];  
                     if (pKeyGroup) { // if there's already an active key in that key group  
                         MidiKey* pOtherKey = &MidiKeyboardManager<V>::pMIDIKeyInfo[*pKeyGroup];  
   
                         if (UseRelease) {  
                             // send a note off to the other key  
                             if (pOtherKey->KeyPressed && itNoteOnEvent->Param.Note.Key != *pKeyGroup) {  
                                 RTList<Event>::Iterator itNewEvent = pEngine->pGlobalEvents->allocAppend();  
                                 if (itNewEvent) {  
                                     pOtherKey->ReleaseTrigger = false;  
                                     *itNewEvent = *itNoteOnEvent;  
                                     itNewEvent->Type = Event::type_note_off;  
                                     itNewEvent->Param.Note.Key = *pKeyGroup;  
                                     pEngine->ProcessNoteOff(this, itNewEvent);  
                                 }  
                             }  
                         } else {  
                             // kill all voices on the (other) key  
                             typename RTList<V>::Iterator itVoiceToBeKilled = pOtherKey->pActiveVoices->first();  
                             typename RTList<V>::Iterator end               = pOtherKey->pActiveVoices->end();  
                             for (; itVoiceToBeKilled != end; ++itVoiceToBeKilled) {  
                                 if (itVoiceToBeKilled->Type != Voice::type_release_trigger) {  
                                     itVoiceToBeKilled->Kill(itNoteOnEvent);  
                                     --pEngine->VoiceSpawnsLeft; //FIXME: just a hack, we should better check in StealVoice() if the voice was killed due to key conflict  
                                 }  
                             }  
                         }  
                     }  
                 }  
             }  
360      };      };
361    
362  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.2072  
changed lines
  Added in v.2165

  ViewVC Help
Powered by ViewVC