Merge remote-tracking branch 'sunshine/master'
This commit is contained in:
@@ -4,6 +4,28 @@ set -e
|
|||||||
# update pacman
|
# update pacman
|
||||||
pacman --noconfirm -Syu
|
pacman --noconfirm -Syu
|
||||||
|
|
||||||
|
gcc_version="14.2.0-3"
|
||||||
|
|
||||||
|
broken_deps=(
|
||||||
|
"mingw-w64-ucrt-x86_64-gcc"
|
||||||
|
"mingw-w64-ucrt-x86_64-gcc-libs"
|
||||||
|
)
|
||||||
|
|
||||||
|
tarballs=""
|
||||||
|
for dep in "${broken_deps[@]}"; do
|
||||||
|
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
|
||||||
|
|
||||||
|
# download and install working version
|
||||||
|
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
|
||||||
|
|
||||||
|
tarballs="${tarballs} ${tarball}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# install broken dependencies
|
||||||
|
if [ -n "$tarballs" ]; then
|
||||||
|
pacman -U --noconfirm ${tarballs}
|
||||||
|
fi
|
||||||
|
|
||||||
# install dependencies
|
# install dependencies
|
||||||
dependencies=(
|
dependencies=(
|
||||||
"git"
|
"git"
|
||||||
@@ -20,7 +42,8 @@ dependencies=(
|
|||||||
"mingw-w64-ucrt-x86_64-opus"
|
"mingw-w64-ucrt-x86_64-opus"
|
||||||
"mingw-w64-ucrt-x86_64-toolchain"
|
"mingw-w64-ucrt-x86_64-toolchain"
|
||||||
)
|
)
|
||||||
pacman -S --noconfirm "${dependencies[@]}"
|
|
||||||
|
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
|
||||||
|
|
||||||
# build
|
# build
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ INPUT = ../README.md \
|
|||||||
legal.md \
|
legal.md \
|
||||||
configuration.md \
|
configuration.md \
|
||||||
app_examples.md \
|
app_examples.md \
|
||||||
|
awesome_sunshine.md \
|
||||||
guides.md \
|
guides.md \
|
||||||
performance_tuning.md \
|
performance_tuning.md \
|
||||||
api.md \
|
api.md \
|
||||||
|
|||||||
@@ -23,25 +23,28 @@ process is killed.}
|
|||||||
|
|
||||||
@tabs{
|
@tabs{
|
||||||
@tab{Linux | <!-- -->
|
@tab{Linux | <!-- -->
|
||||||
\| Field \| Value \|
|
\| Field \| Value \|
|
||||||
\|-------------------\|-----------------------------------------------------\|
|
\|------------------------------\|------------------------------------------------------\|
|
||||||
\| Application Name \| @code{}Steam Big Picture@endcode \|
|
\| Application Name \| @code{}Steam Big Picture@endcode \|
|
||||||
\| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \|
|
\| Command Preporations -> Undo \| @code{}setsid steam steam://close/bigpicture@endcode \|
|
||||||
\| Image \| @code{}steam.png@endcode \|
|
\| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \|
|
||||||
|
\| Image \| @code{}steam.png@endcode \|
|
||||||
}
|
}
|
||||||
@tab{macOS | <!-- -->
|
@tab{macOS | <!-- -->
|
||||||
\| Field \| Value \|
|
\| Field \| Value \|
|
||||||
\|-------------------\|---------------------------------------------------\|
|
\|------------------------------\|------------------------------------------------\|
|
||||||
\| Application Name \| @code{}Steam Big Picture@endcode \|
|
\| Application Name \| @code{}Steam Big Picture@endcode \|
|
||||||
\| Detached Commands \| @code{}open steam steam://open/bigpicture@endcode \|
|
\| Command Preporations -> Undo \| @code{}open steam://close/bigpicture@endcode \|
|
||||||
\| Image \| @code{}steam.png@endcode \|
|
\| Detached Commands \| @code{}open steam://open/bigpicture@endcode \|
|
||||||
|
\| Image \| @code{}steam.png@endcode \|
|
||||||
}
|
}
|
||||||
@tab{Windows | <!-- -->
|
@tab{Windows | <!-- -->
|
||||||
\| Field \| Value \|
|
\| Field \| Value \|
|
||||||
\|-------------------\|----------------------------------------\|
|
\|------------------------------\|-------------------------------------------\|
|
||||||
\| Application Name \| @code{}Steam Big Picture@endcode \|
|
\| Application Name \| @code{}Steam Big Picture@endcode \|
|
||||||
\| Detached Commands \| @code{}steam://open/bigpicture@endcode \|
|
\| Command Preporations -> Undo \| @code{}steam://close/bigpicture@endcode \|
|
||||||
\| Image \| @code{}steam.png@endcode \|
|
\| Detached Commands \| @code{}steam://open/bigpicture@endcode \|
|
||||||
|
\| Image \| @code{}steam.png@endcode \|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +213,7 @@ xrandr --output ${display_output} --primary --mode ${mode_alias} --pos 0x0 --rot
|
|||||||
```
|
```
|
||||||
}
|
}
|
||||||
|
|
||||||
###### Wayland
|
###### Wayland (wlroots, e.g. hyprland)
|
||||||
|
|
||||||
| Prep Step | Command |
|
| Prep Step | Command |
|
||||||
|-----------|------------------------------------------------------------------------------------------------------------------------------------------|
|
|-----------|------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
@@ -219,17 +222,30 @@ xrandr --output ${display_output} --primary --mode ${mode_alias} --pos 0x0 --rot
|
|||||||
|
|
||||||
@hint{`wlr-xrandr` only works with wlroots-based compositors.}
|
@hint{`wlr-xrandr` only works with wlroots-based compositors.}
|
||||||
|
|
||||||
###### Gnome (Wayland, X11)
|
###### Gnome (X11)
|
||||||
|
|
||||||
| Prep Step | Command |
|
| Prep Step | Command |
|
||||||
|-----------|---------------------------------------------------------------------------------------------------------------------------------------|
|
|-----------|---------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Do | @code{}sh -c "xrandr --output HDMI-1 --mode ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --rate ${SUNSHINE_CLIENT_FPS}"@endcode |
|
| Do | @code{}sh -c "xrandr --output HDMI-1 --mode ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --rate ${SUNSHINE_CLIENT_FPS}"@endcode |
|
||||||
| Undo | @code{}xrandr --output HDMI-1 --mode 3840x2160 --rate 120@endcode |
|
| Undo | @code{}xrandr --output HDMI-1 --mode 3840x2160 --rate 120@endcode |
|
||||||
|
|
||||||
The commands above are valid for an X11 session but won't work for
|
###### Gnome (Wayland)
|
||||||
Wayland. In that case `xrandr` must be replaced by [gnome-randr.py](https://gitlab.com/Oschowa/gnome-randr).
|
|
||||||
This script is intended as a drop-in replacement with the same syntax. (It can be saved in
|
| Prep Step | Command |
|
||||||
`/usr/local/bin` and needs to be made executable.)
|
|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| Do | @code{}sh -c "displayconfig-mutter set --connector HDMI-1 --resolution ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --refresh-rate ${SUNSHINE_CLIENT_FPS} --hdr ${SUNSHINE_CLIENT_HDR}"@endcode |
|
||||||
|
| Undo | @code{}displayconfig-mutter set --connector HDMI-1 --resolution 3840x2160 --refresh-rate 120 --hdr false@endcode |
|
||||||
|
|
||||||
|
Installation instructions for displayconfig-mutter can be [found here](https://github.com/eaglesemanation/displayconfig-mutter). Alternatives include
|
||||||
|
[gnome-randr-rust](https://github.com/maxwellainatchi/gnome-randr-rust) and [gnome-randr.py](https://gitlab.com/Oschowa/gnome-randr), but both of those are
|
||||||
|
unmaintained and do not support newer Mutter features such as HDR and VRR.
|
||||||
|
|
||||||
|
@hint{HDR support has been added to Gnome 48, to check if your display supports it you can run this:
|
||||||
|
```
|
||||||
|
displayconfig-mutter list
|
||||||
|
```
|
||||||
|
If it doesn't, then remove ``--hdr`` flag from both ``Do`` and ``Undo`` steps.
|
||||||
|
}
|
||||||
|
|
||||||
###### KDE Plasma (Wayland, X11)
|
###### KDE Plasma (Wayland, X11)
|
||||||
|
|
||||||
@@ -322,9 +338,9 @@ UAC prompt.
|
|||||||
|
|
||||||
<div class="section_buttons">
|
<div class="section_buttons">
|
||||||
|
|
||||||
| Previous | Next |
|
| Previous | Next |
|
||||||
|:----------------------------------|--------------------:|
|
|:----------------------------------|----------------------------------------:|
|
||||||
| [Configuration](configuration.md) | [Guides](guides.md) |
|
| [Configuration](configuration.md) | [Awesome-Sunshine](awesome_sunshine.md) |
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
23
docs/awesome_sunshine.md
Normal file
23
docs/awesome_sunshine.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Awesome-Sunshine
|
||||||
|
|
||||||
|
@htmlonly
|
||||||
|
<script type="module" src="https://md-block.verou.me/md-block.js"></script>
|
||||||
|
<md-block
|
||||||
|
hlinks=""
|
||||||
|
hmin="2"
|
||||||
|
src="https://raw.githubusercontent.com/LizardByte/awesome-sunshine/master/README.md">
|
||||||
|
</md-block>
|
||||||
|
@endhtmlonly
|
||||||
|
|
||||||
|
<div class="section_buttons">
|
||||||
|
|
||||||
|
| Previous | Next |
|
||||||
|
|:--------------------------------|--------------------:|
|
||||||
|
| [App Examples](app_examples.md) | [Guides](guides.md) |
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<details style="display: none;">
|
||||||
|
<summary></summary>
|
||||||
|
[TOC]
|
||||||
|
</details>
|
||||||
@@ -770,6 +770,29 @@ editing the `conf` file in a text editor. Use the examples as reference.
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
### stream_audio
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Description</td>
|
||||||
|
<td colspan="2">
|
||||||
|
Whether to stream audio or not. Disabling this can be useful for streaming headless displays as second monitors.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Default</td>
|
||||||
|
<td colspan="2">@code{}
|
||||||
|
enabled
|
||||||
|
@endcode</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Example</td>
|
||||||
|
<td colspan="2">@code{}
|
||||||
|
stream_audio = disabled
|
||||||
|
@endcode</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
### install_steam_audio_drivers
|
### install_steam_audio_drivers
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
@@ -1947,7 +1970,8 @@ editing the `conf` file in a text editor. Use the examples as reference.
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>wlr</td>
|
<td>wlr</td>
|
||||||
<td>Capture for wlroots based Wayland compositors via DMA-BUF.
|
<td>Capture for wlroots based Wayland compositors via wlr-screencopy-unstable-v1. It is possible to capture
|
||||||
|
virtual displays in e.g. Hyprland using this method.
|
||||||
@note{Applies to Linux only.}</td>
|
@note{Applies to Linux only.}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ Feel free to contribute your own tips and trips by making a PR to
|
|||||||
|
|
||||||
<div class="section_buttons">
|
<div class="section_buttons">
|
||||||
|
|
||||||
| Previous | Next |
|
| Previous | Next |
|
||||||
|:--------------------------------|--------------------------------------------:|
|
|:----------------------------------------|--------------------------------------------:|
|
||||||
| [App Examples](app_examples.md) | [Performance Tuning](performance_tuning.md) |
|
| [Awesome-Sunshine](awesome_sunshine.md) | [Performance Tuning](performance_tuning.md) |
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<img class="icon" src="https://moonlight-stream.org/images/moonlight.svg" alt="Moonlight">
|
<img class="icon" src="https://moonlight-stream.org/images/moonlight.svg" alt="Moonlight"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">Moonlight Support</h5>
|
<h5 class="fw-bolder mb-0">Moonlight Support</h5>
|
||||||
@@ -163,7 +163,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fab fa-android"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/android.svg" alt="Android"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -182,7 +182,7 @@ ext-js:
|
|||||||
<a href="https://play.google.com/store/apps/details?id=com.limelight" target="_blank">
|
<a href="https://play.google.com/store/apps/details?id=com.limelight" target="_blank">
|
||||||
<img alt="Get it on Google Play"
|
<img alt="Get it on Google Play"
|
||||||
src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png"
|
src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png"
|
||||||
height="60">
|
height="60"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -190,14 +190,14 @@ ext-js:
|
|||||||
<img alt="Available at Amazon Appstore"
|
<img alt="Available at Amazon Appstore"
|
||||||
src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/devportal2/res/images/amazon-appstore-badge-english-black.png"
|
src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/devportal2/res/images/amazon-appstore-badge-english-black.png"
|
||||||
height="60"
|
height="60"
|
||||||
style="padding: 10px;">
|
style="padding: 10px;"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://f-droid.org/packages/com.limelight" target="_blank">
|
<a href="https://f-droid.org/packages/com.limelight" target="_blank">
|
||||||
<img alt="Get it on F-Droid"
|
<img alt="Get it on F-Droid"
|
||||||
src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
height="60">
|
height="60"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -210,7 +210,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fab fa-chrome"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/chromewebstore.svg" alt="Chrome Web Store"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -229,7 +229,7 @@ ext-js:
|
|||||||
<a href="https://chrome.google.com/webstore/detail/moonlight-game-streaming/gemamigbbenahjlfnmlfdjhdnkpbkfjj" target="_blank" class="btn btn-outline-light">
|
<a href="https://chrome.google.com/webstore/detail/moonlight-game-streaming/gemamigbbenahjlfnmlfdjhdnkpbkfjj" target="_blank" class="btn btn-outline-light">
|
||||||
<img alt="Available in the Chrome Web Store"
|
<img alt="Available in the Chrome Web Store"
|
||||||
src="https://developer.chrome.com/static/docs/webstore/branding/image/206x58-chrome-web-043497a3d766e.png"
|
src="https://developer.chrome.com/static/docs/webstore/branding/image/206x58-chrome-web-043497a3d766e.png"
|
||||||
height="30">
|
height="30"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -242,7 +242,8 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fab fa-apple"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ios.svg" alt="iOS"/>
|
||||||
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/appletv.svg" alt="Apple TV"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -261,14 +262,14 @@ ext-js:
|
|||||||
<a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank">
|
<a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank">
|
||||||
<img alt="Download on the App Store"
|
<img alt="Download on the App Store"
|
||||||
src="https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg"
|
src="https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg"
|
||||||
height="40">
|
height="40"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="pb-3">
|
<div class="pb-3">
|
||||||
<a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank">
|
<a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank">
|
||||||
<img alt="Download on Apple TV"
|
<img alt="Download on Apple TV"
|
||||||
src="https://developer.apple.com/app-store/marketing/guidelines/images/badge-download-on-apple-tv.svg"
|
src="https://developer.apple.com/app-store/marketing/guidelines/images/badge-download-on-apple-tv.svg"
|
||||||
height="40">
|
height="40"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -281,10 +282,10 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fab fa-linux"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/linux.svg" alt="Linux"/>
|
||||||
<i class="fa-fw fa-2x fab fa-apple"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/macos.svg" alt="macOS"/>
|
||||||
<i class="fa-fw fa-2x fab fa-windows"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/windows.svg" alt="Windows"/>
|
||||||
<i class="fa-fw fa-2x fab fa-steam"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/steam.svg" alt="Steam"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -314,7 +315,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fas fa-microchip"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/raspberrypi.svg" alt="Raspberry Pi"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -344,7 +345,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fab fa-xbox"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/xbox.svg" alt="Xbox"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -363,7 +364,7 @@ ext-js:
|
|||||||
<a href="https://apps.microsoft.com/store/detail/moonlight-uwp/9MW1BS08ZBTH" target="_blank">
|
<a href="https://apps.microsoft.com/store/detail/moonlight-uwp/9MW1BS08ZBTH" target="_blank">
|
||||||
<img alt="Get it from Microsoft"
|
<img alt="Get it from Microsoft"
|
||||||
src="https://get.microsoft.com/images/en-us%20dark.svg"
|
src="https://get.microsoft.com/images/en-us%20dark.svg"
|
||||||
height="40">
|
height="40"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -376,7 +377,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fab fa-playstation"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/playstationvita.svg" alt="PlayStation Vita"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -406,12 +407,16 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fas fa-code"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/nintendo-switch.svg" alt="Nintendo Switch"/>
|
||||||
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/android.svg" alt="Android"/>
|
||||||
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/appletv.svg" alt="Apple TV"/>
|
||||||
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ios.svg" alt="iOS"/>
|
||||||
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/macos.svg" alt="macOS"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
<a href="https://github.com/XITRIX/Moonlight-Switch" target="_blank" class="text-white text-decoration-none">
|
<a href="https://github.com/XITRIX/Moonlight-Switch" target="_blank" class="text-white text-decoration-none">
|
||||||
Nintendo Switch
|
Moonlight Switch
|
||||||
</a>
|
</a>
|
||||||
</h5>
|
</h5>
|
||||||
</div>
|
</div>
|
||||||
@@ -436,7 +441,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fas fa-code"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v12/icons/wiiu.svg" alt="Wii U"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -466,7 +471,7 @@ ext-js:
|
|||||||
<div class="card-body p-4">
|
<div class="card-body p-4">
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="icon text-white">
|
<div class="icon text-white">
|
||||||
<i class="fa-fw fa-2x fas fa-code"></i>
|
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/lg.svg" alt="LG webOS TV"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-3">
|
<div class="ms-3">
|
||||||
<h5 class="fw-bolder mb-0">
|
<h5 class="fw-bolder mb-0">
|
||||||
@@ -514,7 +519,7 @@ ext-js:
|
|||||||
</div>
|
</div>
|
||||||
<div class="card-footer p-3 px-4">
|
<div class="card-footer p-3 px-4">
|
||||||
<a class="btn btn-outline-light me-3 mb-3" href="https://docs.lizardbyte.dev/projects/sunshine" target="_blank">
|
<a class="btn btn-outline-light me-3 mb-3" href="https://docs.lizardbyte.dev/projects/sunshine" target="_blank">
|
||||||
<i class="fa-fw fas fa-book"></i>
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/readthedocs.svg" alt="ReadTheDocs"/>
|
||||||
Read the Docs
|
Read the Docs
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -537,27 +542,37 @@ ext-js:
|
|||||||
</div>
|
</div>
|
||||||
<div class="card-footer p-3 px-4">
|
<div class="card-footer p-3 px-4">
|
||||||
<a class="latest-button btn btn-outline-light me-3 mb-3 d-none" href="https://github.com/LizardByte/Sunshine/releases/latest" target="_blank">
|
<a class="latest-button btn btn-outline-light me-3 mb-3 d-none" href="https://github.com/LizardByte/Sunshine/releases/latest" target="_blank">
|
||||||
<i class="fa-fw fab fa-github"></i>
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/github.svg" alt="GitHub"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/windows.svg" alt="Windows"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/debian.svg" alt="Debian"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ubuntu.svg" alt="Ubuntu"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/flatpak.svg" alt="Flatpak"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/linux.svg" alt="AppImage"/>
|
||||||
Latest: <span id="latest-version" class="crowdin-ignore"></span>
|
Latest: <span id="latest-version" class="crowdin-ignore"></span>
|
||||||
</a>
|
</a>
|
||||||
<a class="beta-button btn btn-outline-light me-3 mb-3 d-none" href="#" target="_blank">
|
<a class="beta-button btn btn-outline-light me-3 mb-3 d-none" href="#" target="_blank">
|
||||||
<i class="fa-fw fas fa-flask"></i>
|
<i class="fa-fw fa-lg fas fa-flask"></i>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/windows.svg" alt="Windows"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/debian.svg" alt="Debian"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ubuntu.svg" alt="Ubuntu"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/flatpak.svg" alt="Flatpak"/>
|
||||||
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/linux.svg" alt="AppImage"/>
|
||||||
Beta: <span id="beta-version" class="crowdin-ignore"></span>
|
Beta: <span id="beta-version" class="crowdin-ignore"></span>
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/pacman-repo" target="_blank">
|
<a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/pacman-repo" target="_blank">
|
||||||
<i class="fa-fw fab fa-linux"></i>
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/archlinux.svg" alt="Arch Linux"/>
|
||||||
ArchLinux
|
Arch Linux
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-outline-light me-3 mb-3" href="https://hub.docker.com/r/lizardbyte/sunshine" target="_blank">
|
<a class="btn btn-outline-light me-3 mb-3" href="https://hub.docker.com/r/lizardbyte/sunshine" target="_blank">
|
||||||
<i class="fa-fw fab fa-docker"></i>
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/docker.svg" alt="Docker"/>
|
||||||
Docker
|
Docker
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-outline-light me-3 mb-3" href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine" target="_blank">
|
<a class="btn btn-outline-light me-3 mb-3" href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine" target="_blank">
|
||||||
<i class="fa-fw fab fa-linux"></i>
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/flathub.svg" alt="Flathub"/>
|
||||||
Flathub
|
Flathub
|
||||||
</a>
|
</a>
|
||||||
<a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/homebrew-homebrew" target="_blank">
|
<a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/homebrew-homebrew" target="_blank">
|
||||||
<i class="fa-fw fas fa-beer-mug-empty"></i>
|
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/homebrew.svg" alt="Homebrew"/>
|
||||||
Homebrew
|
Homebrew
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
"vue-i18n": "11.1.3"
|
"vue-i18n": "11.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@codecov/vite-plugin": "1.9.0",
|
||||||
"@vitejs/plugin-vue": "4.6.2",
|
"@vitejs/plugin-vue": "4.6.2",
|
||||||
"serve": "14.2.3",
|
"serve": "14.2.3",
|
||||||
"vite": "4.5.9",
|
"vite": "4.5.9",
|
||||||
|
|||||||
Submodule packaging/linux/flatpak/deps/flatpak-builder-tools updated: aac65cf44c...bf91cb0bee
@@ -29,6 +29,7 @@ class @PROJECT_NAME@ < Formula
|
|||||||
depends_on "cmake" => :build
|
depends_on "cmake" => :build
|
||||||
depends_on "doxygen" => :build
|
depends_on "doxygen" => :build
|
||||||
depends_on "graphviz" => :build
|
depends_on "graphviz" => :build
|
||||||
|
depends_on "ninja" => :build
|
||||||
depends_on "node" => :build
|
depends_on "node" => :build
|
||||||
depends_on "pkg-config" => :build
|
depends_on "pkg-config" => :build
|
||||||
depends_on "curl"
|
depends_on "curl"
|
||||||
@@ -38,6 +39,24 @@ class @PROJECT_NAME@ < Formula
|
|||||||
depends_on "icu4c" => :recommended
|
depends_on "icu4c" => :recommended
|
||||||
|
|
||||||
on_linux do
|
on_linux do
|
||||||
|
# the "build" dependencies are for libayatana-appindicator
|
||||||
|
depends_on "at-spi2-core" => :build
|
||||||
|
depends_on "cairo" => :build
|
||||||
|
depends_on "fontconfig" => :build
|
||||||
|
depends_on "freetype" => :build
|
||||||
|
depends_on "fribidi" => :build
|
||||||
|
depends_on "gettext" => :build
|
||||||
|
depends_on "gobject-introspection" => :build
|
||||||
|
depends_on "graphite2" => :build
|
||||||
|
depends_on "gtk+3" => :build
|
||||||
|
depends_on "harfbuzz" => :build
|
||||||
|
depends_on "intltool" => :build
|
||||||
|
depends_on "libepoxy" => :build
|
||||||
|
depends_on "libxdamage" => :build
|
||||||
|
depends_on "libxkbcommon" => :build
|
||||||
|
depends_on "pango" => :build
|
||||||
|
depends_on "perl" => :build
|
||||||
|
depends_on "pixman" => :build
|
||||||
depends_on "avahi"
|
depends_on "avahi"
|
||||||
depends_on "libcap"
|
depends_on "libcap"
|
||||||
depends_on "libdrm"
|
depends_on "libdrm"
|
||||||
@@ -56,6 +75,128 @@ class @PROJECT_NAME@ < Formula
|
|||||||
depends_on "pulseaudio"
|
depends_on "pulseaudio"
|
||||||
depends_on "systemd"
|
depends_on "systemd"
|
||||||
depends_on "wayland"
|
depends_on "wayland"
|
||||||
|
|
||||||
|
# resources that do not have brew packages
|
||||||
|
resource "libayatana-appindicator" do
|
||||||
|
url "https://github.com/AyatanaIndicators/libayatana-appindicator/archive/refs/tags/0.5.94.tar.gz"
|
||||||
|
sha256 "884a6bc77994c0b58c961613ca4c4b974dc91aa0f804e70e92f38a542d0d0f90"
|
||||||
|
end
|
||||||
|
|
||||||
|
resource "libdbusmenu" do
|
||||||
|
url "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz"
|
||||||
|
sha256 "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a"
|
||||||
|
|
||||||
|
patch 'From 729546c51806a1b3ea6cb6efb7a115b1baa811f1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Stefan=20Br=C3=BCns?= <stefan.bruens@rwth-aachen.de>
|
||||||
|
Date: Mon, 18 Nov 2019 19:58:53 +0100
|
||||||
|
Subject: [PATCH 1/1] Fix HAVE_VALGRIND AM_CONDITIONAL
|
||||||
|
|
||||||
|
The AM_CONDITIONAL should also be run with --disable-tests, otherwise
|
||||||
|
HAVE_VALGRIND is undefined.
|
||||||
|
---
|
||||||
|
configure | 4 ++--
|
||||||
|
configure.ac | 2 +-
|
||||||
|
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index 831a3bb..8913b9b 100644
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -14801,6 +14801,8 @@ else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
have_valgrind=yes
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
fi
|
||||||
|
if test "x$have_valgrind" = "xyes"; then
|
||||||
|
HAVE_VALGRIND_TRUE=
|
||||||
|
@@ -14811,8 +14813,6 @@ else
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index ace54d1..cbd38a6 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -120,8 +120,8 @@ PKG_CHECK_MODULES(DBUSMENUTESTS, json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
|
||||||
|
[have_tests=yes]
|
||||||
|
)
|
||||||
|
PKG_CHECK_MODULES(DBUSMENUTESTSVALGRIND, valgrind, have_valgrind=yes, have_valgrind=no)
|
||||||
|
-AM_CONDITIONAL([HAVE_VALGRIND], [test "x$have_valgrind" = "xyes"])
|
||||||
|
])
|
||||||
|
+AM_CONDITIONAL([HAVE_VALGRIND], [test "x$have_valgrind" = "xyes"])
|
||||||
|
|
||||||
|
AC_SUBST(DBUSMENUTESTS_CFLAGS)
|
||||||
|
AC_SUBST(DBUSMENUTESTS_LIBS)
|
||||||
|
--
|
||||||
|
2.46.2
|
||||||
|
|
||||||
|
|
||||||
|
'
|
||||||
|
end
|
||||||
|
|
||||||
|
resource "ayatana-ido" do
|
||||||
|
url "https://github.com/AyatanaIndicators/ayatana-ido/archive/refs/tags/0.10.4.tar.gz"
|
||||||
|
sha256 "bd59abd5f1314e411d0d55ce3643e91cef633271f58126be529de5fb71c5ab38"
|
||||||
|
|
||||||
|
patch 'From 8a09e6ad33c58c017c0c8fd756da036fc39428ea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alexander Koskovich <akoskovich@pm.me>
|
||||||
|
Date: Sun, 29 Sep 2024 13:47:54 -0400
|
||||||
|
Subject: [PATCH 1/1] Make introspection configurable
|
||||||
|
|
||||||
|
---
|
||||||
|
CMakeLists.txt | 1 +
|
||||||
|
src/CMakeLists.txt | 4 ++++
|
||||||
|
2 files changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 0e13fcd..f3e9ec0 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -12,6 +12,7 @@ endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||||
|
option(ENABLE_TESTS "Enable all tests and checks" OFF)
|
||||||
|
option(ENABLE_COVERAGE "Enable coverage reports (includes enabling all tests and checks)" OFF)
|
||||||
|
option(ENABLE_WERROR "Treat all build warnings as errors" OFF)
|
||||||
|
+option(ENABLE_INTROSPECTION "Enable introspection" ON)
|
||||||
|
|
||||||
|
if(ENABLE_COVERAGE)
|
||||||
|
set(ENABLE_TESTS ON)
|
||||||
|
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
|
||||||
|
index 5b3638d..aca9481 100644
|
||||||
|
--- a/src/CMakeLists.txt
|
||||||
|
+++ b/src/CMakeLists.txt
|
||||||
|
@@ -108,6 +108,8 @@ install(TARGETS "ayatana-ido3-0.4" LIBRARY DESTINATION "${CMAKE_INSTALL_FULL_LIB
|
||||||
|
|
||||||
|
# AyatanaIdo3-0.4.gir
|
||||||
|
|
||||||
|
+if (ENABLE_INTROSPECTION)
|
||||||
|
+
|
||||||
|
find_package(GObjectIntrospection REQUIRED QUIET)
|
||||||
|
|
||||||
|
if (INTROSPECTION_FOUND)
|
||||||
|
@@ -183,3 +185,5 @@ if (INTROSPECTION_FOUND)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
endif ()
|
||||||
|
+
|
||||||
|
+endif ()
|
||||||
|
--
|
||||||
|
2.46.2
|
||||||
|
|
||||||
|
|
||||||
|
'
|
||||||
|
end
|
||||||
|
|
||||||
|
resource "libayatana-indicator" do
|
||||||
|
url "https://github.com/AyatanaIndicators/libayatana-indicator/archive/refs/tags/0.9.4.tar.gz"
|
||||||
|
sha256 "a18d3c682e29afd77db24366f8475b26bda22b0e16ff569a2ec71cd6eb4eac95"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def install
|
def install
|
||||||
@@ -65,12 +206,12 @@ class @PROJECT_NAME@ < Formula
|
|||||||
|
|
||||||
args = %W[
|
args = %W[
|
||||||
-DBUILD_WERROR=ON
|
-DBUILD_WERROR=ON
|
||||||
|
-DCMAKE_CXX_STANDARD=20
|
||||||
-DCMAKE_INSTALL_PREFIX=#{prefix}
|
-DCMAKE_INSTALL_PREFIX=#{prefix}
|
||||||
-DHOMEBREW_ALLOW_FETCHCONTENT=ON
|
-DHOMEBREW_ALLOW_FETCHCONTENT=ON
|
||||||
-DOPENSSL_ROOT_DIR=#{Formula["openssl"].opt_prefix}
|
-DOPENSSL_ROOT_DIR=#{Formula["openssl"].opt_prefix}
|
||||||
-DSUNSHINE_ASSETS_DIR=sunshine/assets
|
-DSUNSHINE_ASSETS_DIR=sunshine/assets
|
||||||
-DSUNSHINE_BUILD_HOMEBREW=ON
|
-DSUNSHINE_BUILD_HOMEBREW=ON
|
||||||
-DSUNSHINE_ENABLE_TRAY=OFF
|
|
||||||
-DSUNSHINE_PUBLISHER_NAME='LizardByte'
|
-DSUNSHINE_PUBLISHER_NAME='LizardByte'
|
||||||
-DSUNSHINE_PUBLISHER_WEBSITE='https://app.lizardbyte.dev'
|
-DSUNSHINE_PUBLISHER_WEBSITE='https://app.lizardbyte.dev'
|
||||||
-DSUNSHINE_PUBLISHER_ISSUE_URL='https://app.lizardbyte.dev/support'
|
-DSUNSHINE_PUBLISHER_ISSUE_URL='https://app.lizardbyte.dev/support'
|
||||||
@@ -105,16 +246,69 @@ class @PROJECT_NAME@ < Formula
|
|||||||
end
|
end
|
||||||
|
|
||||||
args << "-DCUDA_FAIL_ON_MISSING=OFF" if OS.linux?
|
args << "-DCUDA_FAIL_ON_MISSING=OFF" if OS.linux?
|
||||||
|
args << "-DSUNSHINE_ENABLE_TRAY=OFF" if OS.mac?
|
||||||
|
|
||||||
system "cmake", "-S", ".", "-B", "build", *std_cmake_args, *args
|
# Handle system tray on Linux
|
||||||
|
if OS.linux?
|
||||||
|
# Build and install libayatana components
|
||||||
|
|
||||||
cd "build" do
|
# Build libdbusmenu
|
||||||
system "make"
|
resource("libdbusmenu").stage do
|
||||||
system "make", "install"
|
system "./configure",
|
||||||
|
"--prefix=#{prefix}",
|
||||||
|
"--with-gtk=3",
|
||||||
|
"--disable-dumper",
|
||||||
|
"--disable-static",
|
||||||
|
"--disable-tests",
|
||||||
|
"--disable-gtk-doc",
|
||||||
|
"--enable-introspection=no",
|
||||||
|
"--disable-vala"
|
||||||
|
system "make", "install"
|
||||||
|
end
|
||||||
|
|
||||||
bin.install "tests/test_sunshine"
|
# Build ayatana-ido
|
||||||
|
resource("ayatana-ido").stage do
|
||||||
|
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
|
||||||
|
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
|
||||||
|
"-DENABLE_INTROSPECTION=OFF",
|
||||||
|
*std_cmake_args
|
||||||
|
system "ninja", "-C", "build"
|
||||||
|
system "ninja", "-C", "build", "install"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Build libayatana-indicator
|
||||||
|
resource("libayatana-indicator").stage do
|
||||||
|
ENV.append_path "PKG_CONFIG_PATH", "#{lib}/pkgconfig"
|
||||||
|
ENV.append "LDFLAGS", "-L#{lib}"
|
||||||
|
|
||||||
|
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
|
||||||
|
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
|
||||||
|
*std_cmake_args
|
||||||
|
system "ninja", "-C", "build"
|
||||||
|
system "ninja", "-C", "build", "install"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Build libayatana-appindicator
|
||||||
|
resource("libayatana-appindicator").stage do
|
||||||
|
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
|
||||||
|
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
|
||||||
|
"-DENABLE_BINDINGS_MONO=OFF",
|
||||||
|
"-DENABLE_BINDINGS_VALA=OFF",
|
||||||
|
"-DENABLE_GTKDOC=OFF",
|
||||||
|
*std_cmake_args
|
||||||
|
system "ninja", "-C", "build"
|
||||||
|
system "ninja", "-C", "build", "install"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
system "cmake", "-S", ".", "-B", "build", "-G", "Unix Makefiles",
|
||||||
|
*std_cmake_args,
|
||||||
|
*args
|
||||||
|
|
||||||
|
system "make", "-C", "build"
|
||||||
|
system "make", "-C", "build", "install"
|
||||||
|
bin.install "build/tests/test_sunshine"
|
||||||
|
|
||||||
# codesign the binary on intel macs
|
# codesign the binary on intel macs
|
||||||
system "codesign", "-s", "-", "--force", "--deep", bin/"sunshine" if OS.mac? && Hardware::CPU.intel?
|
system "codesign", "-s", "-", "--force", "--deep", bin/"sunshine" if OS.mac? && Hardware::CPU.intel?
|
||||||
|
|
||||||
@@ -157,6 +351,7 @@ class @PROJECT_NAME@ < Formula
|
|||||||
system bin/"sunshine", "--version"
|
system bin/"sunshine", "--version"
|
||||||
|
|
||||||
# run the test suite
|
# run the test suite
|
||||||
system bin/"test_sunshine", "--gtest_color=yes"
|
system bin/"test_sunshine", "--gtest_color=yes", "--gtest_output=xml:test_results.xml"
|
||||||
|
assert_path_exists testpath/"test_results.xml"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -90,6 +90,52 @@ shift $((OPTIND -1))
|
|||||||
# dependencies array to build out
|
# dependencies array to build out
|
||||||
dependencies=()
|
dependencies=()
|
||||||
|
|
||||||
|
function add_arch_deps() {
|
||||||
|
dependencies+=(
|
||||||
|
'avahi'
|
||||||
|
'base-devel'
|
||||||
|
'cmake'
|
||||||
|
'curl'
|
||||||
|
"gcc${gcc_version}"
|
||||||
|
"gcc${gcc_version}-libs"
|
||||||
|
'git'
|
||||||
|
'libayatana-appindicator'
|
||||||
|
'libcap'
|
||||||
|
'libdrm'
|
||||||
|
'libevdev'
|
||||||
|
'libmfx'
|
||||||
|
'libnotify'
|
||||||
|
'libpulse'
|
||||||
|
'libva'
|
||||||
|
'libx11'
|
||||||
|
'libxcb'
|
||||||
|
'libxfixes'
|
||||||
|
'libxrandr'
|
||||||
|
'libxtst'
|
||||||
|
'miniupnpc'
|
||||||
|
'ninja'
|
||||||
|
'nodejs'
|
||||||
|
'npm'
|
||||||
|
'numactl'
|
||||||
|
'openssl'
|
||||||
|
'opus'
|
||||||
|
'udev'
|
||||||
|
'wayland'
|
||||||
|
)
|
||||||
|
|
||||||
|
if [ "$skip_libva" == 0 ]; then
|
||||||
|
dependencies+=(
|
||||||
|
"libva" # VA-API
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$skip_cuda" == 0 ]; then
|
||||||
|
dependencies+=(
|
||||||
|
"cuda" # VA-API
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function add_debian_based_deps() {
|
function add_debian_based_deps() {
|
||||||
dependencies+=(
|
dependencies+=(
|
||||||
"bison" # required if we need to compile doxygen
|
"bison" # required if we need to compile doxygen
|
||||||
@@ -157,8 +203,8 @@ function add_fedora_deps() {
|
|||||||
dependencies+=(
|
dependencies+=(
|
||||||
"cmake"
|
"cmake"
|
||||||
"doxygen"
|
"doxygen"
|
||||||
"gcc"
|
"gcc${gcc_version}"
|
||||||
"g++"
|
"gcc${gcc_version}-c++"
|
||||||
"git"
|
"git"
|
||||||
"graphviz"
|
"graphviz"
|
||||||
"libappindicator-gtk3-devel"
|
"libappindicator-gtk3-devel"
|
||||||
@@ -198,9 +244,15 @@ function add_fedora_deps() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function install_cuda() {
|
function install_cuda() {
|
||||||
|
nvcc_path=$(command -v nvcc 2>/dev/null) || true
|
||||||
|
if [ -n "$nvcc_path" ]; then
|
||||||
|
echo "found system cuda"
|
||||||
|
return
|
||||||
|
fi
|
||||||
# check if we need to install cuda
|
# check if we need to install cuda
|
||||||
if [ -f "${build_dir}/cuda/bin/nvcc" ]; then
|
if [ -f "${build_dir}/cuda/bin/nvcc" ]; then
|
||||||
echo "cuda already installed"
|
nvcc_path="${build_dir}/cuda/bin/nvcc"
|
||||||
|
echo "found local cuda"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -237,11 +289,13 @@ function install_cuda() {
|
|||||||
chmod a+x "${build_dir}/cuda.run"
|
chmod a+x "${build_dir}/cuda.run"
|
||||||
"${build_dir}/cuda.run" --silent --toolkit --toolkitpath="${build_dir}/cuda" --no-opengl-libs --no-man-page --no-drm
|
"${build_dir}/cuda.run" --silent --toolkit --toolkitpath="${build_dir}/cuda" --no-opengl-libs --no-man-page --no-drm
|
||||||
rm "${build_dir}/cuda.run"
|
rm "${build_dir}/cuda.run"
|
||||||
|
nvcc_path="${build_dir}/cuda/bin/nvcc"
|
||||||
}
|
}
|
||||||
|
|
||||||
function check_version() {
|
function check_version() {
|
||||||
local package_name=$1
|
local package_name=$1
|
||||||
local min_version=$2
|
local min_version=$2
|
||||||
|
local max_version=$3
|
||||||
local installed_version
|
local installed_version
|
||||||
|
|
||||||
echo "Checking if $package_name is installed and at least version $min_version"
|
echo "Checking if $package_name is installed and at least version $min_version"
|
||||||
@@ -250,6 +304,8 @@ function check_version() {
|
|||||||
installed_version=$(dpkg -s "$package_name" 2>/dev/null | grep '^Version:' | awk '{print $2}')
|
installed_version=$(dpkg -s "$package_name" 2>/dev/null | grep '^Version:' | awk '{print $2}')
|
||||||
elif [ "$distro" == "fedora" ]; then
|
elif [ "$distro" == "fedora" ]; then
|
||||||
installed_version=$(rpm -q --queryformat '%{VERSION}' "$package_name" 2>/dev/null)
|
installed_version=$(rpm -q --queryformat '%{VERSION}' "$package_name" 2>/dev/null)
|
||||||
|
elif [ "$distro" == "arch" ]; then
|
||||||
|
installed_version=$(pacman -Q "$package_name" | awk '{print $2}' )
|
||||||
else
|
else
|
||||||
echo "Unsupported Distro"
|
echo "Unsupported Distro"
|
||||||
return 1
|
return 1
|
||||||
@@ -260,11 +316,12 @@ function check_version() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$(printf '%s\n' "$installed_version" "$min_version" | sort -V | head -n1)" = "$min_version" ]; then
|
if [[ "$(printf '%s\n' "$installed_version" "$min_version" | sort -V | head -n1)" = "$min_version" ]] && \
|
||||||
echo "$package_name version $installed_version is at least $min_version"
|
[[ "$(printf '%s\n' "$installed_version" "$max_version" | sort -V | head -n1)" = "$installed_version" ]]; then
|
||||||
|
echo "Installed version is within range"
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
echo "$package_name version $installed_version is less than $min_version"
|
echo "$package_name version $installed_version is out of range"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -305,7 +362,9 @@ function run_install() {
|
|||||||
# Update the package list
|
# Update the package list
|
||||||
$package_update_command
|
$package_update_command
|
||||||
|
|
||||||
if [ "$distro" == "debian" ]; then
|
if [ "$distro" == "arch" ]; then
|
||||||
|
add_arch_deps
|
||||||
|
elif [ "$distro" == "debian" ]; then
|
||||||
add_debian_deps
|
add_debian_deps
|
||||||
elif [ "$distro" == "ubuntu" ]; then
|
elif [ "$distro" == "ubuntu" ]; then
|
||||||
add_ubuntu_deps
|
add_ubuntu_deps
|
||||||
@@ -314,7 +373,7 @@ function run_install() {
|
|||||||
${sudo_cmd} dnf group install "development-tools" -y
|
${sudo_cmd} dnf group install "development-tools" -y
|
||||||
elif [ "$distro" == "fedora" ] && [ "$version" <= "40" ]; then
|
elif [ "$distro" == "fedora" ] && [ "$version" <= "40" ]; then
|
||||||
add_fedora_deps
|
add_fedora_deps
|
||||||
${sudo_cmd} dnf group install "Development Tools" -y
|
${sudo_cmd} dnf group install "$dev_tools_group" -y
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@@ -333,8 +392,11 @@ function run_install() {
|
|||||||
"gcc-ranlib"
|
"gcc-ranlib"
|
||||||
)
|
)
|
||||||
|
|
||||||
# update alternatives for gcc and g++ if a debian based distro
|
#set gcc version based on distros
|
||||||
if [ "$distro" == "debian" ] || [ "$distro" == "ubuntu" ]; then
|
if [ "$distro" == "arch" ]; then
|
||||||
|
export CC=gcc-14
|
||||||
|
export CXX=g++-14
|
||||||
|
elif [ "$distro" == "debian" ] || [ "$distro" == "ubuntu" ]; then
|
||||||
for file in "${gcc_alternative_files[@]}"; do
|
for file in "${gcc_alternative_files[@]}"; do
|
||||||
file_path="/etc/alternatives/$file"
|
file_path="/etc/alternatives/$file"
|
||||||
if [ -e "$file_path" ]; then
|
if [ -e "$file_path" ]; then
|
||||||
@@ -353,7 +415,7 @@ function run_install() {
|
|||||||
# compile cmake if the version is too low
|
# compile cmake if the version is too low
|
||||||
cmake_min="3.25.0"
|
cmake_min="3.25.0"
|
||||||
target_cmake_version="3.30.1"
|
target_cmake_version="3.30.1"
|
||||||
if ! check_version "cmake" "$cmake_min"; then
|
if ! check_version "cmake" "$cmake_min" "inf"; then
|
||||||
cmake_prefix="https://github.com/Kitware/CMake/releases/download/v"
|
cmake_prefix="https://github.com/Kitware/CMake/releases/download/v"
|
||||||
if [ "$architecture" == "x86_64" ]; then
|
if [ "$architecture" == "x86_64" ]; then
|
||||||
cmake_arch="x86_64"
|
cmake_arch="x86_64"
|
||||||
@@ -371,7 +433,8 @@ function run_install() {
|
|||||||
# compile doxygen if version is too low
|
# compile doxygen if version is too low
|
||||||
doxygen_min="1.10.0"
|
doxygen_min="1.10.0"
|
||||||
_doxygen_min="1_10_0"
|
_doxygen_min="1_10_0"
|
||||||
if ! check_version "doxygen" "$doxygen_min"; then
|
doxygen_max="1.12.0"
|
||||||
|
if ! check_version "doxygen" "$doxygen_min" "$doxygen_max"; then
|
||||||
if [ "${SUNSHINE_COMPILE_DOXYGEN}" == "true" ]; then
|
if [ "${SUNSHINE_COMPILE_DOXYGEN}" == "true" ]; then
|
||||||
echo "Compiling doxygen"
|
echo "Compiling doxygen"
|
||||||
doxygen_url="https://github.com/doxygen/doxygen/releases/download/Release_${_doxygen_min}/doxygen-${doxygen_min}.src.tar.gz"
|
doxygen_url="https://github.com/doxygen/doxygen/releases/download/Release_${_doxygen_min}/doxygen-${doxygen_min}.src.tar.gz"
|
||||||
@@ -383,7 +446,7 @@ function run_install() {
|
|||||||
ninja -C "build" -j"${num_processors}"
|
ninja -C "build" -j"${num_processors}"
|
||||||
ninja -C "build" install
|
ninja -C "build" install
|
||||||
else
|
else
|
||||||
echo "Doxygen version too low, skipping docs"
|
echo "Doxygen version not in range, skipping docs"
|
||||||
cmake_args+=("-DBUILD_DOCS=OFF")
|
cmake_args+=("-DBUILD_DOCS=OFF")
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -399,12 +462,10 @@ function run_install() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# run the cuda install
|
# run the cuda install
|
||||||
if [ -n "$cuda_version" ] && [ "$skip_cuda" == 0 ]; then
|
if [ "$skip_cuda" == 0 ]; then
|
||||||
install_cuda
|
install_cuda
|
||||||
cmake_args+=("-DSUNSHINE_ENABLE_CUDA=ON")
|
cmake_args+=("-DSUNSHINE_ENABLE_CUDA=ON")
|
||||||
cmake_args+=("-DCMAKE_CUDA_COMPILER:PATH=${build_dir}/cuda/bin/nvcc")
|
cmake_args+=("-DCMAKE_CUDA_COMPILER:PATH=$nvcc_path")
|
||||||
else
|
|
||||||
cmake_args+=("-DSUNSHINE_ENABLE_CUDA=OFF")
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Cmake stuff here
|
# Cmake stuff here
|
||||||
@@ -444,7 +505,15 @@ function run_install() {
|
|||||||
|
|
||||||
# Determine the OS and call the appropriate function
|
# Determine the OS and call the appropriate function
|
||||||
cat /etc/os-release
|
cat /etc/os-release
|
||||||
if grep -q "Debian GNU/Linux 12 (bookworm)" /etc/os-release; then
|
|
||||||
|
if grep -q "Arch Linux" /etc/os-release; then
|
||||||
|
distro="arch"
|
||||||
|
version=""
|
||||||
|
package_update_command="${sudo_cmd} pacman -Syu --noconfirm"
|
||||||
|
package_install_command="${sudo_cmd} pacman -Sy --needed"
|
||||||
|
nvm_node=0
|
||||||
|
gcc_version="14"
|
||||||
|
elif grep -q "Debian GNU/Linux 12 (bookworm)" /etc/os-release; then
|
||||||
distro="debian"
|
distro="debian"
|
||||||
version="12"
|
version="12"
|
||||||
package_update_command="${sudo_cmd} apt-get update"
|
package_update_command="${sudo_cmd} apt-get update"
|
||||||
@@ -453,33 +522,36 @@ if grep -q "Debian GNU/Linux 12 (bookworm)" /etc/os-release; then
|
|||||||
cuda_build="525.60.13"
|
cuda_build="525.60.13"
|
||||||
gcc_version="12"
|
gcc_version="12"
|
||||||
nvm_node=0
|
nvm_node=0
|
||||||
elif grep -q "PLATFORM_ID=\"platform:f39\"" /etc/os-release; then
|
|
||||||
distro="fedora"
|
|
||||||
version="39"
|
|
||||||
package_update_command="${sudo_cmd} dnf update -y"
|
|
||||||
package_install_command="${sudo_cmd} dnf install -y"
|
|
||||||
cuda_version="12.4.0"
|
|
||||||
cuda_build="550.54.14"
|
|
||||||
gcc_version="13"
|
|
||||||
nvm_node=0
|
|
||||||
elif grep -q "PLATFORM_ID=\"platform:f40\"" /etc/os-release; then
|
elif grep -q "PLATFORM_ID=\"platform:f40\"" /etc/os-release; then
|
||||||
distro="fedora"
|
distro="fedora"
|
||||||
version="40"
|
version="40"
|
||||||
package_update_command="${sudo_cmd} dnf update -y"
|
package_update_command="${sudo_cmd} dnf update -y"
|
||||||
package_install_command="${sudo_cmd} dnf install -y"
|
package_install_command="${sudo_cmd} dnf install -y"
|
||||||
cuda_version=
|
cuda_version=12.6.3
|
||||||
cuda_build=
|
cuda_build=560.35.05
|
||||||
gcc_version="13"
|
gcc_version="13"
|
||||||
nvm_node=0
|
nvm_node=0
|
||||||
|
dev_tools_group="Development Tools"
|
||||||
elif grep -q "PLATFORM_ID=\"platform:f41\"" /etc/os-release; then
|
elif grep -q "PLATFORM_ID=\"platform:f41\"" /etc/os-release; then
|
||||||
distro="fedora"
|
distro="fedora"
|
||||||
version="41"
|
version="41"
|
||||||
package_update_command="${sudo_cmd} dnf update -y"
|
package_update_command="${sudo_cmd} dnf update -y"
|
||||||
package_install_command="${sudo_cmd} dnf install -y"
|
package_install_command="${sudo_cmd} dnf install -y"
|
||||||
cuda_version=
|
cuda_version=12.6.3
|
||||||
cuda_build=
|
cuda_build=560.35.05
|
||||||
gcc_version="13"
|
gcc_version="13"
|
||||||
nvm_node=0
|
nvm_node=0
|
||||||
|
dev_tools_group="development-tools"
|
||||||
|
elif grep -q "PLATFORM_ID=\"platform:f42\"" /etc/os-release; then
|
||||||
|
distro="fedora"
|
||||||
|
version="42"
|
||||||
|
package_update_command="${sudo_cmd} dnf update -y"
|
||||||
|
package_install_command="${sudo_cmd} dnf install -y"
|
||||||
|
cuda_version=12.8.1
|
||||||
|
cuda_build=570.124.06
|
||||||
|
gcc_version="14"
|
||||||
|
nvm_node=0
|
||||||
|
dev_tools_group="development-tools"
|
||||||
elif grep -q "Ubuntu 22.04" /etc/os-release; then
|
elif grep -q "Ubuntu 22.04" /etc/os-release; then
|
||||||
distro="ubuntu"
|
distro="ubuntu"
|
||||||
version="22.04"
|
version="22.04"
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
Babel==2.17.0
|
Babel==2.17.0
|
||||||
clang-format
|
clang-format==20.*
|
||||||
|
|||||||
@@ -129,13 +129,10 @@ namespace audio {
|
|||||||
|
|
||||||
void capture(safe::mail_t mail, config_t config, void *channel_data) {
|
void capture(safe::mail_t mail, config_t config, void *channel_data) {
|
||||||
auto shutdown_event = mail->event<bool>(mail::shutdown);
|
auto shutdown_event = mail->event<bool>(mail::shutdown);
|
||||||
|
if (!config::audio.stream || config.input_only) {
|
||||||
if (config.input_only) {
|
|
||||||
BOOST_LOG(info) << "Input only session, audio will not be captured."sv;
|
|
||||||
shutdown_event->view();
|
shutdown_event->view();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto stream = stream_configs[map_stream(config.channels, config.flags[config_t::HIGH_QUALITY])];
|
auto stream = stream_configs[map_stream(config.channels, config.flags[config_t::HIGH_QUALITY])];
|
||||||
if (config.flags[config_t::CUSTOM_SURROUND_PARAMS]) {
|
if (config.flags[config_t::CUSTOM_SURROUND_PARAMS]) {
|
||||||
apply_surround_params(stream, config.customStreamParams);
|
apply_surround_params(stream, config.customStreamParams);
|
||||||
|
|||||||
@@ -416,12 +416,7 @@ namespace config {
|
|||||||
auto final_resolution = entry.template get_optional<std::string>("final_resolution"s);
|
auto final_resolution = entry.template get_optional<std::string>("final_resolution"s);
|
||||||
auto final_refresh_rate = entry.template get_optional<std::string>("final_refresh_rate"s);
|
auto final_refresh_rate = entry.template get_optional<std::string>("final_refresh_rate"s);
|
||||||
|
|
||||||
output_field.push_back(video_t::dd_t::mode_remapping_entry_t {
|
output_field.push_back(video_t::dd_t::mode_remapping_entry_t {requested_resolution.value_or(""), requested_fps.value_or(""), final_resolution.value_or(""), final_refresh_rate.value_or("")});
|
||||||
requested_resolution.value_or(""),
|
|
||||||
requested_fps.value_or(""),
|
|
||||||
final_resolution.value_or(""),
|
|
||||||
final_refresh_rate.value_or("")
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -523,6 +518,7 @@ namespace config {
|
|||||||
audio_t audio {
|
audio_t audio {
|
||||||
{}, // audio_sink
|
{}, // audio_sink
|
||||||
{}, // virtual_sink
|
{}, // virtual_sink
|
||||||
|
true, // stream audio
|
||||||
true, // install_steam_drivers
|
true, // install_steam_drivers
|
||||||
true, // keep_sink_default
|
true, // keep_sink_default
|
||||||
true, // auto_capture
|
true, // auto_capture
|
||||||
@@ -1215,6 +1211,7 @@ namespace config {
|
|||||||
|
|
||||||
string_f(vars, "audio_sink", audio.sink);
|
string_f(vars, "audio_sink", audio.sink);
|
||||||
string_f(vars, "virtual_sink", audio.virtual_sink);
|
string_f(vars, "virtual_sink", audio.virtual_sink);
|
||||||
|
bool_f(vars, "stream_audio", audio.stream);
|
||||||
bool_f(vars, "install_steam_audio_drivers", audio.install_steam_drivers);
|
bool_f(vars, "install_steam_audio_drivers", audio.install_steam_drivers);
|
||||||
bool_f(vars, "keep_sink_default", audio.keep_default);
|
bool_f(vars, "keep_sink_default", audio.keep_default);
|
||||||
bool_f(vars, "auto_capture_sink", audio.auto_capture);
|
bool_f(vars, "auto_capture_sink", audio.auto_capture);
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ namespace config {
|
|||||||
struct audio_t {
|
struct audio_t {
|
||||||
std::string sink;
|
std::string sink;
|
||||||
std::string virtual_sink;
|
std::string virtual_sink;
|
||||||
|
bool stream;
|
||||||
bool install_steam_drivers;
|
bool install_steam_drivers;
|
||||||
bool keep_default;
|
bool keep_default;
|
||||||
bool auto_capture;
|
bool auto_capture;
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ namespace net {
|
|||||||
|
|
||||||
std::uint16_t map_port(int port) {
|
std::uint16_t map_port(int port) {
|
||||||
// calculate the port from the config port
|
// calculate the port from the config port
|
||||||
auto mapped_port = (std::uint16_t)((int) config::sunshine.port + port);
|
auto mapped_port = (std::uint16_t) ((int) config::sunshine.port + port);
|
||||||
|
|
||||||
// Ensure port is in the range of 1024-65535
|
// Ensure port is in the range of 1024-65535
|
||||||
if (mapped_port < 1024 || mapped_port > 65535) {
|
if (mapped_port < 1024 || mapped_port > 65535) {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ extern "C" {
|
|||||||
// There aren't that many DRM_FORMAT I need to use, so define them here
|
// There aren't that many DRM_FORMAT I need to use, so define them here
|
||||||
//
|
//
|
||||||
// They aren't likely to change any time soon.
|
// They aren't likely to change any time soon.
|
||||||
#define fourcc_code(a, b, c, d) ((std::uint32_t)(a) | ((std::uint32_t)(b) << 8) | ((std::uint32_t)(c) << 16) | ((std::uint32_t)(d) << 24))
|
#define fourcc_code(a, b, c, d) ((std::uint32_t) (a) | ((std::uint32_t) (b) << 8) | ((std::uint32_t) (c) << 16) | ((std::uint32_t) (d) << 24))
|
||||||
#define fourcc_mod_code(vendor, val) ((((uint64_t) vendor) << 56) | ((val) & 0x00ffffffffffffffULL))
|
#define fourcc_mod_code(vendor, val) ((((uint64_t) vendor) << 56) | ((val) & 0x00ffffffffffffffULL))
|
||||||
#define DRM_FORMAT_MOD_INVALID fourcc_mod_code(0, ((1ULL << 56) - 1))
|
#define DRM_FORMAT_MOD_INVALID fourcc_mod_code(0, ((1ULL << 56) - 1))
|
||||||
|
|
||||||
|
|||||||
@@ -117,15 +117,26 @@ namespace {
|
|||||||
|
|
||||||
using virtual_sink_waveformats_t = std::vector<WAVEFORMATEXTENSIBLE>;
|
using virtual_sink_waveformats_t = std::vector<WAVEFORMATEXTENSIBLE>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief List of supported waveformats for an N-channel virtual audio device
|
||||||
|
* @tparam channel_count Number of virtual audio channels
|
||||||
|
* @returns std::vector<WAVEFORMATEXTENSIBLE>
|
||||||
|
* @note The list of virtual formats returned are sorted in preference order and the first valid
|
||||||
|
* format will be used. All bits-per-sample options are listed because we try to match
|
||||||
|
* this to the default audio device. See also: set_format() below.
|
||||||
|
*/
|
||||||
template<WORD channel_count>
|
template<WORD channel_count>
|
||||||
virtual_sink_waveformats_t create_virtual_sink_waveformats() {
|
virtual_sink_waveformats_t create_virtual_sink_waveformats() {
|
||||||
if constexpr (channel_count == 2) {
|
if constexpr (channel_count == 2) {
|
||||||
auto channel_mask = waveformat_mask_stereo;
|
auto channel_mask = waveformat_mask_stereo;
|
||||||
// only choose 24 or 16-bit formats to avoid clobbering existing Dolby/DTS spatial audio settings
|
// The 32-bit formats are a lower priority for stereo because using one will disable Dolby/DTS
|
||||||
|
// spatial audio mode if the user enabled it on the Steam speaker.
|
||||||
return {
|
return {
|
||||||
create_waveformat(sample_format_e::s24in32, channel_count, channel_mask),
|
create_waveformat(sample_format_e::s24in32, channel_count, channel_mask),
|
||||||
create_waveformat(sample_format_e::s24, channel_count, channel_mask),
|
create_waveformat(sample_format_e::s24, channel_count, channel_mask),
|
||||||
create_waveformat(sample_format_e::s16, channel_count, channel_mask),
|
create_waveformat(sample_format_e::s16, channel_count, channel_mask),
|
||||||
|
create_waveformat(sample_format_e::f32, channel_count, channel_mask),
|
||||||
|
create_waveformat(sample_format_e::s32, channel_count, channel_mask),
|
||||||
};
|
};
|
||||||
} else if (channel_count == 6) {
|
} else if (channel_count == 6) {
|
||||||
auto channel_mask1 = waveformat_mask_surround51_with_backspeakers;
|
auto channel_mask1 = waveformat_mask_surround51_with_backspeakers;
|
||||||
@@ -298,6 +309,10 @@ namespace platf::audio {
|
|||||||
auto waveformatext_pointer = reinterpret_cast<const WAVEFORMATEXTENSIBLE *>(mixer_waveformat.get());
|
auto waveformatext_pointer = reinterpret_cast<const WAVEFORMATEXTENSIBLE *>(mixer_waveformat.get());
|
||||||
capture_waveformat.dwChannelMask = waveformatext_pointer->dwChannelMask;
|
capture_waveformat.dwChannelMask = waveformatext_pointer->dwChannelMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_LOG(info) << "Audio mixer format is "sv << mixer_waveformat->wBitsPerSample << "-bit, "sv
|
||||||
|
<< mixer_waveformat->nSamplesPerSec << " Hz, "sv
|
||||||
|
<< ((mixer_waveformat->nSamplesPerSec != 48000) ? "will be resampled to 48000 by Windows"sv : "no resampling needed"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
status = audio_client->Initialize(
|
status = audio_client->Initialize(
|
||||||
@@ -315,7 +330,7 @@ namespace platf::audio {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_LOG(info) << "Audio capture format is " << logging::bracket(waveformat_to_pretty_string(capture_waveformat));
|
BOOST_LOG(info) << "Audio capture format is "sv << logging::bracket(waveformat_to_pretty_string(capture_waveformat));
|
||||||
|
|
||||||
return audio_client;
|
return audio_client;
|
||||||
}
|
}
|
||||||
@@ -795,6 +810,22 @@ namespace platf::audio {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When switching to a Steam virtual speaker device, try to retain the bit depth of the
|
||||||
|
// default audio device. Switching from a 16-bit device to a 24-bit one has been known to
|
||||||
|
// cause glitches for some users.
|
||||||
|
int wanted_bits_per_sample = 32;
|
||||||
|
auto current_default_dev = default_device(device_enum);
|
||||||
|
if (current_default_dev) {
|
||||||
|
audio::prop_t prop;
|
||||||
|
prop_var_t current_device_format;
|
||||||
|
|
||||||
|
if (SUCCEEDED(current_default_dev->OpenPropertyStore(STGM_READ, &prop)) && SUCCEEDED(prop->GetValue(PKEY_AudioEngine_DeviceFormat, ¤t_device_format.prop))) {
|
||||||
|
auto *format = (WAVEFORMATEXTENSIBLE *) current_device_format.prop.blob.pBlobData;
|
||||||
|
wanted_bits_per_sample = format->Samples.wValidBitsPerSample;
|
||||||
|
BOOST_LOG(info) << "Virtual audio device will use "sv << wanted_bits_per_sample << "-bit to match default device"sv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto &device_id = virtual_sink_info->first;
|
auto &device_id = virtual_sink_info->first;
|
||||||
auto &waveformats = virtual_sink_info->second.get().virtual_sink_waveformats;
|
auto &waveformats = virtual_sink_info->second.get().virtual_sink_waveformats;
|
||||||
for (const auto &waveformat : waveformats) {
|
for (const auto &waveformat : waveformats) {
|
||||||
@@ -804,6 +835,10 @@ namespace platf::audio {
|
|||||||
auto waveformat_copy = waveformat;
|
auto waveformat_copy = waveformat;
|
||||||
auto waveformat_copy_pointer = reinterpret_cast<WAVEFORMATEX *>(&waveformat_copy);
|
auto waveformat_copy_pointer = reinterpret_cast<WAVEFORMATEX *>(&waveformat_copy);
|
||||||
|
|
||||||
|
if (wanted_bits_per_sample != waveformat.Samples.wValidBitsPerSample) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
WAVEFORMATEXTENSIBLE p {};
|
WAVEFORMATEXTENSIBLE p {};
|
||||||
if (SUCCEEDED(policy->SetDeviceFormat(device_id_copy.c_str(), waveformat_copy_pointer, (WAVEFORMATEX *) &p))) {
|
if (SUCCEEDED(policy->SetDeviceFormat(device_id_copy.c_str(), waveformat_copy_pointer, (WAVEFORMATEX *) &p))) {
|
||||||
BOOST_LOG(info) << "Changed virtual audio sink format to " << logging::bracket(waveformat_to_pretty_string(waveformat));
|
BOOST_LOG(info) << "Changed virtual audio sink format to " << logging::bracket(waveformat_to_pretty_string(waveformat));
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ namespace platf::dxgi {
|
|||||||
{
|
{
|
||||||
util::buffer_t<std::uint8_t> cursor_img = img_data;
|
util::buffer_t<std::uint8_t> cursor_img = img_data;
|
||||||
std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) {
|
std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) {
|
||||||
auto alpha = (std::uint8_t)((pixel >> 24) & 0xFF);
|
auto alpha = (std::uint8_t) ((pixel >> 24) & 0xFF);
|
||||||
if (alpha == 0xFF) {
|
if (alpha == 0xFF) {
|
||||||
// Pixels with 0xFF alpha will be XOR-blended as is.
|
// Pixels with 0xFF alpha will be XOR-blended as is.
|
||||||
} else if (alpha == 0x00) {
|
} else if (alpha == 0x00) {
|
||||||
@@ -286,7 +286,7 @@ namespace platf::dxgi {
|
|||||||
{
|
{
|
||||||
util::buffer_t<std::uint8_t> cursor_img = img_data;
|
util::buffer_t<std::uint8_t> cursor_img = img_data;
|
||||||
std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) {
|
std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) {
|
||||||
auto alpha = (std::uint8_t)((pixel >> 24) & 0xFF);
|
auto alpha = (std::uint8_t) ((pixel >> 24) & 0xFF);
|
||||||
if (alpha == 0xFF) {
|
if (alpha == 0xFF) {
|
||||||
// Pixels with 0xFF alpha will be XOR-blended by make_cursor_xor_image().
|
// Pixels with 0xFF alpha will be XOR-blended by make_cursor_xor_image().
|
||||||
// We make them transparent for the alpha-blended cursor image.
|
// We make them transparent for the alpha-blended cursor image.
|
||||||
|
|||||||
@@ -92,10 +92,10 @@ namespace platf {
|
|||||||
|
|
||||||
constexpr float EARTH_G = 9.80665f;
|
constexpr float EARTH_G = 9.80665f;
|
||||||
|
|
||||||
#define MPS2_TO_DS4_ACCEL(x) (int32_t)(((x) / EARTH_G) * 8192)
|
#define MPS2_TO_DS4_ACCEL(x) (int32_t) (((x) / EARTH_G) * 8192)
|
||||||
#define DPS_TO_DS4_GYRO(x) (int32_t)((x) * (1024 / 64))
|
#define DPS_TO_DS4_GYRO(x) (int32_t) ((x) * (1024 / 64))
|
||||||
|
|
||||||
#define APPLY_CALIBRATION(val, bias, scale) (int32_t)(((float) (val) + (bias)) / (scale))
|
#define APPLY_CALIBRATION(val, bias, scale) (int32_t) (((float) (val) + (bias)) / (scale))
|
||||||
|
|
||||||
constexpr DS4_TOUCH ds4_touch_unused = {
|
constexpr DS4_TOUCH ds4_touch_unused = {
|
||||||
.bPacketCounter = 0,
|
.bPacketCounter = 0,
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ namespace rtsp_stream {
|
|||||||
boost::asio::async_read(sock, boost::asio::buffer(begin, sizeof(encrypted_rtsp_header_t)), boost::bind(&socket_t::handle_read_encrypted_header, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
|
boost::asio::async_read(sock, boost::asio::buffer(begin, sizeof(encrypted_rtsp_header_t)), boost::bind(&socket_t::handle_read_encrypted_header, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
|
||||||
} else {
|
} else {
|
||||||
sock.async_read_some(
|
sock.async_read_some(
|
||||||
boost::asio::buffer(begin, (std::size_t)(std::end(msg_buf) - begin)),
|
boost::asio::buffer(begin, (std::size_t) (std::end(msg_buf) - begin)),
|
||||||
boost::bind(
|
boost::bind(
|
||||||
&socket_t::handle_read_plaintext,
|
&socket_t::handle_read_plaintext,
|
||||||
shared_from_this(),
|
shared_from_this(),
|
||||||
@@ -253,7 +253,7 @@ namespace rtsp_stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sock.async_read_some(
|
sock.async_read_some(
|
||||||
boost::asio::buffer(begin, (std::size_t)(std::end(msg_buf) - begin)),
|
boost::asio::buffer(begin, (std::size_t) (std::end(msg_buf) - begin)),
|
||||||
boost::bind(
|
boost::bind(
|
||||||
&socket_t::handle_plaintext_payload,
|
&socket_t::handle_plaintext_payload,
|
||||||
shared_from_this(),
|
shared_from_this(),
|
||||||
@@ -289,7 +289,7 @@ namespace rtsp_stream {
|
|||||||
|
|
||||||
auto end = socket->begin + bytes;
|
auto end = socket->begin + bytes;
|
||||||
msg_t req {new msg_t::element_type {}};
|
msg_t req {new msg_t::element_type {}};
|
||||||
if (auto status = parseRtspMessage(req.get(), socket->msg_buf.data(), (std::size_t)(end - socket->msg_buf.data()))) {
|
if (auto status = parseRtspMessage(req.get(), socket->msg_buf.data(), (std::size_t) (end - socket->msg_buf.data()))) {
|
||||||
BOOST_LOG(error) << "Malformed RTSP message: ["sv << status << ']';
|
BOOST_LOG(error) << "Malformed RTSP message: ["sv << status << ']';
|
||||||
|
|
||||||
respond(socket->sock, *socket->session, nullptr, 400, "BAD REQUEST", 0, {});
|
respond(socket->sock, *socket->session, nullptr, 400, "BAD REQUEST", 0, {});
|
||||||
@@ -321,7 +321,7 @@ namespace rtsp_stream {
|
|||||||
|
|
||||||
if (end - socket->crlf >= content_length) {
|
if (end - socket->crlf >= content_length) {
|
||||||
if (end - socket->crlf > content_length) {
|
if (end - socket->crlf > content_length) {
|
||||||
BOOST_LOG(warning) << "(end - socket->crlf) > content_length -- "sv << (std::size_t)(end - socket->crlf) << " > "sv << content_length;
|
BOOST_LOG(warning) << "(end - socket->crlf) > content_length -- "sv << (std::size_t) (end - socket->crlf) << " > "sv << content_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
fg.disable();
|
fg.disable();
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ namespace util {
|
|||||||
return (std::uint8_t) ch - '0';
|
return (std::uint8_t) ch - '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
return (std::uint8_t)(ch | (char) 32) - 'a' + (char) 10;
|
return (std::uint8_t) (ch | (char) 32) - 'a' + (char) 10;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::fill_n(buf + buf_size, padding, 0);
|
std::fill_n(buf + buf_size, padding, 0);
|
||||||
@@ -431,7 +431,7 @@ namespace util {
|
|||||||
return (std::uint8_t) ch - '0';
|
return (std::uint8_t) ch - '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
return (std::uint8_t)(ch | (char) 32) - 'a' + (char) 10;
|
return (std::uint8_t) (ch | (char) 32) - 'a' + (char) 10;
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto &el : buf) {
|
for (auto &el : buf) {
|
||||||
@@ -509,12 +509,12 @@ namespace util {
|
|||||||
std::int64_t res {};
|
std::int64_t res {};
|
||||||
std::int64_t mul = 1;
|
std::int64_t mul = 1;
|
||||||
while (begin != --end) {
|
while (begin != --end) {
|
||||||
res += (std::int64_t)(*end - '0') * mul;
|
res += (std::int64_t) (*end - '0') * mul;
|
||||||
|
|
||||||
mul *= 10;
|
mul *= 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *begin != '-' ? res + (std::int64_t)(*begin - '0') * mul : -res;
|
return *begin != '-' ? res + (std::int64_t) (*begin - '0') * mul : -res;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::int64_t from_view(const std::string_view &number) {
|
inline std::int64_t from_view(const std::string_view &number) {
|
||||||
@@ -981,7 +981,7 @@ namespace util {
|
|||||||
|
|
||||||
template<class It>
|
template<class It>
|
||||||
std::string_view view(It begin, It end) {
|
std::string_view view(It begin, It end) {
|
||||||
return std::string_view {(const char *) begin, (std::size_t)(end - begin)};
|
return std::string_view {(const char *) begin, (std::size_t) (end - begin)};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
|||||||
@@ -100,6 +100,13 @@ const validateFallbackMode = (event) => {
|
|||||||
</template>
|
</template>
|
||||||
</PlatformLayout>
|
</PlatformLayout>
|
||||||
|
|
||||||
|
<!-- Disable Audio -->
|
||||||
|
<Checkbox class="mb-3"
|
||||||
|
id="stream_audio"
|
||||||
|
locale-prefix="config"
|
||||||
|
v-model="config.stream_audio"
|
||||||
|
default="true"
|
||||||
|
></Checkbox>
|
||||||
|
|
||||||
<AdapterNameSelector
|
<AdapterNameSelector
|
||||||
:platform="platform"
|
:platform="platform"
|
||||||
|
|||||||
@@ -386,7 +386,9 @@
|
|||||||
"restart_note": "Apollo is restarting to apply changes.",
|
"restart_note": "Apollo is restarting to apply changes.",
|
||||||
"server_cmd": "Server Commands",
|
"server_cmd": "Server Commands",
|
||||||
"server_cmd_desc": "Configure a list of commands to be executed when called from client during streaming.",
|
"server_cmd_desc": "Configure a list of commands to be executed when called from client during streaming.",
|
||||||
"sunshine_name": "Apollo Name",
|
"stream_audio": "Stream Audio",
|
||||||
|
"stream_audio_desc": "Whether to stream audio or not. Disabling this can be useful for streaming headless displays as second monitors.",
|
||||||
|
"sunshine_name": "Server Name",
|
||||||
"sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used",
|
"sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used",
|
||||||
"sw_preset": "SW Presets",
|
"sw_preset": "SW Presets",
|
||||||
"sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.",
|
"sw_preset_desc": "Optimize the trade-off between encoding speed (encoded frames per second) and compression efficiency (quality per bit in the bitstream). Defaults to superfast.",
|
||||||
|
|||||||
@@ -30,6 +30,12 @@
|
|||||||
"detached": [
|
"detached": [
|
||||||
"setsid steam steam://open/bigpicture"
|
"setsid steam steam://open/bigpicture"
|
||||||
],
|
],
|
||||||
|
"prep-cmd": [
|
||||||
|
{
|
||||||
|
"do": "",
|
||||||
|
"undo": "setsid steam steam://close/bigpicture"
|
||||||
|
}
|
||||||
|
],
|
||||||
"image-path": "steam.png"
|
"image-path": "steam.png"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -19,6 +19,12 @@
|
|||||||
"detached": [
|
"detached": [
|
||||||
"open steam://open/bigpicture"
|
"open steam://open/bigpicture"
|
||||||
],
|
],
|
||||||
|
"prep-cmd": [
|
||||||
|
{
|
||||||
|
"do": "",
|
||||||
|
"undo": "open steam://close/bigpicture"
|
||||||
|
}
|
||||||
|
],
|
||||||
"image-path": "steam.png"
|
"image-path": "steam.png"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,6 +9,12 @@
|
|||||||
{
|
{
|
||||||
"name": "Steam Big Picture",
|
"name": "Steam Big Picture",
|
||||||
"cmd": "steam://open/bigpicture",
|
"cmd": "steam://open/bigpicture",
|
||||||
|
"prep-cmd": [
|
||||||
|
{
|
||||||
|
"do": "",
|
||||||
|
"undo": "steam://close/bigpicture"
|
||||||
|
}
|
||||||
|
],
|
||||||
"auto-detach": true,
|
"auto-detach": true,
|
||||||
"wait-all": true,
|
"wait-all": true,
|
||||||
"prep-cmd": [
|
"prep-cmd": [
|
||||||
|
|||||||
2
third-party/inputtino
vendored
2
third-party/inputtino
vendored
Submodule third-party/inputtino updated: fd136cfe49...17a9b9ce85
2
third-party/wayland-protocols
vendored
2
third-party/wayland-protocols
vendored
Submodule third-party/wayland-protocols updated: 4313a51a17...810f1adaf3
@@ -3,6 +3,7 @@ import fs from 'fs';
|
|||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import { ViteEjsPlugin } from "vite-plugin-ejs";
|
import { ViteEjsPlugin } from "vite-plugin-ejs";
|
||||||
|
import { codecovVitePlugin } from "@codecov/vite-plugin";
|
||||||
import vue from '@vitejs/plugin-vue'
|
import vue from '@vitejs/plugin-vue'
|
||||||
import process from 'process'
|
import process from 'process'
|
||||||
|
|
||||||
@@ -49,7 +50,16 @@ export default defineConfig({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
base: './',
|
base: './',
|
||||||
plugins: [vue(), ViteEjsPlugin({ header })],
|
plugins: [
|
||||||
|
vue(),
|
||||||
|
ViteEjsPlugin({ header }),
|
||||||
|
// The Codecov vite plugin should be after all other plugins
|
||||||
|
codecovVitePlugin({
|
||||||
|
enableBundleAnalysis: process.env.CODECOV_TOKEN !== undefined,
|
||||||
|
bundleName: "sunshine",
|
||||||
|
uploadToken: process.env.CODECOV_TOKEN,
|
||||||
|
}),
|
||||||
|
],
|
||||||
root: resolve(assetsSrcPath),
|
root: resolve(assetsSrcPath),
|
||||||
build: {
|
build: {
|
||||||
outDir: resolve(assetsDstPath),
|
outDir: resolve(assetsDstPath),
|
||||||
|
|||||||
Reference in New Issue
Block a user