mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-19 09:39:15 +00:00
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:
parent
ae5ac8fa82
commit
cec8061d83
|
@ -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)
|
||||
|
|
|
@ -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'"
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue