Procházet zdrojové kódy

UI: Hold the clip flash for at least one second

Holds the clipping flash for one second to better indicate that clipping
is occurring.

Closes obsproject/obs-studio#1201
jp9000 před 7 roky
rodič
revize
0d4677f3bc
2 změnil soubory, kde provedl 21 přidání a 0 odebrání
  1. 17 0
      UI/volume-control.cpp
  2. 4 0
      UI/volume-control.hpp

+ 17 - 0
UI/volume-control.cpp

@@ -653,6 +653,13 @@ void VolumeMeter::paintTicks(QPainter &painter, int x, int y,
 	}
 }
 
+#define CLIP_FLASH_DURATION_MS 1000
+
+void VolumeMeter::ClipEnding()
+{
+	clipping = false;
+}
+
 void VolumeMeter::paintMeter(QPainter &painter, int x, int y,
 	int width, int height, float magnitude, float peak, float peakHold)
 {
@@ -672,6 +679,10 @@ void VolumeMeter::paintMeter(QPainter &painter, int x, int y,
 	int errorLength         = maximumPosition - errorPosition;
 	locker.unlock();
 
+	if (clipping) {
+		peakPosition = maximumPosition;
+	}
+
 	if (peakPosition < minimumPosition) {
 		painter.fillRect(
 			minimumPosition, y,
@@ -740,6 +751,12 @@ void VolumeMeter::paintMeter(QPainter &painter, int x, int y,
 			backgroundErrorColor);
 
 	} else {
+		if (!clipping) {
+			QTimer::singleShot(CLIP_FLASH_DURATION_MS, this,
+					SLOT(ClipEnding()));
+			clipping = true;
+		}
+
 		qreal end = errorLength + warningLength + nominalLength;
 		painter.fillRect(
 			minimumPosition, y,

+ 4 - 0
UI/volume-control.hpp

@@ -79,6 +79,9 @@ class VolumeMeter : public QWidget
 		READ getInputPeakHoldDuration
 		WRITE setInputPeakHoldDuration DESIGNABLE true)
 
+private slots:
+	void ClipEnding();
+
 private:
 	obs_volmeter_t *obs_volmeter;
 	static QWeakPointer<VolumeMeterTimer> updateTimer;
@@ -137,6 +140,7 @@ private:
 	qreal inputPeakHoldDuration;
 
 	uint64_t lastRedrawTime = 0;
+	bool clipping = false;
 
 public:
 	explicit VolumeMeter(QWidget *parent = 0,