| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- #pragma once
- #include <obs.hpp>
- #include <QWidget>
- #include <QPaintEvent>
- #include <QSharedPointer>
- #include <QTimer>
- #include <QMutex>
- #include <QList>
- class QPushButton;
- class VolumeMeterTimer;
- class VolumeMeter : public QWidget
- {
- Q_OBJECT
- Q_PROPERTY(QColor backgroundNominalColor
- READ getBackgroundNominalColor
- WRITE setBackgroundNominalColor DESIGNABLE true)
- Q_PROPERTY(QColor backgroundWarningColor
- READ getBackgroundWarningColor
- WRITE setBackgroundWarningColor DESIGNABLE true)
- Q_PROPERTY(QColor backgroundErrorColor
- READ getBackgroundErrorColor
- WRITE setBackgroundErrorColor DESIGNABLE true)
- Q_PROPERTY(QColor foregroundNominalColor
- READ getForegroundNominalColor
- WRITE setForegroundNominalColor DESIGNABLE true)
- Q_PROPERTY(QColor foregroundWarningColor
- READ getForegroundWarningColor
- WRITE setForegroundWarningColor DESIGNABLE true)
- Q_PROPERTY(QColor foregroundErrorColor
- READ getForegroundErrorColor
- WRITE setForegroundErrorColor DESIGNABLE true)
- Q_PROPERTY(QColor clipColor
- READ getClipColor
- WRITE setClipColor DESIGNABLE true)
- Q_PROPERTY(QColor magnitudeColor
- READ getMagnitudeColor
- WRITE setMagnitudeColor DESIGNABLE true)
- Q_PROPERTY(QColor majorTickColor
- READ getMajorTickColor
- WRITE setMajorTickColor DESIGNABLE true)
- Q_PROPERTY(QColor minorTickColor
- READ getMinorTickColor
- WRITE setMinorTickColor DESIGNABLE true)
- // Levels are denoted in dBFS.
- Q_PROPERTY(qreal minimumLevel
- READ getMinimumLevel
- WRITE setMinimumLevel DESIGNABLE true)
- Q_PROPERTY(qreal warningLevel
- READ getWarningLevel
- WRITE setWarningLevel DESIGNABLE true)
- Q_PROPERTY(qreal errorLevel
- READ getErrorLevel
- WRITE setErrorLevel DESIGNABLE true)
- Q_PROPERTY(qreal clipLevel
- READ getClipLevel
- WRITE setClipLevel DESIGNABLE true)
- Q_PROPERTY(qreal minimumInputLevel
- READ getMinimumInputLevel
- WRITE setMinimumInputLevel DESIGNABLE true)
- // Rates are denoted in dB/second.
- Q_PROPERTY(qreal peakDecayRate
- READ getPeakDecayRate
- WRITE setPeakDecayRate DESIGNABLE true)
- // Time in seconds for the VU meter to integrate over.
- Q_PROPERTY(qreal magnitudeIntegrationTime
- READ getMagnitudeIntegrationTime
- WRITE setMagnitudeIntegrationTime DESIGNABLE true)
- // Duration is denoted in seconds.
- Q_PROPERTY(qreal peakHoldDuration
- READ getPeakHoldDuration
- WRITE setPeakHoldDuration DESIGNABLE true)
- Q_PROPERTY(qreal inputPeakHoldDuration
- READ getInputPeakHoldDuration
- WRITE setInputPeakHoldDuration DESIGNABLE true)
- private slots:
- void ClipEnding();
- private:
- obs_volmeter_t *obs_volmeter;
- static QWeakPointer<VolumeMeterTimer> updateTimer;
- QSharedPointer<VolumeMeterTimer> updateTimerRef;
- inline void resetLevels();
- inline void handleChannelCofigurationChange();
- inline bool detectIdle(uint64_t ts);
- inline void calculateBallistics(uint64_t ts,
- qreal timeSinceLastRedraw=0.0);
- inline void calculateBallisticsForChannel(int channelNr,
- uint64_t ts, qreal timeSinceLastRedraw);
- void paintInputMeter(QPainter &painter, int x, int y, int width,
- int height, float peakHold);
- void paintHMeter(QPainter &painter, int x, int y, int width, int height,
- float magnitude, float peak, float peakHold);
- void paintHTicks(QPainter &painter, int x, int y, int width,
- int height);
- void paintVMeter(QPainter &painter, int x, int y, int width, int height,
- float magnitude, float peak, float peakHold);
- void paintVTicks(QPainter &painter, int x, int y, int height);
- QMutex dataMutex;
- uint64_t currentLastUpdateTime = 0;
- float currentMagnitude[MAX_AUDIO_CHANNELS];
- float currentPeak[MAX_AUDIO_CHANNELS];
- float currentInputPeak[MAX_AUDIO_CHANNELS];
- QPixmap *tickPaintCache = nullptr;
- int displayNrAudioChannels = 0;
- float displayMagnitude[MAX_AUDIO_CHANNELS];
- float displayPeak[MAX_AUDIO_CHANNELS];
- float displayPeakHold[MAX_AUDIO_CHANNELS];
- uint64_t displayPeakHoldLastUpdateTime[MAX_AUDIO_CHANNELS];
- float displayInputPeakHold[MAX_AUDIO_CHANNELS];
- uint64_t displayInputPeakHoldLastUpdateTime[MAX_AUDIO_CHANNELS];
- QFont tickFont;
- QColor backgroundNominalColor;
- QColor backgroundWarningColor;
- QColor backgroundErrorColor;
- QColor foregroundNominalColor;
- QColor foregroundWarningColor;
- QColor foregroundErrorColor;
- QColor clipColor;
- QColor magnitudeColor;
- QColor majorTickColor;
- QColor minorTickColor;
- qreal minimumLevel;
- qreal warningLevel;
- qreal errorLevel;
- qreal clipLevel;
- qreal minimumInputLevel;
- qreal peakDecayRate;
- qreal magnitudeIntegrationTime;
- qreal peakHoldDuration;
- qreal inputPeakHoldDuration;
- uint64_t lastRedrawTime = 0;
- int channels = 0;
- bool clipping = false;
- bool vertical;
- public:
- explicit VolumeMeter(QWidget *parent = nullptr,
- obs_volmeter_t *obs_volmeter = nullptr,
- bool vertical = false);
- ~VolumeMeter();
- void setLevels(
- const float magnitude[MAX_AUDIO_CHANNELS],
- const float peak[MAX_AUDIO_CHANNELS],
- const float inputPeak[MAX_AUDIO_CHANNELS]);
- QColor getBackgroundNominalColor() const;
- void setBackgroundNominalColor(QColor c);
- QColor getBackgroundWarningColor() const;
- void setBackgroundWarningColor(QColor c);
- QColor getBackgroundErrorColor() const;
- void setBackgroundErrorColor(QColor c);
- QColor getForegroundNominalColor() const;
- void setForegroundNominalColor(QColor c);
- QColor getForegroundWarningColor() const;
- void setForegroundWarningColor(QColor c);
- QColor getForegroundErrorColor() const;
- void setForegroundErrorColor(QColor c);
- QColor getClipColor() const;
- void setClipColor(QColor c);
- QColor getMagnitudeColor() const;
- void setMagnitudeColor(QColor c);
- QColor getMajorTickColor() const;
- void setMajorTickColor(QColor c);
- QColor getMinorTickColor() const;
- void setMinorTickColor(QColor c);
- qreal getMinimumLevel() const;
- void setMinimumLevel(qreal v);
- qreal getWarningLevel() const;
- void setWarningLevel(qreal v);
- qreal getErrorLevel() const;
- void setErrorLevel(qreal v);
- qreal getClipLevel() const;
- void setClipLevel(qreal v);
- qreal getMinimumInputLevel() const;
- void setMinimumInputLevel(qreal v);
- qreal getPeakDecayRate() const;
- void setPeakDecayRate(qreal v);
- qreal getMagnitudeIntegrationTime() const;
- void setMagnitudeIntegrationTime(qreal v);
- qreal getPeakHoldDuration() const;
- void setPeakHoldDuration(qreal v);
- qreal getInputPeakHoldDuration() const;
- void setInputPeakHoldDuration(qreal v);
- void setPeakMeterType(enum obs_peak_meter_type peakMeterType);
- virtual void mousePressEvent(QMouseEvent *event) override;
- virtual void wheelEvent(QWheelEvent *event) override;
- virtual void leaveEvent(QEvent *event) override;
- protected:
- void paintEvent(QPaintEvent *event) override;
- };
- class VolumeMeterTimer : public QTimer {
- Q_OBJECT
- public:
- inline VolumeMeterTimer() : QTimer() {}
- void AddVolControl(VolumeMeter *meter);
- void RemoveVolControl(VolumeMeter *meter);
- protected:
- void timerEvent(QTimerEvent *event) override;
- QList<VolumeMeter*> volumeMeters;
- };
- class QLabel;
- class QSlider;
- class MuteCheckBox;
- class VolControl : public QWidget {
- Q_OBJECT
- private:
- OBSSource source;
- QLabel *nameLabel;
- QLabel *volLabel;
- VolumeMeter *volMeter;
- QSlider *slider;
- MuteCheckBox *mute;
- QPushButton *config = nullptr;
- float levelTotal;
- float levelCount;
- obs_fader_t *obs_fader;
- obs_volmeter_t *obs_volmeter;
- bool vertical;
- static void OBSVolumeChanged(void *param, float db);
- static void OBSVolumeLevel(void *data,
- const float magnitude[MAX_AUDIO_CHANNELS],
- const float peak[MAX_AUDIO_CHANNELS],
- const float inputPeak[MAX_AUDIO_CHANNELS]);
- static void OBSVolumeMuted(void *data, calldata_t *calldata);
- void EmitConfigClicked();
- private slots:
- void VolumeChanged();
- void VolumeMuted(bool muted);
- void SetMuted(bool checked);
- void SliderChanged(int vol);
- void updateText();
- signals:
- void ConfigClicked();
- public:
- explicit VolControl(OBSSource source, bool showConfig = false,
- bool vertical = false);
- ~VolControl();
- inline obs_source_t *GetSource() const {return source;}
- QString GetName() const;
- void SetName(const QString &newName);
- void SetMeterDecayRate(qreal q);
- void setPeakMeterType(enum obs_peak_meter_type peakMeterType);
- };
|