# Conflicts:
#	.github/workflows/ci-copr.yml
#	.github/workflows/ci-flatpak.yml
#	.github/workflows/ci-homebrew.yml
#	.github/workflows/ci-linux.yml
#	.github/workflows/ci-windows.yml
#	.github/workflows/ci.yml
#	.github/workflows/localize.yml
#	README.md
#	scripts/icons/convert_and_pack.sh
#	src/config.cpp
#	src/config.h
#	src/confighttp.cpp
#	src/logging.cpp
#	src/video.cpp
#	src_assets/common/assets/web/config.html
#	src_assets/common/assets/web/public/assets/locale/en.json
#	src_assets/common/assets/web/public/assets/locale/it.json
#	src_assets/windows/misc/gamepad/install-gamepad.bat
#	third-party/build-deps
#	third-party/moonlight-common-c
#	tools/CMakeLists.txt
This commit is contained in:
Yukino Song
2025-08-03 13:52:19 +08:00
43 changed files with 487 additions and 486 deletions

5
.gitattributes vendored
View File

@@ -1,6 +1,5 @@
# ensure dockerfiles are checked out with LF line endings # ensure Linux specific files are checked out with LF line endings
Dockerfile text eol=lf Dockerfile text eol=lf
*.dockerfile text eol=lf *.dockerfile text eol=lf
# ensure flatpak lint json files are checked out with LF line endings
*flatpak-lint-*.json text eol=lf *flatpak-lint-*.json text eol=lf
*.sh text eol=lf

17
.github/matchers/copr-ci.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
"problemMatcher": [
{
"owner": "copr-ci-gcc",
"pattern": [
{
"regexp": "^/?(?:[^/]+/){5}([^:]+):(\\d+):(\\d+):\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
]
}
]
}

17
.github/matchers/docker.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
"problemMatcher": [
{
"owner": "docker-gcc",
"pattern": [
{
"regexp": "^(?:#\\d+\\s+\\d+\\.\\d+\\s+)?/?(?:[^/]+/){2}([^:]+):(\\d+):(\\d+):\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
]
}
]
}

17
.github/matchers/gcc-strip3.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
"problemMatcher": [
{
"owner": "gcc-strip3",
"pattern": [
{
"regexp": "^/?(?:[^/]+/){3}([^:]+):(\\d+):(\\d+):\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
]
}
]
}

29
.github/matchers/gcc.json vendored Normal file
View File

