瀏覽代碼

UI: Add "Active Sources Only" option to adv audio props

Allows the ability to modify the properties of inactive audio sources
which may in scenes other than the one that is currently active.
Exeldro 5 年之前
父節點
當前提交
9f8dc0e218
共有 3 個文件被更改,包括 66 次插入2 次删除
  1. 1 0
      UI/data/locale/en-US.ini
  2. 59 2
      UI/window-basic-adv-audio.cpp
  3. 6 0
      UI/window-basic-adv-audio.hpp

+ 1 - 0
UI/data/locale/en-US.ini

@@ -876,6 +876,7 @@ Basic.Settings.Advanced.AutoRemux.MP4="(record as mkv)"
 
 
 # advanced audio properties
 # advanced audio properties
 Basic.AdvAudio="Advanced Audio Properties"
 Basic.AdvAudio="Advanced Audio Properties"
+Basic.AdvAudio.ActiveOnly="Active Sources Only"
 Basic.AdvAudio.Name="Name"
 Basic.AdvAudio.Name="Name"
 Basic.AdvAudio.Volume="Volume"
 Basic.AdvAudio.Volume="Volume"
 Basic.AdvAudio.Mono="Mono"
 Basic.AdvAudio.Mono="Mono"

+ 59 - 2
UI/window-basic-adv-audio.cpp

@@ -18,7 +18,8 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
 	  sourceAddedSignal(obs_get_signal_handler(), "source_activate",
 	  sourceAddedSignal(obs_get_signal_handler(), "source_activate",
 			    OBSSourceAdded, this),
 			    OBSSourceAdded, this),
 	  sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate",
 	  sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate",
-			      OBSSourceRemoved, this)
+			      OBSSourceRemoved, this),
+	  showInactive(false)
 {
 {
 	QScrollArea *scrollArea;
 	QScrollArea *scrollArea;
 	QVBoxLayout *vlayout;
 	QVBoxLayout *vlayout;
@@ -70,7 +71,12 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
 
 
 	QPushButton *closeButton = new QPushButton(QTStr("Close"));
 	QPushButton *closeButton = new QPushButton(QTStr("Close"));
 
 
+	activeOnly = new QCheckBox();
+	activeOnly->setChecked(!showInactive);
+	activeOnly->setText(QTStr("Basic.AdvAudio.ActiveOnly"));
+
 	QHBoxLayout *buttonLayout = new QHBoxLayout;
 	QHBoxLayout *buttonLayout = new QHBoxLayout;
+	buttonLayout->addWidget(activeOnly);
 	buttonLayout->addStretch();
 	buttonLayout->addStretch();
 	buttonLayout->addWidget(closeButton);
 	buttonLayout->addWidget(closeButton);
 
 
@@ -80,6 +86,9 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
 	vlayout->addLayout(buttonLayout);
 	vlayout->addLayout(buttonLayout);
 	setLayout(vlayout);
 	setLayout(vlayout);
 
 
+	connect(activeOnly, SIGNAL(clicked(bool)), this,
+		SLOT(ActiveOnlyChanged(bool)));
+
 	connect(closeButton, &QPushButton::clicked, [this]() { close(); });
 	connect(closeButton, &QPushButton::clicked, [this]() { close(); });
 
 
 	installEventFilter(CreateShortcutFilter());
 	installEventFilter(CreateShortcutFilter());
@@ -115,7 +124,8 @@ bool OBSBasicAdvAudio::EnumSources(void *param, obs_source_t *source)
 	OBSBasicAdvAudio *dialog = reinterpret_cast<OBSBasicAdvAudio *>(param);
 	OBSBasicAdvAudio *dialog = reinterpret_cast<OBSBasicAdvAudio *>(param);
 	uint32_t flags = obs_source_get_output_flags(source);
 	uint32_t flags = obs_source_get_output_flags(source);
 
 
-	if ((flags & OBS_SOURCE_AUDIO) != 0 && obs_source_active(source))
+	if ((flags & OBS_SOURCE_AUDIO) != 0 &&
+	    (dialog->showInactive || obs_source_active(source)))
 		dialog->AddAudioSource(source);
 		dialog->AddAudioSource(source);
 
 
 	return true;
 	return true;
@@ -139,6 +149,10 @@ void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata)
 
 
 inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
 inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
 {
 {
+	for (size_t i = 0; i < controls.size(); i++) {
+		if (controls[i]->GetSource() == source)
+			return;
+	}
 	OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source);
 	OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source);
 
 
 	InsertQObjectByName(controls, control);
 	InsertQObjectByName(controls, control);
@@ -217,3 +231,46 @@ void OBSBasicAdvAudio::ShowContextMenu(const QPoint &pos)
 
 
 	contextMenu->exec(mapToGlobal(pos));
 	contextMenu->exec(mapToGlobal(pos));
 }
 }
