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

Contents of /linuxsampler/trunk/src/engines/AbstractEngine.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2121 - (show annotations) (download) (as text)
Tue Sep 14 17:09:08 2010 UTC (13 years, 7 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 8900 byte(s)
* implemented Roland GS NRPN 1ArrH which allows to set volume per note
* implemented Roland GS NRPN 1CrrH which allows to set pan per note
* implemented Roland GS NRPN 1DrrH which allows to set reverb send per
  note (in this implementation of the sampler its simply hard routed to
  the 1st effect send of the sampler channel, no matter what the actual
  effect type is)
* implemented Roland GS NRPN 1ErrH which allows to set chorus send per
  note (in this implementation of the sampler its simply hard routed to
  the 2nd effect send of the sampler channel, no matter what the actual
  effect type is)
* bumped version to 1.0.0cvs4

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003,2004 by Benno Senoner and Christian Schoenebeck *
6 * Copyright (C) 2005-2008 Christian Schoenebeck *
7 * Copyright (C) 2009-2010 Christian Schoenebeck and Grigor Iliev *
8 * *
9 * 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 *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 * This program is distributed in the hope that it will be useful, *
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17 * GNU General Public License for more details. *
18 * *
19 * You should have received a copy of the GNU General Public License *
20 * along with this program; if not, write to the Free Software *
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
22 * MA 02111-1307 USA *
23 ***************************************************************************/
24
25 #ifndef __LS_ABSTRACTENGINE_H__
26 #define __LS_ABSTRACTENGINE_H__
27
28 #include "Engine.h"
29 #include "../common/ArrayList.h"
30 #include "../common/atomic.h"
31 #include "../common/ConditionServer.h"
32 #include "../common/Pool.h"
33 #include "../common/RingBuffer.h"
34 #include "../drivers/audio/AudioOutputDevice.h"
35 #include "common/Event.h"
36
37 namespace LinuxSampler {
38
39 class AbstractEngineChannel;
40
41 class AbstractEngine: public Engine {
42
43 public:
44 enum Format { GIG = 1, SF2, SFZ };
45 static String GetFormatString(Format f);
46 static AbstractEngine* AcquireEngine(AbstractEngineChannel* pChannel, AudioOutputDevice* pDevice);
47 static void FreeEngine(AbstractEngineChannel* pChannel, AudioOutputDevice* pDevice);
48
49 AbstractEngine();
50 virtual ~AbstractEngine();
51
52 // implementation of abstract methods derived from class 'LinuxSampler::Engine'
53 virtual void SendSysex(void* pData, uint Size, MidiInputPort* pSender);
54 virtual void Reset();
55 virtual void Enable();
56 virtual void Disable();
57 virtual uint VoiceCount();
58 virtual uint VoiceCountMax();
59 virtual String EngineName();
60
61 virtual Format GetEngineFormat() = 0;
62 virtual void Connect(AudioOutputDevice* pAudioOut) = 0;
63 virtual void DisableAndLock();
64
65 void SetVoiceCount(uint Count);// Simple array wrapper just to make sure memory is freed
66 // when liblinuxsampler is unloaded
67 class FloatTable {
68 private:
69 const float* array;
70 public:
71 FloatTable(const float* array) : array(array) { }
72 ~FloatTable() { delete[] array; }
73 const float& operator[](int i) const { return array[i]; }
74 };
75
76 static const FloatTable VolumeCurve; ///< Table that maps volume control change values 0..127 to amplitude. Unity gain is at 90.
77 static const FloatTable PanCurve; ///< Table that maps pan control change values 0..128 to right channel amplitude. Unity gain is at 64 (center).
78 static const FloatTable CrossfadeCurve; ///< Table that maps crossfade control change values 0..127 to amplitude. Unity gain is at 127.
79
80 AudioOutputDevice* pAudioOutputDevice;
81
82 //TODO: should be protected
83 AudioChannel* pDedicatedVoiceChannelLeft; ///< encapsulates a special audio rendering buffer (left) for rendering and routing audio on a per voice basis (this is a very special case and only used for voices which lie on a note which was set with individual, dedicated FX send level)
84 AudioChannel* pDedicatedVoiceChannelRight; ///< encapsulates a special audio rendering buffer (right) for rendering and routing audio on a per voice basis (this is a very special case and only used for voices which lie on a note which was set with individual, dedicated FX send level)
85
86 friend class AbstractVoice;
87 friend class AbstractEngineChannel;
88 template<class V, class R, class I> friend class EngineChannelBase;
89 template<class EC, class R, class S, class D> friend class VoiceBase;
90
91 protected:
92 ArrayList<EngineChannel*> engineChannels; ///< All engine channels of a Engine instance.
93 ConditionServer EngineDisabled;
94 int8_t ScaleTuning[12]; ///< contains optional detune factors (-64..+63 cents) for all 12 semitones of an octave
95 RingBuffer<Event,false>* pEventQueue; ///< Input event queue for engine global events (e.g. SysEx messages).
96 EventGenerator* pEventGenerator;
97 RTList<Event>* pGlobalEvents; ///< All engine global events for the current audio fragment (usually only SysEx messages).
98 Pool<Event>* pEventPool; ///< Contains all Event objects that can be used.
99 RingBuffer<uint8_t,false>* pSysexBuffer; ///< Input buffer for MIDI system exclusive messages.
100 uint SampleRate; ///< Sample rate of the engines output audio signal (in Hz)
101 uint MaxSamplesPerCycle; ///< Size of each audio output buffer
102 unsigned long FrameTime; ///< Time in frames of the start of the current audio fragment
103 int ActiveVoiceCountMax; ///< the maximum voice usage since application start
104 atomic_t ActiveVoiceCount; ///< number of currently active voices
105 int VoiceSpawnsLeft; ///< We only allow CONFIG_MAX_VOICES voices to be spawned per audio fragment, we use this variable to ensure this limit.
106
107 void RouteAudio(EngineChannel* pEngineChannel, uint Samples);
108 void RouteDedicatedVoiceChannels(EngineChannel* pEngineChannel, optional<float> FxSendLevels[2], uint Samples);
109 void ClearEventLists();
110 void ImportEvents(uint Samples);
111 void ProcessSysex(Pool<Event>::Iterator& itSysexEvent);
112 void ResetScaleTuning();
113 void ProcessPitchbend(AbstractEngineChannel* pEngineChannel, Pool<Event>::Iterator& itPitchbendEvent);
114
115 void ProcessFxSendControllers (
116 AbstractEngineChannel* pEngineChannel,
117 Pool<Event>::Iterator& itControlChangeEvent
118 );
119
120 uint8_t GSCheckSum(const RingBuffer<uint8_t,false>::NonVolatileReader AddrReader, uint DataSize);
121
122 float Random() {
123 RandomSeed = RandomSeed * 1103515245 + 12345; // classic pseudo random number generator
124 return RandomSeed / 4294967296.0f;
125 }
126
127 virtual void ResetInternal() = 0;
128 virtual void KillAllVoices(EngineChannel* pEngineChannel, Pool<Event>::Iterator& itKillEvent) = 0;
129 virtual void ProcessNoteOn(EngineChannel* pEngineChannel, Pool<Event>::Iterator& itNoteOnEvent) = 0;
130 virtual void ProcessNoteOff(EngineChannel* pEngineChannel, Pool<Event>::Iterator& itNoteOffEvent) = 0;
131 virtual void ProcessControlChange(EngineChannel* pEngineChannel, Pool<Event>::Iterator& itControlChangeEvent) = 0;
132 virtual int GetMinFadeOutSamples() = 0;
133
134 private:
135 static std::map<Format, std::map<AudioOutputDevice*,AbstractEngine*> > engines;
136 uint32_t RandomSeed; ///< State of the random number generator used by the random dimension.
137
138 static float* InitVolumeCurve();
139 static float* InitPanCurve();
140 static float* InitCrossfadeCurve();
141 static float* InitCurve(const float* segments, int size = 128);
142
143 void AdjustScale(int8_t ScaleTunes[12]);
144 bool RouteFxSend(FxSend* pFxSend, AudioChannel* ppSource[2], float FxSendLevel, uint Samples);
145 };
146
147 } // namespace LinuxSampler
148
149 #endif /* __LS_ABSTRACTENGINE_H__ */
150

  ViewVC Help
Powered by ViewVC