You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
4.0 KiB
176 lines
4.0 KiB
/*
|
|
|
|
Copyright (C) 2000 Hans Meine
|
|
<hans_meine@gmx.net>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
#ifndef ARTS_TOOLS_LEVELMETERS_H
|
|
#define ARTS_TOOLS_LEVELMETERS_H
|
|
|
|
#include <tqobject.h>
|
|
#include <tqframe.h>
|
|
#include <tqdatetime.h>
|
|
#include <tqptrlist.h>
|
|
#include <math.h>
|
|
|
|
// helper functions
|
|
const float LEVEL_MIN= 1.f/(1<<20); // minimal positive sample for 20 bit resolution
|
|
inline float levelToDB(float level) {
|
|
if (level<LEVEL_MIN) level=LEVEL_MIN; // prevent from div by 0
|
|
return (6.f/log(2.f))*log(level);
|
|
}
|
|
|
|
inline float DBToLevel(float db) {
|
|
return exp(db/(log(2.f)/6.f));
|
|
}
|
|
|
|
/**
|
|
* Base class for a single volume / value bar.
|
|
*/
|
|
class ACLevelMeter : public TQFrame {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
ACLevelMeter(TQWidget *parent): TQFrame(parent) {}
|
|
public slots:
|
|
virtual void setValue(float f) = 0;
|
|
};
|
|
|
|
/**
|
|
* Base class for a pair of volume / value bars.
|
|
*/
|
|
class StereoLevelMeter : public TQFrame {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
StereoLevelMeter(TQWidget *parent): TQFrame(parent) {}
|
|
public slots:
|
|
virtual void setValues(float left, float right) = 0;
|
|
};
|
|
|
|
/**
|
|
* Special LevelMeter which remembers min and max of the last [peakMillis]
|
|
* milliseconds and displays a full bar with optional max/min markers.
|
|
*/
|
|
class PeakBar : public ACLevelMeter {
|
|
Q_OBJECT
|
|
|
|
bool clipped;
|
|
|
|
protected:
|
|
static const int peakMillis; // how long do the peaks stay at their max?
|
|
|
|
class Observation {
|
|
public:
|
|
TQTime time;
|
|
float value;
|
|
Observation(float aValue): value(aValue) { time.start(); }
|
|
};
|
|
TQPtrList<Observation> lastValues;
|
|
|
|
float currentValue, maxValue, minValue;
|
|
void checkMinMax();
|
|
|
|
bool displayMinPeak;
|
|
bool horizontalMode;
|
|
|
|
void frameChanged();
|
|
|
|
public:
|
|
PeakBar(TQWidget *parent);
|
|
|
|
TQSize sizeHint() const;
|
|
|
|
void drawContents(TQPainter *p);
|
|
virtual void setValue(float f);
|
|
};
|
|
|
|
/**
|
|
* Special class which draws the Db scale with ticks, numbers and so on.
|
|
*/
|
|
class ScaleView : public TQFrame {
|
|
Q_OBJECT
|
|
|
|
protected:
|
|
TQFont font;
|
|
int dbRange;
|
|
int upperMargin, lowerMargin;
|
|
public:
|
|
ScaleView(TQWidget *parent);
|
|
void setDbRange(int db);
|
|
void setScaleMargins(int margins) { upperMargin= margins; lowerMargin=margins; }
|
|
TQSize sizeHint() const;
|
|
void drawContents(TQPainter *p);
|
|
};
|
|
|
|
/**
|
|
* Reusable class which displays two volume bars (left/right) with a Db scale
|
|
* and clip indicators. Supports / will have a context menu with some display
|
|
* options like Db range, whether minimal values are also shown and others.
|
|
*/
|
|
class PeakLevelMeters : public StereoLevelMeter {
|
|
Q_OBJECT
|
|
|
|
protected:
|
|
int dbRange;
|
|
PeakBar left, right;
|
|
ScaleView scaleView;
|
|
|
|
public:
|
|
PeakLevelMeters(TQWidget *parent);
|
|
|
|
public slots:
|
|
void setValues(float leftVal, float rightVal);
|
|
void setDbRange(int db);
|
|
};
|
|
|
|
class KLed;
|
|
|
|
/**
|
|
* Simple LevelMeter implementation with 12 KLeds.
|
|
* Shows them in green/yellow/red combi if not blueState set, in which
|
|
* case it's all blue. (Original artscontrol widget by stw.)
|
|
*/
|
|
class LedMeter : public ACLevelMeter {
|
|
Q_OBJECT
|
|
|
|
protected:
|
|
KLed *leds[12];
|
|
|
|
public:
|
|
LedMeter(TQWidget *parent, bool blueState = false);
|
|
void setValue(float f);
|
|
};
|
|
|
|
/**
|
|
* A simple pair of LedMeters.
|
|
*/
|
|
class StereoLedMeters : public StereoLevelMeter {
|
|
Q_OBJECT
|
|
|
|
protected:
|
|
LedMeter left, right;
|
|
|
|
public:
|
|
StereoLedMeters(TQWidget *parent);
|
|
public slots:
|
|
void setValues(float left, float right);
|
|
};
|
|
|
|
#endif /* ARTS_TOOLS_LEVELMETERS_H */
|