/*************************************************************************************
 * Original code copyright (C) 2012 Steve Folta
 * Converted to Juce module (C) 2016 Leo Olivers
 * Forked from https://github.com/stevefolta/SFZero
 * For license info please see the LICENSE file distributed with this source code
 *************************************************************************************/
#ifndef SFZEG_H_INCLUDED
#define SFZEG_H_INCLUDED

#include "SFZRegion.h"

namespace sfzero
{
    class EG
    {
    public:
        EG();
        virtual ~EG() {}
        
        void setExponentialDecay(bool newExponentialDecay);
        void startNote(const EGParameters *parameters, float floatVelocity, double sampleRate, const EGParameters *velMod = nullptr);
        void nextSegment();
        void noteOff();
        void fastRelease();
        bool isDone() { return (segment_ == Done); }
        bool isReleasing() { return (segment_ == Release); }
        int segmentIndex() { return static_cast<int>(segment_); }
        float getLevel() const { return level_; }
        void setLevel(float v) { level_ = v; }
        float getSlope() const { return slope_; }
        void setSlope(float v) { slope_ = v; }
        int getSamplesUntilNextSegment() const { return samplesUntilNextSegment_; }
        void setSamplesUntilNextSegment(int v) { samplesUntilNextSegment_ = v; }
        bool getSegmentIsExponential() const { return segmentIsExponential_; }
        void setSegmentIsExponential(bool v) { segmentIsExponential_ = v; }
        
    private:
        enum Segment
        {
            Delay,
            Attack,
            Hold,
            Decay,
            Sustain,
            Release,
            Done
        };
        
        void startDelay();
        void startAttack();
        void startHold();
        void startDecay();
        void startSustain();
        void startRelease();
        
        Segment segment_;
        EGParameters parameters_;
        double sampleRate_;
        bool exponentialDecay_;
        float level_;
        float slope_;
        int samplesUntilNextSegment_;
        bool segmentIsExponential_;
        static const float BottomLevel;
        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EG)
    };
}

#endif // SFZEG_H_INCLUDED

