mirror of
https://github.com/LizardByte/Sunshine.git
synced 2025-08-10 00:52:16 +00:00
Compare commits
13 Commits
ci/homebre
...
build/wind
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
392499294a | ||
|
|
ef5253a61d | ||
|
|
0bdc9188c3 | ||
|
|
ae1ee8fb45 | ||
|
|
5e049e3c61 | ||
|
|
9effeba5fe | ||
|
|
3092471be5 | ||
|
|
9c08c75a44 | ||
|
|
8ca976f2d0 | ||
|
|
2ca2ea435f | ||
|
|
7b873e9ea4 | ||
|
|
8f6cd37a62 | ||
|
|
1a5f5e59de |
182
.github/workflows/CI.yml
vendored
182
.github/workflows/CI.yml
vendored
@@ -524,6 +524,8 @@ jobs:
|
||||
rm '/usr/local/bin/idle3'
|
||||
rm '/usr/local/bin/idle3.12'
|
||||
rm '/usr/local/bin/idle3.13'
|
||||
rm '/usr/local/bin/pip3.12'
|
||||
rm '/usr/local/bin/pip3.13'
|
||||
rm '/usr/local/bin/pydoc3'
|
||||
rm '/usr/local/bin/pydoc3.12'
|
||||
rm '/usr/local/bin/pydoc3.13'
|
||||
@@ -533,7 +535,7 @@ jobs:
|
||||
rm '/usr/local/bin/python3-config'
|
||||
rm '/usr/local/bin/python3.12-config'
|
||||
rm '/usr/local/bin/python3.13-config'
|
||||
brew install python
|
||||
brew install python3
|
||||
|
||||
- name: Configure formula
|
||||
run: |
|
||||
@@ -624,26 +626,35 @@ jobs:
|
||||
token: ${{ secrets.GH_BOT_TOKEN }}
|
||||
validate: true
|
||||
|
||||
- name: Debug upload gcda artifact
|
||||
if: always() && matrix.release != true
|
||||
uses: actions/upload-artifact@v4
|
||||
- name: Setup python
|
||||
id: python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
name: homebrew-gcda-${{ matrix.os_name }}-${{ matrix.os_version }}
|
||||
path: ${{ steps.test.outputs.buildpath }}/build/tests/CMakeFiles/test_sunshine.dir/__/src/audio.cpp.gcda
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Debug homebrew buildpath
|
||||
if: always() && matrix.release != true
|
||||
- name: Generate gcov report
|
||||
id: test_report
|
||||
# any except canceled or skipped
|
||||
# TODO: fix coverage, no .gcno files are being created
|
||||
# TODO: .gcno files are supposed to be created next to .o files
|
||||
if: false
|
||||
# if: >-
|
||||
# always() &&
|
||||
# matrix.release != true &&
|
||||
# (steps.test.outcome == 'success' || steps.test.outcome == 'failure')
|
||||
run: |
|
||||
# print the build path
|
||||
echo "Build path: ${{ steps.test.outputs.buildpath }}"
|
||||
echo "contents:"
|
||||
cp -rf ${{ steps.test.outputs.buildpath }}/build/ ./build/
|
||||
cd build
|
||||
ls -Ra
|
||||
|
||||
# print the test path
|
||||
echo "----"
|
||||
echo "Test path: ${{ steps.test.outputs.testpath }}"
|
||||
echo "contents:"
|
||||
ls -Ra
|
||||
${{ steps.python.outputs.python-path }} -m pip install gcovr
|
||||
${{ steps.python.outputs.python-path }} -m gcovr . -r ../src \
|
||||
--exclude-noncode-lines \
|
||||
--exclude-throw-branches \
|
||||
--exclude-unreachable-branches \
|
||||
--verbose \
|
||||
--xml-pretty \
|
||||
-o coverage.xml
|
||||
|
||||
- name: Upload test results to Codecov
|
||||
# any except canceled or skipped
|
||||
@@ -664,16 +675,18 @@ jobs:
|
||||
|
||||
- name: Upload coverage
|
||||
# any except canceled or skipped
|
||||
if: >-
|
||||
always() &&
|
||||
matrix.release != true &&
|
||||
(steps.test_report.outcome == 'success') &&
|
||||
startsWith(github.repository, 'LizardByte/')
|
||||
# TODO: enable this once coverage report is fixed
|
||||
if: false
|
||||
# if: >-
|
||||
# always() &&
|
||||
# matrix.release != true &&
|
||||
# (steps.test_report.outcome == 'success') &&
|
||||
# startsWith(github.repository, 'LizardByte/')
|
||||
uses: codecov/codecov-action@v5
|
||||
with:
|
||||
disable_search: true
|
||||
fail_ci_if_error: true
|
||||
files: ${{ steps.test.outputs.testpath }}/build/coverage.xml
|
||||
files: ./build/coverage.xml
|
||||
flags: ${{ matrix.os_name }}-${{ matrix.os_version }} (Homebrew)
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
verbose: true
|
||||
@@ -717,7 +730,7 @@ jobs:
|
||||
github.repository_owner == 'LizardByte' &&
|
||||
matrix.release &&
|
||||
needs.setup_release.outputs.publish_release == 'true'
|
||||
uses: LizardByte/homebrew-release-action@v2025.503.165455
|
||||
uses: LizardByte/homebrew-release-action@v2025.506.15440
|
||||
with:
|
||||
formula_file: ${{ github.workspace }}/homebrew/sunshine-beta.rb
|
||||
git_email: ${{ secrets.GH_BOT_EMAIL }}
|
||||
@@ -727,9 +740,26 @@ jobs:
|
||||
validate: false
|
||||
|
||||
build_win:
|
||||
name: Windows
|
||||
name: ${{ matrix.name }}
|
||||
needs: setup_release
|
||||
runs-on: windows-2019
|
||||
runs-on: ${{ matrix.os }}
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- name: Windows-AMD64
|
||||
os: windows-2019
|
||||
arch: x86_64
|
||||
msystem: ucrt64
|
||||
toolchain: ucrt-x86_64
|
||||
- name: Windows-ARM64
|
||||
os: windows-11-arm
|
||||
arch: aarch64
|
||||
msystem: clangarm64
|
||||
toolchain: clang-aarch64
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -739,6 +769,7 @@ jobs:
|
||||
- name: Prepare tests
|
||||
id: prepare-tests
|
||||
if: false # todo: DirectX11 is not available, so even software encoder fails
|
||||
shell: pwsh
|
||||
run: |
|
||||
# function to download and extract a zip file
|
||||
function DownloadAndExtract {
|
||||
@@ -841,63 +872,80 @@ jobs:
|
||||
Get-Content -Path monitor_list.txt
|
||||
|
||||
- name: Setup Dependencies Windows
|
||||
# if a dependency needs to be pinned, see https://github.com/LizardByte/build-deps/pull/186
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: ucrt64
|
||||
msystem: ${{ matrix.msystem }}
|
||||
update: true
|
||||
install: >-
|
||||
wget
|
||||
|
||||
- name: Update Windows dependencies
|
||||
env:
|
||||
gcc_version: "14.2.0-3"
|
||||
shell: msys2 {0}
|
||||
MSYSTEM: ${{ matrix.msystem }}
|
||||
TOOLCHAIN: ${{ matrix.toolchain }}
|
||||
run: |
|
||||
broken_deps=(
|
||||
"mingw-w64-ucrt-x86_64-gcc"
|
||||
"mingw-w64-ucrt-x86_64-gcc-libs"
|
||||
# variables
|
||||
declare -A pinned_deps
|
||||
if [[ ${MSYSTEM} == "ucrt64" ]]; then
|
||||
pinned_deps["mingw-w64-${TOOLCHAIN}-gcc"]="14.2.0-3"
|
||||
pinned_deps["mingw-w64-${TOOLCHAIN}-gcc-libs"]="14.2.0-3"
|
||||
fi
|
||||
|
||||
dependencies=(
|
||||
"git"
|
||||
"mingw-w64-${TOOLCHAIN}-cmake"
|
||||
"mingw-w64-${TOOLCHAIN}-cppwinrt"
|
||||
"mingw-w64-${TOOLCHAIN}-curl-winssl"
|
||||
"mingw-w64-${TOOLCHAIN}-graphviz"
|
||||
"mingw-w64-${TOOLCHAIN}-miniupnpc"
|
||||
"mingw-w64-${TOOLCHAIN}-nlohmann-json"
|
||||
"mingw-w64-${TOOLCHAIN}-nodejs"
|
||||
"mingw-w64-${TOOLCHAIN}-onevpl"
|
||||
"mingw-w64-${TOOLCHAIN}-openssl"
|
||||
"mingw-w64-${TOOLCHAIN}-opus"
|
||||
"mingw-w64-${TOOLCHAIN}-toolchain"
|
||||
)
|
||||
|
||||
if [[ ${MSYSTEM} == "ucrt64" ]]; then
|
||||
dependencies+=(
|
||||
"mingw-w64-${TOOLCHAIN}-MinHook"
|
||||
"mingw-w64-${TOOLCHAIN}-nsis" # TODO: how to create an arm64 installer?
|
||||
)
|
||||
fi
|
||||
|
||||
# do not modify below this line
|
||||
|
||||
ignore_packages=()
|
||||
tarballs=""
|
||||
for dep in "${broken_deps[@]}"; do
|
||||
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
|
||||
for pkg in "${!pinned_deps[@]}"; do
|
||||
ignore_packages+=("${pkg}")
|
||||
version="${pinned_deps[$pkg]}"
|
||||
tarball="${pkg}-${version}-any.pkg.tar.zst"
|
||||
|
||||
# download and install working version
|
||||
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
|
||||
wget "https://repo.msys2.org/mingw/${MSYSTEM}/${tarball}"
|
||||
|
||||
tarballs="${tarballs} ${tarball}"
|
||||
done
|
||||
|
||||
# install broken dependencies
|
||||
# Create the ignore string for pacman
|
||||
ignore_list=$(IFS=,; echo "${ignore_packages[*]}")
|
||||
|
||||
# install pinned dependencies
|
||||
if [ -n "$tarballs" ]; then
|
||||
pacman -U --noconfirm ${tarballs}
|
||||
fi
|
||||
|
||||
# install dependencies
|
||||
dependencies=(
|
||||
"git"
|
||||
"mingw-w64-ucrt-x86_64-cmake"
|
||||
"mingw-w64-ucrt-x86_64-cppwinrt"
|
||||
"mingw-w64-ucrt-x86_64-curl-winssl"
|
||||
"mingw-w64-ucrt-x86_64-graphviz"
|
||||
"mingw-w64-ucrt-x86_64-MinHook"
|
||||
"mingw-w64-ucrt-x86_64-miniupnpc"
|
||||
"mingw-w64-ucrt-x86_64-nlohmann-json"
|
||||
"mingw-w64-ucrt-x86_64-nodejs"
|
||||
"mingw-w64-ucrt-x86_64-nsis"
|
||||
"mingw-w64-ucrt-x86_64-onevpl"
|
||||
"mingw-w64-ucrt-x86_64-openssl"
|
||||
"mingw-w64-ucrt-x86_64-opus"
|
||||
"mingw-w64-ucrt-x86_64-toolchain"
|
||||
)
|
||||
|
||||
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
|
||||
# Only add --ignore if we have packages to ignore
|
||||
if [ -n "$ignore_list" ]; then
|
||||
pacman -Syu --noconfirm --ignore="${ignore_list}" "${dependencies[@]}"
|
||||
else
|
||||
pacman -Syu --noconfirm "${dependencies[@]}"
|
||||
fi
|
||||
|
||||
- name: Install Doxygen
|
||||
# GCC compiled doxygen has issues when running graphviz
|
||||
env:
|
||||
DOXYGEN_VERSION: "1.11.0"
|
||||
shell: pwsh
|
||||
run: |
|
||||
# Set version variables
|
||||
$doxy_ver = $env:DOXYGEN_VERSION
|
||||
@@ -927,7 +975,6 @@ jobs:
|
||||
|
||||
- name: Python Path
|
||||
id: python-path
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
# replace backslashes with double backslashes
|
||||
python_path=$(echo "${{ steps.setup-python.outputs.python-path }}" | sed 's/\\/\\\\/g')
|
||||
@@ -937,7 +984,6 @@ jobs:
|
||||
echo "python-path=${python_path}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build Windows
|
||||
shell: msys2 {0}
|
||||
env:
|
||||
BRANCH: ${{ github.head_ref || github.ref_name }}
|
||||
BUILD_VERSION: ${{ needs.setup_release.outputs.release_tag }}
|
||||
@@ -958,7 +1004,6 @@ jobs:
|
||||
ninja -C build
|
||||
|
||||
- name: Package Windows
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
mkdir -p artifacts
|
||||
cd build
|
||||
@@ -968,12 +1013,11 @@ jobs:
|
||||
cpack -G ZIP
|
||||
|
||||
# move
|
||||
mv ./cpack_artifacts/Sunshine.exe ../artifacts/sunshine-windows-installer.exe
|
||||
mv ./cpack_artifacts/Sunshine.zip ../artifacts/sunshine-windows-portable.zip
|
||||
mv ./cpack_artifacts/Sunshine.exe ../artifacts/Sunshine-${{ matrix.os }}-installer.exe
|
||||
mv ./cpack_artifacts/Sunshine.zip ../artifacts/Sunshine-${{ matrix.os }}-portable.zip
|
||||
|
||||
- name: Run tests
|
||||
id: test
|
||||
shell: msys2 {0}
|
||||
working-directory: build/tests
|
||||
run: |
|
||||
./test_sunshine.exe --gtest_color=yes --gtest_output=xml:test_results.xml
|
||||
@@ -981,10 +1025,7 @@ jobs:
|
||||
- name: Generate gcov report
|
||||
id: test_report
|
||||
# any except canceled or skipped
|
||||
if: >-
|
||||
always() &&
|
||||
(steps.test.outcome == 'success' || steps.test.outcome == 'failure')
|
||||
shell: msys2 {0}
|
||||
if: always() && (steps.test.outcome == 'success' || steps.test.outcome == 'failure')
|
||||
working-directory: build
|
||||
run: |
|
||||
${{ steps.python-path.outputs.python-path }} -m pip install gcovr
|
||||
@@ -1007,7 +1048,7 @@ jobs:
|
||||
disable_search: true
|
||||
fail_ci_if_error: true
|
||||
files: ./build/tests/test_results.xml
|
||||
flags: ${{ runner.os }}
|
||||
flags: ${{ matrix.name }}
|
||||
handle_no_reports_found: true
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
verbose: true
|
||||
@@ -1023,11 +1064,12 @@ jobs:
|
||||
disable_search: true
|
||||
fail_ci_if_error: true
|
||||
files: ./build/coverage.xml
|
||||
flags: ${{ runner.os }}
|
||||
flags: ${{ matrix.name }}
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
verbose: true
|
||||
|
||||
- name: Package Windows Debug Info
|
||||
shell: pwsh
|
||||
working-directory: build
|
||||
run: |
|
||||
# use .dbg file extension for binaries to avoid confusion with real packages
|
||||
@@ -1038,7 +1080,7 @@ jobs:
|
||||
7z -r `
|
||||
"-xr!CMakeFiles" `
|
||||
"-xr!cpack_artifacts" `
|
||||
a "../artifacts/sunshine-win32-debuginfo.7z" "*.dbg"
|
||||
a "../artifacts/${{ matrix.name }}-debuginfo.7z" "*.dbg"
|
||||
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
|
||||
2
.github/workflows/update-changelog.yml
vendored
2
.github/workflows/update-changelog.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Update Changelog
|
||||
uses: LizardByte/update-changelog-action@v2024.919.152649
|
||||
uses: LizardByte/update-changelog-action@v2025.426.173858
|
||||
with:
|
||||
changelogBranch: changelog
|
||||
changelogFile: CHANGELOG.md
|
||||
|
||||
@@ -63,7 +63,7 @@ jobs:
|
||||
if: >-
|
||||
steps.check-label.outputs.hasTopic == 'true' &&
|
||||
fromJson(steps.download.outputs.downloaded_files)[0]
|
||||
uses: LizardByte/homebrew-release-action@v2024.1115.14934
|
||||
uses: LizardByte/homebrew-release-action@v2025.506.15440
|
||||
with:
|
||||
formula_file: ${{ fromJson(steps.download.outputs.downloaded_files)[0] }}
|
||||
git_email: ${{ secrets.GH_BOT_EMAIL }}
|
||||
|
||||
@@ -27,6 +27,9 @@ endif()
|
||||
# set the module path, used for includes
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
|
||||
|
||||
# export compile_commands.json
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
# set version info for this build
|
||||
include(${CMAKE_MODULE_PATH}/prep/build_version.cmake)
|
||||
|
||||
|
||||
@@ -75,7 +75,6 @@ list(PREPEND PLATFORM_LIBRARIES
|
||||
libssp.a
|
||||
libstdc++.a
|
||||
libwinpthread.a
|
||||
minhook::minhook
|
||||
ntdll
|
||||
setupapi
|
||||
shlwapi
|
||||
@@ -85,6 +84,12 @@ list(PREPEND PLATFORM_LIBRARIES
|
||||
wsock32
|
||||
)
|
||||
|
||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64")
|
||||
list(APPEND PLATFORM_LIBRARIES
|
||||
minhook::minhook
|
||||
)
|
||||
endif()
|
||||
|
||||
if(SUNSHINE_ENABLE_TRAY)
|
||||
list(APPEND PLATFORM_TARGET_FILES
|
||||
"${CMAKE_SOURCE_DIR}/third-party/tray/src/tray_windows.c")
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
# windows specific dependencies
|
||||
|
||||
# Make sure MinHook is installed
|
||||
find_library(MINHOOK_LIBRARY libMinHook.a REQUIRED)
|
||||
find_path(MINHOOK_INCLUDE_DIR MinHook.h PATH_SUFFIXES include REQUIRED)
|
||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64")
|
||||
# Make sure MinHook is installed
|
||||
find_library(MINHOOK_LIBRARY libMinHook.a REQUIRED)
|
||||
find_path(MINHOOK_INCLUDE_DIR MinHook.h PATH_SUFFIXES include REQUIRED)
|
||||
|
||||
add_library(minhook::minhook STATIC IMPORTED)
|
||||
set_property(TARGET minhook::minhook PROPERTY IMPORTED_LOCATION ${MINHOOK_LIBRARY})
|
||||
target_include_directories(minhook::minhook INTERFACE ${MINHOOK_INCLUDE_DIR})
|
||||
add_library(minhook::minhook STATIC IMPORTED)
|
||||
set_property(TARGET minhook::minhook PROPERTY IMPORTED_LOCATION ${MINHOOK_LIBRARY})
|
||||
target_include_directories(minhook::minhook INTERFACE ${MINHOOK_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
@@ -10,7 +10,6 @@ set(SUNSHINE_PUBLISHER_ISSUE_URL "https://app.lizardbyte.dev/support"
|
||||
option(BUILD_DOCS "Build documentation" ON)
|
||||
option(BUILD_TESTS "Build tests" ON)
|
||||
option(NPM_OFFLINE "Use offline npm packages. You must ensure packages are in your npm cache." OFF)
|
||||
option(TESTS_ENABLE_PYTHON_TESTS "Enable Python tests" ON)
|
||||
|
||||
option(BUILD_WERROR "Enable -Werror flag." OFF)
|
||||
|
||||
|
||||
@@ -72,33 +72,49 @@ sudo port install "${dependencies[@]}"
|
||||
```
|
||||
|
||||
#### Windows
|
||||
First you need to install [MSYS2](https://www.msys2.org), then startup "MSYS2 UCRT64" and execute the following
|
||||
commands.
|
||||
First you need to install [MSYS2](https://www.msys2.org).
|
||||
|
||||
For AMD64 startup "MSYS2 UCRT64", or for ARM64 startup "MSYS2 CLANGARM64", then execute the following commands.
|
||||
|
||||
##### Update all packages
|
||||
```bash
|
||||
pacman -Syu
|
||||
```
|
||||
|
||||
##### Set toolchain variable
|
||||
For UCRT64:
|
||||
```bash
|
||||
export TOOLCHAIN="ucrt64-x86_64"
|
||||
```
|
||||
|
||||
For CLANGARM64:
|
||||
```bash
|
||||
export TOOLCHAIN="clang-aarch64"
|
||||
```
|
||||
|
||||
##### Install dependencies
|
||||
```bash
|
||||
dependencies=(
|
||||
"git"
|
||||
"mingw-w64-ucrt-x86_64-boost" # Optional
|
||||
"mingw-w64-ucrt-x86_64-cmake"
|
||||
"mingw-w64-ucrt-x86_64-cppwinrt"
|
||||
"mingw-w64-ucrt-x86_64-curl-winssl"
|
||||
"mingw-w64-ucrt-x86_64-doxygen" # Optional, for docs... better to install official Doxygen
|
||||
"mingw-w64-ucrt-x86_64-graphviz" # Optional, for docs
|
||||
"mingw-w64-ucrt-x86_64-MinHook"
|
||||
"mingw-w64-ucrt-x86_64-miniupnpc"
|
||||
"mingw-w64-ucrt-x86_64-nodejs"
|
||||
"mingw-w64-ucrt-x86_64-nsis"
|
||||
"mingw-w64-ucrt-x86_64-onevpl"
|
||||
"mingw-w64-ucrt-x86_64-openssl"
|
||||
"mingw-w64-ucrt-x86_64-opus"
|
||||
"mingw-w64-ucrt-x86_64-toolchain"
|
||||
"mingw-w64-${TOOLCHAIN}-boost" # Optional
|
||||
"mingw-w64-${TOOLCHAIN}-cmake"
|
||||
"mingw-w64-${TOOLCHAIN}-cppwinrt"
|
||||
"mingw-w64-${TOOLCHAIN}-curl-winssl"
|
||||
"mingw-w64-${TOOLCHAIN}-doxygen" # Optional, for docs... better to install official Doxygen
|
||||
"mingw-w64-${TOOLCHAIN}-graphviz" # Optional, for docs
|
||||
"mingw-w64-${TOOLCHAIN}-miniupnpc"
|
||||
"mingw-w64-${TOOLCHAIN}-nodejs"
|
||||
"mingw-w64-${TOOLCHAIN}-onevpl"
|
||||
"mingw-w64-${TOOLCHAIN}-openssl"
|
||||
"mingw-w64-${TOOLCHAIN}-opus"
|
||||
"mingw-w64-${TOOLCHAIN}-toolchain"
|
||||
)
|
||||
if [[ ${MSYSTEM} == "ucrt64" ]]; then
|
||||
dependencies+=(
|
||||
"mingw-w64-${TOOLCHAIN}-MinHook"
|
||||
"mingw-w64-${TOOLCHAIN}-nsis" # TODO: how to create an arm64 installer?
|
||||
)
|
||||
fi
|
||||
pacman -S "${dependencies[@]}"
|
||||
```
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ Read our contribution guide in our organization level
|
||||
## Recommended Tools
|
||||
|
||||
| Tool | Description |
|
||||
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| <a href="https://www.jetbrains.com/clion/"><img src="https://resources.jetbrains.com/storage/products/company/brand/logos/CLion_icon.svg" width="30" height="30"></a><br>CLion | Recommended IDE for C++ development. Free licenses available for open source developers through the [JetBrains Open Source Program](https://www.jetbrains.com/community/opensource/). |
|
||||
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|
|
||||
| <a href="https://www.jetbrains.com/clion/"><img src="https://resources.jetbrains.com/storage/products/company/brand/logos/CLion_icon.svg" width="30" height="30"></a><br>CLion | Recommended IDE for C and C++ development. Free for non-commercial use. |
|
||||
|
||||
## Project Patterns
|
||||
|
||||
|
||||
@@ -280,10 +280,17 @@ brew uninstall sunshine
|
||||
|
||||
### Windows
|
||||
|
||||
Sunshine now supports ARM64 on Windows; however this should be considered experimental. This version does not properly
|
||||
support GPU scheduling.
|
||||
|
||||
#### Installer (recommended)
|
||||
|
||||
1. Download and install
|
||||
[sunshine-windows-installer.exe](https://github.com/LizardByte/Sunshine/releases/latest/download/sunshine-windows-installer.exe)
|
||||
1. Download and install based on your architecture:
|
||||
|
||||
| Architecture | Installer |
|
||||
|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| AMD64/x64 (Intel/AMD) | [Sunshine-Windows-AMD64-installer.exe](https://github.com/LizardByte/Sunshine/releases/latest/download/Sunshine-Windows-AMD64-installer.exe) |
|
||||
| ARM64 | [Sunshine-Windows-ARM64-installer.exe](https://github.com/LizardByte/Sunshine/releases/latest/download/Sunshine-Windows-ARM64-installer.exe) |
|
||||
|
||||
@attention{You should carefully select or unselect the options you want to install. Do not blindly install or
|
||||
enable features.}
|
||||
@@ -296,8 +303,13 @@ overflow menu. Different versions of Windows may provide slightly different step
|
||||
@warning{By using this package instead of the installer, performance will be reduced. This package is not
|
||||
recommended for most users. No support will be provided!}
|
||||
|
||||
1. Download and extract
|
||||
[sunshine-windows-portable.zip](https://github.com/LizardByte/Sunshine/releases/latest/download/sunshine-windows-portable.zip)
|
||||
1. Download and extract based on your architecture:
|
||||
|
||||
| Architecture | Installer |
|
||||
|-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| AMD64/x64 (Intel/AMD) | [Sunshine-Windows-AMD64-portable.exe](https://github.com/LizardByte/Sunshine/releases/latest/download/Sunshine-Windows-AMD64-portable.zip) |
|
||||
| ARM64 | [Sunshine-Windows-ARM64-portable.exe](https://github.com/LizardByte/Sunshine/releases/latest/download/Sunshine-Windows-ARM64-portable.zip) |
|
||||
|
||||
2. Open command prompt as administrator
|
||||
3. Firewall rules
|
||||
|
||||
|
||||
@@ -465,6 +465,36 @@ ext-js:
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- New Nintendo 3DS -->
|
||||
<div class="col-md-6 col-lg-4 mb-5">
|
||||
<div class="card bg-dark text-white rounded-0">
|
||||
<div class="card-body p-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="icon text-white">
|
||||
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v12/icons/nintendo3ds.svg" alt="3DS"/>
|
||||
</div>
|
||||
<div class="ms-3">
|
||||
<h5 class="fw-bolder mb-0">
|
||||
<a href="https://github.com/zoeyjodon/moonlight-N3DS" target="_blank" class="text-white text-decoration-none">
|
||||
New Nintendo 3DS
|
||||
</a>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="ms-auto">
|
||||
<span class="badge text-bg-warning rounded-pill">Community</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer p-3 px-4">
|
||||
<div class="pb-3">
|
||||
<a href="https://github.com/zoeyjodon/moonlight-N3DS" target="_blank" class="btn btn-info">
|
||||
<i class="fas fa-download"></i> Download
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- LG webOS TV -->
|
||||
<div class="col-md-6 col-lg-4 mb-5">
|
||||
<div class="card bg-dark text-white rounded-0">
|
||||
|
||||
@@ -9,14 +9,14 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@lizardbyte/shared-web": "2025.326.11214",
|
||||
"vue": "3.5.13",
|
||||
"vue": "3.5.14",
|
||||
"vue-i18n": "11.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@codecov/vite-plugin": "1.9.0",
|
||||
"@vitejs/plugin-vue": "4.6.2",
|
||||
"serve": "14.2.3",
|
||||
"vite": "4.5.9",
|
||||
"vite": "4.5.14",
|
||||
"vite-plugin-ejs": "1.6.4"
|
||||
}
|
||||
}
|
||||
|
||||
Submodule packaging/linux/flatpak/deps/flatpak-builder-tools updated: bf91cb0bee...fe89c19b14
@@ -32,7 +32,6 @@ class @PROJECT_NAME@ < Formula
|
||||
depends_on "ninja" => :build
|
||||
depends_on "node" => :build
|
||||
depends_on "pkg-config" => :build
|
||||
depends_on "gcovr" => :test
|
||||
depends_on "curl"
|
||||
depends_on "miniupnpc"
|
||||
depends_on "openssl"
|
||||
@@ -354,21 +353,5 @@ index 5b3638d..aca9481 100644
|
||||
# run the test suite
|
||||
system bin/"test_sunshine", "--gtest_color=yes", "--gtest_output=xml:test_results.xml"
|
||||
assert_path_exists testpath/"test_results.xml"
|
||||
|
||||
# create gcovr report
|
||||
if ENV["HOMEBREW_BUILDPATH"]
|
||||
|
||||
cd File.join(ENV["HOMEBREW_BUILDPATH"], "build") do
|
||||
system "gcovr", ".",
|
||||
"-r", "../src",
|
||||
"--exclude-noncode-lines",
|
||||
"--exclude-throw-branches",
|
||||
"--exclude-unreachable-branches",
|
||||
"--verbose",
|
||||
"--xml-pretty",
|
||||
"-o=coverage.xml"
|
||||
end
|
||||
assert_path_exists File.join(ENV["HOMEBREW_BUILDPATH"], "build", "coverage.xml")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -12,7 +12,11 @@
|
||||
// lib includes
|
||||
#include <boost/algorithm/string/join.hpp>
|
||||
#include <boost/process/v1.hpp>
|
||||
#include <MinHook.h>
|
||||
|
||||
// conditional includes
|
||||
#if defined(__x86_64__) || defined(__amd64__)
|
||||
#include <MinHook.h>
|
||||
#endif
|
||||
|
||||
// We have to include boost/process/v1.hpp before display.h due to WinSock.h,
|
||||
// but that prevents the definition of NTSTATUS so we must define it ourself.
|
||||
@@ -407,6 +411,7 @@ namespace platf::dxgi {
|
||||
return false;
|
||||
}
|
||||
|
||||
#if defined(__x86_64__) || defined(__amd64__)
|
||||
/**
|
||||
* @brief Hook for NtGdiDdDDIGetCachedHybridQueryValue() from win32u.dll.
|
||||
* @param gpuPreference A pointer to the location where the preference will be written.
|
||||
@@ -425,6 +430,7 @@ namespace platf::dxgi {
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int display_base_t::init(const ::video::config_t &config, const std::string &display_name) {
|
||||
std::once_flag windows_cpp_once_flag;
|
||||
@@ -444,12 +450,14 @@ namespace platf::dxgi {
|
||||
FreeLibrary(user32);
|
||||
}
|
||||
|
||||
#if defined(__x86_64__) || defined(__amd64__)
|
||||
{
|
||||
// We aren't calling MH_Uninitialize(), but that's okay because this hook lasts for the life of the process
|
||||
MH_Initialize();
|
||||
MH_CreateHookApi(L"win32u.dll", "NtGdiDdDDIGetCachedHybridQueryValue", (void *) NtGdiDdDDIGetCachedHybridQueryValueHook, nullptr);
|
||||
MH_EnableHook(MH_ALL_HOOKS);
|
||||
}
|
||||
#endif
|
||||
});
|
||||
|
||||
// Get rectangle of full desktop for absolute mouse coordinates
|
||||
|
||||
@@ -1263,7 +1263,7 @@ namespace stream {
|
||||
void videoBroadcastThread(udp::socket &sock) {
|
||||
auto shutdown_event = mail::man->event<bool>(mail::broadcast_shutdown);
|
||||
auto packets = mail::man->queue<video::packet_t>(mail::video_packets);
|
||||
auto timebase = boost::posix_time::microsec_clock::universal_time();
|
||||
auto video_epoch = std::chrono::steady_clock::now();
|
||||
|
||||
// Video traffic is sent on this thread
|
||||
platf::adjust_thread_priority(platf::thread_priority_e::high);
|
||||
@@ -1459,14 +1459,20 @@ namespace stream {
|
||||
|
||||
size_t next_shard_to_send = 0;
|
||||
|
||||
// RTP video timestamps use a 90 KHz clock and the frame_timestamp from when the frame was captured
|
||||
// When a timestamp isn't available (duplicate frames), the timestamp from rate control is used instead.
|
||||
bool frame_is_dupe = false;
|
||||
if (!packet->frame_timestamp) {
|
||||
packet->frame_timestamp = ratecontrol_next_frame_start;
|
||||
frame_is_dupe = true;
|
||||
}
|
||||
using rtp_tick = std::chrono::duration<uint32_t, std::ratio<1, 90000>>;
|
||||
uint32_t timestamp = std::chrono::round<rtp_tick>(*packet->frame_timestamp - video_epoch).count();
|
||||
|
||||
// set FEC info now that we know for sure what our percentage will be for this frame
|
||||
for (auto x = 0; x < shards.size(); ++x) {
|
||||
auto *inspect = (video_packet_raw_t *) shards.data(x);
|
||||
|
||||
// RTP video timestamps use a 90 KHz clock
|
||||
auto now = boost::posix_time::microsec_clock::universal_time();
|
||||
auto timestamp = (now - timebase).total_microseconds() / (1000 / 90);
|
||||
|
||||
inspect->packet.fecInfo =
|
||||
(x << 12 |
|
||||
shards.data_shards << 22 |
|
||||
@@ -1558,11 +1564,11 @@ namespace stream {
|
||||
|
||||
frame_network_latency_logger.second_point_now_and_log();
|
||||
|
||||
if (packet->is_idr()) {
|
||||
BOOST_LOG(verbose) << "Key Frame ["sv << packet->frame_index() << "] :: send ["sv << shards.size() << "] shards..."sv;
|
||||
} else {
|
||||
BOOST_LOG(verbose) << "Frame ["sv << packet->frame_index() << "] :: send ["sv << shards.size() << "] shards..."sv << std::endl;
|
||||
}
|
||||
BOOST_LOG(verbose) << "Sent Frame seq ["sv << packet->frame_index() << "] pts ["sv << timestamp
|
||||
<< "] shards ["sv << shards.size() << "/"sv << shards.percentage << "%]"sv
|
||||
<< (frame_is_dupe ? " Dupe" : "")
|
||||
<< (packet->is_idr() ? " Key" : "")
|
||||
<< (packet->after_ref_frame_invalidation ? " RFI" : "");
|
||||
|
||||
++blockIndex;
|
||||
lowseq += shards.size();
|
||||
@@ -1622,6 +1628,8 @@ namespace stream {
|
||||
break;
|
||||
}
|
||||
|
||||
BOOST_LOG(verbose) << "Audio [seq "sv << sequenceNumber << ", pts "sv << timestamp << "] :: send..."sv;
|
||||
|
||||
audio_packet.rtp.sequenceNumber = util::endian::big(sequenceNumber);
|
||||
audio_packet.rtp.timestamp = util::endian::big(timestamp);
|
||||
|
||||
@@ -1641,7 +1649,6 @@ namespace stream {
|
||||
session->localAddress,
|
||||
};
|
||||
platf::send(send_info);
|
||||
BOOST_LOG(verbose) << "Audio ["sv << sequenceNumber << "] :: send..."sv;
|
||||
|
||||
auto &fec_packet = session->audio.fec_packet;
|
||||
// initialize the FEC header at the beginning of the FEC block
|
||||
|
||||
@@ -388,7 +388,7 @@
|
||||
"configuration": "Configuration",
|
||||
"home": "Home",
|
||||
"password": "Change Password",
|
||||
"pin": "Pin",
|
||||
"pin": "PIN",
|
||||
"theme_auto": "Auto",
|
||||
"theme_dark": "Dark",
|
||||
"theme_light": "Light",
|
||||
|
||||
2
third-party/build-deps
vendored
2
third-party/build-deps
vendored
Submodule third-party/build-deps updated: b567d3c479...d60197e154
Reference in New Issue
Block a user