18 #include "base/AudioLevel.h" 20 #include <QPaintDevice> 28 float minVal,
float maxVal,
29 Scale scale,
int &mult,
32 static float meterdbs[] = { -40, -30, -20, -15, -10,
33 -5, -3, -2, -1, -0.5, 0 };
35 int h = rect.height(), w = rect.width();
36 int textHeight = paint.fontMetrics().height();
37 int toff = -textHeight/2 + paint.fontMetrics().ascent() + 1;
39 int lastLabelledY = -1;
47 step = (maxVal - minVal) / n;
48 int round = 0, limit = 10000000;
50 round = int(minVal + step * mult);
52 }
while (!round && mult < limit);
56 step = float(round) / mult;
57 n = lrintf((maxVal - minVal) / step);
65 for (
int i = 0; i <= n; ++i) {
67 float val = 0.0, nval = 0.0;
73 val = (minVal + (i * step));
74 text = QString(
"%1").arg(mult * val);
78 val = AudioLevel::dB_to_multiplier(
meterdbs[i]);
79 text = QString(
"%1").arg(
meterdbs[i]);
80 if (i == n) text =
"0dB";
88 val = AudioLevel::dB_to_multiplier(-(10*n) + i * 10);
89 text = QString(
"%1").arg(-(10*n) + i * 10);
90 if (i == n) text =
"0dB";
98 if (val < minVal || val > maxVal)
continue;
100 int y =
getYForValue(scale, val, minVal, maxVal, rect.y(), h);
104 ny =
getYForValue(scale, nval, minVal, maxVal, rect.y(), h);
110 bool spaceForLabel = (i == 0 ||
111 abs(y - lastLabelledY) >= textHeight - 1);
117 if (paint.fontMetrics().width(text) < w - 10) {
118 tx = w - 10 - paint.fontMetrics().width(text);
123 if (ty < paint.fontMetrics().ascent()) {
124 ty = paint.fontMetrics().ascent();
131 paint.drawText(tx, ty, text);
133 lastLabelledY = ty - toff;
147 paint.drawLine(w - 7, y, w, y);
148 if (vy) vy->push_back(y);
151 paint.drawLine(w - 7, ny, w, ny);
152 if (vy) vy->push_back(ny);
157 paint.drawLine(w - 4, y, w, y);
158 if (vy) vy->push_back(y);
161 paint.drawLine(w - 4, ny, w, ny);
162 if (vy) vy->push_back(ny);
169 dBscale(
float sample,
int m,
float maxVal,
float minVal)
171 if (sample < 0.0)
return dBscale(-sample, m, maxVal, minVal);
172 float dB = AudioLevel::multiplier_to_dB(sample);
173 float mindB = AudioLevel::multiplier_to_dB(minVal);
174 float maxdB = AudioLevel::multiplier_to_dB(maxVal);
175 if (dB < mindB)
return 0;
176 if (dB > 0.0)
return m;
177 return int(((dB - mindB) * m) / (maxdB - mindB) + 0.1);
182 float minVal,
float maxVal,
183 int minY,
int height)
194 vy = minY + height - int(((value - minVal) / (maxVal - minVal)) * height);
199 vy = minY + height - AudioLevel::multiplier_to_preview
200 ((value - minVal) / (maxVal - minVal), height);
204 vy = minY + height -
dBscale(value, height, maxVal, minVal);
static int dBscale(float sample, int m, float maxVal, float minVal)
static int getYForValue(Scale scale, float value, float minVal, float maxVal, int minY, int height)
static void paintVerticalLevelScale(QPainter &p, QRect rect, float minVal, float maxVal, Scale scale, int &multRtn, std::vector< int > *markCoordRtns=0)