Compare commits

...

43 Commits

Author SHA1 Message Date
TheElixZammuto
3888ec8da0 Merge branch 'nightly' into feat/new-session-system 2024-04-27 15:09:45 +02:00
Tejas Rao
7fb8c76590 Use C++20. (#2322) 2024-04-26 15:49:15 -04:00
TimmyOVO
9288775351 feat(macos/capture): support for capture display other than main display (#2449) 2024-04-22 14:16:26 -04:00
Cameron Gutman
067efc7912 Bump version to v0.23.1 (#2452) 2024-04-20 20:20:09 -04:00
ReenigneArcher
68c0f53bfc New Crowdin updates (#2392) 2024-04-20 16:38:27 -04:00
Hugo Locurcio
dc22e24744 Autofocus PIN input on Web UI pin page
This makes it faster to input the PIN after clicking on the PIN
notification on the desktop, since you no longer need to click
the PIN input or focus on it by pressing Tab many times.
2024-04-20 14:36:59 -05:00
ReenigneArcher
8eead6597e chore: repo updates (#2416) 2024-04-20 12:49:15 -04:00
ReenigneArcher
6c0b01737f ci(codecov): skip search (#2430) 2024-04-20 11:36:40 -04:00
dependabot[bot]
b4e6873649 build(deps): bump vue from 3.4.5 to 3.4.23 (#2434)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 23:05:44 -04:00
dependabot[bot]
24597178c7 build(deps): bump vue-i18n from 9.11.0 to 9.13.0 (#2442)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 21:41:18 -04:00
dependabot[bot]
05416bb9c2 build(deps): bump LizardByte/homebrew-release-action from 2024.409.24405 to 2024.417.220943 (#2441)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 20:34:41 -04:00
dependabot[bot]
15386f386a build(deps): bump third-party/wayland-protocols from 46f201b to 08d1c72 (#2443)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 19:33:17 -04:00
dependabot[bot]
38fa794009 build(deps): bump third-party/wlr-protocols from 4264185 to 2b8d433 (#2067)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 18:28:01 -04:00
dependabot[bot]
75fce21761 build(deps): bump packaging/linux/flatpak/deps/shared-modules from d022995 to ec91811 (#2428)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 17:26:14 -04:00
dependabot[bot]
abe256144a build(deps): bump actions-js/push from 1.4 to 1.5 (#2440)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 16:03:37 -04:00
dependabot[bot]
ad2483416d build(deps): bump packaging/linux/flatpak/deps/org.flatpak.Builder.BaseApp from 6e295e6 to 5532d43 (#2444)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 15:00:44 -04:00
Conn O'Griofa
87def6db85 fix(windows/amf): Revert RC/HRD defaults; improve documentation & config parsing (#2419) 2024-04-19 08:31:56 -04:00
Rick
9e0182be9c docs(linux): add guide for discord audio (#2447)
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
2024-04-18 23:06:20 -04:00
LizardByte-bot
50a02dbce5 chore: update global workflows (#2446) 2024-04-18 15:35:56 -04:00
ReenigneArcher
69191cafe9 fix: make version update check more robust (#2437) 2024-04-18 15:35:49 -04:00
ReenigneArcher
c896dabb82 ci: skip coverage upload if not in LizardByte org (#2436) 2024-04-17 18:50:23 -04:00
ReenigneArcher
ec8170cb40 ci: fix codeql prebuild steps for unix OSes (#2431) 2024-04-16 23:00:10 -04:00
ReenigneArcher
5db8af8a3f ci: update codeql to handle multiple OSes (#2425) 2024-04-16 17:41:56 -04:00
ReenigneArcher
76d08eb883 ci: fix coverage ignore directories (#2420) 2024-04-14 13:38:01 -04:00
ReenigneArcher
fb4d4f50ec fix(ui): fix quicksync locale strings (#2418) 2024-04-14 09:34:22 -04:00
Gilles Schintgen
358bb30c3c debug: fix codec debugging code 2024-04-13 19:52:22 -05:00
Cameron Gutman
25d8e2b478 Fix discarded std::clamp() result compiler warning 2024-04-13 18:53:00 -05:00
Cameron Gutman
a4d9ee3fa4 Fix crash when receiving abs input events prior to the display touchport 2024-04-13 18:53:00 -05:00
dependabot[bot]
f87bc86b4a build(deps): bump LizardByte/homebrew-release-action from 2024.314.134529 to 2024.409.24405 (#2394)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-12 20:52:00 -04:00
Gilles Schintgen
fcd4c07bd0 Improve frametiming for linux capture (#2333) 2024-04-12 19:36:56 -04:00
hdL6c
5c1bad7155 Musl Linux fixes (#2401) 2024-04-11 22:34:26 -05:00
dependabot[bot]
d14323244e build(deps): bump codecov/codecov-action from 3 to 4 (#2297)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-11 20:49:52 -04:00
ReenigneArcher
6a01e58f61 build(deps): use token for codecov/codecov-action (#2404) 2024-04-10 22:28:23 -04:00
ReenigneArcher
ad66fcb243 build(linux): fix ubuntu 24.04 build (#2402) 2024-04-10 19:59:11 -04:00
ReenigneArcher
ad5b816261 fix(linux): use correct setap command in logs (#2400) 2024-04-10 18:12:03 -04:00
ReenigneArcher
7602fa110c fix(ltray): re-order tray dep search (#2397) 2024-04-09 21:40:31 -04:00
ReenigneArcher
7e26d2fd30 build(tests): ensure tests can be disabled during build (#2386) 2024-04-08 19:17:19 -04:00
ReenigneArcher
116e59292a build(deps): remove libavdevice (#2380) 2024-04-07 22:23:32 -04:00
Elia Zammuto
8ba64ffa32 Made C++ format Happy 2024-03-17 16:33:30 +01:00
Elia Zammuto
968b7963ee Migrated jwt-cpp to stable release, style fixes 2024-03-17 16:33:30 +01:00
Elia Zammuto
61df838356 clang-format 2024-03-17 16:33:30 +01:00
Elia Zammuto
d1845df0ea Logout 2024-03-17 16:33:30 +01:00
Elia Zammuto
9ef63ca829 First Working Draft of JWT Login System 2024-03-17 16:33:30 +01:00
96 changed files with 1682 additions and 455 deletions

View File

@@ -1,4 +1,5 @@
# install dependencies for C++ analysis
set -e
sudo apt-get update -y
sudo apt-get install -y \
@@ -54,3 +55,12 @@ sudo wget \
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" ..
make -j"$(nproc)"
# skip autobuild
echo "skip_autobuild=true" >> "$GITHUB_OUTPUT"

View File

@@ -0,0 +1,34 @@
# install dependencies for C++ analysis
set -e
# update pacman
pacman --noconfirm -Suy
# install dependencies
pacman --noconfirm -S \
base-devel \
diffutils \
gcc \
git \
make \
mingw-w64-x86_64-binutils \
mingw-w64-x86_64-boost \
mingw-w64-x86_64-cmake \
mingw-w64-x86_64-curl \
mingw-w64-x86_64-miniupnpc \
mingw-w64-x86_64-nlohmann-json \
mingw-w64-x86_64-nodejs \
mingw-w64-x86_64-onevpl \
mingw-w64-x86_64-openssl \
mingw-w64-x86_64-opus \
mingw-w64-x86_64-rust \
mingw-w64-x86_64-toolchain
# build
mkdir -p build
cd build || exit 1
cmake -G "MinGW Makefiles" ..
mingw32-make -j"$(nproc)"
# skip autobuild
echo "skip_autobuild=true" >> "$GITHUB_OUTPUT"

View File

@@ -0,0 +1,20 @@
# install dependencies for C++ analysis
set -e
# install dependencies
brew install \
boost \
cmake \
miniupnpc \
node \
opus \
pkg-config
# build
mkdir -p build
cd build || exit 1
cmake -G "Unix Makefiles" ..
make -j"$(sysctl -n hw.logicalcpu)"
# skip autobuild
echo "skip_autobuild=true" >> "$GITHUB_OUTPUT"

View File

@@ -211,6 +211,7 @@ jobs:
then
echo "This is a PUSH event"
branch=${{ github.ref_name }}
build_version=${{ needs.check_changelog.outputs.next_version }}
commit=${{ github.sha }}
clone_url=${{ github.event.repository.clone_url }}
else
@@ -227,6 +228,7 @@ jobs:
cd build
cmake -DGITHUB_CLONE_URL=${clone_url} \
-DBUILD_VERSION=${build_version} \
-DGITHUB_BRANCH=${branch} \
-DGITHUB_COMMIT=${commit} \
-DSUNSHINE_CONFIGURE_FLATPAK_MAN=ON \
@@ -278,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
@@ -321,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 \
@@ -336,6 +341,7 @@ jobs:
libcurl4-openssl-dev \
libdrm-dev \
libevdev-dev \
libfuse2 \
libminiupnpc-dev \
libmfx-dev \
libnotify-dev \
@@ -377,7 +383,7 @@ jobs:
- name: Build Linux
env:
BRANCH: ${{ github.head_ref || github.ref_name }}
BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version_bare }}
BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version }}
COMMIT: ${{ github.event.pull_request.head.sha || github.sha }}
timeout-minutes: 5
run: |
@@ -500,18 +506,24 @@ jobs:
run: |
${{ steps.python.outputs.python-path }} -m pip install gcovr
${{ steps.python.outputs.python-path }} -m gcovr -r .. \
--exclude ../tests/ \
--exclude ../third-party/ \
--exclude '.*tests/.*' \
--exclude '.*tests/.*' \
--xml-pretty \
-o coverage.xml
- name: Upload coverage
# any except canceled or skipped
if: always() && (steps.test_report.outcome == 'success')
uses: codecov/codecov-action@v3
if: >-
always() &&
(steps.test_report.outcome == 'success') &&
startsWith(github.repository, 'LizardByte/')
uses: codecov/codecov-action@v4
with:
disable_search: true
fail_ci_if_error: true
files: ./build/coverage.xml
flags: ${{ runner.os }}
token: ${{ secrets.CODECOV_TOKEN }}
- name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.create_release == 'true' }}
@@ -560,13 +572,16 @@ jobs:
if [ -z "$branch" ]
then
echo "This is a PUSH event"
build_version=${{ needs.check_changelog.outputs.next_version }}
clone_url=${{ github.event.repository.clone_url }}
branch="${{ github.ref_name }}"
commit=${{ github.sha }}
default_branch="${{ github.event.repository.default_branch }}"
else
echo "This is a PR event"
clone_url=${{ github.event.pull_request.head.repo.clone_url }}
branch="${{ github.event.pull_request.head.ref }}"
commit=${{ github.event.pull_request.head.sha }}
default_branch="${{ github.event.pull_request.head.repo.default_branch }}"
fi
echo "Branch: ${branch}"
@@ -575,7 +590,9 @@ jobs:
mkdir build
cd build
cmake \
-DBUILD_VERSION="${build_version}" \
-DGITHUB_BRANCH="${branch}" \
-DGITHUB_COMMIT="${commit}" \
-DGITHUB_CLONE_URL="${clone_url}" \
-DGITHUB_DEFAULT_BRANCH="${default_branch}" \
-DSUNSHINE_CONFIGURE_HOMEBREW=ON \
@@ -613,7 +630,7 @@ jobs:
echo "publish=${PUBLISH}" >> $GITHUB_OUTPUT
- name: Validate and Publish Homebrew Formula
uses: LizardByte/homebrew-release-action@v2024.314.134529
uses: LizardByte/homebrew-release-action@v2024.417.220943
with:
formula_file: ${{ github.workspace }}/homebrew/sunshine.rb
git_email: ${{ secrets.GH_BOT_EMAIL }}
@@ -673,6 +690,8 @@ jobs:
if [ -z "$branch" ]
then
echo "This is a PUSH event"
branch="${{ github.ref_name }}"
build_version=${{ needs.check_changelog.outputs.next_version }}
commit=${{ github.sha }}
clone_url=${{ github.event.repository.clone_url }}
else
@@ -686,6 +705,8 @@ jobs:
mkdir build
cd build
cmake \
-DBUILD_VERSION=${build_version} \
-DGITHUB_BRANCH=${branch} \
-DGITHUB_COMMIT=${commit} \
-DGITHUB_CLONE_URL=${clone_url} \
-DSUNSHINE_CONFIGURE_PORTFILE=ON \
@@ -821,8 +842,8 @@ jobs:
cd ${build_dir}
${{ steps.python.outputs.python-path }} -m pip install gcovr
sudo ${{ steps.python.outputs.python-path }} -m gcovr -r ../${dir} \
--exclude ../${dir}/tests/ \
--exclude ../${dir}/third-party/ \
--exclude '.*${dir}/tests/.*' \
--exclude '.*${dir}/third-party/.*' \
--gcov-object-directory $(pwd) \
--verbose \
--xml-pretty \
@@ -830,11 +851,17 @@ jobs:
- name: Upload coverage
# any except canceled or skipped
if: always() && (steps.test_report.outcome == 'success')
uses: codecov/codecov-action@v3
if: >-
always() &&
(steps.test_report.outcome == 'success') &&
startsWith(github.repository, 'LizardByte/')
uses: codecov/codecov-action@v4
with:
disable_search: true
fail_ci_if_error: false # todo: re-enable this when action is fixed
files: ./build/coverage.xml
flags: ${{ runner.os }}-${{ matrix.os_version }}
token: ${{ secrets.CODECOV_TOKEN }}
- name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.create_release == 'true' && matrix.release }}
@@ -1014,7 +1041,7 @@ jobs:
shell: msys2 {0}
env:
BRANCH: ${{ github.head_ref || github.ref_name }}
BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version_bare }}
BUILD_VERSION: ${{ needs.check_changelog.outputs.next_version }}
COMMIT: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
mkdir build
@@ -1059,18 +1086,24 @@ jobs:
run: |
${{ steps.python-path.outputs.python-path }} -m pip install gcovr
${{ steps.python-path.outputs.python-path }} -m gcovr -r .. \
--exclude ../tests/ \
--exclude ../third-party/ \
--exclude '.*tests/.*' \
--exclude '.*tests/.*' \
--xml-pretty \
-o coverage.xml
- name: Upload coverage
# any except canceled or skipped
if: always() && (steps.test_report.outcome == 'success')
uses: codecov/codecov-action@v3
if: >-
always() &&
(steps.test_report.outcome == 'success') &&
startsWith(github.repository, 'LizardByte/')
uses: codecov/codecov-action@v4
with:
disable_search: true
fail_ci_if_error: true
files: ./build/coverage.xml
flags: ${{ runner.os }}
token: ${{ secrets.CODECOV_TOKEN }}
- name: Package Windows Debug Info
working-directory: build

View File

@@ -26,7 +26,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Autoapproving
uses: hmarr/auto-approve-action@v3
uses: hmarr/auto-approve-action@v4
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
@@ -49,7 +49,7 @@ jobs:
steps:
- name: Automerging
uses: pascalgn/automerge-action@v0.15.6
uses: pascalgn/automerge-action@v0.16.3
env:
BASE_BRANCHES: nightly
GITHUB_TOKEN: ${{ secrets.GH_BOT_TOKEN }}

View File

@@ -16,7 +16,7 @@ on:
- cron: '00 12 * * 0' # every Sunday at 12:00 UTC
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
group: "${{ github.workflow }}-${{ github.ref }}"
cancel-in-progress: true
jobs:
@@ -57,10 +57,25 @@ jobs:
console.log(`Remapping language: ${key} to ${remap_languages[key.toLowerCase()]}`)
key = remap_languages[key.toLowerCase()]
}
if (supported_languages.includes(key.toLowerCase()) &&
!matrix['include'].includes({"language": key.toLowerCase()})) {
if (supported_languages.includes(key.toLowerCase())) {
console.log(`Found supported language: ${key}`)
matrix['include'].push({"language": key.toLowerCase()})
let osList = ['ubuntu-latest'];
if (key.toLowerCase() === 'swift') {
osList = ['macos-latest'];
} else if (key.toLowerCase() === 'cpp') {
osList = ['macos-latest', 'ubuntu-latest', 'windows-latest'];
}
for (let os of osList) {
// set name for matrix
if (osList.length == 1) {
name = key.toLowerCase()
} else {
name = `${key.toLowerCase()}, ${os}`
}
// add to matrix
matrix['include'].push({"language": key.toLowerCase(), "os": os, "name": name})
}
}
}
@@ -84,10 +99,15 @@ jobs:
}
analyze:
name: Analyze
name: Analyze (${{ matrix.name }})
if: ${{ needs.languages.outputs.continue == 'true' }}
defaults:
run:
shell: ${{ matrix.os == 'windows-latest' && 'msys2 {0}' || 'bash' }}
env:
GITHUB_CODEQL_BUILD: true
needs: [languages]
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
permissions:
actions: read
@@ -100,6 +120,7 @@ jobs:
steps:
- name: Maximize build space
if: runner.os == 'Linux'
uses: easimon/maximize-build-space@v8
with:
root-reserve-mb: 20480
@@ -114,6 +135,12 @@ jobs:
with:
submodules: recursive
- name: Setup msys2
if: runner.os == 'Windows'
uses: msys2/setup-msys2@v2
with:
update: true
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
@@ -129,16 +156,20 @@ jobs:
# Pre autobuild
# create a file named .codeql-prebuild-${{ matrix.language }}.sh in the root of your repository
# create a file named .codeql-build-${{ matrix.language }}.sh in the root of your repository
- name: Prebuild
id: prebuild
run: |
# check if .qodeql-prebuild-${{ matrix.language }}.sh exists
if [ -f "./.codeql-prebuild-${{ matrix.language }}.sh" ]; then
echo "Running .codeql-prebuild-${{ matrix.language }}.sh"
./.codeql-prebuild-${{ matrix.language }}.sh
# check if prebuild script exists
filename=".codeql-prebuild-${{ matrix.language }}-${{ runner.os }}.sh"
if [ -f "./${filename}" ]; then
echo "Running prebuild script: ${filename}"
./${filename}
fi
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
- name: Autobuild
if: steps.prebuild.outputs.skip_autobuild != 'true'
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis

View File

@@ -55,7 +55,7 @@ jobs:
- name: Clang format lint
if: ${{ steps.find_files.outputs.found_files }}
uses: DoozyX/clang-format-lint-action@v0.16.2
uses: DoozyX/clang-format-lint-action@v0.17
with:
source: ${{ steps.find_files.outputs.found_files }}
extensions: 'cpp,h,m,mm'

View File

@@ -51,7 +51,7 @@ jobs:
if: >-
(github.event_name == 'push' && github.ref == 'refs/heads/master') ||
(github.event_name == 'workflow_dispatch')
uses: actions-js/push@v1.4
uses: actions-js/push@v1.5
with:
github_token: ${{ secrets.GH_BOT_TOKEN }}
author_email: ${{ secrets.GH_BOT_EMAIL }}

50
.gitignore vendored
View File

@@ -1,13 +1,45 @@
build
cmake-build*
.DS_Store
.vscode
.vs
*.swp
*.kdev4
# Prerequisites
*.d
.cache
.idea
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
# JetBrains IDE
.idea/
# VSCode IDE
.vscode/
# build directories
build/
cmake-*/
# npm
node_modules/

4
.gitmodules vendored
View File

@@ -14,6 +14,10 @@
path = third-party/googletest
url = https://github.com/google/googletest/
branch = v1.14.x
[submodule "third-party/jwt-cpp"]
path = third-party/jwt-cpp
url = https://github.com/Thalhammer/jwt-cpp.git
branch = master
[submodule "third-party/moonlight-common-c"]
path = third-party/moonlight-common-c
url = https://github.com/moonlight-stream/moonlight-common-c.git

View File

@@ -1,5 +1,27 @@
# Changelog
## [0.23.1] - 2024-04-20
**Fixed**
- (Capture/Windows) Disable HRD and CBR encoding options by default for AMD GPUs due to video quality regressions in v0.23.0
- (UI) Fix incorrect strings for QuickSync 'fast' and 'faster' presets
- (UI/Linux) Fix update prompt appearing even when running the latest version
- (Input) Fix crash when absolute input events are received prior to the display viewport being set
- (Input/Linux) Fix missing clamping of rumble intensity to valid range
- (Build/Tests) Fix error when attempting to disable compilation of tests
- (Build/Linux) Fix some compilation errors when using Musl libc
- (Logging) Fix broken debug messages for codec capability flags
- (Logging/Linux) Fix log messages to include the correct setcap command for resolving KMS permission errors
**Added**
- (Capture/Linux) Improve frame time consistency for all capture backends
- (UI) Set focus to the PIN textbox when navigating to the PIN tab
**Dependencies**
- Remove libavdevice dependency
**Misc**
- (Linux) Prefer ayatana-appindicator3 over appindicator3 if both are available
## [0.23.0] - 2024-04-06
Attention, this release contains critical security fixes. Please update as soon as possible.
@@ -799,3 +821,4 @@ settings. In v0.17.0, games now run under your user account without elevated pri
[0.22.1]: https://github.com/LizardByte/Sunshine/releases/tag/v0.22.1
[0.22.2]: https://github.com/LizardByte/Sunshine/releases/tag/v0.22.2
[0.23.0]: https://github.com/LizardByte/Sunshine/releases/tag/v0.23.0
[0.23.1]: https://github.com/LizardByte/Sunshine/releases/tag/v0.23.1

View File

@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.18)
# todo - set this conditionally
# todo - set version to 0.0.0 once confident in automated versioning
project(Sunshine VERSION 0.23.0
project(Sunshine VERSION 0.23.1
DESCRIPTION "Self-hosted game stream host for Moonlight"
HOMEPAGE_URL "https://app.lizardbyte.dev/Sunshine")

View File

@@ -125,6 +125,7 @@ include_directories(
"${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/enet/include"
"${CMAKE_SOURCE_DIR}/third-party/nanors"
"${CMAKE_SOURCE_DIR}/third-party/nanors/deps/obl"
"${CMAKE_SOURCE_DIR}/third-party/jwt-cpp/include"
${FFMPEG_INCLUDE_DIRS}
${PLATFORM_INCLUDE_DIRS}
)

View File

@@ -199,13 +199,13 @@ endif()
# tray icon
if(${SUNSHINE_ENABLE_TRAY})
pkg_check_modules(APPINDICATOR appindicator3-0.1)
pkg_check_modules(APPINDICATOR ayatana-appindicator3-0.1)
if(APPINDICATOR_FOUND)
list(APPEND SUNSHINE_DEFINITIONS TRAY_LEGACY_APPINDICATOR=1)
list(APPEND SUNSHINE_DEFINITIONS TRAY_AYATANA_APPINDICATOR=1)
else()
pkg_check_modules(APPINDICATOR ayatana-appindicator3-0.1)
pkg_check_modules(APPINDICATOR appindicator3-0.1)
if(APPINDICATOR_FOUND)
list(APPEND SUNSHINE_DEFINITIONS TRAY_AYATANA_APPINDICATOR=1)
list(APPEND SUNSHINE_DEFINITIONS TRAY_LEGACY_APPINDICATOR=1)
endif ()
endif()
pkg_check_modules(LIBNOTIFY libnotify)

View File

@@ -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})

View File

@@ -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)

View File

@@ -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})
@@ -56,14 +56,20 @@ endif()
# custom compile flags, must be after adding tests
if (NOT BUILD_TESTS)
set(TEST_DIR "")
else()
set(TEST_DIR "${CMAKE_SOURCE_DIR}/tests")
endif()
# src/upnp
set_source_files_properties("${CMAKE_SOURCE_DIR}/src/upnp.cpp"
DIRECTORY "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/tests"
DIRECTORY "${CMAKE_SOURCE_DIR}" "${TEST_DIR}"
PROPERTIES COMPILE_FLAGS -Wno-pedantic)
# third-party/nanors
set_source_files_properties("${CMAKE_SOURCE_DIR}/third-party/nanors/rs.c"
DIRECTORY "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/tests"
DIRECTORY "${CMAKE_SOURCE_DIR}" "${TEST_DIR}"
PROPERTIES COMPILE_FLAGS "-include deps/obl/autoshim.h -ftree-vectorize")
# third-party/ViGEmClient
@@ -74,7 +80,7 @@ string(APPEND VIGEM_COMPILE_FLAGS "-Wno-class-memaccess ")
string(APPEND VIGEM_COMPILE_FLAGS "-Wno-unused-function ")
string(APPEND VIGEM_COMPILE_FLAGS "-Wno-unused-variable ")
set_source_files_properties("${CMAKE_SOURCE_DIR}/third-party/ViGEmClient/src/ViGEmClient.cpp"
DIRECTORY "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/tests"
DIRECTORY "${CMAKE_SOURCE_DIR}" "${TEST_DIR}"
PROPERTIES
COMPILE_DEFINITIONS "UNICODE=1;ERROR_INVALID_DEVICE_OBJECT_PARAMETER=650"
COMPILE_FLAGS ${VIGEM_COMPILE_FLAGS})

View File

@@ -5,4 +5,4 @@
add_custom_target(web-ui ALL
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
COMMENT "Installing NPM Dependencies and Building the Web UI"
COMMAND bash -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
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

View File

@@ -13,3 +13,7 @@ comment:
layout: "diff, flags, files"
behavior: default
require_changes: false # if true: only post the comment if coverage changes
ignore:
- "tests"
- "third-party"

View File

@@ -33,7 +33,6 @@ apt-get install -y --no-install-recommends \
git \
graphviz \
libayatana-appindicator3-dev \
libavdevice-dev \
libboost-filesystem-dev=1.74.* \
libboost-locale-dev=1.74.* \
libboost-log-dev=1.74.* \

View File

@@ -35,7 +35,6 @@ apt-get install -y --no-install-recommends \
doxygen \
git \
graphviz \
libavdevice-dev \
libayatana-appindicator3-dev \
libboost-filesystem-dev=1.74.* \
libboost-locale-dev=1.74.* \

View File

@@ -36,7 +36,6 @@ apt-get install -y --no-install-recommends \
doxygen \
git \
graphviz \
libavdevice-dev \
libayatana-appindicator3-dev \
libboost-filesystem-dev=1.74.* \
libboost-locale-dev=1.74.* \

View File

@@ -36,7 +36,6 @@ apt-get install -y --no-install-recommends \
doxygen \
git \
graphviz \
libavdevice-dev \
libayatana-appindicator3-dev \
libboost-filesystem-dev=1.74.* \
libboost-locale-dev=1.74.* \

View File

@@ -63,8 +63,8 @@ apt-get install -y --no-install-recommends \
libxfixes-dev \
libxrandr-dev \
libxtst-dev \
python3.11 \
python3.11-venv \
python3.12 \
python3.12-venv \
udev \
wget \
x11-xserver-utils \

View File

@@ -3,6 +3,7 @@ furo==2024.1.29
m2r2==0.3.3.post2
rstcheck[sphinx]==6.2.1
rstfmt==0.0.14
setuptools # required by m2r2, Ubuntu 24.04 doesn't include this
Sphinx==7.2.6
sphinx-copybutton==0.5.2
sphinx_inline_tabs==2023.4.21

View File

@@ -68,6 +68,8 @@ editing the `conf` file in a text editor. Use the examples as reference.
es Spanish
fr French
it Italian
ja Japanese
pt Portuguese
ru Russian
sv Swedish
zh Chinese (Simplified)
@@ -574,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
@@ -603,7 +614,10 @@ keybindings
output_name = 0
.. todo:: macOS
**macOS**
.. code-block:: text
output_name = 3
**Windows**
.. code-block:: text
@@ -1471,73 +1485,20 @@ keybindings
`AMD AMF Encoder <https://localhost:47990/config/#amd-amf-encoder>`__
---------------------------------------------------------------------
`amd_quality <https://localhost:47990/config/#amd_quality>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
The encoder preset to use.
.. note:: This option only applies when using amdvce `encoder`_.
**Choices**
.. table::
:widths: auto
========== ===========
Value Description
========== ===========
speed prefer speed
balanced balanced
quality prefer quality
========== ===========
**Default**
``balanced``
**Example**
.. code-block:: text
amd_quality = balanced
`amd_rc <https://localhost:47990/config/#amd_rc>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
The encoder rate control.
.. note:: This option only applies when using amdvce `encoder`_.
**Choices**
.. table::
:widths: auto
=========== ===========
Value Description
=========== ===========
cqp constant qp mode
cbr constant bitrate
vbr_latency variable bitrate, latency constrained
vbr_peak variable bitrate, peak constrained
=========== ===========
**Default**
``cbr``
**Example**
.. code-block:: text
amd_rc = cbr
`amd_usage <https://localhost:47990/config/#amd_usage>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
The encoder usage profile, used to balance latency with encoding quality.
The encoder usage profile is used to set the base set of encoding
parameters.
.. note:: This option only applies when using amdvce `encoder`_.
.. note:: The other AMF options that follow will override a subset
of the settings applied by your usage profile, but there are
hidden parameters set in usage profiles that cannot be
overridden elsewhere.
**Choices**
.. table::
@@ -1561,6 +1522,103 @@ keybindings
amd_usage = ultralowlatency
`amd_rc <https://localhost:47990/config/#amd_rc>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
The encoder rate control.
.. note:: This option only applies when using amdvce `encoder`_.
.. warning:: The 'vbr_latency' option generally works best, but
some bitrate overshoots may still occur. Enabling HRD allows
all bitrate based rate controls to better constrain peak bitrate,
but may result in encoding artifacts depending on your card.
**Choices**
.. table::
:widths: auto
=========== ===========
Value Description
=========== ===========
cqp constant qp mode
cbr constant bitrate
vbr_latency variable bitrate, latency constrained
vbr_peak variable bitrate, peak constrained
=========== ===========
**Default**
``vbr_latency``
**Example**
.. code-block:: text
amd_rc = vbr_latency
`amd_enforce_hrd <https://localhost:47990/config/#amd_enforce_hrd>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate.
.. note:: This option only applies when using amdvce `encoder`_.
.. warning:: HRD is known to cause encoding artifacts or negatively affect
encoding quality on certain cards.
**Choices**
.. table::
:widths: auto
======== ===========
Value Description
======== ===========
enabled enable HRD
disabled disable HRD
======== ===========
**Default**
``disabled``
**Example**
.. code-block:: text
amd_enforce_hrd = disabled
`amd_quality <https://localhost:47990/config/#amd_quality>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
The quality profile controls the tradeoff between
speed and quality of encoding.
.. note:: This option only applies when using amdvce `encoder`_.
**Choices**
.. table::
:widths: auto
========== ===========
Value Description
========== ===========
speed prefer speed
balanced balanced
quality prefer quality
========== ===========
**Default**
``balanced``
**Example**
.. code-block:: text
amd_quality = balanced
`amd_preanalysis <https://localhost:47990/config/#amd_preanalysis>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -1581,7 +1639,9 @@ keybindings
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
Variance Based Adaptive Quantization (VBAQ) can increase subjective visual quality.
Variance Based Adaptive Quantization (VBAQ) can increase subjective
visual quality by prioritizing allocation of more bits to smooth
areas compared to more textured areas.
.. note:: This option only applies when using amdvce `encoder`_.
@@ -1593,22 +1653,6 @@ keybindings
amd_vbaq = enabled
`amd_enforce_hrd <https://localhost:47990/config/#amd_enforce_hrd>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Description**
Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate.
.. note:: This option only applies when using amdvce `encoder`_.
**Default**
``enabled``
**Example**
.. code-block:: text
amd_enforce_hrd = enabled
`amd_coder <https://localhost:47990/config/#amd_coder>`__
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -0,0 +1,30 @@
How to not stream Discord call audio
====================================
#. Set your normal `Sound Output` volume to 100%
.. image:: ../../../images/discord_calls_01.png
#. Start Sunshine
#. Set `Sound Output` to `sink-sunshine-stereo` (if it isn't automatic)
.. image:: ../../../images/discord_calls_02.png
#. In Discord - `Right Click` - `Deafen` - Select your normal `Output Device`
This is also where you will need to adjust output volume for Discord calls
.. image:: ../../../images/discord_calls_03.png
#. Open `qpwgraph`
.. image:: ../../../images/discord_calls_04.png
#. Connect `sunshine [sunshine-record]` to your normal `Output Device`
* Drag `monitor_FL` to `playback_FL`
* Drag `monitor_FR` to `playback_FR`
.. image:: ../../../images/discord_calls_05.png

View File

@@ -15,7 +15,6 @@ Install Requirements
sudo apt update && sudo apt install \
build-essential \
cmake \
libavdevice-dev \
libayatana-appindicator3-dev \
libboost-filesystem-dev \
libboost-locale-dev \
@@ -98,7 +97,6 @@ Install Requirements
build-essential \
cmake \
libappindicator3-dev \
libavdevice-dev \
libboost-filesystem-dev \
libboost-locale-dev \
libboost-log-dev \
@@ -140,7 +138,6 @@ Install Requirements
gcc-11 \
g++-11 \
libappindicator3-dev \
libavdevice-dev \
libboost-filesystem-dev \
libboost-locale-dev \
libboost-log-dev \

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

View File

@@ -10,7 +10,7 @@
"bootstrap": "5.3.3",
"vite": "4.5.2",
"vite-plugin-ejs": "1.6.4",
"vue": "3.4.5",
"vue-i18n": "9.11.0"
"vue": "3.4.23",
"vue-i18n": "9.13.0"
}
}

View File

@@ -329,6 +329,9 @@ modules:
build-args:
- --share=network
env:
BUILD_VERSION: "@BUILD_VERSION@"
BRANCH: "@GITHUB_BRANCH@"
COMMIT: "@GITHUB_COMMIT@"
npm_config_nodedir: /usr/lib/sdk/node18
NPM_CONFIG_LOGLEVEL: info
config-opts:

View File

@@ -51,6 +51,10 @@ configure.args -DBUILD_WERROR=ON \
-DCMAKE_INSTALL_PREFIX=${prefix} \
-DSUNSHINE_ASSETS_DIR=etc/sunshine/assets
configure.env-append BRANCH=@GITHUB_BRANCH@
configure.env-append BUILD_VERSION=@BUILD_VERSION@
configure.env-append COMMIT=@GITHUB_COMMIT@
startupitem.create yes
startupitem.executable "${prefix}/bin/{$name}"
startupitem.location LaunchDaemons

View File

@@ -19,6 +19,10 @@ class @PROJECT_NAME@ < Formula
depends_on "opus"
def install
ENV["BRANCH"] = "@GITHUB_BRANCH@"
ENV["BUILD_VERSION"] = "@BUILD_VERSION@"
ENV["COMMIT"] = "@GITHUB_COMMIT@"
args = %W[
-DBUILD_WERROR=ON
-DCMAKE_INSTALL_PREFIX=#{prefix}

View File

@@ -32,6 +32,7 @@ target_locales = [
'fr', # French
'it', # Italian
'ja', # Japanese
'pt', # Portuguese
'ru', # Russian
'sv', # Swedish
'zh', # Chinese

View File

@@ -1 +1,2 @@
Babel==2.14.0
clang-format

View File

@@ -9,6 +9,7 @@
#include <iostream>
#include <thread>
#include <unordered_map>
#include <utility>
#include <boost/asio.hpp>
#include <boost/filesystem.hpp>
@@ -124,24 +125,24 @@ namespace config {
};
enum class rc_av1_e : int {
cbr = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR,
cqp = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP,
vbr_latency = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR,
vbr_peak = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR,
cbr = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CBR
vbr_peak = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR
};
enum class rc_hevc_e : int {
cbr = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR,
cqp = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP,
vbr_latency = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR,
vbr_peak = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR,
cbr = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR
vbr_peak = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR
};
enum class rc_h264_e : int {
cbr = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR,
cqp = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP,
vbr_latency = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR,
vbr_peak = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR,
cbr = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR
vbr_peak = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR
};
enum class usage_av1_e : int {
@@ -176,41 +177,41 @@ namespace config {
template <class T>
std::optional<int>
quality_from_view(const std::string_view &quality_type) {
quality_from_view(const std::string_view &quality_type, const std::optional<int>(&original)) {
#define _CONVERT_(x) \
if (quality_type == #x##sv) return (int) T::x
_CONVERT_(balanced);
_CONVERT_(quality);
_CONVERT_(speed);
_CONVERT_(balanced);
#undef _CONVERT_
return std::nullopt;
return original;
}
template <class T>
std::optional<int>
rc_from_view(const std::string_view &rc) {
rc_from_view(const std::string_view &rc, const std::optional<int>(&original)) {
#define _CONVERT_(x) \
if (rc == #x##sv) return (int) T::x
_CONVERT_(cbr);
_CONVERT_(cqp);
_CONVERT_(vbr_latency);
_CONVERT_(vbr_peak);
_CONVERT_(cbr);
#undef _CONVERT_
return std::nullopt;
return original;
}
template <class T>
std::optional<int>
usage_from_view(const std::string_view &usage) {
usage_from_view(const std::string_view &usage, const std::optional<int>(&original)) {
#define _CONVERT_(x) \
if (usage == #x##sv) return (int) T::x
_CONVERT_(transcoding);
_CONVERT_(webcam);
_CONVERT_(lowlatency);
_CONVERT_(lowlatency_high_quality);
_CONVERT_(transcoding);
_CONVERT_(ultralowlatency);
_CONVERT_(webcam);
#undef _CONVERT_
return std::nullopt;
return original;
}
int
@@ -219,7 +220,7 @@ namespace config {
if (coder == "cabac"sv || coder == "ac"sv) return cabac;
if (coder == "cavlc"sv || coder == "vlc"sv) return cavlc;
return -1;
return _auto;
}
} // namespace amd
@@ -350,18 +351,18 @@ namespace config {
}, // qsv
{
(int) amd::quality_h264_e::balanced, // quality (h264)
(int) amd::quality_hevc_e::balanced, // quality (hevc)
(int) amd::quality_av1_e::balanced, // quality (av1)
(int) amd::rc_h264_e::cbr, // rate control (h264)
(int) amd::rc_hevc_e::cbr, // rate control (hevc)
(int) amd::rc_av1_e::cbr, // rate control (av1)
(int) amd::usage_h264_e::ultralowlatency, // usage (h264)
(int) amd::usage_hevc_e::ultralowlatency, // usage (hevc)
(int) amd::usage_av1_e::ultralowlatency, // usage (av1)
(int) amd::rc_h264_e::vbr_latency, // rate control (h264)
(int) amd::rc_hevc_e::vbr_latency, // rate control (hevc)
(int) amd::rc_av1_e::vbr_latency, // rate control (av1)
0, // enforce_hrd
(int) amd::quality_h264_e::balanced, // quality (h264)
(int) amd::quality_hevc_e::balanced, // quality (hevc)
(int) amd::quality_av1_e::balanced, // quality (av1)
0, // preanalysis
1, // vbaq
1, // enforce_hrd
(int) amd::coder_e::_auto, // coder
}, // amd
@@ -982,26 +983,26 @@ namespace config {
std::string quality;
string_f(vars, "amd_quality", quality);
if (!quality.empty()) {
video.amd.amd_quality_h264 = amd::quality_from_view<amd::quality_h264_e>(quality);
video.amd.amd_quality_hevc = amd::quality_from_view<amd::quality_hevc_e>(quality);
video.amd.amd_quality_av1 = amd::quality_from_view<amd::quality_av1_e>(quality);
video.amd.amd_quality_h264 = amd::quality_from_view<amd::quality_h264_e>(quality, video.amd.amd_quality_h264);
video.amd.amd_quality_hevc = amd::quality_from_view<amd::quality_hevc_e>(quality, video.amd.amd_quality_hevc);
video.amd.amd_quality_av1 = amd::quality_from_view<amd::quality_av1_e>(quality, video.amd.amd_quality_av1);
}
std::string rc;
string_f(vars, "amd_rc", rc);
int_f(vars, "amd_coder", video.amd.amd_coder, amd::coder_from_view);
if (!rc.empty()) {
video.amd.amd_rc_h264 = amd::rc_from_view<amd::rc_h264_e>(rc);
video.amd.amd_rc_hevc = amd::rc_from_view<amd::rc_hevc_e>(rc);
video.amd.amd_rc_av1 = amd::rc_from_view<amd::rc_av1_e>(rc);
video.amd.amd_rc_h264 = amd::rc_from_view<amd::rc_h264_e>(rc, video.amd.amd_rc_h264);
video.amd.amd_rc_hevc = amd::rc_from_view<amd::rc_hevc_e>(rc, video.amd.amd_rc_hevc);
video.amd.amd_rc_av1 = amd::rc_from_view<amd::rc_av1_e>(rc, video.amd.amd_rc_av1);
}
std::string usage;
string_f(vars, "amd_usage", usage);
if (!usage.empty()) {
video.amd.amd_usage_h264 = amd::usage_from_view<amd::usage_h264_e>(usage);
video.amd.amd_usage_hevc = amd::usage_from_view<amd::usage_hevc_e>(usage);
video.amd.amd_usage_av1 = amd::usage_from_view<amd::usage_av1_e>(usage);
video.amd.amd_usage_h264 = amd::usage_from_view<amd::usage_h264_e>(usage, video.amd.amd_usage_h264);
video.amd.amd_usage_hevc = amd::usage_from_view<amd::usage_hevc_e>(usage, video.amd.amd_usage_hevc);
video.amd.amd_usage_av1 = amd::usage_from_view<amd::usage_av1_e>(usage, video.amd.amd_usage_av1);
}
bool_f(vars, "amd_preanalysis", (bool &) video.amd.amd_preanalysis);
@@ -1120,6 +1121,7 @@ namespace config {
"fr"sv, // French
"it"sv, // Italian
"ja"sv, // Japanese
"pt"sv, // Portuguese
"ru"sv, // Russian
"sv"sv, // Swedish
"zh"sv, // Chinese

View File

@@ -48,18 +48,18 @@ namespace config {
} qsv;
struct {
std::optional<int> amd_quality_h264;
std::optional<int> amd_quality_hevc;
std::optional<int> amd_quality_av1;
std::optional<int> amd_rc_h264;
std::optional<int> amd_rc_hevc;
std::optional<int> amd_rc_av1;
std::optional<int> amd_usage_h264;
std::optional<int> amd_usage_hevc;
std::optional<int> amd_usage_av1;
std::optional<int> amd_rc_h264;
std::optional<int> amd_rc_hevc;
std::optional<int> amd_rc_av1;
std::optional<int> amd_enforce_hrd;
std::optional<int> amd_quality_h264;
std::optional<int> amd_quality_hevc;
std::optional<int> amd_quality_av1;
std::optional<int> amd_preanalysis;
std::optional<int> amd_vbaq;
std::optional<int> amd_enforce_hrd;
int amd_coder;
} amd;

View File

@@ -25,6 +25,7 @@
#include <Simple-Web-Server/crypto.hpp>
#include <Simple-Web-Server/server_https.hpp>
#include <boost/asio/ssl/context_base.hpp>
#include <jwt-cpp/jwt.h>
#include "config.h"
#include "confighttp.h"
@@ -47,6 +48,8 @@ namespace confighttp {
namespace fs = std::filesystem;
namespace pt = boost::property_tree;
std::string jwt_key;
using https_server_t = SimpleWeb::Server<SimpleWeb::HTTPS>;
using args_t = SimpleWeb::CaseInsensitiveMultimap;
@@ -64,7 +67,7 @@ namespace confighttp {
BOOST_LOG(debug) << "DESTINATION :: "sv << request->path;
for (auto &[name, val] : request->header) {
BOOST_LOG(debug) << name << " -- " << (name == "Authorization" ? "CREDENTIALS REDACTED" : val);
BOOST_LOG(debug) << name << " -- " << (name == "Cookie" || name == "Authorization" ? "SENSIBLE HEADER REDACTED" : val);
}
BOOST_LOG(debug) << " [--] "sv;
@@ -80,9 +83,7 @@ namespace confighttp {
send_unauthorized(resp_https_t response, req_https_t request) {
auto address = net::addr_to_normalized_string(request->remote_endpoint().address());
BOOST_LOG(info) << "Web UI: ["sv << address << "] -- not authorized"sv;
const SimpleWeb::CaseInsensitiveMultimap headers {
{ "WWW-Authenticate", R"(Basic realm="Sunshine Gamestream Host", charset="UTF-8")" }
};
const SimpleWeb::CaseInsensitiveMultimap headers {};
response->write(SimpleWeb::StatusCode::client_error_unauthorized, headers);
}
@@ -114,29 +115,46 @@ namespace confighttp {
}
auto fg = util::fail_guard([&]() {
send_unauthorized(response, request);
BOOST_LOG(info) << request->path;
std::string apiPrefix = "/api";
if (request->path.compare(0, apiPrefix.length(), apiPrefix) == 0) {
send_unauthorized(response, request);
}
// Redirect to login, but only once
else if (request->path.compare("/login") != 0) {
send_redirect(response, request, "/login");
}
});
auto auth = request->header.find("authorization");
auto auth = request->header.find("cookie");
if (auth == request->header.end()) {
return false;
}
auto &rawAuth = auth->second;
auto authData = SimpleWeb::Crypto::Base64::decode(rawAuth.substr("Basic "sv.length()));
std::istringstream iss(rawAuth);
std::string token, cookie_name = "sunshine_session=", cookie_value = "";
int index = authData.find(':');
if (index >= authData.size() - 1) {
return false;
while (std::getline(iss, token, ';')) {
// Left Trim Cookie
token.erase(token.begin(), std::find_if(token.begin(), token.end(), [](unsigned char ch) {
return !std::isspace(ch);
}));
// Compare that the cookie name is sunshine_session
if (token.compare(0, cookie_name.length(), cookie_name) == 0) {
cookie_value = token.substr(cookie_name.length());
break;
}
}
auto username = authData.substr(0, index);
auto password = authData.substr(index + 1);
auto hash = util::hex(crypto::hash(password + config::sunshine.salt)).to_string();
if (cookie_value.length() == 0) return false;
auto decoded = jwt::decode(cookie_value);
auto verifier = jwt::verify()
.with_issuer("sunshine-" + http::unique_id)
.with_claim("sub", jwt::claim(std::string(config::sunshine.username)))
.allow_algorithm(jwt::algorithm::hs256 { jwt_key });
if (!boost::iequals(username, config::sunshine.username) || hash != config::sunshine.password) {
return false;
}
verifier.verify(decoded);
fg.disable();
return true;
@@ -181,6 +199,16 @@ namespace confighttp {
response->write(content, headers);
}
void
getLoginPage(resp_https_t response, req_https_t request) {
print_req(request);
std::string content = file_handler::read_file(WEB_DIR "login.html");
SimpleWeb::CaseInsensitiveMultimap headers;
headers.emplace("Content-Type", "text/html; charset=utf-8");
response->write(content, headers);
}
void
getAppsPage(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
@@ -655,6 +683,8 @@ namespace confighttp {
else {
http::save_user_creds(config::sunshine.credentials_file, newUsername, newPassword);
http::reload_user_creds(config::sunshine.credentials_file);
// Regen the JWT Key to invalidate sessions
jwt_key = crypto::rand_alphabet(64);
outputTree.put("status", true);
}
}
@@ -738,16 +768,112 @@ namespace confighttp {
outputTree.put("status", true);
}
void
login(resp_https_t response, req_https_t request) {
auto address = net::addr_to_normalized_string(request->remote_endpoint().address());
auto ip_type = net::from_address(address);
if (ip_type > http::origin_web_ui_allowed) {
BOOST_LOG(info) << "Web UI: ["sv << address << "] -- denied"sv;
response->write(SimpleWeb::StatusCode::client_error_forbidden);
return;
}
std::stringstream ss;
ss << request->content.rdbuf();
pt::ptree inputTree, outputTree;
auto g = util::fail_guard([&]() {
std::ostringstream data;
pt::write_json(data, outputTree);
response->write(data.str());
});
try {
// TODO: Input Validation
pt::read_json(ss, inputTree);
auto username = inputTree.get<std::string>("username");
auto password = inputTree.get<std::string>("password");
auto hash = util::hex(crypto::hash(password + config::sunshine.salt)).to_string();
if (!boost::iequals(username, config::sunshine.username) || hash != config::sunshine.password) {
outputTree.put("status", "false");
return;
}
outputTree.put("status", "true");
auto token = jwt::create().set_type("JWT").set_issued_at(std::chrono::system_clock::now()).set_expires_at(std::chrono::system_clock::now() + std::chrono::seconds { 3600 }).set_issuer("sunshine-" + http::unique_id).set_payload_claim("sub", jwt::claim(std::string(config::sunshine.username))).sign(jwt::algorithm::hs256 { jwt_key });
std::stringstream cookie_stream;
cookie_stream << "sunshine_session=";
cookie_stream << token;
cookie_stream << "; Secure; HttpOnly; SameSite=Strict; Path=/";
const SimpleWeb::CaseInsensitiveMultimap headers {
{ "Set-Cookie", cookie_stream.str() }
};
std::ostringstream data;
pt::write_json(data, outputTree);
response->write(SimpleWeb::StatusCode::success_ok, data.str(), headers);
g.disable();
return;
}
catch (std::exception &e) {
BOOST_LOG(warning) << "SaveApp: "sv << e.what();
outputTree.put("status", "false");
outputTree.put("error", "Invalid Input JSON");
return;
}
outputTree.put("status", "true");
}
void
logout(resp_https_t response, req_https_t request) {
pt::ptree outputTree;
try {
if (!authenticate(response, request)) return;
print_req(request);
auto g = util::fail_guard([&]() {
std::ostringstream data;
pt::write_json(data, outputTree);
response->write(data.str());
});
const SimpleWeb::CaseInsensitiveMultimap headers {
{ "Set-Cookie", "sunshine_session=redacted; expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; HttpOnly; SameSite=Strict; Path=/" }
};
std::ostringstream data;
outputTree.put("status", true);
pt::write_json(data, outputTree);
response->write(SimpleWeb::StatusCode::success_ok, data.str(), headers);
g.disable();
}
catch (std::exception &e) {
BOOST_LOG(warning) << "SaveApp: "sv << e.what();
outputTree.put("status", "false");
outputTree.put("error", "Invalid Input JSON");
return;
}
}
void
start() {
auto shutdown_event = mail::man->event<bool>(mail::shutdown);
// On each server start, create a randomized jwt_key
jwt_key = crypto::rand_alphabet(64);
auto port_https = net::map_port(PORT_HTTPS);
auto address_family = net::af_from_enum_string(config::sunshine.address_family);
https_server_t server { config::nvhttp.cert, config::nvhttp.pkey };
server.default_resource["GET"] = not_found;
server.resource["^/$"]["GET"] = getIndexPage;
server.resource["^/login/?$"]["GET"] = getLoginPage;
server.resource["^/pin/?$"]["GET"] = getPinPage;
server.resource["^/apps/?$"]["GET"] = getAppsPage;
server.resource["^/clients/?$"]["GET"] = getClientsPage;
@@ -768,6 +894,8 @@ namespace confighttp {
server.resource["^/api/clients/unpair$"]["POST"] = unpairAll;
server.resource["^/api/apps/close$"]["POST"] = closeApp;
server.resource["^/api/covers/upload$"]["POST"] = uploadCover;
server.resource["^/api/logout$"]["POST"] = logout;
server.resource["^/api/login$"]["POST"] = login;
server.resource["^/images/sunshine.ico$"]["GET"] = getFaviconImage;
server.resource["^/images/logo-sunshine-45.png$"]["GET"] = getSunshineLogoImage;
server.resource["^/assets\\/.+$"]["GET"] = getNodeModules;

View File

@@ -7,6 +7,7 @@
#include "process.h"
#include <filesystem>
#include <utility>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>

View File

@@ -469,15 +469,19 @@ namespace input {
* @param input The input context.
* @param val The cartesian coordinate pair to convert.
* @param size The size of the client's surface containing the value.
* @return The host-relative coordinate pair.
* @return The host-relative coordinate pair if a touchport is available.
*/
std::pair<float, float>
std::optional<std::pair<float, float>>
client_to_touchport(std::shared_ptr<input_t> &input, const std::pair<float, float> &val, const std::pair<float, float> &size) {
auto &touch_port_event = input->touch_port_event;
auto &touch_port = input->touch_port;
if (touch_port_event->peek()) {
touch_port = *touch_port_event->pop();
}
if (!touch_port) {
BOOST_LOG(verbose) << "Ignoring early absolute input without a touch port"sv;
return std::nullopt;
}
auto scalarX = touch_port.width / size.first;
auto scalarY = touch_port.height / size.second;
@@ -491,7 +495,7 @@ namespace input {
x = std::clamp(x, offsetX, (size.first * scalarX) - offsetX);
y = std::clamp(y, offsetY, (size.second * scalarY) - offsetY);
return { (x - offsetX) * touch_port.scalar_inv, (y - offsetY) * touch_port.scalar_inv };
return std::pair { (x - offsetX) * touch_port.scalar_inv, (y - offsetY) * touch_port.scalar_inv };
}
/**
@@ -561,6 +565,9 @@ namespace input {
auto height = (float) util::endian::big(packet->height);
auto tpcoords = client_to_touchport(input, { x, y }, { width, height });
if (!tpcoords) {
return;
}
auto &touch_port = input->touch_port;
platf::touch_port_t abs_port {
@@ -568,7 +575,7 @@ namespace input {
touch_port.env_width, touch_port.env_height
};
platf::abs_mouse(platf_input, abs_port, tpcoords.first, tpcoords.second);
platf::abs_mouse(platf_input, abs_port, tpcoords->first, tpcoords->second);
}
void
@@ -918,6 +925,9 @@ namespace input {
{ from_clamped_netfloat(packet->x, 0.0f, 1.0f) * 65535.f,
from_clamped_netfloat(packet->y, 0.0f, 1.0f) * 65535.f },
{ 65535.f, 65535.f });
if (!coords) {
return;
}
auto &touch_port = input->touch_port;
platf::touch_port_t abs_port {
@@ -926,8 +936,8 @@ namespace input {
};
// Renormalize the coordinates
coords.first /= abs_port.width;
coords.second /= abs_port.height;
coords->first /= abs_port.width;
coords->second /= abs_port.height;
// Normalize rotation value to 0-359 degree range
auto rotation = util::endian::little(packet->rotation);
@@ -946,8 +956,8 @@ namespace input {
packet->eventType,
rotation,
util::endian::little(packet->pointerId),
coords.first,
coords.second,
coords->first,
coords->second,
from_clamped_netfloat(packet->pressureOrDistance, 0.0f, 1.0f),
contact_area.first,
contact_area.second,
@@ -972,6 +982,9 @@ namespace input {
{ from_clamped_netfloat(packet->x, 0.0f, 1.0f) * 65535.f,
from_clamped_netfloat(packet->y, 0.0f, 1.0f) * 65535.f },
{ 65535.f, 65535.f });
if (!coords) {
return;
}
auto &touch_port = input->touch_port;
platf::touch_port_t abs_port {
@@ -980,8 +993,8 @@ namespace input {
};
// Renormalize the coordinates
coords.first /= abs_port.width;
coords.second /= abs_port.height;
coords->first /= abs_port.width;
coords->second /= abs_port.height;
// Normalize rotation value to 0-359 degree range
auto rotation = util::endian::little(packet->rotation);
@@ -1002,8 +1015,8 @@ namespace input {
packet->penButtons,
packet->tilt,
rotation,
coords.first,
coords.second,
coords->first,
coords->second,
from_clamped_netfloat(packet->pressureOrDistance, 0.0f, 1.0f),
contact_area.first,
contact_area.second,

View File

@@ -32,6 +32,11 @@ namespace input {
float client_offsetX, client_offsetY;
float scalar_inv;
explicit
operator bool() const {
return width != 0 && height != 0 && env_width != 0 && env_height != 0;
}
};
std::pair<float, float>

View File

@@ -4,6 +4,7 @@
*/
// standard includes
#include <codecvt>
#include <csignal>
#include <fstream>
#include <iostream>

View File

@@ -7,6 +7,7 @@
#include "logging.h"
#include "utility.h"
#include <algorithm>
#include <sstream>
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();

View File

@@ -5,6 +5,7 @@
#pragma once
#include <tuple>
#include <utility>
#include <boost/asio.hpp>

View File

@@ -8,6 +8,7 @@
// standard includes
#include <filesystem>
#include <utility>
// lib includes
#include <Simple-Web-Server/server_http.hpp>

View File

@@ -10,7 +10,9 @@
#include <mutex>
#include <string>
#include "src/config.h"
#include "src/logging.h"
#include "src/stat_trackers.h"
#include "src/thread_safe.h"
#include "src/utility.h"
#include "src/video_colorspace.h"
@@ -19,6 +21,8 @@ extern "C" {
#include <moonlight-common-c/src/Limelight.h>
}
using namespace std::literals;
struct sockaddr;
struct AVFrame;
struct AVBufferRef;
@@ -499,6 +503,22 @@ namespace platf {
int env_width, env_height;
int width, height;
protected:
// collect capture timing data (at loglevel debug)
stat_trackers::min_max_avg_tracker<double> sleep_overshoot_tracker;
void
log_sleep_overshoot(std::chrono::nanoseconds overshoot_ns) {
if (config::sunshine.min_log_level <= 1) {
// Print sleep overshoot stats to debug log every 20 seconds
auto print_info = [&](double min_overshoot, double max_overshoot, double avg_overshoot) {
auto f = stat_trackers::one_digit_after_decimal();
BOOST_LOG(debug) << "Sleep overshoot (min/max/avg): " << f % min_overshoot << "ms/" << f % max_overshoot << "ms/" << f % avg_overshoot << "ms";
};
// std::chrono::nanoseconds overshoot_ns = std::chrono::steady_clock::now() - next_frame;
sleep_overshoot_tracker.collect_and_callback_on_interval(overshoot_ns.count() / 1000000., print_info, 20s);
}
}
};
class mic_t {

View File

@@ -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;
}
@@ -800,16 +800,21 @@ namespace cuda {
handle.reset();
});
sleep_overshoot_tracker.reset();
while (true) {
auto now = std::chrono::steady_clock::now();
if (next_frame > now) {
std::this_thread::sleep_for((next_frame - now) / 3 * 2);
std::this_thread::sleep_for(next_frame - now);
}
while (next_frame > now) {
std::this_thread::sleep_for(1ns);
now = std::chrono::steady_clock::now();
now = std::chrono::steady_clock::now();
std::chrono::nanoseconds overshoot_ns = now - next_frame;
log_sleep_overshoot(overshoot_ns);
next_frame += delay;
if (next_frame < now) { // some major slowdown happened; we couldn't keep up
next_frame = now + delay;
}
next_frame = now + delay;
std::shared_ptr<platf::img_t> img_out;
auto status = snapshot(pull_free_image_cb, img_out, 150ms, *cursor);
@@ -1044,4 +1049,4 @@ namespace platf {
return display_names;
}
} // namespace platf
} // namespace platf

View File

@@ -587,8 +587,8 @@ namespace platf {
weak_strong += data.rumble(tp);
}
std::clamp<std::uint32_t>(weak_strong.first, 0, 0xFFFF);
std::clamp<std::uint32_t>(weak_strong.second, 0, 0xFFFF);
weak_strong.first = std::clamp<std::uint32_t>(weak_strong.first, 0, 0xFFFF);
weak_strong.second = std::clamp<std::uint32_t>(weak_strong.second, 0, 0xFFFF);
old_rumble = weak_strong * gain / 0xFFFF;
return old_rumble;
@@ -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<uint_least32_t>(ch);
}
std::string hex_unicode(ss.str());

View File

@@ -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;
}
@@ -1193,17 +1193,22 @@ namespace platf {
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 next_frame = std::chrono::steady_clock::now();
sleep_overshoot_tracker.reset();
while (true) {
auto now = std::chrono::steady_clock::now();
if (next_frame > now) {
std::this_thread::sleep_for((next_frame - now) / 3 * 2);
std::this_thread::sleep_for(next_frame - now);
}
while (next_frame > now) {
std::this_thread::sleep_for(1ns);
now = std::chrono::steady_clock::now();
now = std::chrono::steady_clock::now();
std::chrono::nanoseconds overshoot_ns = now - next_frame;
log_sleep_overshoot(overshoot_ns);
next_frame += delay;
if (next_frame < now) { // some major slowdown happened; we couldn't keep up
next_frame = now + delay;
}
next_frame = now + delay;
std::shared_ptr<platf::img_t> img_out;
auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor);
@@ -1412,17 +1417,22 @@ namespace platf {
capture(const push_captured_image_cb_t &push_captured_image_cb, const pull_free_image_cb_t &pull_free_image_cb, bool *cursor) {
auto next_frame = std::chrono::steady_clock::now();
sleep_overshoot_tracker.reset();
while (true) {
auto now = std::chrono::steady_clock::now();
if (next_frame > now) {
std::this_thread::sleep_for((next_frame - now) / 3 * 2);
std::this_thread::sleep_for(next_frame - now);
}
while (next_frame > now) {
std::this_thread::sleep_for(1ns);
now = std::chrono::steady_clock::now();
now = std::chrono::steady_clock::now();
std::chrono::nanoseconds overshoot_ns = now - next_frame;
log_sleep_overshoot(overshoot_ns);
next_frame += delay;
if (next_frame < now) { // some major slowdown happened; we couldn't keep up
next_frame = now + delay;
}
next_frame = now + delay;
std::shared_ptr<platf::img_t> img_out;
auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor);
@@ -1631,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;
}
@@ -1675,7 +1685,7 @@ 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 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!"sv;
break;
}

View File

@@ -129,16 +129,22 @@ namespace wl {
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 next_frame = std::chrono::steady_clock::now();
sleep_overshoot_tracker.reset();
while (true) {
auto now = std::chrono::steady_clock::now();
if (next_frame > now) {
std::this_thread::sleep_for((next_frame - now) / 3 * 2);
std::this_thread::sleep_for(next_frame - now);
}
while (next_frame > now) {
now = std::chrono::steady_clock::now();
now = std::chrono::steady_clock::now();
std::chrono::nanoseconds overshoot_ns = now - next_frame;
log_sleep_overshoot(overshoot_ns);
next_frame += delay;
if (next_frame < now) { // some major slowdown happened; we couldn't keep up
next_frame = now + delay;
}
next_frame = now + delay;
std::shared_ptr<platf::img_t> img_out;
auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor);
@@ -259,16 +265,22 @@ namespace wl {
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 next_frame = std::chrono::steady_clock::now();
sleep_overshoot_tracker.reset();
while (true) {
auto now = std::chrono::steady_clock::now();
if (next_frame > now) {
std::this_thread::sleep_for((next_frame - now) / 3 * 2);
std::this_thread::sleep_for(next_frame - now);
}
while (next_frame > now) {
now = std::chrono::steady_clock::now();
now = std::chrono::steady_clock::now();
std::chrono::nanoseconds overshoot_ns = now - next_frame;
log_sleep_overshoot(overshoot_ns);
next_frame += delay;
if (next_frame < now) { // some major slowdown happened; we couldn't keep up
next_frame = now + delay;
}
next_frame = now + delay;
std::shared_ptr<platf::img_t> img_out;
auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor);

View File

@@ -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;
@@ -481,17 +481,22 @@ namespace platf {
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 next_frame = std::chrono::steady_clock::now();
sleep_overshoot_tracker.reset();
while (true) {
auto now = std::chrono::steady_clock::now();
if (next_frame > now) {
std::this_thread::sleep_for((next_frame - now) / 3 * 2);
std::this_thread::sleep_for(next_frame - now);
}
while (next_frame > now) {
std::this_thread::sleep_for(1ns);
now = std::chrono::steady_clock::now();
now = std::chrono::steady_clock::now();
std::chrono::nanoseconds overshoot_ns = now - next_frame;
log_sleep_overshoot(overshoot_ns);
next_frame += delay;
if (next_frame < now) { // some major slowdown happened; we couldn't keep up
next_frame = now + delay;
}
next_frame = now + delay;
std::shared_ptr<platf::img_t> img_out;
auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor);
@@ -622,17 +627,22 @@ namespace platf {
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 next_frame = std::chrono::steady_clock::now();
sleep_overshoot_tracker.reset();
while (true) {
auto now = std::chrono::steady_clock::now();
if (next_frame > now) {
std::this_thread::sleep_for((next_frame - now) / 3 * 2);
std::this_thread::sleep_for(next_frame - now);
}
while (next_frame > now) {
std::this_thread::sleep_for(1ns);
now = std::chrono::steady_clock::now();
now = std::chrono::steady_clock::now();
std::chrono::nanoseconds overshoot_ns = now - next_frame;
log_sleep_overshoot(overshoot_ns);
next_frame += delay;
if (next_frame < now) { // some major slowdown happened; we couldn't keep up
next_frame = now + delay;
}
next_frame = now + delay;
std::shared_ptr<platf::img_t> img_out;
auto status = snapshot(pull_free_image_cb, img_out, 1000ms, *cursor);
@@ -796,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) {
@@ -811,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;
}
}

View File

@@ -5,6 +5,7 @@
#pragma once
#import <AVFoundation/AVFoundation.h>
#import <AppKit/AppKit.h>
struct CaptureSession {
AVCaptureVideoDataOutput *output;
@@ -29,6 +30,7 @@ typedef bool (^FrameCallbackBlock)(CMSampleBufferRef);
@property (nonatomic, assign) NSMapTable<AVCaptureConnection *, dispatch_semaphore_t> *captureSignals;
+ (NSArray<NSDictionary *> *)displayNames;
+ (NSString *)getDisplayName:(CGDirectDisplayID)displayID;
- (id)initWithDisplay:(CGDirectDisplayID)displayID frameRate:(int)frameRate;

View File

@@ -23,13 +23,24 @@
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];

View File

@@ -142,18 +142,23 @@ namespace platf {
auto display = std::make_shared<av_display_t>();
// 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];

View File

@@ -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));

View File

@@ -154,7 +154,7 @@ namespace platf::dxgi {
SetThreadExecutionState(ES_CONTINUOUS);
});
stat_trackers::min_max_avg_tracker<double> sleep_overshoot_tracker;
sleep_overshoot_tracker.reset();
while (true) {
// This will return false if the HDR state changes or for any number of other
@@ -184,16 +184,8 @@ namespace platf::dxgi {
}
else {
high_precision_sleep(sleep_period);
if (config::sunshine.min_log_level <= 1) {
// Print sleep overshoot stats to debug log every 20 seconds
auto print_info = [&](double min_overshoot, double max_overshoot, double avg_overshoot) {
auto f = stat_trackers::one_digit_after_decimal();
BOOST_LOG(debug) << "Sleep overshoot (min/max/avg): " << f % min_overshoot << "ms/" << f % max_overshoot << "ms/" << f % avg_overshoot << "ms";
};
std::chrono::nanoseconds overshoot_ns = std::chrono::steady_clock::now() - sleep_target;
sleep_overshoot_tracker.collect_and_callback_on_interval(overshoot_ns.count() / 1000000., print_info, 20s);
}
std::chrono::nanoseconds overshoot_ns = std::chrono::steady_clock::now() - sleep_target;
log_sleep_overshoot(overshoot_ns);
status = snapshot(pull_free_image_cb, img_out, 0ms, *cursor);

View File

@@ -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<uint16_t>(ds4_buttons(gamepad_state)) | static_cast<uint16_t>(ds4_dpad(gamepad_state));
report.bSpecial = ds4_special_buttons(gamepad_state);
report.bTriggerL = gamepad_state.lt;

View File

@@ -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;
}

View File

@@ -11,6 +11,7 @@ extern "C" {
#include <array>
#include <cctype>
#include <utility>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

View File

@@ -3,6 +3,7 @@
* @brief todo
*/
#pragma once
#include <utility>
#include <boost/asio.hpp>

View File

@@ -95,7 +95,7 @@ namespace video {
from_flag(flag_e flag) {
#define _CONVERT(x) \
case flag_e::x: \
std::string_view(#x)
return std::string_view(#x)
switch (flag) {
_CONVERT(PASSED);
_CONVERT(REF_FRAMES_RESTRICT);

View File

@@ -0,0 +1,61 @@
<template>
<form @submit.prevent="save">
<div class="mb-2">
<label for="usernameInput" class="form-label">Username:</label>
<input type="text" class="form-control" id="usernameInput" autocomplete="username"
v-model="passwordData.username" />
</div>
<div class="mb-2">
<label for="passwordInput" class="form-label">Password:</label>
<input type="password" class="form-control" id="passwordInput" autocomplete="new-password"
v-model="passwordData.password" required />
</div>
<button type="submit" class="btn btn-primary w-100 mb-2" v-bind:disabled="loading">
Login
</button>
<div class="alert alert-danger" v-if="error"><b>Error: </b>{{ error }}</div>
<div class="alert alert-success" v-if="success">
<b>Success! </b>
</div>
</form>
</template>
<script>
export default {
data() {
return {
error: null,
success: false,
loading: false,
passwordData: {
username: "",
password: ""
},
};
},
methods: {
save() {
this.error = null;
this.loading = true;
fetch("/api/login", {
method: "POST",
body: JSON.stringify(this.passwordData),
}).then((r) => {
this.loading = false;
if (r.status == 200) {
r.json().then((rj) => {
if (rj.status.toString() === "true") {
this.success = true;
this.$emit('loggedin');
} else {
this.error = rj.error || "Invalid Username or Password";
}
});
} else {
this.error = "Internal Server Error";
}
});
},
},
}
</script>

View File

@@ -29,13 +29,39 @@
<a class="nav-link" href="/troubleshooting"><i class="fas fa-fw fa-info"></i> {{ $t('navbar.troubleshoot') }}</a>
</li>
</ul>
<ul class="navbar-nav mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#" @click="logout"><i class="fas fa-fw fa-right-from-bracket"></i> Logout</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Modal that is shown when the user gets a 401 error -->
<div class="modal fade" id="loginModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Session Expired</h1>
</div>
<div class="modal-body">
<LoginForm @loggedin="onLogin" />
</div>
</div>
</div>
</div>
</template>
<script>
import {Modal} from 'bootstrap';
import LoginForm from './LoginForm.vue'
export default {
components: {
LoginForm
},
data(){
modal: null
},
created() {
console.log("Header mounted!")
},
@@ -45,6 +71,20 @@ export default {
let discordWidget = document.createElement('script')
discordWidget.setAttribute('src', 'https://app.lizardbyte.dev/js/discord.js')
document.head.appendChild(discordWidget)
window.addEventListener("sunshine:session_expire", () => {
this.modal.toggle();
})
this.modal = new Modal(document.getElementById('loginModal'), {});
},
methods: {
onLogin(){
this.modal.toggle();
},
logout(){
fetch("/api/logout",{method: "POST"}).then(r => {
document.location.href = '/';
})
}
}
}
</script>

View File

@@ -359,6 +359,7 @@
import i18n from './locale.js'
import Navbar from './Navbar.vue'
import {Dropdown} from 'bootstrap'
import fetch from './fetch.js'
const app = createApp({
components: {

View File

@@ -49,6 +49,7 @@
<option value="fr">Français (French)</option>
<option value="it">Italiano (Italian)</option>
<option value="ja">日本語 (Japanese)</option>
<option value="pt">Português (Portuguese)</option>
<option value="ru">Русский (Russian)</option>
<option value="sv">svenska (Swedish)</option>
<option value="zh">简体中文 (Chinese Simplified)</option>
@@ -391,19 +392,24 @@
<pre>tools\dxgi-info.exe</pre>
</div>
</div>
<div class="mb-3" v-if="platform === 'linux'">
<label for="output_name" class="form-label">{{ $t('config.output_name_linux') }}</label>
<div class="mb-3" v-if="platform === 'linux' || platform === 'macos'">
<label for="output_name" class="form-label">{{ $t('config.output_name_unix') }}</label>
<input type="text" class="form-control" id="output_name" placeholder="0" v-model="config.output_name" />
<div class="form-text">
{{ $t('config.output_name_desc_linux') }}<br>
{{ $t('config.output_name_desc_unix') }}<br>
<br>
<pre style="white-space: pre-line;">
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
<pre style="white-space: pre-line;" v-if="platform === 'linux'">
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
</pre>
<pre style="white-space: pre-line;" v-if="platform === 'macos'">
Info: Detecting displays
Info: Detected display: Monitor-0 (id: 3) connected: true
Info: Detected display: Monitor-1 (id: 2) connected: true
</pre>
</div>
</div>
@@ -875,74 +881,113 @@
<!-- AMD AMF Encoder Tab -->
<div id="amd-amf-encoder" v-if="currentTab === 'amd'" class="config-page">
<!-- AMF Quality -->
<div class="mb-3">
<label for="amd_quality" class="form-label">{{ $t('config.amd_quality') }}</label>
<select id="amd_quality" class="form-select" v-model="config.amd_quality">
<option value="speed">{{ $t('config.amd_quality_speed') }}</option>
<option value="balanced">{{ $t('config.amd_quality_balanced') }}</option>
<option value="quality">{{ $t('config.amd_quality_quality') }}</option>
</select>
</div>
<!-- AMF Rate Control -->
<div class="mb-3">
<label for="amd_rc" class="form-label">{{ $t('config.amd_rc') }}</label>
<select id="amd_rc" class="form-select" v-model="config.amd_rc">
<option value="cbr">{{ $t('config.amd_rc_cbr') }}</option>
<option value="cqp">{{ $t('config.amd_rc_cqp') }}</option>
<option value="vbr_latency">{{ $t('config.amd_rc_vbr_latency') }}</option>
<option value="vbr_peak">{{ $t('config.amd_rc_vbr_peak') }}</option>
</select>
</div>
<!-- AMF Usage -->
<div class="mb-3">
<label for="amd_usage" class="form-label">{{ $t('config.amd_usage') }}</label>
<select id="amd_usage" class="form-select" v-model="config.amd_usage">
<option value="transcoding">{{ $t('config.amd_usage_transcoding') }}</option>
<option value="webcam">{{ $t('config.amd_usage_webcam') }}</option>
<option value="lowlatency">{{ $t('config.amd_usage_lowlatency') }}</option>
<option value="lowlatency_high_quality">{{ $t('config.amd_usage_lowlatency_high_quality') }}</option>
<option value="lowlatency">{{ $t('config.amd_usage_lowlatency') }}</option>
<option value="ultralowlatency">{{ $t('config.amd_usage_ultralowlatency') }}</option>
</select>
<div class="form-text">{{ $t('config.amd_usage_desc') }}</div>
</div>
<!-- AMD Preanalysis -->
<div class="mb-3">
<label for="amd_preanalysis" class="form-label">{{ $t('config.amd_preanalysis') }}</label>
<select id="amd_preanalysis" class="form-select" v-model="config.amd_preanalysis">
<option value="disabled">{{ $t('_common.disabled_def') }}</option>
<option value="enabled">{{ $t('_common.enabled') }}</option>
</select>
<!-- AMD Rate Control group options -->
<div class="accordion">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseOne">
{{ $t('config.amd_rc_group') }}
</button>
</h2>
<div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingOne">
<div class="accordion-body">
<!-- AMF Rate Control -->
<div class="mb-3">
<label for="amd_rc" class="form-label">{{ $t('config.amd_rc') }}</label>
<select id="amd_rc" class="form-select" v-model="config.amd_rc">
<option value="cbr">{{ $t('config.amd_rc_cbr') }}</option>
<option value="cqp">{{ $t('config.amd_rc_cqp') }}</option>
<option value="vbr_latency">{{ $t('config.amd_rc_vbr_latency') }}</option>
<option value="vbr_peak">{{ $t('config.amd_rc_vbr_peak') }}</option>
</select>
<div class="form-text">{{ $t('config.amd_rc_desc') }}</div>
</div>
<!-- AMF HRD Enforcement -->
<div class="mb-3">
<label for="amd_enforce_hrd" class="form-label">{{ $t('config.amd_enforce_hrd') }}</label>
<select id="amd_enforce_hrd" class="form-select" v-model="config.amd_enforce_hrd">
<option value="enabled">{{ $t('_common.enabled') }}</option>
<option value="disabled">{{ $t('_common.disabled_def') }}</option>
</select>
<div class="form-text">{{ $t('config.amd_enforce_hrd_desc') }}</div>
</div>
</div>
</div>
</div>
</div>
<!-- AMD VBAQ -->
<div class="mb-3">
<label for="amd_vbaq" class="form-label">{{ $t('config.amd_vbaq') }}</label>
<select id="amd_vbaq" class="form-select" v-model="config.amd_vbaq">
<option value="disabled">{{ $t('_common.disabled') }}</option>
<option value="enabled">{{ $t('_common.enabled_def') }}</option>
</select>
</div>
<!-- AMF Quality group options -->
<div class="accordion">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseTwo">
{{ $t('config.amd_quality_group') }}
</button>
</h2>
<div id="panelsStayOpen-collapseTwo" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingTwo">
<div class="accordion-body">
<!-- AMF Quality -->
<div class="mb-3">
<label for="amd_quality" class="form-label">{{ $t('config.amd_quality') }}</label>
<select id="amd_quality" class="form-select" v-model="config.amd_quality">
<option value="speed">{{ $t('config.amd_quality_speed') }}</option>
<option value="balanced">{{ $t('config.amd_quality_balanced') }}</option>
<option value="quality">{{ $t('config.amd_quality_quality') }}</option>
</select>
<div class="form-text">{{ $t('config.amd_quality_desc') }}</div>
</div>
<!-- AMF HRD Enforcement -->
<div class="mb-3">
<label for="amd_enforce_hrd" class="form-label">{{ $t('config.amd_enforce_hrd') }}</label>
<select id="amd_enforce_hrd" class="form-select" v-model="config.amd_enforce_hrd">
<option value="disabled">{{ $t('_common.disabled') }}</option>
<option value="enabled">{{ $t('_common.enabled_def') }}</option>
</select>
</div>
<!-- AMD Preanalysis -->
<div class="mb-3">
<label for="amd_preanalysis" class="form-label">{{ $t('config.amd_preanalysis') }}</label>
<select id="amd_preanalysis" class="form-select" v-model="config.amd_preanalysis">
<option value="disabled">{{ $t('_common.disabled_def') }}</option>
<option value="enabled">{{ $t('_common.enabled') }}</option>
</select>
<div class="form-text">{{ $t('config.amd_preanalysis_desc') }}</div>
</div>
<!-- AMF Coder (H264) -->
<div class="mb-3">
<label for="amd_coder" class="form-label">{{ $t('config.amd_coder') }}</label>
<select id="amd_coder" class="form-select" v-model="config.amd_coder">
<option value="auto">{{ $t('config.ffmpeg_auto') }}</option>
<option value="cabac">{{ $t('config.coder_cabac') }}</option>
<option value="cavlc">{{ $t('config.coder_cavlc') }}</option>
</select>
<!-- AMD VBAQ -->
<div class="mb-3">
<label for="amd_vbaq" class="form-label">{{ $t('config.amd_vbaq') }}</label>
<select id="amd_vbaq" class="form-select" v-model="config.amd_vbaq">
<option value="disabled">{{ $t('_common.disabled') }}</option>
<option value="enabled">{{ $t('_common.enabled_def') }}</option>
</select>
<div class="form-text">{{ $t('config.amd_vbaq_desc') }}</div>
</div>
<!-- AMF Coder (H264) -->
<div class="mb-3">
<label for="amd_coder" class="form-label">{{ $t('config.amd_coder') }}</label>
<select id="amd_coder" class="form-select" v-model="config.amd_coder">
<option value="auto">{{ $t('config.ffmpeg_auto') }}</option>
<option value="cabac">{{ $t('config.coder_cabac') }}</option>
<option value="cavlc">{{ $t('config.coder_cavlc') }}</option>
</select>
<div class="form-text">{{ $t('config.amd_coder_desc') }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -1027,6 +1072,7 @@
import { createApp } from 'vue'
import i18n from './locale.js'
import Navbar from './Navbar.vue'
import fetch from './fetch.js'
const app = createApp({
components: {
@@ -1156,12 +1202,12 @@
id: "amd",
name: "AMD AMF Encoder",
options: {
"amd_quality": "balanced",
"amd_rc": "cbr",
"amd_usage": "ultralowlatency",
"amd_rc": "vbr_latency",
"amd_enforce_hrd": "disabled",
"amd_quality": "balanced",
"amd_preanalysis": "disabled",
"amd_vbaq": "enabled",
"amd_enforce_hrd": "enabled",
"amd_coder": "auto",
},
},

View File

@@ -0,0 +1,9 @@
export default async (url,config) => {
const response = await fetch(url, config);
console.log(response);
if(response.status == 401){
const event = new Event("sunshine:session_expire");
window.dispatchEvent(event);
}
return response;
};

View File

@@ -76,6 +76,7 @@
import i18n from './locale.js'
import Navbar from './Navbar.vue'
import ResourceCard from './ResourceCard.vue'
import fetch from './fetch.js'
console.log("Hello, Sunshine!")
let app = createApp({
@@ -112,10 +113,16 @@
stableBuildAvailable() {
// If we can't get versions, return false
if (!this.githubVersion || !this.version) return false;
// Get the GitHub version tag
let v = this.githubVersion.name;
let v_github = this.githubVersion.name;
// If the version starts with a v, remove it
if (v.indexOf("v") === 0) v = v.substring(1);
if (v_github.indexOf("v") === 0) v_github = v_github.substring(1);
// Get the current version
let v_this = this.version;
// If the version starts with a v, remove it
if (v_this.indexOf("v") === 0) v_this = v_this.substring(1);
// if nightly or dirty, we do an additional check to make sure it's an actual upgrade.
if (this.buildVersionIsNightly || this.buildVersionIsDirty) {
@@ -124,7 +131,7 @@
}
// return true if the version is different, otherwise false
return v !== this.version;
return v_github !== v_this;
},
nightlyBuildAvailable() {
// Verify nightly data is available and the build version is not stable

View File

@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">
<head>
<%- header %>
</head>
<body id="app">
<main role="main" style="max-width: 1200px; margin: 1em auto">
<div class="d-flex justify-content-center gap-4">
<div class="p-4 card">
<header>
<h1 class="mb-2">
<img src="/images/logo-sunshine-45.png" height="45" alt="" style="vertical-align: bottom;">
Hello, Sunshine!
</h1>
</header>
<Login-Form @loggedin="onLogin"></Login-Form>
</div>
<div>
<Resource-Card />
</div>
</div>
</main>
</body>
<script type="module">
import { createApp } from "vue"
import ResourceCard from './ResourceCard.vue'
import LoginForm from './LoginForm.vue'
let app = createApp({
components: {
'ResourceCard': ResourceCard,
'LoginForm': LoginForm
},
methods: {
onLogin() {
document.location.href = '/';
}
}
});
console.log("App", app);
app.mount("#app");
</script>

View File

@@ -69,6 +69,7 @@
import { createApp } from 'vue'
import i18n from './locale.js'
import Navbar from './Navbar.vue'
import fetch from './fetch.js'
const app = createApp({
components: {

View File

@@ -11,7 +11,7 @@
<h1 class="my-4">{{ $t('pin.pin_pairing') }}</h1>
<form action="" class="form d-flex flex-column align-items-center" id="form">
<div class="card flex-column d-flex p-4 mb-4">
<input type="text" pattern="\d*" placeholder="PIN" id="pin-input" class="form-control my-4" />
<input type="text" pattern="\d*" placeholder="PIN" autofocus id="pin-input" class="form-control my-4" />
<button class="btn btn-primary">{{ $t('pin.send') }}</button>
</div>
<div class="alert alert-warning">
@@ -26,6 +26,7 @@
import { createApp } from 'vue'
import i18n from './locale.js'
import Navbar from './Navbar.vue'
import fetch from './fetch.js'
let app = createApp({
components: {

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Scancodes immer senden",
"always_send_scancodes_desc": "Das Senden von Scancodes verbessert die Kompatibilität mit Spielen und Apps, kann aber zu falschen Tastatureingaben von bestimmten Clients führen, die kein amerikanisches Tastaturlayout verwenden. Aktivieren, wenn die Eingabe der Tastatur in bestimmten Anwendungen überhaupt nicht funktioniert. Deaktivieren, wenn Schlüssel auf dem Client die falsche Eingabe auf dem Host generieren.",
"amd_coder": "AMF Coder (H264)",
"amd_coder_desc": "Erlaubt es Ihnen, die Entropy-Kodierung auszuwählen, um die Qualität oder die Kodierungsgeschwindigkeit zu priorisieren. H.264 nur.",
"amd_enforce_hrd": "Hypothetische Referenz-Decodierer (HRD) durchsetzen",
"amd_enforce_hrd_desc": "Steigern Sie die Einschränkungen bei der Ratensteuerung, um die Anforderungen des HRD-Modells zu erfüllen. Dies reduziert die Bitratenüberläufe erheblich, kann jedoch zu Kodierungsartefakten oder zu geringerer Qualität auf bestimmten Karten führen.",
"amd_preanalysis": "AMF-Voranalyse",
"amd_preanalysis_desc": "Dies ermöglicht die Vorabanalyse der Rate, wodurch die Qualität auf Kosten einer erhöhten Encoding-Latenz erhöht werden kann.",
"amd_quality": "AMF-Qualität",
"amd_quality_balanced": "ausgewogen -- Ausgewogen (Standard)",
"amd_quality_desc": "Dies steuert die Balance zwischen Kodierungsgeschwindigkeit und Qualität.",
"amd_quality_group": "AMF Qualitätseinstellungen",
"amd_quality_quality": "Qualität -- Qualität bevorzugen",
"amd_quality_speed": "speed -- bevorzuge Geschwindigkeit",
"amd_rc": "AMF-Ratensteuerung",
"amd_rc_cbr": "cbr Konstante Bitrate",
"amd_rc_cqp": "cqp -- Konstanter qp-Modus",
"amd_rc_desc": "Diese steuert die Methode der Ratensteuerung, um sicherzustellen, dass wir nicht das Client-Bitrate Ziel überschreiten. 'cqp' ist nicht geeignet für Bitraten-Targeting, und andere Optionen außer 'vbr_latency' hängen von der Durchsetzung von HRD ab, um Bitraten-Überläufe einzuschränken.",
"amd_rc_group": "AMF Rate Control Einstellungen",
"amd_rc_vbr_latency": "vbr_latency -- latenzeingeschränkte Bitrate (Standard)",
"amd_rc_vbr_peak": "vbr_peak eingeschränkte Variablen-Bitrate spitzen",
"amd_usage": "AMF-Nutzung",
"amd_usage_desc": "Dies legt das Basiscodierungsprofil fest. Alle unten dargestellten Optionen werden eine Teilmenge des Nutzungsprofils überschreiben. Es werden jedoch zusätzliche versteckte Einstellungen angewendet, die an anderer Stelle nicht konfiguriert werden können.",
"amd_usage_lowlatency": "niedrige Latenz - niedrige Latenz (schnell)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - niedrige Latenz, hohe Qualität (schnell)",
"amd_usage_transcoding": "transcoding -- Umkodierung (langsamste)",
"amd_usage_ultralowlatency": "ultralowlatenz - extrem niedrige Latenz (schnellste)",
"amd_usage_webcam": "webcam -- Webcam (langsam)",
"amd_vbaq": "AMF-Varianz-basierte Adaptive Quantisierung (VBAQ)",
"amd_vbaq_desc": "Das menschliche visuelle System ist in der Regel weniger empfindlich auf Artefakte in stark strukturierten Bereichen. Im VBAQ-Modus wird die Pixelvarianz verwendet, um die Komplexität der räumlichen Texturen anzuzeigen, so dass der Encoder mehr Bits für glättende Bereiche zuweisen kann. Die Aktivierung dieser Funktion führt zu Verbesserungen der subjektiven visuellen Qualität mit einigen Inhalten.",
"apply_note": "Klicken Sie auf 'Anwenden', um Sunshine neu zu starten und Änderungen anzuwenden. Dies wird alle laufenden Sitzungen beenden.",
"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:",

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Always Send Scancodes",
"always_send_scancodes_desc": "Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout. Enable if keyboard input is not working at all in certain applications. Disable if keys on the client are generating the wrong input on the host.",
"amd_coder": "AMF Coder (H264)",
"amd_coder_desc": "Allows you to select the entropy encoding to prioritize quality or encoding speed. H.264 only.",
"amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement",
"amd_enforce_hrd_desc": "Increases the constraints on rate control to meet HRD model requirements. This greatly reduces bitrate overflows, but may cause encoding artifacts or reduced quality on certain cards.",
"amd_preanalysis": "AMF Preanalysis",
"amd_preanalysis_desc": "This enables rate-control preanalysis, which may increase quality at the expense of increased encoding latency.",
"amd_quality": "AMF Quality",
"amd_quality_balanced": "balanced -- balanced (default)",
"amd_quality_desc": "This controls the balance between encoding speed and quality.",
"amd_quality_group": "AMF Quality Settings",
"amd_quality_quality": "quality -- prefer quality",
"amd_quality_speed": "speed -- prefer speed",
"amd_rc": "AMF Rate Control",
"amd_rc_cbr": "cbr -- constant bitrate (default)",
"amd_rc_cbr": "cbr -- constant bitrate (recommended if HRD is enabled)",
"amd_rc_cqp": "cqp -- constant qp mode",
"amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate",
"amd_rc_desc": "This controls the rate control method to ensure we are not exceeding the client bitrate target. 'cqp' is not suitable for bitrate targeting, and other options besides 'vbr_latency' depend on HRD Enforcement to help constrain bitrate overflows.",
"amd_rc_group": "AMF Rate Control Settings",
"amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (recommended if HRD is disabled; default)",
"amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate",
"amd_usage": "AMF Usage",
"amd_usage_desc": "This sets the base encoding profile. All options presented below will override a subset of the usage profile, but there are additional hidden settings applied that cannot be configured elsewhere.",
"amd_usage_lowlatency": "lowlatency - low latency (fastest)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - low latency, high quality (fast)",
"amd_usage_transcoding": "transcoding -- transcoding (slowest)",
"amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest)",
"amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest; default)",
"amd_usage_webcam": "webcam -- webcam (slow)",
"amd_vbaq": "AMF Variance Based Adaptive Quantization (VBAQ)",
"amd_vbaq_desc": "The human visual system is typically less sensitive to artifacts in highly textured areas. In VBAQ mode, pixel variance is used to indicate the complexity of spatial textures, allowing the encoder to allocate more bits to smoother areas. Enabling this feature leads to improvements in subjective visual quality with some content.",
"apply_note": "Click 'Apply' to restart Sunshine and apply changes. This will terminate any running sessions.",
"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:",
@@ -234,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",
@@ -258,8 +267,8 @@
"qp_desc": "Some devices may not support Constant Bit Rate. For those devices, QP is used instead. Higher value means more compression, but less quality.",
"qsv_coder": "QuickSync Coder (H264)",
"qsv_preset": "QuickSync Preset",
"qsv_preset_fast": "faster (lower quality)",
"qsv_preset_faster": "fastest (lowest quality)",
"qsv_preset_fast": "fast (low quality)",
"qsv_preset_faster": "faster (lower quality)",
"qsv_preset_medium": "medium (default)",
"qsv_preset_slow": "slow (good quality)",
"qsv_preset_slower": "slower (better quality)",

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Always Send Scancodes",
"always_send_scancodes_desc": "Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout. Enable if keyboard input is not working at all in certain applications. Disable if keys on the client are generating the wrong input on the host.",
"amd_coder": "AMF Coder (H264)",
"amd_coder_desc": "Allows you to select the entropy encoding to prioritize quality or encoding speed. H.264 only.",
"amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement",
"amd_enforce_hrd_desc": "Increases the constraints on rate control to meet HRD model requirements. This greatly reduces bitrate overflows, but may cause encoding artifacts or reduced quality on certain cards.",
"amd_preanalysis": "AMF Preanalysis",
"amd_preanalysis_desc": "This enables rate-control preanalysis, which may increase quality at the expense of increased encoding latency.",
"amd_quality": "AMF Quality",
"amd_quality_balanced": "balanced -- balanced (default)",
"amd_quality_desc": "This controls the balance between encoding speed and quality.",
"amd_quality_group": "AMF Quality Settings",
"amd_quality_quality": "quality -- prefer quality",
"amd_quality_speed": "speed -- prefer speed",
"amd_rc": "AMF Rate Control",
"amd_rc_cbr": "cbr -- constant bitrate",
"amd_rc_cqp": "cqp -- constant qp mode",
"amd_rc_desc": "This controls the rate control method to ensure we are not exceeding the client bitrate target. 'cqp' is not suitable for bitrate targeting, and other options besides 'vbr_latency' depend on HRD Enforcement to help constrain bitrate overflows.",
"amd_rc_group": "AMF Rate Control Settings",
"amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (default)",
"amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate",
"amd_usage": "AMF Usage",
"amd_usage_desc": "This sets the base encoding profile. All options presented below will override a subset of the usage profile, but there are additional hidden settings applied that cannot be configured elsewhere.",
"amd_usage_lowlatency": "lowlatency - low latency (fast)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - low latency, high quality (fast)",
"amd_usage_transcoding": "transcoding -- transcoding (slowest)",
"amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest)",
"amd_usage_webcam": "webcam -- webcam (slow)",
"amd_vbaq": "AMF Variance Based Adaptive Quantization (VBAQ)",
"amd_vbaq_desc": "The human visual system is typically less sensitive to artifacts in highly textured areas. In VBAQ mode, pixel variance is used to indicate the complexity of spatial textures, allowing the encoder to allocate more bits to smoother areas. Enabling this feature leads to improvements in subjective visual quality with some content.",
"apply_note": "Click 'Apply' to restart Sunshine and apply changes. This will terminate any running sessions.",
"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:",

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Always Send Scancodes",
"always_send_scancodes_desc": "Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout. Enable if keyboard input is not working at all in certain applications. Disable if keys on the client are generating the wrong input on the host.",
"amd_coder": "AMF Coder (H264)",
"amd_coder_desc": "Allows you to select the entropy encoding to prioritize quality or encoding speed. H.264 only.",
"amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement",
"amd_enforce_hrd_desc": "Increases the constraints on rate control to meet HRD model requirements. This greatly reduces bitrate overflows, but may cause encoding artifacts or reduced quality on certain cards.",
"amd_preanalysis": "AMF Preanalysis",
"amd_preanalysis_desc": "This enables rate-control preanalysis, which may increase quality at the expense of increased encoding latency.",
"amd_quality": "AMF Quality",
"amd_quality_balanced": "balanced -- balanced (default)",
"amd_quality_desc": "This controls the balance between encoding speed and quality.",
"amd_quality_group": "AMF Quality Settings",
"amd_quality_quality": "quality -- prefer quality",
"amd_quality_speed": "speed -- prefer speed",
"amd_rc": "AMF Rate Control",
"amd_rc_cbr": "cbr -- constant bitrate (default)",
"amd_rc_cbr": "cbr -- constant bitrate (recommended if HRD is enabled)",
"amd_rc_cqp": "cqp -- constant qp mode",
"amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate",
"amd_rc_desc": "This controls the rate control method to ensure we are not exceeding the client bitrate target. 'cqp' is not suitable for bitrate targeting, and other options besides 'vbr_latency' depend on HRD Enforcement to help constrain bitrate overflows.",
"amd_rc_group": "AMF Rate Control Settings",
"amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (recommended if HRD is disabled; default)",
"amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate",
"amd_usage": "AMF Usage",
"amd_usage_desc": "This sets the base encoding profile. All options presented below will override a subset of the usage profile, but there are additional hidden settings applied that cannot be configured elsewhere.",
"amd_usage_lowlatency": "lowlatency - low latency (fastest)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - low latency, high quality (fast)",
"amd_usage_transcoding": "transcoding -- transcoding (slowest)",
"amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest)",
"amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest; default)",
"amd_usage_webcam": "webcam -- webcam (slow)",
"amd_vbaq": "AMF Variance Based Adaptive Quantization (VBAQ)",
"amd_vbaq_desc": "The human visual system is typically less sensitive to artifacts in highly textured areas. In VBAQ mode, pixel variance is used to indicate the complexity of spatial textures, allowing the encoder to allocate more bits to smoother areas. Enabling this feature leads to improvements in subjective visual quality with some content.",
"apply_note": "Click 'Apply' to restart Sunshine and apply changes. This will terminate any running sessions.",
"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:",
@@ -258,8 +267,8 @@
"qp_desc": "Some devices may not support Constant Bit Rate. For those devices, QP is used instead. Higher value means more compression, but less quality.",
"qsv_coder": "QuickSync Coder (H264)",
"qsv_preset": "QuickSync Preset",
"qsv_preset_fast": "faster (lower quality)",
"qsv_preset_faster": "fastest (lowest quality)",
"qsv_preset_fast": "fast (low quality)",
"qsv_preset_faster": "faster (lower quality)",
"qsv_preset_medium": "medium (default)",
"qsv_preset_slow": "slow (good quality)",
"qsv_preset_slower": "slower (better quality)",

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Enviar siempre códigos de escaneo",
"always_send_scancodes_desc": "Enviar códigos de escaneo mejora la compatibilidad con juegos y aplicaciones, pero puede resultar en una entrada de teclado incorrecta de ciertos clientes que no están usando una disposición de teclado en inglés de los Estados Unidos. Activar si la entrada de teclado no funciona en absoluto en ciertas aplicaciones. Desactivar si las claves del cliente están generando una entrada incorrecta en el host.",
"amd_coder": "Codificador AMF (H264)",
"amd_coder_desc": "Le permite seleccionar la codificación entropía para priorizar la calidad o la velocidad de codificación. H.264 solamente.",
"amd_enforce_hrd": "Aplicación del decodificador de referencia hipotético (HRD) AMF",
"amd_enforce_hrd_desc": "Aumenta las restricciones en el control de tasa para cumplir con los requisitos del modelo de HRD. Esto reduce en gran medida los desbordamientos de bitrate pero puede causar artefactos de codificación o menor calidad en ciertas tarjetas.",
"amd_preanalysis": "Análisis previo de AMF",
"amd_preanalysis_desc": "Esto permite preanálisis de control de tarifas que puede aumentar la calidad a expensas de una mayor latencia de codificación.",
"amd_quality": "Calidad AMF",
"amd_quality_balanced": "balanceada -- balanceado (por defecto)",
"amd_quality_desc": "Controla el equilibrio entre la velocidad de codificación y la calidad.",
"amd_quality_group": "Ajustes de calidad AMF",
"amd_quality_quality": "calidad -- Preferir calidad",
"amd_quality_speed": "velocidad -- preferir velocidad",
"amd_rc": "Control de tasa AMF",
"amd_rc_cbr": "cbr -- velocidad de bits constante",
"amd_rc_cqp": "cqp -- modo qp constante",
"amd_rc_desc": "Esto controla el método de control de tasa para asegurarse de que no estamos excediendo el objetivo de bitrate del cliente. 'cqp' no es apto para targeting, y otras opciones además de 'vbr_latency' dependen de HRD para ayudar a restringir los desbordamientos de bitrate .",
"amd_rc_group": "Ajustes de control de tasa AMF",
"amd_rc_vbr_latency": "vbr_latency -- tasa de bits variable restringida por latencia (por defecto)",
"amd_rc_vbr_peak": "vbr_peak -- tasa de bits variable restringida máxima",
"amd_usage": "Uso de AMF",
"amd_usage_desc": "Establece el perfil de codificación base. Todas las opciones presentadas a continuación anularán un subconjunto del perfil de uso, pero hay opciones ocultas adicionales que no se pueden configurar en otros lugares.",
"amd_usage_lowlatency": "baja latencia - baja latencia (la más rápida)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - baja latencia, alta calidad (rápido)",
"amd_usage_transcoding": "transcodificación -- transcodificación (más lenta)",
"amd_usage_ultralowlatency": "latencia ultra baja - latencia ultra baja (más rápida)",
"amd_usage_webcam": "cámara web -- cámara web (lento)",
"amd_vbaq": "Cuantización adaptativa basada en la varianza AMF (VBAQ)",
"amd_vbaq_desc": "El sistema visual humano normalmente es menos sensible a los artefactos en áreas altamente texturizadas. En modo VBAQ, la variación de píxeles se utiliza para indicar la complejidad de las texturas espaciales, permitiendo al codificador asignar más bits a áreas más suaves. Activar esta función conduce a mejoras en la calidad visual objetiva con algunos contenidos.",
"apply_note": "Haga clic en 'Aplicar' para reiniciar Sunshine y aplicar los cambios. Esto terminará cualquier sesión en ejecución.",
"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:",
@@ -258,7 +267,7 @@
"qp_desc": "Algunos dispositivos pueden no soportar tasa de bits constante. Para esos dispositivos, se utiliza QP en su lugar. Un valor más alto significa más compresión, pero menos calidad.",
"qsv_coder": "Codificador QuickSync (H264)",
"qsv_preset": "Preajuste QuickSync",
"qsv_preset_fast": "más rápido (menor calidad)",
"qsv_preset_fast": "rápido (baja calidad)",
"qsv_preset_faster": "más rápido (menor calidad)",
"qsv_preset_medium": "medio (por defecto)",
"qsv_preset_slow": "lento (buena calidad)",
@@ -324,7 +333,7 @@
"configuration": "Configuración",
"home": "Inicio",
"password": "Cambiar contraseña",
"pin": "Fijar",
"pin": "Pin",
"troubleshoot": "Resolución de problemas"
},
"password": {

View File

@@ -1,6 +1,6 @@
{
"_common": {
"apply": "Applique",
"apply": "Appliquer",
"auto": "Automatique",
"autodetect": "Détection automatique (recommandé)",
"cancel": "Annuler",
@@ -24,7 +24,7 @@
"apps": {
"actions": "Actions",
"add_cmds": "Ajouter des commandes",
"add_new": "Ajouter une nouvelle",
"add_new": "Ajouter une autre",
"app_name": "Nom de l'application",
"app_name_desc": "Nom de l'application, affiché dans Moonlight",
"applications_desc": "Les applications ne sont actualisées qu'au redémarrage du client",
@@ -92,24 +92,33 @@
"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.",
"amd_coder": "Codeur AMF (H264)",
"amd_coder_desc": "Permet de sélectionner l'encodage de l'entropie pour prioriser la qualité ou la vitesse d'encodage. H.264 seulement.",
"amd_enforce_hrd": "Enforcement du Décodeur Hypothetical Reference Decoder (HRD) de l'AMF",
"amd_enforce_hrd_desc": "Augmente les contraintes sur le contrôle du débit pour répondre aux exigences du modèle HRD. Cela réduit considérablement les débordements de débit, mais peut causer des artefacts d'encodage ou une qualité réduite sur certaines cartes.",
"amd_preanalysis": "Pré-analyse AMF",
"amd_preanalysis_desc": "Cela permet une préanalyse de contrôle de débit, ce qui peut augmenter la qualité au détriment d'une latence d'encodage accrue.",
"amd_quality": "Qualité AMF",
"amd_quality_balanced": "balanced -- équilibré (par défaut)",
"amd_quality_desc": "Ceci contrôle l'équilibre entre la vitesse d'encodage et la qualité.",
"amd_quality_group": "Paramètres de qualité AMF",
"amd_quality_quality": "qualité -- préférer la qualité",
"amd_quality_speed": "Vitesse -- Préférez la vitesse",
"amd_rc": "Contrôle du débit AMF",
"amd_rc_cbr": "cbr -- débit constant",
"amd_rc_cqp": "cqp -- mode constant qp",
"amd_rc_desc": "Ceci contrôle la méthode de contrôle du débit pour s'assurer que nous ne dépassons pas la cible du bitrate client. 'cqp' n'est pas adapté pour le ciblage de débit, et d'autres options en plus de 'vbr_latency' dépendent de HRD Enforcement pour aider à limiter les débordements de débit.",
"amd_rc_group": "Réglages de contrôle du débit AMF",
"amd_rc_vbr_latency": "vbr_latency -- Débit variable limité de latence (par défaut)",
"amd_rc_vbr_peak": "vbr_peak -- Débit variable contraint par le pic",
"amd_usage": "Utilisation de l'AMF",
"amd_usage_desc": "Définit le profil d'encodage de base. Toutes les options présentées ci-dessous remplaceront un sous-ensemble du profil d'utilisation, mais il y a d'autres paramètres cachés qui ne peuvent pas être configurés ailleurs.",
"amd_usage_lowlatency": "lowlatency - faible latence (rapide)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - faible latence, haute qualité (rapide)",
"amd_usage_transcoding": "transcoding -- transcodage (plus lent)",
"amd_usage_ultralowlatency": "ultralowlatency - latence ultra basse (plus rapide)",
"amd_usage_webcam": "webcam -- webcam (lent)",
"amd_vbaq": "Quantification adaptative basée sur la variance AMF (VBAQ)",
"amd_vbaq_desc": "Le système visuel humain est généralement moins sensible aux artefacts dans les zones hautement texturées. En mode VBAQ, la variance de pixels est utilisée pour indiquer la complexité des textures spatiales, ce qui permet à l'encodeur d'allouer plus de bits à des zones plus lisses. L'activation de cette fonctionnalité conduit à des améliorations de la qualité visuelle subjective avec un certain contenu.",
"apply_note": "Cliquez sur \"Appliquer\" pour redémarrer Sunshine et appliquer les modifications. Cela mettra fin à toutes les sessions en cours.",
"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:",
@@ -255,7 +264,7 @@
"port_warning": "Exposer l'interface Web à Internet est un risque de sécurité ! Procédez à vos propres risques !",
"port_web_ui": "Interface Web",
"qp": "Paramètre de quantification",
"qp_desc": "Certains périphériques peuvent ne pas prendre en charge le taux de bits constant. Pour ces périphériques, QP est utilisé à la place. Une valeur plus élevée signifie plus de compression, mais moins de qualité.",
"qp_desc": "Certains appareils peuvent ne pas prendre en charge un taux de bits constant. Pour ceux-ci, QP est utilisé à la place. Une valeur plus élevée signifie plus de compression, mais moins de qualité.",
"qsv_coder": "Codeur QuickSync (H264)",
"qsv_preset": "QuickSync Preset",
"qsv_preset_fast": "plus rapide (qualité inférieure)",
@@ -337,7 +346,7 @@
},
"pin": {
"pair_failure": "Échec de l'appairage : Vérifiez si le code PIN est correctement saisi",
"pair_success": "Succès ! Veuillez vérifier la lumière de lune pour continuer",
"pair_success": "Succès ! Veuillez vérifier Moonlight pour continuer",
"pin_pairing": "Appairage par code PIN",
"send": "Envoyer",
"warning_msg": "Assurez-vous que vous avez accès au client avec lequel vous appariez. Ce logiciel peut donner un contrôle total à votre ordinateur, alors soyez prudent !"

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Invia sempre Scancode",
"always_send_scancodes_desc": "L'invio di scancode migliora la compatibilità con i giochi e le applicazioni, ma può risultare in input da tastiera errati da alcuni client che non utilizzano un layout di inglese statunitense. Abilita se l' input della tastiera non funziona affatto in certe applicazioni. Disabilita se le chiavi del client generano l'input errato sull'host.",
"amd_coder": "Coder AMF (H264)",
"amd_coder_desc": "Consente di selezionare la codifica dell'entropia per dare la priorità alla qualità o alla velocità di codifica. Solo H.264.",
"amd_enforce_hrd": "Applicazione Decoder di Riferimento Ipotetico AMF (HRD)",
"amd_enforce_hrd_desc": "Aumenta i vincoli in materia di controllo della velocità per soddisfare i requisiti del modello HRD. Questo riduce notevolmente il bitrate overflow, ma può causare artefatti di codifica o qualità ridotta su determinate schede.",
"amd_preanalysis": "Preanalisi AMF",
"amd_preanalysis_desc": "Ciò consente la preanalisi del controllo della velocità, che può aumentare la qualità a scapito di una maggiore latenza di codifica.",
"amd_quality": "Qualità AMF",
"amd_quality_balanced": "bilanciato -- bilanciato (predefinito)",
"amd_quality_desc": "Questo controlla l'equilibrio tra velocità di codifica e qualità.",
"amd_quality_group": "Impostazioni Qualità AMF",
"amd_quality_quality": "qualità -- preferisce la qualità",
"amd_quality_speed": "velocità -- preferisci la velocità",
"amd_rc": "Controllo della Velocità AMF",
"amd_rc_cbr": "cbr -- bitrate costante",
"amd_rc_cqp": "cqp -- modalità qp costante",
"amd_rc_desc": "Questo controlla il metodo di controllo della velocità per garantire che non stiamo superando il target di bitrate client. 'cqp' non è adatto per il target di bitrate e altre opzioni oltre 'vbr_latency' dipendono dall'esecuzione HRD per aiutare a limitare i overflow di bitrate.",
"amd_rc_group": "Impostazioni Di Controllo Frequenza Amf",
"amd_rc_vbr_latency": "vbr_latency -- bitrate variabile con vincoli di latenza",
"amd_rc_vbr_peak": "vbr_peak -- bitrate variabile con vincoli di picco",
"amd_usage": "Utilizzo AMF",
"amd_usage_desc": "Questo imposta il profilo di codifica di base. Tutte le opzioni presentate di seguito sovrascriveranno un sottoinsieme del profilo di utilizzo, ma ci sono ulteriori impostazioni nascoste applicate che non possono essere configurate altrove.",
"amd_usage_lowlatency": "lowlatency - bassa latenza (più veloce)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - bassa latenza, alta qualità (veloce)",
"amd_usage_transcoding": "transcoding -- transcodifica (più lenta)",
"amd_usage_ultralowlatency": "ultralowlatency - latenza ultra bassa (più veloce)",
"amd_usage_webcam": "webcam -- webcam (lento)",
"amd_vbaq": "Quantizzazione Adattiva Basata Sulla Varianza AMF (VBAQ)",
"amd_vbaq_desc": "Il sistema visivo umano è tipicamente meno sensibile agli artefatti in aree altamente strutturate. In modalità VBAQ, la varianza di pixel è utilizzata per indicare la complessità delle texture spaziali, consentendo al codificatore di allocare più bit ad aree più fluide. Abilitare questa funzione porta a migliorare la qualità visiva soggettiva con alcuni contenuti.",
"apply_note": "Fare clic su 'Applica' per applicare le modifiche e riavviare Sunshine. Questo terminerà qualsiasi sessione in esecuzione.",
"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:",

View File

@@ -6,10 +6,10 @@
"cancel": "キャンセル",
"disabled": "無効",
"disabled_def": "無効 (デフォルト)",
"do_cmd": "Do Command",
"elevated": "昇",
"do_cmd": "コマンド実行",
"elevated": "昇",
"enabled": "有効",
"enabled_def": "有効 (既定)",
"enabled_def": "有効 (デフォルト)",
"error": "エラー!",
"note": "メモ:",
"password": "パスワード",
@@ -26,17 +26,17 @@
"add_cmds": "コマンドを追加",
"add_new": "新規追加",
"app_name": "アプリケーション名",
"app_name_desc": "アプリケーション名Moonlight に示すように",
"applications_desc": "アプリケーションはクライアントの再起動時にのみ更新されます",
"applications_title": "アプリケーション",
"auto_detach": "アプリケーションがすぐに終了すると、ストリーミングを続行します",
"auto_detach_desc": "これにより、別のプログラムまたはインスタンスを起動した後にすぐに閉じられるランチャー型アプリを自動的に検出しようとします。 ランチャータイプのアプリが検出されると、切り離したアプリとして扱われます。",
"cmd": "(Command)",
"cmd_desc": "メインアプリケーションを起動します。空白の場合はアプリケーションは起動しません。",
"app_name_desc": "アプリケーション名Moonlight に表示させるもの",
"applications_desc": "アプリケーション一覧はクライアントの再起動時にのみ更新されます",
"applications_title": "アプリケーション一覧",
"auto_detach": "アプリケーションが一瞬終了してもストリーミングを続行します",
"auto_detach_desc": "これにより、別のプログラムまたはインスタンスを起動してすぐ終了する、ランチャー型アプリを自動的に検出しようとします。 ランチャータイプのアプリが検出されると、切断されたアプリとして扱われます。",
"cmd": "コマンド",
"cmd_desc": "起動したいメインアプリケーション。空白の場合はアプリケーションは起動しません。",
"cmd_note": "コマンド実行ファイルへのパスにスペースが含まれている場合は、引用符で囲む必要があります。",
"cmd_prep_desc": "このアプリケーションの前後に実行するコマンドのリストです。prep-commandsのいずれかに失敗した場合、アプリケーションの起動は中止されます。",
"cmd_prep_desc": "このアプリケーションの前/後に実行するコマンドのリストです。prep-commandsのいずれかに失敗した場合、アプリケーションの起動は中止されます。",
"cmd_prep_name": "コマンドの準備",
"covers_found": "カバーが見つかりました",
"covers_found": "カバー画像が見つかりました",
"delete": "削除",
"detached_cmds": "切り離されたコマンド",
"detached_cmds_add": "別のコマンドを追加",
@@ -47,35 +47,35 @@
"env_app_name": "アプリ名",
"env_client_audio_config": "クライアントから要求されたオーディオ設定 (2.0/5.1/7.1)",
"env_client_enable_sops": "クライアントは最適なストリーミングのためにゲームを最適化するオプションを要求しています (true/false)",
"env_client_fps": "クライアントから要求された FPS (int)",
"env_client_fps": "クライアントから要求された FPS (整数)",
"env_client_gcmap": "要求されたゲームパッドマスク、ビットセット/ビットフィールド形式 (int)",
"env_client_hdr": "HDR はクライアントによって有効になっています (true/false)",
"env_client_height": "The Height requested by the client (int)",
"env_client_host_audio": "The client has requested host audio (true/false)",
"env_client_height": "クライアントから要求された高さ (int)",
"env_client_host_audio": "クライアントはホストオーディオを要求しています (true/false)",
"env_client_width": "クライアントから要求された幅 (int)",
"env_displayplacer_example": "例 - 解像度自動化の表示プレースホルダ:",
"env_qres_example": "例 - 自動解像度のQR:",
"env_qres_path": "qres path",
"env_displayplacer_example": "例 - 解像度自動化のためのディスプレイ プレーサ:",
"env_qres_example": "例 - 自動解像度のQRes:",
"env_qres_path": "qresのパス",
"env_var_name": "変数名",
"env_vars_about": "環境変数について",
"env_vars_desc": "すべてのコマンドはデフォルトでこれらの環境変数を取得します:",
"env_xrandr_example": "例 - 解像度自動化のための Xrandr:",
"exit_timeout": "タイムアウト終了",
"exit_timeout_desc": "終了要求時にすべてのアプリプロセスが正常に終了するまで待機する秒数。 設定されていない場合、デフォルトは5秒まで待機します。ゼロまたは負の値に設定されている場合、アプリは直ちに終了します。",
"exit_timeout": "終了タイムアウト",
"exit_timeout_desc": "終了要求時にすべてのアプリプロセスが正常に終了するまで待機する秒数。 設定されていない場合、デフォルトは5秒まで待機します。ゼロまたはマイナス値に設定されている場合、アプリは直ちに終了します。",
"find_cover": "カバーを見つける",
"global_prep_desc": "このアプリケーションの Global Prep コマンドの実行を有効または無効にします。",
"global_prep_desc": "このアプリケーションのグローバル準備コマンドの実行を有効/無効にする。",
"global_prep_name": "グローバル準備コマンド",
"image": "画像",
"image_desc": "クライアントに送信されるアプリケーションアイコン/画像/画像パス。画像はPNGファイルである必要があります。設定されていない場合、Sunshineはデフォルトのボックス画像を送信します。",
"loading": "読み込み中...",
"name": "名前",
"output_desc": "コマンドの出力保存されているファイル指定されていない場合、出力は無視されます。",
"output_desc": "コマンドの出力保存るファイル指定されない場合、出力は無視されます。",
"output_name": "出力",
"run_as_desc": "これは、管理者権限を必要とするアプリケーションが正常に動作するために必要な場合があります。",
"wait_all": "すべてのアプリプロセスが終了するまでストリーミングを続ける",
"wait_all_desc": "これは、アプリによって開始されたすべてのプロセスが終了するまで、ストリーミングを続けます。 チェックを外すと、他のアプリプロセスがまだ実行中であっても、最初のアプリプロセスが終了するとストリーミングは停止します。",
"working_dir": "作業ディレクトリ",
"working_dir_desc": "プロセスに渡される作業ディレクトリ。たとえば、アプリケーションによっては、作業ディレクトリを使用して設定ファイルを検索します。 設定されていない場合、Sunshineはデフォルトでコマンドの親ディレクトリになります"
"working_dir_desc": "プロセスに渡される作業ディレクトリ。たとえば、アプリケーションによっては、作業ディレクトリを使用して設定ファイルを検索します。 設定されていない場合、Sunshineはデフォルトでコマンドの親ディレクトリを使用します"
},
"config": {
"adapter_name": "アダプター名",
@@ -92,25 +92,34 @@
"always_send_scancodes": "常にスキャンコードを送信する",
"always_send_scancodes_desc": "スキャンコードを送信すると、ゲームやアプリとの互換性が向上しますが、米国英語のキーボードレイアウトを使用していない特定のクライアントからのキーボード入力が誤っている可能性があります。 特定のアプリケーションでキーボード入力がまったく動作しない場合に有効にします。 クライアントのキーがホストに間違った入力を生成している場合は無効にします。",
"amd_coder": "AMFコーダー(H264)",
"amd_coder_desc": "エントロピーエンコーディングを選択して品質やエンコーディング速度を優先することができます。H.264 のみ。",
"amd_enforce_hrd": "AMF仮説リファレンスデコーダ(HRD) Enforcement",
"amd_preanalysis": "AMFプレ分析",
"amd_enforce_hrd_desc": "HRDモデル要件を満たすためのレート制御の制約を増やします。 これによりビットレートのオーバーフローが大幅に減少しますが、エンコードアーティファクトや特定のカードの品質が低下する可能性があります。",
"amd_preanalysis": "AMF事前解析",
"amd_preanalysis_desc": "これにより、レート制御の事前分析が可能になり、エンコード待ち時間の増加を犠牲にして品質が向上する可能性があります。",
"amd_quality": "AMF品質",
"amd_quality_balanced": "balance-- balanceデフォルト",
"amd_quality_desc": "これにより、エンコード速度と品質のバランスを制御します。",
"amd_quality_group": "AMF品質設定",
"amd_quality_quality": "品質 -- 品質を優先",
"amd_quality_speed": "スピード -- 速度を優先",
"amd_rc": "AMFレート制御",
"amd_rc_cbr": "cbr -- 定ビットレート(デフォルト)",
"amd_rc_cqp": "cqp -- 定qp モード",
"amd_rc_vbr_latency": "vbr_lathering -- lattened variable bitrate",
"amd_rc_cbr": "cbr -- 定ビットレート(デフォルト)",
"amd_rc_cqp": "cqp -- 定qp モード",
"amd_rc_desc": "これは、クライアントのビットレート目標を超えないようにするレート制御方法を制御します。 'cqp'はビットレートターゲティングには適していません。'vbr_latency'以外のオプションはHRDエンフォースメントに依存してビットレートオーバーフローを制限します。",
"amd_rc_group": "AMFレートコントロール設定",
"amd_rc_vbr_latency": "vbr_latency -- レイテンシ制約付き可変ビットレート",
"amd_rc_vbr_peak": "vbr_peak -- ピーク制約可変ビットレート",
"amd_usage": "AMF使用率",
"amd_usage_desc": "これにより、基本エンコーディングプロファイルが設定されます。 以下に表示されるすべてのオプションは、使用状況プロファイルのサブセットを上書きしますが、他の場所では設定できない追加の非表示設定が適用されます。",
"amd_usage_lowlatency": "lowlaterity - 低レイテンシ(最速)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - 低レイテンシ、高品質 (高速)",
"amd_usage_transcoding": "トランスコード-- トランスコード(最も遅い)",
"amd_usage_ultralowlatency": "超低レイテンシー - 超低レイテンシ(最速)",
"amd_usage_webcam": "ウェブカメラ -- ウェブカメラ (スロー)",
"amd_vbaq": "AMF分散ベース適応型量子化(VBAQ)",
"apply_note": "「適用」をクリックしてSunshineを再起動し、変更を適用します。これは実行中のセッションを終了します。",
"amd_vbaq_desc": "人間の視覚システムは、高度なテクスチャ領域の人工物には通常、あまり敏感です。 VBAQモードでは、ピクセル分散を使用して空間テクスチャの複雑さを示し、エンコーダがより多くのビットを割り当て、領域をスムーズにすることができます。 この機能を有効にすると、一部のコンテンツで主観的なビジュアル品質が向上します。",
"apply_note": "'適用' をクリックして Sunshine を再起動し、変更を適用します。これにより、実行中のセッションはすべて終了します。",
"audio_sink": "音声シンク",
"audio_sink_desc_linux": "オーディオループバックに使用されるオーディオシンクの名前。この変数を指定しない場合、pulseaudio はデフォルトのモニターデバイスを選択します。 いずれかのコマンドを使用して、オーディオシンクの名前を見つけることができます。",
"audio_sink_desc_macos": "Audio Loopback に使用されるオーディオシンクの名前。Sunshineはシステムの制限により、macOSのマイクにのみアクセスできます。 Soundflower または BlackHole を使用してシステムのオーディオをストリーミングする。",
@@ -123,22 +132,22 @@
"av1_mode_2": "SunshineはAV1メイン8ビットプロファイルのサポートを宣伝します",
"av1_mode_3": "SunshineはAV1メイン8ビットと10ビット(HDR)プロファイルのサポートを宣伝します。",
"av1_mode_desc": "クライアントがAV1 Main 8ビットまたは10ビットのビデオストリームを要求できるようにします。 AV1はエンコードにCPU負荷がかかるため、ソフトウェアエンコーディングを使用する際のパフォーマンスが低下する可能性があります。",
"back_button_timeout": "ホーム/ガイドボタンエミュレーションタイムアウト",
"back_button_timeout_desc": "指定したミリ秒単位で戻る/選択ボタンを押し続けると、ホーム/ガイドボタン押下がエミュレートされます。 値 < 0(デフォルト)に設定されている場合、format@@0/format@@1ボタンを押し続けると、format@@2ボタンはエミュレートされません。",
"back_button_timeout": "ホーム/ガイドボタンエミュレーションタイムアウト",
"back_button_timeout_desc": "Back/Selectボタンが指定されたミリ秒の間押し続けられると、Home/Guideボタン押下がエミュレートされる。値0デフォルトに設定すると、Back/Selectボタンを押し続けてもHome/Guideボタンはエミュレートされない。",
"capture": "特定のキャプチャ方法を強制する",
"capture_desc": "自動モードでSunshineは動作する最初のものを使用します. NvFBCはパッチを当てる必要があります nvidiaドライバ.",
"capture_desc": "自動モードでSunshineは動作する最初のものを使用します. NvFBCはパッチ済み nvidiaドライバが必要です.",
"cert": "証明書",
"cert_desc": "Web UIとMoonlightクライアントのペアリングに使用される証明書。互換性を確保するためには、RSA-2048 公開鍵が必要です。",
"channels": "接続済みクライアントの最大数",
"channels": "最大接続クライアント数",
"channels_desc_1": "Sunshineは、単一のストリーミングセッションを複数のクライアントと同時に共有することができます。",
"channels_desc_2": "一部のハードウェアエンコーダには、複数のストリームでパフォーマンスを低下させる制限がある場合があります。",
"coder_cabac": "cabac -- コンテキスト適応二進数演算符号化 - 高品質",
"coder_cavlc": "cavlc -- コンテキスト適応型可変長符号化 - 高速デコード",
"configuration": "設定",
"controller": "Enable Gamepad Input",
"controller": "ゲームパッド入力を有効にする",
"controller_desc": "ゲストがゲームパッド/コントローラーでホストシステムを制御できるようにします",
"credentials_file": "資格情報ファイル",
"credentials_file_desc": "Sunshineの状態ファイルとは別に、ユーザー名/パスワードを保存します。",
"credentials_file_desc": "ユーザー名/パスワードは、サンシャインのステートファイルとは別に保管してください。",
"ds4_back_as_touchpad_click": "戻る/選択をタッチパッドにマップする",
"ds4_back_as_touchpad_click_desc": "DS4エミュレーションを強制するときは、戻る/選択をタッチパッドにマップする",
"encoder": "特定のエンコーダーを強制する",
@@ -148,12 +157,12 @@
"external_ip_desc": "外部IPアドレスが指定されていない場合、Sunshineは自動的に外部IPを検出します。",
"fec_percentage": "FECの割合",
"fec_percentage_desc": "各ビデオフレーム内のデータ パケットあたりのパケットを修正するエラー率。 より高い値は、ネットワークパケットの損失を増やすことができますが、帯域幅の使用量を増加させることができます。",
"ffmpeg_auto": "auto -- ffmpegで決める (デフォルト)",
"ffmpeg_auto": "auto -- ffmpegで判断する (デフォルト)",
"file_apps": "アプリファイル",
"file_apps_desc": "Sunshineの現在のアプリが保存されているファイル。",
"file_state": "状態ファイル",
"file_state_desc": "サンシャインの現在の状態が保存されているファイル",
"fps": "広告のFPS",
"fps": "通知されたFPS",
"gamepad": "エミュレートしたゲームパッドのタイプ",
"gamepad_auto": "自動選択オプション",
"gamepad_desc": "ホスト上でエミュレートするゲームパッドの種類を選択します",
@@ -217,7 +226,7 @@
"nvenc_preset_7": "(最も遅い)",
"nvenc_preset_desc": "数値が高いほど、符号化遅延の増加を犠牲にして圧縮(一定のビットレートでの品質)が向上します。 ネットワークまたはデコーダによって制限されている場合にのみ変更することをお勧めします, そうでなければ、ビットレートを増やすことによって、同様の効果を達成することができます.",
"nvenc_realtime_hags": "ハードウェアアクセラレーションGPUスケジューリングでリアルタイム優先度を使用する",
"nvenc_realtime_hags_desc": "現在、NVIDIAドライバは、HAGSが有効になっている場合、エンコーダでフリーズすることがあり、リアルタイムの優先度が使用され、VRAM使用率が最大に近い場合があります。 このオプションを無効にすると、GPUが大量にロードされた際のキャプチャパフォーマンス低下するため、フリーズの優先度が高くなります。",
"nvenc_realtime_hags_desc": "現在、NVIDIAドライバは、HAGSが有効で、リアルタイムプライオリティが使用され、VRAM使用率が最大に近い場合、エンコーダでフリーズすることがあります。このオプションを無効にすると、優先順位が高に下がり、GPUに大きな負荷がかかったときのキャプチャパフォーマンス低下と引き換えに、フリーズを回避できます。",
"nvenc_spatial_aq": "Spatial AQ",
"nvenc_spatial_aq_desc": "より高いQP値をビデオのフラットリージョンに割り当てます。低ビットレートでストリーミングする際に有効にすることをお勧めします。",
"nvenc_spatial_aq_disabled": "無効 (高速、デフォルト)",
@@ -239,7 +248,7 @@
"output_name_linux": "モニター番号",
"output_name_win": "出力名",
"ping_timeout": "Pingのタイムアウト",
"ping_timeout_desc": "月明かりからのデータがストリームをシャットダウンするまでのミリ秒単位で待機する期間",
"ping_timeout_desc": "Moonlightがデータが止まってからストリームをシャットダウンするまで待機時間をミリ秒で指定",
"pkey": "プライベートキー",
"pkey_desc": "ウェブ UI とMoonlight クライアントのペアリングに使用される秘密鍵。互換性を確保するためには、RSA-2048 秘密鍵を使用する必要があります。",
"port": "ポート",
@@ -324,7 +333,7 @@
"configuration": "設定",
"home": "ホーム",
"password": "パスワードの変更",
"pin": "ピン留めする",
"pin": "Pin",
"troubleshoot": "トラブルシューティング"
},
"password": {
@@ -337,10 +346,10 @@
},
"pin": {
"pair_failure": "ペアリングに失敗しましたPINが正しく入力されたかどうかを確認します",
"pair_success": "成功!ムーンライトを確認して続行してください",
"pair_success": "成功!Moonlight を確認して続行してください",
"pin_pairing": "PIN Pairing",
"send": "送信",
"warning_msg": "ペアリングしているクライアントへのアクセス権を持っていることを確認してください。このソフトウェアはコンピュータ完全な制御を与えることができます注意してください!"
"warning_msg": "ペアリングるクライアントアクセスできることを確認してください。このソフトウェアは、あなたのコンピュータ完全にコントロールすることができますので、注意してください!"
},
"resource_card": {
"github_discussions": "GitHub Discussions",

View File

@@ -0,0 +1,389 @@
{
"_common": {
"apply": "Aplicar",
"auto": "Automático",
"autodetect": "Autodetectar (recomendado)",
"cancel": "cancelar",
"disabled": "Desabilitado",
"disabled_def": "Desativado (padrão)",
"do_cmd": "Faça o Comando",
"elevated": "Elevado",
"enabled": "Ativado",
"enabled_def": "Ativado (padrão)",
"error": "Erro!",
"note": "Nota:",
"password": "Palavra-passe",
"run_as": "Executar como Administrador",
"save": "Guardar",
"see_more": "Ver mais",
"success": "Sucesso!",
"undo_cmd": "Desfazer Comando",
"username": "Usuário:",
"warning": "Aviso!"
},
"apps": {
"actions": "Ações.",
"add_cmds": "Adicionar Comandos",
"add_new": "Adicionar novo",
"app_name": "Nome da aplicação",
"app_name_desc": "Nome do aplicativo, como mostrado no Moonlight",
"applications_desc": "Aplicações só são atualizadas quando o Cliente for reiniciado",
"applications_title": "Aplicações",
"auto_detach": "Continue transmitindo se o aplicativo fechar rapidamente",
"auto_detach_desc": "Isso tentará detectar automaticamente aplicativos de tipo launcher que fecham rapidamente após a inicialização de outro programa ou instância de si mesmos. Quando um aplicativo de tipo launcher é detectado, ele é tratado como um aplicativo destacado.",
"cmd": "Comando",
"cmd_desc": "O aplicativo principal a ser iniciado. Se em branco, nenhum aplicativo será iniciado.",
"cmd_note": "Se o caminho para o comando conter espaços, você deve colocá-lo entre aspas.",
"cmd_prep_desc": "Uma lista de comandos a serem executados antes / depois desta aplicação. Se algum dos comandos de predefinição falhar, iniciar o aplicativo é abortado.",
"cmd_prep_name": "Preparações do Comando",
"covers_found": "Capas encontradas",
"delete": "excluir",
"detached_cmds": "Comandos desanexados",
"detached_cmds_add": "Adicionar Comando Desanexado",
"detached_cmds_desc": "Uma lista de comandos a serem executados em segundo plano.",
"detached_cmds_note": "Se o caminho para o comando conter espaços, você deve colocá-lo entre aspas.",
"edit": "Alterar",
"env_app_id": "ID do aplicativo",
"env_app_name": "Nome do aplicativo",
"env_client_audio_config": "A configuração de áudio solicitada pelo cliente (2.0/5.1/7.1)",
"env_client_enable_sops": "O cliente solicitou a opção de otimizar o jogo para uma transmissão ideal (verdadeiro/falso)",
"env_client_fps": "O FPS solicitado pelo cliente (int)",
"env_client_gcmap": "A máscara de gamepad solicitada, em formato bitset/bitfield (int)",
"env_client_hdr": "O HDR está ativado pelo cliente (verdadeiro/falso)",
"env_client_height": "A altura solicitada pelo cliente (int)",
"env_client_host_audio": "O cliente solicitou áudio de host (verdadeiro/falso)",
"env_client_width": "A largura solicitada pelo cliente (int)",
"env_displayplacer_example": "Exemplo - displayplacer para Automação de Resolução:",
"env_qres_example": "Exemplo - QRes para Automação de Resolução:",
"env_qres_path": "Caminho das configurações rápidas",
"env_var_name": "Nome da Var",
"env_vars_about": "Sobre Variáveis de Ambiente",
"env_vars_desc": "Todos os comandos obtêm essas variáveis de ambiente por padrão:",
"env_xrandr_example": "Exemplo - Xrandr para Automação de Resolução:",
"exit_timeout": "Tempo Esgotado",
"exit_timeout_desc": "Número de segundos para esperar que todos os processos do aplicativo saiam graciosamente quando solicitado a sair. Se não definido, o padrão é esperar até 5 segundos. Se definido como zero ou negativo, o aplicativo será encerrado imediatamente.",
"find_cover": "Encontrar capa",
"global_prep_desc": "Ativar/desativar a execução de comandos de preparação global para este aplicativo.",
"global_prep_name": "Comandos de Preparação Global",
"image": "Imagem:",
"image_desc": "Caminho da aplicação icon/imagem/imagem que será enviado para o cliente. Imagem deve ser um arquivo PNG. Se não estiver definido, Sunshine irá enviar a imagem da caixa padrão.",
"loading": "Carregandochar@@0",
"name": "Nome:",
"output_desc": "O arquivo onde a saída do comando é armazenada, se não for especificado, a saída é ignorada",
"output_name": "Saída",
"run_as_desc": "Isto pode ser necessário para que alguns aplicativos que requerem permissões de administrador sejam executados corretamente.",
"wait_all": "Continue transmitindo até que todos os processos de app saiam",
"wait_all_desc": "Isso continuará transmitindo até que todos os processos iniciados pelo aplicativo tenham sido encerrados. Quando desmarcado, a transmissão será interrompida quando o processo inicial do aplicativo terminar, mesmo que outros processos de aplicativo ainda estejam em execução.",
"working_dir": "Diretório de trabalho",
"working_dir_desc": "O diretório de trabalho que deve ser passado para o processo. Por exemplo, alguns aplicativos usam o diretório de trabalho para procurar arquivos de configuração. Se não estiver definido, o Sunshine será o padrão para o diretório pai do comando"
},
"config": {
"adapter_name": "Nome do adaptador",
"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",
"add": "Adicionar",
"address_family": "Família de endereços",
"address_family_both": "IPv6 + IPv6",
"address_family_desc": "Definir a família de endereços usada pelo Sunshine",
"address_family_ipv4": "Apenas IPv4",
"always_send_scancodes": "Sempre enviar Scancodes",
"always_send_scancodes_desc": "O envio de códigos de verificação melhora a compatibilidade com jogos e aplicativos, mas pode resultar em uma entrada incorreta de teclado de certos clientes que não estão usando um layout de teclado inglês dos EUA. Habilitar se a entrada de teclado não estiver funcionando em certas aplicações. Desative se as chaves no cliente estão gerando a entrada errada no host.",
"amd_coder": "Codificador AMF (H264)",
"amd_coder_desc": "Permite que você selecione a codificação entropia para priorizar a qualidade ou a velocidade de codificação. Somente H.264.",
"amd_enforce_hrd": "Aplicação de Decodificador de Referência Hipotetica (HRD) AMF",
"amd_enforce_hrd_desc": "Aumenta as restrições de controle de taxa para atender aos requisitos do modelo de hash. Isso reduz consideravelmente os transbordos de bitrato, mas pode causar a codificação de artefatos ou uma redução de qualidade em certas cartas.",
"amd_preanalysis": "Pré-análise AMF",
"amd_preanalysis_desc": "Isto permite a pré-análise de controle, que pode aumentar a qualidade em detrimento de uma maior latência de codificação.",
"amd_quality": "Qualidade AMF",
"amd_quality_balanced": "Balanceado - balanceado (padrão)",
"amd_quality_desc": "Isto controla o equilíbrio entre a velocidade de codificação e a qualidade.",
"amd_quality_group": "Configurações de qualidade AMF",
"amd_quality_quality": "qualidade -- preferir qualidade",
"amd_quality_speed": "velocidade -- preferir velocidade",
"amd_rc": "Controle de Taxa AMF",
"amd_rc_cbr": "cbr -- taxa de bits constante (padrão)",
"amd_rc_cqp": "cqp -- modo qp constante",
"amd_rc_desc": "Isto controla o método de controle da taxa para garantir que não estamos a exceder o alvo da taxa de bits do cliente. 'cqp' não é adequado para segmentação de taxa de bits e outras opções além de 'vbr_latency' dependem da aplicação HRD para ajudar a restringir os fluxos de taxa de bits.",
"amd_rc_group": "Configurações de controle de taxa AMF",
"amd_rc_vbr_latency": "latência vbr_ency -- taxa de bits com restrição de latência",
"amd_rc_vbr_peak": "vbr_pico -- pico de taxa de bits variável restrita",
"amd_usage": "Uso do AMF",
"amd_usage_desc": "Isso define o perfil de codificação base. Todas as opções apresentadas abaixo substituirão um subconjunto do perfil de uso, mas há configurações ocultas adicionais aplicadas que não podem ser configuradas em outro lugar.",
"amd_usage_lowlatency": "baixa latência - baixa latência (mais rápido)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - baixa latência, alta qualidade (rápido)",
"amd_usage_transcoding": "transcodificação -- transcodificando (mais lento)",
"amd_usage_ultralowlatency": "ultralowlatência - latência ultra baixa (mais rápida)",
"amd_usage_webcam": "webcam -- câmera (lenta)",
"amd_vbaq": "Variação da Variação Baseada na Quantização Adaptativa (VBAQ)",
"amd_vbaq_desc": "O sistema visual humano é tipicamente menos sensível a artefatos em áreas altamente texturadas. No modo VBAQ, a variação de pixel é usada para indicar a complexidade das texturas espaciais, permitindo que o codificador aloce mais bits em áreas mais suaves. Habilitar este recurso leva a melhorias na qualidade visual subjetiva com algum conteúdo.",
"apply_note": "Clique em 'Aplicar' para reiniciar o Sunshine e aplicar as alterações. Isto encerrará todas as sessões em execução.",
"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_placeholder_macos": "BlackHole 2ch",
"audio_sink_placeholder_win": "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",
"av1_mode_2": "O Sunshine anunciará o suporte para o perfil AV1 de 8 bits",
"av1_mode_3": "A luz do sol anunciará o suporte para os perfis AV1 (8-bit principal) e de 10 bits (HDR)",
"av1_mode_desc": "Permite ao cliente solicitar fluxos de vídeo AV1 principal de 8 bits ou de 10 bits. AV1 usa mais CPU para codificar, então permite que isso reduza o desempenho ao usar a codificação do software.",
"back_button_timeout": "Tempo de Emulação do Botão Home/Guia",
"back_button_timeout_desc": "Se o botão Voltar / Selecionar for mantido pressionado para o número especificado de milissegundos, um botão Home/Guia será pressionado. Se definido como um valor < 0 (padrão), segurar o botão Voltar/Selecionar não irá simular o botão Home/Guia.",
"capture": "Forçar um Método de Captura Específica",
"capture_desc": "Modo automático Sunshine usará o primeiro que funciona. NvFBC requer drivers nvidia corrigidos.",
"cert": "Certificado",
"cert_desc": "O certificado usado para a interface do usuário da web e o pareamento do cliente Moonlight. Para a melhor compatibilidade, isso deve ter uma chave pública RSA-2048.",
"channels": "Máximo de Clientes Conectados",
"channels_desc_1": "Sunshine pode permitir que uma única sessão de streaming seja compartilhada com vários clientes simultaneamente.",
"channels_desc_2": "Alguns codificadores de hardware podem ter limitações que reduzem o desempenho com vários fluxos.",
"coder_cabac": "cabac -- contexto adaptável de programação aritmética binária - qualidade superior",
"coder_cavlc": "cavlc -- código adaptável de comprimento de variável de contexto - decodificação mais rápida",
"configuration": "Configuração",
"controller": "Enable Gamepad Input",
"controller_desc": "Permite que os convidados controlem o sistema de host com controle / controle do gamepad",
"credentials_file": "Arquivo de credenciais",
"credentials_file_desc": "Armazenar Usuário/Senha separadamente do arquivo de estado da Sunshine.",
"ds4_back_as_touchpad_click": "Mapear Voltar/Selecionar para o Touchpad Clique",
"ds4_back_as_touchpad_click_desc": "Ao forçar a emulação do DS4, selecione um Voltar/Selecione para o Touchpad Clique",
"encoder": "Forçar um Codificador Específico",
"encoder_desc": "Força um codificador específico, caso contrário, Sunshine selecionará a melhor opção disponível. Nota: Se você especificar um codificador de hardware no Windows, ele deve coincidir com a GPU onde a tela está conectada.",
"encoder_software": "Software",
"external_ip": "IP externo",
"external_ip_desc": "Se nenhum endereço IP externo for dado, Sunshine detectará automaticamente IP externo",
"fec_percentage": "Porcentagem FEC",
"fec_percentage_desc": "Porcentagem de erro corrigindo pacotes por pacote de dados em cada quadro de vídeo. Valores mais altos podem corrigir para mais perda de pacotes de rede, mas ao custo de aumentar o uso de largura de banda.",
"ffmpeg_auto": "auto -- let ffmpeg decide (padrão)",
"file_apps": "Arquivo de apps",
"file_apps_desc": "O arquivo onde os aplicativos atuais de Sunshine são armazenados.",
"file_state": "Arquivo de estado",
"file_state_desc": "O arquivo onde o estado atual de Sunshine é armazenado",
"fps": "FPS anunciado",
"gamepad": "Tipo de controle emulado",
"gamepad_auto": "Opções de seleção automáticas",
"gamepad_desc": "Escolha qual tipo de controle será emulado no host",
"gamepad_ds4": "DS4 (PS4)",
"gamepad_manual": "Opções de DS4 manual",
"gamepad_x360": "X360 (Xbox 360)",
"global_prep_cmd": "Preparações do Comando",
"global_prep_cmd_desc": "Configure uma lista de comandos a serem executados antes ou depois de executar qualquer aplicativo. Se algum dos comandos de preparação especificados falhar, o processo de lançamento do aplicativo será abortado.",
"hevc_mode": "Suporte ao HEVC",
"hevc_mode_0": "Sunshine anunciará suporte para o HEVC com base em recursos de codificador (recomendado)",
"hevc_mode_1": "O sol não anunciará o suporte ao HEVC",
"hevc_mode_2": "O sol anunciará o suporte para o perfil principal do HEVC",
"hevc_mode_3": "A luz do sol anunciará o suporte para os perfis HEVC Main e Main10 (HDR)",
"hevc_mode_desc": "Permite ao cliente solicitar fluxos de vídeo HEVC principal ou HEVC Main10. HEVC é mais intenso em CPU para codificar, então permitir que isso possa reduzir o desempenho ao usar a codificação do software.",
"high_resolution_scrolling": "Suporte a Alta Resolução",
"high_resolution_scrolling_desc": "Quando habilitado, o Sunshine irá passar através de eventos de rolagem de alta resolução a partir de clientes de luz Lunar. Isso pode ser útil para desativar para aplicativos mais antigos que rolam muito rápido com eventos de rolagem de alta resolução.",
"install_steam_audio_drivers": "Instalar drivers de áudio Steam",
"install_steam_audio_drivers_desc": "Se o Steam estiver instalado, isso irá instalar automaticamente o driver de Alto-falantes de Streaming do Steam para suportar o som Surround 5.1/7.1 e silenciar o áudio do host.",
"key_repeat_delay": "Atraso da repetição da chave",
"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_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",
"lan_encryption_mode": "Modo de Criptografia LAN",
"lan_encryption_mode_1": "Habilitado para clientes suportados",
"lan_encryption_mode_2": "Obrigatório para todos os clientes",
"lan_encryption_mode_desc": "Isso determina quando a criptografia será usada no streaming em sua rede local. A criptografia pode reduzir o desempenho do streaming, particularmente em hosts e clientes menos poderosos.",
"locale": "Localidade",
"locale_desc": "A localidade usada para a interface de usuário do Sunshine.",
"log_level": "Nível do Registro",
"log_level_0": "Verbose",
"log_level_1": "Debug",
"log_level_2": "Informações",
"log_level_3": "ATENÇÃO",
"log_level_4": "ERRO",
"log_level_5": "Fatal",
"log_level_6": "Nenhuma",
"log_level_desc": "O nível mínimo de log impresso no padrão",
"log_path": "Caminho do Logfile",
"log_path_desc": "O arquivo onde os logs atuais de Sunshine são armazenados.",
"min_threads": "Contagem mínima de tópicos da CPU",
"min_threads_desc": "Aumentar o valor reduz ligeiramente a eficiência da codificação, mas a troca geralmente vale a pena para ganhar o uso de mais núcleos da CPU para codificação. O valor ideal é o mais baixo que pode codificar, de forma confiável, as configurações de streaming desejadas no seu hardware.",
"misc": "Opções diversas",
"motion_as_ds4": "Emular um gamepad DS4 se o cliente reportar sensores de movimento estiverem presentes",
"motion_as_ds4_desc": "Se desativado, os sensores de movimento não serão tidos em conta durante a seleção de tipo gamepad",
"mouse": "Habilitar Entrada do Mouse",
"mouse_desc": "Permite aos convidados controlar o sistema de host com o mouse",
"native_pen_touch": "Suporte nativo para Pen/Toque",
"native_pen_touch_desc": "Quando ativado, o Sunshine irá passar por eventos nativos de caneta/toque de clientes de lua. Isto pode ser útil para desativar aplicações mais antigas sem o suporte nativo ao canal/toque.",
"nvenc_h264_cavlc": "Preferir CAVLC ao CABAC no H.264",
"nvenc_h264_cavlc_desc": "Forma simples de codificação de entrope. CAVLC precisa de cerca de 10% mais bitrate para a mesma qualidade. Somente relevante para dispositivos de decodificação realmente antigos.",
"nvenc_latency_over_power": "Prefere latência de codificação inferior sobre economia de energia",
"nvenc_latency_over_power_desc": "O Sunshine solicita o máximo de velocidade de relógio com GPU durante a transmissão, para reduzir a latência de codificação. Desativação não é recomendado, uma vez que isso pode levar a um aumento significativo da latência de codificação.",
"nvenc_opengl_vulkan_on_dxgi": "Apresentar OpenGL/Vulkan em cima de DXGI",
"nvenc_opengl_vulkan_on_dxgi_desc": "O Sunshine não pode capturar programas OpenGL e Vulkan de tela cheia a uma taxa de quadros completa, a menos que eles apresentem em cima do DXGI. Essa configuração é de todo o sistema que é revertida na saída sunshine do programa.",
"nvenc_preset": "Predefinição de desempenho",
"nvenc_preset_1": "(mais rápido, padrão)",
"nvenc_preset_7": "(mais lento)",
"nvenc_preset_desc": "Valores maiores melhoram a compressão (qualidade em taxa de bits dada) ao custo de maior latência de codificação. Recomendado para mudar apenas quando limitado por rede ou descodificador, caso contrário, o efeito semelhante pode ser alcançado aumentando a taxa de bits.",
"nvenc_realtime_hags": "Use prioridade em tempo real em agendamento de gpu acelerado por hardware",
"nvenc_realtime_hags_desc": "Atualmente os motoristas da NVIDIA podem congelar no codificador quando o HAGS estiver ativado, a prioridade em tempo real é usada e a utilização da VRAM está próxima do máximo. Desabilitar esta opção reduz a prioridade ao alto, contornando o congelamento ao custo de desempenho reduzido quando a GPU está fortemente carregada.",
"nvenc_spatial_aq": "Spatial AQ",
"nvenc_spatial_aq_desc": "Atribuir valores mais elevados de QP a regiões planas do vídeo. Recomendado para permitir o streaming em taxas de bits mais baixas.",
"nvenc_spatial_aq_disabled": "Desativado (mais rápido, padrão)",
"nvenc_spatial_aq_enabled": "Ativado (mais lento)",
"nvenc_twopass": "Modo de duas passagens",
"nvenc_twopass_desc": "Adiciona passe de codificação preliminar. Isso permite detectar mais vetores de movimento, distribuir melhor a taxa de bits pelo quadro e aderir de forma mais rigorosa aos limites de bits. Desabilitar não é recomendado uma vez que isso pode levar a uma superação de bits ocasional e a perda de pacotes subsequentes.",
"nvenc_twopass_disabled": "Desativado (mais rápido, não recomendado)",
"nvenc_twopass_full_res": "Resolução completa (mais lento)",
"nvenc_twopass_quarter_res": "Resolução de trimestre (mais rápido, padrão)",
"nvenc_vbv_increase": "Porcentagem de VBV/HRD de Um-frame",
"nvenc_vbv_increase_desc": "Por padrão, o sunshine usa um simples frame VBV/HRD, o que significa que qualquer tamanho de quadro de vídeo codificado não é esperado exceder a bitrate solicitada dividida pela taxa de quadros solicitada. Relaxar esta restrição pode ser benéfico e agir como taxa de bits variável de baixa latência, mas também pode levar à perda de pacotes se a rede não tiver espaço de armazenamento para manipular espinhos de taxa de bits. O valor máximo aceito é 400, o que corresponde a 5x de aumento no limite máximo do quadro de vídeo codificado.",
"origin_web_ui_allowed": "Interface de Origem Web Permitida",
"origin_web_ui_allowed_desc": "A origem do endereço do endpoint remoto que não é negado o acesso à Web UI",
"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",
"ping_timeout": "Tempo limite",
"ping_timeout_desc": "Quanto tempo esperar em milissegundos por dados do luar antes de desligar o fluxo",
"pkey": "Chave Privada",
"pkey_desc": "A chave privada usada para a interface do usuário da web e o pareamento do cliente Moonlight. Para a melhor compatibilidade, esta deve ser uma chave privada RSA-2048.",
"port": "Porta",
"port_alert_1": "O sol não pode usar portas abaixo de 1024!",
"port_alert_2": "Portas acima de 65535 não estão disponíveis!",
"port_desc": "Definir a família dos portos usados pelo Sunshine",
"port_http_port_note": "Use esta porta para conectar com o Luar.",
"port_note": "Observação",
"port_port": "Porta",
"port_protocol": "Protocol",
"port_tcp": "TCP",
"port_udp": "UDP",
"port_warning": "Expor a interface da web à internet é um risco de segurança! Proceda por sua própria conta e risco!",
"port_web_ui": "Web UI",
"qp": "Parâmetro de Quantização",
"qp_desc": "Alguns dispositivos podem não suportar Taxa de Bits Constante. Para esses dispositivos, QP é usado. Valores maiores significam mais compressão, mas menos qualidade.",
"qsv_coder": "Programador QuickSync (H264)",
"qsv_preset": "QuickSync Preset",
"qsv_preset_fast": "rápido (baixa qualidade)",
"qsv_preset_faster": "mais rápido (menor qualidade)",
"qsv_preset_medium": "médio (padrão)",
"qsv_preset_slow": "lento (boa qualidade)",
"qsv_preset_slower": "mais lento (melhor qualidade)",
"qsv_preset_slowest": "mais lento (melhor qualidade)",
"qsv_preset_veryfast": "mais rápido (menor qualidade)",
"qsv_slow_hevc": "Permitir codificação lenta do HEVC",
"qsv_slow_hevc_desc": "Isto pode habilitar a codificação HEVC em GPUs mais antigas, ao custo de maior uso da GPU e pior desempenho.",
"res_fps_desc": "Os modos de exibição anunciados pelo Sol. Algumas versões do Moonlight, como Moonlight-nx (Switch), dependem destas listas para garantir que as resoluções e fugas solicitadas sejam apoiadas. Esta configuração não altera a forma como o fluxo de tela é enviado para o Moonlight.",
"resolutions": "Resoluções anunciadas",
"restart_note": "O sol está reiniciando para aplicar mudanças.",
"sunshine_name": "Nome do Sol",
"sunshine_name_desc": "O nome exibido pela luz da lua. Se não for especificado, o nome do host do PC é usado",
"sw_preset": "Predefinições SW",
"sw_preset_desc": "Otimize a troca entre a velocidade de codificação (quadros codificados por segundo) e a eficiência de compressão (qualidade por bit no bitstream). O padrão é super rápido.",
"sw_preset_fast": "rápido",
"sw_preset_faster": "mais rápido",
"sw_preset_medium": "Médio",
"sw_preset_slow": "devagar",
"sw_preset_slower": "lento",
"sw_preset_superfast": "super rápido (padrão)",
"sw_preset_ultrafast": "anular",
"sw_preset_veryfast": "veryfast",
"sw_preset_veryslow": "veryslow",
"sw_tune": "Ajuste SW",
"sw_tune_animation": "animação -- boa para desenhos; usa maior debargamento e mais quadros de referência",
"sw_tune_desc": "Ajuste as opções que são aplicadas após a predefinição. O padrão é zero.",
"sw_tune_fastdecode": "fastdecode -- permite uma decodificação mais rápida desabilitando certos filtros",
"sw_tune_film": "filme - usado para conteúdo de filmes de alta qualidade; reduz o deblocking",
"sw_tune_grain": "grãos - preserva a estrutura de grãos em material cinematográfico antigo e cinzento",
"sw_tune_stillimage": "ainda - bom para conteúdo parecido com a apresentação de slides",
"sw_tune_zerolatency": "zerolatência -- bom para codificação rápida e streaming de baixa latência (padrão)",
"touchpad_as_ds4": "Emule um gamepad DS4 se o cliente controla um touchpad estiver presente",
"touchpad_as_ds4_desc": "Se desativada, a presença de touchpad não será tida em conta durante a seleção de tipos de controle.",
"upnp": "UPNP",
"upnp_desc": "Configurar automaticamente o encaminhamento de portas para transmissão na Internet",
"virtual_sink": "Pia Virtual",
"virtual_sink_desc": "Especifique manualmente um dispositivo de áudio virtual para usar. Se não for definido, o dispositivo é escolhido automaticamente. Recomendamos fortemente deixar este campo em branco para usar a seleção automática de dispositivo!",
"virtual_sink_placeholder": "Alto-falantes de streaming Steam",
"vt_coder": "VideoToolbox Coder",
"vt_realtime": "Codificação em Tempo Real VideoToolbox",
"vt_software": "Codificação VideoToolbox Software",
"vt_software_allowed": "Permitido",
"vt_software_forced": "Forçado",
"wan_encryption_mode": "Modo de Criptografia WAN",
"wan_encryption_mode_1": "Habilitado para clientes suportados (padrão)",
"wan_encryption_mode_2": "Obrigatório para todos os clientes",
"wan_encryption_mode_desc": "Isso determina quando a criptografia será usada no streaming pela internet. A criptografia pode reduzir o desempenho do streaming, particularmente em hosts e clientes menos poderosos."
},
"index": {
"description": "O sol é um anfitrião de jogos auto-hospedado para o Moonlight.",
"download": "BAIXAR",
"loading_latest": "Carregando a última versão...",
"new_nightly": "Um novo <b>Nightly</b> versão está disponível!",
"new_stable": "Uma nova versão <b>Stable</b> está disponível!",
"startup_errors": "<b>Atenção!</b> A Sunshine detectou estes erros durante o arranque. Recomendamos <b>vivamente que</b> os corrija antes de transmitir.",
"version_dirty": "Obrigado por ajudar a fazer do sol um software melhor!",
"version_latest": "Você está executando a última versão do Sunshine",
"welcome": "Olá, Sunshine!"
},
"navbar": {
"applications": "Aplicações",
"configuration": "Configuração",
"home": "Residencial",
"password": "Mudar a senha",
"pin": "PIN",
"troubleshoot": "Solução de problemas"
},
"password": {
"confirm_password": "Confirmar senha",
"current_creds": "Credenciais atuais",
"new_creds": "Novas Credenciais",
"new_username_desc": "Se não for especificado, o nome de usuário não irá mudar",
"password_change": "Alteração de senha",
"success_msg": "A senha foi alterada com sucesso! Essa página será recarregada em breve, seu navegador irá pedir as novas credenciais."
},
"pin": {
"pair_failure": "Falha no pareamento: Verifique se o PIN é digitado corretamente",
"pair_success": "Sucesso! Por favor, verifique a Lua Lunar para continuar",
"pin_pairing": "PIN Pairing",
"send": "Mandar",
"warning_msg": "Certifique-se de que você tem acesso ao cliente com o qual está emparelhando. Este software pode dar controle total ao seu computador, então tenha cuidado!"
},
"resource_card": {
"github_discussions": "GitHub Discussions",
"legal": "Informações",
"legal_desc": "Ao continuar a usar este software, você concorda com os termos e condições nos seguintes documentos.",
"license": "Tipo:",
"lizardbyte_website": "Portal LizardByte",
"resources": "Recursos",
"resources_desc": "Recursos para luz solar!",
"third_party_notice": "Aviso de terceiros"
},
"troubleshooting": {
"force_close": "Forçar fechamento",
"force_close_desc": "Se o Moonlight reclamar de um aplicativo em execução, forçar o fechamento do aplicativo deve resolver o problema.",
"force_close_error": "Erro ao fechar o aplicativo",
"force_close_success": "Aplicativo fechado com sucesso!",
"logs": "Registros",
"logs_desc": "Veja os logs carregados por Sunshine",
"logs_find": "Localizar...",
"restart_sunshine": "Reiniciar o Sunshine",
"restart_sunshine_desc": "Se o sol não estiver funcionando corretamente, você pode tentar reiniciá-lo. Isso encerrará todas as sessões em execução.",
"restart_sunshine_success": "A luz do sol está reiniciando",
"troubleshooting": "Solução de problemas",
"unpair_all": "Desconectar todos",
"unpair_all_desc": "Remova todos os seus dispositivos pareados",
"unpair_all_error": "Erro ao desemparelhar",
"unpair_all_success": "Desemparelhado com sucesso!"
},
"welcome": {
"confirm_password": "Confirmar a senha",
"create_creds": "Antes de começar, precisamos que você crie um novo nome de usuário e senha para acessar a interface da web.",
"create_creds_alert": "As credenciais abaixo são necessárias para acessar a interface da Web do Sunshine. Mantenha-as seguras, já que você nunca vai vê-las novamente!",
"greeting": "Bem-vindo ao Sol!",
"login": "Conectar-se",
"welcome_success": "Esta página será recarregada em breve, seu navegador irá pedir novas credenciais"
}
}

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Всегда отправлять коды",
"always_send_scancodes_desc": "Отправка scancodes улучшает совместимость с играми и приложениями, но может привести к неправильному вводу клавиатуры от некоторых клиентов, которые не используют американскую клавиатуру. Включите, если ввод клавиатуры вообще не работает в некоторых приложениях. Отключено, если ключи на клиенте генерируют неправильный входной параметр на хосте.",
"amd_coder": "AMF Coder (H264)",
"amd_coder_desc": "Позволяет выбрать энтропическую кодировку для приоритизации скорости или качества кодирования. H.264 только.",
"amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement",
"amd_enforce_hrd_desc": "Увеличивает ограничения на контроль за скоростью для удовлетворения требований модели HRD. Это значительно снижает переполнение битрейта, но может вызвать кодировку артефактов или уменьшить качество на некоторых картах.",
"amd_preanalysis": "Предварительный анализ AMF",
"amd_preanalysis_desc": "Это позволяет проводить предварительный анализ скорости управления, который может повысить качество за счет увеличения задержки кодирования.",
"amd_quality": "Качество AMF",
"amd_quality_balanced": "сбалансированный -- сбалансированный (по умолчанию)",
"amd_quality_desc": "Это определяет баланс между скоростью кодирования и качеством.",
"amd_quality_group": "Настройки качества AMF",
"amd_quality_quality": "качество -- предпочитаемое качество",
"amd_quality_speed": "скорость - скорость отдачи",
"amd_rc": "Контроль скорости AMF",
"amd_rc_cbr": "cbr -- постоянный битрейт",
"amd_rc_cqp": "cqp -- постоянный режим qp",
"amd_rc_desc": "Это контролирует способ контроля тарифов, чтобы убедиться, что мы не превысили цели битрейта клиента. 'cqp' не подходит для таргетинга битрейта, а другие параметры помимо 'vbr_latency' зависят от соблюдения HRD Enforcement для ограничения переполнения битрейта.",
"amd_rc_group": "Настройки контроля скорости AMF",
"amd_rc_vbr_latency": "vbr_latency -- Задержка ограничивает битрейт (по умолчанию)",
"amd_rc_vbr_peak": "vbr_peak -- пиковый ограниченный битрейт",
"amd_usage": "Использование AMF",
"amd_usage_desc": "Определяет базовую кодировку профиля. Все параметры, представленные ниже, переопределят поднабор пользовательского профиля, но есть дополнительные скрытые настройки, которые не могут быть настроены в другом месте.",
"amd_usage_lowlatency": "низкая задержка - низкая задержка (быстро)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - низкая задержка, высокое качество (быстро)",
"amd_usage_transcoding": "перекодирование -- перекодирование (медленно)",
"amd_usage_ultralowlatency": "ультразвуковая задержка - ультра низкая задержка (быстрый)",
"amd_usage_webcam": "веб-камера -- веб-камера (медленно)",
"amd_vbaq": "Адаптивное квантование на основе отклонений AMF (VBAQ)",
"amd_vbaq_desc": "Как правило, визуальная система человека менее чувствительна к артефактам в особо текстурированных районах. В режиме VBAQ отклонение пикселей используется для обозначения сложности пространственной текстуры, что позволяет кодировщику выделять больше битов для более плавности зон. Включение этой функции приводит к улучшению субъективного качества зрения с некоторым содержимым.",
"apply_note": "Нажмите 'Применить', чтобы перезапустить Sunshine и применить изменения. Все запущенные сессии будут завершены.",
"audio_sink": "Снимок звука",
"audio_sink_desc_linux": "Название звуковой сигнала, используемой для аудиоциклов. Если эта переменная не указана, пульс будет выбирать стандартное устройство монитора. Вы можете найти название звуковой раковины, используя либо команду:",

View File

@@ -92,24 +92,33 @@
"always_send_scancodes": "Skicka alltid sökkoder",
"always_send_scancodes_desc": "Att skicka skanningskoder förbättrar kompatibiliteten med spel och appar men kan resultera i felaktig tangentbordsinmatning från vissa klienter som inte använder en amerikansk engelsk tangentbordslayout. Aktivera om tangentbordsinmatningen inte fungerar alls i vissa program. Inaktivera om nycklar på klienten genererar fel indata på värden.",
"amd_coder": "AMF-kod (H264)",
"amd_coder_desc": "Låter dig välja entropi-kodning för att prioritera kvalitet eller kodningshastighet. H.264 endast.",
"amd_enforce_hrd": "AMF Hypotetisk referensavkodare (HRD) verkställighet",
"amd_enforce_hrd_desc": "Ökar begränsningarna för hastighetskontroll för att uppfylla kraven i HRD-modellen. Detta minskar kraftigt bithastighetsöverflöden, men kan orsaka kodning artefakter eller minskad kvalitet på vissa kort.",
"amd_preanalysis": "AMF Föranalys",
"amd_preanalysis_desc": "Detta möjliggör föranalys av hastighetskontroll, vilket kan öka kvaliteten på bekostnad av ökad kodningstid.",
"amd_quality": "AMF Kvalitet",
"amd_quality_balanced": "balanced -- balanserad (standard)",
"amd_quality_desc": "Detta styr balansen mellan kodningshastighet och kvalitet.",
"amd_quality_group": "AMF Kvalitetsinställningar",
"amd_quality_quality": "kvalitet föredra kvalitet",
"amd_quality_speed": "speed -- föredra hastighet",
"amd_rc": "AMF Rate kontroll",
"amd_rc_cbr": "cbr konstant bithastighet",
"amd_rc_cqp": "cqp konstant qp-läge",
"amd_rc_desc": "Detta styr metoden för att säkerställa att vi inte överskrider klientens bithastighetsmål. 'cqp' är inte lämplig för bitrate targeting, och andra alternativ förutom 'vbr_latency' beror på HRD Enforcement för att begränsa bitrate overflows.",
"amd_rc_group": "Inställningar för AMF Rate",
"amd_rc_vbr_latency": "vbr_latency fördröjningsbegränsad variabelbithastighet (standard)",
"amd_rc_vbr_peak": "vbr_peak peak constrained variabelbithastighet",
"amd_usage": "AMF användning",
"amd_usage_desc": "Detta ställer in grundkodningsprofilen. Alla alternativ som presenteras nedan kommer att åsidosätta en delmängd av användarprofilen, men det finns ytterligare dolda inställningar som inte kan konfigureras någon annanstans.",
"amd_usage_lowlatency": "låg latens - låg latens (snabb)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality - låg latens, hög kvalitet (snabb)",
"amd_usage_transcoding": "transcoding Omkodning (långsammare)",
"amd_usage_ultralowlatency": "ultralowlatens - extremt låg latens (snabbast)",
"amd_usage_webcam": "webcam webbkamera (långsam)",
"amd_vbaq": "AMF Variansbaserad adaptiv kvantisering (VBAQ)",
"amd_vbaq_desc": "Det mänskliga visuella systemet är typiskt mindre känsligt för artefakter i mycket texturerade områden. I VBAQ läge används pixelvarians för att indikera komplexiteten i rumsliga texturer, vilket gör att kodaren kan allokera fler bitar till jämnare områden. Att aktivera denna funktion leder till förbättringar i subjektiv visuell kvalitet med lite innehåll.",
"apply_note": "Klicka på \"Tillämpa\" för att starta om solsken och tillämpa ändringar. Detta kommer att avsluta alla pågående sessioner.",
"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:",

View File

@@ -5,9 +5,9 @@
"autodetect": "自动检测(推荐)",
"cancel": "取消",
"disabled": "禁用",
"disabled_def": "禁用(默认",
"do_cmd": "执行命令",
"elevated": "权限提升",
"disabled_def": "禁用(默认)",
"do_cmd": "打开应用时执行命令",
"elevated": "提权运行",
"enabled": "启用",
"enabled_def": "启用(默认)",
"error": "错误!",
@@ -17,7 +17,7 @@
"save": "保存",
"see_more": "查看更多",
"success": "成功!",
"undo_cmd": "撤销命令",
"undo_cmd": "退出应用时执行命令",
"username": "用户名",
"warning": "警告!"
},
@@ -27,45 +27,45 @@
"add_new": "添加新应用",
"app_name": "应用名称",
"app_name_desc": "在 Moonlight 显示的应用名称",
"applications_desc": "只有重启客户端时应用才会被刷新",
"applications_desc": "只有重启客户端时应用列表才会被刷新",
"applications_title": "应用",
"auto_detach": "如果应用程序快速关闭,继续串流",
"auto_detach": "启动串流后应用突然关闭时不退出串流",
"auto_detach_desc": "这将尝试自动检测启动器类型的应用程序,这些应用程序会在启动另一个程序或自身实例后迅速关闭。当检测到启动器类型的应用程序时,它将被视为独立的应用程序。",
"cmd": "命令",
"cmd_desc": "要启动的主程序。如果为空,则不会启动任何应用程序。",
"cmd_desc": "要启动的主应用程序。如果为空,则不会启动任何应用程序。",
"cmd_note": "如果命令中可执行文件的路径包含空格,则必须用引号括起来。",
"cmd_prep_desc": "此应用运行前/后要运行的命令列表。如果任何前置命令失败,应用的启动过程将被中止。",
"cmd_prep_name": "命令准备工作",
"covers_found": "找到封面",
"cmd_prep_name": "启动/退出时执行命令",
"covers_found": "找到封面",
"delete": "删除",
"detached_cmds": "独立命令",
"detached_cmds_add": "添加独立命令",
"detached_cmds_desc": "要在后台运行的命令列表。",
"detached_cmds_note": "如果命令可执行文件的路径包含空格,必须引号括起来。",
"detached_cmds_note": "如果命令可执行文件的路径包含空格,必须引号里将其贴出。",
"edit": "编辑",
"env_app_id": "应用 ID",
"env_app_name": "应用名称",
"env_client_audio_config": "客户端请求的音频配置 (2.0/5.1/7.1)",
"env_client_enable_sops": "客户端请求自动更改游戏设置以实现最佳串流效果 (true/false)",
"env_client_fps": "客户请求的 FPS (int)",
"env_client_enable_sops": "客户端请求自动更改游戏设置以实现最佳串流效果 (布尔值)",
"env_client_fps": "客户请求的帧率(int)",
"env_client_gcmap": "客户端请求的游戏手柄掩码,采用 bitset/bitfield 格式 (int)",
"env_client_hdr": "客户端启用 HDR (true/false)",
"env_client_height": "客户端请求的高度 (int)",
"env_client_hdr": "HDR 已被客户端启用 (true/false)",
"env_client_height": "客户端请求的分辨率的高度(int值, 单位: 像素)",
"env_client_host_audio": "客户端请求在主机播放声音 (true/false)",
"env_client_width": "客户端请求的宽度 (int)",
"env_client_width": "客户端请求的分辨率的宽度(int值, 单位: 像素)",
"env_displayplacer_example": "示例 - 使用 displayplacer 自动更改分辨率:",
"env_qres_example": "示例 - 使用 QRes 自动更改分辨率:",
"env_qres_path": "QRes 路径",
"env_var_name": "变量名称",
"env_vars_about": "关于环境变量",
"env_vars_desc": "默认情况下,所有命令都会得到这些环境变量:",
"env_vars_desc": "默认情况下,以下的环境变量均可在上方调用",
"env_xrandr_example": "示例 - 使用 Xrandr 自动更改分辨率:",
"exit_timeout": "退出超时",
"exit_timeout_desc": "请求退出时,等待所有应用进程正常关闭的秒数。 如果未设置默认等待5秒钟。如果设置为零或负值应用程序将立即终止。",
"find_cover": "查找封面",
"global_prep_desc": "启用/禁用此应用程序的全局预处理命令。",
"global_prep_name": "全局预处理命令",
"image": "图片",
"image": "封面",
"image_desc": "发送到客户端的应用程序图标/图片/图像的路径。图片必须是 PNG 文件。如果未设置Sunshine 将发送默认图片。",
"loading": "加载中...",
"name": "名称",
@@ -92,24 +92,33 @@
"always_send_scancodes": "总是发送键盘扫描码",
"always_send_scancodes_desc": "发送键盘扫描码可增强与游戏和应用程序的兼容性,但可能会导致某些不使用美式英语键盘布局的客户端键盘输入不正确。如果键盘输入在某些应用程序中完全不工作,请启用。如果客户端上的按键在主机上产生错误输入,则禁用。",
"amd_coder": "AMF 编码器 (H264)",
"amd_coder_desc": "允许您选择用于优先质量或编码速度的缠绕编码。 H.264。",
"amd_enforce_hrd": "AMF 推测参考解码器 (HRD)",
"amd_enforce_hrd_desc": "提高对费率控制的限制,以满足人力资源开发模式的要求。 这大大减少了比特率过量流量,但可能导致编码伪影或降低某些卡片的质量。",
"amd_preanalysis": "AMF 预分析",
"amd_preanalysis_desc": "这使得能够进行比率控制预分析,这可能会以增加编码延迟为代价提高质量。",
"amd_quality": "AMF 质量",
"amd_quality_balanced": "balanced -- 平衡(默认)",
"amd_quality_desc": "这将控制编码速度和质量之间的平衡。",
"amd_quality_group": "AMF 质量设置",
"amd_quality_quality": "quality -- 偏好质量",
"amd_quality_speed": "speed -- 偏好速度",
"amd_rc": "AMF 率控制",
"amd_rc": "AMF 率控制",
"amd_rc_cbr": "cbr -- 恒定比特率(默认)",
"amd_rc_cqp": "cqp -- 恒定 QP 模式",
"amd_rc_desc": "这将控制费率控制方法,以确保我们不超过客户端比特率目标。 “cqp”不适合于比特率定位除“vbr_latency”之外的其他选项依赖于人力资源开发的执行来帮助抑制比特率过多。",
"amd_rc_group": "AMF 费率控制设置",
"amd_rc_vbr_latency": "vbr_latency -- 受延迟限制的可变比特率",
"amd_rc_vbr_peak": "vbr_peak -- 受峰值限制的可变比特率",
"amd_usage": "AMF 使用",
"amd_usage": "AMF 工作模式",
"amd_usage_desc": "设置基本编码配置文件。 以下列出的所有选项将覆盖使用情况简介的子集,但是应用到了其他不可配置的隐藏设置。",
"amd_usage_lowlatency": "lowlatency -- 低延迟(最快)",
"amd_usage_lowlatency_high_quality": "lowlatency_high_quality -- 低延迟、高质量(快速)",
"amd_usage_transcoding": "transcoding -- 转码(最慢)",
"amd_usage_ultralowlatency": "ultralowlatency -- 超低延迟(最快)",
"amd_usage_webcam": "webcam -- 网络摄像头(慢)",
"amd_vbaq": "AMF 基于方差的自适应量化 (VBAQ)",
"amd_vbaq_desc": "人的视觉系统通常对高成形地区的艺术品不太敏感。 在 VBAQ 模式下,像素差异用于表示空间纹理的复杂性,使编码器能够将更多的比特分配给较平的区域。 启用此功能可提高主观视觉品质及一些内容。",
"apply_note": "点击“应用”重启 Sunshine 并应用更改。这将终止任何正在运行的会话。",
"audio_sink": "音频输出设备",
"audio_sink_desc_linux": "手动指定需要抓取的音频输出设备。如果您没有指定此变量PulseAudio 将选择默认监测设备。 您可以使用以下任何命令找到音频输出设备的名称:",
@@ -137,7 +146,7 @@
"configuration": "配置",
"controller": "启用游戏手柄输入",
"controller_desc": "允许客户端使用游戏手柄控制主机系统",
"credentials_file": "凭据文件",
"credentials_file": "登录凭据文件",
"credentials_file_desc": "将用户名/密码与 Sunshine 的状态文件分开保存。",
"ds4_back_as_touchpad_click": "映射回/选择触摸板点击",
"ds4_back_as_touchpad_click_desc": "强制使用 DS4 仿真时,地图返回/选择触摸板点击",
@@ -146,12 +155,12 @@
"encoder_software": "软件编码",
"external_ip": "外部 IP",
"external_ip_desc": "如果没有指定外部 IP 地址Sunshine 将自动检测外部 IP",
"fec_percentage": "FEC 百分比",
"fec_percentage": "FEC (前向纠错) 参数",
"fec_percentage_desc": "每个视频帧中的错误纠正数据包百分比。较高的值可纠正更多的网络数据包丢失,但代价是增加带宽使用量。",
"ffmpeg_auto": "auto -- 由 ffmpeg 决定(默认)",
"file_apps": "应用程序文件",
"file_apps": "应用程序配置文件",
"file_apps_desc": "Sunshine 保存应用程序配置的文件。",
"file_state": "状态文件",
"file_state": "实时状态文件",
"file_state_desc": "Sunshine 保存当前状态的文件",
"fps": "通告 FPS",
"gamepad": "模拟游戏手柄类型",
@@ -165,10 +174,10 @@
"hevc_mode": "HEVC 支持",
"hevc_mode_0": "Sunshine 将根据编码器能力通告对 HEVC 的支持(推荐)",
"hevc_mode_1": "Sunshine 将不会通告对 HEVC 的支持",
"hevc_mode_2": "Sunshine 将通告 HEVC Main 配置支持",
"hevc_mode_2": "Sunshine 将HEVC 主配置文件做广告支持",
"hevc_mode_3": "Sunshine 将通告 HEVC Main 和 Main10 (HDR) 配置支持",
"hevc_mode_desc": "允许客户端请求 HEVC Main 或 HEVC Main10 视频流。HEVC 的编码对 CPU 的要求较高,因此在使用软件编码时,启用此功能可能会降低性能。",
"high_resolution_scrolling": "高分辨率滚动支持",
"high_resolution_scrolling": "高分辨率鼠标滚动支持",
"high_resolution_scrolling_desc": "启用后Sunshine 将透传来自 Moonlight 客户端的高分辨率滚动事件。对于那些使用高分辨率滚动事件时滚动速度过快的旧版应用程序来说,禁用此功能非常有用。",
"install_steam_audio_drivers": "安装 Steam 音频驱动程序",
"install_steam_audio_drivers_desc": "如果安装了 Steam则会自动安装 Steam Streaming Speakers 驱动程序,以支持 5.1/7.1 环绕声和主机音频静音。",
@@ -197,7 +206,7 @@
"log_level_desc": "打印到标准输出的最小日志级别",
"log_path": "日志文件路径",
"log_path_desc": "Sunshine 当前日志存储的文件。",
"min_threads": "最CPU 线程数",
"min_threads": "最CPU 线程数",
"min_threads_desc": "提高该值会略微降低编码效率,但为了获得更多的 CPU 内核用于编码,通常是值得的。理想值是在您的硬件配置上以所需的串流设置进行可靠编码的最低值。",
"misc": "杂项选项",
"motion_as_ds4": "如果客户端报告游戏手柄存在陀螺仪,则模拟一个 DS4 游戏手柄",
@@ -265,7 +274,7 @@
"qsv_preset_slower": "slower - 更慢(更高质量)",
"qsv_preset_slowest": "slowest - 最慢(最高质量)",
"qsv_preset_veryfast": "veryfast - 最快 (最低质量)",
"qsv_slow_hevc": "允许较慢的 HEVC 编码",
"qsv_slow_hevc": "允许慢速 HEVC 编码",
"qsv_slow_hevc_desc": "这可以在较旧的 Intel GPU 上启用 HEVC 编码,但代价是 GPU 占用率更高,性能更差。",
"res_fps_desc": "由 Sunshine 通告的显示模式。 某些版本的 Moonlight如 Moonlight-nx (Switch),依靠这些清单来确保支持所请求的分辨率和 fps。 此设置不会改变屏幕串流送至 Moonlight 的方式。",
"resolutions": "通告分辨率",
@@ -331,7 +340,7 @@
"confirm_password": "确认密码",
"current_creds": "当前账户信息",
"new_creds": "新的账户信息",
"new_username_desc": "如果未指定,用户名将不会更改",
"new_username_desc": "如果不输入新的用户名, 用户名将保持不变",
"password_change": "密码更改",
"success_msg": "密码已成功更改!此页面即将重新加载,您的浏览器将要求您输入新的账户信息。"
},
@@ -353,7 +362,7 @@
"third_party_notice": "第三方声明"
},
"troubleshooting": {
"force_close": "强制关闭",
"force_close": "强制结束运行",
"force_close_desc": "如果 Moonlight 抱怨某个应用正在运行,强制关闭该应用应该可以解决问题。",
"force_close_error": "关闭应用时出错",
"force_close_success": "应用关闭成功!",
@@ -365,7 +374,7 @@
"restart_sunshine_success": "Sunhine 正在重启",
"troubleshooting": "故障排除",
"unpair_all": "全部取消配对",
"unpair_all_desc": "删除您所有配对的设备",
"unpair_all_desc": "删除您所有已经配对的设备",
"unpair_all_error": "取消配对时出错",
"unpair_all_success": "取消配对成功!"
},

View File

@@ -116,6 +116,7 @@
import { createApp } from 'vue'
import i18n from './locale.js'
import Navbar from './Navbar.vue'
import fetch from './fetch.js'
const app = createApp({
components: {

View File

@@ -55,6 +55,8 @@
import { createApp } from "vue"
import i18n from './locale.js'
import ResourceCard from './ResourceCard.vue'
import fetch from './fetch.js'
let app = createApp({
components: {

View File

@@ -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

1
third-party/jwt-cpp vendored Submodule

Submodule third-party/jwt-cpp added at 08bcf77a68

View File

@@ -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

View File

@@ -47,6 +47,7 @@ export default defineConfig({
input: {
apps: resolve(assetsSrcPath, 'apps.html'),
config: resolve(assetsSrcPath, 'config.html'),
login: resolve(assetsSrcPath, 'login.html'),
index: resolve(assetsSrcPath, 'index.html'),
password: resolve(assetsSrcPath, 'password.html'),
pin: resolve(assetsSrcPath, 'pin.html'),