sintonia/library/ecasound-2.7.2/libecasound/audiogate.h

154 lines
4.2 KiB
C++

#ifndef INCLUDED_AUDIO_GATE_H
#define INCLUDED_AUDIO_GATE_H
#include <string>
#include "eca-chainop.h"
#include "eca-samplerate-aware.h"
class SAMPLE_BUFFER;
/**
* Interface to gate effects. Gate processes sample data, but
* doesn't modify it. Gate is either open or closed.
*/
class GATE_BASE : public CHAIN_OPERATOR {
private:
bool gate_open;
SAMPLE_BUFFER* target;
protected:
void close_gate(void) { gate_open = false; }
void open_gate(void) { gate_open = true; }
public:
inline bool is_open(void) const { return(gate_open); }
virtual void init(SAMPLE_BUFFER* sbuf);
virtual void process(void);
virtual void analyze(SAMPLE_BUFFER* sbuf) = 0;
virtual GATE_BASE* clone(void) const = 0;
virtual ~GATE_BASE(void);
GATE_BASE(void) { close_gate(); }
};
/**
* A time crop gate. Initially the gate is closed, but is opened after
* 'open_at' seconds has elapsed. Gate remains open for
* 'duration' seconds. If 'duration' is 0, gate will stay open
* forever.
*/
class TIME_CROP_GATE : public GATE_BASE,
public ECA_SAMPLERATE_AWARE
{
public:
// Functions returning info about effect and its parameters.
// ---
parameter_t get_parameter(int param) const;
void set_parameter(int param, parameter_t value);
std::string name(void) const { return("Time crop gate"); }
std::string parameter_names(void) const { return("open-at-sec,duration-sec"); }
void analyze(SAMPLE_BUFFER* insample);
/** @name Functions reimplemented from ECA_SAMPLERATE_AWARE */
/*@{*/
virtual void set_samples_per_second(SAMPLE_SPECS::sample_rate_t new_value);
/*@}*/
TIME_CROP_GATE* clone(void) const { return new TIME_CROP_GATE(*this); }
TIME_CROP_GATE* new_expr(void) const { return new TIME_CROP_GATE(); }
TIME_CROP_GATE (parameter_t open_at, parameter_t duration);
TIME_CROP_GATE (void) : position_in_samples_rep(0), begtime_rep(0.0), durtime_rep(0.0) {
close_gate();
}
private:
SAMPLE_SPECS::sample_pos_t position_in_samples_rep;
parameter_t begtime_rep, durtime_rep;
};
/**
* A threshold open gate. When the average volume goes
* over 'threshold_openlevel', gate is opened. In the
* same way, when the average volume drops below
* 'threshold_closelevel', gate is closed. Either
* peak or RMS level is used for calculating average
* volume. The thresholds are given in percents. Unlike
* noise gates, threshold gate is opened and closed
* only once.
*/
class THRESHOLD_GATE : public GATE_BASE {
public:
// Functions returning info about effect and its parameters.
// ---
virtual parameter_t get_parameter(int param) const;
virtual void set_parameter(int param, parameter_t value);
virtual void init(SAMPLE_BUFFER* sbuf);
virtual std::string name(void) const { return("Threshold gate"); }
virtual std::string parameter_names(void) const { return("threshold-openlevel-%,threshold-closelevel-%,rms-enabled,reopen-count"); }
virtual void analyze(SAMPLE_BUFFER* insample);
THRESHOLD_GATE* clone(void) const { return new THRESHOLD_GATE(*this); }
THRESHOLD_GATE* new_expr(void) const { return new THRESHOLD_GATE(); }
THRESHOLD_GATE (parameter_t threshold_openlevel, parameter_t
threshold_closelevel, bool use_rms = false);
THRESHOLD_GATE (void)
: openlevel_rep(0.0), closelevel_rep(0.0), reopen_count_param_rep(0), reopens_left_rep(0), rms_rep(false), is_opened_rep(false), is_closed_rep(false) { }
private:
parameter_t openlevel_rep, closelevel_rep, avolume_rep;
int reopen_count_param_rep, reopens_left_rep;
bool rms_rep;
bool is_opened_rep, is_closed_rep;
};
/**
* Manual gate.
*
* A trivial object that ly changes gate state
*/
class MANUAL_GATE : public GATE_BASE {
public:
// Functions returning info about effect and its parameters.
// ---
virtual parameter_t get_parameter(int param) const;
virtual void set_parameter(int param, parameter_t value);
virtual std::string name(void) const { return("Manual gate"); }
virtual std::string parameter_names(void) const { return("state"); }
virtual void analyze(SAMPLE_BUFFER* insample);
MANUAL_GATE* clone(void) const { return new MANUAL_GATE(*this); }
MANUAL_GATE* new_expr(void) const { return new MANUAL_GATE(); }
MANUAL_GATE (void) : open_rep(true) {}
private:
bool open_rep;
};
#endif