volume-control.hpp 2.7 KB

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