8
#include <qwt_thermo.h>
9
#include <qwt_round_scale_draw.h>
12
class Knob: public QWidget
15
Knob(const QString &title, double min, double max, QWidget *parent):
18
d_knob = new QwtKnob(this);
19
d_knob->setRange(min, max, 0,1);
20
d_knob->setScaleMaxMajor(10);
22
d_knob->setKnobWidth(50);
24
d_label = new QLabel(title, this);
25
d_label->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
27
setSizePolicy(QSizePolicy::MinimumExpanding,
28
QSizePolicy::MinimumExpanding);
31
virtual QSize sizeHint() const
33
QSize sz1 = d_knob->sizeHint();
34
QSize sz2 = d_label->sizeHint();
36
const int w = qwtMax(sz1.width(), sz2.width());
37
const int h = sz1.height() + sz2.height();
39
int off = d_knob->scaleDraw()->extent(QPen(), d_knob->font());
42
return QSize(w, h - off);
47
return d_knob->value();
51
virtual void resizeEvent(QResizeEvent *e)
53
const QSize sz = e->size();
55
int h = d_label->sizeHint().height();
57
d_label->setGeometry(0, sz.height() - h,
60
h = d_knob->sizeHint().height();
61
int off = d_knob->scaleDraw()->extent(QPen(), d_knob->font());
64
d_knob->setGeometry(0, d_label->pos().y() - h + off,
73
class Thermo: public QWidget
76
Thermo(const QString &title, QWidget *parent):
79
d_thermo = new QwtThermo(this);
80
d_thermo->setPipeWidth(6);
81
d_thermo->setRange(-40,10);
82
d_thermo->setFillColor(Qt::green);
83
d_thermo->setAlarmColor(Qt::red);
84
d_thermo->setAlarmLevel(0.0);
85
d_thermo->setAlarmEnabled(true);
87
QLabel *label = new QLabel(title, this);
88
label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
90
QVBoxLayout *layout = new QVBoxLayout(this);
92
layout->setSpacing(0);
93
layout->addWidget(d_thermo, 10);
94
layout->addWidget(label);
97
void setValue(double value)
99
d_thermo->setValue(value);
106
AmpFrame::AmpFrame(QWidget *p):
109
d_knbVolume = new Knob("Volume", 0.0, 10.0, this);
110
d_knbBalance = new Knob("Balance", -10.0, 10.0, this);
111
d_knbTreble = new Knob("Treble", -10.0, 10.0, this);
112
d_knbBass = new Knob("Bass", -10.0, 10.0, this);
114
d_thmLeft = new Thermo("Left [dB]", this);
115
d_thmRight = new Thermo("Right [dB]", this);
117
QHBoxLayout *layout = new QHBoxLayout(this);
118
layout->setSpacing(0);
119
layout->setMargin(10);
120
layout->addWidget(d_knbVolume);
121
layout->addWidget(d_knbBalance);
122
layout->addWidget(d_knbTreble);
123
layout->addWidget(d_knbBass);
124
layout->addSpacing(20);
125
layout->addStretch(10);
126
layout->addWidget(d_thmLeft);
127
layout->addSpacing(10);
128
layout->addWidget(d_thmRight);
130
(void)startTimer(50);
133
void AmpFrame::timerEvent(QTimerEvent *)
135
static double phs = 0;
138
// This amplifier generates its own input signal...
141
const double sig_bass = (1.0 + 0.1 * d_knbBass->value())
143
const double sig_mid_l = sin(17.0 * phs);
144
const double sig_mid_r = cos(17.5 * phs);
145
const double sig_trbl_l = 0.5 * (1.0 + 0.1 * d_knbTreble->value())
147
const double sig_trbl_r = 0.5 * (1.0 + 0.1 * d_knbTreble->value())
150
double sig_l = 0.05 * d_master * d_knbVolume->value()
151
* qwtSqr(sig_bass + sig_mid_l + sig_trbl_l);
152
double sig_r = 0.05 * d_master * d_knbVolume->value()
153
* qwtSqr(sig_bass + sig_mid_r + sig_trbl_r);
155
double balance = 0.1 * d_knbBalance->value();
157
sig_l *= (1.0 - balance);
159
sig_r *= (1.0 + balance);
162
sig_l = 20.0 * log10(sig_l);
167
sig_r = 20.0 * log10(sig_r);
171
d_thmLeft->setValue(sig_l);
172
d_thmRight->setValue(sig_r);
179
void AmpFrame::setMaster(double v)