volume-control.hpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #pragma once
  2. #include <obs.hpp>
  3. #include <QWidget>
  4. #include <QSharedPointer>
  5. #include <QTimer>
  6. #include <QMutex>
  7. #include <QList>
  8. class QPushButton;
  9. class VolumeMeterTimer;
  10. class VolumeMeter : public QWidget
  11. {
  12. Q_OBJECT
  13. Q_PROPERTY(QColor bkColor READ getBkColor WRITE setBkColor DESIGNABLE true)
  14. Q_PROPERTY(QColor magColor READ getMagColor WRITE setMagColor DESIGNABLE true)
  15. Q_PROPERTY(QColor peakColor READ getPeakColor WRITE setPeakColor DESIGNABLE true)
  16. Q_PROPERTY(QColor peakHoldColor READ getPeakHoldColor WRITE setPeakHoldColor DESIGNABLE true)
  17. Q_PROPERTY(QColor clipColor1 READ getClipColor1 WRITE setClipColor1 DESIGNABLE true)
  18. Q_PROPERTY(QColor clipColor2 READ getClipColor2 WRITE setClipColor2 DESIGNABLE true)
  19. private:
  20. static QWeakPointer<VolumeMeterTimer> updateTimer;
  21. QSharedPointer<VolumeMeterTimer> updateTimerRef;
  22. float curMag = 0.0f, curPeak = 0.0f, curPeakHold = 0.0f;
  23. inline void calcLevels();
  24. QMutex dataMutex;
  25. float mag = 0.0f, peak = 0.0f, peakHold = 0.0f;
  26. float multiple = 0.0f;
  27. uint64_t lastUpdateTime = 0;
  28. QColor bkColor, magColor, peakColor, peakHoldColor;
  29. QColor clipColor1, clipColor2;
  30. public:
  31. explicit VolumeMeter(QWidget *parent = 0);
  32. ~VolumeMeter();
  33. void setLevels(float nmag, float npeak, float npeakHold);
  34. QColor getBkColor() const;
  35. void setBkColor(QColor c);
  36. QColor getMagColor() const;
  37. void setMagColor(QColor c);
  38. QColor getPeakColor() const;
  39. void setPeakColor(QColor c);
  40. QColor getPeakHoldColor() const;
  41. void setPeakHoldColor(QColor c);
  42. QColor getClipColor1() const;
  43. void setClipColor1(QColor c);
  44. QColor getClipColor2() const;
  45. void setClipColor2(QColor c);
  46. protected:
  47. void paintEvent(QPaintEvent *event);
  48. };
  49. class VolumeMeterTimer : public QTimer {
  50. Q_OBJECT
  51. public:
  52. inline VolumeMeterTimer() : QTimer() {}
  53. void AddVolControl(VolumeMeter *meter);
  54. void RemoveVolControl(VolumeMeter *meter);
  55. protected:
  56. virtual void timerEvent(QTimerEvent *event) override;
  57. QList<VolumeMeter*> volumeMeters;
  58. };
  59. class QLabel;
  60. class QSlider;
  61. class MuteCheckBox;
  62. class VolControl : public QWidget {
  63. Q_OBJECT
  64. private:
  65. OBSSource source;
  66. QLabel *nameLabel;
  67. QLabel *volLabel;
  68. VolumeMeter *volMeter;
  69. QSlider *slider;
  70. MuteCheckBox *mute;
  71. QPushButton *config = nullptr;
  72. float levelTotal;
  73. float levelCount;
  74. obs_fader_t *obs_fader;
  75. obs_volmeter_t *obs_volmeter;
  76. static void OBSVolumeChanged(void *param, float db);
  77. static void OBSVolumeLevel(void *data, float level, float mag,
  78. float peak, float muted);
  79. static void OBSVolumeMuted(void *data, calldata_t *calldata);
  80. void EmitConfigClicked();
  81. private slots:
  82. void VolumeChanged();
  83. void VolumeMuted(bool muted);
  84. void SetMuted(bool checked);
  85. void SliderChanged(int vol);
  86. void updateText();
  87. signals:
  88. void ConfigClicked();
  89. public:
  90. VolControl(OBSSource source, bool showConfig = false);
  91. ~VolControl();
  92. inline obs_source_t *GetSource() const {return source;}
  93. QString GetName() const;
  94. void SetName(const QString &newName);
  95. };