Browse Source

Revert "UI: Update volume controls by callback"

This reverts commit 0a3cd8fbf6315728db7c4061081df16b4c29afe8.

Causes volume levels to freeze if audio stops.
jp9000 4 years ago
parent
commit
2be0d6b8ef
2 changed files with 8 additions and 25 deletions
  1. 3 19
      UI/volume-control.cpp
  2. 5 6
      UI/volume-control.hpp

+ 3 - 19
UI/volume-control.cpp

@@ -601,6 +601,8 @@ VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter,
 	updateTimerRef = updateTimer.toStrongRef();
 	if (!updateTimerRef) {
 		updateTimerRef = QSharedPointer<VolumeMeterTimer>::create();
+		updateTimerRef->setTimerType(Qt::PreciseTimer);
+		updateTimerRef->start(16);
 		updateTimer = updateTimerRef;
 	}
 
@@ -631,8 +633,6 @@ 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,23 +1141,7 @@ void VolumeMeterTimer::RemoveVolControl(VolumeMeter *meter)
 	volumeMeters.removeOne(meter);
 }
 
-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()
+void VolumeMeterTimer::timerEvent(QTimerEvent *)
 {
 	for (VolumeMeter *meter : volumeMeters)
 		meter->update();

+ 5 - 6
UI/volume-control.hpp

@@ -4,6 +4,7 @@
 #include <QWidget>
 #include <QPaintEvent>
 #include <QSharedPointer>
+#include <QTimer>
 #include <QMutex>
 #include <QList>
 #include <QMenu>
@@ -185,20 +186,18 @@ protected:
 	void paintEvent(QPaintEvent *event) override;
 };
 
-class VolumeMeterTimer : public QObject {
+class VolumeMeterTimer : public QTimer {
 	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<VolumeMeter *> volumeMeters;
-	std::atomic<uint64_t> lastUpdate = 0;
 };
 
 class QLabel;