New upstream version 21.0.2+dfsg1
This commit is contained in:
parent
1f1bbb3518
commit
baafb6325b
706 changed files with 49633 additions and 5044 deletions
|
|
@ -45,6 +45,7 @@
|
|||
#include "window-basic-main.hpp"
|
||||
#include "window-basic-settings.hpp"
|
||||
#include "window-basic-main-outputs.hpp"
|
||||
#include "window-projector.hpp"
|
||||
|
||||
#include <util/platform.h>
|
||||
|
||||
|
|
@ -243,6 +244,9 @@ static void PopulateAACBitrates(initializer_list<QComboBox*> boxes)
|
|||
}
|
||||
}
|
||||
|
||||
void RestrictResetBitrates(initializer_list<QComboBox*> boxes,
|
||||
int maxbitrate);
|
||||
|
||||
void OBSBasicSettings::HookWidget(QWidget *widget, const char *signal,
|
||||
const char *slot)
|
||||
{
|
||||
|
|
@ -256,6 +260,7 @@ void OBSBasicSettings::HookWidget(QWidget *widget, const char *signal,
|
|||
#define CHECK_CHANGED SIGNAL(clicked(bool))
|
||||
#define SCROLL_CHANGED SIGNAL(valueChanged(int))
|
||||
#define DSCROLL_CHANGED SIGNAL(valueChanged(double))
|
||||
#define TOGGLE_CHANGED SIGNAL(toggled(bool))
|
||||
|
||||
#define GENERAL_CHANGED SLOT(GeneralChanged())
|
||||
#define STREAM1_CHANGED SLOT(Stream1Changed())
|
||||
|
|
@ -311,6 +316,9 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
HookWidget(ui->centerSnapping, CHECK_CHANGED, GENERAL_CHANGED);
|
||||
HookWidget(ui->sourceSnapping, CHECK_CHANGED, GENERAL_CHANGED);
|
||||
HookWidget(ui->snapDistance, DSCROLL_CHANGED,GENERAL_CHANGED);
|
||||
HookWidget(ui->doubleClickSwitch, CHECK_CHANGED, GENERAL_CHANGED);
|
||||
HookWidget(ui->studioPortraitLayout, CHECK_CHANGED, GENERAL_CHANGED);
|
||||
HookWidget(ui->multiviewLayout, COMBO_CHANGED, GENERAL_CHANGED);
|
||||
HookWidget(ui->outputMode, COMBO_CHANGED, OUTPUTS_CHANGED);
|
||||
HookWidget(ui->streamType, COMBO_CHANGED, STREAM1_CHANGED);
|
||||
HookWidget(ui->simpleOutputPath, EDIT_CHANGED, OUTPUTS_CHANGED);
|
||||
|
|
@ -387,8 +395,12 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
HookWidget(ui->advOutTrack5Name, EDIT_CHANGED, OUTPUTS_CHANGED);
|
||||
HookWidget(ui->advOutTrack6Bitrate, COMBO_CHANGED, OUTPUTS_CHANGED);
|
||||
HookWidget(ui->advOutTrack6Name, EDIT_CHANGED, OUTPUTS_CHANGED);
|
||||
HookWidget(ui->advReplayBuf, CHECK_CHANGED, OUTPUTS_CHANGED);
|
||||
HookWidget(ui->advRBSecMax, SCROLL_CHANGED, OUTPUTS_CHANGED);
|
||||
HookWidget(ui->advRBMegsMax, SCROLL_CHANGED, OUTPUTS_CHANGED);
|
||||
HookWidget(ui->channelSetup, COMBO_CHANGED, AUDIO_RESTART);
|
||||
HookWidget(ui->sampleRate, COMBO_CHANGED, AUDIO_RESTART);
|
||||
HookWidget(ui->meterDecayRate, COMBO_CHANGED, AUDIO_CHANGED);
|
||||
HookWidget(ui->desktopAudioDevice1, COMBO_CHANGED, AUDIO_CHANGED);
|
||||
HookWidget(ui->desktopAudioDevice2, COMBO_CHANGED, AUDIO_CHANGED);
|
||||
HookWidget(ui->auxAudioDevice1, COMBO_CHANGED, AUDIO_CHANGED);
|
||||
|
|
@ -410,7 +422,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
HookWidget(ui->colorRange, COMBO_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->disableOSXVSync, CHECK_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->resetOSXVSync, CHECK_CHANGED, ADV_CHANGED);
|
||||
#if defined(_WIN32) || defined(__APPLE__)
|
||||
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
HookWidget(ui->monitoringDevice, COMBO_CHANGED, ADV_CHANGED);
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
|
|
@ -431,15 +443,11 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
HookWidget(ui->enableNewSocketLoop, CHECK_CHANGED, ADV_CHANGED);
|
||||
HookWidget(ui->enableLowLatencyMode, CHECK_CHANGED, ADV_CHANGED);
|
||||
|
||||
#if !defined(_WIN32) && !defined(__APPLE__)
|
||||
delete ui->monitoringDevice;
|
||||
delete ui->monitoringDeviceLabel;
|
||||
delete ui->advAudioGroupBox;
|
||||
#if !defined(_WIN32) && !defined(__APPLE__) && !HAVE_PULSEAUDIO
|
||||
delete ui->enableAutoUpdates;
|
||||
ui->monitoringDevice = nullptr;
|
||||
ui->monitoringDeviceLabel = nullptr;
|
||||
ui->advAudioGroupBox = nullptr;
|
||||
delete ui->advAudioGroupBox;
|
||||
ui->enableAutoUpdates = nullptr;
|
||||
ui->advAudioGroupBox = nullptr;
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
|
|
@ -467,6 +475,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
PROCESS_PRIORITY("High"),
|
||||
PROCESS_PRIORITY("AboveNormal"),
|
||||
PROCESS_PRIORITY("Normal"),
|
||||
PROCESS_PRIORITY("BelowNormal"),
|
||||
PROCESS_PRIORITY("Idle")
|
||||
};
|
||||
#undef PROCESS_PRIORITY
|
||||
|
|
@ -484,7 +493,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
delete ui->advancedGeneralGroupBox;
|
||||
delete ui->enableNewSocketLoop;
|
||||
delete ui->enableLowLatencyMode;
|
||||
#ifdef __APPLE__
|
||||
#if defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
delete ui->disableAudioDucking;
|
||||
#endif
|
||||
ui->rendererLabel = nullptr;
|
||||
|
|
@ -496,7 +505,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
ui->advancedGeneralGroupBox = nullptr;
|
||||
ui->enableNewSocketLoop = nullptr;
|
||||
ui->enableLowLatencyMode = nullptr;
|
||||
#ifdef __APPLE__
|
||||
#if defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
ui->disableAudioDucking = nullptr;
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -583,10 +592,14 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
|
||||
FillSimpleRecordingValues();
|
||||
FillSimpleStreamingValues();
|
||||
#if defined(_WIN32) || defined(__APPLE__)
|
||||
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
FillAudioMonitoringDevices();
|
||||
#endif
|
||||
|
||||
connect(ui->channelSetup, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(SurroundWarning(int)));
|
||||
connect(ui->channelSetup, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(SpeakerLayoutChanged(int)));
|
||||
connect(ui->simpleOutRecQuality, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(SimpleRecordingQualityChanged()));
|
||||
connect(ui->simpleOutRecQuality, SIGNAL(currentIndexChanged(int)),
|
||||
|
|
@ -615,6 +628,38 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
|
|||
this, SLOT(SimpleReplayBufferChanged()));
|
||||
connect(ui->simpleRBSecMax, SIGNAL(valueChanged(int)),
|
||||
this, SLOT(SimpleReplayBufferChanged()));
|
||||
connect(ui->advReplayBuf, SIGNAL(toggled(bool)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecTrack1, SIGNAL(toggled(bool)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecTrack2, SIGNAL(toggled(bool)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecTrack3, SIGNAL(toggled(bool)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecTrack4, SIGNAL(toggled(bool)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecTrack5, SIGNAL(toggled(bool)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecTrack6, SIGNAL(toggled(bool)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutTrack1Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutTrack2Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutTrack3Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutTrack4Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutTrack5Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutTrack6Bitrate, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecType, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advOutRecEncoder, SIGNAL(currentIndexChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->advRBSecMax, SIGNAL(valueChanged(int)),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
connect(ui->listWidget, SIGNAL(currentRowChanged(int)),
|
||||
this, SLOT(SimpleRecordingEncoderChanged()));
|
||||
|
||||
|
|
@ -1037,6 +1082,39 @@ void OBSBasicSettings::LoadGeneralSettings()
|
|||
"BasicWindow", "ProjectorAlwaysOnTop");
|
||||
ui->projectorAlwaysOnTop->setChecked(projectorAlwaysOnTop);
|
||||
|
||||
bool doubleClickSwitch = config_get_bool(GetGlobalConfig(),
|
||||
"BasicWindow", "TransitionOnDoubleClick");
|
||||
ui->doubleClickSwitch->setChecked(doubleClickSwitch);
|
||||
|
||||
bool studioPortraitLayout = config_get_bool(GetGlobalConfig(),
|
||||
"BasicWindow", "StudioPortraitLayout");
|
||||
ui->studioPortraitLayout->setChecked(studioPortraitLayout);
|
||||
|
||||
ui->multiviewLayout->addItem(QTStr(
|
||||
"Basic.Settings.General.MultiviewLayout.Horizontal.Top"),
|
||||
QT_UTF8("horizontaltop"));
|
||||
ui->multiviewLayout->addItem(QTStr(
|
||||
"Basic.Settings.General.MultiviewLayout.Horizontal.Bottom"),
|
||||
QT_UTF8("horizontalbottom"));
|
||||
ui->multiviewLayout->addItem(QTStr(
|
||||
"Basic.Settings.General.MultiviewLayout.Vertical.Left"),
|
||||
QT_UTF8("verticalleft"));
|
||||
ui->multiviewLayout->addItem(QTStr(
|
||||
"Basic.Settings.General.MultiviewLayout.Vertical.Right"),
|
||||
QT_UTF8("verticalright"));
|
||||
|
||||
const char *multiviewLayoutText = config_get_string(GetGlobalConfig(),
|
||||
"BasicWindow", "MultiviewLayout");
|
||||
|
||||
if (astrcmpi(multiviewLayoutText, "horizontalbottom") == 0)
|
||||
ui->multiviewLayout->setCurrentIndex(1);
|
||||
else if (astrcmpi(multiviewLayoutText, "verticalleft") == 0)
|
||||
ui->multiviewLayout->setCurrentIndex(2);
|
||||
else if (astrcmpi(multiviewLayoutText, "verticalright") == 0)
|
||||
ui->multiviewLayout->setCurrentIndex(3);
|
||||
else
|
||||
ui->multiviewLayout->setCurrentIndex(0);
|
||||
|
||||
loading = false;
|
||||
}
|
||||
|
||||
|
|
@ -1336,6 +1414,30 @@ void OBSBasicSettings::LoadVideoSettings()
|
|||
loading = false;
|
||||
}
|
||||
|
||||
static inline bool IsSurround(const char *speakers)
|
||||
{
|
||||
static const char *surroundLayouts[] = {
|
||||
"2.1",
|
||||
"4.0",
|
||||
"4.1",
|
||||
"5.1",
|
||||
"7.1",
|
||||
nullptr
|
||||
};
|
||||
|
||||
if (!speakers || !*speakers)
|
||||
return false;
|
||||
|
||||
const char **curLayout = surroundLayouts;
|
||||
for (; *curLayout; ++curLayout) {
|
||||
if (strcmp(*curLayout, speakers) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void OBSBasicSettings::LoadSimpleOutputSettings()
|
||||
{
|
||||
const char *path = config_get_string(main->Config(), "SimpleOutput",
|
||||
|
|
@ -1391,6 +1493,13 @@ void OBSBasicSettings::LoadSimpleOutputSettings()
|
|||
int idx = ui->simpleOutRecFormat->findText(format);
|
||||
ui->simpleOutRecFormat->setCurrentIndex(idx);
|
||||
|
||||
const char *speakers = config_get_string(main->Config(), "Audio",
|
||||
"ChannelSetup");
|
||||
|
||||
// restrict list of bitrates when multichannel is OFF
|
||||
if (!IsSurround(speakers))
|
||||
RestrictResetBitrates({ui->simpleOutputABitrate}, 320);
|
||||
|
||||
SetComboByName(ui->simpleOutputABitrate,
|
||||
std::to_string(audioBitrate).c_str());
|
||||
|
||||
|
|
@ -1494,6 +1603,8 @@ void OBSBasicSettings::LoadAdvOutputStreamingEncoderProperties()
|
|||
|
||||
connect(streamEncoderProps, SIGNAL(Changed()),
|
||||
this, SLOT(UpdateStreamDelayEstimate()));
|
||||
connect(streamEncoderProps, SIGNAL(Changed()),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
|
||||
curAdvStreamEncoder = type;
|
||||
|
||||
|
|
@ -1560,6 +1671,8 @@ void OBSBasicSettings::LoadAdvOutputRecordingEncoderProperties()
|
|||
recordEncoderProps = CreateEncoderPropertyView(type,
|
||||
"recordEncoder.json");
|
||||
ui->advOutRecStandard->layout()->addWidget(recordEncoderProps);
|
||||
connect(recordEncoderProps, SIGNAL(Changed()),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
}
|
||||
|
||||
curAdvRecordEncoder = type;
|
||||
|
|
@ -1705,6 +1818,20 @@ void OBSBasicSettings::LoadAdvOutputAudioSettings()
|
|||
track5Bitrate = FindClosestAvailableAACBitrate(track5Bitrate);
|
||||
track6Bitrate = FindClosestAvailableAACBitrate(track6Bitrate);
|
||||
|
||||
// restrict list of bitrates when multichannel is OFF
|
||||
const char *speakers = config_get_string(main->Config(), "Audio",
|
||||
"ChannelSetup");
|
||||
|
||||
// restrict list of bitrates when multichannel is OFF
|
||||
if (!IsSurround(speakers)) {
|
||||
RestrictResetBitrates({ui->advOutTrack1Bitrate,
|
||||
ui->advOutTrack2Bitrate,
|
||||
ui->advOutTrack3Bitrate,
|
||||
ui->advOutTrack4Bitrate,
|
||||
ui->advOutTrack5Bitrate,
|
||||
ui->advOutTrack6Bitrate}, 320);
|
||||
}
|
||||
|
||||
SetComboByName(ui->advOutTrack1Bitrate,
|
||||
std::to_string(track1Bitrate).c_str());
|
||||
SetComboByName(ui->advOutTrack2Bitrate,
|
||||
|
|
@ -1993,6 +2120,8 @@ void OBSBasicSettings::LoadAudioSettings()
|
|||
"SampleRate");
|
||||
const char *speakers = config_get_string(main->Config(), "Audio",
|
||||
"ChannelSetup");
|
||||
double meterDecayRate = config_get_double(main->Config(), "Audio",
|
||||
"MeterDecayRate");
|
||||
|
||||
loading = true;
|
||||
|
||||
|
|
@ -2008,9 +2137,26 @@ void OBSBasicSettings::LoadAudioSettings()
|
|||
|
||||
if (strcmp(speakers, "Mono") == 0)
|
||||
ui->channelSetup->setCurrentIndex(0);
|
||||
else if (strcmp(speakers, "2.1") == 0)
|
||||
ui->channelSetup->setCurrentIndex(2);
|
||||
else if (strcmp(speakers, "4.0") == 0)
|
||||
ui->channelSetup->setCurrentIndex(3);
|
||||
else if (strcmp(speakers, "4.1") == 0)
|
||||
ui->channelSetup->setCurrentIndex(4);
|
||||
else if (strcmp(speakers, "5.1") == 0)
|
||||
ui->channelSetup->setCurrentIndex(5);
|
||||
else if (strcmp(speakers, "7.1") == 0)
|
||||
ui->channelSetup->setCurrentIndex(6);
|
||||
else
|
||||
ui->channelSetup->setCurrentIndex(1);
|
||||
|
||||
if (meterDecayRate == VOLUME_METER_DECAY_MEDIUM)
|
||||
ui->meterDecayRate->setCurrentIndex(1);
|
||||
else if (meterDecayRate == VOLUME_METER_DECAY_SLOW)
|
||||
ui->meterDecayRate->setCurrentIndex(2);
|
||||
else
|
||||
ui->meterDecayRate->setCurrentIndex(0);
|
||||
|
||||
LoadAudioDevices();
|
||||
LoadAudioSources();
|
||||
|
||||
|
|
@ -2025,7 +2171,7 @@ void OBSBasicSettings::LoadAdvancedSettings()
|
|||
"Video", "ColorSpace");
|
||||
const char *videoColorRange = config_get_string(main->Config(),
|
||||
"Video", "ColorRange");
|
||||
#if defined(_WIN32) || defined(__APPLE__)
|
||||
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
const char *monDevName = config_get_string(main->Config(), "Audio",
|
||||
"MonitoringDeviceName");
|
||||
const char *monDevId = config_get_string(main->Config(), "Audio",
|
||||
|
|
@ -2053,13 +2199,18 @@ void OBSBasicSettings::LoadAdvancedSettings()
|
|||
"RecRBPrefix");
|
||||
const char *rbSuffix = config_get_string(main->Config(), "SimpleOutput",
|
||||
"RecRBSuffix");
|
||||
int idx;
|
||||
bool replayBuf = config_get_bool(main->Config(), "AdvOut",
|
||||
"RecRB");
|
||||
int rbTime = config_get_int(main->Config(), "AdvOut",
|
||||
"RecRBTime");
|
||||
int rbSize = config_get_int(main->Config(), "AdvOut",
|
||||
"RecRBSize");
|
||||
|
||||
loading = true;
|
||||
|
||||
LoadRendererList();
|
||||
|
||||
#if defined(_WIN32) || defined(__APPLE__)
|
||||
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
if (!SetComboByValue(ui->monitoringDevice, monDevId))
|
||||
SetInvalidValue(ui->monitoringDevice, monDevName, monDevId);
|
||||
#endif
|
||||
|
|
@ -2069,6 +2220,10 @@ void OBSBasicSettings::LoadAdvancedSettings()
|
|||
ui->simpleRBPrefix->setText(rbPrefix);
|
||||
ui->simpleRBSuffix->setText(rbSuffix);
|
||||
|
||||
ui->advReplayBuf->setChecked(replayBuf);
|
||||
ui->advRBSecMax->setValue(rbTime);
|
||||
ui->advRBMegsMax->setValue(rbSize);
|
||||
|
||||
ui->reconnectEnable->setChecked(reconnect);
|
||||
ui->reconnectRetryDelay->setValue(retryDelay);
|
||||
ui->reconnectMaxRetries->setValue(maxRetries);
|
||||
|
|
@ -2109,7 +2264,7 @@ void OBSBasicSettings::LoadAdvancedSettings()
|
|||
bool enableLowLatencyMode = config_get_bool(main->Config(), "Output",
|
||||
"LowLatencyEnable");
|
||||
|
||||
idx = ui->processPriority->findData(processPriority);
|
||||
int idx = ui->processPriority->findData(processPriority);
|
||||
if (idx == -1)
|
||||
idx = ui->processPriority->findData("Normal");
|
||||
ui->processPriority->setCurrentIndex(idx);
|
||||
|
|
@ -2438,8 +2593,9 @@ void OBSBasicSettings::SaveGeneralSettings()
|
|||
string theme = themeData.toStdString();
|
||||
|
||||
if (WidgetChanged(ui->theme)) {
|
||||
config_set_string(GetGlobalConfig(), "General", "Theme",
|
||||
config_set_string(GetGlobalConfig(), "General", "CurrentTheme",
|
||||
theme.c_str());
|
||||
|
||||
App()->SetTheme(theme);
|
||||
}
|
||||
|
||||
|
|
@ -2473,6 +2629,10 @@ void OBSBasicSettings::SaveGeneralSettings()
|
|||
config_set_double(GetGlobalConfig(), "BasicWindow",
|
||||
"SnapDistance",
|
||||
ui->snapDistance->value());
|
||||
if (WidgetChanged(ui->doubleClickSwitch))
|
||||
config_set_bool(GetGlobalConfig(), "BasicWindow",
|
||||
"TransitionOnDoubleClick",
|
||||
ui->doubleClickSwitch->isChecked());
|
||||
|
||||
config_set_bool(GetGlobalConfig(), "BasicWindow",
|
||||
"WarnBeforeStartingStream",
|
||||
|
|
@ -2525,6 +2685,22 @@ void OBSBasicSettings::SaveGeneralSettings()
|
|||
config_set_bool(GetGlobalConfig(), "BasicWindow",
|
||||
"SaveProjectors",
|
||||
ui->saveProjectors->isChecked());
|
||||
|
||||
if (WidgetChanged(ui->studioPortraitLayout)) {
|
||||
config_set_bool(GetGlobalConfig(), "BasicWindow",
|
||||
"StudioPortraitLayout",
|
||||
ui->studioPortraitLayout->isChecked());
|
||||
|
||||
main->ResetUI();
|
||||
}
|
||||
|
||||
if (WidgetChanged(ui->multiviewLayout)) {
|
||||
config_set_string(GetGlobalConfig(), "BasicWindow",
|
||||
"MultiviewLayout",
|
||||
QT_TO_UTF8(GetComboData(ui->multiviewLayout)));
|
||||
|
||||
OBSProjector::UpdateMultiviewProjectors();
|
||||
}
|
||||
}
|
||||
|
||||
void OBSBasicSettings::SaveStream1Settings()
|
||||
|
|
@ -2622,7 +2798,7 @@ void OBSBasicSettings::SaveAdvancedSettings()
|
|||
SaveCombo(ui->colorFormat, "Video", "ColorFormat");
|
||||
SaveCombo(ui->colorSpace, "Video", "ColorSpace");
|
||||
SaveComboData(ui->colorRange, "Video", "ColorRange");
|
||||
#if defined(_WIN32) || defined(__APPLE__)
|
||||
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
SaveCombo(ui->monitoringDevice, "Audio", "MonitoringDeviceName");
|
||||
SaveComboData(ui->monitoringDevice, "Audio", "MonitoringDeviceId");
|
||||
#endif
|
||||
|
|
@ -2648,7 +2824,7 @@ void OBSBasicSettings::SaveAdvancedSettings()
|
|||
SaveSpinBox(ui->reconnectMaxRetries, "Output", "MaxRetries");
|
||||
SaveComboData(ui->bindToIP, "Output", "BindIP");
|
||||
|
||||
#if defined(_WIN32) || defined(__APPLE__)
|
||||
#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO
|
||||
QString newDevice = ui->monitoringDevice->currentData().toString();
|
||||
|
||||
if (lastMonitoringDevice != newDevice) {
|
||||
|
|
@ -2858,6 +3034,10 @@ void OBSBasicSettings::SaveOutputSettings()
|
|||
SaveEdit(ui->advOutTrack5Name, "AdvOut", "Track5Name");
|
||||
SaveEdit(ui->advOutTrack6Name, "AdvOut", "Track6Name");
|
||||
|
||||
SaveCheckBox(ui->advReplayBuf, "AdvOut", "RecRB");
|
||||
SaveSpinBox(ui->advRBSecMax, "AdvOut", "RecRBTime");
|
||||
SaveSpinBox(ui->advRBMegsMax, "AdvOut", "RecRBSize");
|
||||
|
||||
WriteJsonData(streamEncoderProps, "streamEncoder.json");
|
||||
WriteJsonData(recordEncoderProps, "recordEncoder.json");
|
||||
main->ResetOutputs();
|
||||
|
|
@ -2868,7 +3048,34 @@ void OBSBasicSettings::SaveAudioSettings()
|
|||
QString sampleRateStr = ui->sampleRate->currentText();
|
||||
int channelSetupIdx = ui->channelSetup->currentIndex();
|
||||
|
||||
const char *channelSetup = (channelSetupIdx == 0) ? "Mono" : "Stereo";
|
||||
const char *channelSetup;
|
||||
switch (channelSetupIdx) {
|
||||
case 0:
|
||||
channelSetup = "Mono";
|
||||
break;
|
||||
case 1:
|
||||
channelSetup = "Stereo";
|
||||
break;
|
||||
case 2:
|
||||
channelSetup = "2.1";
|
||||
break;
|
||||
case 3:
|
||||
channelSetup = "4.0";
|
||||
break;
|
||||
case 4:
|
||||
channelSetup = "4.1";
|
||||
break;
|
||||
case 5:
|
||||
channelSetup = "5.1";
|
||||
break;
|
||||
case 6:
|
||||
channelSetup = "7.1";
|
||||
break;
|
||||
|
||||
default:
|
||||
channelSetup = "Stereo";
|
||||
break;
|
||||
}
|
||||
|
||||
int sampleRate = 44100;
|
||||
if (sampleRateStr == "48khz")
|
||||
|
|
@ -2882,6 +3089,28 @@ void OBSBasicSettings::SaveAudioSettings()
|
|||
config_set_string(main->Config(), "Audio", "ChannelSetup",
|
||||
channelSetup);
|
||||
|
||||
if (WidgetChanged(ui->meterDecayRate)) {
|
||||
double meterDecayRate;
|
||||
switch (ui->meterDecayRate->currentIndex()) {
|
||||
case 0:
|
||||
meterDecayRate = VOLUME_METER_DECAY_FAST;
|
||||
break;
|
||||
case 1:
|
||||
meterDecayRate = VOLUME_METER_DECAY_MEDIUM;
|
||||
break;
|
||||
case 2:
|
||||
meterDecayRate = VOLUME_METER_DECAY_SLOW;
|
||||
break;
|
||||
default:
|
||||
meterDecayRate = VOLUME_METER_DECAY_FAST;
|
||||
break;
|
||||
}
|
||||
config_set_double(main->Config(), "Audio", "MeterDecayRate",
|
||||
meterDecayRate);
|
||||
|
||||
main->UpdateVolumeControlsDecayRate();
|
||||
}
|
||||
|
||||
for (auto &audioSource : audioSources) {
|
||||
auto source = OBSGetStrongRef(get<0>(audioSource));
|
||||
if (!source)
|
||||
|
|
@ -3188,6 +3417,8 @@ void OBSBasicSettings::on_advOutRecEncoder_currentIndexChanged(int idx)
|
|||
loadSettings ? "recordEncoder.json" : nullptr,
|
||||
true);
|
||||
ui->advOutRecStandard->layout()->addWidget(recordEncoderProps);
|
||||
connect(recordEncoderProps, SIGNAL(Changed()),
|
||||
this, SLOT(AdvReplayBufferChanged()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3384,6 +3615,85 @@ void OBSBasicSettings::ReloadAudioSources()
|
|||
LoadAudioSources();
|
||||
}
|
||||
|
||||
#define MULTI_CHANNEL_WARNING "Basic.Settings.Audio.MultichannelWarning"
|
||||
|
||||
void OBSBasicSettings::SpeakerLayoutChanged(int idx)
|
||||
{
|
||||
QString speakerLayoutQstr = ui->channelSetup->itemText(idx);
|
||||
std::string speakerLayout = QT_TO_UTF8(speakerLayoutQstr);
|
||||
bool surround = IsSurround(speakerLayout.c_str());
|
||||
|
||||
if (surround) {
|
||||
QString warning =
|
||||
QTStr(MULTI_CHANNEL_WARNING ".Enabled") +
|
||||
QStringLiteral("\n\n") +
|
||||
QTStr(MULTI_CHANNEL_WARNING);
|
||||
/*
|
||||
* Display all bitrates
|
||||
*/
|
||||
ui->audioMsg_2->setText(warning);
|
||||
PopulateAACBitrates({ui->simpleOutputABitrate,
|
||||
ui->advOutTrack1Bitrate,
|
||||
ui->advOutTrack2Bitrate,
|
||||
ui->advOutTrack3Bitrate,
|
||||
ui->advOutTrack4Bitrate,
|
||||
ui->advOutTrack5Bitrate,
|
||||
ui->advOutTrack6Bitrate});
|
||||
} else {
|
||||
/*
|
||||
* Reset audio bitrate for simple and adv mode, update list of
|
||||
* bitrates and save setting.
|
||||
*/
|
||||
ui->audioMsg_2->setText(QString());
|
||||
RestrictResetBitrates({ui->simpleOutputABitrate,
|
||||
ui->advOutTrack1Bitrate,
|
||||
ui->advOutTrack2Bitrate,
|
||||
ui->advOutTrack3Bitrate,
|
||||
ui->advOutTrack4Bitrate,
|
||||
ui->advOutTrack5Bitrate,
|
||||
ui->advOutTrack6Bitrate}, 320);
|
||||
|
||||
SaveCombo(ui->simpleOutputABitrate, "SimpleOutput", "ABitrate");
|
||||
SaveCombo(ui->advOutTrack1Bitrate, "AdvOut", "Track1Bitrate");
|
||||
SaveCombo(ui->advOutTrack2Bitrate, "AdvOut", "Track2Bitrate");
|
||||
SaveCombo(ui->advOutTrack3Bitrate, "AdvOut", "Track3Bitrate");
|
||||
SaveCombo(ui->advOutTrack4Bitrate, "AdvOut", "Track4Bitrate");
|
||||
SaveCombo(ui->advOutTrack5Bitrate, "AdvOut", "Track5Bitrate");
|
||||
SaveCombo(ui->advOutTrack6Bitrate, "AdvOut", "Track6Bitrate");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* resets current bitrate if too large and restricts the number of bitrates
|
||||
* displayed when multichannel OFF
|
||||
*/
|
||||
|
||||
void RestrictResetBitrates(initializer_list<QComboBox*> boxes, int maxbitrate)
|
||||
{
|
||||
for (auto box : boxes) {
|
||||
int idx = box->currentIndex();
|
||||
int max_bitrate = FindClosestAvailableAACBitrate(maxbitrate);
|
||||
int count = box->count();
|
||||
int max_idx = box->findText(QT_UTF8(std::to_string
|
||||
(max_bitrate).c_str()));
|
||||
|
||||
for (int i = (count - 1); i > max_idx; i--)
|
||||
box->removeItem(i);
|
||||
|
||||
if (idx > max_idx) {
|
||||
int default_bitrate = FindClosestAvailableAACBitrate(
|
||||
maxbitrate / 2);
|
||||
int default_idx = box->findText(QT_UTF8(std::to_string
|
||||
(default_bitrate).c_str()));
|
||||
|
||||
box->setCurrentIndex(default_idx);
|
||||
box->setProperty("changed", QVariant(true));
|
||||
} else {
|
||||
box->setCurrentIndex(idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OBSBasicSettings::VideoChangedRestart()
|
||||
{
|
||||
if (!loading) {
|
||||
|
|
@ -3734,8 +4044,15 @@ void OBSBasicSettings::SimpleStreamingEncoderChanged()
|
|||
|
||||
void OBSBasicSettings::UpdateAutomaticReplayBufferCheckboxes()
|
||||
{
|
||||
bool state = ui->simpleReplayBuf->isChecked() &&
|
||||
ui->outputMode->currentIndex() == 0;
|
||||
bool state = false;
|
||||
switch (ui->outputMode->currentIndex()) {
|
||||
case 0:
|
||||
state = ui->simpleReplayBuf->isChecked();
|
||||
break;
|
||||
case 1:
|
||||
state = ui->advReplayBuf->isChecked();
|
||||
break;
|
||||
}
|
||||
ui->replayWhileStreaming->setEnabled(state);
|
||||
ui->keepReplayStreamStops->setEnabled(state &&
|
||||
ui->replayWhileStreaming->isChecked());
|
||||
|
|
@ -3770,7 +4087,89 @@ void OBSBasicSettings::SimpleReplayBufferChanged()
|
|||
ui->simpleReplayBuf->setVisible(!lossless);
|
||||
|
||||
UpdateAutomaticReplayBufferCheckboxes();
|
||||
}
|
||||
|
||||
void OBSBasicSettings::AdvReplayBufferChanged()
|
||||
{
|
||||
obs_data_t *settings;
|
||||
QString encoder = ui->advOutRecEncoder->currentText();
|
||||
bool useStream = QString::compare(encoder, TEXT_USE_STREAM_ENC) == 0;
|
||||
|
||||
if (useStream && streamEncoderProps) {
|
||||
settings = streamEncoderProps->GetSettings();
|
||||
} else if (!useStream && recordEncoderProps) {
|
||||
settings = recordEncoderProps->GetSettings();
|
||||
} else {
|
||||
if (useStream)
|
||||
encoder = GetComboData(ui->advOutEncoder);
|
||||
settings = obs_encoder_defaults(encoder.toUtf8().constData());
|
||||
|
||||
if (!settings)
|
||||
return;
|
||||
|
||||
char encoderJsonPath[512];
|
||||
int ret = GetProfilePath(encoderJsonPath,
|
||||
sizeof(encoderJsonPath), "recordEncoder.json");
|
||||
if (ret > 0) {
|
||||
obs_data_t *data = obs_data_create_from_json_file_safe(
|
||||
encoderJsonPath, "bak");
|
||||
obs_data_apply(settings, data);
|
||||
obs_data_release(data);
|
||||
}
|
||||
}
|
||||
|
||||
int vbitrate = (int)obs_data_get_int(settings, "bitrate");
|
||||
const char *rateControl = obs_data_get_string(settings, "rate_control");
|
||||
|
||||
bool lossless = strcmp(rateControl, "lossless") == 0 ||
|
||||
ui->advOutRecType->currentIndex() == 1;
|
||||
bool replayBufferEnabled = ui->advReplayBuf->isChecked();
|
||||
|
||||
int abitrate = 0;
|
||||
if (ui->advOutRecTrack1->isChecked())
|
||||
abitrate += ui->advOutTrack1Bitrate->currentText().toInt();
|
||||
if (ui->advOutRecTrack2->isChecked())
|
||||
abitrate += ui->advOutTrack2Bitrate->currentText().toInt();
|
||||
if (ui->advOutRecTrack3->isChecked())
|
||||
abitrate += ui->advOutTrack3Bitrate->currentText().toInt();
|
||||
if (ui->advOutRecTrack4->isChecked())
|
||||
abitrate += ui->advOutTrack4Bitrate->currentText().toInt();
|
||||
if (ui->advOutRecTrack5->isChecked())
|
||||
abitrate += ui->advOutTrack5Bitrate->currentText().toInt();
|
||||
if (ui->advOutRecTrack6->isChecked())
|
||||
abitrate += ui->advOutTrack6Bitrate->currentText().toInt();
|
||||
|
||||
int seconds = ui->advRBSecMax->value();
|
||||
|
||||
int64_t memMB = int64_t(seconds) * int64_t(vbitrate + abitrate) *
|
||||
1000 / 8 / 1024 / 1024;
|
||||
if (memMB < 1)
|
||||
memMB = 1;
|
||||
|
||||
if (!rateControl)
|
||||
rateControl = "";
|
||||
|
||||
bool varRateControl = (astrcmpi(rateControl, "CBR") == 0 ||
|
||||
astrcmpi(rateControl, "VBR") == 0 ||
|
||||
astrcmpi(rateControl, "ABR") == 0);
|
||||
if (vbitrate == 0)
|
||||
varRateControl = false;
|
||||
|
||||
ui->advRBMegsMax->setVisible(!varRateControl);
|
||||
ui->advRBMegsMaxLabel->setVisible(!varRateControl);
|
||||
|
||||
if (varRateControl)
|
||||
ui->advRBEstimate->setText(
|
||||
QTStr(ESTIMATE_STR).arg(
|
||||
QString::number(int(memMB))));
|
||||
else
|
||||
ui->advRBEstimate->setText(QTStr(ESTIMATE_UNKNOWN_STR));
|
||||
|
||||
ui->advReplayBufferGroupBox->setVisible(!lossless && replayBufferEnabled);
|
||||
ui->line_4->setVisible(!lossless && replayBufferEnabled);
|
||||
ui->advReplayBuf->setEnabled(!lossless);
|
||||
|
||||
UpdateAutomaticReplayBufferCheckboxes();
|
||||
}
|
||||
|
||||
#define SIMPLE_OUTPUT_WARNING(str) \
|
||||
|
|
@ -3866,6 +4265,47 @@ void OBSBasicSettings::SimpleRecordingEncoderChanged()
|
|||
ui->simpleOutInfoLayout->addWidget(simpleOutRecWarning);
|
||||
}
|
||||
|
||||
void OBSBasicSettings::SurroundWarning(int idx)
|
||||
{
|
||||
if (idx == lastChannelSetupIdx || idx == -1)
|
||||
return;
|
||||
|
||||
if (loading) {
|
||||
lastChannelSetupIdx = idx;
|
||||
return;
|
||||
}
|
||||
|
||||
QString speakerLayoutQstr = ui->channelSetup->itemText(idx);
|
||||
bool surround = IsSurround(QT_TO_UTF8(speakerLayoutQstr));
|
||||
|
||||
QString lastQstr = ui->channelSetup->itemText(lastChannelSetupIdx);
|
||||
bool wasSurround = IsSurround(QT_TO_UTF8(lastQstr));
|
||||
|
||||
if (surround && !wasSurround) {
|
||||
QMessageBox::StandardButton button;
|
||||
|
||||
QString warningString =
|
||||
QTStr("Basic.Settings.ProgramRestart") +
|
||||
QStringLiteral("\n\n") +
|
||||
QTStr(MULTI_CHANNEL_WARNING) +
|
||||
QStringLiteral("\n\n") +
|
||||
QTStr(MULTI_CHANNEL_WARNING ".Confirm");
|
||||
|
||||
button = OBSMessageBox::question(this,
|
||||
QTStr(MULTI_CHANNEL_WARNING ".Title"),
|
||||
warningString);
|
||||
|
||||
if (button == QMessageBox::No) {
|
||||
QMetaObject::invokeMethod(ui->channelSetup,
|
||||
"setCurrentIndex", Qt::QueuedConnection,
|
||||
Q_ARG(int, lastChannelSetupIdx));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
lastChannelSetupIdx = idx;
|
||||
}
|
||||
|
||||
void OBSBasicSettings::SimpleRecordingQualityLosslessWarning(int idx)
|
||||
{
|
||||
if (idx == lastSimpleRecQualityIdx || idx == -1)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue