Просмотр исходного кода

frontend: Update previewed sources in mixer by visibility

Warchamp7 2 недель назад
Родитель
Сommit
f53c843ac0
2 измененных файлов с 51 добавлено и 0 удалено
  1. 48 0
      frontend/widgets/AudioMixer.cpp
  2. 3 0
      frontend/widgets/AudioMixer.hpp

+ 48 - 0
frontend/widgets/AudioMixer.cpp

@@ -260,6 +260,7 @@ AudioMixer::AudioMixer(QWidget *parent) : QFrame(parent)
 
 	updateShowToolbar();
 	updatePreviewSources();
+	updatePreviewHandlers();
 	updateGlobalSources();
 
 	reloadVolumeControls();
@@ -413,6 +414,10 @@ void AudioMixer::updatePreviewSources()
 		}
 
 		auto getPreviewSources = [this](obs_scene_t *, obs_sceneitem_t *item) {
+			if (!obs_sceneitem_visible(item)) {
+				return true;
+			}
+
 			obs_source_t *source = obs_sceneitem_get_source(item);
 			if (!source) {
 				return true;
@@ -882,6 +887,7 @@ void AudioMixer::handleFrontendEvent(obs_frontend_event event)
 	case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED:
 	case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED:
 		updatePreviewSources();
+		updatePreviewHandlers();
 		queueLayoutUpdate();
 		break;
 	case OBS_FRONTEND_EVENT_EXIT:
@@ -892,6 +898,24 @@ void AudioMixer::handleFrontendEvent(obs_frontend_event event)
 	}
 }
 
+void AudioMixer::updatePreviewHandlers()
+{
+	previewSignals.clear();
+
+	bool isStudioMode = obs_frontend_preview_program_mode_active();
+	if (isStudioMode) {
+		OBSSourceAutoRelease previewSource = obs_frontend_get_current_preview_scene();
+		if (!previewSource) {
+			return;
+		}
+
+		previewSignals.reserve(1);
+
+		previewSignals.emplace_back(obs_source_get_signal_handler(previewSource), "item_visible",
+					    AudioMixer::obsSceneItemVisibleChange, this);
+	}
+}
+
 void AudioMixer::updateShowInactive()
 {
 	bool settingShowInactive = config_get_bool(App()->GetUserConfig(), "BasicWindow", "MixerShowInactive");
@@ -1029,3 +1053,27 @@ void AudioMixer::obsSourceRename(void *data, calldata_t *)
 {
 	QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "queueLayoutUpdate", Qt::QueuedConnection);
 }
+
+void AudioMixer::obsSceneItemVisibleChange(void *data, calldata_t *params)
+{
+	obs_sceneitem_t *sceneItem = static_cast<obs_sceneitem_t *>(calldata_ptr(params, "item"));
+	if (!sceneItem) {
+		return;
+	}
+
+	obs_source_t *source = obs_sceneitem_get_source(sceneItem);
+	if (!source) {
+		return;
+	}
+
+	uint32_t flags = obs_source_get_output_flags(source);
+
+	if (flags & OBS_SOURCE_AUDIO) {
+		QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "updatePreviewSources",
+					  Qt::QueuedConnection);
+
+		auto uuidPointer = obs_source_get_uuid(source);
+		QMetaObject::invokeMethod(static_cast<AudioMixer *>(data), "updateControlVisibility",
+					  Qt::QueuedConnection, Q_ARG(QString, QString::fromUtf8(uuidPointer)));
+	}
+}

+ 3 - 0
frontend/widgets/AudioMixer.hpp

@@ -56,8 +56,10 @@ public:
 
 private:
 	std::vector<OBSSignal> signalHandlers;
+	std::vector<OBSSignal> previewSignals;
 	static void onFrontendEvent(enum obs_frontend_event event, void *data);
 	void handleFrontendEvent(enum obs_frontend_event event);
+	void updatePreviewHandlers();
 
 	std::unordered_map<QString, QPointer<VolumeControl>> volumeList;
 	void addControlForUuid(QString uuid);
@@ -124,6 +126,7 @@ private:
 	static void obsSourceCreate(void *data, calldata_t *params);
 	static void obsSourceRemove(void *data, calldata_t *params);
 	static void obsSourceRename(void *data, calldata_t *params);
+	static void obsSceneItemVisibleChange(void *data, calldata_t *params);
 
 private slots:
 	void sourceCreated(QString uuid);