diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index 870eea85a..a14e29b51 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -2162,21 +2162,17 @@
-
- -
-
-
- Basic.Settings.Output.UseReplayBuffer
-
-
- true
-
-
-
-
-
+
+
+ true
+
+
+ true
+
ReplayBuffer
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index b1e6bd6fb..60b8dd88f 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -437,7 +437,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->simpleOutRecTrack5, CHECK_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->simpleOutRecTrack6, CHECK_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->simpleOutMuxCustom, EDIT_CHANGED, OUTPUTS_CHANGED);
- HookWidget(ui->simpleReplayBuf, CHECK_CHANGED, OUTPUTS_CHANGED);
+ HookWidget(ui->simpleReplayBuf, GROUP_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->simpleRBSecMax, SCROLL_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->simpleRBMegsMax, SCROLL_CHANGED, OUTPUTS_CHANGED);
HookWidget(ui->advOutEncoder, COMBO_CHANGED, OUTPUTS_CHANGED);
@@ -774,7 +774,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
&OBSBasicSettings::SimpleRecordingEncoderChanged);
connect(ui->ignoreRecommended, &QCheckBox::toggled, this,
&OBSBasicSettings::SimpleRecordingEncoderChanged);
- connect(ui->simpleReplayBuf, &QCheckBox::toggled, this,
+ connect(ui->simpleReplayBuf, &QGroupBox::toggled, this,
&OBSBasicSettings::SimpleReplayBufferChanged);
connect(ui->simpleOutputVBitrate, &QSpinBox::valueChanged, this,
&OBSBasicSettings::SimpleReplayBufferChanged);
@@ -1024,6 +1024,14 @@ void OBSBasicSettings::SaveSpinBox(QSpinBox *widget, const char *section,
config_set_int(main->Config(), section, value, widget->value());
}
+void OBSBasicSettings::SaveGroupBox(QGroupBox *widget, const char *section,
+ const char *value)
+{
+ if (WidgetChanged(widget))
+ config_set_bool(main->Config(), section, value,
+ widget->isChecked());
+}
+
#define CS_PARTIAL_STR QTStr("Basic.Settings.Advanced.Video.ColorRange.Partial")
#define CS_FULL_STR QTStr("Basic.Settings.Advanced.Video.ColorRange.Full")
@@ -2448,7 +2456,7 @@ void OBSBasicSettings::LoadOutputSettings()
ui->simpleOutStrAEncoderLabel->setEnabled(false);
ui->simpleOutStrAEncoder->setEnabled(false);
ui->simpleRecordingGroupBox->setEnabled(false);
- ui->replayBufferGroupBox->setEnabled(false);
+ ui->simpleReplayBuf->setEnabled(false);
ui->advOutTopContainer->setEnabled(false);
ui->advOutRecTopContainer->setEnabled(false);
ui->advOutRecTypeContainer->setEnabled(false);
@@ -3798,7 +3806,7 @@ void OBSBasicSettings::SaveOutputSettings()
SaveComboData(ui->simpleOutRecAEncoder, "SimpleOutput",
"RecAudioEncoder");
SaveEdit(ui->simpleOutMuxCustom, "SimpleOutput", "MuxerCustom");
- SaveCheckBox(ui->simpleReplayBuf, "SimpleOutput", "RecRB");
+ SaveGroupBox(ui->simpleReplayBuf, "SimpleOutput", "RecRB");
SaveSpinBox(ui->simpleRBSecMax, "SimpleOutput", "RecRBTime");
SaveSpinBox(ui->simpleRBMegsMax, "SimpleOutput", "RecRBSize");
config_set_int(main->Config(), "SimpleOutput", "RecTracks",
@@ -5460,12 +5468,16 @@ void OBSBasicSettings::UpdateAutomaticReplayBufferCheckboxes()
{
bool state = false;
switch (ui->outputMode->currentIndex()) {
- case 0:
+ case 0: {
+ const bool lossless =
+ ui->simpleOutRecQuality->currentData().toString() ==
+ "Lossless";
state = ui->simpleReplayBuf->isChecked();
ui->simpleReplayBuf->setEnabled(
- !obs_frontend_replay_buffer_active());
+ !obs_frontend_replay_buffer_active() && !lossless);
break;
- case 1:
+ }
+ case 1: {
state = ui->advReplayBuf->isChecked();
bool customFFmpeg = ui->advOutRecType->currentIndex() == 1;
ui->advReplayBuf->setEnabled(
@@ -5473,6 +5485,7 @@ void OBSBasicSettings::UpdateAutomaticReplayBufferCheckboxes()
ui->advReplayBufCustomFFmpeg->setVisible(customFFmpeg);
break;
}
+ }
ui->replayWhileStreaming->setEnabled(state);
ui->keepReplayStreamStops->setEnabled(
state && ui->replayWhileStreaming->isChecked());
@@ -5481,8 +5494,6 @@ void OBSBasicSettings::UpdateAutomaticReplayBufferCheckboxes()
void OBSBasicSettings::SimpleReplayBufferChanged()
{
QString qual = ui->simpleOutRecQuality->currentData().toString();
- bool replayBufferEnabled = ui->simpleReplayBuf->isChecked();
- bool lossless = qual == "Lossless";
bool streamQuality = qual == "Stream";
int abitrate = 0;
@@ -5539,8 +5550,6 @@ void OBSBasicSettings::SimpleReplayBufferChanged()
}
ui->simpleRBEstimate->style()->polish(ui->simpleRBEstimate);
- ui->replayBufferGroupBox->setVisible(!lossless && replayBufferEnabled);
- ui->simpleReplayBuf->setVisible(!lossless);
UpdateAutomaticReplayBufferCheckboxes();
}
diff --git a/UI/window-basic-settings.hpp b/UI/window-basic-settings.hpp
index b874c0b85..c6aae1861 100644
--- a/UI/window-basic-settings.hpp
+++ b/UI/window-basic-settings.hpp
@@ -168,6 +168,8 @@ private:
const char *value);
void SaveCheckBox(QAbstractButton *widget, const char *section,
const char *value, bool invert = false);
+ void SaveGroupBox(QGroupBox *widget, const char *section,
+ const char *value);
void SaveEdit(QLineEdit *widget, const char *section,
const char *value);
void SaveSpinBox(QSpinBox *widget, const char *section,