Skip to content

Commit

Permalink
Update levelmeters
Browse files Browse the repository at this point in the history
  • Loading branch information
FangCunWuChang committed Aug 3, 2024
1 parent bf883d9 commit 714cab6
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 44 deletions.
7 changes: 6 additions & 1 deletion src/ui/component/mixer/MixerTrackLevelMeter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,13 @@ MixerTrackLevelMeter::MixerTrackLevelMeter() {

void MixerTrackLevelMeter::updateLevelMeter() {
/** Get Value */
this->values.clear();
auto valuesTemp = quickAPI::getMixerTrackOutputLevel(this->index);
if (this->values.size() == valuesTemp.size()) {
this->values.clearQuick();
}
else {
this->values.clear();
}
for (auto i : valuesTemp) {
this->values.add(utils::logRMS(i));
}
Expand Down
7 changes: 6 additions & 1 deletion src/ui/component/sequencer/SeqTrackLevelMeter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,13 @@ SeqTrackLevelMeter::SeqTrackLevelMeter() {

void SeqTrackLevelMeter::updateLevelMeter() {
/** Get Value */
this->values.clear();
auto valuesTemp = quickAPI::getSeqTrackOutputLevel(this->index);
if (this->values.size() == valuesTemp.size()) {
this->values.clearQuick();
}
else {
this->values.clear();
}
for (auto i : valuesTemp) {
this->values.add(utils::logRMS(i));
}
Expand Down
79 changes: 40 additions & 39 deletions src/ui/component/toolbar/TimeComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,18 @@ void TimeComponent::updateLevelMeter() {
/** Get Values From Audio Core */
std::tie(this->timeInMeasure, this->timeInBeat) = quickAPI::getTimeInBeat();
this->timeInSec = quickAPI::getTimeInSecond();
auto levels = quickAPI::getAudioOutputLevel();
this->level = {
(levels.size() > 0) ? levels[0] : 0.f,
(levels.size() > 1) ? levels[1] : 0.f };

auto levelTemp = quickAPI::getAudioOutputLevel();
if (this->level.size() == levelTemp.size()) {
this->level.clearQuick();
}
else {
this->level.clear();
}
for (auto i : levelTemp) {
this->level.add(utils::logRMS(i));
}

this->isPlaying = quickAPI::isPlaying();
this->isRecording = quickAPI::isRecording();

Expand Down Expand Up @@ -292,11 +300,14 @@ void TimeComponent::mouseMove(const juce::MouseEvent& event) {
}
/** Level Meter */
else if (event.position.getX() < levelAreaWidth) {
auto [left, right] = this->level;
left = utils::logRMS(left);
right = utils::logRMS(right);
juce::String str =
juce::String{ left, 2 } + " dB, " + juce::String{ right, 2 } + " dB";
juce::String str;
for (int i = 0; i < this->level.size(); i++) {
float data = utils::logRMS(this->level.getUnchecked(i));
str += juce::String{ data, 2 } + " dB";
if (i < this->level.size() - 1) {
str += ", ";
}
}
this->setTooltip(str);
}
/** Status */
Expand Down Expand Up @@ -549,46 +560,36 @@ void TimeComponent::paintDot(

void TimeComponent::paintLevelMeter(
juce::Graphics& g, const juce::Rectangle<int>& area,
const LevelValue& value, float splitThickness, bool logMeter) {
/** Level Area */
float barHeight = area.getHeight() / 2.f - splitThickness / 2;
juce::Rectangle<float> leftRect(
area.getX(), area.getY(),
area.getWidth(), barHeight);
juce::Rectangle<float> rightRect(
area.getX(), area.getBottom() - barHeight,
area.getWidth(), barHeight);

const juce::Array<float>& values, float splitThickness, bool logMeter) {
/** Level Segment */
std::array<float, 3> levelSegs{
0.66f, 0.86f, 1.f };

/** Level Value */
auto [left, right] = value;

/** Log Value */
if (logMeter) {
constexpr float rmsNum = 60.f;
left = std::max(utils::getLogLevelPercent(utils::logRMS(left), rmsNum), 0.f);
right = std::max(utils::getLogLevelPercent(utils::logRMS(right), rmsNum), 0.f);
}

/** Level Color */
std::array<juce::Colour, levelSegs.size()> levelColors{
juce::Colours::green,
juce::Colours::yellow,
juce::Colours::red };

/** Paint Lower Level */
for (int i = levelSegs.size() - 1; i >= 0; i--) {
juce::Rectangle<float> leftArea
= leftRect.withWidth(std::fminf(left, levelSegs[i]) * area.getWidth());
juce::Rectangle<float> rightArea
= rightRect.withWidth(std::fminf(right, levelSegs[i]) * area.getWidth());

g.setColour(levelColors[i]);
g.fillRect(leftArea);
g.fillRect(rightArea);
/** Paint Each Bar */
int barNum = values.size();
if (barNum > 0) {
constexpr float rmsNum = 60.f;
float barHeight = (area.getHeight() - (barNum - 1) * splitThickness) / barNum;
for (int i = 0; i < barNum; i++) {
float value = values.getUnchecked(i);
float percent = std::max(utils::getLogLevelPercent(value, rmsNum), 0.f);

for (int j = levelSegs.size() - 1; j >= 0; j--) {
float width = std::min(percent, levelSegs[j]) * area.getWidth();
juce::Rectangle<float> barRect(
0, area.getY() + (barHeight + splitThickness) * i,
width, barHeight);

g.setColour(levelColors[j]);
g.fillRect(barRect);
}
}
}
}

Expand Down
5 changes: 2 additions & 3 deletions src/ui/component/toolbar/TimeComponent.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ class TimeComponent final
double timeInBeat = 0;
bool showSec = true;

using LevelValue = std::tuple<float, float>;
LevelValue level;
juce::Array<float> level;

bool isPlaying = false;
bool isRecording = false;
Expand All @@ -43,7 +42,7 @@ class TimeComponent final
float lineThickness, float splitThickness);
static void paintLevelMeter(
juce::Graphics& g, const juce::Rectangle<int>& area,
const LevelValue& value, float splitThickness, bool logMeter);
const juce::Array<float>& values, float splitThickness, bool logMeter);
static void paintRecordStatus(
juce::Graphics& g, const juce::Rectangle<int>& area,
float lineThickness, bool recording);
Expand Down

0 comments on commit 714cab6

Please sign in to comment.