@@ -0,0 +1,29 @@
{
"problemMatcher": [
{
"owner": "gcc",
"pattern": [
{
"regexp": "^(.*):(\\d+):(\\d+):\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
]
},
{
"owner": "doxygen",
"pattern": [
{
"regexp": "^.*?([A-Za-z]:[\\\\/][^:]+|[\\\\/][^:]+):(\\d+): ([a-zA-Z]+): (.+)$",
"file": 1,
"line": 2,
"severity": 3,
"message": 4
}
]
}
]
}

View File

@@ -45,6 +45,7 @@ set(CPACK_DEBIAN_PACKAGE_DEPENDS "\
libcap2, \ libcap2, \
libcurl4, \ libcurl4, \
libdrm2, \ libdrm2, \
libgbm1, \
libevdev2, \ libevdev2, \
libnuma1, \ libnuma1, \
libopus0, \ libopus0, \
@@ -65,6 +66,7 @@ set(CPACK_RPM_PACKAGE_REQUIRES "\
libva >= 2.14.0, \ libva >= 2.14.0, \
libwayland-client >= 1.20.0, \ libwayland-client >= 1.20.0, \
libX11 >= 1.7.3.1, \ libX11 >= 1.7.3.1, \
mesa-libgbm >= 25.0.7, \
miniupnpc >= 2.2.4, \ miniupnpc >= 2.2.4, \
numactl-libs >= 2.0.14, \ numactl-libs >= 2.0.14, \
openssl >= 3.0.2, \ openssl >= 3.0.2, \

View File

@@ -4,6 +4,20 @@ install(TARGETS sunshine RUNTIME DESTINATION "." COMPONENT application)
# Hardening: include zlib1.dll (loaded via LoadLibrary() in openssl's libcrypto.a) # Hardening: include zlib1.dll (loaded via LoadLibrary() in openssl's libcrypto.a)
install(FILES "${ZLIB}" DESTINATION "." COMPONENT application) install(FILES "${ZLIB}" DESTINATION "." COMPONENT application)
# ViGEmBus installer
set(VIGEMBUS_INSTALLER "${CMAKE_BINARY_DIR}/vigembus_installer.exe")
file(DOWNLOAD
"https://github.com/nefarius/ViGEmBus/releases/download/v1.21.442.0/ViGEmBus_1.21.442_x64_x86_arm64.exe"
${VIGEMBUS_INSTALLER}
SHOW_PROGRESS
EXPECTED_HASH SHA256=155c50f1eec07bdc28d2f61a3e3c2c6c132fee7328412de224695f89143316bc
TIMEOUT 60
)
install(FILES ${VIGEMBUS_INSTALLER}
DESTINATION "scripts"
RENAME "vigembus_installer.exe"
COMPONENT gamepad)
# Adding tools # Adding tools
install(TARGETS dxgi-info RUNTIME DESTINATION "tools" COMPONENT dxgi) install(TARGETS dxgi-info RUNTIME DESTINATION "tools" COMPONENT dxgi)
install(TARGETS audio-info RUNTIME DESTINATION "tools" COMPONENT audio) install(TARGETS audio-info RUNTIME DESTINATION "tools" COMPONENT audio)

View File

@@ -16,7 +16,8 @@ SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS
nsExec::ExecToLog '\\\"$INSTDIR\\\\drivers\\\\sudovda\\\\install.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\drivers\\\\sudovda\\\\install.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\migrate-config.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\migrate-config.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\add-firewall-rule.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\add-firewall-rule.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\install-gamepad.bat\\\"' nsExec::ExecToLog \
'powershell.exe -ExecutionPolicy Bypass -File \\\"$INSTDIR\\\\scripts\\\\install-gamepad.ps1\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\install-service.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\install-service.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\autostart-service.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\autostart-service.bat\\\"'
NoController: NoController:
@@ -32,7 +33,9 @@ set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
MessageBox MB_YESNO|MB_ICONQUESTION \ MessageBox MB_YESNO|MB_ICONQUESTION \
'Do you want to remove Virtual Gamepad?' \ 'Do you want to remove Virtual Gamepad?' \
/SD IDNO IDNO NoGamepad /SD IDNO IDNO NoGamepad
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\uninstall-gamepad.bat\\\"'; skipped if no nsExec::ExecToLog \
'powershell.exe -ExecutionPolicy Bypass -File \\\"$INSTDIR\\\\scripts\\\\uninstall-gamepad.ps1\\\"'; \
skipped if no
NoGamepad: NoGamepad:
MessageBox MB_YESNO|MB_ICONQUESTION \ MessageBox MB_YESNO|MB_ICONQUESTION \
'Do you want to remove SudoVDA Virtual Display Driver?' \ 'Do you want to remove SudoVDA Virtual Display Driver?' \

View File

@@ -1,18 +1,18 @@
# Set build variables if env variables are defined # Set build variables if env variables are defined
# These are used in configured files such as manifests for different packages # These are used in configured files such as manifests for different packages
if(DEFINED ENV{BRANCH}) # cmake-lint: disable=W0106 if(DEFINED ENV{BRANCH})
set(GITHUB_BRANCH $ENV{BRANCH}) set(GITHUB_BRANCH $ENV{BRANCH})
endif() endif()
if(DEFINED ENV{BUILD_VERSION}) # cmake-lint: disable=W0106 if(DEFINED ENV{BUILD_VERSION}) # cmake-lint: disable=W0106
set(BUILD_VERSION $ENV{BUILD_VERSION}) set(BUILD_VERSION $ENV{BUILD_VERSION})
endif() endif()
if(DEFINED ENV{CLONE_URL}) # cmake-lint: disable=W0106 if(DEFINED ENV{CLONE_URL})
set(GITHUB_CLONE_URL $ENV{CLONE_URL}) set(GITHUB_CLONE_URL $ENV{CLONE_URL})
endif() endif()
if(DEFINED ENV{COMMIT}) # cmake-lint: disable=W0106 if(DEFINED ENV{COMMIT})
set(GITHUB_COMMIT $ENV{COMMIT}) set(GITHUB_COMMIT $ENV{COMMIT})
endif() endif()
if(DEFINED ENV{TAG}) # cmake-lint: disable=W0106 if(DEFINED ENV{TAG})
set(GITHUB_TAG $ENV{TAG}) set(GITHUB_TAG $ENV{TAG})
endif() endif()

View File

@@ -27,7 +27,7 @@ endif()
target_link_libraries(sunshine ${SUNSHINE_EXTERNAL_LIBRARIES} ${EXTRA_LIBS}) target_link_libraries(sunshine ${SUNSHINE_EXTERNAL_LIBRARIES} ${EXTRA_LIBS})
target_compile_definitions(sunshine PUBLIC ${SUNSHINE_DEFINITIONS}) target_compile_definitions(sunshine PUBLIC ${SUNSHINE_DEFINITIONS})
set_target_properties(sunshine PROPERTIES CXX_STANDARD 20 set_target_properties(sunshine PROPERTIES CXX_STANDARD 23
VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}) SOVERSION ${PROJECT_VERSION_MAJOR})

View File

@@ -32,7 +32,6 @@ ENV CLONE_URL=${CLONE_URL}
SHELL ["/bin/bash", "-o", "pipefail", "-c"] SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# hadolint ignore=SC2016
RUN <<_SETUP RUN <<_SETUP
#!/bin/bash #!/bin/bash
set -e set -e
@@ -42,6 +41,7 @@ useradd -m builder
echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
# patch the build flags # patch the build flags
# shellcheck disable=SC2016
sed -i 's,#MAKEFLAGS="-j2",MAKEFLAGS="-j$(nproc)",g' /etc/makepkg.conf sed -i 's,#MAKEFLAGS="-j2",MAKEFLAGS="-j$(nproc)",g' /etc/makepkg.conf
# install dependencies # install dependencies

View File

@@ -19,7 +19,6 @@ ENV DISPLAY=:0
SHELL ["/bin/bash", "-o", "pipefail", "-c"] SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# install dependencies # install dependencies
# hadolint ignore=SC1091
RUN <<_DEPS RUN <<_DEPS
#!/bin/bash #!/bin/bash
set -e set -e
@@ -74,7 +73,6 @@ WORKDIR /build/cuda
# versions: https://developer.nvidia.com/cuda-toolkit-archive # versions: https://developer.nvidia.com/cuda-toolkit-archive
ENV CUDA_VERSION="11.8.0" ENV CUDA_VERSION="11.8.0"
ENV CUDA_BUILD="520.61.05" ENV CUDA_BUILD="520.61.05"
# hadolint ignore=SC3010
RUN <<_INSTALL_CUDA RUN <<_INSTALL_CUDA
#!/bin/bash #!/bin/bash
set -e set -e

View File

@@ -42,7 +42,6 @@ _BUILD
# run tests # run tests
WORKDIR /build/sunshine/build/tests WORKDIR /build/sunshine/build/tests
# hadolint ignore=SC1091
RUN <<_TEST RUN <<_TEST
#!/bin/bash #!/bin/bash
set -e set -e

View File

@@ -42,7 +42,6 @@ _BUILD
# run tests # run tests
WORKDIR /build/sunshine/build/tests WORKDIR /build/sunshine/build/tests
# hadolint ignore=SC1091
RUN <<_TEST RUN <<_TEST
#!/bin/bash #!/bin/bash
set -e set -e

View File

@@ -42,7 +42,6 @@ _BUILD
# run tests # run tests
WORKDIR /build/sunshine/build/tests WORKDIR /build/sunshine/build/tests
# hadolint ignore=SC1091
RUN <<_TEST RUN <<_TEST
#!/bin/bash #!/bin/bash
set -e set -e

View File

@@ -1291,7 +1291,7 @@ editing the `conf` file in a text editor. Use the examples as reference.
<td colspan="2"> <td colspan="2">
Remap the requested resolution and FPS to another display mode.<br> Remap the requested resolution and FPS to another display mode.<br>
Depending on the [dd_resolution_option](#dd_resolution_option) and Depending on the [dd_resolution_option](#dd_resolution_option) and
[dd_refresh_rate_option](#dd_refresh_rate_option) values, the following mapping [dd_refresh_rate_option](#dd_refresh_rate_option) values, the following mapping
groups are available: groups are available:
<ul> <ul>
<li>`mixed` - both options are set to `auto`.</li> <li>`mixed` - both options are set to `auto`.</li>
@@ -1302,7 +1302,7 @@ editing the `conf` file in a text editor. Use the examples as reference.
`refresh_rate_only` - only [dd_refresh_rate_option](#dd_refresh_rate_option) is set to `auto`. `refresh_rate_only` - only [dd_refresh_rate_option](#dd_refresh_rate_option) is set to `auto`.
</li> </li>
</ul> </ul>
For each of those groups, a list of fields can be configured to perform remapping: For each of those groups, a list of fields can be configured to perform remapping:
<ul> <ul>
<li> <li>
`requested_resolution` - resolution that needs to be matched in order to use this remapping entry. `requested_resolution` - resolution that needs to be matched in order to use this remapping entry.
@@ -1312,10 +1312,10 @@ editing the `conf` file in a text editor. Use the examples as reference.
<li>`final_refresh_rate` - refresh rate value to be used if the entry was matched.</li> <li>`final_refresh_rate` - refresh rate value to be used if the entry was matched.</li>
</ul> </ul>
If `requested_*` field is left empty, it will match <b>everything</b>.<br> If `requested_*` field is left empty, it will match <b>everything</b>.<br>
If `final_*` field is left empty, the original value will not be remapped and either a requested, manual If `final_*` field is left empty, the original value will not be remapped and either a requested, manual
or current value is used. However, at least one `final_*` must be set, otherwise the entry is considered or current value is used. However, at least one `final_*` must be set, otherwise the entry is considered
invalid.<br> invalid.<br>
@note{"Optimize game settings" must be enabled on client side for ANY entry with `resolution` @note{"Optimize game settings" must be enabled on client side for ANY entry with `resolution`
field to be considered.} field to be considered.}
@note{First entry to be matched in the list is the one that will be used.} @note{First entry to be matched in the list is the one that will be used.}
@tip{`requested_resolution` and `final_resolution` can be omitted for `refresh_rate_only` group.} @tip{`requested_resolution` and `final_resolution` can be omitted for `refresh_rate_only` group.}
@@ -1392,6 +1392,32 @@ editing the `conf` file in a text editor. Use the examples as reference.
</tr> </tr>
</table> </table>
### minimum_fps_target
<table>
<tr>
<td>Description</td>
<td colspan="2">
Sunshine tries to save bandwidth when content on screen is static or a low framerate. Because many clients expect a constant stream of video frames, a certain amount of duplicate frames are sent when this happens. This setting controls the lowest effective framerate a stream can reach.
</td>
</tr>
<tr>
<td>Default</td>
<td colspan="2">@code{}
0
@endcode</td>
</tr>
<tr>
<td rowspan="3">Choices</td>
<td>0</td>
<td>Use half the stream's FPS as the minimum target.</td>
</tr>
<tr>
<td>1-1000</td>
<td>Specify your own value. The real minimum may differ from this value.</td>
</tr>
</table>
## Network ## Network
### upnp ### upnp

View File

@@ -84,9 +84,35 @@ client only 1 Gbit/s or Wi-Fi. Similarly, a 1 Gbps host may be too fast for a
client having only a 100 Mbps interface. client having only a 100 Mbps interface.
As a workaround the transmission speed of the host NIC can be reduced: 1 Gbps As a workaround the transmission speed of the host NIC can be reduced: 1 Gbps
instead of 2.5 or 100 Mbps instead of 1 Gbps. (A technically more advanced instead of 2.5 or 100 Mbps instead of 1 Gbps. A technically more advanced
solution would be to configure traffic shaping rules at the OS-level, so that solution would be to configure traffic shaping rules at the OS-level, so that
only Sunshine's traffic is slowed down.) only Sunshine's traffic is slowed down.
Such a solution on Linux could look like that:
```bash
# 1) Remove existing qdisc (pfifo_fast)
sudo tc qdisc del dev <NIC> root
# 2) Add HTB root qdisc with default class 1:1
sudo tc qdisc add dev <NIC> root handle 1: htb default 1
# 3) Create class 1:1 for full 10 Gbit/s (all other traffic)
sudo tc class add dev <NIC> parent 1: classid 1:1 htb \
rate 10000mbit ceil 10000mbit burst 32k
# 4) Create class 1:10 for Sunshine game stream at 1 Gbit/s
sudo tc class add dev <NIC> parent 1: classid 1:10 htb \
rate 1000mbit ceil 1000mbit burst 32k
# 5) Filter UDP source port 47998 into class 1:10
sudo tc filter add dev <NIC> protocol ip parent 1: prio 1 \
u32 match ip protocol 17 0xff \
match ip sport 47998 0xffff flowid 1:10
```
In that way only the Sunshine traffic is limited by 1 Gbit. This is not persistent on reboots.
If you use a different port for the game stream you need to adjust the last command.
Sunshine versions > 0.23.1 include improved networking code that should Sunshine versions > 0.23.1 include improved networking code that should
alleviate or even solve this issue (without reducing the NIC speed). alleviate or even solve this issue (without reducing the NIC speed).

View File

@@ -9,8 +9,8 @@
}, },
"dependencies": { "dependencies": {
"@lizardbyte/shared-web": "2025.626.181239", "@lizardbyte/shared-web": "2025.626.181239",
"vue": "3.5.17", "vue": "3.5.18",
"vue-i18n": "11.1.9" "vue-i18n": "11.1.11"
}, },
"devDependencies": { "devDependencies": {
"@codecov/vite-plugin": "1.9.1", "@codecov/vite-plugin": "1.9.1",

View File

@@ -97,9 +97,6 @@ tar -xzf %{SOURCE0} -C %{_builddir}/Sunshine
# list directory # list directory
ls -a %{_builddir}/Sunshine ls -a %{_builddir}/Sunshine
# patches
%autopatch -p1
%build %build
# exit on error # exit on error
set -e set -e

View File

@@ -2,12 +2,12 @@
# User Service # User Service
mkdir -p ~/.config/systemd/user mkdir -p ~/.config/systemd/user
cp /app/share/sunshine/systemd/user/sunshine.service $HOME/.config/systemd/user/sunshine.service cp "/app/share/sunshine/systemd/user/sunshine.service" "$HOME/.config/systemd/user/sunshine.service"
echo Sunshine User Service has been installed. echo "Sunshine User Service has been installed."
echo Use [systemctl --user enable sunshine] once to autostart Sunshine on login. echo "Use [systemctl --user enable sunshine] once to autostart Sunshine on login."
# Udev rule # Udev rule
UDEV=$(cat /app/share/sunshine/udev/rules.d/60-sunshine.rules) UDEV=$(cat /app/share/sunshine/udev/rules.d/60-sunshine.rules)
echo Configuring mouse permission. echo "Configuring mouse permission."
flatpak-spawn --host pkexec sh -c "echo '$UDEV' > /etc/udev/rules.d/60-sunshine.rules" flatpak-spawn --host pkexec sh -c "echo '$UDEV' > /etc/udev/rules.d/60-sunshine.rules"
echo Restart computer for mouse permission to take effect. echo "Restart computer for mouse permission to take effect."

View File

@@ -2,10 +2,10 @@
# User Service # User Service
systemctl --user stop sunshine systemctl --user stop sunshine
rm $HOME/.config/systemd/user/sunshine.service rm "$HOME/.config/systemd/user/sunshine.service"
systemctl --user daemon-reload systemctl --user daemon-reload
echo Sunshine User Service has been removed. echo "Sunshine User Service has been removed."
# Udev rule # Udev rule
flatpak-spawn --host pkexec sh -c "rm /etc/udev/rules.d/60-sunshine.rules" flatpak-spawn --host pkexec sh -c "rm /etc/udev/rules.d/60-sunshine.rules"
echo Input rules removed. Restart computer to take effect. echo "Input rules removed. Restart computer to take effect."

View File

@@ -29,9 +29,8 @@ class @PROJECT_NAME@ < Formula
depends_on "cmake" => :build depends_on "cmake" => :build
depends_on "doxygen" => :build depends_on "doxygen" => :build
depends_on "graphviz" => :build depends_on "graphviz" => :build
depends_on "ninja" => :build
depends_on "node" => :build depends_on "node" => :build
depends_on "pkg-config" => :build depends_on "pkgconf" => :build
depends_on "curl" depends_on "curl"
depends_on "miniupnpc" depends_on "miniupnpc"
depends_on "openssl" depends_on "openssl"
@@ -39,25 +38,8 @@ class @PROJECT_NAME@ < Formula
depends_on "icu4c" => :recommended depends_on "icu4c" => :recommended
on_linux do on_linux do
# the "build" dependencies are for libayatana-appindicator
depends_on "at-spi2-core" => :build
depends_on "cairo" => :build
depends_on "fontconfig" => :build
depends_on "freetype" => :build
depends_on "fribidi" => :build
depends_on "gettext" => :build
depends_on "gobject-introspection" => :build
depends_on "graphite2" => :build
depends_on "gtk+3" => :build
depends_on "harfbuzz" => :build
depends_on "intltool" => :build
depends_on "libepoxy" => :build
depends_on "libxdamage" => :build
depends_on "libxkbcommon" => :build
depends_on "pango" => :build
depends_on "perl" => :build
depends_on "pixman" => :build
depends_on "avahi" depends_on "avahi"
depends_on "libayatana-appindicator"
depends_on "libcap" depends_on "libcap"
depends_on "libdrm" depends_on "libdrm"
depends_on "libnotify" depends_on "libnotify"
@@ -75,128 +57,6 @@ class @PROJECT_NAME@ < Formula
depends_on "pulseaudio" depends_on "pulseaudio"
depends_on "systemd" depends_on "systemd"
depends_on "wayland" depends_on "wayland"
# resources that do not have brew packages
resource "libayatana-appindicator" do
url "https://github.com/AyatanaIndicators/libayatana-appindicator/archive/refs/tags/0.5.94.tar.gz"
sha256 "884a6bc77994c0b58c961613ca4c4b974dc91aa0f804e70e92f38a542d0d0f90"
end
resource "libdbusmenu" do
url "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz"
sha256 "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a"
patch 'From 729546c51806a1b3ea6cb6efb7a115b1baa811f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Br=C3=BCns?= <stefan.bruens@rwth-aachen.de>
Date: Mon, 18 Nov 2019 19:58:53 +0100
Subject: [PATCH 1/1] Fix HAVE_VALGRIND AM_CONDITIONAL
The AM_CONDITIONAL should also be run with --disable-tests, otherwise
HAVE_VALGRIND is undefined.
---
configure | 4 ++--
configure.ac | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/configure b/configure
index 831a3bb..8913b9b 100644
--- a/configure
+++ b/configure
@@ -14801,6 +14801,8 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
have_valgrind=yes
+fi
+
fi
if test "x$have_valgrind" = "xyes"; then
HAVE_VALGRIND_TRUE=
@@ -14811,8 +14813,6 @@ else
fi
-fi
-
diff --git a/configure.ac b/configure.ac
index ace54d1..cbd38a6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -120,8 +120,8 @@ PKG_CHECK_MODULES(DBUSMENUTESTS, json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
[have_tests=yes]
)
PKG_CHECK_MODULES(DBUSMENUTESTSVALGRIND, valgrind, have_valgrind=yes, have_valgrind=no)
-AM_CONDITIONAL([HAVE_VALGRIND], [test "x$have_valgrind" = "xyes"])
])
+AM_CONDITIONAL([HAVE_VALGRIND], [test "x$have_valgrind" = "xyes"])
AC_SUBST(DBUSMENUTESTS_CFLAGS)
AC_SUBST(DBUSMENUTESTS_LIBS)
--
2.46.2
'
end
resource "ayatana-ido" do
url "https://github.com/AyatanaIndicators/ayatana-ido/archive/refs/tags/0.10.4.tar.gz"
sha256 "bd59abd5f1314e411d0d55ce3643e91cef633271f58126be529de5fb71c5ab38"
patch 'From 8a09e6ad33c58c017c0c8fd756da036fc39428ea Mon Sep 17 00:00:00 2001
From: Alexander Koskovich <akoskovich@pm.me>
Date: Sun, 29 Sep 2024 13:47:54 -0400
Subject: [PATCH 1/1] Make introspection configurable
---
CMakeLists.txt | 1 +
src/CMakeLists.txt | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0e13fcd..f3e9ec0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,6 +12,7 @@ endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
option(ENABLE_TESTS "Enable all tests and checks" OFF)
option(ENABLE_COVERAGE "Enable coverage reports (includes enabling all tests and checks)" OFF)
option(ENABLE_WERROR "Treat all build warnings as errors" OFF)
+option(ENABLE_INTROSPECTION "Enable introspection" ON)
if(ENABLE_COVERAGE)
set(ENABLE_TESTS ON)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5b3638d..aca9481 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -108,6 +108,8 @@ install(TARGETS "ayatana-ido3-0.4" LIBRARY DESTINATION "${CMAKE_INSTALL_FULL_LIB
# AyatanaIdo3-0.4.gir
+if (ENABLE_INTROSPECTION)
+
find_package(GObjectIntrospection REQUIRED QUIET)
if (INTROSPECTION_FOUND)
@@ -183,3 +185,5 @@ if (INTROSPECTION_FOUND)
endif ()
endif ()
+
+endif ()
--
2.46.2
'
end
resource "libayatana-indicator" do
url "https://github.com/AyatanaIndicators/libayatana-indicator/archive/refs/tags/0.9.4.tar.gz"
sha256 "a18d3c682e29afd77db24366f8475b26bda22b0e16ff569a2ec71cd6eb4eac95"
end
end end
def install def install
@@ -206,7 +66,7 @@ index 5b3638d..aca9481 100644
args = %W[ args = %W[
-DBUILD_WERROR=ON -DBUILD_WERROR=ON
-DCMAKE_CXX_STANDARD=20 -DCMAKE_CXX_STANDARD=23
-DCMAKE_INSTALL_PREFIX=#{prefix} -DCMAKE_INSTALL_PREFIX=#{prefix}
-DHOMEBREW_ALLOW_FETCHCONTENT=ON -DHOMEBREW_ALLOW_FETCHCONTENT=ON
-DOPENSSL_ROOT_DIR=#{Formula["openssl"].opt_prefix} -DOPENSSL_ROOT_DIR=#{Formula["openssl"].opt_prefix}
@@ -248,59 +108,6 @@ index 5b3638d..aca9481 100644
args << "-DCUDA_FAIL_ON_MISSING=OFF" if OS.linux? args << "-DCUDA_FAIL_ON_MISSING=OFF" if OS.linux?
args << "-DSUNSHINE_ENABLE_TRAY=OFF" if OS.mac? args << "-DSUNSHINE_ENABLE_TRAY=OFF" if OS.mac?
# Handle system tray on Linux
if OS.linux?
# Build and install libayatana components
# Build libdbusmenu
resource("libdbusmenu").stage do
system "./configure",
"--prefix=#{prefix}",
"--with-gtk=3",
"--disable-dumper",
"--disable-static",
"--disable-tests",
"--disable-gtk-doc",
"--enable-introspection=no",
"--disable-vala"
system "make", "install"
end
# Build ayatana-ido
resource("ayatana-ido").stage do
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
"-DENABLE_INTROSPECTION=OFF",
*std_cmake_args
system "ninja", "-C", "build"
system "ninja", "-C", "build", "install"
end
# Build libayatana-indicator
resource("libayatana-indicator").stage do
ENV.append_path "PKG_CONFIG_PATH", "#{lib}/pkgconfig"
ENV.append "LDFLAGS", "-L#{lib}"
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
*std_cmake_args
system "ninja", "-C", "build"
system "ninja", "-C", "build", "install"
end
# Build libayatana-appindicator
resource("libayatana-appindicator").stage do
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
"-DENABLE_BINDINGS_MONO=OFF",
"-DENABLE_BINDINGS_VALA=OFF",
"-DENABLE_GTKDOC=OFF",
*std_cmake_args
system "ninja", "-C", "build"
system "ninja", "-C", "build", "install"
end
end
system "cmake", "-S", ".", "-B", "build", "-G", "Unix Makefiles", system "cmake", "-S", ".", "-B", "build", "-G", "Unix Makefiles",
*std_cmake_args, *std_cmake_args,
*args *args

View File

@@ -1,61 +1,63 @@
#!/bin/bash #!/bin/bash
if ! [ -x "$(command -v ./go-png2ico)" ]; then if ! [ -x "$(command -v ./go-png2ico)" ]; then
echo "./go-png2ico not found" echo "./go-png2ico not found"
echo "download the executable from https://github.com/J-Siu/go-png2ico" echo "download the executable from https://github.com/J-Siu/go-png2ico"
echo "and drop it in this folder" echo "and drop it in this folder"
exit 1 exit 1
fi fi
if ! [ -x "$(command -v ./oxipng)" ]; then if ! [ -x "$(command -v ./oxipng)" ]; then
echo "./oxipng executable not found" echo "./oxipng executable not found"
echo "download the executable from https://github.com/shssoichiro/oxipng" echo "download the executable from https://github.com/shssoichiro/oxipng"
echo "and drop it in this folder" echo "and drop it in this folder"
exit 1 exit 1
fi fi
if ! [ -x "$(command -v inkscape)" ]; then if ! [ -x "$(command -v inkscape)" ]; then
echo "inkscape executable not found" echo "inkscape executable not found"
exit 1 exit 1
fi fi
icon_base_sizes=(16 64) icon_base_sizes=(16 64)
icon_sizes_keys=() # associative array to prevent duplicates icon_sizes_keys=() # associative array to prevent duplicates
icon_sizes_keys[256]=1 icon_sizes_keys[256]=1
for icon_base_size in ${icon_base_sizes[@]}; do for icon_base_size in "${icon_base_sizes[@]}"; do
# increment in 25% till 400% # increment in 25% till 400%
icon_size_increment=$((icon_base_size / 4)) icon_size_increment=$((icon_base_size / 4))
for ((i = 0; i <= 12; i++)); do for ((i = 0; i <= 12; i++)); do
icon_sizes_keys[$((icon_base_size + i * icon_size_increment))]=1 icon_sizes_keys[icon_base_size + i * icon_size_increment]=1
done done
done done
# convert to normal array # convert to normal array
icon_sizes=${!icon_sizes_keys[@]} icon_sizes=("${!icon_sizes_keys[@]}")
echo "using icon sizes:" echo "using icon sizes:"
echo ${icon_sizes[@]} # shellcheck disable=SC2068 # intentionally word split
echo ${icon_sizes[@]}
src_vectors=("../../src_assets/common/assets/web/public/images/apollo-locked.svg"
"../../src_assets/common/assets/web/public/images/apollo-pausing.svg" src_vectors=("../../src_assets/common/assets/web/public/images/apollo-locked.svg"
"../../src_assets/common/assets/web/public/images/apollo-playing.svg" "../../src_assets/common/assets/web/public/images/apollo-pausing.svg"
"../../apollo.svg") "../../src_assets/common/assets/web/public/images/apollo-playing.svg"
"../../apollo.svg")
echo "using sources vectors:"
echo ${src_vectors[@]} echo "using sources vectors:"
# shellcheck disable=SC2068 # intentionally word split
for src_vector in ${src_vectors[@]}; do echo ${src_vectors[@]}
file_name=`basename "$src_vector" .svg`
png_files=() for src_vector in "${src_vectors[@]}"; do
for icon_size in ${icon_sizes[@]}; do file_name=$(basename "${src_vector}" .svg)
png_file="${file_name}${icon_size}.png" png_files=()
echo "converting ${png_file}" for icon_size in "${icon_sizes[@]}"; do
inkscape -w $icon_size -h $icon_size "$src_vector" --export-filename "${png_file}" && png_file="${file_name}${icon_size}.png"
./oxipng -o max --strip safe --alpha "${png_file}" && echo "converting ${png_file}"
png_files+=("${png_file}") inkscape -w "${icon_size}" -h "${icon_size}" "${src_vector}" --export-filename "${png_file}" &&
done ./oxipng -o max --strip safe --alpha "${png_file}" &&
png_files+=("${png_file}")
echo "packing ${file_name}.ico" done
./go-png2ico "${png_files[@]}" "${file_name}.ico"
done echo "packing ${file_name}.ico"
./go-png2ico "${png_files[@]}" "${file_name}.ico"
done

View File

@@ -96,9 +96,11 @@ function add_arch_deps() {
'base-devel' 'base-devel'
'cmake' 'cmake'
'curl' 'curl'
'doxygen'
"gcc${gcc_version}" "gcc${gcc_version}"
"gcc${gcc_version}-libs" "gcc${gcc_version}-libs"
'git' 'git'
'graphviz'
'libayatana-appindicator' 'libayatana-appindicator'
'libcap' 'libcap'
'libdrm' 'libdrm'
@@ -406,7 +408,7 @@ function run_install() {
for file in "${gcc_alternative_files[@]}"; do for file in "${gcc_alternative_files[@]}"; do
file_path="/etc/alternatives/$file" file_path="/etc/alternatives/$file"
if [ -e "$file_path" ]; then if [ -e "$file_path" ]; then
mv "$file_path" "$file_path.bak" ${sudo_cmd} mv "$file_path" "$file_path.bak"
fi fi
done done
@@ -445,12 +447,14 @@ function run_install() {
echo "Compiling doxygen" echo "Compiling doxygen"
doxygen_url="https://github.com/doxygen/doxygen/releases/download/Release_${_doxygen_min}/doxygen-${doxygen_min}.src.tar.gz" doxygen_url="https://github.com/doxygen/doxygen/releases/download/Release_${_doxygen_min}/doxygen-${doxygen_min}.src.tar.gz"
echo "doxygen url: ${doxygen_url}" echo "doxygen url: ${doxygen_url}"
wget "$doxygen_url" --progress=bar:force:noscroll -q --show-progress -O "${build_dir}/doxygen.tar.gz" pushd "${build_dir}"
tar -xzf "${build_dir}/doxygen.tar.gz" wget "$doxygen_url" --progress=bar:force:noscroll -q --show-progress -O "doxygen.tar.gz"
cd "doxygen-${doxygen_min}" tar -xzf "doxygen.tar.gz"
cmake -DCMAKE_BUILD_TYPE=Release -G="Ninja" -B="build" -S="." cd "doxygen-${doxygen_min}"
ninja -C "build" -j"${num_processors}" cmake -DCMAKE_BUILD_TYPE=Release -G="Ninja" -B="build" -S="."
ninja -C "build" install ninja -C "build" -j"${num_processors}"
${sudo_cmd} ninja -C "build" install
popd
else else
echo "Doxygen version not in range, skipping docs" echo "Doxygen version not in range, skipping docs"
cmake_args+=("-DBUILD_DOCS=OFF") cmake_args+=("-DBUILD_DOCS=OFF")
@@ -462,6 +466,8 @@ function run_install() {
nvm_url="https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh" nvm_url="https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh"
echo "nvm url: ${nvm_url}" echo "nvm url: ${nvm_url}"
wget -qO- ${nvm_url} | bash wget -qO- ${nvm_url} | bash
# shellcheck source=/dev/null # we don't care that shellcheck cannot find nvm.sh
source "$HOME/.nvm/nvm.sh" source "$HOME/.nvm/nvm.sh"
nvm install node nvm install node
nvm use node nvm use node

View File

@@ -34,7 +34,7 @@
#include "platform/windows/utils.h" #include "platform/windows/utils.h"
#endif #endif
#ifndef __APPLE__ #if !defined(__ANDROID__) && !defined(__APPLE__)
// For NVENC legacy constants // For NVENC legacy constants
#include <ffnvcodec/nvEncodeAPI.h> #include <ffnvcodec/nvEncodeAPI.h>
#endif #endif
@@ -511,6 +511,7 @@ namespace config {
}, // display_device }, // display_device
0, // max_bitrate 0, // max_bitrate
0, // minimum_fps_target (0 = framerate)
"1920x1080x60", // fallback_mode "1920x1080x60", // fallback_mode
false, // isolated Display false, // isolated Display
@@ -1085,9 +1086,12 @@ namespace config {
} }
void apply_config(std::unordered_map<std::string, std::string> &&vars) { void apply_config(std::unordered_map<std::string, std::string> &&vars) {
#ifndef __ANDROID__
// TODO: Android can possibly support this
if (!fs::exists(stream.file_apps.c_str())) { if (!fs::exists(stream.file_apps.c_str())) {
fs::copy_file(SUNSHINE_ASSETS_DIR "/apps.json", stream.file_apps); fs::copy_file(SUNSHINE_ASSETS_DIR "/apps.json", stream.file_apps);
} }
#endif
for (auto &[name, val] : vars) { for (auto &[name, val] : vars) {
#ifdef _WIN32 #ifdef _WIN32
@@ -1121,7 +1125,7 @@ namespace config {
bool_f(vars, "nvenc_opengl_vulkan_on_dxgi", video.nv_opengl_vulkan_on_dxgi); bool_f(vars, "nvenc_opengl_vulkan_on_dxgi", video.nv_opengl_vulkan_on_dxgi);
bool_f(vars, "nvenc_latency_over_power", video.nv_sunshine_high_power_mode); bool_f(vars, "nvenc_latency_over_power", video.nv_sunshine_high_power_mode);
#ifndef __APPLE__ #if !defined(__ANDROID__) && !defined(__APPLE__)
video.nv_legacy.preset = video.nv.quality_preset + 11; video.nv_legacy.preset = video.nv.quality_preset + 11;
video.nv_legacy.multipass = video.nv.two_pass == nvenc::nvenc_two_pass::quarter_resolution ? NV_ENC_TWO_PASS_QUARTER_RESOLUTION : video.nv_legacy.multipass = video.nv.two_pass == nvenc::nvenc_two_pass::quarter_resolution ? NV_ENC_TWO_PASS_QUARTER_RESOLUTION :
video.nv.two_pass == nvenc::nvenc_two_pass::full_resolution ? NV_ENC_TWO_PASS_FULL_RESOLUTION : video.nv.two_pass == nvenc::nvenc_two_pass::full_resolution ? NV_ENC_TWO_PASS_FULL_RESOLUTION :
@@ -1198,6 +1202,8 @@ namespace config {
} }
int_f(vars, "max_bitrate", video.max_bitrate); int_f(vars, "max_bitrate", video.max_bitrate);
double_between_f(vars, "minimum_fps_target", video.minimum_fps_target, {0.0, 1000.0});
string_f(vars, "fallback_mode", video.fallback_mode); string_f(vars, "fallback_mode", video.fallback_mode);
bool_f(vars, "isolated_virtual_display_option", video.isolated_virtual_display_option); bool_f(vars, "isolated_virtual_display_option", video.isolated_virtual_display_option);
bool_f(vars, "ignore_encoder_probe_failure", video.ignore_encoder_probe_failure); bool_f(vars, "ignore_encoder_probe_failure", video.ignore_encoder_probe_failure);

View File

@@ -144,6 +144,7 @@ namespace config {
} dd; } dd;
int max_bitrate; // Maximum bitrate, sets ceiling in kbps for bitrate requested from client int max_bitrate; // Maximum bitrate, sets ceiling in kbps for bitrate requested from client
double minimum_fps_target; ///< Lowest framerate that will be used when streaming. Range 0-1000, 0 = half of client's requested framerate.
std::string fallback_mode; std::string fallback_mode;
bool isolated_virtual_display_option; bool isolated_virtual_display_option;

View File

@@ -16,11 +16,17 @@
#include <boost/log/expressions.hpp> #include <boost/log/expressions.hpp>
#include <boost/log/sinks.hpp> #include <boost/log/sinks.hpp>
#include <boost/log/sources/severity_logger.hpp> #include <boost/log/sources/severity_logger.hpp>
#include <display_device/logging.h>
// local includes // local includes
#include "logging.h" #include "logging.h"
// conditional includes
#ifdef __ANDROID__
#include <android/log.h>
#else
#include <display_device/logging.h>
#endif
extern "C" { extern "C" {
#include <libavutil/log.h> #include <libavutil/log.h>
} }
@@ -98,6 +104,48 @@ namespace logging {
os << "["sv << std::put_time(&lt, "%Y-%m-%d %H:%M:%S.") << boost::format("%03u") % ms.count() << "]: "sv os << "["sv << std::put_time(&lt, "%Y-%m-%d %H:%M:%S.") << boost::format("%03u") % ms.count() << "]: "sv
<< log_type << view.attribute_values()[message].extract<std::string>(); << log_type << view.attribute_values()[message].extract<std::string>();
} }
#ifdef __ANDROID__
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;
void android_log(const std::string &message, int severity) {
android_LogPriority android_priority;
switch (severity) {
case 0:
android_priority = ANDROID_LOG_VERBOSE;
break;
case 1:
android_priority = ANDROID_LOG_DEBUG;
break;
case 2:
android_priority = ANDROID_LOG_INFO;
break;
case 3:
android_priority = ANDROID_LOG_WARN;
break;
case 4:
android_priority = ANDROID_LOG_ERROR;
break;
case 5:
android_priority = ANDROID_LOG_FATAL;
break;
default:
android_priority = ANDROID_LOG_UNKNOWN;
break;
}
__android_log_print(android_priority, "Sunshine", "%s", message.c_str());
}
// custom sink backend for android
struct android_sink_backend: public sinks::basic_sink_backend<sinks::concurrent_feeding> {
void consume(const bl::record_view &rec) {
int log_sev = rec[severity].get();
const std::string log_msg = rec[expr::smessage].get();
// log to android
android_log(log_msg, log_sev);
}
};
#endif
[[nodiscard]] std::unique_ptr<deinit_t> init(int min_log_level, const std::string &log_file) { [[nodiscard]] std::unique_ptr<deinit_t> init(int min_log_level, const std::string &log_file) {
if (sink) { if (sink) {
@@ -120,15 +168,18 @@ namespace logging {
} }
} }
#ifndef __ANDROID__
setup_av_logging(min_log_level); setup_av_logging(min_log_level);
setup_libdisplaydevice_logging(min_log_level); setup_libdisplaydevice_logging(min_log_level);
#endif
sink = boost::make_shared<text_sink>(); sink = boost::make_shared<text_sink>();
#ifndef SUNSHINE_TESTS #ifndef SUNSHINE_TESTS
boost::shared_ptr<std::ostream> stream {&std::cout, boost::null_deleter()}; boost::shared_ptr<std::ostream> stream {&std::cout, boost::null_deleter()};
sink->locked_backend()->add_stream(stream); sink->locked_backend()->add_stream(stream);
#endif #endif
sink->locked_backend()->add_stream(boost::make_shared<std::ofstream>(log_file)); sink->locked_backend()->add_stream(boost::make_shared<std::ofstream>(log_file));
sink->set_filter(severity >= min_log_level); sink->set_filter(severity >= min_log_level);
sink->set_formatter(&formatter); sink->set_formatter(&formatter);
@@ -138,9 +189,15 @@ namespace logging {
sink->locked_backend()->auto_flush(true); sink->locked_backend()->auto_flush(true);
bl::core::get()->add_sink(sink); bl::core::get()->add_sink(sink);
#ifdef __ANDROID__
auto android_sink = boost::make_shared<sinks::synchronous_sink<android_sink_backend>>();
bl::core::get()->add_sink(android_sink);
#endif
return std::make_unique<deinit_t>(); return std::make_unique<deinit_t>();
} }
#ifndef __ANDROID__
void setup_av_logging(int min_log_level) { void setup_av_logging(int min_log_level) {
if (min_log_level >= 1) { if (min_log_level >= 1) {
av_log_set_level(AV_LOG_QUIET); av_log_set_level(AV_LOG_QUIET);
@@ -198,6 +255,7 @@ namespace logging {
} }
}); });
} }
#endif
void log_flush() { void log_flush() {
if (sink) { if (sink) {

View File

@@ -1922,10 +1922,12 @@ namespace video {
} }
}); });
// set minimum frame time based on client-requested target framerate // set minimum frame time based on client-requested target framerate// set max frame time based on client-requested target framerate.
auto minimum_frame_time = std::chrono::nanoseconds(1000ms) * 1000 / config.encodingFramerate; double minimum_fps_target = (config::video.minimum_fps_target > 0.0) ? config::video.minimum_fps_target : config.encodingFramerate;
auto max_frametime = std::chrono::nanoseconds(1000ms) * 1000 / minimum_fps_target;
auto encode_frame_threshold = std::chrono::nanoseconds(1000ms) * 1000 / config.encodingFramerate; auto encode_frame_threshold = std::chrono::nanoseconds(1000ms) * 1000 / config.encodingFramerate;
auto frame_variation_threshold = encode_frame_threshold / 4; auto frame_variation_threshold = encode_frame_threshold / 4;
BOOST_LOG(info) << "Minimum FPS target set to ~"sv << (minimum_fps_target / 2) << "fps ("sv << max_frametime.count() * 2 << "ns)"sv;
BOOST_LOG(info) << "Encoding Frame threshold: "sv << encode_frame_threshold; BOOST_LOG(info) << "Encoding Frame threshold: "sv << encode_frame_threshold;
auto shutdown_event = mail->event<bool>(mail::shutdown); auto shutdown_event = mail->event<bool>(mail::shutdown);
@@ -1997,7 +1999,7 @@ namespace video {
// Encode at a minimum FPS to avoid image quality issues with static content // Encode at a minimum FPS to avoid image quality issues with static content
if (!requested_idr_frame || images->peek()) { if (!requested_idr_frame || images->peek()) {
if (auto img = images->pop(minimum_frame_time)) { if (auto img = images->pop(max_frametime)) {
frame_timestamp = img->frame_timestamp; frame_timestamp = img->frame_timestamp;
// If new frame comes in way too fast, just drop // If new frame comes in way too fast, just drop
if (*frame_timestamp < (next_frame_start - frame_variation_threshold)) { if (*frame_timestamp < (next_frame_start - frame_variation_threshold)) {

View File

@@ -208,6 +208,7 @@
"double_refreshrate": "disabled", "double_refreshrate": "disabled",
"dd_wa_hdr_toggle_delay": 0, "dd_wa_hdr_toggle_delay": 0,
"max_bitrate": 0, "max_bitrate": 0,
"minimum_fps_target": 0,
"isolated_virtual_display_option": "disabled", "isolated_virtual_display_option": "disabled",
}, },
}, },

View File

@@ -1,6 +1,7 @@
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import PlatformLayout from '../../../PlatformLayout.vue' import PlatformLayout from '../../../PlatformLayout.vue'
import Checkbox from "../../../Checkbox.vue";
const props = defineProps({ const props = defineProps({
platform: String, platform: String,

View File

@@ -17,6 +17,13 @@ const config = ref(props.config)
<input type="number" class="form-control" id="max_bitrate" placeholder="0" v-model="config.max_bitrate" /> <input type="number" class="form-control" id="max_bitrate" placeholder="0" v-model="config.max_bitrate" />
<div class="form-text">{{ $t("config.max_bitrate_desc") }}</div> <div class="form-text">{{ $t("config.max_bitrate_desc") }}</div>
</div> </div>
<!--minimum_fps_target-->
<div class="mb-3">
<label for="minimum_fps_target" class="form-label">{{ $t("config.minimum_fps_target") }}</label>
<input type="number" min="0" max="1000" class="form-control" id="minimum_fps_target" placeholder="0" v-model="config.minimum_fps_target" />
<div class="form-text">{{ $t("config.minimum_fps_target_desc") }}</div>
</div>
</template> </template>
<style scoped> <style scoped>

View File

@@ -137,129 +137,129 @@
"av1_mode_3": "Sunshine bude inzerovat podporu hlavních 8bitových a 10bitových profilů AV1 (HDR)", "av1_mode_3": "Sunshine bude inzerovat podporu hlavních 8bitových a 10bitových profilů AV1 (HDR)",
"av1_mode_desc": "Umožňuje klientovi požádat o AV1 hlavní 8-bitové nebo 10-bitové video streamy. AV1 je intenzivnější na CPU kódování, takže díky tomu může dojít ke snížení výkonu při používání kódování softwaru.", "av1_mode_desc": "Umožňuje klientovi požádat o AV1 hlavní 8-bitové nebo 10-bitové video streamy. AV1 je intenzivnější na CPU kódování, takže díky tomu může dojít ke snížení výkonu při používání kódování softwaru.",
"back_button_timeout": "Časový limit emulace tlačítka Domů/Návod", "back_button_timeout": "Časový limit emulace tlačítka Domů/Návod",
"back_button_timeout_desc": "Pokud je tlačítko Zpět/Výběr podrženo pro zadaný počet milisekund, je emulováno stisknutí tlačítka Domů/Průvodce. Je-li nastaveno na hodnotu < 0 (výchozí), podržením tlačítka Zpět/Výběr nebude tlačítko Domů/Průvodce emulováno.", "back_button_timeout_desc": "Pokud je tlačítko Zpět/Vybrat podrženo po zadaný počet milisekund, je emulováno stisknutí tlačítka Domů/Průvodce. Pokud je nastavena hodnota < 0 (výchozí), podržením tlačítka Zpět/Vybrat se tlačítko Domů/Průvodce neemuluje.",
"capture": "Vynutit specifickou metodu snímání", "capture": "Vynutit specifickou metodu snímání",
"capture_desc": "V automatickém režimu bude Sunshine používat ten první, který funguje. NvFBC vyžaduje upravené nvidia ovladače.", "capture_desc": "V automatickém režimu Sunshine použije první, který funguje. NvFBC vyžaduje opravené ovladače nvidia.",
"cert": "Osvědčení", "cert": "Certifikát",
"cert_desc": "Certifikát používaný pro párování webových UI a Moonlight klientů. Pro nejlepší kompatibilitu by měl mít veřejný klíč RSA-2048.", "cert_desc": "Certifikát použitý pro párování webového uživatelského rozhraní a klienta Moonlight. Kvůli nejlepší kompatibilitě by měl mít veřejný klíč RSA-2048.",
"channels": "Maximální počet připojených klientů", "channels": "Maximální počet připojených klientů",
"channels_desc_1": "Sluneční svár může umožnit sdílení jediné streamovací relace s více klienty současně.", "channels_desc_1": "Sunshine může umožnit sdílení jedné relace streamování s více klienty současně.",
"channels_desc_2": "Některé hardwarové enkodéry mohou mít omezení, která snižují výkon s více streamy.", "channels_desc_2": "Některé hardwarové enkodéry mohou mít omezení, která snižují výkon s více streamy.",
"coder_cabac": "cabac -- kontextové binární aritmetické kódování vyšší kvalita", "coder_cabac": "cabac -- kontextové binární aritmetické kódování vyšší kvalita",
"coder_cavlc": "cavlc -- kontextové adaptivní kódování variabilní délky - rychlejší dekódování", "coder_cavlc": "cavlc -- kontextové adaptivní kódování variabilní délky - rychlejší dekódování",
"configuration": "Konfigurace", "configuration": "Konfigurace",
"controller": "Enable Gamepad Input", "controller": "Povolení vstupu z gamepadu",
"controller_desc": "Umožňuje hostům ovládat hostitelský systém pomocí gamepad / controller", "controller_desc": "Umožňuje hostům ovládat hostitelský systém pomocí gamepadu/ovladače",
"credentials_file": "Soubor pověření", "credentials_file": "Soubor pověření",
"credentials_file_desc": "Uložit uživatelské jméno/heslo odděleně od souboru se stavem Sunshine.", "credentials_file_desc": "Uživatelské jméno/heslo ukládejte odděleně od souboru stavu Sunshine.",
"dd_config_ensure_active": "Automaticky aktivovat displej", "dd_config_ensure_active": "Automaticky aktivovat displej",
"dd_config_ensure_only_display": "Deaktivovat další displeje a aktivovat pouze zadaný displej", "dd_config_ensure_only_display": "Deaktivovat další displeje a aktivovat pouze zadaný displej",
"dd_config_ensure_primary": "Automaticky aktivovat displej a učinit jej primárním displejem", "dd_config_ensure_primary": "Automaticky aktivovat displej a učinit jej primárním displejem",
"dd_config_label": "Konfigurace zařízení", "dd_config_label": "Konfigurace zařízení",
"dd_config_revert_delay": "Zpoždění nastavení zpětného chodu", "dd_config_revert_delay": "Zpoždění vrácení konfigurace",
"dd_config_revert_delay_desc": "Další zpoždění v milisekundách čeká na obnovení konfigurace při zavření aplikace nebo ukončení poslední relace. Hlavním účelem je zajistit hladký přechod při rychlém přepínání mezi aplikacemi.", "dd_config_revert_delay_desc": "Dodatečná prodleva v milisekundách, která má být vyčkána před vrácením konfigurace, pokud byla aplikace zavřena nebo poslední relace ukončena. Hlavním účelem je zajistit plynulejší přechod při rychlém přepínání mezi aplikacemi.",
"dd_config_revert_on_disconnect": "Konfigurace se vrátí po odpojení", "dd_config_revert_on_disconnect": "Vrácení konfigurace při odpojení",
"dd_config_revert_on_disconnect_desc": "Vrátit konfiguraci po odpojení všech klientů namísto zavření aplikace nebo posledního ukončení relace.", "dd_config_revert_on_disconnect_desc": "Vrácení konfigurace při odpojení všech klientů místo ukončení aplikace nebo poslední relace.",
"dd_config_verify_only": "Ověřte, zda je displej povolen", "dd_config_verify_only": "Ověřte, zda je displej povolen",
"dd_hdr_option": "HDR", "dd_hdr_option": "HDR",
"dd_hdr_option_auto": "Zapnout/vypnout HDR režim podle požadavku klienta (výchozí)", "dd_hdr_option_auto": "Zapnout/vypnout HDR režim podle požadavku klienta (výchozí)",
"dd_hdr_option_disabled": "Neměnit nastavení HDR", "dd_hdr_option_disabled": "Neměnit nastavení HDR",
"dd_mode_remapping": "Režim zobrazení přemapování", "dd_mode_remapping": "Přemapování režimu zobrazení",
"dd_mode_remapping_add": "Přidat položku pro nové mapování", "dd_mode_remapping_add": "Přidat položku pro nové mapování",
"dd_mode_remapping_desc_1": "Určete položky pro nové mapování pro změnu požadovaného rozlišení a/nebo obnovení frekvence na jiné hodnoty.", "dd_mode_remapping_desc_1": "Určete položky pro nové mapování pro změnu požadovaného rozlišení a/nebo obnovení frekvence na jiné hodnoty.",
"dd_mode_remapping_desc_2": "Seznam se iteruje shora dolů a použije se první shoda.", "dd_mode_remapping_desc_2": "Seznam se iteruje shora dolů a použije se první shoda.",
"dd_mode_remapping_desc_3": "Pole \"Požadováno\" mohou být ponechána prázdná, aby odpovídala libovolné požadované hodnotě.", "dd_mode_remapping_desc_3": "Pole \"Požadováno\" mohou být ponechána prázdná, aby odpovídala libovolné požadované hodnotě.",
"dd_mode_remapping_desc_4_final_values_mixed": "Alespoň jedno pole \"Final\" musí být zadáno. Nespecifikované rozlišení nebo obnovovací frekvence se nezmění.", "dd_mode_remapping_desc_4_final_values_mixed": "Musí být zadáno alespoň jedno pole \"Final\". Nezadané rozlišení nebo obnovovací frekvence se nezmění.",
"dd_mode_remapping_desc_4_final_values_non_mixed": "Pole \"Final\" musí být zadáno a nesmí být prázdné.", "dd_mode_remapping_desc_4_final_values_non_mixed": "Pole \"Final\" musí být zadáno a nesmí být prázdné.",
"dd_mode_remapping_desc_5_sops_mixed_only": "Možnost \"Optimalizovat nastavení hry\" musí být povolena v klientovi Měsíční světlo, jinak budou přeskočeny záznamy s libovolnými vybranými rozlišeními polí.", "dd_mode_remapping_desc_5_sops_mixed_only": "V klientovi Moonlight musí být povolena možnost \"Optimalizovat nastavení hry\", jinak budou položky se zadanými poli rozlišení přeskočeny.",
"dd_mode_remapping_desc_5_sops_resolution_only": "Možnost \"Optimalizovat nastavení hry\" musí být povolena v klientovi Měsíční světlo, jinak je mapování přeskočeno.", "dd_mode_remapping_desc_5_sops_resolution_only": "V klientovi Moonlight musí být povolena možnost \"Optimalizovat nastavení hry\", jinak se mapování přeskočí.",
"dd_mode_remapping_final_refresh_rate": "Konečná obnovovací frekvence", "dd_mode_remapping_final_refresh_rate": "Konečná obnovovací frekvence",
"dd_mode_remapping_final_resolution": "Konečné řešení", "dd_mode_remapping_final_resolution": "Konečné rozlišení",
"dd_mode_remapping_requested_fps": "Požadovaná FPS", "dd_mode_remapping_requested_fps": "Požadované FPS",
"dd_mode_remapping_requested_resolution": "Požadované rozlišení", "dd_mode_remapping_requested_resolution": "Požadované rozlišení",
"dd_options_header": "Rozšířené možnosti displeje", "dd_options_header": "Rozšířené možnosti displeje",
"dd_refresh_rate_option": "Obnovovací frekvence", "dd_refresh_rate_option": "Obnovovací frekvence",
"dd_refresh_rate_option_auto": "Použít FPS hodnotu poskytnutou klientem (výchozí)", "dd_refresh_rate_option_auto": "Použít hodnotu FPS zadanou klientem (výchozí)",
"dd_refresh_rate_option_disabled": "Neměnit obnovovací frekvenci", "dd_refresh_rate_option_disabled": "Neměnit obnovovací frekvenci",
"dd_refresh_rate_option_manual": "Použít ručně zadanou obnovovací frekvenci", "dd_refresh_rate_option_manual": "Použít ručně zadanou obnovovací frekvenci",
"dd_refresh_rate_option_manual_desc": "Zadejte obnovovací frekvenci pro použití", "dd_refresh_rate_option_manual_desc": "Zadejte obnovovací frekvenci, která se má použít",
"dd_resolution_option": "Rozlišení", "dd_resolution_option": "Rozlišení",
"dd_resolution_option_auto": "Použít rozlišení poskytované klientem (výchozí)", "dd_resolution_option_auto": "Použít rozlišení poskytované klientem (výchozí)",
"dd_resolution_option_disabled": "Neměnit rozlišení", "dd_resolution_option_disabled": "Neměnit rozlišení",
"dd_resolution_option_manual": "Použít ručně zadané rozlišení", "dd_resolution_option_manual": "Použít ručně zadané rozlišení",
"dd_resolution_option_manual_desc": "Zadejte rozlišení, které má být použito", "dd_resolution_option_manual_desc": "Zadejte rozlišení, které má být použito",
"dd_resolution_option_ogs_desc": "Možnost \"Optimalizovat nastavení hry\" musí být povolena na klientovi Moonlight aby to fungovalo.", "dd_resolution_option_ogs_desc": "Aby tato funkce fungovala, musí být v klientovi Moonlight povolena možnost \"Optimalizovat nastavení hry\".",
"dd_wa_hdr_toggle_delay_desc_1": "Při použití virtuálního displeje (VDD) pro vysílání může nesprávně zobrazit barvu HDR. Sluneční svár se může pokusit tento problém zmírnit tím, že vypne HDR a poté znovu vypne.", "dd_wa_hdr_toggle_delay_desc_1": "Při použití virtuálního zobrazovacího zařízení (VDD) pro streamování může dojít k nesprávnému zobrazení barev HDR. Sunshine se může pokusit tento problém zmírnit vypnutím a opětovným zapnutím HDR.",
"dd_wa_hdr_toggle_delay_desc_2": "Pokud je hodnota nastavena na 0, je práce zakázána (výchozí). Pokud je hodnota mezi 0 a 3000 milisekundami, sunshine vypne HDR, počkejte na stanovený čas a pak znovu zapněte HDR. Doporučená doba zpoždění je ve většině případů přibližně 500 milisekund.", "dd_wa_hdr_toggle_delay_desc_2": "Pokud je hodnota nastavena na 0, je obcházení zakázáno (výchozí nastavení). Pokud je hodnota v rozmezí 0 až 3000 milisekund, Sunshine vypne HDR, počká zadanou dobu a poté HDR opět zapne. Doporučená doba zpoždění je ve většině případů přibližně 500 milisekund.",
"dd_wa_hdr_toggle_delay_desc_3": "NEPOUŽÍVEJTE toto fungování, pokud nemáte problémy s HDR protože přímo ovlivňuje počáteční čas!", "dd_wa_hdr_toggle_delay_desc_3": "NEPOUŽÍVEJTE toto řešení, pokud skutečně nemáte problémy s HDR, protože přímo ovlivňuje čas spuštění streamu!",
"dd_wa_hdr_toggle_delay": "Práce na vysokém kontrastu pro HDR", "dd_wa_hdr_toggle_delay": "Řešení pro HDR s vysokým kontrastem",
"ds4_back_as_touchpad_click": "Mapa zpátky/Vyberte pro klepnutí na Touchpad", "ds4_back_as_touchpad_click": "Namapovat Zpět/Vybrat na klepnutí touchpadu",
"ds4_back_as_touchpad_click_desc": "Při vynucení emulace DS4 mapa zpět/Vyberte na Touchpad kliknutí", "ds4_back_as_touchpad_click_desc": "Při vynucení emulace DS4 namapujte funkci Zpět/Vybrat na klepnutí touchpadu",
"encoder": "Vynutit specifický enkodér", "encoder": "Vynutit specifický enkodér",
"encoder_desc": "Vynutit konkrétní enkodér, jinak Sunshine vybere nejlepší dostupnou možnost. Poznámka: Pokud zadáte hardwarový enkodér v systému Windows, musí odpovídat GPU, kde je displej připojen.", "encoder_desc": "Vynutit konkrétní kodér, jinak Sunshine vybere nejlepší dostupnou možnost. Poznámka: Pokud v systému Windows zadáte hardwarový kodér, musí odpovídat grafickému procesoru, ke kterému je displej připojen.",
"encoder_software": "Programové vybavení", "encoder_software": "Software",
"external_ip": "Externí IP", "external_ip": "Externí IP",
"external_ip_desc": "Pokud není zadána žádná externí IP adresa, Sluneční server automaticky rozpozná externí IP adresu", "external_ip_desc": "Pokud není zadána žádná externí IP adresa, Sunshine automaticky zjistí externí IP adresu",
"fec_percentage": "Procento FEC", "fec_percentage": "Procento FEC",
"fec_percentage_desc": "Procento chyb při opravě paketů na datových paketech v každém video snímku. Vyšší hodnoty mohou opravit větší ztrátu síťových paketů, ale za cenu zvýšení využití šířky pásma.", "fec_percentage_desc": "Procento paketů pro opravu chyb v každém datovém paketu v každém videosnímku. Vyšší hodnoty mohou korigovat větší ztráty síťových paketů, ale za cenu zvýšení využití šířky pásma.",
"ffmpeg_auto": "auto -- nechat rozhodnutí ffmpeg (výchozí)", "ffmpeg_auto": "auto -- nechat ffmpeg rozhodnout (výchozí)",
"file_apps": "Soubor aplikací", "file_apps": "Soubor aplikací",
"file_apps_desc": "Soubor, kde jsou uloženy aktuální aplikace Sunshine.", "file_apps_desc": "Soubor, ve kterém jsou uloženy aktuální aplikace Sunshine.",
"file_state": "Státní soubor", "file_state": "Stavový soubor",
"file_state_desc": "Soubor, ve kterém je uložen aktuální stav sunshine", "file_state_desc": "Soubor, ve kterém je uložen aktuální stav Sunshine",
"gamepad": "Emulovaný typ hry", "gamepad": "Typ emulovaného gamepadu",
"gamepad_auto": "Možnosti automatického výběru", "gamepad_auto": "Možnosti automatického výběru",
"gamepad_desc": "Vyberte typ gamepadu, který chcete emulovat na hostiteli", "gamepad_desc": "Výběr typu gamepadu pro emulaci v hostitelském počítači",
"gamepad_ds4": "DS4 (PS4)", "gamepad_ds4": "DS4 (PS4)",
"gamepad_ds4_manual": "Možnosti výběru DS4", "gamepad_ds4_manual": "Možnosti výběru DS4",
"gamepad_ds5": "DS5 (PS5)", "gamepad_ds5": "DS5 (PS5)",
"gamepad_switch": "Nintendo Pro (Switch)", "gamepad_switch": "Nintendo Pro (Switch)",
"gamepad_manual": "Možnosti manuálního DS4", "gamepad_manual": "Možnosti manuálního ovládání DS4",
"gamepad_x360": "X360 (Xbox 360)", "gamepad_x360": "X360 (Xbox 360)",
"gamepad_xone": "Xone (Xbox Jedna)", "gamepad_xone": "XOne (Xbox One)",
"global_prep_cmd": "Příprava příkazů", "global_prep_cmd": "Příprava příkazů",
"global_prep_cmd_desc": "Konfigurace seznamu příkazů, které mají být provedeny před spuštěním jakékoli aplikace nebo po ní. Pokud některý z určených příkazů neuspěje, proces spuštění aplikace bude přerušen.", "global_prep_cmd_desc": "Konfigurace seznamu příkazů, které se mají spustit před nebo po spuštění libovolné aplikace. Pokud některý ze zadaných přípravných příkazů selže, proces spuštění aplikace se přeruší.",
"hevc_mode": "Podpora HEVC", "hevc_mode": "Podpora HEVC",
"hevc_mode_0": "Sunshine bude propagovat podporu pro HEVC na základě možností enkodéru (doporučeno)", "hevc_mode_0": "Sunshine bude propagovat podporu pro HEVC na základě možností enkodéru (doporučeno)",
"hevc_mode_1": "Sluneční síť nebude propagovat podporu HEVC", "hevc_mode_1": "Sunshine nebude inzerovat podporu HEVC",
"hevc_mode_2": "Sluneční svaz bude propagovat podporu hlavního profilu HEVC", "hevc_mode_2": "Sunshine bude inzerovat podporu hlavního profilu HEVC",
"hevc_mode_3": "Sluneční svaz bude propagovat podporu profilů HEVC Main a Main10 (HDR)", "hevc_mode_3": "Sunshine bude inzerovat podporu profilů HEVC Main a Main10 (HDR)",
"hevc_mode_desc": "Umožňuje klientovi vyžádat si HEVC Main nebo HEVC Main10 video streamy. HEVC je intenzivnější na CPU kódování, takže povolení může snížit výkon při používání kódování softwaru.", "hevc_mode_desc": "Umožňuje klientovi vyžádat videostreamy HEVC Main nebo HEVC Main10. Kódování HEVC je náročnější na procesor, takže zapnutí této funkce může snížit výkon při použití softwarového kódování.",
"high_resolution_scrolling": "Podpora rolování s vysokým rozlišením", "high_resolution_scrolling": "Podpora rolování s vysokým rozlišením",
"high_resolution_scrolling_desc": "Pokud je povoleno, sunshine projde událostmi posunu s vysokým rozlišením od klientů Moonight. To může být užitečné pro vypnutí starších aplikací, které se posouvají příliš rychle při posunu s vysokým rozlišením.", "high_resolution_scrolling_desc": "Je-li tato funkce povolena, bude Sunshine předávat události posouvání ve vysokém rozlišení od klientů Moonlight. To může být užitečné zakázat u starších aplikací, které se při událostech posouvání ve vysokém rozlišení posouvají příliš rychle.",
"install_steam_audio_drivers": "Nainstalujte Steam Audio Drivers", "install_steam_audio_drivers": "Instalace ovladačů zvuku služby Steam",
"install_steam_audio_drivers_desc": "Pokud je Steam nainstalován, tak se automaticky nainstaluje ovladač Steam Streaming Speakers pro podporu 5.1/7.1 prostorového zvuku a ztlumení zvuku.", "install_steam_audio_drivers_desc": "Pokud je nainstalována služba Steam, automaticky se nainstaluje ovladač Steam Streaming Speakers pro podporu prostorového zvuku 5.1/7.1 a ztlumení zvuku hostitele.",
"key_repeat_delay": "Zpoždění opakování klíče", "key_repeat_delay": "Zpoždění opakování kláves",
"key_repeat_delay_desc": "Ovládejte, jak rychle se budou klíče opakovat. Počáteční zpoždění v milisekundách před opakováním klíčů.", "key_repeat_delay_desc": "Ovládání rychlosti opakování kláves. Počáteční prodleva v milisekundách před opakováním kláves.",
"key_repeat_frequency": "Frekvence opakování klíče", "key_repeat_frequency": "Frekvence opakování kláves",
"key_repeat_frequency_desc": "Jak často se klíče opakují každou vteřinu. Tato konfigurovatelná volba podporuje desetinná místa.", "key_repeat_frequency_desc": "Jak často se klávesy opakují každou sekundu. Tato nastavitelná možnost podporuje desetinná čísla.",
"key_rightalt_to_key_win": "Mapovat pravý Alt klíč k klíči Windows", "key_rightalt_to_key_win": "Mapování pravé klávesy Alt na klávesu Windows",
"key_rightalt_to_key_win_desc": "Může být možné, že z Moonlight nemůžete přímo odeslat klíč pro Windows. V těchto případech může být užitečné udělat sunshine si myslet, že klíč pravý Alt je klíč pro Windows", "key_rightalt_to_key_win_desc": "Je možné, že klávesa Windows nelze odeslat přímo z aplikace Moonlight. V takových případech může být užitečné přimět Sunshine, aby si myslel, že pravý Alt je klávesa Windows",
"keyboard": "Povolit vstup klávesnice", "keyboard": "Povolit vstupu z klávesnice",
"keyboard_desc": "Umožňuje hostům ovládat hostitelský systém pomocí klávesnice", "keyboard_desc": "Umožňuje hostům ovládat hostitelský systém pomocí klávesnice",
"lan_encryption_mode": "Režim šifrování LAN", "lan_encryption_mode": "Režim šifrování LAN",
"lan_encryption_mode_1": "Povoleno pro podporované klienty", "lan_encryption_mode_1": "Povoleno pro podporované klienty",
"lan_encryption_mode_2": "Vyžadováno pro všechny klienty", "lan_encryption_mode_2": "Vyžadováno pro všechny klienty",
"lan_encryption_mode_desc": "Určuje, kdy bude šifrování použito při streamování přes místní síť. Šifrování může snížit výkon streamování, zejména u méně výkonných hostitelů a klientů.", "lan_encryption_mode_desc": "Určuje, kdy bude šifrování použito při streamování přes místní síť. Šifrování může snížit výkon streamování, zejména u méně výkonných hostitelů a klientů.",
"locale": "Místní prostředí", "locale": "Místní prostředí",
"locale_desc": "Lokální prostředí používané pro uživatelské rozhraní Sunshine.", "locale_desc": "Místní jazyk používaný pro uživatelské rozhraní Sunshine.",
"log_level": "Úroveň logu", "log_level": "Úroveň logu",
"log_level_0": "Verbose", "log_level_0": "Verbose",
"log_level_1": "Debug", "log_level_1": "Debug",
"log_level_2": "Info", "log_level_2": "Info",
"log_level_3": "Varování", "log_level_3": "Varování",
"log_level_4": "Chyba", "log_level_4": "Chyba",
"log_level_5": "Fatal", "log_level_5": "Fatální",
"log_level_6": "Nic", "log_level_6": "Nic",
"log_level_desc": "Minimální úroveň logu vytištěpro standardizaci", "log_level_desc": "Minimální úroveň logu vypisovado standardního výstupu",
"log_path": "Cesta k logu", "log_path": "Cesta k logu",
"log_path_desc": "Soubor s aktuálními protokoly sunshine jsou uloženy.", "log_path_desc": "Soubor, ve kterém jsou uloženy aktuální logy Sunshine.",
"max_bitrate": "Maximální bitrate", "max_bitrate": "Maximální bitrate",
"max_bitrate_desc": "Maximální bitrate (v Kbps) zakódovaný sunshine streamem. Je-li nastaveno na 0, bude vždy používat bitrate požadovaný Moonlight.", "max_bitrate_desc": "Maximální bitrate (v Kb/s), kterým bude Sunshine kódovat datový tok. Pokud je nastaven na 0, bude vždy použit bitrate požadovaný aplikací Moonlight.",
"min_threads": "Minimální počet CPU vláken", "min_threads": "Minimální počet vláken CPU",
"min_threads_desc": "Zvýšení hodnoty mírně snižuje efektivitu kódování, ale tento kompromis obvykle stojí za to získat více jader CPU pro kódování. Ideální hodnota je nejnižší hodnota, která že spolehlivě kódovat v požadovaném nastavení streamu do vašeho hardwaru.", "min_threads_desc": "Zvýšení této hodnoty mírně snižuje efektivitu kódování, ale tento kompromis se obvykle vyplatí, protože získáte více jader procesoru pro kódování. Ideální hodnota je nejnižší hodnota, která dokáže spolehlivě enkódovat při požadovaném nastavení streamování na vašem hardwaru.",
"misc": "Různé možnosti", "misc": "Různé možnosti",
"motion_as_ds4": "Emulovat DS4 gamepad pokud jsou přítomny snímače pohybu", "motion_as_ds4": "Emulovat gamepad DS4, pokud klientský gamepad hlásí přítomnost pohybových senzorů",
"motion_as_ds4_desc": "Je-li zakázáno, nebudou při výběru typu gamepadu brány v úvahu snímače pohybu.", "motion_as_ds4_desc": "Je-li zakázáno, nebudou při výběru typu gamepadu brány v úvahu snímače pohybu.",
"mouse": "Povolit vstup myši", "mouse": "Povolit vstup myši",
"mouse_desc": "Umožňuje hostům ovládat systém pomocí myši", "mouse_desc": "Umožňuje hostům ovládat systém pomocí myši",
@@ -313,52 +313,52 @@
"port_udp": "UDP", "port_udp": "UDP",
"port_warning": "Vystavení webového uživatelského rozhraní na internet je bezpečnostní riziko! Pokračujte na vlastní nebezpečí!", "port_warning": "Vystavení webového uživatelského rozhraní na internet je bezpečnostní riziko! Pokračujte na vlastní nebezpečí!",
"port_web_ui": "Web UI", "port_web_ui": "Web UI",
"qp": "Parametr kvantizace", "qp": "Kvantizační parametr",
"qp_desc": "Některá zařízení nemusí podporovat Constant Bit Rate. Pro tato zařízení se místo toho používá QP. Vyšší hodnota znamená větší kompresi, ale menší kvalitu.", "qp_desc": "Některá zařízení nemusí podporovat konstantní přenosovou rychlost. U těchto zařízení se místo toho používá QP. Vyšší hodnota znamená větší kompresi, ale nižší kvalitu.",
"qsv_coder": "Kodér QuickSync (H264)", "qsv_coder": "Kodér QuickSync (H264)",
"qsv_preset": "QuickSync Preset", "qsv_preset": "Předvolba QuickSync",
"qsv_preset_fast": "rychlá (nízká kvalita)", "qsv_preset_fast": "rychle (nízká kvalita)",
"qsv_preset_faster": "rychlejší (nižší kvalita)", "qsv_preset_faster": "rychlejší (nižší kvalita)",
"qsv_preset_medium": "střední (výchozí)", "qsv_preset_medium": "střední (výchozí)",
"qsv_preset_slow": "pomalý (dobrá kvalita)", "qsv_preset_slow": "pomalý (dobrá kvalita)",
"qsv_preset_slower": "pomalejší (lepší kvalita)", "qsv_preset_slower": "pomalejší (lepší kvalita)",
"qsv_preset_slowest": "nejpomalejší (nejlepší kvalita)", "qsv_preset_slowest": "nejpomalejší (nejlepší kvalita)",
"qsv_preset_veryfast": "nejrychlejší (nejnižší jakost)", "qsv_preset_veryfast": "nejrychlejší (nejnižší kvalita)",
"qsv_slow_hevc": "Povolit pomalé kódování HEVC", "qsv_slow_hevc": "Povolit pomalé kódování HEVC",
"qsv_slow_hevc_desc": "To může povolit HEVC kódování na starších Intel GPU, za cenu vyšší spotřeby GPU a horšího výkonu.", "qsv_slow_hevc_desc": "To může umožnit kódování HEVC na starších grafických procesorech Intel za cenu vyššího využití grafického procesoru a nižšího výkonu.",
"restart_note": "Sluneční brýle se restartuje a aplikuje změny.", "restart_note": "Sunshine se restartuje a aplikuje změny.",
"stream_audio": "Stream zvuk", "stream_audio": "Streamování zvuku",
"stream_audio_desc": "Zakázání zvuku může být užitečné pro streamování bezhlavých displejů jako druhý monitor.", "stream_audio_desc": "Zda se má zvuk streamovat, nebo ne. Vypnutí této funkce může být užitečné pro streamování bezhlavých displejů jako druhých monitorů.",
"sunshine_name": "Sluneční jméno", "sunshine_name": "Jméno Sunshine",
"sunshine_name_desc": "Jméno zobrazené podle měsíčního světla. Není-li zadáno, použije se hostname počítače", "sunshine_name_desc": "Název zobrazený u Moonlight. Pokud není zadán, použije se název hostitele počítače",
"sw_preset": "SW přednastavení", "sw_preset": "Předvolby SW",
"sw_preset_desc": "Optimalizujte kompromis mezi rychlostí kódování (kódované snímky za sekundu) a efektivitou komprese (kvalita na bit v bitovém toku). Výchozí nastavení je superrychlé.", "sw_preset_desc": "Optimalizace kompromisu mezi rychlostí kódování (zakódované snímky za sekundu) a účinností komprese (kvalita na bit v datovém toku). Výchozí hodnota je superrychlá.",
"sw_preset_fast": "rychlá", "sw_preset_fast": "rychlá",
"sw_preset_faster": "rychleji", "sw_preset_faster": "rychleji",
"sw_preset_medium": "střední", "sw_preset_medium": "střední",
"sw_preset_slow": "pomalu", "sw_preset_slow": "pomalu",
"sw_preset_slower": "pomalejší", "sw_preset_slower": "pomalejší",
"sw_preset_superfast": "superfast (výchozí)", "sw_preset_superfast": "superrychlá (výchozí)",
"sw_preset_ultrafast": "ultrafast", "sw_preset_ultrafast": "ultrarychlá",
"sw_preset_veryfast": "veryfast", "sw_preset_veryfast": "velmirychlá",
"sw_preset_veryslow": "veryslow", "sw_preset_veryslow": "velmipomalá",
"sw_tune": "SW melodie", "sw_tune": "SW ladění",
"sw_tune_animation": "animace -- dobré pro karikatury; používá vyšší deblokovací a více referenčních rámců", "sw_tune_animation": "animace -- vhodné pro kreslené filmy; používá vyšší deblokaci a více referenčních snímků",
"sw_tune_desc": "Vyladění možností, které jsou aplikovány po předvolbě. Výchozí nastavení je nula.", "sw_tune_desc": "Možnosti ladění, které se použijí po předvolbě. Výchozí hodnota je nulová latence.",
"sw_tune_fastdecode": "fastdecode -- umožňuje rychlejší dekódování vypnutím určitých filtrů", "sw_tune_fastdecode": "fastdecode -- umožňuje rychlejší dekódování vypnutím určitých filtrů",
"sw_tune_film": "film -- použí pro vysoce kvalitní filmový obsah; snižuje odblokování", "sw_tune_film": "film -- použití pro vysoce kvalitní filmový obsah; snižuje deblokaci",
"sw_tune_grain": "zrno zachovává strukturu zrn ve starém, zrním materiálu", "sw_tune_grain": "zrno - zachovává strukturu zrna ve starém zrnitém filmovém materiálu",
"sw_tune_stillimage": "stillimage -- dobré pro slideshow-like obsah", "sw_tune_stillimage": "stillimage -- dobré pro prezentační obsah",
"sw_tune_zerolatency": "nulová latence -- dobrá pro rychlé kódování a nízká latence streamování (výchozí)", "sw_tune_zerolatency": "zerolatency -- vhodné pro rychlé kódování a streamování s nízkou latencí (výchozí)",
"touchpad_as_ds4": "Emulovat DS4 gamepad pokud klient nahlásí přítomnost touchpadu", "touchpad_as_ds4": "Emulovat gamepad DS4, pokud klientský gamepad hlásí přítomnost touchpadu",
"touchpad_as_ds4_desc": "Je-li zakázáno, během výběru typu gamepadu nebude brána v úvahu přítomnost touchpadu.", "touchpad_as_ds4_desc": "Pokud je vypnuto, nebude při výběru typu gamepadu zohledněna přítomnost touchpadu.",
"upnp": "UPnP", "upnp": "UPnP",
"upnp_desc": "Automaticky konfigurovat přesměrování portů pro streamování přes Internet", "upnp_desc": "Automatická konfigurace přesměrování portů pro streamování přes Internet",
"vaapi_strict_rc_buffer": "Striktně prosazovat limity bitrate pro H.264/HEVC na AMD GPU.", "vaapi_strict_rc_buffer": "Přísné vynucení limitů datového toku snímků pro H.264/HEVC na grafických procesorech AMD",
"vaapi_strict_rc_buffer_desc": "Povolením této volby se během změn scény vyhnete shození snímků přes síť, ale kvalita videa může být během pohybu snížena.", "vaapi_strict_rc_buffer_desc": "Povolením této možnosti lze zabránit vypadávání snímků po síti při změnách scény, ale kvalita videa může být při pohybu snížena.",
"virtual_sink": "Virtuální šinek", "virtual_sink": "Virtuální zvuk",
"virtual_sink_desc": "Ručně zadejte virtuální audio zařízení, které má být použito. Pokud je zařízení odstaveno, je vybráno automaticky. Důrazně doporučujeme ponechat toto pole prázdné pro automatický výběr zařízení!", "virtual_sink_desc": "Ručně zadejte virtuální zvukové zařízení, které chcete použít. Pokud není nastaveno, je zařízení vybráno automaticky. Důrazně doporučujeme ponechat toto pole prázdné, chcete-li použít automatický výběr zařízení!",
"virtual_sink_placeholder": "Reproduktory pro streamování přes Steam", "virtual_sink_placeholder": "Streamovací reproduktory služby Steam",
"vt_coder": "VideoToolbox Coder", "vt_coder": "VideoToolbox Coder",
"vt_realtime": "Video Toolbox v reálném čase enkódování", "vt_realtime": "Video Toolbox v reálném čase enkódování",
"vt_software": "Softwarové kódování video nástrojů", "vt_software": "Softwarové kódování video nástrojů",
@@ -422,34 +422,34 @@
"troubleshooting": { "troubleshooting": {
"dd_reset": "Obnovit nastavení trvalého zobrazení zařízení", "dd_reset": "Obnovit nastavení trvalého zobrazení zařízení",
"dd_reset_desc": "Pokud se sluneční svaz zasekne o obnovení změněného nastavení zobrazovacího zařízení, můžete obnovit nastavení a pokračovat v obnově stavu displeje ručně.", "dd_reset_desc": "Pokud se sluneční svaz zasekne o obnovení změněného nastavení zobrazovacího zařízení, můžete obnovit nastavení a pokračovat v obnově stavu displeje ručně.",
"dd_reset_error": "Chyba při obnovování trvalosti!", "dd_reset_error": "Chyba při obnovení perzistence!",
"dd_reset_success": "Úspěch resetování trvalosti!", "dd_reset_success": "Úspěch resetování perzistence!",
"force_close": "Vynutit zavření", "force_close": "Vynutit zavření",
"force_close_desc": "Pokud si Měsíc stěžuje na právě spuštěnou aplikaci, vynucené zavření aplikace by mělo problém vyřešit.", "force_close_desc": "Pokud si aplikace Moonlight stěžuje na aktuálně spuštěnou aplikaci, mělo by její násilné zavření problém vyřešit.",
"force_close_error": "Chyba při zavírání aplikace", "force_close_error": "Chyba při zavírání aplikace",
"force_close_success": "Aplikace úspěšně uzavřena!", "force_close_success": "Aplikace úspěšně uzavřena!",
"logs": "Logy", "logs": "Logy",
"logs_desc": "Podívejte se na logy nahrané sunshine", "logs_desc": "Podívejte se na logy nahrané Sunshine",
"logs_find": "Najít...", "logs_find": "Hledat...",
"restart_sunshine": "Restartovat Sunshine", "restart_sunshine": "Restartovat Sunshine",
"restart_sunshine_desc": "Pokud sluneční svit nefunguje správně, můžete jej zkusit restartovat. To ukončí všechny spuštěné relace.", "restart_sunshine_desc": "Pokud Sunshine nefunguje správně, můžete jej zkusit restartovat. Tím se ukončí všechny spuštěné relace.",
"restart_sunshine_success": "Sunshine se restartuje", "restart_sunshine_success": "Sunshine se restartuje",
"troubleshooting": "Řešení problémů", "troubleshooting": "Řešení problémů",
"unpair_all": "Zrušit spárování vše", "unpair_all": "Zrušit párování všech",
"unpair_all_error": "Chyba při nepárování", "unpair_all_error": "Chyba při odpárování",
"unpair_all_success": "Všechna zařízení nejsou spárována.", "unpair_all_success": "Všechna zařízení jsou nespárovaná.",
"unpair_desc": "Odstranit spárovaná zařízení. Jednotlivě nespárovaná zařízení s aktivní relací zůstanou připojena, ale nemohou spustit nebo obnovit relaci.", "unpair_desc": "Odeberte spárovaná zařízení. Jednotlivá nespárovaná zařízení s aktivní relací zůstanou připojena, ale nemohou zahájit nebo obnovit relaci.",
"unpair_single_no_devices": "Neexistují žádná spárovaná zařízení.", "unpair_single_no_devices": "Neexistují žádná spárovaná zařízení.",
"unpair_single_success": "Zařízení však mohou být stále v aktivní relaci. Použijte tlačítko 'Vynutit zavření' pro ukonče všech otevřených relací.", "unpair_single_success": "Zařízení však mohou být stále v aktivní relaci. Pomocí výše uvedeného tlačítka \"Vynutit ukončení\" ukončete všechny otevřené relace.",
"unpair_single_unknown": "Neznámý klient", "unpair_single_unknown": "Neznámý klient",
"unpair_title": "Zrušit párování" "unpair_title": "Zrušit párování"
}, },
"welcome": { "welcome": {
"confirm_password": "Potvrdit heslo", "confirm_password": "Potvrdit heslo",
"create_creds": "Před spuštěním potřebujeme, abyste vytvořili nové uživatelské jméno a heslo pro přístup k webovému uživatelskému rozhraní.", "create_creds": "Před zahájením je třeba vytvořit nové uživatelské jméno a heslo pro přístup k webovému uživatelskému rozhraní.",
"create_creds_alert": "Níže uvedené přihlašovací údaje jsou potřebné pro přístup k webovému rozhraní Sunshine. Uchovávejte je v bezpečí, protože je už nikdy nebudete vidět!", "create_creds_alert": "Pro přístup k webovému uživatelskému rozhraní Sunshine je třeba zadat níže uvedené přihlašovací údaje. Uchovávejte je v bezpečí, protože už je nikdy neuvidíte!",
"greeting": "Vítejte v Sunshine!", "greeting": "Vítejte v Sunshine!",
"login": "Přihlásit se", "login": "Přihlásit se",
"welcome_success": "Tato stránka se brzy obnoví, váš prohlížeč vás požádá o nové přihlašovací údaje." "welcome_success": "Tato stránka se brzy znovu načte a prohlížeč vás požádá o nové přihlašovací údaje"
} }
} }

View File

@@ -341,6 +341,8 @@
"log_path_desc": "The file where the current logs of Apollo are stored.", "log_path_desc": "The file where the current logs of Apollo are stored.",
"max_bitrate": "Maximum Bitrate", "max_bitrate": "Maximum Bitrate",
"max_bitrate_desc": "The maximum bitrate (in Kbps) that Apollo will encode the stream at. If set to 0, it will always use the bitrate requested by Artemis/Moonlight.", "max_bitrate_desc": "The maximum bitrate (in Kbps) that Apollo will encode the stream at. If set to 0, it will always use the bitrate requested by Artemis/Moonlight.",
"minimum_fps_target": "Minimum FPS Target",
"minimum_fps_target_desc": "The lowest effective FPS a stream can reach. A value of 0 is treated as roughly half of the stream's FPS. A setting of 20 is recommended if you stream 24 or 30fps content.",
"min_threads": "Minimum CPU Thread Count", "min_threads": "Minimum CPU Thread Count",
"min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.", "min_threads_desc": "Increasing the value slightly reduces encoding efficiency, but the tradeoff is usually worth it to gain the use of more CPU cores for encoding. The ideal value is the lowest value that can reliably encode at your desired streaming settings on your hardware.",
"misc": "Miscellaneous options", "misc": "Miscellaneous options",

View File

@@ -7,7 +7,7 @@
"cancel": "Скасувати", "cancel": "Скасувати",
"disabled": "Вимкнено", "disabled": "Вимкнено",
"disabled_def": "Вимкнено (за замовчуванням)", "disabled_def": "Вимкнено (за замовчуванням)",
"disabled_def_cbox": "За замовчуванням: відмічено", "disabled_def_cbox": "За замовчуванням: вимкнено",
"dismiss": "Відхилити", "dismiss": "Відхилити",
"do_cmd": "Виконати команду", "do_cmd": "Виконати команду",
"elevated": "Потребуються", "elevated": "Потребуються",

View File

@@ -27,7 +27,8 @@ for dir in ${DIRECTORIES}; do
# remove the directory if it is empty # remove the directory if it is empty
if [[ $empty_dir != "" ]]; then # prevent the loop from running and failing if no directories found if [[ $empty_dir != "" ]]; then # prevent the loop from running and failing if no directories found
for i in "${empty_dir}"; do # don't split words as we already know this will be a single directory # shellcheck disable=SC2066 # don't split words as we already know this will be a single directory
for i in "${empty_dir}"; do
echo "Removing empty directory: ${i}" echo "Removing empty directory: ${i}"
rmdir "${i}" rmdir "${i}"
done done

View File

@@ -1,59 +0,0 @@
@echo off
setlocal enabledelayedexpansion
rem Check if a compatible version of ViGEmBus is already installed (1.17 or later)
rem
rem Note: We use exit code 2 to indicate success because either 0 or 1 may be returned
rem based on the PowerShell version if an exception occurs.
powershell -c Exit $(if ((Get-Item "$env:SystemRoot\System32\drivers\ViGEmBus.sys").VersionInfo.FileVersion -ge [System.Version]"1.17") { 2 } Else { 1 })
if %ERRORLEVEL% EQU 2 (
echo "The installed version is 1.17 or later, no update needed. Exiting."
exit /b 0
)
rem Get temp directory
set temp_dir=%temp%/Apollo
rem Create temp directory if it doesn't exist
if not exist "%temp_dir%" mkdir "%temp_dir%"
rem Get system proxy setting
set proxy=
for /f "tokens=3" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" ^| find /i "ProxyEnable"') do (
set ProxyEnable=%%a
if !ProxyEnable! equ 0x1 (
for /f "tokens=3" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" ^| find /i "ProxyServer"') do (
set proxy=%%a
echo Using system proxy !proxy! to download Virtual Gamepad
set proxy=-x !proxy!
)
) else (
rem Proxy is not enabled.
)
)
rem get browser_download_url from asset 0 of https://api.github.com/repos/nefarius/vigembus/releases/latest
set latest_release_url=https://api.github.com/repos/nefarius/vigembus/releases/latest
rem Use curl to get the api response, and find the browser_download_url
for /F "tokens=* USEBACKQ" %%F in (`curl -s !proxy! -L %latest_release_url% ^| findstr browser_download_url`) do (
set browser_download_url=%%F
)
rem Strip quotes
set browser_download_url=%browser_download_url:"=%
rem Remove the browser_download_url key
set browser_download_url=%browser_download_url:browser_download_url: =%
echo %browser_download_url%
rem Download the exe
curl -s -L !proxy! -o "%temp_dir%\virtual_gamepad.exe" %browser_download_url%
rem Install Virtual Gamepad
%temp_dir%\virtual_gamepad.exe /passive /promptrestart
rem Delete temp directory
rmdir /S /Q "%temp_dir%"

View File

@@ -0,0 +1,20 @@
# Check if a compatible version of ViGEmBus is already installed (1.17 or later)
try {
$vigemBusPath = "$env:SystemRoot\System32\drivers\ViGEmBus.sys"
$fileVersion = (Get-Item $vigemBusPath).VersionInfo.FileVersion
if ($fileVersion -ge [System.Version]"1.17") {
Write-Information "The installed version is 1.17 or later, no update needed. Exiting."
exit 0
}
}
catch {
Write-Information "ViGEmBus driver not found or inaccessible, proceeding with installation."
}
# Install Virtual Gamepad
$scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
$installerPath = Join-Path $scriptPath "vigembus_installer.exe"
Start-Process `
-FilePath $installerPath `
-ArgumentList "/passive", "/promptrestart"

View File

@@ -1,4 +0,0 @@
@echo off
rem Use wmic to get the uninstall Virtual Gamepad
wmic product where name="ViGEm Bus Driver" call uninstall

View File

@@ -0,0 +1,8 @@
# Use Get-CimInstance to find and uninstall Virtual Gamepad
$product = Get-CimInstance -ClassName Win32_Product -Filter "Name='ViGEm Bus Driver'"
if ($product) {
Invoke-CimMethod -InputObject $product -MethodName Uninstall
Write-Information "ViGEm Bus Driver uninstalled successfully"
} else {
Write-Warning "ViGEm Bus Driver not found"
}

View File

@@ -56,7 +56,7 @@ foreach(dep ${SUNSHINE_TARGET_DEPENDENCIES})
add_dependencies(${PROJECT_NAME} ${dep}) # compile these before sunshine add_dependencies(${PROJECT_NAME} ${dep}) # compile these before sunshine
endforeach() endforeach()
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23)
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
${SUNSHINE_EXTERNAL_LIBRARIES} ${SUNSHINE_EXTERNAL_LIBRARIES}
gtest gtest

View File

@@ -5,7 +5,7 @@ project(sunshine_tools)
include_directories(${CMAKE_SOURCE_DIR}) include_directories(${CMAKE_SOURCE_DIR})
add_executable(dxgi-info dxgi.cpp) add_executable(dxgi-info dxgi.cpp)
set_target_properties(dxgi-info PROPERTIES CXX_STANDARD 20) set_target_properties(dxgi-info PROPERTIES CXX_STANDARD 23)
target_link_libraries(dxgi-info target_link_libraries(dxgi-info
${CMAKE_THREAD_LIBS_INIT} ${CMAKE_THREAD_LIBS_INIT}
dxgi dxgi
@@ -13,7 +13,7 @@ target_link_libraries(dxgi-info
target_compile_options(dxgi-info PRIVATE ${SUNSHINE_COMPILE_OPTIONS}) target_compile_options(dxgi-info PRIVATE ${SUNSHINE_COMPILE_OPTIONS})
add_executable(audio-info audio.cpp utils.cpp) add_executable(audio-info audio.cpp utils.cpp)
set_target_properties(audio-info PROPERTIES CXX_STANDARD 20) set_target_properties(audio-info PROPERTIES CXX_STANDARD 23)
target_link_libraries(audio-info target_link_libraries(audio-info
${Boost_LIBRARIES} ${Boost_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT} ${CMAKE_THREAD_LIBS_INIT}
@@ -22,7 +22,7 @@ target_link_libraries(audio-info
target_compile_options(audio-info PRIVATE ${SUNSHINE_COMPILE_OPTIONS}) target_compile_options(audio-info PRIVATE ${SUNSHINE_COMPILE_OPTIONS})
add_executable(sunshinesvc sunshinesvc.cpp) add_executable(sunshinesvc sunshinesvc.cpp)
set_target_properties(sunshinesvc PROPERTIES CXX_STANDARD 20) set_target_properties(sunshinesvc PROPERTIES CXX_STANDARD 23)
target_link_libraries(sunshinesvc target_link_libraries(sunshinesvc
${CMAKE_THREAD_LIBS_INIT} ${CMAKE_THREAD_LIBS_INIT}
wtsapi32 wtsapi32