Explorar o código

UI: Add Undo/Redo items for adv. audio properties

Rather than forcing the user to close the advanced audio properties
window in order to obtain an undo/redo action, use explicit undo/redo
actions for each widget change in the advanced audio properties dialog.
jp9000 %!s(int64=4) %!d(string=hai) anos
pai
achega
cec8061d83
Modificáronse 3 ficheiros con 139 adicións e 63 borrados
  1. 131 16
      UI/adv-audio-control.cpp
  2. 8 1
      UI/data/locale/en-US.ini
  3. 0 46
      UI/window-basic-main.cpp

+ 131 - 16
UI/adv-audio-control.cpp

@@ -395,6 +395,8 @@ void OBSAdvAudioCtrl::SourceMixersChanged(uint32_t mixers)
 
 void OBSAdvAudioCtrl::volumeChanged(double db)
 {
+	float prev = obs_source_get_volume(source);
+
 	if (db < MIN_DB) {
 		volume->setSpecialValueText("-inf dB");
 		db = -INFINITY;
@@ -402,30 +404,87 @@ void OBSAdvAudioCtrl::volumeChanged(double db)
 
 	float val = obs_db_to_mul(db);
 	obs_source_set_volume(source, val);
+
+	auto undo_redo = [](const std::string &name, float val) {
+		obs_source_t *source = obs_get_source_by_name(name.c_str());
+		obs_source_set_volume(source, val);
+		obs_source_release(source);
+	};
+
+	const char *name = obs_source_get_name(source);
+
+	OBSBasic *main = OBSBasic::Get();
+	main->undo_s.add_action(
+		QTStr("Undo.Volume.Change").arg(name),
+		std::bind(undo_redo, std::placeholders::_1, prev),
+		std::bind(undo_redo, std::placeholders::_1, val), name, name,
+		true);
 }
 
 void OBSAdvAudioCtrl::percentChanged(int percent)
 {
-	obs_source_set_volume(source, (float)percent / 100.0f);
+	float prev = obs_source_get_volume(source);
+	float val = (float)percent / 100.0f;
+
+	obs_source_set_volume(source, val);
+
+	auto undo_redo = [](const std::string &name, float val) {
+		obs_source_t *source = obs_get_source_by_name(name.c_str());
+		obs_source_set_volume(source, val);
+		obs_source_release(source);
+	};
+
+	const char *name = obs_source_get_name(source);
+	OBSBasic::Get()->undo_s.add_action(
+		QTStr("Undo.Volume.Change").arg(name),
+		std::bind(undo_redo, std::placeholders::_1, prev),
+		std::bind(undo_redo, std::placeholders::_1, val), name, name,
+		true);
+}
+
+static inline void set_mono(obs_source_t *source, bool mono)
+{
+	uint32_t flags = obs_source_get_flags(source);
+	if (mono)
+		flags |= OBS_SOURCE_FLAG_FORCE_MONO;
+	else
+		flags &= ~OBS_SOURCE_FLAG_FORCE_MONO;
+	obs_source_set_flags(source, flags);
 }
 
-void OBSAdvAudioCtrl::downmixMonoChanged(bool checked)
+void OBSAdvAudioCtrl::downmixMonoChanged(bool val)
 {
 	uint32_t flags = obs_source_get_flags(source);
 	bool forceMonoActive = (flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0;
 
-	if (forceMonoActive != checked) {
-		if (checked)
-			flags |= OBS_SOURCE_FLAG_FORCE_MONO;
-		else
-			flags &= ~OBS_SOURCE_FLAG_FORCE_MONO;
+	if (forceMonoActive == val)
+		return;
 
-		obs_source_set_flags(source, flags);
-	}
+	if (val)
+		flags |= OBS_SOURCE_FLAG_FORCE_MONO;
+	else
+		flags &= ~OBS_SOURCE_FLAG_FORCE_MONO;
+
+	obs_source_set_flags(source, flags);
+
+	auto undo_redo = [](const std::string &name, bool val) {
+		obs_source_t *source = obs_get_source_by_name(name.c_str());
+		set_mono(source, val);
+		obs_source_release(source);
+	};
+
+	QString text = QTStr(val ? "Undo.ForceMono.On" : "Undo.ForceMono.Off");
+
+	const char *name = obs_source_get_name(source);
+	OBSBasic::Get()->undo_s.add_action(
+		text.arg(name),
+		std::bind(undo_redo, std::placeholders::_1, !val),
+		std::bind(undo_redo, std::placeholders::_1, val), name, name);
 }
 
 void OBSAdvAudioCtrl::balanceChanged(int val)
 {
+	float prev = obs_source_get_balance_value(source);
 	float bal = (float)val / 100.0f;
 
 	if (abs(50 - val) < 10) {
@@ -436,6 +495,19 @@ void OBSAdvAudioCtrl::balanceChanged(int val)
 	}
 
 	obs_source_set_balance_value(source, bal);
+
+	auto undo_redo = [](const std::string &name, float val) {
+		obs_source_t *source = obs_get_source_by_name(name.c_str());
+		obs_source_set_balance_value(source, val);
+		obs_source_release(source);
+	};
+
+	const char *name = obs_source_get_name(source);
+	OBSBasic::Get()->undo_s.add_action(
+		QTStr("Undo.Balance.Change").arg(name),
+		std::bind(undo_redo, std::placeholders::_1, prev),
+		std::bind(undo_redo, std::placeholders::_1, bal), name, name,
+		true);
 }
 
 void OBSAdvAudioCtrl::ResetBalance()
@@ -445,17 +517,35 @@ void OBSAdvAudioCtrl::ResetBalance()
 
 void OBSAdvAudioCtrl::syncOffsetChanged(int milliseconds)
 {
-	int64_t cur_val = obs_source_get_sync_offset(source);
-
-	if (cur_val / NSEC_PER_MSEC != milliseconds)
-		obs_source_set_sync_offset(source, int64_t(milliseconds) *
-							   NSEC_PER_MSEC);
+	int64_t prev = obs_source_get_sync_offset(source);
+	int64_t val = int64_t(milliseconds) * NSEC_PER_MSEC;
+
+	if (prev / NSEC_PER_MSEC == milliseconds)
+		return;
+
+	obs_source_set_sync_offset(source, val);
+
+	auto undo_redo = [](const std::string &name, int64_t val) {
+		obs_source_t *source = obs_get_source_by_name(name.c_str());
+		obs_source_set_sync_offset(source, val);
+		obs_source_release(source);
+	};
+
+	const char *name = obs_source_get_name(source);
+	OBSBasic::Get()->undo_s.add_action(
+		QTStr("Undo.SyncOffset.Change").arg(name),
+		std::bind(undo_redo, std::placeholders::_1, prev),
+		std::bind(undo_redo, std::placeholders::_1, val), name, name,
+		true);
 }
 
 void OBSAdvAudioCtrl::monitoringTypeChanged(int index)
 {
-	int mt = monitoringType->itemData(index).toInt();
-	obs_source_set_monitoring_type(source, (obs_monitoring_type)mt);
+	obs_monitoring_type prev = obs_source_get_monitoring_type(source);
+
+	obs_monitoring_type mt =
+		(obs_monitoring_type)monitoringType->itemData(index).toInt();
+	obs_source_set_monitoring_type(source, mt);
 
 	const char *type = nullptr;
 
@@ -473,6 +563,18 @@ void OBSAdvAudioCtrl::monitoringTypeChanged(int index)
 
 	blog(LOG_INFO, "User changed audio monitoring for source '%s' to: %s",
 	     obs_source_get_name(source), type);
+
+	auto undo_redo = [](const std::string &name, obs_monitoring_type val) {
+		obs_source_t *source = obs_get_source_by_name(name.c_str());
+		obs_source_set_monitoring_type(source, val);
+		obs_source_release(source);
+	};
+
+	const char *name = obs_source_get_name(source);
+	OBSBasic::Get()->undo_s.add_action(
+		QTStr("Undo.MonitoringType.Change").arg(name),
+		std::bind(undo_redo, std::placeholders::_1, prev),
+		std::bind(undo_redo, std::placeholders::_1, mt), name, name);
 }
 
 static inline void setMixer(obs_source_t *source, const int mixerIdx,
@@ -487,6 +589,19 @@ static inline void setMixer(obs_source_t *source, const int mixerIdx,
 		new_mixers &= ~(1 << mixerIdx);
 
 	obs_source_set_audio_mixers(source, new_mixers);
+
+	auto undo_redo = [](const std::string &name, uint32_t mixers) {
+		obs_source_t *source = obs_get_source_by_name(name.c_str());
+		obs_source_set_audio_mixers(source, mixers);
+		obs_source_release(source);
+	};
+
+	const char *name = obs_source_get_name(source);
+	OBSBasic::Get()->undo_s.add_action(
+		QTStr("Undo.Mixers.Change").arg(name),
+		std::bind(undo_redo, std::placeholders::_1, mixers),
+		std::bind(undo_redo, std::placeholders::_1, new_mixers), name,
+		name);
 }
 
 void OBSAdvAudioCtrl::mixer1Changed(bool checked)

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

@@ -287,7 +287,14 @@ Undo.Transform.Center="Center to Screen in '%1'"
 Undo.Transform.VCenter="Vertical Center to Screen in '%1'"
 Undo.Transform.HCenter="Horizontal Center to Screen in '%1'"
 Undo.Volume.Change="Volume Change on '%1'"
-Undo.Audio="Audio Changes"
+Undo.Volume.Mute="Mute '%1'"
+Undo.Volume.Unmute="Unmute '%1'"
+Undo.Balance.Change="Audio Balance Change on '%1'"
+Undo.SyncOffset.Change="Audio Sync Offset Change on '%1'"
+Undo.MonitoringType.Change="Change Audio Monitoring on '%1'"
+Undo.Mixers.Change="Change Audio Mixers on '%1'"
+Undo.ForceMono.On="Enable Force Mono on '%1'"
+Undo.ForceMono.Off="Disable Force Mono on '%1'"
 Undo.Properties="Property Change on '%1'"
 Undo.Scene.Duplicate="Duplicate Scene '%1'"
 Undo.ShowTransition="Show Transition on '%1'"

+ 0 - 46
UI/window-basic-main.cpp

@@ -4630,52 +4630,6 @@ void OBSBasic::on_actionAdvAudioProperties_triggered()
 
 	connect(advAudioWindow, SIGNAL(destroyed()), this,
 		SLOT(AdvAudioPropsDestroyed()));
-
-	obs_data_t *wrapper = obs_data_create();
-
-	save_audio_source(1, wrapper);
-	save_audio_source(2, wrapper);
-	save_audio_source(3, wrapper);
-	save_audio_source(4, wrapper);
-	save_audio_source(5, wrapper);
-	save_audio_source(6, wrapper);
-
-	std::string undo_data(obs_data_get_json(wrapper));
-
-	connect(advAudioWindow, &QDialog::finished, [this, undo_data]() {
-		auto undo_redo = [](const std::string &data) {
-			obs_data_t *audio_data =
-				obs_data_create_from_json(data.c_str());
-
-			load_audio_source(1, audio_data);
-			load_audio_source(2, audio_data);
-			load_audio_source(3, audio_data);
-			load_audio_source(4, audio_data);
-			load_audio_source(5, audio_data);
-			load_audio_source(6, audio_data);
-
-			obs_data_release(audio_data);
-		};
-
-		obs_data_t *wrapper = obs_data_create();
-
-		save_audio_source(1, wrapper);
-		save_audio_source(2, wrapper);
-		save_audio_source(3, wrapper);
-		save_audio_source(4, wrapper);
-		save_audio_source(5, wrapper);
-		save_audio_source(6, wrapper);
-
-		std::string redo_data(obs_data_get_json(wrapper));
-
-		if (undo_data.compare(redo_data) != 0)
-			undo_s.add_action(QTStr("Undo.Audio"), undo_redo,
-					  undo_redo, undo_data, redo_data);
-
-		obs_data_release(wrapper);
-	});
-
-	obs_data_release(wrapper);
 }
 
 void OBSBasic::AdvAudioPropsClicked()