From 488a96bc4b0c27749b1ef143ed76a71c1830fe0a Mon Sep 17 00:00:00 2001 From: James Hurley Date: Thu, 15 Jun 2023 15:17:24 -0700 Subject: [PATCH] UI: Add IPv4 / IPv6 selection setting This commit adds a field in Settings -> Advanced called 'IP Address Family' that allows users to select IPv4 and IPv6, IPv4 Only, or IPv6 Only. --- UI/data/locale/en-US.ini | 1 + UI/forms/OBSBasicSettings.ui | 21 +++++++++++++++++---- UI/window-basic-auto-config-test.cpp | 4 ++++ UI/window-basic-main-outputs.cpp | 6 ++++++ UI/window-basic-main.cpp | 2 ++ UI/window-basic-settings.cpp | 19 ++++++++++++++++++- 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index de77d5f27..47536c92f 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -1241,6 +1241,7 @@ Basic.Settings.Advanced.StreamDelay.MemoryUsage="Estimated Memory Usage: %1 MB" Basic.Settings.Advanced.Network="Network" Basic.Settings.Advanced.Network.Disabled="The currently selected streaming protocol does not support changing network settings." Basic.Settings.Advanced.Network.BindToIP="Bind to IP" +Basic.Settings.Advanced.Network.IPFamily="IP Family" Basic.Settings.Advanced.Network.EnableNewSocketLoop="Enable network optimizations" Basic.Settings.Advanced.Network.EnableLowLatencyMode="Enable TCP pacing" Basic.Settings.Advanced.Network.TCPPacing.Tooltip="Attempts to make RTMP output friendlier to other latency sensitive applications on the network by regulating the rate of transmission.\nIt may increase the risk of dropped frames on unstable connections." diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui index bcd7c3657..73084dd25 100644 --- a/UI/forms/OBSBasicSettings.ui +++ b/UI/forms/OBSBasicSettings.ui @@ -7575,14 +7575,27 @@ - + + + + Basic.Settings.Advanced.Network.IPFamily + + + ipFamily + + + + + + + Basic.Settings.Advanced.Network.EnableNewSocketLoop - + false @@ -7592,7 +7605,7 @@ - + Qt::Horizontal @@ -7605,7 +7618,7 @@ - + Basic.Settings.Output.DynamicBitrate.TT diff --git a/UI/window-basic-auto-config-test.cpp b/UI/window-basic-auto-config-test.cpp index 44daae456..97c46db40 100644 --- a/UI/window-basic-auto-config-test.cpp +++ b/UI/window-basic-auto-config-test.cpp @@ -249,6 +249,10 @@ void AutoConfigTestPage::TestBandwidthThread() config_get_string(main->Config(), "Output", "BindIP"); obs_data_set_string(output_settings, "bind_ip", bind_ip); + const char *ip_family = + config_get_string(main->Config(), "Output", "IPFamily"); + obs_data_set_string(output_settings, "ip_family", ip_family); + /* -----------------------------------*/ /* determine which servers to test */ diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index f7e62edc2..f576a7bb1 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -1198,6 +1198,8 @@ bool SimpleOutput::StartStreaming(obs_service_t *service) config_get_bool(main->Config(), "Output", "DelayPreserve"); const char *bindIP = config_get_string(main->Config(), "Output", "BindIP"); + const char *ipFamily = + config_get_string(main->Config(), "Output", "IPFamily"); #ifdef _WIN32 bool enableNewSocketLoop = config_get_bool(main->Config(), "Output", "NewSocketLoopEnable"); @@ -1209,6 +1211,7 @@ bool SimpleOutput::StartStreaming(obs_service_t *service) OBSDataAutoRelease settings = obs_data_create(); obs_data_set_string(settings, "bind_ip", bindIP); + obs_data_set_string(settings, "ip_family", ipFamily); #ifdef _WIN32 obs_data_set_bool(settings, "new_socket_loop_enabled", enableNewSocketLoop); @@ -2150,6 +2153,8 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service) config_get_bool(main->Config(), "Output", "DelayPreserve"); const char *bindIP = config_get_string(main->Config(), "Output", "BindIP"); + const char *ipFamily = + config_get_string(main->Config(), "Output", "IPFamily"); #ifdef _WIN32 bool enableNewSocketLoop = config_get_bool(main->Config(), "Output", "NewSocketLoopEnable"); @@ -2161,6 +2166,7 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service) OBSDataAutoRelease settings = obs_data_create(); obs_data_set_string(settings, "bind_ip", bindIP); + obs_data_set_string(settings, "ip_family", ipFamily); #ifdef _WIN32 obs_data_set_bool(settings, "new_socket_loop_enabled", enableNewSocketLoop); diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 80ff75d65..7ae63318f 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -1674,6 +1674,8 @@ bool OBSBasic::InitBasicConfigDefaults() config_set_default_uint(basicConfig, "Output", "MaxRetries", 25); config_set_default_string(basicConfig, "Output", "BindIP", "default"); + config_set_default_string(basicConfig, "Output", "IPFamily", + "IPv4+IPv6"); config_set_default_bool(basicConfig, "Output", "NewSocketLoopEnable", false); config_set_default_bool(basicConfig, "Output", "LowLatencyEnable", diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index f29e92e50..13651e81d 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -628,6 +628,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->processPriority, COMBO_CHANGED, ADV_CHANGED); HookWidget(ui->confirmOnExit, CHECK_CHANGED, ADV_CHANGED); HookWidget(ui->bindToIP, COMBO_CHANGED, ADV_CHANGED); + HookWidget(ui->ipFamily, COMBO_CHANGED, ADV_CHANGED); HookWidget(ui->enableNewSocketLoop, CHECK_CHANGED, ADV_CHANGED); HookWidget(ui->enableLowLatencyMode, CHECK_CHANGED, ADV_CHANGED); HookWidget(ui->hotkeyFocusType, COMBO_CHANGED, ADV_CHANGED); @@ -899,6 +900,17 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) ui->bindToIP->addItem(QT_UTF8(name), val); } + // Add IP Family options + p = obs_properties_get(ppts, "ip_family"); + + count = obs_property_list_item_count(p); + for (size_t i = 0; i < count; i++) { + const char *name = obs_property_list_item_name(p, i); + const char *val = obs_property_list_item_string(p, i); + + ui->ipFamily->addItem(QT_UTF8(name), val); + } + obs_properties_destroy(ppts); InitStreamPage(); @@ -2897,7 +2909,8 @@ void OBSBasicSettings::LoadAdvancedSettings() App()->GlobalConfig(), "General", "HotkeyFocusType"); bool dynBitrate = config_get_bool(main->Config(), "Output", "DynamicBitrate"); - + const char *ipFamily = + config_get_string(main->Config(), "Output", "IPFamily"); bool confirmOnExit = config_get_bool(GetGlobalConfig(), "General", "ConfirmOnExit"); ui->confirmOnExit->setChecked(confirmOnExit); @@ -2936,6 +2949,7 @@ void OBSBasicSettings::LoadAdvancedSettings() ui->sdrWhiteLevel->setValue(sdrWhiteLevel); ui->hdrNominalPeakLevel->setValue(hdrNominalPeakLevel); + SetComboByValue(ui->ipFamily, ipFamily); if (!SetComboByValue(ui->bindToIP, bindIP)) SetInvalidValue(ui->bindToIP, bindIP, bindIP); @@ -3669,6 +3683,7 @@ void OBSBasicSettings::SaveAdvancedSettings() SaveSpinBox(ui->reconnectRetryDelay, "Output", "RetryDelay"); SaveSpinBox(ui->reconnectMaxRetries, "Output", "MaxRetries"); SaveComboData(ui->bindToIP, "Output", "BindIP"); + SaveComboData(ui->ipFamily, "Output", "IPFamily"); SaveCheckBox(ui->autoRemux, "Video", "AutoRemux"); SaveCheckBox(ui->dynBitrate, "Output", "DynamicBitrate"); @@ -6235,6 +6250,8 @@ void OBSBasicSettings::UpdateAdvNetworkGroup() ui->bindToIPLabel->setVisible(enabled); ui->bindToIP->setVisible(enabled); ui->dynBitrate->setVisible(enabled); + ui->ipFamilyLabel->setVisible(enabled); + ui->ipFamily->setVisible(enabled); #ifdef _WIN32 ui->enableNewSocketLoop->setVisible(enabled); ui->enableLowLatencyMode->setVisible(enabled);