1 /***************************************************************************
2  *                                                                         *
3  *   LinuxSampler - modular, streaming capable sampler                     *
4  *                                                                         *
5  *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *
6  *   Copyright (C) 2005 - 2010 Christian Schoenebeck                       *
7  *                                                                         *
8  *   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  *
10  *   the Free Software Foundation; either version 2 of the License, or     *
11  *   (at your option) any later version.                                   *
12  *                                                                         *
13  *   This library is distributed in the hope that it will be useful,       *
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
16  *   GNU General Public License for more details.                          *
17  *                                                                         *
18  *   You should have received a copy of the GNU General Public License     *
19  *   along with this library; if not, write to the Free Software           *
20  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston,                 *
21  *   MA  02111-1307  USA                                                   *
22  ***************************************************************************/
23 
24 #ifndef LS_FXSEND_H
25 #define LS_FXSEND_H
26 
27 #include "../common/global.h"
28 #include "../drivers/audio/AudioChannel.h"
29 #include "EngineChannel.h"
30 
31 #include <vector>
32 
33 namespace LinuxSampler {
34 
35     // just symbol prototyping
36     class EngineChannel;
37 
38     /** @brief Engine Channel Effect Send
39      *
40      * This class is used to manage effect sends on Engine Channels. An effect
41      * send is used to route sampler channel's audio signals to either sampler
42      * external effect processors (by routing the effect send to dedicated
43      * audio output channels of the sampler channel's audio output device) or
44      * to sampler internal effect processors (send effects). Each effect send
45      * entity can define an arbitrary MIDI controller number which can alter
46      * the effect send's send level.
47      *
48      * Regarding sampler internal effects: See AudioOutputDevice regarding
49      * management of send effects, since send effects only live in the context
50      * of exactly @e ONE AudioOutputDevice.
51      *
52      * Note: effect sends cannot be routed to a different AudioOutputDevice
53      * than assigned to the FxSend's EngineChannel. Also note that an effect
54      * send always has as much audio channels as its EngineChannel.
55      */
56     class FxSend {
57         public:
58             /**
59              * Constructor. By default all effect send channels are routed to
60              * the @e last available audio channels on the EngineChannel's
61              * AudioOutputDevice.
62              *
63              * @param pEngineChannel - engine channel on which the effect send
64              *                         is added to
65              * @param MidiCtrl - MIDI controller number which can alter the
66              *                   effect send level
67              * @param Name - (optional) name for the effect send entity
68              *
69              * @throws Exception - in case no free ID could be found on
70              *                     given EngineChannel or @a MidiCtrl is
71              *                     invalid
72              */
73             FxSend(EngineChannel* pEngineChannel, uint8_t MidiCtrl, String Name = "") throw (Exception);
74 
75             /**
76              * Index of the send effect chain this FX send is routed to or
77              * -1 if FX send is not routed to a send effect.
78              */
79             int DestinationEffectChain() const;
80 
81             /**
82              * Index of the send effect of the send effect chain given by
83              * DestinationEffectChain(), in case FX send is routed to
84              * a send effect or -1 otherwise. This is the effect chain
85              * position, not the effect ID!
86              */
87             int DestinationEffectChainPosition() const;
88 
89             /**
90              * Route this FX send to the given send effect given by index
91              * @a iChainPos of the send effect chain given by @a iChain .
92              *
93              * If you want to remove the routing of an FX send, currently
94              * directed to a send effect processor, and want to route it
95              * directly to an audio output device channel instead, then set
96              * both arguments to @c -1 .
97              *
98              * @throw Exception - if given effect chain or effect chain position
99              *                    doesn't exist
100              *
101              * @see AudioOutputDevice::SendEffectChain()
102              */
103             void SetDestinationEffect(int iChain, int iChainPos) throw (Exception);
104 
105             /**
106              * @deprecated This method will be removed, use DestinationEffectChain() instead!
107              */
108             int DestinationMasterEffectChain() const DEPRECATED_API;
109 
110             /**
111              * @deprecated This method will be removed, use DestinationEffectChainPosition() instead!
112              */
113             int DestinationMasterEffect() const DEPRECATED_API;
114 
115             /**
116              * @deprecated This method will be removed, use SetDestinationEffect() instead!
117              */
118             void SetDestinationMasterEffect(int iChain, int iChainPos) throw (Exception) DEPRECATED_API;
119 
120             /**
121              * Returns the audio output device's audio channel to which effect
122              * send's channel \a SrcChan is currently routed to.
123              */
124             int DestinationChannel(int SrcChan);
125 
126             /**
127              * Alters the routing of an audio channel. By default all audio
128              * channels of an effect send are routed in consecutive same order
129              * to its destination. You can use this method to change this
130              * default routing. If this effect send is routed to an internel
131              * effect, then @a DstChan is the input channel of that destination
132              * effect. Otherwise, if this effect send is not routed to an
133              * internal effect, then @a DstChan is the output channel of the
134              * sampler channel's audio output device.
135              *
136              * @param SrcChan - the effect send's source channel
137              * @param DstChan - the audio output device's destination channel
138              *                  or send effect's input channel
139              * @throws Exception - in case arguments out of range
140              */
141             void SetDestinationChannel(int SrcChan, int DstChan) throw (Exception);
142 
143             /**
144              * Should be called by the engine channel whenever the amount of
145              * audio channel has changed, so the FxSend object can adjust the
146              * amount of channels to that new number and establish default
147              * routings for new channels if needed.
148              */
149             void UpdateChannels();
150 
151             /**
152              * The effect send's current send level ( usually a value between
153              * @c 0.0f and @c 1.0f ).
154              */
155             float Level();
156 
157             /**
158              * Alter the effect send's send level ( usually a value between
159              * @c 0.0f and @c 1.0f ).
160              */
161             void SetLevel(float f);
162 
163             /**
164              * Alter the effect send's send level by supplying the MIDI
165              * controller's MIDI value. This method is usually only called
166              * by the engine channel.
167              */
168             void SetLevel(uint8_t iMidiValue);
169 
170             /**
171              * Reset send level to the default send level (i.e. due to a
172              * MIDI "reset all controllers" message).
173              */
174             void Reset();
175 
176             /**
177              * Returns the MIDI controller number which can alter the effect
178              * send's send level.
179              */
180             uint8_t MidiController();
181 
182             /**
183              * Alter the MIDI controller number which should alter the effect
184              * send's send level.
185              *
186              * @param MidiCtrl - MIDI controller number
187              * @throws Exception - if MIDI controller number is invalid
188              */
189             void SetMidiController(uint8_t MidiCtrl) throw (Exception);
190 
191             /**
192              * Returns the (optional) name of this effect send entity.
193              */
194             String Name();
195 
196             /**
197              * Sets the name of this effect send entity.
198              * @param Name The new name of this effect send entity.
199              */
200             void SetName(String Name);
201 
202             /**
203              * Returns the (at least sampler-channel-) unique ID of the
204              * effect send instance. This is actually not used by the engine
205              * at all. It is at the moment only used by the LSCP server to
206              * associate an unique numerical ID with each effect send entity.
207              */
208             uint Id();
209 
210             /**
211              * Determines whether the effect send's settings are changed.
212              */
213             bool IsInfoChanged();
214 
215             /**
216              * Sets whether the effect send's settings are changed.
217              */
218             void SetInfoChanged(bool b);
219 
220         protected:
221             EngineChannel*   pEngineChannel;
222             int              iDestinationEffectChain;
223             int              iDestinationEffectChainPos;
224             std::vector<int> Routing;
225             uint8_t          MidiFxSendController;
226             String           sName;
227             uint             iId;
228             float            fLevel;
229             bool             bInfoChanged;  // Determines whether there are changes to the settings.
230     };
231 
232 } // namespace LinuxSampler
233 
234 #endif // LS_FXSEND_H
235