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.
This commit is contained in:
jp9000 2021-04-27 21:08:08 -07:00
parent ae5ac8fa82
commit cec8061d83
3 changed files with 138 additions and 62 deletions

View file

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

View file

@ -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'"

View file

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