/[svn]/linuxsampler/trunk/src/Sampler.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/Sampler.h

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

revision 2499 by schoenebeck, Thu Oct 4 17:45:22 2012 UTC revision 2500 by schoenebeck, Fri Jan 10 12:20:05 2014 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 - 2012 Christian Schoenebeck                       *   *   Copyright (C) 2005 - 2014 Christian Schoenebeck                       *
7   *                                                                         *   *                                                                         *
8   *   This program is free software; you can redistribute it and/or modify  *   *   This program 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 38  namespace LinuxSampler { Line 38  namespace LinuxSampler {
38      // just symbol prototyping      // just symbol prototyping
39      class Sampler;      class Sampler;
40    
41      /** @brief LinuxSampler sampler channel      /** @brief LinuxSampler sampler channel (a.k.a. "sampler part")
42       *       *
43       * Encapsulates a channel of a specific sampler engine type, one       * Encapsulates a channel of a specific sampler engine type, one
44       * connection to a MIDI input device and one connection to an audio       * connection to a MIDI input device and one connection to an audio
# Line 72  namespace LinuxSampler { Line 72  namespace LinuxSampler {
72              void SetAudioOutputDevice(AudioOutputDevice* pDevice) throw (Exception);              void SetAudioOutputDevice(AudioOutputDevice* pDevice) throw (Exception);
73    
74              /**              /**
75               * Connect this sampler channel to a MIDI input device.               * Connect the given MIDIInputPort to this SamplerChannel. The
76                 * connection is added to the sampler channel. So other MIDI input
77                 * connections remain unaffected by this call. If the given port is
78                 * already connected to this sampler channel, then this call is
79                 * ignored.
80               *               *
81               * @param pDevice - MIDI input device to connect to               * @param pPort - MIDI input port to connect to
82                 * @throws Exception in case the MIDI device is tried to be changed
83                 *                   while the sampler channel is being used by a
84                 *                   host plugin (e.g. VST, AU, DSSI, LV2) which
85                 *                   don't allow to change the MIDI port or even
86                 *                   device
87                 */
88                void Connect(MidiInputPort* pPort) throw (Exception);
89    
90                /**
91                 * Disconnects the given MidiInputPort from this SamplerChannel.
92                 * All other MIDI input ports connected to this sampler channel
93                 * remain unaffected. If the given port is not currently connected
94                 * to this sampler channel, then this call is ignored.
95                 *
96                 * @param pPort - MIDI input port to disconnect
97               * @throws Exception in case the MIDI device is tried to be changed               * @throws Exception in case the MIDI device is tried to be changed
98               *                   while the sampler channel is being used by a               *                   while the sampler channel is being used by a
99               *                   host plugin (e.g. VST, AU, DSSI, LV2) which               *                   host plugin (e.g. VST, AU, DSSI, LV2) which
100               *                   don't allow to change the MIDI port or even               *                   don't allow to change the MIDI port or even
101               *                   device               *                   device
102               */               */
103              void SetMidiInputDevice(MidiInputDevice *pDevice) throw (Exception);              void Disconnect(MidiInputPort* pPort) throw (Exception);
104    
105              /**              /**
106               * Connect this sampler channel to a MIDI input port.               * Disconnects all MIDI input ports currently connected with this
107                 * SamplerChannel.
108                 *
109                 * @throws Exception in case the MIDI device is tried to be changed
110                 *                   while the sampler channel is being used by a
111                 *                   host plugin (e.g. VST, AU, DSSI, LV2) which
112                 *                   don't allow to change the MIDI port or even
113                 *                   device
114                 */
115                void DisconnectAllMidiInputPorts() throw (Exception);
116    
117                /**
118                 * Returns all MIDI input ports currently connected to this sampler
119                 * channel.
120                 */
121                std::vector<MidiInputPort*> GetMidiInputPorts();
122    
123                /**
124                 * Connect this sampler channel to a MIDI input device.
125                 *
126                 * This call will also disconnect <b>all</b> existing MIDI input
127                 * connections from this sampler channel before establishing the
128                 * new connection! Disconnection of all previous connections is
129                 * done to preserve full behavior backward compatibility to times
130                 * when this API only allowed one MIDI input port per sampler
131                 * channel.
132                 *
133                 * @param pDevice - MIDI input device to connect to
134                 * @throws Exception in case the MIDI device is tried to be changed
135                 *                   while the sampler channel is being used by a
136                 *                   host plugin (e.g. VST, AU, DSSI, LV2) which
137                 *                   don't allow to change the MIDI port or even
138                 *                   device
139                 * @deprecated This method is only provided for backward
140                 *             compatibility. It is a relict from days where there
141                 *             was only 1 MIDI input allowed per SamplerChannel.
142                 */
143                void SetMidiInputDevice(MidiInputDevice *pDevice) throw (Exception) DEPRECATED_API;
144    
145                /**
146                 * Change the MIDI input port connected to this sampler channel.
147                 *
148                 * Calling this method will switch the connection of the first
149                 * (and only the first) MIDIInputPort currently being connected to
150                 * this sampler channel, to another port of the same
151                 * MidiInputDevice. Or in other words: the first MIDIInputPort
152                 * currently connected to this sampler channel will be disconnected,
153                 * and the requested other port of its MIDIInputDevice will be
154                 * connected to this sampler channel instead.
155                 *
156                 * This behavior is implemented to preserve full behavior backward
157                 * compatibility to times when this API only allowed one MIDI input
158                 * port per SamplerChannel.
159               *               *
160               * @param MidiPort - MIDI port to connect to               * @param MidiPort - MIDI port to connect to
161               * @throws Exception in case the MIDI port is tried to be changed               * @throws Exception in case the MIDI port is tried to be changed
162               *                   while the sampler channel is being used by a               *                   while the sampler channel is being used by a
163               *                   host plugin (e.g. VST, AU, DSSI, LV2) which               *                   host plugin (e.g. VST, AU, DSSI, LV2) which
164               *                   don't allow to change the MIDI port               *                   don't allow to change the MIDI port
165                 * @deprecated This method is only provided for backward
166                 *             compatibility. It is a relict from days where there
167                 *             was only 1 MIDI input allowed per SamplerChannel.
168               */               */
169              void SetMidiInputPort(int MidiPort) throw (Exception);              void SetMidiInputPort(int MidiPort) throw (Exception) DEPRECATED_API;
170    
171              /**              /**
172               * Define on which MIDI channel(s) this sampler channel should               * Define on which MIDI channel(s) this sampler channel should
173               * listen to. By default, that is after creation of a new               * listen to (on all MIDI ports and all virtual MIDI devices
174               * sampler channel, the sampler channel will listen to all MIDI               * connected to this sampler channel). By default, that is after
175               * channels.               * creation of a new sampler channel, the sampler channel will
176                 * listen to all MIDI channels (a.k.a. "MIDI Omni mode").
177               *               *
178               * @param MidiChannel - MIDI channel to listen               * @param MidiChannel - MIDI channel to listen
179                 * @throws Exception if provided MidiChannel is not a valid constant
180                 *                   as defined by midi_chan_t
181               */               */
182              void SetMidiInputChannel(midi_chan_t MidiChannel);              void SetMidiInputChannel(midi_chan_t MidiChannel);
183    
184              /**              /**
185               * Connect this sampler channel to a MIDI input triplet.               * Connect this sampler channel to a MIDI input triplet.
186               *               *
187                 * This call will also disconnect <b>all</b> existing MIDI input
188                 * connections from this sampler channel before establishing the
189                 * new connection! Disconnection of all previous connections is
190                 * done to preserve full behavior backward compatibility to times
191                 * when this API only allowed one MIDI input port per sampler
192                 * channel.
193                 *
194               * @param pDevice - MIDI input device to connect to               * @param pDevice - MIDI input device to connect to
195               * @param iMidiPort - MIDI port to connect to               * @param iMidiPort - MIDI port to connect to
196               * @param MidiChannel - optional: MIDI channel on which the               * @param MidiChannel - optional: MIDI channel on which the
# Line 116  namespace LinuxSampler { Line 200  namespace LinuxSampler {
200               *                   while the sampler channel is being used by a               *                   while the sampler channel is being used by a
201               *                   host plugin (e.g. VST, AU, DSSI, LV2) which               *                   host plugin (e.g. VST, AU, DSSI, LV2) which
202               *                   don't allow to change the MIDI port               *                   don't allow to change the MIDI port
203                 * @deprecated This method is only provided for backward
204                 *             compatibility. It is a relict from days where there
205                 *             was only 1 MIDI input allowed per sampler channel.
206               */               */
207              void SetMidiInput(MidiInputDevice* pDevice, int iMidiPort, midi_chan_t MidiChannel = midi_chan_all) throw (Exception);              void SetMidiInput(MidiInputDevice* pDevice, int iMidiPort, midi_chan_t MidiChannel = midi_chan_all) throw (Exception) DEPRECATED_API;
208    
209              /**              /**
210               * Returns the EngineChannel object that was deployed on this               * Returns the EngineChannel object that was deployed on this
# Line 140  namespace LinuxSampler { Line 227  namespace LinuxSampler {
227               * Returns the MIDI input port number to which this sampler               * Returns the MIDI input port number to which this sampler
228               * channel is currently connected to.               * channel is currently connected to.
229               *               *
230                 * This method should not be used in new applications anymore!
231                 *
232               * @returns  MIDI input port number or -1 if not connected               * @returns  MIDI input port number or -1 if not connected
233                 * @deprecated This method is only provided for backward
234                 *             compatibility. It is a relict from days where there
235                 *             was only 1 MIDI input allowed per sampler channel.
236               */               */
237              int GetMidiInputPort();              int GetMidiInputPort() DEPRECATED_API;
238    
239              /**              /**
240               * Returns the audio output device to which this sampler channel               * Returns the audio output device to which this sampler channel
# Line 159  namespace LinuxSampler { Line 251  namespace LinuxSampler {
251               *               *
252               * @returns  pointer to MIDI input device or NULL if not               * @returns  pointer to MIDI input device or NULL if not
253               *           connected               *           connected
254                 * @deprecated This method is only provided for backward
255                 *             compatibility. It is a relict from days where there
256                 *             was only 1 MIDI input allowed per sampler channel.
257               */               */
258              MidiInputDevice* GetMidiInputDevice();              MidiInputDevice* GetMidiInputDevice() DEPRECATED_API;
259    
260              /**              /**
261               * Returns the index number of this sampler channel within the               * Returns the index number of this sampler channel within the
# Line 207  namespace LinuxSampler { Line 302  namespace LinuxSampler {
302              SamplerChannel(Sampler* pS);              SamplerChannel(Sampler* pS);
303              virtual ~SamplerChannel();              virtual ~SamplerChannel();
304    
             /** Getting MIDI input device port given its index number. */  
             MidiInputPort* __GetMidiInputDevicePort(int iMidiPort);  
   
305              Sampler*           pSampler;              Sampler*           pSampler;
306              EngineChannel*     pEngineChannel;              EngineChannel*     pEngineChannel;
307              AudioOutputDevice* pAudioOutputDevice;              AudioOutputDevice* pAudioOutputDevice; //FIXME: should be stored as numeric device ID instead of raw pointer to avoid pointer invalidation problems
             MidiInputDevice*   pMidiInputDevice;  
308              int                iIndex;              int                iIndex;
309    
310              friend class Sampler;              friend class Sampler;
311    
312          private:          private:
313              int                iMidiPort;   ///< Don't access directly, read GetMidiInputPort() instead !              struct midi_conn_t {
314                    uint deviceID;
315                    uint portNr;
316    
317                    bool operator== (const midi_conn_t& other) const {
318                        return other.deviceID == this->deviceID &&
319                               other.portNr   == this->portNr;
320                    }
321    
322                    bool operator< (const midi_conn_t& other) const {
323                        return memcmp(this, &other, sizeof(midi_conn_t)) < 0;
324                    }
325                };
326    
327                int                iMidiPort;   ///< Don't access directly, read GetMidiInputPort() instead ! @deprecated This variable is just for backward compatibility from days when there was only one MIDI connection per SamplerChannel.
328              midi_chan_t        midiChannel; ///< Don't access directly, read GetMidiInputChannel() instead !              midi_chan_t        midiChannel; ///< Don't access directly, read GetMidiInputChannel() instead !
329                std::vector<midi_conn_t> vMidiInputs; ///< MIDI input ports connected to this sampler channel. Only used as "cache" (device id, port nr pair) in initial situation where no engine type is selected yet, and accordingly no EngineChannel instance exists which actually manages the device connections. This way users can "connect" MIDI input ports to this SamplerChannel before an engine type is chosen.
330              ListenerList<EngineChangeListener*> llEngineChangeListeners;              ListenerList<EngineChangeListener*> llEngineChangeListeners;
331    
332                static MidiInputPort* _getPortForID(const midi_conn_t& c);
333      };      };
334    
335      /** @brief LinuxSampler main class      /** @brief LinuxSampler main class
# Line 228  namespace LinuxSampler { Line 337  namespace LinuxSampler {
337       * This is the toplevel class for a LinuxSampler instance.       * This is the toplevel class for a LinuxSampler instance.
338       *       *
339       * LinuxSampler can have arbitrary numbers of sampler channels. Each       * LinuxSampler can have arbitrary numbers of sampler channels. Each
340       * sampler channel can individually be deployed with it's own sampler       * sampler channel (a.k.a. "sampler part") can individually be deployed
341       * engine, connected to an arbitrary MIDI input device and connected to       * with it's own sampler engine, connected to an arbitrary MIDI input
342       * an arbitrary audio output device. Here an example setup:       * device and connected to an arbitrary audio output device. Here an
343         * example setup:
344       * @code       * @code
345       * S.Channel    MIDI in    S.Engine         Audio out       * S.Channel    MIDI in    S.Engine         Audio out
346       * -------------------------------------------------------------------       * -------------------------------------------------------------------
347       *   0          Alsa   ->  gig::Engine  ->  Jack       *   0          Alsa   ->  gig::Engine  ->  Jack
348       *   1          VSTi   ->  Akai::Engine ->  VSTi       *   1          VSTi   ->  gig::Engine  ->  VSTi
349       *   2          Jack   ->  DLS::Engine  ->  Jack       *   2          Jack   ->  sfz::Engine  ->  Jack
350       *   3          Jack   ->  SF::Engine   ->  Alsa       *   3          Jack   ->  SF2::Engine  ->  Alsa
351         *   4          LV2    ->  sfz::Engine  ->  LV2
352       *       *
353       * ... (and so on) ...       * ... (and so on) ...
354       * @endcode       * @endcode
355       *       *
      * Note that not all audio and MIDI backends and sampler engines listed  
      * in the example above might already been implemented!  
      *  
356       * As you can see in the example setup, LinuxSampler is capable to use       * As you can see in the example setup, LinuxSampler is capable to use
357       * several, different audio output and MIDI input systems       * several, different audio output and MIDI input systems
358       * simultaniously at the same time. Here the example setup shown in the       * simultaniously at the same time. Here the example setup shown in the

Legend:
Removed from v.2499  
changed lines
  Added in v.2500

  ViewVC Help
Powered by ViewVC