--- linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.h 2011/08/11 18:25:45 2236 +++ linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.h 2011/08/20 10:38:31 2251 @@ -32,9 +32,9 @@ #include "../common/SineLFO.h" namespace LinuxSampler { namespace sfz { - const int MaxUnitCount = 1000; - const int maxEgCount = 100; // Maximum number of v2 envelope generators - const int maxLfoCount = 100; // Maximum number of v2 LFOs + const int MaxUnitCount = 200; + const int maxEgCount = 30; // Maximum number of v2 envelope generators + const int maxLfoCount = 30; // Maximum number of v2 LFOs class Voice; class SfzSignalUnitRack; @@ -70,8 +70,8 @@ virtual void AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth); - inline int GetCurveCount(); - inline ::sfz::Curve* GetCurve(int idx); + int GetCurveCount(); + ::sfz::Curve* GetCurve(int idx); double GetSampleRate(); }; @@ -90,11 +90,16 @@ class SmoothCCUnit: public CurveCCUnit { protected: - Smoother Smoothers[128]; + RTList* pSmoothers; public: - SmoothCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CurveCCUnit(rack, l) { } + SmoothCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CurveCCUnit(rack, l), pSmoothers(NULL) { } + virtual ~SmoothCCUnit(); virtual void AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth); + virtual void RemoveAllCCs() { CurveCCUnit::RemoveAllCCs(); pSmoothers->clear(); } + virtual void InitCCList(Pool* pCCPool, Pool* pSmootherPool); + + void InitSmoothers(Pool* pSmootherPool); }; @@ -102,7 +107,7 @@ public: XFInCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CCUnit(rack, l) { } - virtual bool Active() { return Ctrls.size() > 0; } + virtual bool Active() { return !pCtrls->isEmpty(); } virtual void Calculate(); virtual void SetCrossFadeCCs(::sfz::Array& loCCs, ::sfz::Array& hiCCs); }; @@ -181,6 +186,7 @@ CCUnit suPitchOnCC; CCUnit suCutoffOnCC; CCUnit suResOnCC; + CurveCCUnit suPanOnCC; EGv2Unit(SfzSignalUnitRack* rack); virtual void Trigger(); @@ -266,11 +272,12 @@ SfzSignalUnit::Copy(Unit); } - virtual bool Active() { return pLfoInfo->freq > 0; } virtual void Trigger(); virtual void Increment(); virtual float GetLevel() { return Level; } - virtual void ValueChanged(CCSignalUnit* pUnit); + + // CCSignalUnit::Listener interface implementation + virtual void ValueChanged(CCSignalUnit* pUnit); }; class LFOv1Unit: public LFOUnit { @@ -308,6 +315,7 @@ LFOv2Unit(SfzSignalUnitRack* rack); virtual void Trigger(); + virtual bool Active() { return true; } }; class AmpLFOUnit: public LFOv1Unit { @@ -335,11 +343,13 @@ class EndpointUnit: public EndpointSignalUnit { private: float xfCoeff; // crossfade coefficient + float pitchVeltrackRatio; public: Voice* pVoice; - XFInCCUnit suXFInCC; - XFOutCCUnit suXFOutCC; + XFInCCUnit suXFInCC; + XFOutCCUnit suXFOutCC; + SmoothCCUnit suPanOnCC; EndpointUnit(SfzSignalUnitRack* rack); @@ -390,9 +400,12 @@ // used for optimization - contains only the ones that are modulating filter cutoff FixedArray filEGs; - // used for optimization - contains only the ones that are modulating filter cutoff + // used for optimization - contains only the ones that are modulating resonance FixedArray resEGs; + // used for optimization - contains only the ones that are modulating pitch + FixedArray panEGs; + FixedArray LFOs; @@ -426,6 +439,12 @@ virtual void Trigger(); virtual void EnterFadeOutStage(); + /** Called when the engine is set and the engine's pools are ready to use. */ + void InitRTLists(); + + /** Invoked when the voice gone inactive. */ + void Reset(); + friend class EndpointUnit; }; }} // namespace LinuxSampler::sfz