diff --git a/UI/volume-control.cpp b/UI/volume-control.cpp index 56e5631d1..660ec8b25 100644 --- a/UI/volume-control.cpp +++ b/UI/volume-control.cpp @@ -601,8 +601,6 @@ VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter, updateTimerRef = updateTimer.toStrongRef(); if (!updateTimerRef) { updateTimerRef = QSharedPointer::create(); - updateTimerRef->setTimerType(Qt::PreciseTimer); - updateTimerRef->start(16); updateTimer = updateTimerRef; } @@ -633,6 +631,8 @@ void VolumeMeter::setLevels(const float magnitude[MAX_AUDIO_CHANNELS], // that the ballistics of peak and hold are recalculated. locker.unlock(); calculateBallistics(ts); + + updateTimerRef->SignalUpdate(); } inline void VolumeMeter::resetLevels() @@ -1141,7 +1141,23 @@ void VolumeMeterTimer::RemoveVolControl(VolumeMeter *meter) volumeMeters.removeOne(meter); } -void VolumeMeterTimer::timerEvent(QTimerEvent *) +void VolumeMeterTimer::SignalUpdate() +{ + const uint64_t current = os_gettime_ns(); + uint64_t previous = lastUpdate.load(); + uint64_t next = previous + 16666666; + if (current > next) { + if (current - next > 100000000) { + next = current; + } + + if (lastUpdate.compare_exchange_strong(previous, next)) { + QMetaObject::invokeMethod(this, "UpdateMeters"); + } + } +} + +void VolumeMeterTimer::UpdateMeters() { for (VolumeMeter *meter : volumeMeters) meter->update(); diff --git a/UI/volume-control.hpp b/UI/volume-control.hpp index 778c5354b..e27dc8fe3 100644 --- a/UI/volume-control.hpp +++ b/UI/volume-control.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include @@ -186,18 +185,20 @@ protected: void paintEvent(QPaintEvent *event) override; }; -class VolumeMeterTimer : public QTimer { +class VolumeMeterTimer : public QObject { Q_OBJECT public: - inline VolumeMeterTimer() : QTimer() {} - void AddVolControl(VolumeMeter *meter); void RemoveVolControl(VolumeMeter *meter); + void SignalUpdate(); + +protected slots: + void UpdateMeters(); protected: - void timerEvent(QTimerEvent *event) override; QList volumeMeters; + std::atomic lastUpdate = 0; }; class QLabel;