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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2121 - (hide 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 iliev 2012 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5     * Copyright (C) 2003,2004 by Benno Senoner and Christian Schoenebeck *
6 persson 2072 * Copyright (C) 2005-2008 Christian Schoenebeck *
7     * Copyright (C) 2009-2010 Christian Schoenebeck and Grigor Iliev *
8 iliev 2012 * *
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 schoenebeck 2121
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 iliev 2012
86 iliev 2015 friend class AbstractVoice;
87 iliev 2012 friend class AbstractEngineChannel;
88     template<class V, class R, class I> friend class EngineChannelBase;
89 iliev 2015 template<class EC, class R, class S, class D> friend class VoiceBase;
90 iliev 2012
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 iliev 2027 RingBuffer<uint8_t,false>* pSysexBuffer; ///< Input buffer for MIDI system exclusive messages.
100 iliev 2012 uint SampleRate; ///< Sample rate of the engines output audio signal (in Hz)
101     uint MaxSamplesPerCycle; ///< Size of each audio output buffer
102 iliev 2027 unsigned long FrameTime; ///< Time in frames of the start of the current audio fragment
103 iliev 2012 int ActiveVoiceCountMax; ///< the maximum voice usage since application start
104 iliev 2027 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 iliev 2012
107     void RouteAudio(EngineChannel* pEngineChannel, uint Samples);
108 schoenebeck 2121 void RouteDedicatedVoiceChannels(EngineChannel* pEngineChannel, optional<float> FxSendLevels[2], uint Samples);
109 iliev 2012 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 persson 2072 float Random() {
123     RandomSeed = RandomSeed * 1103515245 + 12345; // classic pseudo random number generator
124     return RandomSeed / 4294967296.0f;
125     }
126    
127 iliev 2012 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 iliev 2015 virtual int GetMinFadeOutSamples() = 0;
133 iliev 2012
134     private:
135     static std::map<Format, std::map<AudioOutputDevice*,AbstractEngine*> > engines;
136 persson 2072 uint32_t RandomSeed; ///< State of the random number generator used by the random dimension.
137 iliev 2012
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 schoenebeck 2121 bool RouteFxSend(FxSend* pFxSend, AudioChannel* ppSource[2], float FxSendLevel, uint Samples);
145 iliev 2012 };
146    
147     } // namespace LinuxSampler
148    
149     #endif /* __LS_ABSTRACTENGINE_H__ */
150    

  ViewVC Help
Powered by ViewVC