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

Diff of /linuxsampler/trunk/src/engines/FxSend.cpp

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

revision 1001 by schoenebeck, Wed Dec 27 16:17:08 2006 UTC revision 2114 by persson, Tue Aug 10 12:05:19 2010 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, 2006 Christian Schoenebeck                        *   *   Copyright (C) 2005 - 2010 Christian Schoenebeck                       *
7   *                                                                         *   *                                                                         *
8   *   This library is free software; you can redistribute it and/or modify  *   *   This library 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 23  Line 23 
23    
24  #include "FxSend.h"  #include "FxSend.h"
25    
26    #include "../common/global_private.h"
27  #include "../drivers/audio/AudioOutputDevice.h"  #include "../drivers/audio/AudioOutputDevice.h"
28    #include "../common/RTMath.h"
29    
30  #include <map>  #include <map>
31    
32  namespace LinuxSampler {  #define DEFAULT_FX_SEND_LEVEL   0.0f
33    
34      /*  namespace LinuxSampler {
        FIXME: we create fx send indeces globally for now, although we might  
        want them to be an individual sequence per sampler channel, beside that  
        we don't handle the cases yet where __indexer overflows back to 0  
     */  
     static uint __indexer = 0;  
35    
36      FxSend::FxSend(EngineChannel* pEngineChannel, uint8_t MidiCtrl, String Name) {      FxSend::FxSend(EngineChannel* pEngineChannel, uint8_t MidiCtrl, String Name) throw (Exception)
37            : iMasterEffectChain(-1), iMasterEffect(-1), bInfoChanged(false)
38        {
39          this->pEngineChannel = pEngineChannel;          this->pEngineChannel = pEngineChannel;
40          AudioOutputDevice* pDevice = pEngineChannel->GetAudioOutputDevice();          AudioOutputDevice* pDevice = pEngineChannel->GetAudioOutputDevice();
41          const int iChanOffset = (pDevice) ? pDevice->ChannelCount() - pEngineChannel->Channels() : 0;          const int iChanOffset = (pDevice) ? pDevice->ChannelCount() - pEngineChannel->Channels() : 0;
# Line 44  namespace LinuxSampler { Line 43  namespace LinuxSampler {
43              const int iDestination = iChanOffset + i;              const int iDestination = iChanOffset + i;
44              Routing.push_back(iDestination);              Routing.push_back(iDestination);
45          }          }
46          MidiFxSendController = MidiCtrl;          SetMidiController(MidiCtrl);
47          sName = Name;          sName = Name;
48          iId = __indexer;  
49          __indexer++;          // create an EngineChannel unique ID for this FxSend instance
50          fLevel = 0.3f; // default FX send level          if (!pEngineChannel->GetFxSendCount()) iId = 0;
51            else {
52                // get the highest existing map ID
53                uint highestIndex = 0;
54                for (uint i = 0; i < pEngineChannel->GetFxSendCount(); i++)
55                    highestIndex = RTMath::Max(highestIndex, pEngineChannel->GetFxSend(i)->Id());
56                // check if we reached the index limit
57                if (highestIndex + 1 < highestIndex) {
58                    // search for an unoccupied map ID starting from 0
59                    for (uint i = 0; i < highestIndex; i++) {
60                        bool bOccupied = false;
61                        for (uint j = 0; j < pEngineChannel->GetFxSendCount(); j++) {
62                            if (pEngineChannel->GetFxSend(j)->Id() == i) {
63                                bOccupied = true;
64                                break;
65                            }
66                        }
67                        if (!bOccupied) {
68                            iId = i;
69                            goto __done;
70                        }
71                    }
72                    throw Exception("Internal error: could not find unoccupied FxSend ID.");
73                }
74                iId = highestIndex + 1;
75            }
76            __done:
77    
78            fLevel = DEFAULT_FX_SEND_LEVEL;
79        }
80    
81        int FxSend::DestinationMasterEffectChain() const {
82            return iMasterEffectChain;
83        }
84    
85        int FxSend::DestinationMasterEffect() const {
86            return iMasterEffect;
87        }
88    
89        void FxSend::SetDestinationMasterEffect(int iChain, int iEffect) throw (Exception) {
90            AudioOutputDevice* pDevice = pEngineChannel->GetAudioOutputDevice();
91            if (iChain < 0 || iChain >= pDevice->MasterEffectChainCount())
92                throw Exception(
93                    "Could not assign FX Send to master effect chain " +
94                    ToString(iChain) + ": effect chain doesn't exist."
95                );
96            if (iEffect < 0 || iEffect >= pDevice->MasterEffectChain(iChain)->EffectCount())
97                throw Exception(
98                    "Could not assign FX Send to master effect " +
99                    ToString(iEffect) + " of effect chain " + ToString(iChain) +
100                    ": effect doesn't exist."
101                );
102            iMasterEffectChain = iChain;
103            iMasterEffect      = iEffect;
104      }      }
105    
106      int FxSend::DestinationChannel(int SrcChan) {      int FxSend::DestinationChannel(int SrcChan) {
# Line 94  namespace LinuxSampler { Line 146  namespace LinuxSampler {
146      }      }
147    
148      void FxSend::SetLevel(float f) {      void FxSend::SetLevel(float f) {
149            if(fLevel == f) return;
150          fLevel = f;          fLevel = f;
151            SetInfoChanged(true);
152      }      }
153    
154      void FxSend::SetLevel(uint8_t iMidiValue) {      void FxSend::SetLevel(uint8_t iMidiValue) {
155          fLevel = float(iMidiValue & 0x7f) / 127.0f;          fLevel = float(iMidiValue & 0x7f) / 127.0f;
156            SetInfoChanged(true);
157        }
158    
159        void FxSend::Reset() {
160            SetLevel(DEFAULT_FX_SEND_LEVEL);
161      }      }
162    
163      uint8_t FxSend::MidiController() {      uint8_t FxSend::MidiController() {
# Line 106  namespace LinuxSampler { Line 165  namespace LinuxSampler {
165      }      }
166    
167      void FxSend::SetMidiController(uint8_t MidiCtrl) throw (Exception) {      void FxSend::SetMidiController(uint8_t MidiCtrl) throw (Exception) {
168          if (MidiCtrl & 0x7f)          if (MidiCtrl >> 7)
169              throw Exception("Invalid MIDI controller");              throw Exception("Invalid MIDI controller " + ToString((int)MidiCtrl));
170          MidiFxSendController = MidiCtrl;          MidiFxSendController = MidiCtrl;
171      }      }
172    
# Line 115  namespace LinuxSampler { Line 174  namespace LinuxSampler {
174          return sName;          return sName;
175      }      }
176    
177        void FxSend::SetName(String Name) {
178            sName = Name;
179        }
180    
181      uint FxSend::Id() {      uint FxSend::Id() {
182          return iId;          return iId;
183      }      }
184    
185        void FxSend::SetInfoChanged(bool b) {
186            bInfoChanged = b;
187        }
188    
189        bool FxSend::IsInfoChanged() {
190            return bInfoChanged;
191        }
192    
193  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.1001  
changed lines
  Added in v.2114

  ViewVC Help
Powered by ViewVC