1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
/*
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
*
* This file is part of lsp-dsp-units
* Created on: 20 мая 2016 г.
*
* lsp-dsp-units is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* lsp-dsp-units is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with lsp-dsp-units. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef LSP_PLUG_IN_DSP_UNITS_UTIL_METER_GRAPH_H_
#define LSP_PLUG_IN_DSP_UNITS_UTIL_METER_GRAPH_H_
#include <lsp-plug.in/dsp-units/version.h>
#include <lsp-plug.in/dsp-units/iface/IStateDumper.h>
#include <lsp-plug.in/dsp-units/util/ShiftBuffer.h>
namespace lsp
{
namespace dspu
{
enum meter_method_t
{
MM_MAXIMUM,
MM_MINIMUM
};
class LSP_DSP_UNITS_PUBLIC MeterGraph
{
private:
MeterGraph & operator = (const MeterGraph &);
MeterGraph(const MeterGraph &);
protected:
ShiftBuffer sBuffer;
float fCurrent;
size_t nCount;
size_t nPeriod;
bool bMinimize;
public:
explicit MeterGraph();
~MeterGraph();
/**
* Construct object
*/
void construct();
/** Initialize meter graph
*
* @param frames number of frames used for graph and needed to be stored in internal buffer
* @param period strobe period
* @return true on success
*/
bool init(size_t frames, size_t period);
/** Destroy meter graph
*
*/
void destroy();
public:
/**
* Get number of frames
* @return number of frames
*/
inline size_t get_frames() const { return sBuffer.size(); }
/** Set metering method
*
* @param m metering method
*/
inline void set_method(meter_method_t m) { bMinimize = (m == MM_MINIMUM); }
/** Get data stored in buffer
*
* @return pointer to the first element of the buffer
*/
inline float *data() { return sBuffer.head(); }
/** Set strobe period
*
* @param period strobe period
*/
inline void set_period(size_t period)
{
nPeriod = period;
}
/** Process single sample
*
* @param sample sample to process
*/
void process(float sample);
/** Process multiple samples
*
* @param s array of samples
* @param n number of samples to process
*/
void process(const float *s, size_t n);
/** Get current level
*
* @return current level
*/
inline float level() const { return sBuffer.last(); }
/** Fill graph with specific level
*
* @param level level
*/
inline void fill(float level) { sBuffer.fill(level); }
/**
* Dump internal state
* @param v state dumper
*/
void dump(IStateDumper *v) const;
};
}
}
#endif /* LSP_PLUG_IN_DSP_UNITS_UTIL_METER_GRAPH_H_ */
|