diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp index 862d746f7..bc080b38f 100644 --- a/UI/adv-audio-control.cpp +++ b/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); } -void OBSAdvAudioCtrl::downmixMonoChanged(bool checked) +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 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); + int64_t prev = obs_source_get_sync_offset(source); + int64_t val = int64_t(milliseconds) * NSEC_PER_MSEC; - if (cur_val / NSEC_PER_MSEC != milliseconds) - obs_source_set_sync_offset(source, 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) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 8b94e8f38..af60c7eae 100644 --- a/UI/data/locale/en-US.ini +++ b/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'" diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 2b2ae83e7..cb65c8402 100644 --- a/UI/window-basic-main.cpp +++ b/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()