Browse Source

UI: Add mute checkbox to volume control

jp9000 10 years ago
parent
commit
2e053c849b
2 changed files with 51 additions and 2 deletions
  1. 44 1
      obs/volume-control.cpp
  2. 7 1
      obs/volume-control.hpp

+ 44 - 1
obs/volume-control.cpp

@@ -1,5 +1,6 @@
 #include "volume-control.hpp"
 #include "qt-wrappers.hpp"
+#include "mute-checkbox.hpp"
 #include <util/platform.h>
 #include <QHBoxLayout>
 #include <QVBoxLayout>
@@ -33,6 +34,15 @@ void VolControl::OBSVolumeLevel(void *data, calldata_t *calldata)
 		Q_ARG(float, peakHold));
 }
 
+void VolControl::OBSVolumeMuted(void *data, calldata_t *calldata)
+{
+	VolControl *volControl = static_cast<VolControl*>(data);
+	bool muted = calldata_bool(calldata, "muted");
+
+	QMetaObject::invokeMethod(volControl, "VolumeMuted",
+			Q_ARG(bool, muted));
+}
+
 void VolControl::VolumeChanged()
 {
 	slider->blockSignals(true);
@@ -44,9 +54,26 @@ void VolControl::VolumeChanged()
 
 void VolControl::VolumeLevel(float mag, float peak, float peakHold)
 {
+	if (obs_source_muted(source) || !obs_source_enabled(source)) {
+		mag = 0.0f;
+		peak = 0.0f;
+		peakHold = 0.0f;
+	}
+
 	volMeter->setLevels(mag, peak, peakHold);
 }
 
+void VolControl::VolumeMuted(bool muted)
+{
+	if (mute->isChecked() != muted)
+		mute->setChecked(muted);
+}
+
+void VolControl::SetMuted(bool checked)
+{
+	obs_source_set_muted(source, checked);
+}
+
 void VolControl::SliderChanged(int vol)
 {
 	obs_fader_set_deflection(obs_fader, float(vol) * 0.01f);
@@ -76,12 +103,14 @@ VolControl::VolControl(OBSSource source_)
 	  obs_fader     (obs_fader_create(OBS_FADER_CUBIC)),
 	  obs_volmeter  (obs_volmeter_create(OBS_FADER_LOG))
 {
+	QHBoxLayout *volLayout  = new QHBoxLayout();
 	QVBoxLayout *mainLayout = new QVBoxLayout();
 	QHBoxLayout *textLayout = new QHBoxLayout();
 
 	nameLabel = new QLabel();
 	volLabel  = new QLabel();
 	volMeter  = new VolumeMeter();
+	mute      = new MuteCheckBox();
 	slider    = new QSlider(Qt::Horizontal);
 
 	QFont font = nameLabel->font();
@@ -101,11 +130,17 @@ VolControl::VolControl(OBSSource source_)
 	textLayout->setAlignment(nameLabel, Qt::AlignLeft);
 	textLayout->setAlignment(volLabel,  Qt::AlignRight);
 
+	mute->setChecked(obs_source_muted(source));
+
+	volLayout->addWidget(slider);
+	volLayout->addWidget(mute);
+	volLayout->setSpacing(5);
+
 	mainLayout->setContentsMargins(4, 4, 4, 4);
 	mainLayout->setSpacing(2);
 	mainLayout->addItem(textLayout);
 	mainLayout->addWidget(volMeter);
-	mainLayout->addWidget(slider);
+	mainLayout->addItem(volLayout);
 
 	setLayout(mainLayout);
 
@@ -115,8 +150,13 @@ VolControl::VolControl(OBSSource source_)
 	signal_handler_connect(obs_volmeter_get_signal_handler(obs_volmeter),
 			"levels_updated", OBSVolumeLevel, this);
 
+	signal_handler_connect(obs_source_get_signal_handler(source),
+			"mute", OBSVolumeMuted, this);
+
 	QWidget::connect(slider, SIGNAL(valueChanged(int)),
 			this, SLOT(SliderChanged(int)));
+	QWidget::connect(mute, SIGNAL(clicked(bool)),
+			this, SLOT(SetMuted(bool)));
 
 	obs_fader_attach_source(obs_fader, source);
 	obs_volmeter_attach_source(obs_volmeter, source);
@@ -133,6 +173,9 @@ VolControl::~VolControl()
 	signal_handler_disconnect(obs_volmeter_get_signal_handler(obs_volmeter),
 			"levels_updated", OBSVolumeLevel, this);
 
+	signal_handler_disconnect(obs_source_get_signal_handler(source),
+			"mute", OBSVolumeMuted, this);
+
 	obs_fader_destroy(obs_fader);
 	obs_volmeter_destroy(obs_volmeter);
 }

+ 7 - 1
obs/volume-control.hpp

@@ -15,7 +15,7 @@ private:
 	float mag, peak, peakHold;
 	QColor bkColor, magColor, peakColor, peakHoldColor;
 	QTimer *resetTimer;
-	
+
 public:
 	explicit VolumeMeter(QWidget *parent = 0);
 	void setLevels(float nmag, float npeak, float npeakHold);
@@ -36,6 +36,7 @@ private slots:
 
 class QLabel;
 class QSlider;
+class MuteCheckBox;
 
 class VolControl : public QWidget {
 	Q_OBJECT
@@ -46,6 +47,7 @@ private:
 	QLabel          *volLabel;
 	VolumeMeter     *volMeter;
 	QSlider         *slider;
+	MuteCheckBox    *mute;
 	float           levelTotal;
 	float           levelCount;
 	obs_fader_t     *obs_fader;
@@ -53,10 +55,14 @@ private:
 
 	static void OBSVolumeChanged(void *param, calldata_t *calldata);
 	static void OBSVolumeLevel(void *data, calldata_t *calldata);
+	static void OBSVolumeMuted(void *data, calldata_t *calldata);
 
 private slots:
 	void VolumeChanged();
+	void VolumeMuted(bool muted);
 	void VolumeLevel(float mag, float peak, float peakHold);
+
+	void SetMuted(bool checked);
 	void SliderChanged(int vol);
 	void updateText();