UI: Undo/Redo audio

Implements undo/redo for advanced audio properties.
This commit is contained in:
Ford Smith 2021-03-22 01:20:11 -04:00 committed by Ford Smith
parent 3a620c485e
commit 3c5e2ddc37
2 changed files with 96 additions and 0 deletions

View file

@ -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()

View file

@ -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();