+
+void OBSBasicAdvAudio::ActiveOnlyChanged(bool checked)
+{
+	SetShowInactive(!checked);
+}
+
+void OBSBasicAdvAudio::SetShowInactive(bool show)
+{
+	if (showInactive == show)
+		return;
+
+	showInactive = show;
+	activeOnly->setChecked(!showInactive);
+	sourceAddedSignal.Disconnect();
+	sourceRemovedSignal.Disconnect();
+
+	if (showInactive) {
+		sourceAddedSignal.Connect(obs_get_signal_handler(),
+					  "source_create", OBSSourceAdded,
+					  this);
+		sourceRemovedSignal.Connect(obs_get_signal_handler(),
+					    "source_remove", OBSSourceRemoved,
+					    this);
+
+		obs_enum_sources(EnumSources, this);
+	} else {
+		sourceAddedSignal.Connect(obs_get_signal_handler(),
+					  "source_activate", OBSSourceAdded,
+					  this);
+		sourceRemovedSignal.Connect(obs_get_signal_handler(),
+					    "source_deactivate",
+					    OBSSourceRemoved, this);
+
+		for (size_t i = 0; i < controls.size(); i++) {
+			const auto source = controls[i]->GetSource();
+			if (!obs_source_active(source)) {
+				delete controls[i];
+				controls.erase(controls.begin() + i);
+				i--;
+			}
+		}
+	}
+}

+ 6 - 0
UI/window-basic-adv-audio.hpp

@@ -3,6 +3,8 @@
 #include <obs.hpp>
 #include <obs.hpp>
 #include <QDialog>
 #include <QDialog>
 #include <vector>
 #include <vector>
+#include <QCheckBox>
+#include <QPointer>
 
 
 class OBSAdvAudioCtrl;
 class OBSAdvAudioCtrl;
 class QGridLayout;
 class QGridLayout;
@@ -15,8 +17,10 @@ class OBSBasicAdvAudio : public QDialog {
 private:
 private:
 	QWidget *controlArea;
 	QWidget *controlArea;
 	QGridLayout *mainLayout;
 	QGridLayout *mainLayout;
+	QPointer<QCheckBox> activeOnly;
 	OBSSignal sourceAddedSignal;
 	OBSSignal sourceAddedSignal;
 	OBSSignal sourceRemovedSignal;
 	OBSSignal sourceRemovedSignal;
+	bool showInactive;
 
 
 	std::vector<OBSAdvAudioCtrl *> controls;
 	std::vector<OBSAdvAudioCtrl *> controls;
 
 
@@ -33,8 +37,10 @@ public slots:
 
 
 	void ShowContextMenu(const QPoint &pos);
 	void ShowContextMenu(const QPoint &pos);
 	void SetVolumeType();
 	void SetVolumeType();
+	void ActiveOnlyChanged(bool checked);
 
 
 public:
 public:
 	OBSBasicAdvAudio(QWidget *parent);
 	OBSBasicAdvAudio(QWidget *parent);
 	~OBSBasicAdvAudio();
 	~OBSBasicAdvAudio();
+	void SetShowInactive(bool showInactive);
 };
 };