Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add peak indicators #7295

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions data/themes/classic/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,11 @@ lmms--gui--MixerChannelView QGraphicsView {
border-style: none;
}

lmms--gui--PeakIndicator {
background-color: #111811;
font-size: 7pt;
}

/* persistent peak markers for fx peak meters */
lmms--gui--Fader {
qproperty-peakOk: rgb( 74, 253, 133);
Expand Down
5 changes: 5 additions & 0 deletions data/themes/default/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,11 @@ lmms--gui--MixerChannelView QGraphicsView {
border-style: none;
}

lmms--gui--PeakIndicator {
background-color: #111811;
font-size: 7pt;
}

/* persistent peak markers for fx peak meters */
lmms--gui--Fader {
qproperty-peakOk: #0ad45c;
Expand Down
3 changes: 3 additions & 0 deletions include/Fader.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ class LMMS_EXPORT Fader : public QWidget, public FloatModelView
setUnit(txt_after);
}

signals:
void peakChanged(float peak);

private:
void contextMenuEvent(QContextMenuEvent* me) override;
void mousePressEvent(QMouseEvent* ev) override;
Expand Down
5 changes: 5 additions & 0 deletions include/MixerChannelView.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ namespace lmms

namespace lmms::gui
{
class PeakIndicator;

constexpr int MIXER_CHANNEL_INNER_BORDER_SIZE = 3;
constexpr int MIXER_CHANNEL_OUTER_BORDER_SIZE = 1;

Expand Down Expand Up @@ -90,6 +92,8 @@ namespace lmms::gui
QColor strokeInnerInactive() const;
void setStrokeInnerInactive(const QColor& c);

void reset();

public slots:
void renameChannel();
void resetColor();
Expand Down Expand Up @@ -119,6 +123,7 @@ namespace lmms::gui
QLabel* m_receiveArrow;
PixmapButton* m_muteButton;
PixmapButton* m_soloButton;
PeakIndicator* m_peakIndicator = nullptr;
Fader* m_fader;
EffectRackView* m_effectRackView;
MixerView* m_mixerView;
Expand Down
60 changes: 60 additions & 0 deletions include/PeakIndicator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* PeakIndicator.h - Peak indicator widget
*
* Copyright (c) 2024- Michael Gregorius
*
* This file is part of LMMS - https://lmms.io
*
* 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 (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/


#ifndef LMMS_GUI_PEAKINDICATOR_H
#define LMMS_GUI_PEAKINDICATOR_H

#include "lmms_export.h"

#include <QLabel>


namespace lmms::gui
{

class LMMS_EXPORT PeakIndicator : public QLabel
{
Q_OBJECT
public:
PeakIndicator(QWidget* parent);

void resetPeakToMinusInf();

public slots:
void updatePeak(float peak);

protected:
void mousePressEvent(QMouseEvent* e) override;

private:
void updatePeakDisplay();

private:
float m_peak;
} ;

} // namespace lmms::gui

#endif // LMMS_GUI_PEAKINDICATOR_H
1 change: 1 addition & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ SET(LMMS_SRCS
gui/widgets/MixerChannelLcdSpinBox.cpp
gui/widgets/NStateButton.cpp
gui/widgets/Oscilloscope.cpp
gui/widgets/PeakIndicator.cpp
gui/widgets/PixmapButton.cpp
gui/widgets/SimpleTextFloat.cpp
gui/widgets/TabBar.cpp
Expand Down
10 changes: 10 additions & 0 deletions src/gui/MixerChannelView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "Mixer.h"
#include "MixerChannelView.h"
#include "MixerView.h"
#include "PeakIndicator.h"
#include "Song.h"
#include "ConfigManager.h"

Expand Down Expand Up @@ -121,6 +122,9 @@ namespace lmms::gui

m_fader = new Fader{&mixerChannel->m_volumeModel, tr("Fader %1").arg(channelIndex), this};

m_peakIndicator = new PeakIndicator(this);
connect(m_fader, &Fader::peakChanged, m_peakIndicator, &PeakIndicator::updatePeak);

m_effectRackView = new EffectRackView{&mixerChannel->m_fxChain, mixerView->m_racksWidget};
m_effectRackView->setFixedWidth(EffectRackView::DEFAULT_WIDTH);

Expand All @@ -133,6 +137,7 @@ namespace lmms::gui
mainLayout->addWidget(m_channelNumberLcd, 0, Qt::AlignHCenter);
mainLayout->addWidget(m_renameLineEditView, 0, Qt::AlignHCenter);
mainLayout->addLayout(soloMuteLayout, 0);
mainLayout->addWidget(m_peakIndicator);
mainLayout->addWidget(m_fader, 1, Qt::AlignHCenter);

connect(m_renameLineEdit, &QLineEdit::editingFinished, this, &MixerChannelView::renameFinished);
Expand Down Expand Up @@ -340,6 +345,11 @@ namespace lmms::gui
m_strokeInnerInactive = c;
}

void MixerChannelView::reset()
{
m_peakIndicator->resetPeakToMinusInf();
}

void MixerChannelView::renameChannel()
{
m_inRename = true;
Expand Down
2 changes: 2 additions & 0 deletions src/gui/MixerView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,8 @@ void MixerView::clear()
for (auto i = m_mixerChannelViews.size() - 1; i > 0; --i) { deleteChannel(i); }
getMixer()->clearChannel(0);

m_mixerChannelViews[0]->reset();

refreshDisplay();
}

Expand Down
4 changes: 2 additions & 2 deletions src/gui/widgets/Fader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,22 +207,22 @@ void Fader::wheelEvent (QWheelEvent* ev)
///
void Fader::setPeak(float fPeak, float& targetPeak, float& persistentPeak, QElapsedTimer& lastPeakTimer)
{
fPeak = std::clamp(fPeak, m_fMinPeak, m_fMaxPeak);

if (targetPeak != fPeak)
{
targetPeak = fPeak;
if (targetPeak >= persistentPeak)
{
persistentPeak = targetPeak;
lastPeakTimer.restart();
emit peakChanged(persistentPeak);
}
update();
}

if (persistentPeak > 0 && lastPeakTimer.elapsed() > 1500)
{
persistentPeak = qMax<float>(0, persistentPeak-0.05);
emit peakChanged(persistentPeak);
update();
}
}
Expand Down
84 changes: 84 additions & 0 deletions src/gui/widgets/PeakIndicator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* PeakIndicator.cpp - Peak indicator widget
*
* Copyright (c) 2024- Michael Gregorius
*
* This file is part of LMMS - https://lmms.io
*
* 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 (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/

#include "PeakIndicator.h"

#include "lmms_math.h"

#include <QBoxLayout>
#include <QMouseEvent>


namespace lmms::gui
{

PeakIndicator::PeakIndicator(QWidget* parent) :
QLabel(parent),
m_peak(0.f)
{
setAlignment(Qt::AlignCenter);

updatePeakDisplay();
}

void PeakIndicator::resetPeakToMinusInf()
{
m_peak = 0;
updatePeakDisplay();
}

void PeakIndicator::updatePeak(float peak)
{
if (peak > m_peak)
{
m_peak = peak;
updatePeakDisplay();
}
}

void PeakIndicator::mousePressEvent(QMouseEvent* e)
{
if (e->buttons() & Qt::LeftButton)
{
resetPeakToMinusInf();
}
}

void PeakIndicator::updatePeakDisplay()
{
// Treat everything below -144 dbFS as -inf. Otherwise some residual signals show up
// in the form of very small dbFS values, e.g. -857.1 dbFS.
// TODO Make the threshold configurable in the settings?
if (m_peak <= dbfsToAmp(-144.))
{
setText(tr("-inf"));
}
else
{
auto dbfs = ampToDbfs(m_peak);
setText(QString::number(dbfs, 'f', 1));
}
}

} // namespace lmms::gui
Loading