From 9288775351dc04c1b3b09d6fe432096e7571396f Mon Sep 17 00:00:00 2001 From: TimmyOVO Date: Tue, 23 Apr 2024 02:16:26 +0800 Subject: [PATCH 01/34] feat(macos/capture): support for capture display other than main display (#2449) --- cmake/compile_definitions/macos.cmake | 5 +-- cmake/dependencies/macos.cmake | 1 + docs/source/about/advanced_usage.rst | 32 +++++++++++++------ src/platform/linux/x11grab.cpp | 6 ++-- src/platform/macos/av_video.h | 2 ++ src/platform/macos/av_video.m | 13 +++++++- src/platform/macos/display.mm | 23 +++++++------ src/platform/macos/input.cpp | 21 +++++++++++- src_assets/common/assets/web/config.html | 25 +++++++++------ .../assets/web/public/assets/locale/en.json | 4 +-- 10 files changed, 94 insertions(+), 38 deletions(-) diff --git a/cmake/compile_definitions/macos.cmake b/cmake/compile_definitions/macos.cmake index fff301b856..549ea1d0f1 100644 --- a/cmake/compile_definitions/macos.cmake +++ b/cmake/compile_definitions/macos.cmake @@ -8,12 +8,13 @@ link_directories(/opt/homebrew/lib) ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK) list(APPEND SUNSHINE_EXTERNAL_LIBRARIES + ${APP_KIT_LIBRARY} ${APP_SERVICES_LIBRARY} ${AV_FOUNDATION_LIBRARY} ${CORE_MEDIA_LIBRARY} ${CORE_VIDEO_LIBRARY} - ${VIDEO_TOOLBOX_LIBRARY} - ${FOUNDATION_LIBRARY}) + ${FOUNDATION_LIBRARY} + ${VIDEO_TOOLBOX_LIBRARY}) set(PLATFORM_INCLUDE_DIRS ${Boost_INCLUDE_DIR}) diff --git a/cmake/dependencies/macos.cmake b/cmake/dependencies/macos.cmake index 7d8e211e24..61efc6a902 100644 --- a/cmake/dependencies/macos.cmake +++ b/cmake/dependencies/macos.cmake @@ -1,5 +1,6 @@ # macos specific dependencies +FIND_LIBRARY(APP_KIT_LIBRARY AppKit) FIND_LIBRARY(APP_SERVICES_LIBRARY ApplicationServices) FIND_LIBRARY(AV_FOUNDATION_LIBRARY AVFoundation) FIND_LIBRARY(CORE_MEDIA_LIBRARY CoreMedia) diff --git a/docs/source/about/advanced_usage.rst b/docs/source/about/advanced_usage.rst index b2e64c0140..ae15a8704e 100644 --- a/docs/source/about/advanced_usage.rst +++ b/docs/source/about/advanced_usage.rst @@ -576,20 +576,29 @@ keybindings .. tip:: To find the name of the appropriate values follow these instructions. **Linux** - During Sunshine startup, you should see the list of detected monitors: + During Sunshine startup, you should see the list of detected displays: .. code-block:: text - Info: Detecting connected monitors - Info: Detected monitor 0: DVI-D-0, connected: false - Info: Detected monitor 1: HDMI-0, connected: true - Info: Detected monitor 2: DP-0, connected: true - Info: Detected monitor 3: DP-1, connected: false - Info: Detected monitor 4: DVI-D-1, connected: false + Info: Detecting displays + Info: Detected display: DVI-D-0 (id: 0) connected: false + Info: Detected display: HDMI-0 (id: 1) connected: true + Info: Detected display: DP-0 (id: 2) connected: true + Info: Detected display: DP-1 (id: 3) connected: false + Info: Detected display: DVI-D-1 (id: 4) connected: false - You need to use the value before the colon in the output, e.g. ``1``. + You need to use the id value inside the parenthesis, e.g. ``1``. - .. todo:: macOS + **macOS** + During Sunshine startup, you should see the list of detected displays: + + .. code-block:: text + + Info: Detecting displays + Info: Detected display: Monitor-0 (id: 3) connected: true + Info: Detected display: Monitor-1 (id: 2) connected: true + + You need to use the id value inside the parenthesis, e.g. ``3``. **Windows** .. code-block:: batch @@ -605,7 +614,10 @@ keybindings output_name = 0 - .. todo:: macOS + **macOS** + .. code-block:: text + + output_name = 3 **Windows** .. code-block:: text diff --git a/src/platform/linux/x11grab.cpp b/src/platform/linux/x11grab.cpp index 0d4c3d38c3..c3b23a4c97 100644 --- a/src/platform/linux/x11grab.cpp +++ b/src/platform/linux/x11grab.cpp @@ -421,7 +421,7 @@ namespace platf { } if (streamedMonitor != -1) { - BOOST_LOG(info) << "Configuring selected monitor ("sv << streamedMonitor << ") to stream"sv; + BOOST_LOG(info) << "Configuring selected display ("sv << streamedMonitor << ") to stream"sv; screen_res_t screenr { x11::rr::GetScreenResources(xdisplay.get(), xwindow) }; int output = screenr->noutput; @@ -806,7 +806,7 @@ namespace platf { return {}; } - BOOST_LOG(info) << "Detecting monitors"sv; + BOOST_LOG(info) << "Detecting displays"sv; x11::xdisplay_t xdisplay { x11::OpenDisplay(nullptr) }; if (!xdisplay) { @@ -821,7 +821,7 @@ namespace platf { for (int x = 0; x < output; ++x) { output_info_t out_info { x11::rr::GetOutputInfo(xdisplay.get(), screenr.get(), screenr->outputs[x]) }; if (out_info) { - BOOST_LOG(info) << "Detected monitor "sv << monitor << ": "sv << out_info->name << ", connected: "sv << (out_info->connection == RR_Connected); + BOOST_LOG(info) << "Detected display: "sv << out_info->name << " (id: "sv << monitor << ")"sv << out_info->name << " connected: "sv << (out_info->connection == RR_Connected); ++monitor; } } diff --git a/src/platform/macos/av_video.h b/src/platform/macos/av_video.h index 4bfa00ac00..fac5a78c6e 100644 --- a/src/platform/macos/av_video.h +++ b/src/platform/macos/av_video.h @@ -5,6 +5,7 @@ #pragma once #import +#import struct CaptureSession { AVCaptureVideoDataOutput *output; @@ -29,6 +30,7 @@ typedef bool (^FrameCallbackBlock)(CMSampleBufferRef); @property (nonatomic, assign) NSMapTable *captureSignals; + (NSArray *)displayNames; ++ (NSString *)getDisplayName:(CGDirectDisplayID)displayID; - (id)initWithDisplay:(CGDirectDisplayID)displayID frameRate:(int)frameRate; diff --git a/src/platform/macos/av_video.m b/src/platform/macos/av_video.m index 5cdf5a9898..874a87f7b1 100644 --- a/src/platform/macos/av_video.m +++ b/src/platform/macos/av_video.m @@ -23,13 +23,24 @@ @implementation AVVideo for (uint32_t i = 0; i < count; i++) { [result addObject:@{ @"id": [NSNumber numberWithUnsignedInt:displays[i]], - @"name": [NSString stringWithFormat:@"%d", displays[i]] + @"name": [NSString stringWithFormat:@"%d", displays[i]], + @"displayName": [self getDisplayName:displays[i]], }]; } return [NSArray arrayWithArray:result]; } ++ (NSString *)getDisplayName:(CGDirectDisplayID)displayID { + NSScreen *screens = [NSScreen screens]; + for (NSScreen *screen in screens) { + if (screen.deviceDescription[@"NSScreenNumber"] == [NSNumber numberWithUnsignedInt:displayID]) { + return screen.localizedName; + } + } + return nil; +} + - (id)initWithDisplay:(CGDirectDisplayID)displayID frameRate:(int)frameRate { self = [super init]; diff --git a/src/platform/macos/display.mm b/src/platform/macos/display.mm index 6d75717600..3468d46f55 100644 --- a/src/platform/macos/display.mm +++ b/src/platform/macos/display.mm @@ -142,18 +142,23 @@ auto display = std::make_shared(); + // Default to main display display->display_id = CGMainDisplayID(); - if (!display_name.empty()) { - auto display_array = [AVVideo displayNames]; - - for (NSDictionary *item in display_array) { - NSString *name = item[@"name"]; - if (name.UTF8String == display_name) { - NSNumber *display_id = item[@"id"]; - display->display_id = [display_id unsignedIntValue]; - } + + // Print all displays available with it's name and id + auto display_array = [AVVideo displayNames]; + BOOST_LOG(info) << "Detecting displays"sv; + for (NSDictionary *item in display_array) { + NSNumber *display_id = item[@"id"]; + // We need show display's product name and corresponding display number given by user + NSString *name = item[@"displayName"]; + // We are using CGGetActiveDisplayList that only returns active displays so hardcoded connected value in log to true + BOOST_LOG(info) << "Detected display: "sv << name.UTF8String << " (id: "sv << [NSString stringWithFormat:@"%@", display_id].UTF8String << ") connected: true"sv; + if (!display_name.empty() && std::atoi(display_name.c_str()) == [display_id unsignedIntValue]) { + display->display_id = [display_id unsignedIntValue]; } } + BOOST_LOG(info) << "Configuring selected display ("sv << display->display_id << ") to stream"sv; display->av_capture = [[AVVideo alloc] initWithDisplay:display->display_id frameRate:config.framerate]; diff --git a/src/platform/macos/input.cpp b/src/platform/macos/input.cpp index 2aa6012ef5..273416680e 100644 --- a/src/platform/macos/input.cpp +++ b/src/platform/macos/input.cpp @@ -509,9 +509,28 @@ const KeyCodeMap kKeyCodesMap[] = { auto macos_input = (macos_input_t *) result.get(); - // If we don't use the main display in the future, this has to be adapted + // Default to main display macos_input->display = CGMainDisplayID(); + auto output_name = config::video.output_name; + // If output_name is set, try to find the display with that display id + if (!output_name.empty()) { + uint32_t max_display = 32; + uint32_t display_count; + CGDirectDisplayID displays[max_display]; + if (CGGetActiveDisplayList(max_display, displays, &display_count) != kCGErrorSuccess) { + BOOST_LOG(error) << "Unable to get active display list , error: "sv << std::endl; + } + else { + for (int i = 0; i < display_count; i++) { + CGDirectDisplayID display_id = displays[i]; + if (display_id == std::atoi(output_name.c_str())) { + macos_input->display = display_id; + } + } + } + } + // Input coordinates are based on the virtual resolution not the physical, so we need the scaling factor CGDisplayModeRef mode = CGDisplayCopyDisplayMode(macos_input->display); macos_input->displayScaling = ((CGFloat) CGDisplayPixelsWide(macos_input->display)) / ((CGFloat) CGDisplayModeGetPixelWidth(mode)); diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index 859954ac24..babb1ad4c4 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -392,19 +392,24 @@

tools\dxgi-info.exe
-
- +
+
- {{ $t('config.output_name_desc_linux') }}
+ {{ $t('config.output_name_desc_unix') }}

-
-              Info: Detecting connected monitors
-              Info: Detected monitor 0: DVI-D-0, connected: false
-              Info: Detected monitor 1: HDMI-0, connected: true
-              Info: Detected monitor 2: DP-0, connected: true
-              Info: Detected monitor 3: DP-1, connected: false
-              Info: Detected monitor 4: DVI-D-1, connected: false
+            
+              Info: Detecting displays
+              Info: Detected display: DVI-D-0 (id: 0) connected: false
+              Info: Detected display: HDMI-0 (id: 1) connected: true
+              Info: Detected display: DP-0 (id: 2) connected: true
+              Info: Detected display: DP-1 (id: 3) connected: false
+              Info: Detected display: DVI-D-1 (id: 4) connected: false
+            
+
+              Info: Detecting displays
+              Info: Detected display: Monitor-0 (id: 3) connected: true
+              Info: Detected display: Monitor-1 (id: 2) connected: true
             
diff --git a/src_assets/common/assets/web/public/assets/locale/en.json b/src_assets/common/assets/web/public/assets/locale/en.json index 37e0b41ee6..4f41fb42a5 100644 --- a/src_assets/common/assets/web/public/assets/locale/en.json +++ b/src_assets/common/assets/web/public/assets/locale/en.json @@ -243,9 +243,9 @@ "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", "origin_web_ui_allowed_pc": "Only localhost may access Web UI", "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", + "output_name_desc_unix": "During Sunshine startup, you should see the list of detected displays. Note: You need to use the id value inside the parenthesis.", "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", + "output_name_unix": "Display number", "output_name_win": "Output Name", "ping_timeout": "Ping Timeout", "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", From 7fb8c76590f843f28b2061cd0a1543f0710795e3 Mon Sep 17 00:00:00 2001 From: Tejas Rao Date: Fri, 26 Apr 2024 12:49:15 -0700 Subject: [PATCH 02/34] Use C++20. (#2322) --- .github/workflows/CI.yml | 6 +++++- cmake/targets/common.cmake | 2 +- src/config.cpp | 1 + src/httpcommon.cpp | 1 + src/network.cpp | 5 ++++- src/network.h | 1 + src/nvhttp.cpp | 1 + src/platform/linux/cuda.cpp | 4 ++-- src/platform/linux/input.cpp | 2 +- src/platform/linux/kmsgrab.cpp | 4 ++-- src/platform/windows/input.cpp | 2 +- src/platform/windows/misc.cpp | 4 ++-- src/rtsp.cpp | 1 + src/stream.h | 1 + tests/CMakeLists.txt | 2 +- tools/CMakeLists.txt | 8 ++++---- 16 files changed, 29 insertions(+), 16 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e847ea362e..ecc18a73d4 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -280,7 +280,7 @@ jobs: include: # package these differently - type: AppImage EXTRA_ARGS: '-DSUNSHINE_BUILD_APPIMAGE=ON' - dist: 20.04 + dist: 22.04 steps: - name: Maximize build space @@ -323,6 +323,9 @@ jobs: # allow newer gcc sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + # allow libfuse2 for appimage on 22.04 + sudo add-apt-repository universe + sudo apt-get install -y \ build-essential \ cmake \ @@ -338,6 +341,7 @@ jobs: libcurl4-openssl-dev \ libdrm-dev \ libevdev-dev \ + libfuse2 \ libminiupnpc-dev \ libmfx-dev \ libnotify-dev \ diff --git a/cmake/targets/common.cmake b/cmake/targets/common.cmake index 094bbca7c2..ee79528c88 100644 --- a/cmake/targets/common.cmake +++ b/cmake/targets/common.cmake @@ -36,7 +36,7 @@ endif() target_link_libraries(sunshine ${SUNSHINE_EXTERNAL_LIBRARIES} ${EXTRA_LIBS}) target_compile_definitions(sunshine PUBLIC ${SUNSHINE_DEFINITIONS}) -set_target_properties(sunshine PROPERTIES CXX_STANDARD 17 +set_target_properties(sunshine PROPERTIES CXX_STANDARD 20 VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) diff --git a/src/config.cpp b/src/config.cpp index 6a9e1cecb7..708169458f 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include diff --git a/src/httpcommon.cpp b/src/httpcommon.cpp index aa92b3bd3d..123e7e9393 100644 --- a/src/httpcommon.cpp +++ b/src/httpcommon.cpp @@ -7,6 +7,7 @@ #include "process.h" #include +#include #include #include diff --git a/src/network.cpp b/src/network.cpp index 5c158ee6c5..2784afebc3 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -7,6 +7,7 @@ #include "logging.h" #include "utility.h" #include +#include using namespace std::literals; @@ -169,7 +170,9 @@ namespace net { addr_to_url_escaped_string(boost::asio::ip::address address) { address = normalize_address(address); if (address.is_v6()) { - return "["s + address.to_string() + ']'; + std::stringstream ss; + ss << '[' << address.to_string() << ']'; + return ss.str(); } else { return address.to_string(); diff --git a/src/network.h b/src/network.h index a4f74fb404..5fe842e7c8 100644 --- a/src/network.h +++ b/src/network.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include diff --git a/src/nvhttp.cpp b/src/nvhttp.cpp index 695820f4b3..70ca9bc79b 100644 --- a/src/nvhttp.cpp +++ b/src/nvhttp.cpp @@ -8,6 +8,7 @@ // standard includes #include +#include // lib includes #include diff --git a/src/platform/linux/cuda.cpp b/src/platform/linux/cuda.cpp index ee535d21d2..129a23e6bd 100644 --- a/src/platform/linux/cuda.cpp +++ b/src/platform/linux/cuda.cpp @@ -262,7 +262,7 @@ namespace cuda { fs::path sysfs_dir { sysfs_path }; for (auto &entry : fs::directory_iterator { sysfs_dir }) { auto file = entry.path().filename(); - auto filestring = file.generic_u8string(); + auto filestring = file.generic_string(); if (std::string_view { filestring }.substr(0, 4) != "card"sv) { continue; } @@ -1049,4 +1049,4 @@ namespace platf { return display_names; } -} // namespace platf \ No newline at end of file +} // namespace platf diff --git a/src/platform/linux/input.cpp b/src/platform/linux/input.cpp index 74d683048f..14ee50fe70 100644 --- a/src/platform/linux/input.cpp +++ b/src/platform/linux/input.cpp @@ -1510,7 +1510,7 @@ namespace platf { std::stringstream ss; ss << std::hex << std::setfill('0'); for (const auto &ch : str) { - ss << ch; + ss << static_cast(ch); } std::string hex_unicode(ss.str()); diff --git a/src/platform/linux/kmsgrab.cpp b/src/platform/linux/kmsgrab.cpp index 30a2470f2d..ad97c9b07d 100644 --- a/src/platform/linux/kmsgrab.cpp +++ b/src/platform/linux/kmsgrab.cpp @@ -614,7 +614,7 @@ namespace platf { for (auto &entry : fs::directory_iterator { card_dir }) { auto file = entry.path().filename(); - auto filestring = file.generic_u8string(); + auto filestring = file.generic_string(); if (filestring.size() < 4 || std::string_view { filestring }.substr(0, 4) != "card"sv) { continue; } @@ -1641,7 +1641,7 @@ namespace platf { for (auto &entry : fs::directory_iterator { card_dir }) { auto file = entry.path().filename(); - auto filestring = file.generic_u8string(); + auto filestring = file.generic_string(); if (std::string_view { filestring }.substr(0, 4) != "card"sv) { continue; } diff --git a/src/platform/windows/input.cpp b/src/platform/windows/input.cpp index 5056c2c724..dfc9852f58 100644 --- a/src/platform/windows/input.cpp +++ b/src/platform/windows/input.cpp @@ -1411,7 +1411,7 @@ namespace platf { ds4_update_state(gamepad_context_t &gamepad, const gamepad_state_t &gamepad_state) { auto &report = gamepad.report.ds4.Report; - report.wButtons = ds4_buttons(gamepad_state) | ds4_dpad(gamepad_state); + report.wButtons = static_cast(ds4_buttons(gamepad_state)) | static_cast(ds4_dpad(gamepad_state)); report.bSpecial = ds4_special_buttons(gamepad_state); report.bTriggerL = gamepad_state.lt; diff --git a/src/platform/windows/misc.cpp b/src/platform/windows/misc.cpp index e7bb64e52b..e136de66a7 100644 --- a/src/platform/windows/misc.cpp +++ b/src/platform/windows/misc.cpp @@ -1691,8 +1691,8 @@ namespace platf { } int64_t qpc_counter() { - LARGE_INTEGER performace_counter; - if (QueryPerformanceCounter(&performace_counter)) return performace_counter.QuadPart; + LARGE_INTEGER performance_counter; + if (QueryPerformanceCounter(&performance_counter)) return performance_counter.QuadPart; return 0; } diff --git a/src/rtsp.cpp b/src/rtsp.cpp index 0180fbee37..99b9f0de8f 100644 --- a/src/rtsp.cpp +++ b/src/rtsp.cpp @@ -11,6 +11,7 @@ extern "C" { #include #include +#include #include #include diff --git a/src/stream.h b/src/stream.h index 1e2dcd4ea5..565ae4ed56 100644 --- a/src/stream.h +++ b/src/stream.h @@ -3,6 +3,7 @@ * @brief todo */ #pragma once +#include #include diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e4583f9c6a..0218224184 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -107,7 +107,7 @@ list(REMOVE_ITEM SUNSHINE_SOURCES ${CMAKE_SOURCE_DIR}/src/main.cpp) add_executable(${PROJECT_NAME} ${TEST_SOURCES} ${SUNSHINE_SOURCES}) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17) +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) target_link_libraries(${PROJECT_NAME} ${SUNSHINE_EXTERNAL_LIBRARIES} gtest diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index b7767bc663..fb56b38b3c 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -5,7 +5,7 @@ project(sunshine_tools) include_directories("${CMAKE_SOURCE_DIR}") add_executable(dxgi-info dxgi.cpp) -set_target_properties(dxgi-info PROPERTIES CXX_STANDARD 17) +set_target_properties(dxgi-info PROPERTIES CXX_STANDARD 20) target_link_libraries(dxgi-info ${CMAKE_THREAD_LIBS_INIT} dxgi @@ -13,7 +13,7 @@ target_link_libraries(dxgi-info target_compile_options(dxgi-info PRIVATE ${SUNSHINE_COMPILE_OPTIONS}) add_executable(audio-info audio.cpp) -set_target_properties(audio-info PROPERTIES CXX_STANDARD 17) +set_target_properties(audio-info PROPERTIES CXX_STANDARD 20) target_link_libraries(audio-info ${CMAKE_THREAD_LIBS_INIT} ksuser @@ -21,7 +21,7 @@ target_link_libraries(audio-info target_compile_options(audio-info PRIVATE ${SUNSHINE_COMPILE_OPTIONS}) add_executable(sunshinesvc sunshinesvc.cpp) -set_target_properties(sunshinesvc PROPERTIES CXX_STANDARD 17) +set_target_properties(sunshinesvc PROPERTIES CXX_STANDARD 20) target_link_libraries(sunshinesvc ${CMAKE_THREAD_LIBS_INIT} wtsapi32 @@ -29,7 +29,7 @@ target_link_libraries(sunshinesvc target_compile_options(sunshinesvc PRIVATE ${SUNSHINE_COMPILE_OPTIONS}) add_executable(ddprobe ddprobe.cpp) -set_target_properties(ddprobe PROPERTIES CXX_STANDARD 17) +set_target_properties(ddprobe PROPERTIES CXX_STANDARD 20) target_link_libraries(ddprobe ${CMAKE_THREAD_LIBS_INIT} dxgi From 9d5ee2f57d2c582b5b0f0c7eb67a8b86daffd9a9 Mon Sep 17 00:00:00 2001 From: TimmyOVO Date: Fri, 3 May 2024 01:52:29 +0800 Subject: [PATCH 03/34] fix(macos/input): incorrect mouse input for non-main display (#2461) --- src/platform/macos/display.mm | 3 +++ src/platform/macos/input.cpp | 22 ++++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/platform/macos/display.mm b/src/platform/macos/display.mm index 3468d46f55..47b83435e8 100644 --- a/src/platform/macos/display.mm +++ b/src/platform/macos/display.mm @@ -169,6 +169,9 @@ display->width = display->av_capture.frameWidth; display->height = display->av_capture.frameHeight; + // We also need set env_width and env_height for absolute mouse coordinates + display->env_width = display->width; + display->env_height = display->height; return display; } diff --git a/src/platform/macos/input.cpp b/src/platform/macos/input.cpp index 273416680e..11c6d22842 100644 --- a/src/platform/macos/input.cpp +++ b/src/platform/macos/input.cpp @@ -328,15 +328,12 @@ const KeyCodeMap kKeyCodesMap[] = { auto display = macos_input->display; auto event = macos_input->mouse_event; - if (location.x < 0) - location.x = 0; - if (location.x >= (double) CGDisplayPixelsWide(display)) - location.x = (double) CGDisplayPixelsWide(display) - 1; + // get display bounds for current display + CGRect display_bounds = CGDisplayBounds(display); - if (location.y < 0) - location.y = 0; - if (location.y >= (double) CGDisplayPixelsHigh(display)) - location.y = (double) CGDisplayPixelsHigh(display) - 1; + // limit mouse to current display bounds + location.x = std::clamp(location.x, display_bounds.origin.x, display_bounds.origin.x + display_bounds.size.width - 1); + location.y = std::clamp(location.y, display_bounds.origin.y, display_bounds.origin.y + display_bounds.size.height - 1); CGEventSetType(event, type); CGEventSetLocation(event, location); @@ -379,10 +376,15 @@ const KeyCodeMap kKeyCodesMap[] = { void abs_mouse(input_t &input, const touch_port_t &touch_port, float x, float y) { - auto scaling = ((macos_input_t *) input.get())->displayScaling; + auto macos_input = static_cast(input.get()); + auto scaling = macos_input->displayScaling; + auto display = macos_input->display; CGPoint location = CGPointMake(x * scaling, y * scaling); - + CGRect display_bounds = CGDisplayBounds(display); + // in order to get the correct mouse location for capturing display , we need to add the display bounds to the location + location.x += display_bounds.origin.x; + location.y += display_bounds.origin.y; post_mouse(input, kCGMouseButtonLeft, event_type_mouse(input), location, 0); } From c6fc12a0a4165ca3fca7458776679b6c1cd573fa Mon Sep 17 00:00:00 2001 From: Corey Garst Date: Tue, 7 May 2024 09:14:11 -0400 Subject: [PATCH 04/34] webui: Update resolution automation example text with auto refresh rate (#2503) --- src_assets/common/assets/web/apps.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src_assets/common/assets/web/apps.html b/src_assets/common/assets/web/apps.html index fe8d8f4fe3..3abde6c5d5 100644 --- a/src_assets/common/assets/web/apps.html +++ b/src_assets/common/assets/web/apps.html @@ -326,13 +326,13 @@

{{ $t('apps.env_vars_about') }}

{{ $t('apps.env_qres_example') }} -
cmd /C <{{ $t('apps.env_qres_path') }}>\QRes.exe /X:%SUNSHINE_CLIENT_WIDTH% /Y:%SUNSHINE_CLIENT_HEIGHT%
+
cmd /C <{{ $t('apps.env_qres_path') }}>\QRes.exe /X:%SUNSHINE_CLIENT_WIDTH% /Y:%SUNSHINE_CLIENT_HEIGHT% /R:%SUNSHINE_CLIENT_FPS%
{{ $t('apps.env_xrandr_example') }} -
sh -c "xrandr --output HDMI-1 --mode \"${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT}\" --rate 60"
+
sh -c "xrandr --output HDMI-1 --mode \"${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT}\" --rate ${SUNSHINE_CLIENT_FPS}"
{{ $t('apps.env_displayplacer_example') }} -
sh -c "displayplacer "id:<screenId> res:${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} hz:60 scaling:on origin:(0,0) degree:0""
+
sh -c "displayplacer "id:<screenId> res:${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} hz:${SUNSHINE_CLIENT_FPS} scaling:on origin:(0,0) degree:0""
Date: Fri, 10 May 2024 08:33:54 -0400 Subject: [PATCH 05/34] build(archlinux): bump gcc from 12 to 13 (#2519) --- packaging/linux/Arch/PKGBUILD | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packaging/linux/Arch/PKGBUILD b/packaging/linux/Arch/PKGBUILD index 6fde7fe5a9..3c02d95355 100644 --- a/packaging/linux/Arch/PKGBUILD +++ b/packaging/linux/Arch/PKGBUILD @@ -10,6 +10,8 @@ url=@PROJECT_HOMEPAGE_URL@ license=('GPL-3.0-only') install=sunshine.install +_gcc_version=13 + depends=('avahi' 'boost-libs' 'curl' @@ -37,7 +39,7 @@ checkdepends=('doxygen' 'graphviz') makedepends=('boost' 'cmake' - 'gcc12' + "gcc${_gcc_version}" 'git' 'make' 'nodejs' @@ -62,8 +64,8 @@ build() { export BUILD_VERSION="@GITHUB_BUILD_VERSION@" export COMMIT="@GITHUB_COMMIT@" - export CC=gcc-12 - export CXX=g++-12 + export CC="gcc-${_gcc_version}" + export CXX="g++-${_gcc_version}" export CFLAGS="${CFLAGS/-Werror=format-security/}" export CXXFLAGS="${CXXFLAGS/-Werror=format-security/}" @@ -81,11 +83,11 @@ build() { } check() { - export CC=gcc-12 - export CXX=g++-12 + export CC="gcc-${_gcc_version}" + export CXX="g++-${_gcc_version}" - cd "${srcdir}/build/tests" - ./test_sunshine --gtest_color=yes + cd "${srcdir}/build/tests" + ./test_sunshine --gtest_color=yes } package() { From b4c12cb77c46584775c949d7f3d16f122a1a801b Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sat, 11 May 2024 19:12:56 -0400 Subject: [PATCH 06/34] ci: fix code coverage (#2512) --- .github/workflows/CI.yml | 18 +++++++++++++++--- tests/CMakeLists.txt | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index ecc18a73d4..cfac7b0511 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -385,7 +385,7 @@ jobs: BRANCH: ${{ github.head_ref || github.ref_name }} BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version }} COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} - timeout-minutes: 5 + timeout-minutes: 10 run: | echo "nproc: $(nproc)" @@ -506,8 +506,11 @@ jobs: run: | ${{ steps.python.outputs.python-path }} -m pip install gcovr ${{ steps.python.outputs.python-path }} -m gcovr -r .. \ + --exclude-noncode-lines \ + --exclude-throw-branches \ + --exclude-unreachable-branches \ --exclude '.*tests/.*' \ - --exclude '.*tests/.*' \ + --exclude '.*third-party/.*' \ --xml-pretty \ -o coverage.xml @@ -524,6 +527,7 @@ jobs: files: ./build/coverage.xml flags: ${{ runner.os }} token: ${{ secrets.CODECOV_TOKEN }} + verbose: true - name: Create/Update GitHub Release if: ${{ needs.setup_release.outputs.create_release == 'true' }} @@ -842,6 +846,9 @@ jobs: cd ${build_dir} ${{ steps.python.outputs.python-path }} -m pip install gcovr sudo ${{ steps.python.outputs.python-path }} -m gcovr -r ../${dir} \ + --exclude-noncode-lines \ + --exclude-throw-branches \ + --exclude-unreachable-branches \ --exclude '.*${dir}/tests/.*' \ --exclude '.*${dir}/third-party/.*' \ --gcov-object-directory $(pwd) \ @@ -862,6 +869,7 @@ jobs: files: ./build/coverage.xml flags: ${{ runner.os }}-${{ matrix.os_version }} token: ${{ secrets.CODECOV_TOKEN }} + verbose: true - name: Create/Update GitHub Release if: ${{ needs.setup_release.outputs.create_release == 'true' && matrix.release }} @@ -1086,8 +1094,11 @@ jobs: run: | ${{ steps.python-path.outputs.python-path }} -m pip install gcovr ${{ steps.python-path.outputs.python-path }} -m gcovr -r .. \ + --exclude-noncode-lines \ + --exclude-throw-branches \ + --exclude-unreachable-branches \ --exclude '.*tests/.*' \ - --exclude '.*tests/.*' \ + --exclude '.*third-party/.*' \ --xml-pretty \ -o coverage.xml @@ -1104,6 +1115,7 @@ jobs: files: ./build/coverage.xml flags: ${{ runner.os }} token: ${{ secrets.CODECOV_TOKEN }} + verbose: true - name: Package Windows Debug Info working-directory: build diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0218224184..eeb6a81059 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -19,8 +19,8 @@ include_directories("${GTEST_SOURCE_DIR}/googletest/include" "${GTEST_SOURCE_DIR # coverage # https://gcovr.com/en/stable/guide/compiling.html#compiler-options -set(CMAKE_CXX_FLAGS "-fprofile-arcs -ftest-coverage -O1") -set(CMAKE_C_FLAGS "-fprofile-arcs -ftest-coverage -O1") +set(CMAKE_CXX_FLAGS "-fprofile-arcs -ftest-coverage -ggdb -O0") +set(CMAKE_C_FLAGS "-fprofile-arcs -ftest-coverage -ggdb -O0") # if windows if (WIN32) From 4e49db9fd58013720f6d7b3574e5033ec182b6f3 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sun, 12 May 2024 11:27:41 -0400 Subject: [PATCH 07/34] build(linux)!: add fedora 40 and remove fedora 38 (#2525) --- README.rst | 2 +- ...ora-38.dockerfile => fedora-40.dockerfile} | 61 +++++++++++-------- docs/source/about/setup.rst | 2 +- docs/source/building/linux.rst | 2 +- 4 files changed, 38 insertions(+), 29 deletions(-) rename docker/{fedora-38.dockerfile => fedora-40.dockerfile} (70%) diff --git a/README.rst b/README.rst index 5ea9001484..89a16daf39 100644 --- a/README.rst +++ b/README.rst @@ -29,7 +29,7 @@ System Requirements "OS", "Windows: 10+ (Windows Server does not support virtual gamepads)" "", "macOS: 12+" "", "Linux/Debian: 11 (bullseye)" - "", "Linux/Fedora: 38+" + "", "Linux/Fedora: 39+" "", "Linux/Ubuntu: 22.04+ (jammy)" "Network", "Host: 5GHz, 802.11ac" "", "Client: 5GHz, 802.11ac" diff --git a/docker/fedora-38.dockerfile b/docker/fedora-40.dockerfile similarity index 70% rename from docker/fedora-38.dockerfile rename to docker/fedora-40.dockerfile index 52796d509f..94a8a9fa73 100644 --- a/docker/fedora-38.dockerfile +++ b/docker/fedora-40.dockerfile @@ -4,7 +4,7 @@ # platforms_pr: linux/amd64 # no-cache-filters: sunshine-base,artifacts,sunshine ARG BASE=fedora -ARG TAG=38 +ARG TAG=40 FROM ${BASE}:${TAG} AS sunshine-base FROM sunshine-base as sunshine-build @@ -30,11 +30,11 @@ set -e dnf -y update dnf -y group install "Development Tools" dnf -y install \ - boost-devel-1.78.0* \ - cmake-3.27.* \ + boost-devel-1.83.0* \ + cmake-3.28.* \ doxygen \ - gcc-13.2.* \ - gcc-c++-13.2.* \ + gcc-14.1.* \ + gcc-c++-14.1.* \ git \ graphviz \ libappindicator-gtk3-devel \ @@ -60,7 +60,7 @@ dnf -y install \ openssl-devel \ opus-devel \ pulseaudio-libs-devel \ - python3.10 \ + python3.11 \ rpm-build \ wget \ which \ @@ -72,27 +72,35 @@ dnf clean all rm -rf /var/cache/yum _DEPS +# TODO: re-enable cuda once cuda supports gcc-14 ## install cuda -WORKDIR /build/cuda +#WORKDIR /build/cuda ## versions: https://developer.nvidia.com/cuda-toolkit-archive -ENV CUDA_VERSION="12.4.0" -ENV CUDA_BUILD="550.54.14" +#ENV CUDA_VERSION="12.4.0" +#ENV CUDA_BUILD="550.54.14" ## hadolint ignore=SC3010 -RUN <<_INSTALL_CUDA -#!/bin/bash -set -e -cuda_prefix="https://developer.download.nvidia.com/compute/cuda/" -cuda_suffix="" -if [[ "${TARGETPLATFORM}" == 'linux/arm64' ]]; then - cuda_suffix="_sbsa" -fi -url="${cuda_prefix}${CUDA_VERSION}/local_installers/cuda_${CUDA_VERSION}_${CUDA_BUILD}_linux${cuda_suffix}.run" -echo "cuda url: ${url}" -wget "$url" --progress=bar:force:noscroll -q --show-progress -O ./cuda.run -chmod a+x ./cuda.run -./cuda.run --silent --toolkit --toolkitpath=/build/cuda --no-opengl-libs --no-man-page --no-drm -rm ./cuda.run -_INSTALL_CUDA +#RUN <<_INSTALL_CUDA +##!/bin/bash +#set -e +#cuda_prefix="https://developer.download.nvidia.com/compute/cuda/" +#cuda_suffix="" +#if [[ "${TARGETPLATFORM}" == 'linux/arm64' ]]; then +# cuda_suffix="_sbsa" +# +# # patch headers https://bugs.launchpad.net/ubuntu/+source/mumax3/+bug/2032624 +# sed -i 's/__Float32x4_t/int/g' /usr/include/bits/math-vector.h +# sed -i 's/__Float64x2_t/int/g' /usr/include/bits/math-vector.h +# sed -i 's/__SVFloat32_t/float/g' /usr/include/bits/math-vector.h +# sed -i 's/__SVFloat64_t/float/g' /usr/include/bits/math-vector.h +# sed -i 's/__SVBool_t/int/g' /usr/include/bits/math-vector.h +#fi +#url="${cuda_prefix}${CUDA_VERSION}/local_installers/cuda_${CUDA_VERSION}_${CUDA_BUILD}_linux${cuda_suffix}.run" +#echo "cuda url: ${url}" +#wget "$url" --progress=bar:force:noscroll -q --show-progress -O ./cuda.run +#chmod a+x ./cuda.run +#./cuda.run --silent --toolkit --toolkitpath=/build/cuda --no-opengl-libs --no-man-page --no-drm +#rm ./cuda.run +#_INSTALL_CUDA # copy repository WORKDIR /build/sunshine/ @@ -101,12 +109,13 @@ COPY --link .. . # setup build directory WORKDIR /build/sunshine/build +# TODO: re-add as first cmake argument: -DCMAKE_CUDA_COMPILER:PATH=/build/cuda/bin/nvcc \ +# TODO: enable cuda flag # cmake and cpack RUN <<_MAKE #!/bin/bash set -e cmake \ - -DCMAKE_CUDA_COMPILER:PATH=/build/cuda/bin/nvcc \ -DBUILD_WERROR=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ @@ -115,7 +124,7 @@ cmake \ -DSUNSHINE_ENABLE_WAYLAND=ON \ -DSUNSHINE_ENABLE_X11=ON \ -DSUNSHINE_ENABLE_DRM=ON \ - -DSUNSHINE_ENABLE_CUDA=ON \ + -DSUNSHINE_ENABLE_CUDA=OFF \ /build/sunshine make -j "$(nproc)" cpack -G RPM diff --git a/docs/source/about/setup.rst b/docs/source/about/setup.rst index 5c70c11a00..8ea0293755 100644 --- a/docs/source/about/setup.rst +++ b/docs/source/about/setup.rst @@ -43,8 +43,8 @@ Install sunshine_{arch}.flatpak 12.0.0 525.60.13 50;52;60;61;62;70;75;80;86;90 sunshine-debian-bookworm-{arch}.deb 12.0.0 525.60.13 50;52;60;61;62;70;75;80;86;90 sunshine-debian-bullseye-{arch}.deb 11.8.0 450.80.02 35;50;52;60;61;62;70;75;80;86;90 - sunshine-fedora-38-{arch}.rpm 12.4.0 525.60.13 50;52;60;61;62;70;75;80;86;90 sunshine-fedora-39-{arch}.rpm 12.4.0 525.60.13 50;52;60;61;62;70;75;80;86;90 + sunshine-fedora-40-{arch}.rpm n/a n/a n/a sunshine-ubuntu-22.04-{arch}.deb 11.8.0 450.80.02 35;50;52;60;61;62;70;75;80;86;90 sunshine-ubuntu-24.04-{arch}.deb 11.8.0 450.80.02 35;50;52;60;61;62;70;75;80;86;90 =========================================== ============== ============== ================================ diff --git a/docs/source/building/linux.rst b/docs/source/building/linux.rst index d263a7d07f..d0d0af6ed9 100644 --- a/docs/source/building/linux.rst +++ b/docs/source/building/linux.rst @@ -46,7 +46,7 @@ Install Requirements nvidia-cuda-dev \ # Cuda, NvFBC nvidia-cuda-toolkit # Cuda, NvFBC -Fedora 38, 39 +Fedora 39, 40 ^^^^^^^^^^^^^ Install Requirements From 66740900522f42564a2b0bd4e8a435ed24a61725 Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Sun, 12 May 2024 17:26:14 +0100 Subject: [PATCH 08/34] Unify asset building and use find_program to find NPM (#2522) --- cmake/targets/common.cmake | 33 +++++++++++++++++++++------------ cmake/targets/unix.cmake | 6 ------ cmake/targets/windows.cmake | 6 ------ 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/cmake/targets/common.cmake b/cmake/targets/common.cmake index ee79528c88..941ef0b733 100644 --- a/cmake/targets/common.cmake +++ b/cmake/targets/common.cmake @@ -3,18 +3,6 @@ add_executable(sunshine ${SUNSHINE_TARGET_FILES}) -# Homebrew build fails the vite build if we set these environment variables -# this block must be before the platform specific code -if(${SUNSHINE_BUILD_HOMEBREW}) - set(NPM_SOURCE_ASSETS_DIR "") - set(NPM_ASSETS_DIR "") - set(NPM_BUILD_HOMEBREW "true") -else() - set(NPM_SOURCE_ASSETS_DIR ${SUNSHINE_SOURCE_ASSETS_DIR}) - set(NPM_ASSETS_DIR ${CMAKE_BINARY_DIR}) - set(NPM_BUILD_HOMEBREW "") -endif() - # platform specific target definitions if(WIN32) include(${CMAKE_MODULE_PATH}/targets/windows.cmake) @@ -49,6 +37,27 @@ endif() target_compile_options(sunshine PRIVATE $<$:${SUNSHINE_COMPILE_OPTIONS}>;$<$:${SUNSHINE_COMPILE_OPTIONS_CUDA};-std=c++17>) # cmake-lint: disable=C0301 +# Homebrew build fails the vite build if we set these environment variables +if(${SUNSHINE_BUILD_HOMEBREW}) + set(NPM_SOURCE_ASSETS_DIR "") + set(NPM_ASSETS_DIR "") + set(NPM_BUILD_HOMEBREW "true") +else() + set(NPM_SOURCE_ASSETS_DIR ${SUNSHINE_SOURCE_ASSETS_DIR}) + set(NPM_ASSETS_DIR ${CMAKE_BINARY_DIR}) + set(NPM_BUILD_HOMEBREW "") +endif() + +#WebUI build +find_program(NPM npm REQUIRED) +add_custom_target(web-ui ALL + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMENT "Installing NPM Dependencies and Building the Web UI" + COMMAND "$<$:cmd;/C>" "${NPM}" install + COMMAND "${CMAKE_COMMAND}" -E env "SUNSHINE_BUILD_HOMEBREW=${NPM_BUILD_HOMEBREW}" "SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR}" "SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR}" "$<$:cmd;/C>" "${NPM}" run build # cmake-lint: disable=C0301 + COMMAND_EXPAND_LISTS + VERBATIM) + # tests if(BUILD_TESTS) add_subdirectory(tests) diff --git a/cmake/targets/unix.cmake b/cmake/targets/unix.cmake index 5527a9874f..047a0b3d38 100644 --- a/cmake/targets/unix.cmake +++ b/cmake/targets/unix.cmake @@ -1,8 +1,2 @@ # unix specific target definitions # put anything here that applies to both linux and macos - -#WebUI build -add_custom_target(web-ui ALL - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - COMMENT "Installing NPM Dependencies and Building the Web UI" - COMMAND sh -c \"npm install && SUNSHINE_BUILD_HOMEBREW=${NPM_BUILD_HOMEBREW} SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR} SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR} npm run build\") # cmake-lint: disable=C0301 diff --git a/cmake/targets/windows.cmake b/cmake/targets/windows.cmake index e429feaa82..341d7c2e74 100644 --- a/cmake/targets/windows.cmake +++ b/cmake/targets/windows.cmake @@ -4,9 +4,3 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll") find_library(ZLIB ZLIB1) list(APPEND SUNSHINE_EXTERNAL_LIBRARIES Wtsapi32.lib) - -#WebUI build -add_custom_target(web-ui ALL - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - COMMENT "Installing NPM Dependencies and Building the Web UI" - COMMAND cmd /C "npm install && set \"SUNSHINE_SOURCE_ASSETS_DIR=${NPM_SOURCE_ASSETS_DIR}\" && set \"SUNSHINE_ASSETS_DIR=${NPM_ASSETS_DIR}\" && npm run build") # cmake-lint: disable=C0301 From 659a426b03aaacd14793292c9b0771311ba8c995 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sun, 12 May 2024 13:13:20 -0400 Subject: [PATCH 09/34] fix(file_handler): avoid writing extra newline character (#2335) --- src/file_handler.cpp | 11 +------ tests/unit/test_file_handler.cpp | 50 ++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/file_handler.cpp b/src/file_handler.cpp index d078343180..1c7f98e9b3 100644 --- a/src/file_handler.cpp +++ b/src/file_handler.cpp @@ -31,16 +31,7 @@ namespace file_handler { } std::ifstream in(path); - - std::string input; - std::string base64_cert; - - while (!in.eof()) { - std::getline(in, input); - base64_cert += input + '\n'; - } - - return base64_cert; + return std::string { (std::istreambuf_iterator(in)), std::istreambuf_iterator() }; } /** diff --git a/tests/unit/test_file_handler.cpp b/tests/unit/test_file_handler.cpp index 9167b53de7..b77ba6188c 100644 --- a/tests/unit/test_file_handler.cpp +++ b/tests/unit/test_file_handler.cpp @@ -6,14 +6,54 @@ #include -TEST(FileHandlerTests, WriteFileTest) { - EXPECT_EQ(file_handler::write_file("write_file_test.txt", "test"), 0); +class FileHandlerTests: public virtual BaseTest, public ::testing::WithParamInterface> { +protected: + void + SetUp() override { + BaseTest::SetUp(); + } + + void + TearDown() override { + BaseTest::TearDown(); + } +}; +INSTANTIATE_TEST_SUITE_P( + TestFiles, + FileHandlerTests, + ::testing::Values( + std::make_tuple(0, ""), // empty file + std::make_tuple(1, "a"), // single character + std::make_tuple(2, "Mr. Blue Sky - Electric Light Orchestra"), // single line + std::make_tuple(3, R"( +Morning! Today's forecast calls for blue skies +The sun is shining in the sky +There ain't a cloud in sight +It's stopped raining +Everybody's in the play +And don't you know, it's a beautiful new day +Hey, hey, hey! +Running down the avenue +See how the sun shines brightly in the city +All the streets where once was pity +Mr. Blue Sky is living here today! +Hey, hey, hey! + )") // multi-line + )); + +TEST_P(FileHandlerTests, WriteFileTest) { + auto [fileNum, content] = GetParam(); + std::string fileName = "write_file_test_" + std::to_string(fileNum) + ".txt"; + EXPECT_EQ(file_handler::write_file(fileName.c_str(), content), 0); } -TEST(FileHandlerTests, ReadFileTest) { - // read file from WriteFileTest - EXPECT_EQ(file_handler::read_file("write_file_test.txt"), "test\n"); // sunshine adds a newline +TEST_P(FileHandlerTests, ReadFileTest) { + auto [fileNum, content] = GetParam(); + std::string fileName = "write_file_test_" + std::to_string(fileNum) + ".txt"; + EXPECT_EQ(file_handler::read_file(fileName.c_str()), content); +} +TEST(FileHandlerTests, ReadMissingFileTest) { // read missing file EXPECT_EQ(file_handler::read_file("non-existing-file.txt"), ""); } From 0a595dc7d2d86092b500e7afeb619c8e0dc1bfef Mon Sep 17 00:00:00 2001 From: Gilles Schintgen Date: Mon, 13 May 2024 00:55:43 +0200 Subject: [PATCH 10/34] fix(linux): add frame processing latency and logging improvements (#2502) --- src/audio.cpp | 4 ++++ src/platform/linux/kmsgrab.cpp | 4 +++- src/platform/linux/vaapi.cpp | 2 +- src/platform/linux/x11grab.cpp | 2 ++ src/video.cpp | 4 ++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/audio.cpp b/src/audio.cpp index 1995e380ea..f55046c078 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -115,6 +115,10 @@ namespace audio { opus_multistream_encoder_ctl(opus.get(), OPUS_SET_BITRATE(stream->bitrate)); opus_multistream_encoder_ctl(opus.get(), OPUS_SET_VBR(0)); + BOOST_LOG(info) << "Opus initialized: "sv << stream->sampleRate / 1000 << " kHz, "sv + << stream->channelCount << " channels, "sv + << stream->bitrate / 1000 << " kbps (total), LOWDELAY"sv; + auto frame_size = config.packetDuration * stream->sampleRate / 1000; while (auto sample = samples->pop()) { buffer_t packet { 1400 }; diff --git a/src/platform/linux/kmsgrab.cpp b/src/platform/linux/kmsgrab.cpp index ad97c9b07d..bad467d95b 100644 --- a/src/platform/linux/kmsgrab.cpp +++ b/src/platform/linux/kmsgrab.cpp @@ -1685,7 +1685,9 @@ namespace platf { if (!fb->handles[0]) { BOOST_LOG(error) << "Couldn't get handle for DRM Framebuffer ["sv << plane->fb_id << "]: Probably not permitted"sv; BOOST_LOG((window_system != window_system_e::X11 || config::video.capture == "kms") ? fatal : error) - << "You must run [sudo setcap cap_sys_admin+p $(readlink -f $(which sunshine))] for KMS display capture to work!"sv; + << "You must run [sudo setcap cap_sys_admin+p $(readlink -f $(which sunshine))] for KMS display capture to work!\n"sv + << "If you installed from AppImage or Flatpak, please refer to the official documentation:\n"sv + << "https://docs.lizardbyte.dev/projects/sunshine/en/latest/about/setup.html#install"sv; break; } diff --git a/src/platform/linux/vaapi.cpp b/src/platform/linux/vaapi.cpp index 9f1d3f325b..9fa751352f 100644 --- a/src/platform/linux/vaapi.cpp +++ b/src/platform/linux/vaapi.cpp @@ -371,7 +371,7 @@ namespace va { return -1; } - BOOST_LOG(debug) << "vaapi vendor: "sv << vaQueryVendorString(display.get()); + BOOST_LOG(info) << "vaapi vendor: "sv << vaQueryVendorString(display.get()); *hw_device_buf = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_VAAPI); auto ctx = (AVHWDeviceContext *) (*hw_device_buf)->data; diff --git a/src/platform/linux/x11grab.cpp b/src/platform/linux/x11grab.cpp index c3b23a4c97..3f6cd0c51b 100644 --- a/src/platform/linux/x11grab.cpp +++ b/src/platform/linux/x11grab.cpp @@ -679,6 +679,7 @@ namespace platf { } else { auto img_cookie = xcb::shm_get_image_unchecked(xcb.get(), display->root, offset_x, offset_y, width, height, ~0, XCB_IMAGE_FORMAT_Z_PIXMAP, seg, 0); + auto frame_timestamp = std::chrono::steady_clock::now(); xcb_img_t img_reply { xcb::shm_get_image_reply(xcb.get(), img_cookie, nullptr) }; if (!img_reply) { @@ -691,6 +692,7 @@ namespace platf { } std::copy_n((std::uint8_t *) data.data, frame_size(), img_out->data); + img_out->frame_timestamp = frame_timestamp; if (cursor) { blend_cursor(shm_xdisplay.get(), *img_out, offset_x, offset_y); diff --git a/src/video.cpp b/src/video.cpp index 6c1938c284..12f8cb4172 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -1294,6 +1294,10 @@ namespace video { return ret; } + if (av_packet->flags & AV_PKT_FLAG_KEY) { + BOOST_LOG(debug) << "Frame "sv << frame_nr << ": IDR Keyframe (AV_FRAME_FLAG_KEY)"sv; + } + if ((frame->flags & AV_FRAME_FLAG_KEY) && !(av_packet->flags & AV_PKT_FLAG_KEY)) { BOOST_LOG(error) << "Encoder did not produce IDR frame when requested!"sv; } From a5bbf36d459a071ba526a9aa2eb1d646967a44c1 Mon Sep 17 00:00:00 2001 From: Gilles Schintgen Date: Mon, 13 May 2024 14:20:58 +0200 Subject: [PATCH 11/34] AppImage: add needed VA-API libraries (Intel & AMD) (#2429) --- .github/workflows/CI.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index cfac7b0511..9110ff1f0b 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -326,6 +326,7 @@ jobs: # allow libfuse2 for appimage on 22.04 sudo add-apt-repository universe + # libx11-xcb-dev and libxcb-dri3-dev are required for building libva sudo apt-get install -y \ build-essential \ cmake \ @@ -349,10 +350,11 @@ jobs: libopus-dev \ libpulse-dev \ libssl-dev \ - libva-dev \ libvdpau-dev \ libwayland-dev \ libx11-dev \ + libx11-xcb-dev \ + libxcb-dri3-dev \ libxcb-shm0-dev \ libxcb-xfixes0-dev \ libxcb1-dev \ @@ -380,6 +382,24 @@ jobs: with: python-version: '3.11' + - name: Build latest libva + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + timeout-minutes: 5 + run: | + gh release download --archive=tar.gz --repo=intel/libva + tar xzf libva-*.tar.gz && rm libva-*.tar.gz + cd libva-* + ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu \ + --enable-drm \ + --enable-x11 \ + --enable-glx \ + --enable-wayland \ + --without-legacy # emgd, nvctrl, fglrx + make -j $(nproc) + sudo make install + cd .. && rm -rf libva-* + - name: Build Linux env: BRANCH: ${{ github.head_ref || github.ref_name }} From 9c5239cdf84027074ef4b215b730ba0eef64d4cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 10:06:46 -0400 Subject: [PATCH 12/34] build(deps): bump LizardByte/homebrew-release-action from 2024.417.220943 to 2024.511.160217 (#2527) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9110ff1f0b..401f97af97 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -654,7 +654,7 @@ jobs: echo "publish=${PUBLISH}" >> $GITHUB_OUTPUT - name: Validate and Publish Homebrew Formula - uses: LizardByte/homebrew-release-action@v2024.417.220943 + uses: LizardByte/homebrew-release-action@v2024.511.160217 with: formula_file: ${{ github.workspace }}/homebrew/sunshine.rb git_email: ${{ secrets.GH_BOT_EMAIL }} From 81c2ecfc07d066477a113b1920b1cca40e1c61c0 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Mon, 13 May 2024 10:53:15 -0400 Subject: [PATCH 13/34] build(macos): skip link of nonexistent directories (#2526) --- cmake/compile_definitions/macos.cmake | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cmake/compile_definitions/macos.cmake b/cmake/compile_definitions/macos.cmake index 549ea1d0f1..9d445869b1 100644 --- a/cmake/compile_definitions/macos.cmake +++ b/cmake/compile_definitions/macos.cmake @@ -2,9 +2,17 @@ add_compile_definitions(SUNSHINE_PLATFORM="macos") -link_directories(/opt/local/lib) -link_directories(/usr/local/lib) -link_directories(/opt/homebrew/lib) +set(MACOS_LINK_DIRECTORIES + /opt/homebrew/lib + /opt/local/lib + /usr/local/lib) + +foreach(dir ${MACOS_LINK_DIRECTORIES}) + if(EXISTS ${dir}) + link_directories(${dir}) + endif() +endforeach() + ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK) list(APPEND SUNSHINE_EXTERNAL_LIBRARIES From 4b6ff3797e405c05b49c3a4d9580fd3a06f28ff9 Mon Sep 17 00:00:00 2001 From: Vithorio Polten Date: Mon, 13 May 2024 14:08:13 -0300 Subject: [PATCH 14/34] refactor(ui): break down config.html into smaller pieces (#2491) Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> --- .gitignore | 3 + package.json | 1 + .../common/assets/web/PlatformLayout.vue | 27 + src_assets/common/assets/web/apps.html | 8 +- src_assets/common/assets/web/config.html | 1109 ++--------------- .../assets/web/configs/tabs/Advanced.vue | 103 ++ .../assets/web/configs/tabs/AudioVideo.vue | 89 ++ .../web/configs/tabs/ContainerEncoders.vue | 58 + .../common/assets/web/configs/tabs/Files.vue | 62 + .../assets/web/configs/tabs/General.vue | 135 ++ .../common/assets/web/configs/tabs/Inputs.vue | 183 +++ .../assets/web/configs/tabs/Network.vue | 161 +++ .../tabs/audiovideo/AdapterNameSelector.vue | 39 + .../tabs/audiovideo/DisplayDeviceOptions.vue | 45 + .../tabs/audiovideo/DisplayModesSettings.vue | 67 + .../LegacyDisplayOutputSelector.vue | 46 + .../audiovideo/NewDisplayOutputSelector.vue | 38 + .../configs/tabs/encoders/AmdAmfEncoder.vue | 127 ++ .../tabs/encoders/IntelQuickSyncEncoder.vue | 53 + .../tabs/encoders/NvidiaNvencEncoder.vue | 126 ++ .../configs/tabs/encoders/SoftwareEncoder.vue | 47 + .../tabs/encoders/VideotoolboxEncoder.vue | 44 + src_assets/common/assets/web/index.html | 8 +- src_assets/common/assets/web/init.js | 13 + src_assets/common/assets/web/password.html | 8 +- src_assets/common/assets/web/pin.html | 9 +- src_assets/common/assets/web/platform-i18n.js | 80 ++ .../assets/web/public/assets/locale/en.json | 14 +- .../common/assets/web/troubleshooting.html | 8 +- src_assets/common/assets/web/welcome.html | 8 +- 30 files changed, 1637 insertions(+), 1082 deletions(-) create mode 100644 src_assets/common/assets/web/PlatformLayout.vue create mode 100644 src_assets/common/assets/web/configs/tabs/Advanced.vue create mode 100644 src_assets/common/assets/web/configs/tabs/AudioVideo.vue create mode 100644 src_assets/common/assets/web/configs/tabs/ContainerEncoders.vue create mode 100644 src_assets/common/assets/web/configs/tabs/Files.vue create mode 100644 src_assets/common/assets/web/configs/tabs/General.vue create mode 100644 src_assets/common/assets/web/configs/tabs/Inputs.vue create mode 100644 src_assets/common/assets/web/configs/tabs/Network.vue create mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue create mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/DisplayDeviceOptions.vue create mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue create mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue create mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue create mode 100644 src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue create mode 100644 src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue create mode 100644 src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue create mode 100644 src_assets/common/assets/web/configs/tabs/encoders/SoftwareEncoder.vue create mode 100644 src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue create mode 100644 src_assets/common/assets/web/init.js create mode 100644 src_assets/common/assets/web/platform-i18n.js diff --git a/.gitignore b/.gitignore index 502fc37257..ccc8b0c748 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,6 @@ package-lock.json # Translations *.mo *.pot + +# Dummy macOS files +.DS_Store diff --git a/package.json b/package.json index 08b860c628..0c0f745580 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "scripts": { "build": "vite build --debug", + "build-clean": "vite build --debug --emptyOutDir", "dev": "vite build --watch" }, "dependencies": { diff --git a/src_assets/common/assets/web/PlatformLayout.vue b/src_assets/common/assets/web/PlatformLayout.vue new file mode 100644 index 0000000000..31064fec62 --- /dev/null +++ b/src_assets/common/assets/web/PlatformLayout.vue @@ -0,0 +1,27 @@ + + + + + + diff --git a/src_assets/common/assets/web/apps.html b/src_assets/common/assets/web/apps.html index 3abde6c5d5..0fd0651aa1 100644 --- a/src_assets/common/assets/web/apps.html +++ b/src_assets/common/assets/web/apps.html @@ -356,7 +356,7 @@

{{ $t('apps.env_vars_about') }}

diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index babb1ad4c4..146c18b530 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -36,1022 +36,56 @@

{{ $t('config.configuration') }}

-
- -
- - -
{{ $t('config.locale_desc') }}
-
- - -
- - -
{{ $t('config.sunshine_name_desc') }}
-
- - -
- - -
{{ $t('config.log_level_desc') }}
-
- - -
- - -
- {{ $t('config.channels_desc_1') }}
- {{ $t('_common.note') }} {{ $t('config.channels_desc_2') }} -
-
- - -
- -
{{ $t('config.global_prep_cmd_desc') }}
- - - - - - - - - - - - - - - - - -
{{ $t('config.do_cmd') }} {{ $t('config.undo_cmd') }} - {{ $t('config.run_as') }} -
- - - - -
- - -
-
- - -
- -
-
+ + -
- -
- - -
{{ $t('config.controller_desc') }}
-
- - -
- - -
{{ $t('config.gamepad_desc') }}
-
-
-
-

- -

-
-
-
- - -
{{ $t('config.ds4_back_as_touchpad_click_desc') }}
-
-
-
-
-
-
-
-

- -

-
-
-
- - -
{{ $t('config.motion_as_ds4_desc') }}
-
-
- - -
{{ $t('config.touchpad_as_ds4_desc') }}
-
-
-
-
-
- - -
- - -
{{ $t('config.back_button_timeout_desc') }}
-
- - -
-
- - -
{{ $t('config.keyboard_desc') }}
-
- - -
- - -
{{ $t('config.key_repeat_delay_desc') }}
-
- - -
- - -
{{ $t('config.key_repeat_frequency_desc') }}
-
- - -
- - -
{{ $t('config.always_send_scancodes_desc') }}
-
- - -
- - -
{{ $t('config.key_rightalt_to_key_win_desc') }}
-
- - -
-
- - -
{{ $t('config.mouse_desc') }}
-
- - -
- - -
{{ $t('config.high_resolution_scrolling_desc') }}
-
- - -
- - -
{{ $t('config.native_pen_touch_desc') }}
-
- -
+ + -
- -
- - -
- {{ $t('config.audio_sink_desc_win') }}
-
tools\audio-info.exe
-
-
-
- - -
- {{ $t('config.audio_sink_desc_linux') }}
-
pacmd list-sinks | grep "name:"
-
pactl info | grep Source
-
-
-
- - -
- - -
{{ $t('config.virtual_sink_desc') }}
-
- - -
- - -
{{ $t('config.install_steam_audio_drivers_desc') }}
-
- - -
- - -
- {{ $t('config.adapter_name_desc_win') }}
-
tools\dxgi-info.exe
-
-
-
- - -
- {{ $t('config.adapter_name_desc_linux_1') }}
-
ls /dev/dri/renderD*  # {{ $t('config.adapter_name_desc_linux_2') }}
-
-              vainfo --display drm --device /dev/dri/renderD129 | \
-                grep -E "((VAProfileH264High|VAProfileHEVCMain|VAProfileHEVCMain10).*VAEntrypointEncSlice)|Driver version"
-            
- {{ $t('config.adapter_name_desc_linux_3') }}
- VAProfileH264High : VAEntrypointEncSlice -
-
- - -
- - -
- {{ $t('config.output_name_desc_win') }}
-
tools\dxgi-info.exe
-
-
-
- - -
- {{ $t('config.output_name_desc_unix') }}
-
-
-              Info: Detecting displays
-              Info: Detected display: DVI-D-0 (id: 0) connected: false
-              Info: Detected display: HDMI-0 (id: 1) connected: true
-              Info: Detected display: DP-0 (id: 2) connected: true
-              Info: Detected display: DP-1 (id: 3) connected: false
-              Info: Detected display: DVI-D-1 (id: 4) connected: false
-            
-
-              Info: Detecting displays
-              Info: Detected display: Monitor-0 (id: 3) connected: true
-              Info: Detected display: Monitor-1 (id: 2) connected: true
-            
-
-
- - -
- -
- -
-
- {{r}} - × -
-
-
- - -
-
- - -
- -
-
- {{f}} - × -
-
-
- - -
-
- -
{{ $t('config.res_fps_desc') }}
-
- -
+ + -
- -
- - -
{{ $t('config.upnp_desc') }}
-
- - -
- - -
{{ $t('config.address_family_desc') }}
-
- - -
- - -
{{ $t('config.port_desc') }}
- -
- {{ $t('config.port_alert_1') }} -
- -
- {{ $t('config.port_alert_2') }} -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{ $t('config.port_protocol') }}{{ $t('config.port_port') }}{{ $t('config.port_note') }}
{{ $t('config.port_tcp') }}{{+effectivePort - 5}}
{{ $t('config.port_tcp') }}{{+effectivePort}} - -
{{ $t('config.port_tcp') }}{{+effectivePort + 1}}{{ $t('config.port_web_ui') }}
{{ $t('config.port_tcp') }}{{+effectivePort + 21}}
{{ $t('config.port_udp') }}{{+effectivePort + 9}} - {{+effectivePort + 11}}
- -
- {{ $t('config.port_warning') }} -
-
- - -
- - -
{{ $t('config.origin_web_ui_allowed_desc') }}
-
- - -
- - -
{{ $t('config.external_ip_desc') }}
-
- - -
- - -
{{ $t('config.lan_encryption_mode_desc') }}
-
- - -
- - -
{{ $t('config.wan_encryption_mode_desc') }}
-
- - -
- - -
{{ $t('config.ping_timeout_desc') }}
-
- -
+ + -
- -
- - -
{{ $t('config.file_apps_desc') }}
-
- - -
- - -
{{ $t('config.credentials_file_desc') }}
-
- - -
- - -
{{ $t('config.log_path_desc') }}
-
- - -
- - -
{{ $t('config.pkey_desc') }}
-
- - -
- - -
{{ $t('config.cert_desc') }}
-
- - -
- - -
{{ $t('config.file_state_desc') }}
-
- -
+ + -
- -
- - -
{{ $t('config.fec_percentage_desc') }}
-
- - -
- - -
{{ $t('config.qp_desc') }}
-
- - -
- - -
{{ $t('config.min_threads_desc') }}
-
- - -
- - -
{{ $t('config.hevc_mode_desc') }}
-
- - -
- - -
{{ $t('config.av1_mode_desc') }}
-
- - -
- - -
{{ $t('config.capture_desc') }}
-
- - -
- - -
{{ $t('config.encoder_desc') }}
-
- -
- - -
- -
- - -
{{ $t('config.nvenc_preset_desc') }}
-
- - -
- - -
{{ $t('config.nvenc_twopass_desc') }}
-
- - -
- - -
{{ $t('config.nvenc_spatial_aq_desc') }}
-
- - -
- - -
- {{ $t('config.nvenc_vbv_increase_desc') }}
-
- VBV/HRD -
-
- - -
-
-

- -

-
-
- -
- - -
- {{ $t('config.nvenc_realtime_hags_desc') }}
-
- HAGS -
-
- - -
- - -
{{ $t('config.nvenc_latency_over_power_desc') }}
-
- - -
- - -
{{ $t('config.nvenc_opengl_vulkan_on_dxgi_desc') }}
-
- - -
- - -
{{ $t('config.nvenc_h264_cavlc_desc') }}
-
-
-
-
-
-
- - -
- -
- - -
- - -
- - -
- - -
- - -
{{ $t('config.qsv_slow_hevc_desc') }}
-
- -
- - -
- -
- - -
{{ $t('config.amd_usage_desc') }}
-
- - -
-
-

- -

-
-
- -
- - -
{{ $t('config.amd_rc_desc') }}
-
- - -
- - -
{{ $t('config.amd_enforce_hrd_desc') }}
-
-
-
-
-
- - -
-
-

- -

-
-
- -
- - -
{{ $t('config.amd_quality_desc') }}
-
- - -
- - -
{{ $t('config.amd_preanalysis_desc') }}
-
- - -
- - -
{{ $t('config.amd_vbaq_desc') }}
-
- - -
- - -
{{ $t('config.amd_coder_desc') }}
-
-
-
-
-
-
- - -
- -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
{{ $t('config.sw_preset_desc') }}
-
- -
- - -
{{ $t('config.sw_tune_desc') }}
-
-
- + + + + +
@@ -1065,17 +99,34 @@

- + + diff --git a/src_assets/common/assets/web/configs/tabs/Advanced.vue b/src_assets/common/assets/web/configs/tabs/Advanced.vue new file mode 100644 index 0000000000..9704c91b2e --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/Advanced.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/AudioVideo.vue b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue new file mode 100644 index 0000000000..851e1e03a7 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue @@ -0,0 +1,89 @@ + + + diff --git a/src_assets/common/assets/web/configs/tabs/ContainerEncoders.vue b/src_assets/common/assets/web/configs/tabs/ContainerEncoders.vue new file mode 100644 index 0000000000..084c3001f5 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/ContainerEncoders.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/Files.vue b/src_assets/common/assets/web/configs/tabs/Files.vue new file mode 100644 index 0000000000..87b8f9500e --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/Files.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/General.vue b/src_assets/common/assets/web/configs/tabs/General.vue new file mode 100644 index 0000000000..cc473c803e --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/General.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/Inputs.vue b/src_assets/common/assets/web/configs/tabs/Inputs.vue new file mode 100644 index 0000000000..a5dd014870 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/Inputs.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/Network.vue b/src_assets/common/assets/web/configs/tabs/Network.vue new file mode 100644 index 0000000000..b32074a599 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/Network.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue new file mode 100644 index 0000000000..8fa94ce8b0 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue @@ -0,0 +1,39 @@ + + + diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayDeviceOptions.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayDeviceOptions.vue new file mode 100644 index 0000000000..4c0cd419d2 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayDeviceOptions.vue @@ -0,0 +1,45 @@ + + + diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue new file mode 100644 index 0000000000..74bd5d9f87 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue @@ -0,0 +1,67 @@ + + + diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue new file mode 100644 index 0000000000..c0042717af --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue @@ -0,0 +1,46 @@ + + + diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue new file mode 100644 index 0000000000..d9d79bdccd --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue @@ -0,0 +1,38 @@ + + + diff --git a/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue new file mode 100644 index 0000000000..209df9a76f --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/encoders/AmdAmfEncoder.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue new file mode 100644 index 0000000000..6b88b8b79b --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/encoders/IntelQuickSyncEncoder.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue new file mode 100644 index 0000000000..aa6ad003ac --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/encoders/NvidiaNvencEncoder.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/encoders/SoftwareEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/SoftwareEncoder.vue new file mode 100644 index 0000000000..d9e7c5dba5 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/encoders/SoftwareEncoder.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue b/src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue new file mode 100644 index 0000000000..41e29d46a7 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/encoders/VideotoolboxEncoder.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src_assets/common/assets/web/index.html b/src_assets/common/assets/web/index.html index 16dff05b92..1f191e54af 100644 --- a/src_assets/common/assets/web/index.html +++ b/src_assets/common/assets/web/index.html @@ -73,7 +73,7 @@

{{githubVersion.name}}

diff --git a/src_assets/common/assets/web/init.js b/src_assets/common/assets/web/init.js new file mode 100644 index 0000000000..3f30a0f034 --- /dev/null +++ b/src_assets/common/assets/web/init.js @@ -0,0 +1,13 @@ +import i18n from './locale' + +export function initApp(app, config) { + //Wait for locale initialization, then render + i18n().then(i18n => { + app.use(i18n); + app.provide('i18n', i18n.global) + app.mount('#app'); + if (config) { + config(app) + } + }); +} diff --git a/src_assets/common/assets/web/password.html b/src_assets/common/assets/web/password.html index 9044b272df..9a47cc565c 100644 --- a/src_assets/common/assets/web/password.html +++ b/src_assets/common/assets/web/password.html @@ -67,7 +67,7 @@

{{ $t('password.new_creds') }}

diff --git a/src_assets/common/assets/web/pin.html b/src_assets/common/assets/web/pin.html index 056bd6e20d..359c5e527b 100644 --- a/src_assets/common/assets/web/pin.html +++ b/src_assets/common/assets/web/pin.html @@ -26,6 +26,7 @@

{{ $t('pin.pin_pairing') }}

import { createApp } from 'vue' import i18n from './locale.js' import Navbar from './Navbar.vue' + import {initApp} from "./init"; let app = createApp({ components: { @@ -33,11 +34,7 @@

{{ $t('pin.pin_pairing') }}

} }); - //Wait for locale initialization, then render - i18n().then(i18n => { - app.use(i18n); - app.mount('#app'); - + initApp(app, (app => { // this must be after mounting the app document.querySelector("#form").addEventListener("submit", (e) => { e.preventDefault(); @@ -59,5 +56,5 @@

{{ $t('pin.pin_pairing') }}

} }); }); - }); + })); diff --git a/src_assets/common/assets/web/platform-i18n.js b/src_assets/common/assets/web/platform-i18n.js new file mode 100644 index 0000000000..1da1437205 --- /dev/null +++ b/src_assets/common/assets/web/platform-i18n.js @@ -0,0 +1,80 @@ +import {inject} from 'vue' + +class PlatformMessageI18n { + /** + * @param {string} platform + */ + constructor(platform) { + this.platform = platform + } + + /** + * @param {string} key + * @param {string} platform identifier + * @return {string} key with platform identifier + */ + getPlatformKey(key, platform) { + return key + '_' + platform + } + + /** + * @param {string} key + * @param {string?} defaultMsg + * @return {string} translated message or defaultMsg if provided + */ + getMessageUsingPlatform(key, defaultMsg) { + const realKey = this.getPlatformKey(key, this.platform) + const i18n = inject('i18n') + let message = i18n.t(realKey) + + if (message !== realKey) { + // We got a message back, return early + return message + } + + // If on Windows, we don't fallback to unix, so return early + if (this.platform === 'windows') { + return defaultMsg ? defaultMsg : message + } + + // there's no message for key, check for unix version + const unixKey = this.getPlatformKey(key, 'unix') + message = i18n.t(unixKey) + + if (message === unixKey && defaultMsg) { + // there's no message for unix key, return defaultMsg + return defaultMsg + } + return message + } +} + +/** + * @param {string?} platform + * @return {PlatformMessageI18n} instance + */ +export function usePlatformI18n(platform) { + if (!platform) { + platform = inject('platform').value + } + + if (!platform) { + throw 'platform argument missing' + } + + return inject( + 'platformMessage', + () => new PlatformMessageI18n(platform), + true + ) +} + +/** + * @param {string} key + * @param {string?} defaultMsg + * @return {string} translated message or defaultMsg if provided + */ +export function $tp(key, defaultMsg) { + const pm = usePlatformI18n() + return pm.getMessageUsingPlatform(key, defaultMsg) +} diff --git a/src_assets/common/assets/web/public/assets/locale/en.json b/src_assets/common/assets/web/public/assets/locale/en.json index 4f41fb42a5..f0e875e1a3 100644 --- a/src_assets/common/assets/web/public/assets/locale/en.json +++ b/src_assets/common/assets/web/public/assets/locale/en.json @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", + "adapter_name_desc_windows": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", + "adapter_name_placeholder_windows": "Radeon RX 580 Series", "add": "Add", "address_family": "Address Family", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Audio Sink", "audio_sink_desc_linux": "The name of the audio sink used for Audio Loopback. If you do not specify this variable, pulseaudio will select the default monitor device. You can find the name of the audio sink using either command:", "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "audio_sink_desc_windows": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", + "audio_sink_placeholder_windows": "Speakers (High Definition Audio Device)", "av1_mode": "AV1 Support", "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", "av1_mode_1": "Sunshine will not advertise support for AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", "key_repeat_frequency": "Key Repeat Frequency", "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", + "key_rightalt_to_key_windows": "Map Right Alt key to Windows key", "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", "keyboard": "Enable Keyboard Input", "keyboard_desc": "Allows guests to control the host system with the keyboard", @@ -244,9 +244,9 @@ "origin_web_ui_allowed_pc": "Only localhost may access Web UI", "origin_web_ui_allowed_wan": "Anyone may access Web UI", "output_name_desc_unix": "During Sunshine startup, you should see the list of detected displays. Note: You need to use the id value inside the parenthesis.", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", + "output_name_desc_windows": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", "output_name_unix": "Display number", - "output_name_win": "Output Name", + "output_name_windows": "Output Name", "ping_timeout": "Ping Timeout", "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", "pkey": "Private Key", diff --git a/src_assets/common/assets/web/troubleshooting.html b/src_assets/common/assets/web/troubleshooting.html index 8fce7e4ba9..0049774136 100644 --- a/src_assets/common/assets/web/troubleshooting.html +++ b/src_assets/common/assets/web/troubleshooting.html @@ -114,7 +114,7 @@

{{ $t('troubleshooting.logs') }}

diff --git a/src_assets/common/assets/web/welcome.html b/src_assets/common/assets/web/welcome.html index c2946c745d..cf1e74ba8e 100644 --- a/src_assets/common/assets/web/welcome.html +++ b/src_assets/common/assets/web/welcome.html @@ -53,8 +53,8 @@

From d8e73cc6d1a8e4db371d8d3ce6c61c685d64ebcf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 16:06:25 -0400 Subject: [PATCH 15/34] build(deps): bump furo from 2024.1.29 to 2024.5.6 (#2511) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 46e47734df..2898d75950 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ breathe==4.35.0 -furo==2024.1.29 +furo==2024.5.6 m2r2==0.3.3.post2 rstcheck[sphinx]==6.2.1 rstfmt==0.0.14 From 542cc710766fe3d5fb03bdc1cc618acc9815b9ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 17:57:45 -0400 Subject: [PATCH 16/34] build(deps): bump packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp from `5532d43` to `e524683` (#2517) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp b/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp index 5532d4354e..e5246830bb 160000 --- a/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp +++ b/packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp @@ -1 +1 @@ -Subproject commit 5532d4354e05ccfc3421e670fcb4e7fa5512ab39 +Subproject commit e5246830bb1b23397b2f9fd1813a79f5c6d2ccb0 From 2cadb815e68fc468b061f44f8a0b64ff4f839257 Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Mon, 13 May 2024 23:56:31 +0100 Subject: [PATCH 17/34] Allow a custom FFmpeg build to be provided using CMake variables (#1970) --- cmake/compile_definitions/linux.cmake | 1 - cmake/dependencies/common.cmake | 90 +++++++++++++++------------ 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/cmake/compile_definitions/linux.cmake b/cmake/compile_definitions/linux.cmake index 5647dc6b3e..b80adfc9a6 100644 --- a/cmake/compile_definitions/linux.cmake +++ b/cmake/compile_definitions/linux.cmake @@ -248,7 +248,6 @@ list(APPEND PLATFORM_TARGET_FILES list(APPEND PLATFORM_LIBRARIES Boost::dynamic_linking dl - numa pulse pulse-simple) diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index 29bed10e5c..bddee0393a 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -20,53 +20,63 @@ pkg_check_modules(MINIUPNP miniupnpc REQUIRED) include_directories(SYSTEM ${MINIUPNP_INCLUDE_DIRS}) # ffmpeg pre-compiled binaries -if(WIN32) - if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") - message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) +if(NOT DEFINED FFMPEG_PREPARED_BINARIES) + if(WIN32) + if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") + message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + endif() + set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) + set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/windows-x86_64") + elseif(APPLE) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/macos-x86_64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/macos-aarch64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc") + message(FATAL_ERROR "PowerPC is not supported on macOS") + else() + message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + endif() + elseif(UNIX) + set(FFMPEG_PLATFORM_LIBRARIES numa va va-drm va-x11 vdpau X11) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + list(APPEND FFMPEG_PLATFORM_LIBRARIES mfx) + set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/linux-x86_64") + set(CPACK_DEB_PLATFORM_PACKAGE_DEPENDS "libmfx1,") + set(CPACK_RPM_PLATFORM_PACKAGE_REQUIRES "intel-mediasdk >= 22.3.0,") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/linux-aarch64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64") + set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/linux-powerpc64le") + else() + message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + endif() endif() - set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) - set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/windows-x86_64") -elseif(APPLE) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/macos-x86_64") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/macos-aarch64") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc") - message(FATAL_ERROR "PowerPC is not supported on macOS") - else() - message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) + if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") + set(HDR10_PLUS_LIBRARY + "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") endif() -elseif(UNIX) - set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 vdpau X11) - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - list(APPEND FFMPEG_PLATFORM_LIBRARIES mfx) - set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/linux-x86_64") - set(CPACK_DEB_PLATFORM_PACKAGE_DEPENDS "libmfx1,") - set(CPACK_RPM_PLATFORM_PACKAGE_REQUIRES "intel-mediasdk >= 22.3.0,") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/linux-aarch64") - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64") - set(FFMPEG_PREPARED_BINARIES "${CMAKE_SOURCE_DIR}/third-party/build-deps/ffmpeg/linux-powerpc64le") - else() - message(FATAL_ERROR "Unsupported system processor:" ${CMAKE_SYSTEM_PROCESSOR}) - endif() -endif() -set(FFMPEG_INCLUDE_DIRS - "${FFMPEG_PREPARED_BINARIES}/include") -if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") - set(HDR10_PLUS_LIBRARY - "${FFMPEG_PREPARED_BINARIES}/lib/libhdr10plus.a") -endif() -set(FFMPEG_LIBRARIES + set(FFMPEG_LIBRARIES + "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libx264.a" + "${FFMPEG_PREPARED_BINARIES}/lib/libx265.a" + ${HDR10_PLUS_LIBRARY} + ${FFMPEG_PLATFORM_LIBRARIES}) +else() + set(FFMPEG_LIBRARIES "${FFMPEG_PREPARED_BINARIES}/lib/libavcodec.a" "${FFMPEG_PREPARED_BINARIES}/lib/libavutil.a" "${FFMPEG_PREPARED_BINARIES}/lib/libcbs.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libSvtAv1Enc.a" "${FFMPEG_PREPARED_BINARIES}/lib/libswscale.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libx264.a" - "${FFMPEG_PREPARED_BINARIES}/lib/libx265.a" - ${HDR10_PLUS_LIBRARY} ${FFMPEG_PLATFORM_LIBRARIES}) +endif() + +set(FFMPEG_INCLUDE_DIRS + "${FFMPEG_PREPARED_BINARIES}/include") # platform specific dependencies if(WIN32) From 9ee6811fe55ca11be89fb741142ecd3cd0c39fbf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 21:59:25 -0400 Subject: [PATCH 18/34] build(deps): bump third-party/tray from `4d8b798` to `cb33552` (#2528) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> --- cmake/compile_definitions/common.cmake | 2 +- cmake/compile_definitions/linux.cmake | 2 +- cmake/compile_definitions/macos.cmake | 2 +- cmake/compile_definitions/windows.cmake | 2 +- src/system_tray.cpp | 2 +- third-party/tray | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/compile_definitions/common.cmake b/cmake/compile_definitions/common.cmake index 6e03829584..0c0bf4e8f5 100644 --- a/cmake/compile_definitions/common.cmake +++ b/cmake/compile_definitions/common.cmake @@ -55,7 +55,7 @@ set(SUNSHINE_TARGET_FILES "${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/src/Rtsp.h" "${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/src/RtspParser.c" "${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/src/Video.h" - "${CMAKE_SOURCE_DIR}/third-party/tray/tray.h" + "${CMAKE_SOURCE_DIR}/third-party/tray/src/tray.h" "${CMAKE_SOURCE_DIR}/src/upnp.cpp" "${CMAKE_SOURCE_DIR}/src/upnp.h" "${CMAKE_SOURCE_DIR}/src/cbs.cpp" diff --git a/cmake/compile_definitions/linux.cmake b/cmake/compile_definitions/linux.cmake index b80adfc9a6..b323eb82e8 100644 --- a/cmake/compile_definitions/linux.cmake +++ b/cmake/compile_definitions/linux.cmake @@ -218,7 +218,7 @@ if(${SUNSHINE_ENABLE_TRAY}) include_directories(SYSTEM ${APPINDICATOR_INCLUDE_DIRS} ${LIBNOTIFY_INCLUDE_DIRS}) link_directories(${APPINDICATOR_LIBRARY_DIRS} ${LIBNOTIFY_LIBRARY_DIRS}) - list(APPEND PLATFORM_TARGET_FILES "${CMAKE_SOURCE_DIR}/third-party/tray/tray_linux.c") + list(APPEND PLATFORM_TARGET_FILES "${CMAKE_SOURCE_DIR}/third-party/tray/src/tray_linux.c") list(APPEND SUNSHINE_EXTERNAL_LIBRARIES ${APPINDICATOR_LIBRARIES} ${LIBNOTIFY_LIBRARIES}) endif() else() diff --git a/cmake/compile_definitions/macos.cmake b/cmake/compile_definitions/macos.cmake index 9d445869b1..ab30a641b3 100644 --- a/cmake/compile_definitions/macos.cmake +++ b/cmake/compile_definitions/macos.cmake @@ -54,5 +54,5 @@ if(SUNSHINE_ENABLE_TRAY) list(APPEND SUNSHINE_EXTERNAL_LIBRARIES ${COCOA}) list(APPEND PLATFORM_TARGET_FILES - "${CMAKE_SOURCE_DIR}/third-party/tray/tray_darwin.m") + "${CMAKE_SOURCE_DIR}/third-party/tray/src/tray_darwin.m") endif() diff --git a/cmake/compile_definitions/windows.cmake b/cmake/compile_definitions/windows.cmake index 26e89a20b8..02807aed31 100644 --- a/cmake/compile_definitions/windows.cmake +++ b/cmake/compile_definitions/windows.cmake @@ -79,5 +79,5 @@ list(PREPEND PLATFORM_LIBRARIES if(SUNSHINE_ENABLE_TRAY) list(APPEND PLATFORM_TARGET_FILES - "${CMAKE_SOURCE_DIR}/third-party/tray/tray_windows.c") + "${CMAKE_SOURCE_DIR}/third-party/tray/src/tray_windows.c") endif() diff --git a/src/system_tray.cpp b/src/system_tray.cpp index c34c3d75a9..06a147f2b3 100644 --- a/src/system_tray.cpp +++ b/src/system_tray.cpp @@ -31,7 +31,7 @@ #include // lib includes - #include "tray/tray.h" + #include "tray/src/tray.h" #include #include diff --git a/third-party/tray b/third-party/tray index 4d8b798caf..cb33552612 160000 --- a/third-party/tray +++ b/third-party/tray @@ -1 +1 @@ -Subproject commit 4d8b798cafdd11285af9409c16b5f792968e0045 +Subproject commit cb33552612edeaef824e95ecc0e5adca502d109a From 786a9acde1724485ca7860856c4eb17f1b18b52a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 08:40:49 -0400 Subject: [PATCH 19/34] build(deps): bump packaging/linux/flatpak/deps/shared-modules from `ec91811` to `782d3cc` (#2479) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packaging/linux/flatpak/deps/shared-modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/linux/flatpak/deps/shared-modules b/packaging/linux/flatpak/deps/shared-modules index ec91811777..782d3cc04c 160000 --- a/packaging/linux/flatpak/deps/shared-modules +++ b/packaging/linux/flatpak/deps/shared-modules @@ -1 +1 @@ -Subproject commit ec91811777c655b6a3091d60f1eadd79e0fbc957 +Subproject commit 782d3cc04ccdd8071017f622d4bacd35faecbd86 From b87fd4218fbaa56a4666b496048f017cc5d8168e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 11:11:56 -0400 Subject: [PATCH 20/34] build(deps): bump babel from 2.14.0 to 2.15.0 (#2504) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- scripts/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/requirements.txt b/scripts/requirements.txt index dc931f2df2..9cfd158f3f 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,2 +1,2 @@ -Babel==2.14.0 +Babel==2.15.0 clang-format From c5d8e1b1a098a10c251c8c7c3652447441943052 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 12:40:44 -0400 Subject: [PATCH 21/34] build(deps): bump vue from 3.4.23 to 3.4.27 (#2509) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0c0f745580..518070b2b1 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "bootstrap": "5.3.3", "vite": "4.5.2", "vite-plugin-ejs": "1.6.4", - "vue": "3.4.23", + "vue": "3.4.27", "vue-i18n": "9.13.0" } } From ff54ab2852e13e25ecdeaaab8f66639b795b5c33 Mon Sep 17 00:00:00 2001 From: Vithorio Polten Date: Tue, 14 May 2024 15:14:40 -0300 Subject: [PATCH 22/34] fix(macos): fix broken streaming on MacOS (#2485) --- src/platform/macos/av_img_t.h | 46 ++++++++++++++++--------- src/platform/macos/display.mm | 44 +++++++++++++++-------- src/platform/macos/nv12_zero_device.cpp | 3 ++ src/platform/macos/nv12_zero_device.h | 1 - src/video.cpp | 9 +++-- 5 files changed, 70 insertions(+), 33 deletions(-) diff --git a/src/platform/macos/av_img_t.h b/src/platform/macos/av_img_t.h index fb0d7ecd0f..4279680068 100644 --- a/src/platform/macos/av_img_t.h +++ b/src/platform/macos/av_img_t.h @@ -11,42 +11,56 @@ namespace platf { struct av_sample_buf_t { + CMSampleBufferRef buf; + explicit av_sample_buf_t(CMSampleBufferRef buf): buf((CMSampleBufferRef) CFRetain(buf)) {} ~av_sample_buf_t() { - CFRelease(buf); + if (buf != nullptr) { + CFRelease(buf); + } } - - CMSampleBufferRef buf; }; struct av_pixel_buf_t { - explicit av_pixel_buf_t(CVPixelBufferRef buf): - buf((CVPixelBufferRef) CFRetain(buf)), - locked(false) {} + CVPixelBufferRef buf; + + // Constructor + explicit av_pixel_buf_t(CMSampleBufferRef sb): + buf( + CMSampleBufferGetImageBuffer(sb)) { + CVPixelBufferLockBaseAddress(buf, kCVPixelBufferLock_ReadOnly); + } [[nodiscard]] uint8_t * - lock() const { - if (!locked) { - CVPixelBufferLockBaseAddress(buf, kCVPixelBufferLock_ReadOnly); - } - return (uint8_t *) CVPixelBufferGetBaseAddress(buf); + data() const { + return static_cast(CVPixelBufferGetBaseAddress(buf)); } + // Destructor ~av_pixel_buf_t() { - if (locked) { + if (buf != nullptr) { CVPixelBufferUnlockBaseAddress(buf, kCVPixelBufferLock_ReadOnly); } - CFRelease(buf); } + }; - CVPixelBufferRef buf; - bool locked; + struct av_img_t: img_t { + std::shared_ptr sample_buffer; + std::shared_ptr pixel_buffer; }; - struct av_img_t: public img_t { + struct temp_retain_av_img_t { std::shared_ptr sample_buffer; std::shared_ptr pixel_buffer; + uint8_t *data; + + temp_retain_av_img_t( + std::shared_ptr sb, + std::shared_ptr pb, + uint8_t *dt): + sample_buffer(std::move(sb)), + pixel_buffer(std::move(pb)), data(dt) {} }; } // namespace platf diff --git a/src/platform/macos/display.mm b/src/platform/macos/display.mm index 47b83435e8..dc7c7b6853 100644 --- a/src/platform/macos/display.mm +++ b/src/platform/macos/display.mm @@ -31,6 +31,9 @@ capture_e capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) override { auto signal = [av_capture capture:^(CMSampleBufferRef sampleBuffer) { + auto new_sample_buffer = std::make_shared(sampleBuffer); + auto new_pixel_buffer = std::make_shared(new_sample_buffer->buf); + std::shared_ptr img_out; if (!pull_free_image_cb(img_out)) { // got interrupt signal @@ -39,17 +42,22 @@ } auto av_img = std::static_pointer_cast(img_out); - CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); + auto old_data_retainer = std::make_shared( + av_img->sample_buffer, + av_img->pixel_buffer, + img_out->data); - av_img->sample_buffer = std::make_shared(sampleBuffer); - av_img->pixel_buffer = std::make_shared(pixelBuffer); - img_out->data = av_img->pixel_buffer->lock(); + av_img->sample_buffer = new_sample_buffer; + av_img->pixel_buffer = new_pixel_buffer; + img_out->data = new_pixel_buffer->data(); - img_out->width = (int) CVPixelBufferGetWidth(pixelBuffer); - img_out->height = (int) CVPixelBufferGetHeight(pixelBuffer); - img_out->row_pitch = (int) CVPixelBufferGetBytesPerRow(pixelBuffer); + img_out->width = (int) CVPixelBufferGetWidth(new_pixel_buffer->buf); + img_out->height = (int) CVPixelBufferGetHeight(new_pixel_buffer->buf); + img_out->row_pitch = (int) CVPixelBufferGetBytesPerRow(new_pixel_buffer->buf); img_out->pixel_pitch = img_out->row_pitch / img_out->width; + old_data_retainer = nullptr; + if (!push_captured_image_cb(std::move(img_out), true)) { // got interrupt signal // returning false here stops capture backend @@ -93,19 +101,27 @@ int dummy_img(img_t *img) override { auto signal = [av_capture capture:^(CMSampleBufferRef sampleBuffer) { + auto new_sample_buffer = std::make_shared(sampleBuffer); + auto new_pixel_buffer = std::make_shared(new_sample_buffer->buf); + auto av_img = (av_img_t *) img; - CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); + auto old_data_retainer = std::make_shared( + av_img->sample_buffer, + av_img->pixel_buffer, + img->data); - av_img->sample_buffer = std::make_shared(sampleBuffer); - av_img->pixel_buffer = std::make_shared(pixelBuffer); - img->data = av_img->pixel_buffer->lock(); + av_img->sample_buffer = new_sample_buffer; + av_img->pixel_buffer = new_pixel_buffer; + img->data = new_pixel_buffer->data(); - img->width = (int) CVPixelBufferGetWidth(pixelBuffer); - img->height = (int) CVPixelBufferGetHeight(pixelBuffer); - img->row_pitch = (int) CVPixelBufferGetBytesPerRow(pixelBuffer); + img->width = (int) CVPixelBufferGetWidth(new_pixel_buffer->buf); + img->height = (int) CVPixelBufferGetHeight(new_pixel_buffer->buf); + img->row_pitch = (int) CVPixelBufferGetBytesPerRow(new_pixel_buffer->buf); img->pixel_pitch = img->row_pitch / img->width; + old_data_retainer = nullptr; + // returning false here stops capture backend return false; }]; diff --git a/src/platform/macos/nv12_zero_device.cpp b/src/platform/macos/nv12_zero_device.cpp index c217c63766..ab0c478eb7 100644 --- a/src/platform/macos/nv12_zero_device.cpp +++ b/src/platform/macos/nv12_zero_device.cpp @@ -4,6 +4,7 @@ */ #include +#include "src/platform/macos/av_img_t.h" #include "src/platform/macos/nv12_zero_device.h" #include "src/video.h" @@ -24,6 +25,8 @@ namespace platf { CVPixelBufferRelease((CVPixelBufferRef) data); } + util::safe_ptr av_frame; + int nv12_zero_device::convert(platf::img_t &img) { auto *av_img = (av_img_t *) &img; diff --git a/src/platform/macos/nv12_zero_device.h b/src/platform/macos/nv12_zero_device.h index b83210cb94..e0f3230f92 100644 --- a/src/platform/macos/nv12_zero_device.h +++ b/src/platform/macos/nv12_zero_device.h @@ -5,7 +5,6 @@ #pragma once #include "src/platform/common.h" -#include "src/platform/macos/av_img_t.h" struct AVFrame; diff --git a/src/video.cpp b/src/video.cpp index 12f8cb4172..394e7d46fd 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -909,7 +909,9 @@ namespace video { }, {}, // SDR-specific options {}, // HDR-specific options - {}, // Fallback options + { + { "flags"s, "-low_delay" }, + }, // Fallback options std::nullopt, "h264_videotoolbox"s, }, @@ -1451,7 +1453,10 @@ namespace video { } } - ctx->flags |= (AV_CODEC_FLAG_CLOSED_GOP | AV_CODEC_FLAG_LOW_DELAY); + // We forcefully reset the flags to avoid clash on reuse of AVCodecContext + ctx->flags = 0; + ctx->flags |= AV_CODEC_FLAG_CLOSED_GOP | AV_CODEC_FLAG_LOW_DELAY; + ctx->flags2 |= AV_CODEC_FLAG2_FAST; auto avcodec_colorspace = avcodec_colorspace_from_sunshine_colorspace(colorspace); From d70a17a2fb1cf6ce7bb20628715ce79e4112c835 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Tue, 14 May 2024 19:20:37 -0400 Subject: [PATCH 23/34] ci(codeql): fix codeql builds (#2475) --- .codeql-prebuild-cpp-Linux.sh | 35 ++++++++++++++++++++++++----------- .github/workflows/CI.yml | 2 +- .github/workflows/codeql.yml | 12 ++++++++---- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/.codeql-prebuild-cpp-Linux.sh b/.codeql-prebuild-cpp-Linux.sh index d00c671ec2..042ae12c82 100644 --- a/.codeql-prebuild-cpp-Linux.sh +++ b/.codeql-prebuild-cpp-Linux.sh @@ -1,7 +1,23 @@ # install dependencies for C++ analysis set -e +CUDA_VERSION=11.8.0 +CUDA_BUILD=520.61.05 + +# install wget and cuda first sudo apt-get update -y +sudo apt-get install -y \ + wget + +# Install CUDA +url_base="https://developer.download.nvidia.com/compute/cuda/${CUDA_VERSION}/local_installers" +url="${url_base}/cuda_${CUDA_VERSION}_${CUDA_BUILD}_linux.run" +sudo wget -q -O /root/cuda.run ${url} +sudo chmod a+x /root/cuda.run +sudo /root/cuda.run --silent --toolkit --toolkitpath=/usr/local/cuda --no-opengl-libs --no-man-page --no-drm +sudo rm /root/cuda.run + +# Install dependencies sudo apt-get install -y \ build-essential \ gcc-10 \ @@ -32,8 +48,7 @@ sudo apt-get install -y \ libxcb1-dev \ libxfixes-dev \ libxrandr-dev \ - libxtst-dev \ - wget + libxtst-dev # clean apt cache sudo apt-get clean @@ -48,19 +63,17 @@ sudo update-alternatives --install \ --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-10 \ --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-10 -# Install CUDA -sudo wget \ - https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run \ - --progress=bar:force:noscroll -q --show-progress -O /root/cuda.run -sudo chmod a+x /root/cuda.run -sudo /root/cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm -sudo rm /root/cuda.run - # build mkdir -p build cd build || exit 1 -cmake -G "Unix Makefiles" .. +cmake \ + -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc \ + -G "Unix Makefiles" \ + .. make -j"$(nproc)" +# Delete CUDA +sudo rm -rf /usr/local/cuda + # skip autobuild echo "skip_autobuild=true" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 401f97af97..4ac8cb729c 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -476,7 +476,7 @@ jobs: # permissions chmod +x ../artifacts/sunshine.AppImage - - name: Delete cuda + - name: Delete CUDA # free up space on the runner run: | sudo rm -rf /usr/local/cuda diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ff12034f0c..ec4ed25018 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -63,7 +63,9 @@ jobs: if (key.toLowerCase() === 'swift') { osList = ['macos-latest']; } else if (key.toLowerCase() === 'cpp') { - osList = ['macos-latest', 'ubuntu-latest', 'windows-latest']; + // TODO: update macos to latest after the below issue is resolved + // https://github.com/github/codeql-action/issues/2266 + osList = ['macos-13', 'ubuntu-latest', 'windows-latest']; } for (let os of osList) { // set name for matrix @@ -120,10 +122,12 @@ jobs: steps: - name: Maximize build space - if: runner.os == 'Linux' - uses: easimon/maximize-build-space@v8 + if: >- + runner.os == 'Linux' && + matrix.language == 'cpp' + uses: easimon/maximize-build-space@v10 with: - root-reserve-mb: 20480 + root-reserve-mb: 30720 remove-dotnet: ${{ (matrix.language == 'csharp' && 'false') || 'true' }} remove-android: 'true' remove-haskell: 'true' From 80d1d94c743011511cc72ce689c8fdee527680ee Mon Sep 17 00:00:00 2001 From: skryvel <120495777+skryvel@users.noreply.github.com> Date: Wed, 15 May 2024 21:56:46 +0000 Subject: [PATCH 24/34] docs: packet loss and linux controller (#2514) Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> --- docs/source/troubleshooting/general.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/source/troubleshooting/general.rst b/docs/source/troubleshooting/general.rst index f37effeac5..116d27223c 100644 --- a/docs/source/troubleshooting/general.rst +++ b/docs/source/troubleshooting/general.rst @@ -37,3 +37,19 @@ NvFBC, NvENC, or general issues with Nvidia graphics card. - You can usually bypass the restriction with a driver patch. See Keylase's `Linux `__ or `Windows `__ patches for more guidance. + +Controller works on Steam but not in games +------------------------------------------ +One trick might be to change Steam settings and check or uncheck the configuration to support Xbox/Playstation +controllers and leave only support for Generic controllers. + +Also, if you have many controllers already directly connected to the host, it might help to disable them so that the +Sunshine provided controller (connected to the guest) is the "first" one. In Linux this can be accomplished on USB +devices by finding the device in `/sys/bus/usb/devices/` and writing `0` to the `authorized` file. + +Packet loss +----------- +Albeit unlikely, some guests might work better with a lower `MTU +`__ from the host. For example, a LG TV was found to have 30-60% +packet loss when the host had MTU set to 1500 and 1472, but 0% packet loss with a MTU of 1428 set in the network card +serving the stream (a Linux PC). It's unclear how that helped precisely so it's a last resort suggestion. From f4f343b0c37220973e83df707f91bd96dbfe40b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 19:29:45 -0400 Subject: [PATCH 25/34] build(deps): bump vue-i18n from 9.13.0 to 9.13.1 (#2455) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 518070b2b1..6cba6f53b3 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "vite": "4.5.2", "vite-plugin-ejs": "1.6.4", "vue": "3.4.27", - "vue-i18n": "9.13.0" + "vue-i18n": "9.13.1" } } From 1e59e28314419c6e511361fe0b204d6a17427187 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 08:42:48 -0400 Subject: [PATCH 26/34] build(deps): bump third-party/nvapi-open-source-sdk from `c0f5f7b` to `7d99f95` (#2145) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- third-party/nvapi-open-source-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/nvapi-open-source-sdk b/third-party/nvapi-open-source-sdk index c0f5f7b64d..7d99f95f90 160000 --- a/third-party/nvapi-open-source-sdk +++ b/third-party/nvapi-open-source-sdk @@ -1 +1 @@ -Subproject commit c0f5f7b64d2ef13b1155f078a2eec156611f2415 +Subproject commit 7d99f95f9080b89e7048c67d78128ce849d71004 From aff3b5657f598c30075807c01506d5da1e518d99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 10:47:49 -0400 Subject: [PATCH 27/34] build(deps): bump third-party/Simple-Web-Server from `27b41f5` to `4abe349` (#2114) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- third-party/Simple-Web-Server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/Simple-Web-Server b/third-party/Simple-Web-Server index 27b41f5ee1..4abe349158 160000 --- a/third-party/Simple-Web-Server +++ b/third-party/Simple-Web-Server @@ -1 +1 @@ -Subproject commit 27b41f5ee154cca0fce4fe2955dd886d04e3a4ed +Subproject commit 4abe3491582b56c0b18fc35278aad33b2db29cdc From 2a1cb25d40a99bca0edbebfb2634b9bece510ad9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 11:58:31 -0400 Subject: [PATCH 28/34] build(deps): bump third-party/wayland-protocols from `08d1c72` to `24e612f` (#2480) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- third-party/wayland-protocols | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/wayland-protocols b/third-party/wayland-protocols index 08d1c7276d..f573fa11cf 160000 --- a/third-party/wayland-protocols +++ b/third-party/wayland-protocols @@ -1 +1 @@ -Subproject commit 08d1c7276d41379acfea353b5c739b72d51827e2 +Subproject commit f573fa11cf97f425ddb021e16baf910b8403e76a From 3adb934de38d8330deb18362708188b7c160396f Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Thu, 16 May 2024 13:38:59 -0400 Subject: [PATCH 29/34] New Crowdin updates (#2454) --- .../assets/web/public/assets/locale/de.json | 18 ++++---- .../web/public/assets/locale/en_GB.json | 18 ++++---- .../web/public/assets/locale/en_US.json | 18 ++++---- .../assets/web/public/assets/locale/es.json | 18 ++++---- .../assets/web/public/assets/locale/fr.json | 30 ++++++------- .../assets/web/public/assets/locale/it.json | 18 ++++---- .../assets/web/public/assets/locale/ja.json | 24 +++++----- .../assets/web/public/assets/locale/pt.json | 20 ++++----- .../assets/web/public/assets/locale/ru.json | 30 ++++++------- .../assets/web/public/assets/locale/sv.json | 18 ++++---- .../assets/web/public/assets/locale/zh.json | 44 +++++++++---------- 11 files changed, 128 insertions(+), 128 deletions(-) diff --git a/src_assets/common/assets/web/public/assets/locale/de.json b/src_assets/common/assets/web/public/assets/locale/de.json index 5ad6efbbaa..9d0a55d9a1 100644 --- a/src_assets/common/assets/web/public/assets/locale/de.json +++ b/src_assets/common/assets/web/public/assets/locale/de.json @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Geben Sie eine GPU für die Aufnahme manuell an.", "adapter_name_desc_linux_2": "um alle Geräte zu finden, die VAAPI nutzen können", "adapter_name_desc_linux_3": "Ersetze ``renderD129`` durch das Gerät von oben, um den Namen und die Fähigkeiten des Geräts aufzulisten. Um von Sunshine unterstützt zu werden, muss es zumindest über folgende Punkte verfügen:", - "adapter_name_desc_win": "Legen Sie eine GPU für die Aufnahme manuell fest. Falls nicht festgelegt, wird die GPU automatisch ausgewählt. Wir empfehlen dringend, dieses Feld leer zu lassen, um die automatische GPU-Auswahl zu verwenden! Hinweis: Diese GPU muss ein Display angeschlossen und eingeschaltet haben. Die passenden Werte finden Sie mit dem folgenden Befehl:", - "adapter_name_placeholder_win": "Radeon RX 580-Serie", + "adapter_name_desc_windows": "Legen Sie eine GPU für die Aufnahme manuell fest. Falls nicht festgelegt, wird die GPU automatisch ausgewählt. Wir empfehlen dringend, dieses Feld leer zu lassen, um die automatische GPU-Auswahl zu verwenden! Hinweis: Diese GPU muss ein Display angeschlossen und eingeschaltet haben. Die passenden Werte finden Sie mit dem folgenden Befehl:", + "adapter_name_placeholder_windows": "Radeon RX 580-Serie", "add": "Neu", "address_family": "Adressfamilie", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Audio Sink", "audio_sink_desc_linux": "Der Name des Audio-Spüls, der für Audio Loopback verwendet wird. Wenn Sie diese Variable nicht angeben, wählt pulseaudio das Standard-Monitorgerät. Sie können den Namen des Audiospülers mit einem Befehl finden:", "audio_sink_desc_macos": "Der Name des für Audio Loopback verwendeten Audiosenks kann aufgrund von Systembeschränkungen nur auf Mikrofone auf macOS zugreifen. Zum Streamen von System-Audio mit Soundflower oder BlackHole.", - "audio_sink_desc_win": "Geben Sie ein bestimmtes Audiogerät für die Aufnahme manuell an. Wenn nicht gesetzt, wird das Gerät automatisch ausgewählt. Wir empfehlen dringend, dieses Feld leer zu lassen, um die automatische Geräteauswahl zu verwenden! Wenn Sie mehrere Audiogeräte mit identischen Namen haben, können Sie die Geräte-ID mit dem folgenden Befehl erhalten:", + "audio_sink_desc_windows": "Geben Sie ein bestimmtes Audiogerät für die Aufnahme manuell an. Wenn nicht gesetzt, wird das Gerät automatisch ausgewählt. Wir empfehlen dringend, dieses Feld leer zu lassen, um die automatische Geräteauswahl zu verwenden! Wenn Sie mehrere Audiogeräte mit identischen Namen haben, können Sie die Geräte-ID mit dem folgenden Befehl erhalten:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Lautsprecher (High Definition Audio Device)", + "audio_sink_placeholder_windows": "Lautsprecher (High Definition Audio Device)", "av1_mode": "AV1 Support", "av1_mode_0": "Sunshine werbt Unterstützung für AV1 basierend auf Encoder Fähigkeiten (empfohlen)", "av1_mode_1": "Sunshine werbt keinen Support für AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Legen Sie fest, wie schnell sich die Tasten wiederholen. Die anfängliche Verzögerung in Millisekunden bevor Sie die Tasten wiederholen.", "key_repeat_frequency": "Tastendruck-Frequenz", "key_repeat_frequency_desc": "Wie oft Tasten jede Sekunde wiederholen. Diese konfigurierbare Option unterstützt Dezimalstellen.", - "key_rightalt_to_key_win": "Rechter Alt-Taste auf Windows-Taste zuweisen", + "key_rightalt_to_key_windows": "Rechter Alt-Taste auf Windows-Taste zuweisen", "key_rightalt_to_key_win_desc": "Möglicherweise können Sie den Windows-Schlüssel nicht direkt von Moonlight senden. In diesen Fällen kann es nützlich sein, Sunshine glauben zu lassen, dass die rechte Alt-Taste die Windows-Taste ist", "keyboard": "Tastatureingabe aktivieren", "keyboard_desc": "Erlaubt Gästen das Host-System mit der Tastatur zu steuern", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Nur LAN-Nutzer können auf Web-UI zugreifen", "origin_web_ui_allowed_pc": "Nur localhost kann auf Web-UI zugreifen", "origin_web_ui_allowed_wan": "Jeder kann auf Web-UI zugreifen", - "output_name_desc_linux": "Beim Start von Sunshine sollten Sie die Liste der erkannten Monitore sehen. Sie müssen den Wert vor dem Doppelpunkt in der Ausgabe verwenden. z.B.:", - "output_name_desc_win": "Legen Sie eine Anzeige für die Aufnahme manuell fest. Wenn diese nicht aktiviert ist, wird die primäre Anzeige aufgenommen. Hinweis: Wenn Sie eine GPU oben angegeben haben, muss diese Anzeige mit dieser GPU verbunden sein. Die entsprechenden Werte finden Sie mit dem folgenden Befehl:", - "output_name_linux": "Nummer überwachen", - "output_name_win": "Ausgabename", + "output_name_desc_unix": "Während des Starts von Sunshine sollten Sie die Liste der erkannten Anzeigen sehen. Hinweis: Sie müssen den Id-Wert innerhalb der Klammer verwenden.", + "output_name_desc_windows": "Legen Sie eine Anzeige für die Aufnahme manuell fest. Wenn diese nicht aktiviert ist, wird die primäre Anzeige aufgenommen. Hinweis: Wenn Sie eine GPU oben angegeben haben, muss diese Anzeige mit dieser GPU verbunden sein. Die entsprechenden Werte finden Sie mit dem folgenden Befehl:", + "output_name_unix": "Anzeigenummer", + "output_name_windows": "Ausgabename", "ping_timeout": "Ping-Timeout", "ping_timeout_desc": "Wie lange warten Sie in Millisekunden auf Daten von Mondlicht bevor Sie den Strom herunterfahren", "pkey": "Privater Schlüssel", diff --git a/src_assets/common/assets/web/public/assets/locale/en_GB.json b/src_assets/common/assets/web/public/assets/locale/en_GB.json index 89f9d8e9ac..d81813f52e 100644 --- a/src_assets/common/assets/web/public/assets/locale/en_GB.json +++ b/src_assets/common/assets/web/public/assets/locale/en_GB.json @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", + "adapter_name_desc_windows": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", + "adapter_name_placeholder_windows": "Radeon RX 580 Series", "add": "Add", "address_family": "Address Family", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Audio Sink", "audio_sink_desc_linux": "The name of the audio sink used for Audio Loopback. If you do not specify this variable, pulseaudio will select the default monitor device. You can find the name of the audio sink using either command:", "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "audio_sink_desc_windows": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", + "audio_sink_placeholder_windows": "Speakers (High Definition Audio Device)", "av1_mode": "AV1 Support", "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", "av1_mode_1": "Sunshine will not advertise support for AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", "key_repeat_frequency": "Key Repeat Frequency", "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", + "key_rightalt_to_key_windows": "Map Right Alt key to Windows key", "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", "keyboard": "Enable Keyboard Input", "keyboard_desc": "Allows guests to control the host system with the keyboard", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", "origin_web_ui_allowed_pc": "Only localhost may access Web UI", "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", + "output_name_desc_unix": "During Sunshine startup, you should see the list of detected displays. Note: You need to use the id value inside the parenthesis.", + "output_name_desc_windows": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", + "output_name_unix": "Display number", + "output_name_windows": "Output Name", "ping_timeout": "Ping Timeout", "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", "pkey": "Private Key", diff --git a/src_assets/common/assets/web/public/assets/locale/en_US.json b/src_assets/common/assets/web/public/assets/locale/en_US.json index 37e0b41ee6..f0e875e1a3 100644 --- a/src_assets/common/assets/web/public/assets/locale/en_US.json +++ b/src_assets/common/assets/web/public/assets/locale/en_US.json @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Manually specify a GPU to use for capture.", "adapter_name_desc_linux_2": "to find all devices capable of VAAPI", "adapter_name_desc_linux_3": "Replace ``renderD129`` with the device from above to lists the name and capabilities of the device. To be supported by Sunshine, it needs to have at the very minimum:", - "adapter_name_desc_win": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", + "adapter_name_desc_windows": "Manually specify a GPU to use for capture. If unset, the GPU is chosen automatically. We strongly recommend leaving this field blank to use automatic GPU selection! Note: This GPU must have a display connected and powered on. The appropriate values can be found using the following command:", + "adapter_name_placeholder_windows": "Radeon RX 580 Series", "add": "Add", "address_family": "Address Family", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Audio Sink", "audio_sink_desc_linux": "The name of the audio sink used for Audio Loopback. If you do not specify this variable, pulseaudio will select the default monitor device. You can find the name of the audio sink using either command:", "audio_sink_desc_macos": "The name of the audio sink used for Audio Loopback. Sunshine can only access microphones on macOS due to system limitations. To stream system audio using Soundflower or BlackHole.", - "audio_sink_desc_win": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", + "audio_sink_desc_windows": "Manually specify a specific audio device to capture. If unset, the device is chosen automatically. We strongly recommend leaving this field blank to use automatic device selection! If you have multiple audio devices with identical names, you can get the Device ID using the following command:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Speakers (High Definition Audio Device)", + "audio_sink_placeholder_windows": "Speakers (High Definition Audio Device)", "av1_mode": "AV1 Support", "av1_mode_0": "Sunshine will advertise support for AV1 based on encoder capabilities (recommended)", "av1_mode_1": "Sunshine will not advertise support for AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Control how fast keys will repeat themselves. The initial delay in milliseconds before repeating keys.", "key_repeat_frequency": "Key Repeat Frequency", "key_repeat_frequency_desc": "How often keys repeat every second. This configurable option supports decimals.", - "key_rightalt_to_key_win": "Map Right Alt key to Windows key", + "key_rightalt_to_key_windows": "Map Right Alt key to Windows key", "key_rightalt_to_key_win_desc": "It may be possible that you cannot send the Windows Key from Moonlight directly. In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key", "keyboard": "Enable Keyboard Input", "keyboard_desc": "Allows guests to control the host system with the keyboard", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Only those in LAN may access Web UI", "origin_web_ui_allowed_pc": "Only localhost may access Web UI", "origin_web_ui_allowed_wan": "Anyone may access Web UI", - "output_name_desc_linux": "During Sunshine startup, you should see the list of detected monitors. You need to use the value before the colon in the output. e.g.:", - "output_name_desc_win": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", - "output_name_linux": "Monitor number", - "output_name_win": "Output Name", + "output_name_desc_unix": "During Sunshine startup, you should see the list of detected displays. Note: You need to use the id value inside the parenthesis.", + "output_name_desc_windows": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", + "output_name_unix": "Display number", + "output_name_windows": "Output Name", "ping_timeout": "Ping Timeout", "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", "pkey": "Private Key", diff --git a/src_assets/common/assets/web/public/assets/locale/es.json b/src_assets/common/assets/web/public/assets/locale/es.json index 731fc4b499..a8d49acd6d 100644 --- a/src_assets/common/assets/web/public/assets/locale/es.json +++ b/src_assets/common/assets/web/public/assets/locale/es.json @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Especifique manualmente un GPU a usar para capturar.", "adapter_name_desc_linux_2": "para encontrar todos los dispositivos capaces de VAAPI", "adapter_name_desc_linux_3": "Reemplace ``renderD129`` con el dispositivo de arriba para listar el nombre y las capacidades del dispositivo. Para tener el soporte de Sunshine, necesita tener como mínimo:", - "adapter_name_desc_win": "Especifique manualmente un GPU a usar para capturar. Si no está activado, el GPU se elige automáticamente. Recomendamos encarecidamente dejar este campo en blanco para utilizar la selección automática de GPU! Nota: Esta GPU debe tener una pantalla conectada y encendida. Los valores apropiados se pueden encontrar usando el siguiente comando:", - "adapter_name_placeholder_win": "Serie RX 580 de Radeon", + "adapter_name_desc_windows": "Especifique manualmente un GPU para capturar. Si no está activado, el GPU se elige automáticamente. Recomendamos fuertemente dejar este campo en blanco para utilizar la selección automática de GPU! Nota: Esta GPU debe tener una pantalla conectada y encendida. Los valores apropiados se pueden encontrar usando el siguiente comando:", + "adapter_name_placeholder_windows": "Serie RX 580 de Radeon", "add": "Añadir", "address_family": "Familia de dirección", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Salida de audio", "audio_sink_desc_linux": "El nombre de la salida de audio usado para Audio Loopback. Si no especifica esta variable, pulseaudio seleccionará el dispositivo de monitor predeterminado. Puede encontrar el nombre de la salida de audio usando cualquiera de los comandos:", "audio_sink_desc_macos": "El nombre de la salida de audio usado para Audio Loopback. Sunshine sólo puede acceder a micrófonos en macOS debido a limitaciones del sistema. Para transmitir audio del sistema usando Soundflower o BlackHole.", - "audio_sink_desc_win": "Especifique manualmente un dispositivo de audio específico a capturar. Si no está activado, el dispositivo se elige automáticamente. ¡Recomendamos encarecidamente dejar este campo en blanco para usar la selección automática de dispositivos! Si tiene varios dispositivos de audio con nombres idénticos, puede obtener el ID del dispositivo usando el siguiente comando:", + "audio_sink_desc_windows": "Especifique manualmente un dispositivo de audio específico para capturar. Si no está activado, el dispositivo se elige automáticamente. ¡Recomendamos fuertemente dejar este campo en blanco para usar la selección automática de dispositivos! Si tiene varios dispositivos de audio con nombres idénticos, puede obtener el ID del dispositivo usando el siguiente comando:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Altavoces (Dispositivo de audio de alta definición)", + "audio_sink_placeholder_windows": "Altavoces (Dispositivo de audio de alta definición)", "av1_mode": "Soporte AV1", "av1_mode_0": "Sunshine anunciará soporte para AV1 basado en las capacidades del codificador (recomendado)", "av1_mode_1": "Sunshine no anunciará soporte para AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Controla cómo se repetirán las teclas rápidas. El retardo inicial en milisegundos antes de repetir las teclas.", "key_repeat_frequency": "Frecuencia de repetición de clave", "key_repeat_frequency_desc": "Con qué frecuencia las claves se repiten cada segundo. Esta opción configurable soporta decimales.", - "key_rightalt_to_key_win": "Asignar la tecla Alt derecha a la tecla Windows", + "key_rightalt_to_key_windows": "Mapear tecla Alt Derecho a la tecla Windows", "key_rightalt_to_key_win_desc": "Es posible que no pueda enviar directamente la tecla de Windows desde Moonlight. En esos casos puede ser útil hacer que Sunshine piense que la tecla Alt correcta es la clave de Windows", "keyboard": "Activar entrada de teclado", "keyboard_desc": "Permite a los invitados controlar el sistema de host con el teclado", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Sólo aquellos en LAN pueden acceder a la Web UI", "origin_web_ui_allowed_pc": "Sólo localhost puede acceder a la Web UI", "origin_web_ui_allowed_wan": "Cualquiera puede acceder a Web UI", - "output_name_desc_linux": "Durante el arranque de Sunshine, debería ver la lista de monitoreos detectados. Necesita usar el valor antes de los dos puntos en la salida. Ejemplo:", - "output_name_desc_win": "Especifique manualmente una pantalla a usar para capturar. Si no está activada, se captura la pantalla principal. Nota: Si ha especificado un GPU arriba, esta pantalla debe estar conectada a ese GPU. Los valores apropiados se pueden encontrar usando el siguiente comando:", - "output_name_linux": "Número de seguimiento", - "output_name_win": "Nombre de salida", + "output_name_desc_unix": "Durante el arranque de Sunshine, debería ver la lista de pantallas detectadas. Nota: Necesita usar el valor id dentro del paréntesis.", + "output_name_desc_windows": "Especifique manualmente una pantalla para capturar. Si no está activada, se captura la pantalla principal. Nota: Si ha especificado un GPU arriba, esta pantalla debe estar conectada a ese GPU. Los valores apropiados se pueden encontrar usando el siguiente comando:", + "output_name_unix": "Mostrar número", + "output_name_windows": "Nombre de salida", "ping_timeout": "Tiempo de espera", "ping_timeout_desc": "Cuánto tiempo esperar en milisegundos los datos de Moonlight antes de apagar la corriente", "pkey": "Clave Privada", diff --git a/src_assets/common/assets/web/public/assets/locale/fr.json b/src_assets/common/assets/web/public/assets/locale/fr.json index bdd8ad0c6d..17b1352491 100644 --- a/src_assets/common/assets/web/public/assets/locale/fr.json +++ b/src_assets/common/assets/web/public/assets/locale/fr.json @@ -82,12 +82,12 @@ "adapter_name_desc_linux_1": "Spécifiez manuellement un GPU à utiliser pour la capture.", "adapter_name_desc_linux_2": "pour trouver tous les appareils capables d'utiliser l'interface VAAPI", "adapter_name_desc_linux_3": "Remplacez ``renderD129`` par le dispositif ci-dessus pour énumérer le nom et les capacités du dispositif. Pour être pris en charge par Sunshine, il doit avoir au minimum les caractéristiques suivantes :", - "adapter_name_desc_win": "Spécifiez manuellement un GPU à utiliser pour la capture. Si non défini, le GPU est choisi automatiquement. Nous vous recommandons fortement de laisser ce champ vide pour utiliser la sélection automatique du GPU ! Note: Ce GPU doit avoir un écran connecté et allumé. Les valeurs appropriées peuvent être trouvées en utilisant la commande suivante :", - "adapter_name_placeholder_win": "Radeon RX 580 Series", + "adapter_name_desc_windows": "Spécifiez manuellement un GPU à utiliser pour la capture. Si non défini, le GPU est choisi automatiquement. Nous vous recommandons fortement de laisser ce champ vide pour utiliser la sélection automatique du GPU ! Note: Ce GPU doit avoir un écran connecté et allumé. Les valeurs appropriées peuvent être trouvées en utilisant la commande suivante :", + "adapter_name_placeholder_windows": "Séries Radeon RX 580", "add": "Ajouter", "address_family": "Famille d'adresses", "address_family_both": "IPv4 et IPv6", - "address_family_desc": "Définit la famille d'adresses utilisée par Sunshine", + "address_family_desc": "Définir la famille d'adresses utilisée par Sunshine", "address_family_ipv4": "IPv4 uniquement", "always_send_scancodes": "Toujours envoyer les codes de balayage", "always_send_scancodes_desc": "L'envoi de codes de numérisation améliore la compatibilité avec les jeux et les applications, mais peut entraîner une saisie incorrecte du clavier de certains clients qui n'utilisent pas de disposition de clavier anglais américain. Activer si l'entrée du clavier ne fonctionne pas du tout dans certaines applications. Désactiver si les clés du client génèrent la mauvaise entrée sur l'hôte.", @@ -123,9 +123,9 @@ "audio_sink": "Sink audio", "audio_sink_desc_linux": "Le nom du dissipateur audio utilisé pour la boucle audio. Si vous ne spécifiez pas cette variable, pulseaudio sélectionnera le périphérique de moniteur par défaut. Vous pouvez trouver le nom du dissipateur audio en utilisant l'une des commandes:", "audio_sink_desc_macos": "Le nom du dissipateur audio utilisé pour la boucle audio. Sunshine ne peut accéder aux micros que sur macOS en raison de limitations du système. Diffusez de l'audio système en utilisant Soundflower ou BlackHole.", - "audio_sink_desc_win": "Spécifiez manuellement un périphérique audio spécifique à capturer. Si non défini, le périphérique est choisi automatiquement. Nous vous recommandons fortement de laisser ce champ vide pour utiliser la sélection automatique de l'appareil ! Si vous avez plusieurs périphériques audio avec des noms identiques, vous pouvez obtenir l'ID du périphérique en utilisant la commande suivante :", + "audio_sink_desc_windows": "Spécifiez manuellement un périphérique audio spécifique à capturer. Si non défini, le périphérique est choisi automatiquement. Nous vous recommandons fortement de laisser ce champ vide pour utiliser la sélection automatique de l'appareil ! Si vous avez plusieurs périphériques audio avec des noms identiques, vous pouvez obtenir l'ID du périphérique en utilisant la commande suivante :", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Haut-parleurs (High Definition Audio Device)", + "audio_sink_placeholder_windows": "Haut-parleurs (High Definition Audio Device)", "av1_mode": "Support de l'AV1", "av1_mode_0": "Sunshine annoncera la prise en charge de l'AV1 en fonction des capacités de l'encodeur (recommandé)", "av1_mode_1": "Sunshine n'annoncera pas la prise en charge de l'AV1", @@ -145,7 +145,7 @@ "coder_cavlc": "cavlc -- codage de la durée adaptative du contexte - décodage plus rapide", "configuration": "Configuration", "controller": "Activer l'entrée manette", - "controller_desc": "Permet aux invités de contrôler le système hôte avec un manette / contrôleur", + "controller_desc": "Permet aux invités de contrôler le système hôte avec une manette", "credentials_file": "Fichier des identifiants", "credentials_file_desc": "Stocker le nom d'utilisateur/mot de passe séparément du fichier de données de Sunshine.", "ds4_back_as_touchpad_click": "Mapper Retour/Sélection au clic du pavé tactile", @@ -164,13 +164,13 @@ "file_state_desc": "Le fichier où l'état actuel de Sunshine est stocké", "fps": "FPS annoncés", "gamepad": "Type de manette émulée", - "gamepad_auto": "Options automatiques", + "gamepad_auto": "Options de la sélection automatique", "gamepad_desc": "Choisissez le type de manette à émuler sur l'hôte", "gamepad_ds4": "DS4 (PS4)", "gamepad_manual": "Options manuelles pour DS4", "gamepad_x360": "X360 (Xbox 360)", "global_prep_cmd": "Commandes de préparation", - "global_prep_cmd_desc": "Configurer une liste de commandes à exécuter avant ou après l'exécution d'une application. Si l'une des commandes de préparation spécifiées échoue, le processus de lancement de l'application sera abandonné.", + "global_prep_cmd_desc": "Configurer une liste de commandes à exécuter avant ou après l'exécution d'une application. Si l'une des commandes de préparation spécifiées échoue, le processus de lancement de l'application sera interrompu.", "hevc_mode": "Support du HEVC", "hevc_mode_0": "Sunshine annoncera la prise en charge de HEVC en fonction des capacités de l'encodeur (recommandé)", "hevc_mode_1": "Sunshine n'annoncera pas la prise en charge du HEVC", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Contrôle la vitesse à laquelle les clés se répètent. Le délai initial en millisecondes avant de répéter les clés.", "key_repeat_frequency": "Fréquence de répétition des touches", "key_repeat_frequency_desc": "Fréquence de répétition des touches chaque seconde. Cette option configurable prend en charge les décimaux.", - "key_rightalt_to_key_win": "Mapper la touche Alt droite à la touche Windows", + "key_rightalt_to_key_windows": "Mapper la touche Alt droite à la touche Windows", "key_rightalt_to_key_win_desc": "Il est possible que vous ne puissiez pas envoyer directement la touche Windows à partir de Moonlight. Dans ce cas, il peut être utile de faire croire à Sunshine que la touche Alt droite est la touche Windows", "keyboard": "Activer l'entrée clavier", "keyboard_desc": "Permet aux invités de contrôler le système hôte avec le clavier", @@ -212,7 +212,7 @@ "motion_as_ds4": "Émuler une manette DS4 si la manette client signale qu'elle dispose de capteurs de mouvement", "motion_as_ds4_desc": "Si désactivé, la présence de capteurs de mouvement ne sera pas pris en compte lors de la sélection du type de manette.", "mouse": "Activer l'entrée de la souris", - "mouse_desc": "Permet aux invités de contrôler le système hôte avec le clavier", + "mouse_desc": "Permet aux invités de contrôler le système hôte avec la souris", "native_pen_touch": "Prise en charge stylo/écran tactile native", "native_pen_touch_desc": "Lorsque cette option est activée, Sunshine transmet les événements stylo/touche natifs des clients Moonlight. Il peut être utile de désactiver cette fonction pour les applications plus anciennes qui ne prennent pas en charge le stylet et le tactile.", "nvenc_h264_cavlc": "Préférer CAVLC sur CABAC en H.264", @@ -239,14 +239,14 @@ "nvenc_vbv_increase": "Augmentation du pourcentage de VBV/HRD à une seule image", "nvenc_vbv_increase_desc": "Par défaut, le soleil utilise un VBV/HRD mono-image, ce qui signifie que toute taille d'image vidéo encodée ne devrait pas dépasser le débit demandé divisé par le débit d'images demandé. Relaxer cette restriction peut être bénéfique et agir en tant que débit variable de faible latence, mais peut aussi conduire à une perte de paquets si le réseau ne dispose pas de mémoire tampon pour gérer les pics de débit. La valeur maximale acceptée est de 400, ce qui correspond à la limite de taille supérieure de l'image vidéo encodée de 5x.", "origin_web_ui_allowed": "Origines autorisées à accéder à l'interface web", - "origin_web_ui_allowed_desc": "L'origine de l'adresse de terminaison distante qui n'est pas refusée l'accès à l'interface Web", + "origin_web_ui_allowed_desc": "Origine de l'adresse du point de terminaison distant à laquelle l'accès à l'interface utilisateur Web n'est pas refusé", "origin_web_ui_allowed_lan": "Seuls ceux qui sont en LAN peuvent accéder à l'interface Web", "origin_web_ui_allowed_pc": "Seul localhost peut accéder à l'interface Web", "origin_web_ui_allowed_wan": "N'importe qui peut accéder à l'interface Web", - "output_name_desc_linux": "Lors du démarrage de Sunshine, vous devriez voir la liste des moniteurs détectés. Vous devez utiliser la valeur avant le deux-points de la sortie. Par exemple:", - "output_name_desc_win": "Spécifier manuellement un affichage à utiliser pour la capture. Si non défini, l'affichage principal est capturé. Note: Si vous avez spécifié un GPU ci-dessus, cet affichage doit être connecté à ce GPU. Les valeurs appropriées peuvent être trouvées en utilisant la commande suivante :", - "output_name_linux": "Numéro de l'écran", - "output_name_win": "Nom de la sortie", + "output_name_desc_unix": "Lors du démarrage de Sunshine, vous devriez voir la liste des affichages détectés. Note : Vous devez utiliser la valeur de l'id entre parenthèses.", + "output_name_desc_windows": "Spécifier manuellement un affichage à utiliser pour la capture. Si non défini, l'affichage principal est capturé. Note: Si vous avez spécifié un GPU ci-dessus, cet affichage doit être connecté à ce GPU. Les valeurs appropriées peuvent être trouvées en utilisant la commande suivante :", + "output_name_unix": "Afficher le numéro", + "output_name_windows": "Nom de la sortie", "ping_timeout": "Timeout du ping", "ping_timeout_desc": "Combien de temps attendre en millisecondes pour des données de Moonlight avant de couper le stream", "pkey": "Clé privée", diff --git a/src_assets/common/assets/web/public/assets/locale/it.json b/src_assets/common/assets/web/public/assets/locale/it.json index de43dfbbd0..fd7c6cf426 100644 --- a/src_assets/common/assets/web/public/assets/locale/it.json +++ b/src_assets/common/assets/web/public/assets/locale/it.json @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Specifica manualmente una GPU da usare per la cattura.", "adapter_name_desc_linux_2": "per trovare tutti i dispositivi con capacità VAAPI", "adapter_name_desc_linux_3": "Sostituisci ``renderD129`` con il dispositivo sopra per elencare il nome e le funzionalità del dispositivo. Per essere supportato da Sunshine, ha bisogno di avere minimo:", - "adapter_name_desc_win": "Specifica manualmente una GPU da usare per la cattura. Se disattivata, la GPU viene scelta automaticamente. Raccomandiamo vivamente di lasciare vuoto questo campo per utilizzare la selezione automatica della GPU! Nota: questa GPU deve avere un display connesso e acceso. I valori appropriati possono essere trovati usando il seguente comando:", - "adapter_name_placeholder_win": "Radeon RX 580 Series", + "adapter_name_desc_windows": "Specifica manualmente una GPU da usare per la cattura. Se disattivata, la GPU viene scelta automaticamente. Raccomandiamo vivamente di lasciare vuoto questo campo per utilizzare la selezione automatica della GPU! Nota: questa GPU deve avere un display connesso e acceso. I valori appropriati possono essere trovati usando il seguente comando:", + "adapter_name_placeholder_windows": "Radeon RX 580 Series", "add": "Aggiungi", "address_family": "Famiglia Indirizzo", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Uscita Audio", "audio_sink_desc_linux": "Il nome dell'uscita audio è utilizzato per il Loopback audio. Se non si specifica questa variabile, pulseaudio selezionerà il dispositivo predefinito. È possibile trovare il nome del'uscita audio utilizzando entrambi i comandi:", "audio_sink_desc_macos": "Il nome del lavello audio utilizzato per Audio Loopback. Sunshine può accedere solo ai microfoni su macOS a causa delle limitazioni di sistema. Per trasmettere audio di sistema utilizzando Soundflower o BlackHole.", - "audio_sink_desc_win": "Specifica manualmente un dispositivo audio specifico da catturare. Se non impostato, il dispositivo viene scelto automaticamente. Si consiglia vivamente di lasciare vuoto questo campo per utilizzare la selezione automatica del dispositivo! Se si dispone di più dispositivi audio con nomi identici, è possibile ottenere l'ID dispositivo utilizzando il seguente comando:", + "audio_sink_desc_windows": "Specifica manualmente un dispositivo audio specifico da catturare. Se disattivato, il dispositivo viene scelto automaticamente. Si consiglia vivamente di lasciare vuoto questo campo per utilizzare la selezione automatica del dispositivo! Se si dispone di più dispositivi audio con nomi identici, è possibile ottenere l'ID dispositivo utilizzando il seguente comando:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Altoparlanti (Dispositivo Audio ad Alta Definizione)", + "audio_sink_placeholder_windows": "Altoparlanti (Dispositivo Audio Di Alta Definizione)", "av1_mode": "Supporto AV1", "av1_mode_0": "Sunshine fornirà il supporto per AV1 basandosi sulle funzionalità dell'encoder (raccomandato)", "av1_mode_1": "Sunshine non fornirà il supporto per AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Controlla quanto velocemente i tasti si ripeteranno. È Il ritardo iniziale in millisecondi prima di ripetere i tasti.", "key_repeat_frequency": "Frequenza Di Ripetizione Tasti", "key_repeat_frequency_desc": "Quante volte i tasti si ripetono ogni secondo. Questa opzione configurabile supporta i decimali.", - "key_rightalt_to_key_win": "Mappare il tasto Alt Destro come Tasto Windows", + "key_rightalt_to_key_windows": "Mappare il tasto Alt destro sul tasto Windows", "key_rightalt_to_key_win_desc": "Potrebbe succedere che non sia possibile inviare il Tasto Windows direttamente da Moonlight. In questi casi può essere utile far credere a Sunshine che il tasto Alt Destro è il Tasto Windows", "keyboard": "Abilita Inserimento da Tastiera", "keyboard_desc": "Consente ai guest di controllare il sistema host con la tastiera", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Solo quelli in LAN possono accedere all'interfaccia utente Web", "origin_web_ui_allowed_pc": "Solo localhost può accedere all'interfaccia Web", "origin_web_ui_allowed_wan": "Chiunque può accedere all'interfaccia Web", - "output_name_desc_linux": "Durante l'avvio di Sunshine, dovresti vedere l'elenco dei monitor rilevati. Devi usare il valore prima del punto nell'uscita. Ad esempio:", - "output_name_desc_win": "Specifica manualmente un display da usare per la cattura. Se disattivato, viene catturato il display primario. Nota: Se hai specificato una GPU sopra, questo display deve essere collegato a quella GPU. I valori appropriati possono essere trovati usando il seguente comando:", - "output_name_linux": "Numero di monitor", - "output_name_win": "Nome Uscita", + "output_name_desc_unix": "Durante l'avvio di Sunshine, dovresti vedere l'elenco dei display rilevati. Nota: devi usare il valore id all'interno della parentesi.", + "output_name_desc_windows": "Specifica manualmente un display da usare per la cattura. Se disattivato, viene catturato il display primario. Nota: Se hai specificato una GPU sopra, questo display deve essere collegato a quella GPU. I valori appropriati possono essere trovati usando il seguente comando:", + "output_name_unix": "Visualizza numero", + "output_name_windows": "Nome Uscita", "ping_timeout": "Timeout Ping", "ping_timeout_desc": "Per quanto tempo attendere in millisecondi per i dati dalla luce della luna prima di spegnere il flusso", "pkey": "Chiave Privata", diff --git a/src_assets/common/assets/web/public/assets/locale/ja.json b/src_assets/common/assets/web/public/assets/locale/ja.json index fdbbac100d..c81388016e 100644 --- a/src_assets/common/assets/web/public/assets/locale/ja.json +++ b/src_assets/common/assets/web/public/assets/locale/ja.json @@ -7,7 +7,7 @@ "disabled": "無効", "disabled_def": "無効 (デフォルト)", "do_cmd": "コマンド実行", - "elevated": "昇格", + "elevated": "管理者として実行", "enabled": "有効", "enabled_def": "有効 (デフォルト)", "error": "エラー!", @@ -48,9 +48,9 @@ "env_client_audio_config": "クライアントから要求されたオーディオ設定 (2.0/5.1/7.1)", "env_client_enable_sops": "クライアントは最適なストリーミングのためにゲームを最適化するオプションを要求しています (true/false)", "env_client_fps": "クライアントから要求された FPS (整数)", - "env_client_gcmap": "要求されたゲームパッドマスク、ビットセット/ビットフィールド形式 (int)", + "env_client_gcmap": "要求されたゲームパッドマスク、ビットセット/ビットフィールド形式にて指定 (int)", "env_client_hdr": "HDR はクライアントによって有効になっています (true/false)", - "env_client_height": "クライアントから要求された高さ (int)", + "env_client_height": "クライアントから要求された高さ (整数)", "env_client_host_audio": "クライアントはホストオーディオを要求しています (true/false)", "env_client_width": "クライアントから要求された幅 (int)", "env_displayplacer_example": "例 - 解像度自動化のためのディスプレイ プレーサ:", @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "キャプチャに使用する GPU を手動で指定します。", "adapter_name_desc_linux_2": "VAAPIが可能なすべてのデバイスを検索する", "adapter_name_desc_linux_3": "``renderD129`` を上記のデバイスに置き換えて、デバイスの名前と機能を一覧表示します。 Sunshineでサポートされるには、最小限にする必要があります。", - "adapter_name_desc_win": "キャプチャに使用する GPU を手動で指定します。未設定の場合は、GPU が自動的に選択されます。 自動GPU選択を使用するには、このフィールドを空白のままにすることを強くお勧めします! 注:このGPUはディスプレイを接続して電源を入れている必要があります。 次のコマンドを使用して、適切な値を見つけることができます。", - "adapter_name_placeholder_win": "Radeon RX 580シリーズ", + "adapter_name_desc_windows": "キャプチャに使用する GPU を手動で指定します。未設定の場合は、GPU が自動的に選択されます。 自動GPU選択を使用するには、このフィールドを空白のままにすることを強くお勧めします! 注:このGPUはディスプレイを接続して電源を入れている必要があります。 次のコマンドを使用して、適切な値を見つけることができます。", + "adapter_name_placeholder_windows": "Radeon RX 580シリーズ", "add": "追加", "address_family": "アドレスファミリー", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "音声シンク", "audio_sink_desc_linux": "オーディオループバックに使用されるオーディオシンクの名前。この変数を指定しない場合、pulseaudio はデフォルトのモニターデバイスを選択します。 いずれかのコマンドを使用して、オーディオシンクの名前を見つけることができます。", "audio_sink_desc_macos": "Audio Loopback に使用されるオーディオシンクの名前。Sunshineはシステムの制限により、macOSのマイクにのみアクセスできます。 Soundflower または BlackHole を使用してシステムのオーディオをストリーミングする。", - "audio_sink_desc_win": "キャプチャする特定のオーディオデバイスを手動で指定します。未設定の場合、デバイスは自動的に選択されます。 自動デバイス選択を使用するには、このフィールドを空白のままにすることを強くお勧めします! 同じ名前の複数のオーディオデバイスをお持ちの場合は、次のコマンドを使用してデバイス ID を取得できます。", + "audio_sink_desc_windows": "キャプチャする特定のオーディオデバイスを手動で指定します。未設定の場合、デバイスは自動的に選択されます。 自動デバイス選択を使用するには、このフィールドを空白のままにすることを強くお勧めします! 同じ名前の複数のオーディオデバイスをお持ちの場合は、次のコマンドを使用してデバイス ID を取得できます。", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "スピーカー (高品位オーディオデバイス)", + "audio_sink_placeholder_windows": "スピーカー (高品位オーディオデバイス)", "av1_mode": "AV1 サポート", "av1_mode_0": "サンシャインはエンコーダ機能に基づいてAV1のサポートを宣伝します(推奨)", "av1_mode_1": "サンシャインはAV1のサポートを宣伝しません", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "キーを繰り返す速度を制御します。キーを繰り返すまでの時間をミリ秒単位で設定します。", "key_repeat_frequency": "キーの繰り返し周波数", "key_repeat_frequency_desc": "キーが毎秒繰り返される頻度。この設定可能なオプションは10進数をサポートします。", - "key_rightalt_to_key_win": "右AltキーをWindowsキーにマップする", + "key_rightalt_to_key_windows": "右AltキーをWindowsキーにマップする", "key_rightalt_to_key_win_desc": "Moonlight から Windows キーを直接送信できない可能性があります。 これらの場合、SunshineにRight AltキーがWindowsキーであると考えさせると便利かもしれません。", "keyboard": "キーボード入力を有効にする", "keyboard_desc": "ゲストがキーボードでホストシステムを制御できるようにします", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "LAN 内のユーザだけが Web UI にアクセスできます", "origin_web_ui_allowed_pc": "ローカルホストのみがWebUIにアクセスできます", "origin_web_ui_allowed_wan": "誰でもWeb UIにアクセスできます", - "output_name_desc_linux": "Sunshineの起動時には、検出されたモニタのリストが表示されます。出力のコロンの前に値を使用する必要があります。例えば:", - "output_name_desc_win": "キャプチャに使用するディスプレイを手動で指定します。未設定の場合、プライマリディスプレイをキャプチャします。 注意: 上記の GPU を指定した場合、この表示は GPU に接続する必要があります。次のコマンドを使用して適切な値を見つけることができます。", - "output_name_linux": "モニター番号", - "output_name_win": "出力名", + "output_name_desc_unix": "Sunshineの起動時には、検出されたディスプレイのリストが表示されます。注:括弧内のid値を使用する必要があります。", + "output_name_desc_windows": "キャプチャに使用するディスプレイを手動で指定します。未設定の場合、プライマリディスプレイをキャプチャします。 注意: 上記の GPU を指定した場合、この表示は GPU に接続する必要があります。次のコマンドを使用して適切な値を見つけることができます。", + "output_name_unix": "番号を表示", + "output_name_windows": "出力名", "ping_timeout": "Pingのタイムアウト", "ping_timeout_desc": "Moonlightがデータが止まってからストリームをシャットダウンするまで待機時間をミリ秒で指定", "pkey": "プライベートキー", diff --git a/src_assets/common/assets/web/public/assets/locale/pt.json b/src_assets/common/assets/web/public/assets/locale/pt.json index ee23a8933d..5c2296368a 100644 --- a/src_assets/common/assets/web/public/assets/locale/pt.json +++ b/src_assets/common/assets/web/public/assets/locale/pt.json @@ -2,7 +2,7 @@ "_common": { "apply": "Aplicar", "auto": "Automático", - "autodetect": "Autodetectar (recomendado)", + "autodetect": "Detetar automaticamente (recomendado)", "cancel": "cancelar", "disabled": "Desabilitado", "disabled_def": "Desativado (padrão)", @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Especifique manualmente uma GPU para usar na captura.", "adapter_name_desc_linux_2": "para encontrar todos os dispositivos capazes do VAAPI", "adapter_name_desc_linux_3": "Substitua ``renderD129`` pelo dispositivo de cima para listar o nome e os recursos do dispositivo. Para ser apoiado pelo Sol, ele precisa ter no mínimo:", - "adapter_name_desc_win": "Especifique manualmente uma GPU para usar na captura. Se não definido, a GPU é escolhida automaticamente. É altamente recomendável deixar este campo em branco para usar a seleção GPU automática! Nota: Esta GPU deve ter um display conectado e ligado. Os valores apropriados podem ser encontrados usando o seguinte comando:", - "adapter_name_placeholder_win": "Radeon série RX 580", + "adapter_name_desc_windows": "Especifique manualmente uma GPU para usar na captura. Se não definido, a GPU é escolhida automaticamente. É altamente recomendável deixar este campo em branco para usar a seleção GPU automática! Nota: Esta GPU deve ter um display conectado e ligado. Os valores apropriados podem ser encontrados usando o seguinte comando:", + "adapter_name_placeholder_windows": "Radeon série RX 580", "add": "Adicionar", "address_family": "Família de endereços", "address_family_both": "IPv6 + IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Pia de Áudio", "audio_sink_desc_linux": "O nome do afundamento de áudio usado para o loop de áudio. Se você não especificar esta variável, o pulseaudio selecionará o dispositivo de monitor padrão. Você pode encontrar o nome do sumidouro de áudio usando qualquer comando:", "audio_sink_desc_macos": "O nome do sumidouro de áudio usado para o loop de áudio. O Sunshine só pode acessar microfones no macOS devido a limitações do sistema. Para fazer streaming de áudio do sistema usando Soundflower ou BlackHole.", - "audio_sink_desc_win": "Especifique manualmente um dispositivo de áudio específico para capturar. Se não for definido, o dispositivo será escolhido automaticamente. Recomendamos fortemente deixar este campo em branco para usar a seleção automática de dispositivo! Se você tiver vários dispositivos de áudio com nomes idênticos, você pode obter o ID do dispositivo usando o seguinte comando:", + "audio_sink_desc_windows": "Especifique manualmente um dispositivo de áudio específico para capturar. Se não for definido, o dispositivo será escolhido automaticamente. Recomendamos fortemente deixar este campo em branco para usar a seleção automática de dispositivo! Se você tiver vários dispositivos de áudio com nomes idênticos, você pode obter o ID do dispositivo usando o seguinte comando:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Alto-falantes (Dispositivo de Áudio de Alta Definição)", + "audio_sink_placeholder_windows": "Alto-falantes (Dispositivo de Áudio de Alta Definição)", "av1_mode": "Suporte AV1", "av1_mode_0": "O Sunshine anunciará o suporte para a AV1 com base nos recursos do codificador (recomendado)", "av1_mode_1": "O sol não anunciará o suporte para a AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Controla a rapidez com que as teclas se irão repetir. O atraso inicial em milissegundos antes de repetir as chaves.", "key_repeat_frequency": "Frequência de repetição de chave", "key_repeat_frequency_desc": "Com que frequência as chaves se repetem a cada segundo. Esta opção configurável suporta decimais.", - "key_rightalt_to_key_win": "Tecla Alt Right Map para a tecla Windows", + "key_rightalt_to_key_windows": "Tecla Alt Right Map para a tecla Windows", "key_rightalt_to_key_win_desc": "É possível que você não possa enviar diretamente a chave Windows do Moonlight. Nesses casos, pode ser útil fazer Sunshine pensar que a tecla Alt direita é a tecla Windows", "keyboard": "Habilitar Entrada de Teclado", "keyboard_desc": "Permite aos convidados controlar o sistema de host com o teclado", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Somente aqueles em LAN podem acessar a interface Web", "origin_web_ui_allowed_pc": "Somente localhost pode acessar a Web UI", "origin_web_ui_allowed_wan": "Alguém pode acessar a interface web", - "output_name_desc_linux": "Durante a inicialização do sol, você deve ver a lista de monitores detectados. Você precisa usar o valor antes do dois-pontos na saída. Por exemplo:", - "output_name_desc_win": "Especifique manualmente um display a ser usado para captura. Se não for definido, o display primário é capturado. Nota: Se você especificou uma GPU acima, essa tela deve estar conectada à GPU. Os valores apropriados podem ser encontrados usando o seguinte comando:", - "output_name_linux": "Número de monitor", - "output_name_win": "Nome da saída", + "output_name_desc_unix": "Durante a inicialização do sol, você deve ver a lista de telas detectadas. Nota: Você precisa usar o valor do id dentro dos parênteses.", + "output_name_desc_windows": "Especifique manualmente um display a ser usado para captura. Se não for definido, o display primário é capturado. Nota: Se você especificou uma GPU acima, essa tela deve estar conectada à GPU. Os valores apropriados podem ser encontrados usando o seguinte comando:", + "output_name_unix": "Mostrar número", + "output_name_windows": "Nome da saída", "ping_timeout": "Tempo limite", "ping_timeout_desc": "Quanto tempo esperar em milissegundos por dados do luar antes de desligar o fluxo", "pkey": "Chave Privada", diff --git a/src_assets/common/assets/web/public/assets/locale/ru.json b/src_assets/common/assets/web/public/assets/locale/ru.json index c99f4fddb3..806ffbcb10 100644 --- a/src_assets/common/assets/web/public/assets/locale/ru.json +++ b/src_assets/common/assets/web/public/assets/locale/ru.json @@ -26,9 +26,9 @@ "add_cmds": "Добавить команды", "add_new": "Добавить новый", "app_name": "Название приложения", - "app_name_desc": "Имя приложения, как показано на Лунном свете", + "app_name_desc": "Имя приложения, как показано в Moonlight", "applications_desc": "Приложения обновляются только при перезапуске клиента", - "applications_title": "Заявления", + "applications_title": "Приложения", "auto_detach": "Продолжить трансляцию, если приложение завершит работу быстро", "auto_detach_desc": "Это попытается автоматически обнаружить приложения лаунчера, которые быстро закрываются после запуска другой программы или экземпляра самостоятельно. Когда приложение запускается тип, оно рассматривается как отдельное приложение.", "cmd": "Команда", @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Вручную укажите GPU для захвата.", "adapter_name_desc_linux_2": "найти все устройства, способные к VAAPI", "adapter_name_desc_linux_3": "Замените ``renderD129`` устройством сверху, чтобы перечислить имя и возможности устройства. Чтобы быть поддержанным Sunshine, он должен иметь как минимум свое:", - "adapter_name_desc_win": "Укажите GPU для захвата. Если флажок установлен, GPU выбирается автоматически. Мы настоятельно рекомендуем оставить это поле пустым, чтобы использовать автоматический выбор GPU! Примечание: этот GPU должен иметь дисплей подключён и включен. Соответствующие значения могут быть найдены с помощью следующей команды:", - "adapter_name_placeholder_win": "Radeon RX 580 серия", + "adapter_name_desc_windows": "Укажите GPU для захвата. Если флажок установлен, GPU выбирается автоматически. Мы настоятельно рекомендуем оставить это поле пустым, чтобы использовать автоматический выбор GPU! Примечание: этот GPU должен иметь дисплей подключён и включен. Соответствующие значения могут быть найдены с помощью следующей команды:", + "adapter_name_placeholder_windows": "Radeon RX 580 серия", "add": "Добавить", "address_family": "Семейство адресов", "address_family_both": "IPv4 + IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Снимок звука", "audio_sink_desc_linux": "Название звуковой сигнала, используемой для аудиоциклов. Если эта переменная не указана, пульс будет выбирать стандартное устройство монитора. Вы можете найти название звуковой раковины, используя либо команду:", "audio_sink_desc_macos": "Название звуковой раковины, используемой для аудиоциклов. Sunshine может получить доступ только к микрофонам в macOS из-за ограничений системы. Для трансляции системного аудио с помощью Soundflower или BlackHole.", - "audio_sink_desc_win": "Укажите вручную определённое аудиоустройство для записи. Если устройство выключено, оно выбирается автоматически. Рекомендуем оставить это поле пустым, чтобы использовать автоматический выбор устройств! Если у вас несколько аудио устройств с одинаковыми именами, вы можете получить ID устройства, используя следующую команду:", + "audio_sink_desc_windows": "Укажите вручную определённое аудиоустройство для записи. Если устройство выключено, оно выбирается автоматически. Рекомендуем оставить это поле пустым, чтобы использовать автоматический выбор устройств! Если у вас несколько аудио устройств с одинаковыми именами, вы можете получить ID устройства, используя следующую команду:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Динамики (High Definition Audio Device)", + "audio_sink_placeholder_windows": "Динамики (High Definition Audio Device)", "av1_mode": "Поддержка AV1", "av1_mode_0": "Sunshine будет рекламировать поддержку AV1 на основе возможностей кодировщика (рекомендуется)", "av1_mode_1": "Sunshine не будет рекламировать поддержку AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Контролируйте как быстрые клавиши будут повторяться. Первоначальная задержка в миллисекундах перед повтором ключей.", "key_repeat_frequency": "Частота повторения ключа", "key_repeat_frequency_desc": "Как часто ключи повторяют каждую секунду. Эта настраиваемая опция поддерживает десятичные дроби.", - "key_rightalt_to_key_win": "Карта клавиши Alt справа для клавиши Windows", + "key_rightalt_to_key_windows": "Карта клавиши Alt справа для клавиши Windows", "key_rightalt_to_key_win_desc": "Возможно, вы не можете отправить ключ Windows непосредственно с лунного света. В этих случаях было бы полезно заставить Солнечный свет думать, что ключ правой Alt является клавишей Windows", "keyboard": "Включить ввод клавиатуры", "keyboard_desc": "Позволяет гостям управлять системой хоста с помощью клавиатуры", @@ -194,7 +194,7 @@ "lan_encryption_mode_2": "Требуется для всех клиентов", "lan_encryption_mode_desc": "Определяет, когда шифрование будет использоваться при потоке по локальной сети. Шифрование может снизить производительность потокового вещания, особенно на менее мощных узлах и клиентах.", "locale": "Язык", - "locale_desc": "Локаль, используемая для пользовательского интерфейса Sunshine.", + "locale_desc": "Локализация, используемая для пользовательского интерфейса Sunshine.", "log_level": "Уровень журнала", "log_level_0": "Verbose", "log_level_1": "Debug", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Только в LAN могут получить доступ к Web UI", "origin_web_ui_allowed_pc": "Только локальный хост может получить доступ к Web UI", "origin_web_ui_allowed_wan": "Любой может получить доступ к веб-интерфейсу", - "output_name_desc_linux": "Во время запуска Sunshine вы должны увидеть список обнаруженных мониторов. Вы должны использовать значение перед двоеточием в выходе. Например:", - "output_name_desc_win": "Вручную укажите дисплей для захвата. Если не установлено, то будет произведен захват основного экрана. Примечание: Если вы указали GPU выше, этот экран должен быть подключен к этому GPU. Соответствующие значения могут быть найдены с помощью следующей команды:", - "output_name_linux": "Номер монитора", - "output_name_win": "Имя вывода", + "output_name_desc_unix": "Во время запуска Sunshine вы увидите список обнаруженных дисплей. Примечание: используйте id значение внутри скобки.", + "output_name_desc_windows": "Вручную укажите дисплей для захвата. Если не установлено, то будет произведен захват основного экрана. Примечание: Если вы указали GPU выше, этот экран должен быть подключен к этому GPU. Соответствующие значения могут быть найдены с помощью следующей команды:", + "output_name_unix": "Отобразить номер", + "output_name_windows": "Имя вывода", "ping_timeout": "Таймаут пинга", "ping_timeout_desc": "Как долго ждать в миллисекундах данных с лунного света перед выключением потока", "pkey": "Приватный ключ", @@ -279,7 +279,7 @@ "res_fps_desc": "Режимы демонстрации, рекламируемые Sunshine. Некоторые версии Moonlight, такие как Moonlight-nx (Switch), полагаются на эти списки, чтобы обеспечить поддержку запрашиваемых резолюций и fps. Этот параметр не изменяет способа передачи экрана на Луну.", "resolutions": "Рекламные резолюции", "restart_note": "Sunshine перезапускается, чтобы применить изменения.", - "sunshine_name": "Название Солнца", + "sunshine_name": "Название сервиса Sunshine", "sunshine_name_desc": "Имя хоста, отображаемое при Moonlight. Если не указано, используется имя хоста", "sw_preset": "SW пресеты", "sw_preset_desc": "Оптимизировать компромисс между скоростью кодирования (кодированные кадры в секунду) и эффективностью сжатия (качество за бит в bitstream). По умолчанию супербыстро.", @@ -329,7 +329,7 @@ "welcome": "Здравствуйте, Солнце!" }, "navbar": { - "applications": "Заявления", + "applications": "Приложения", "configuration": "Конфигурация", "home": "Домашний", "password": "Изменить пароль", @@ -358,7 +358,7 @@ "license": "Лицензия", "lizardbyte_website": "Сайт LizardByte", "resources": "Ресурсы", - "resources_desc": "Ресурсы для Солнца!", + "resources_desc": "Ресурсы Sunshine!", "third_party_notice": "Уведомление о третьих лицах" }, "troubleshooting": { diff --git a/src_assets/common/assets/web/public/assets/locale/sv.json b/src_assets/common/assets/web/public/assets/locale/sv.json index 24492c0626..99a489f6c8 100644 --- a/src_assets/common/assets/web/public/assets/locale/sv.json +++ b/src_assets/common/assets/web/public/assets/locale/sv.json @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "Ange manuellt en GPU som ska användas för att fånga.", "adapter_name_desc_linux_2": "att hitta alla enheter som kan VAAPI", "adapter_name_desc_linux_3": "Ersätt ``renderD129`` med enheten ovanifrån för att lista enhetens namn och egenskaper. För att få stöd av Sunshine, måste det ha på minimum:", - "adapter_name_desc_win": "Ange manuellt en GPU som ska användas för att fånga. Om du vill avbryta, väljs GPU automatiskt. Vi rekommenderar starkt att du lämnar det här fältet tomt för att använda automatiskt GPU-val! Obs: Denna GPU måste ha en display ansluten och påslagen. Du hittar lämpliga värden med hjälp av följande kommando:", - "adapter_name_placeholder_win": "Radeon RX 580-serien", + "adapter_name_desc_windows": "Ange manuellt en GPU som ska användas för att fånga. Om du vill avbryta, väljs GPU automatiskt. Vi rekommenderar starkt att du lämnar det här fältet tomt för att använda automatiskt GPU-val! Obs: Denna GPU måste ha en display ansluten och påslagen. Du hittar lämpliga värden med hjälp av följande kommando:", + "adapter_name_placeholder_windows": "Radeon RX 580-serien", "add": "Lägg till", "address_family": "Adress Familj", "address_family_both": "IPv4+IPv6", @@ -123,9 +123,9 @@ "audio_sink": "Ljud Sink", "audio_sink_desc_linux": "Namnet på ljuddiskbänken som används för Audio Loopback. Om du inte anger denna variabel, kommer pulseaudio att välja standardövervakningsenheten. Du kan hitta namnet på audiosänkan med hjälp av antingen kommandot:", "audio_sink_desc_macos": "Namnet på ljuddiskbänken som används för Audio Loopback. Solsken kan bara komma åt mikrofoner på macOS på grund av systembegränsningar. För att strömma systemljud med Soundflower eller BlackHole.", - "audio_sink_desc_win": "Ange manuellt en specifik ljudenhet som ska fångas upp. Om enheten avaktiveras väljs enheten automatiskt. Vi rekommenderar starkt att lämna detta fält tomt för att använda automatiskt val av enhet! Om du har flera ljudenheter med identiska namn, kan du få enhets-ID med följande kommando:", + "audio_sink_desc_windows": "Ange manuellt en specifik ljudenhet som ska fångas upp. Om enheten avaktiveras väljs enheten automatiskt. Vi rekommenderar starkt att lämna detta fält tomt för att använda automatiskt val av enhet! Om du har flera ljudenheter med identiska namn, kan du få enhets-ID med följande kommando:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "Högtalare (High Definition Audio Device)", + "audio_sink_placeholder_windows": "Högtalare (High Definition Audio Device)", "av1_mode": "AV1 Support", "av1_mode_0": "Sunshine kommer att annonsera stöd för AV1 baserat på kodarfunktioner (rekommenderas)", "av1_mode_1": "Solsken kommer inte att annonsera stöd för AV1", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "Kontrollera hur snabba tangenter kommer att upprepa sig. Den initiala fördröjningen i millisekunder innan du upprepar nycklar.", "key_repeat_frequency": "Nyckel Upprepa Frekvens", "key_repeat_frequency_desc": "Hur ofta nycklar upprepa varje sekund. Detta konfigurerbara alternativ stöder decimaler.", - "key_rightalt_to_key_win": "Karta Höger Alt nyckel till Windows-tangenten", + "key_rightalt_to_key_windows": "Bind höger Alt tangent till Windows-tangenten", "key_rightalt_to_key_win_desc": "Det kan vara möjligt att du inte kan skicka Windows-tangenten från Moonlight direkt. I dessa fall kan det vara användbart att göra Sunshine tror att rätt Alt nyckel är Windows-tangenten", "keyboard": "Aktivera tangentbordsinmatning", "keyboard_desc": "Tillåter gäster att styra värdsystemet med tangentbordet", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "Endast de i LAN kan komma åt Web UI", "origin_web_ui_allowed_pc": "Endast localhost kan komma åt webbgränssnitt", "origin_web_ui_allowed_wan": "Vem som helst kan komma åt webbgränssnitt", - "output_name_desc_linux": "Under solsken start, bör du se listan över upptäckta skärmar. Du måste använda värdet innan kolon i utgången. t.ex.:", - "output_name_desc_win": "Ange manuellt en display som ska användas för att fånga. Om den avaktiveras fångas den primära displayen. Obs: Om du angav en GPU ovan måste denna display vara ansluten till den GPU. De lämpliga värdena kan hittas med följande kommando:", - "output_name_linux": "Övervaka nummer", - "output_name_win": "Utdatanamn", + "output_name_desc_unix": "Under Sunshine start, bör du se listan över upptäckta visningar. Obs: Du måste använda id-värdet inuti parentesen.", + "output_name_desc_windows": "Ange manuellt en display som ska användas för att fånga. Om den avaktiveras fångas den primära displayen. Obs: Om du angav en GPU ovan måste denna display vara ansluten till den GPU. De lämpliga värdena kan hittas med följande kommando:", + "output_name_unix": "Visa nummer", + "output_name_windows": "Utdatanamn", "ping_timeout": "Ping Timeout", "ping_timeout_desc": "Hur lång tid att vänta i millisekunder för data från månsken innan du stänger av strömmen", "pkey": "Privat nyckel", diff --git a/src_assets/common/assets/web/public/assets/locale/zh.json b/src_assets/common/assets/web/public/assets/locale/zh.json index c5efef9783..3e47f09f77 100644 --- a/src_assets/common/assets/web/public/assets/locale/zh.json +++ b/src_assets/common/assets/web/public/assets/locale/zh.json @@ -6,7 +6,7 @@ "cancel": "取消", "disabled": "禁用", "disabled_def": "禁用(默认)", - "do_cmd": "打开应用时执行命令", + "do_cmd": "打开时执行命令", "elevated": "提权运行", "enabled": "启用", "enabled_def": "启用(默认)", @@ -82,8 +82,8 @@ "adapter_name_desc_linux_1": "手动指定用于捕获的 GPU 。", "adapter_name_desc_linux_2": "找到所有能够使用 VAAPI 的设备", "adapter_name_desc_linux_3": "用上面的设备替换``renderD129``,列出设备的名称和功能。要获得 Sunshine 的支持,设备至少需要具备以下功能:", - "adapter_name_desc_win": "手动指定用于捕获的 GPU 。如果未设置,GPU 将被自动选择。 我们强烈建议将此字段留空以使用自动的 GPU 选择!注意:此GPU 必须连接并开启显示器。 可以使用以下命令找到适当的值:", - "adapter_name_placeholder_win": "Radeon RX 580系列", + "adapter_name_desc_windows": "手动指定用于捕获的 GPU 。如果未设置,GPU 将被自动选择。 我们强烈建议将此字段留空以使用自动的 GPU 选择!注意:此GPU 必须连接并开启显示器。 可以使用以下命令找到适当的值:", + "adapter_name_placeholder_windows": "Radeon RX 580系列", "add": "添加", "address_family": "IP 地址族", "address_family_both": "IPv4+IPv6", @@ -94,9 +94,9 @@ "amd_coder": "AMF 编码器 (H264)", "amd_coder_desc": "允许您选择用于优先质量或编码速度的缠绕编码。 H.264。", "amd_enforce_hrd": "AMF 推测参考解码器 (HRD)", - "amd_enforce_hrd_desc": "提高对费率控制的限制,以满足人力资源开发模式的要求。 这大大减少了比特率过量流量,但可能导致编码伪影或降低某些卡片的质量。", + "amd_enforce_hrd_desc": "增强对码率控制的限制,以满足假想参考解码器(HRD)模型的要求。 这可以大大降低超过指定码率限制的可能,但可能导致编码伪影或降低在某些显卡上的编码质量。", "amd_preanalysis": "AMF 预分析", - "amd_preanalysis_desc": "这使得能够进行比率控制预分析,这可能会以增加编码延迟为代价提高质量。", + "amd_preanalysis_desc": "启用码率控制预分析,可能会以增加编码延迟为代价提高质量。", "amd_quality": "AMF 质量", "amd_quality_balanced": "balanced -- 平衡(默认)", "amd_quality_desc": "这将控制编码速度和质量之间的平衡。", @@ -104,11 +104,11 @@ "amd_quality_quality": "quality -- 偏好质量", "amd_quality_speed": "speed -- 偏好速度", "amd_rc": "AMF 码率控制", - "amd_rc_cbr": "cbr -- 恒定比特率(默认)", + "amd_rc_cbr": "cbr -- 恒定比特率(在启用HDR时推荐)", "amd_rc_cqp": "cqp -- 恒定 QP 模式", - "amd_rc_desc": "这将控制费率控制方法,以确保我们不超过客户端比特率目标。 “cqp”不适合于比特率定位,除“vbr_latency”之外的其他选项依赖于人力资源开发的执行来帮助抑制比特率过多。", - "amd_rc_group": "AMF 费率控制设置", - "amd_rc_vbr_latency": "vbr_latency -- 受延迟限制的可变比特率", + "amd_rc_desc": "这将控制码率控制方法,确保我们不超过客户端比特率限制。 “cqp”不适合于比特率限制,除“vbr_latency”之外的其他选项依赖于HRD(假想参考解码器)限制来防止比特率超过限制。", + "amd_rc_group": "AMF 码率控制设置", + "amd_rc_vbr_latency": "vbr_latency -- 考虑延迟的可变比特率(在禁用HDR时推荐使用;默认)", "amd_rc_vbr_peak": "vbr_peak -- 受峰值限制的可变比特率", "amd_usage": "AMF 工作模式", "amd_usage_desc": "设置基本编码配置文件。 以下列出的所有选项将覆盖使用情况简介的子集,但是应用到了其他不可配置的隐藏设置。", @@ -123,9 +123,9 @@ "audio_sink": "音频输出设备", "audio_sink_desc_linux": "手动指定需要抓取的音频输出设备。如果您没有指定此变量,PulseAudio 将选择默认监测设备。 您可以使用以下任何命令找到音频输出设备的名称:", "audio_sink_desc_macos": "手动指定需要抓取的音频输出设备。由于系统限制,Sunshine 在 macOS 上只能访问麦克风。 使用 Soundflow 或 BlackHole 来串流系统音频。", - "audio_sink_desc_win": "手动指定需要抓取的音频输出设备。如果未设置,则会自动选择设备。 我们强烈建议将此字段留空,以便使用自动选择设备功能! 如果您有多个具有相同名称的音频设备,您可以使用以下命令获取设备ID:", + "audio_sink_desc_windows": "手动指定要抓取的特定音频设备。如果未设置,则自动选择该设备。 我们强烈建议将此字段留空以使用自动选择设备! 如果您有多个具有相同名称的音频设备,您可以使用以下命令获取设备ID:", "audio_sink_placeholder_macos": "BlackHole 2ch", - "audio_sink_placeholder_win": "扬声器 (High Definition Audio Device)", + "audio_sink_placeholder_windows": "扬声器(高定义音频设备)", "av1_mode": "AV1 支持", "av1_mode_0": "Sunshine 将基于编码器能力通告对 AV1 的支持(推荐)", "av1_mode_1": "Sunshine 将不会通告对 AV1 的支持", @@ -185,7 +185,7 @@ "key_repeat_delay_desc": "控制按键重复的速度。重复按键前的初始延迟(毫秒)。", "key_repeat_frequency": "按键重复频率", "key_repeat_frequency_desc": "按键每秒重复的次数。此配置选项支持小数。", - "key_rightalt_to_key_win": "将右 Alt 键映射到 Windows 键", + "key_rightalt_to_key_windows": "将右Alt 键映射到 Windows 键", "key_rightalt_to_key_win_desc": "您可能无法直接从 Moonlight 发送 Windows 键。在这种情况下,让 Sunshine 认为右 Alt 键是 Windows 键可能会很有用。", "keyboard": "启用键盘输入", "keyboard_desc": "允许客户端使用键盘控制主机系统", @@ -216,23 +216,23 @@ "native_pen_touch": "原生笔/触摸支持", "native_pen_touch_desc": "启用后,Sunshine 将透传来自 Moonlight 客户端的原生笔/触控事件。对于不支持原生笔/触控的旧版应用程序来说,禁用此功能非常有用。", "nvenc_h264_cavlc": "在 H.264 中,偏向 CAVLC 而不是 CABAC", - "nvenc_h264_cavlc_desc": "一种更简单的熵编码形式。相同质量的情况下,CAVLC 需要大约多出 10% 的比特率。只与真正老旧的解码设备相关。", + "nvenc_h264_cavlc_desc": "一种更简单的熵编码形式。相同质量的情况下,CAVLC 需要增加 10% 的比特率。只适用于非常老旧的解码设备。", "nvenc_latency_over_power": "倾向于较低的编码延迟而不是省电", "nvenc_latency_over_power_desc": "Sunshine 在串流时请求最高的 GPU 核心频率,以降低编码延迟。 不建议禁用它,因为这会大大增加编码延迟。", "nvenc_opengl_vulkan_on_dxgi": "在 DXGI 基础上呈现 OpenGL/Vulkan", - "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine 无法以满帧捕获全屏 OpenGL 和 Vulkan 程序,除非它们出现在 DXGI 上。这是系统范围的设置,会在 Sunshine 程序退出时恢复。", + "nvenc_opengl_vulkan_on_dxgi_desc": "Sunshine 无法以满帧速率捕获不处于DXGI顶部的全屏 OpenGL 和 Vulkan 程序。这是系统范围的设置,会在 Sunshine 程序退出时恢复。", "nvenc_preset": "性能预设", "nvenc_preset_1": "(最快,默认)", "nvenc_preset_7": "(最慢)", "nvenc_preset_desc": "数字越大,压缩效果(给定比特率下的质量)越好,但代价是编码延迟增加。建议仅在受网络或解码器限制时更改,否则可通过提高比特率达到类似效果。", - "nvenc_realtime_hags": "在硬件加速 GPU 计划 (HAGS) 中使用实时优先级", + "nvenc_realtime_hags": "在硬件加速 GPU 调度中使用实时优先级", "nvenc_realtime_hags_desc": "目前,当启用 HAGS、使用实时优先级且 VRAM 利用率接近最大值时,NVIDIA 驱动程序可能会冻结编码器。禁用该选项可将优先级降至高,从而避免冻结,但代价是在 GPU 负载较高时捕捉性能会降低。", "nvenc_spatial_aq": "Spatial AQ", - "nvenc_spatial_aq_desc": "将较高的 QP 值分配给视频的平坦区域。建议在以较低的比特率进行串流时启用。", + "nvenc_spatial_aq_desc": "将较高的 QP 值分配给视频的平场区域。建议在以较低的比特率进行串流时启用。", "nvenc_spatial_aq_disabled": "禁用(更快,默认)", "nvenc_spatial_aq_enabled": "启用(较慢)", "nvenc_twopass": "二次编码模式", - "nvenc_twopass_desc": "添加二次编码。这样可以检测到更多的运动矢量,更好地分配整个帧的比特率,并更严格地遵守比特率限制。不建议禁用它,因为这会导致偶尔的比特率超限和随后的丢包。", + "nvenc_twopass_desc": "添加二次编码。这样可以检测到更多的运动矢量,更好地分配整个帧的比特率,并更能防止比特率超过限制。不建议禁用它,因为这会导致偶尔的比特率超限和随后的丢包。", "nvenc_twopass_disabled": "禁用(最快,不推荐)", "nvenc_twopass_full_res": "全分辨率(较慢)", "nvenc_twopass_quarter_res": "1/4分辨率(更快,默认)", @@ -243,10 +243,10 @@ "origin_web_ui_allowed_lan": "仅局域网中的设备可以访问 Web UI", "origin_web_ui_allowed_pc": "仅本地可以访问 Web UI", "origin_web_ui_allowed_wan": "任何人都可以访问 Web UI", - "output_name_desc_linux": "在阳光启动过程中,您应该看到检测到的显示器列表。您需要在输出中的冒号之前使用该值,例如:", - "output_name_desc_win": "手动指定用于捕捉的显示器。如果未设置,则捕捉主显示屏。注意:如果在上面指定了 GPU,则该显示器必须连接到该 GPU。可以使用以下命令找到相应的值:", - "output_name_linux": "显示器编号", - "output_name_win": "输出名称", + "output_name_desc_unix": "在 sunshine 启动过程中,您将看到检测到的显示器列表。注意:您需要使用括号内的ID值。", + "output_name_desc_windows": "手动指定用于抓取的显示。如果未设置,则捕获主显示。 注意:如果您在上面指定了GPU,则此显示必须连接到该GPU。可以使用以下命令找到相应的值:", + "output_name_unix": "显示器编号", + "output_name_windows": "输出名称", "ping_timeout": "Ping 超时", "ping_timeout_desc": "关闭串流前等待 Moonlight 数据的时间(以毫秒计)", "pkey": "私钥", @@ -362,7 +362,7 @@ "third_party_notice": "第三方声明" }, "troubleshooting": { - "force_close": "强制结束运行", + "force_close": "强制关闭", "force_close_desc": "如果 Moonlight 抱怨某个应用正在运行,强制关闭该应用应该可以解决问题。", "force_close_error": "关闭应用时出错", "force_close_success": "应用关闭成功!", From e6e4dcf0170615f100987809258a7d3dd33b69a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 15:21:07 -0400 Subject: [PATCH 30/34] build(deps): bump third-party/moonlight-common-c from `cbd0ec1` to `eb21561` (#2227) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- third-party/moonlight-common-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/moonlight-common-c b/third-party/moonlight-common-c index cbd0ec1b25..eb21561541 160000 --- a/third-party/moonlight-common-c +++ b/third-party/moonlight-common-c @@ -1 +1 @@ -Subproject commit cbd0ec1b25edfb8ee8645fffa49ff95b6e04c70e +Subproject commit eb21561541874d9e9dbd7da26000c6dd55050748 From 890b6fd18bd783efe259f33205d2732a05428e52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 08:52:08 -0400 Subject: [PATCH 31/34] build(deps): bump LizardByte/homebrew-release-action from 2024.511.160217 to 2024.516.191449 (#2535) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 4ac8cb729c..167fa9abe2 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -654,7 +654,7 @@ jobs: echo "publish=${PUBLISH}" >> $GITHUB_OUTPUT - name: Validate and Publish Homebrew Formula - uses: LizardByte/homebrew-release-action@v2024.511.160217 + uses: LizardByte/homebrew-release-action@v2024.516.191449 with: formula_file: ${{ github.workspace }}/homebrew/sunshine.rb git_email: ${{ secrets.GH_BOT_EMAIL }} From 373390e771e503e2e2f5318770489297f1d03bbc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 19 May 2024 09:14:07 -0400 Subject: [PATCH 32/34] build(deps): bump third-party/build-deps from `efd3a38` to `a326d43` (#2536) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- third-party/build-deps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/build-deps b/third-party/build-deps index efd3a38011..a326d43947 160000 --- a/third-party/build-deps +++ b/third-party/build-deps @@ -1 +1 @@ -Subproject commit efd3a380113e8ae98ae68cc1d73fd7c4b54b03c6 +Subproject commit a326d43947eff1d4a9a7f72e22c9b0ea085b83b7 From fdb443a7c6514a0200f1875c0fa3c0553da2d862 Mon Sep 17 00:00:00 2001 From: Gyanesh Patra Date: Sun, 19 May 2024 14:31:14 -0700 Subject: [PATCH 33/34] Fix log message for Periodic Ping (#2538) --- src/stream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stream.cpp b/src/stream.cpp index df5b3d9619..fe62f03e6e 100644 --- a/src/stream.cpp +++ b/src/stream.cpp @@ -893,7 +893,7 @@ namespace stream { void controlBroadcastThread(control_server_t *server) { server->map(packetTypes[IDX_PERIODIC_PING], [](session_t *session, const std::string_view &payload) { - BOOST_LOG(verbose) << "type [IDX_START_A]"sv; + BOOST_LOG(verbose) << "type [IDX_PERIODIC_PING]"sv; }); server->map(packetTypes[IDX_START_A], [&](session_t *session, const std::string_view &payload) { From 26ceec5f3c97b0130b82cb28ba53c3b4dafc8419 Mon Sep 17 00:00:00 2001 From: LizardByte-bot <108553330+LizardByte-bot@users.noreply.github.com> Date: Mon, 20 May 2024 15:28:48 -0400 Subject: [PATCH 34/34] chore: update global workflows (#2547) --- .github/workflows/update-changelog.yml | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/update-changelog.yml diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml new file mode 100644 index 0000000000..d5bbed6710 --- /dev/null +++ b/.github/workflows/update-changelog.yml @@ -0,0 +1,31 @@ +--- +# This action is centrally managed in https://github.com//.github/ +# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in +# the above-mentioned repo. + +# Update changelog on release events. + +name: Update changelog + +on: + release: + types: [created, edited, deleted] + workflow_dispatch: + +concurrency: + group: "${{ github.workflow }}" + cancel-in-progress: true + +jobs: + update-changelog: + if: >- + github.event_name == 'workflow_dispatch' || + (!github.event.release.prerelease && !github.event.release.draft) + runs-on: ubuntu-latest + steps: + - name: Update Changelog + uses: LizardByte/update-changelog-action@v2024.520.183314 + with: + changelogBranch: changelog + changelogFile: CHANGELOG.md + token: ${{ secrets.GH_BOT_TOKEN }}