From 3c5e2ddc37f40fe3f44788ca8000ebe258abcd00 Mon Sep 17 00:00:00 2001 From: Ford Smith Date: Mon, 22 Mar 2021 01:20:11 -0400 Subject: [PATCH] UI: Undo/Redo audio Implements undo/redo for advanced audio properties. --- UI/window-basic-main.cpp | 95 ++++++++++++++++++++++++++++++++++++++++ UI/window-basic-main.hpp | 1 + 2 files changed, 96 insertions(+) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 2ac4236e0..ccf4d277f 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -934,6 +934,13 @@ void OBSBasic::Load(const char *file) return; } + LoadData(data, file); +} + +void OBSBasic::LoadData(obs_data_t *data, const char *file) +{ + disableSaving++; + ClearSceneData(); InitDefaultTransitions(); ClearContextBar(); @@ -4567,6 +4574,47 @@ void OBSBasic::on_action_Settings_triggered() } } +void save_audio_source(int channel, obs_data_t *save) +{ + obs_source_t *source = obs_get_output_source(channel); + if (!source) + return; + + obs_data_t *obj = obs_data_create(); + + obs_data_set_double(obj, "vol", obs_source_get_volume(source)); + obs_data_set_double(obj, "balance", + obs_source_get_balance_value(source)); + obs_data_set_double(obj, "mixers", obs_source_get_audio_mixers(source)); + obs_data_set_double(obj, "sync", obs_source_get_sync_offset(source)); + obs_data_set_double(obj, "flags", obs_source_get_flags(source)); + + obs_data_set_obj(save, std::to_string(channel).c_str(), obj); + obs_data_release(obj); + obs_source_release(source); +} + +void load_audio_source(int channel, obs_data_t *data) +{ + obs_source_t *source = obs_get_output_source(channel); + if (!source) + return; + + obs_data_t *save = + obs_data_get_obj(data, std::to_string(channel).c_str()); + + obs_source_set_volume(source, obs_data_get_double(save, "vol")); + obs_source_set_balance_value(source, + obs_data_get_double(save, "balance")); + obs_source_set_audio_mixers(source, + obs_data_get_double(save, "mixers")); + obs_source_set_sync_offset(source, obs_data_get_double(save, "sync")); + obs_source_set_flags(source, obs_data_get_double(save, "flags")); + + obs_data_release(save); + obs_source_release(source); +} + void OBSBasic::on_actionAdvAudioProperties_triggered() { if (advAudioWindow != nullptr) { @@ -4584,6 +4632,53 @@ 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, + NULL); + + obs_data_release(wrapper); + }); + + obs_data_release(wrapper); } void OBSBasic::AdvAudioPropsClicked() diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index d47a77d9d..4682de1cf 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -314,6 +314,7 @@ private: void UploadLog(const char *subdir, const char *file, const bool crash); void Save(const char *file); + void LoadData(obs_data_t *data, const char *file); void Load(const char *file); void InitHotkeys();