Compare commits

...
390 Commits
Author SHA1 Message Date
Cameron Gutman b9c73df488 Draw the black background even for the KMSDRM backend to fix modesetting 2022-05-24 19:41:37 -05:00
Cameron Gutman f99f1f6441 Disable EGL renderer on RPi due to very poor performance 2022-05-23 23:05:07 -05:00
Cameron Gutman 1ec1f5d3be Switch to D3D11VA by default on Windows ARM64
It performs much better at 4K on Surface Pro X
2022-05-22 22:29:18 -05:00
Cameron Gutman 713db06a05 Prepare for v4.1.0 release 2022-05-22 19:56:32 -05:00
Cameron Gutman a0adcbd90b Update SDL_GameControllerDB 2022-05-22 19:08:18 -05:00
Cameron Gutman b94776421c Rerun lupdate and lrelease 2022-05-22 19:03:55 -05:00
Thijs Lumeij 79c1043063 Translated using Weblate (Dutch)
Currently translated at 100.0% (192 of 192 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nl/
2022-05-23 02:02:14 +02:00
Cameron Gutman cfabae17c0 Rerun lupdate and lrelease 2022-05-22 19:01:18 -05:00
Cameron Gutman 71a1d25e90 Merge remote-tracking branch 'origin/weblate' 2022-05-22 18:59:38 -05:00
Cameron Gutman c2d7b835fb Try moving session.h prior to vaapi.h 2022-05-21 16:58:28 -05:00
Cameron Gutman f72888ce6f Attempt to fix build error with older Qt headers 2022-05-21 16:52:04 -05:00
Wen-haur Chiu 30f474d253 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (192 of 192 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2022-05-21 14:16:30 +02:00
Cameron Gutman 216f274a92 Fix UAF in SLVideo overlay update 2022-05-21 00:30:07 -05:00
Cameron Gutman 5ea79efe4b Work around broken overlay state restoration in Qt GUI 2022-05-21 00:20:36 -05:00
Cameron Gutman 197c1ba21b Add support for the status overlay on Steam Link 2022-05-21 00:10:49 -05:00
Cameron Gutman 95c4a24d99 Destroy subpictures before the associated image 2022-05-20 21:46:40 -05:00
Cameron Gutman f5f23a7c22 Implement overlay support for the VAAPI direct renderer 2022-05-20 21:40:37 -05:00
Cameron Gutman c469576460 Update SDL and FFmpeg for AppImage 2022-05-20 17:45:35 -05:00
Cameron Gutman 0001bb0e4c Default to borderless windowed mode on Wayland systems 2022-05-19 19:22:01 -05:00
Cameron Gutman 56f184393f Allow the cursor lock toggle to work in full-screen mode
Fixes #793
2022-05-19 19:14:55 -05:00
Cameron Gutman 85777e85fa Use newer AppVeyor image for macOS builds 2022-05-18 00:54:21 -05:00
Cameron Gutman c750ec3cc7 Add workaround for macOS scrolling acceleration
See #778
2022-05-18 00:24:58 -05:00
Cameron Gutman c75b781d3f Use SDL_WINDOWEVENT_DISPLAY_CHANGED on SDL 2.0.18+ 2022-05-17 17:13:07 -05:00
Cameron Gutman 8aa42ff1d9 Reset the EGL renderer when specialization fails 2022-05-17 17:10:40 -05:00
Cameron Gutman 63a5bc5e12 Only force pacing in true full-screen mode to be consistent with DXVA2 2022-05-15 13:38:58 -05:00
Cameron Gutman e0b7b6dc3d Fix DXGI_FEATURE_PRESENT_ALLOW_TEARING feature check 2022-05-11 22:48:15 -05:00
Cameron Gutman 3d7ecf98c2 Fix HEVC Main10 support check on macOS GPUFamily1 GPUs 2022-05-11 22:00:34 -05:00
Cameron Gutman ad5581c620 Use DWM MMCSS for D3D11VA like DXVA2 does 2022-05-09 23:52:13 -05:00
Cameron Gutman 69af991772 Improve DXVA2 performance in borderless windowed on AMD hardware 2022-05-09 22:55:58 -05:00
Cameron Gutman 2bb2745f91 Enhance frame pacing logic for HDR renderers 2022-05-07 16:21:17 -05:00
Cameron Gutman 5f682bb45f Revert addition of D3DCREATE_NOWINDOWCHANGES
This flag breaks Alt+Tab in full-screen exclusive mode
2022-05-07 16:21:04 -05:00
Cameron Gutman 48bcb6b9a6 Rerun lupdate and lrelease 2022-05-07 14:32:34 -05:00
Cameron Gutman 092c0a7392 Integrate Czech and Polish translations 2022-05-07 14:32:07 -05:00
Cameron Gutman 4e8618c512 Merge remote-tracking branch 'origin/weblate' 2022-05-07 14:19:06 -05:00
Cameron Gutman c51a69c0dc Update SDL to 8cd908e 2022-05-07 14:18:39 -05:00
Cameron Gutman 2480849f39 Clean up DXGI adapter enumeration code 2022-05-02 19:05:00 -05:00
DankXylese 6bfe40607d Translated using Weblate (Ukrainian)
Currently translated at 27.4% (53 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/uk/
2022-04-28 22:13:27 +02:00
Cameron Gutman a1c350a537 Fix WARP device leak 2022-04-26 23:29:04 -05:00
Cameron Gutman f732b1978e Require a test frame with D3D11VA 2022-04-26 23:04:31 -05:00
Cameron Gutman d3a542bac4 Try all available GPUs in D3D11VA decoder 2022-04-26 22:49:46 -05:00
Cameron Gutman b12724db02 Reduce log spam when choosing a resolution 2022-04-24 17:11:10 -05:00
Cameron Gutman f8f5e8e869 Don't discard all excess frames before rendering
This prevents the render queue's pacing logic from working and
interferes with renderers that take a full v-sync period between
their waitToRender() and renderFrame() callbacks.
2022-04-24 17:04:32 -05:00
Cameron Gutman 0733f06103 Fix saving keep awake value
Fixes #781
2022-04-24 16:49:36 -05:00
Cameron Gutman 6fdaa6ee8a Avoid modesetting if the display didn't change 2022-04-24 16:48:21 -05:00
Cameron Gutman f10b547a49 Partially revert "Rework window management to fix issues restoring window state between windowed and full-screen"
This exposes all sorts of issues with full-screen transitions on Windows and macOS:
- Loss of proper window decorations when transitioning from full-screen to windowed on Windows
- Improper sizing when transitioning from true full-screen to windowed on macOS

This reverts commit 38396b2691.
2022-04-24 16:40:19 -05:00
Cameron Gutman 38396b2691 Rework window management to fix issues restoring window state between windowed and full-screen 2022-04-24 16:22:17 -05:00
Cameron Gutman 220f50ebe4 Revert "Allow renderers to apply size and display changes seamlessly"
This reverts commit c989133d27.
2022-04-24 16:12:12 -05:00
Cameron Gutman c989133d27 Allow renderers to apply size and display changes seamlessly 2022-04-24 15:42:08 -05:00
Cameron Gutman 6c339551eb Allow resolution changes on all platforms
Take aspect ratio into account when making the choice too.
2022-04-21 23:57:17 -05:00
Cameron Gutman ef23a80b16 Fix EGL build when using EGL 1.4 or earlier headers 2022-04-21 21:13:39 -05:00
Cameron Gutman a521093731 Update Visual C++ Runtime installer 2022-04-17 00:04:03 -05:00
Cameron Gutman 747d3eedf1 Cleanup D3D11VA renderer by removing unnecessary codepaths
Waitable swapchains seem to be worse than our existing DXVsyncSource for synchronizing with VBlank.

Full-screen exclusive mode isn't beneficial vs Independent Flip on modern Win10/Win11 systems.
2022-04-15 23:26:32 -05:00
Cameron Gutman fd563726f0 Fix blocking presents in borderless windowed flip modes 2022-04-15 23:21:52 -05:00
Cameron Gutman 62136a1a96 Increase buffer count to prevent starvation on AMD GPUs 2022-04-14 23:21:32 -05:00
Cameron Gutman cf16c31d38 Improve performance and latency of D3D11VA renderer 2022-04-14 22:46:13 -05:00
Cameron Gutman 0f5d4aa72f Enhance EGLRenderer's waitForRender() implementation 2022-04-10 20:20:44 -05:00
Cameron Gutman d8dbe77427 Tiny EGL code cleanup 2022-04-10 19:35:29 -05:00
Cameron Gutman 0e5670d50d Don't compare StackView items by localized name
Fixes #767
2022-04-10 15:42:50 -05:00
Cameron Gutman 22924a1e92 Reload the FPS and window mode comboboxes after changing language
Fixes #765
2022-04-10 13:17:42 -05:00
Cameron Gutman e3a7b54f90 Use EGL fences to reduce video latency 2022-04-08 19:28:22 -05:00
Cameron Gutman 81d5e7f014 Wait for the VDPAU output surface to be idle in waitToRender() 2022-04-07 22:16:52 -05:00
Cameron Gutman 9790c218dc Wait on the display link callback before rendering to reduce latency 2022-04-07 22:08:43 -05:00
Cameron Gutman 6d3d51553b Wait on our D3D11 swapchain before rendering to reduce latency 2022-04-07 21:46:48 -05:00
Cameron Gutman 474591c6a5 Use a separate callback to indicate EOS instead of renderFrame() 2022-04-07 21:30:20 -05:00
Cameron Gutman 5de0dc2713 Disable the decoder selection options when HDR is enabled 2022-04-05 20:09:09 -05:00
Cameron Gutman 57a34a7abb Update README.md 2022-04-05 19:56:20 -05:00
Cameron Gutman 54517bda1b Switch back to upstream SDL 2022-04-05 00:59:58 -05:00
Cameron Gutman 4291e15b60 Use NDC helpers in D3D11VA renderer 2022-04-05 00:57:14 -05:00
Cameron Gutman 940ae6406b Add helper functions to perform NDC transformations 2022-04-05 00:50:04 -05:00
Cameron Gutman 6a0cf4bfd3 Fix some #if -> #ifdefs 2022-04-05 00:26:13 -05:00
Cameron Gutman fee6f75223 Fix VAAPIRenderer build error with neither HAVE_EGL nor HAVE_DRM defined 2022-04-05 00:24:00 -05:00
Cameron Gutman 8c93b2d54c Fix VAAPIRenderer build error with HAVE_DRM but not HAVE_EGL 2022-04-04 19:40:31 -05:00
Artur Szulc dbbb1bd8a1 Translated using Weblate (Polish)
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/pl/
2022-04-04 23:12:28 +02:00
Dominik Chrástecký 5c838b2fc5 Translated using Weblate (Czech)
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/cs/
2022-04-04 23:12:27 +02:00
Jorys Paulin 3a094d4ba8 Translated using Weblate (French)
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2022-04-04 23:12:26 +02:00
Artur S 5d11c1ea6a Added translation using Weblate (Polish) 2022-04-03 20:52:00 +02:00
Dominik Chrástecký a7e2e15eac Added translation using Weblate (Czech) 2022-04-03 17:11:26 +02:00
Jorys Paulin 585a0ca1f4 Translated using Weblate (French)
Currently translated at 97.4% (188 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2022-04-03 09:12:06 +02:00
Cameron Gutman 09ed82db65 Fix build with HAVE_MMAL 2022-04-02 16:16:40 -05:00
Cameron Gutman a56cb0e88a Don't waste time retrying the same renderer again 2022-04-02 16:14:04 -05:00
Cameron Gutman 9acf5ff0ef Update workaround to prevent deadlock with h264_mmal 2022-04-02 16:06:39 -05:00
Cameron Gutman 64a7790aed Patch SDL to work around GLX crash 2022-04-02 15:50:32 -05:00
Cameron Gutman 9a5134ffcf Use QString not QByteArray for string equality 2022-04-02 15:49:07 -05:00
Cameron Gutman 1d2c4d0843 Prepare for v4.0.0 2022-04-01 19:18:51 -05:00
Cameron Gutman efad34be62 Set SDL_MOUSE_AUTO_CAPTURE=0 since we manage mouse capture ourselves 2022-03-31 23:54:58 -05:00
Cameron Gutman 52761ade87 Update SDL_ttf to 81f9e9b 2022-03-31 23:30:59 -05:00
Cameron Gutman e6b816e776 Update SDL in AppImage 2022-03-30 23:31:01 -05:00
Cameron Gutman 6d3bcba5d0 Update SDL, SDL_ttf, and FreeType
SDL -> 2c04df8
SDL_ttf -> 80d909 (Windows)
FreeType -> 3f83da (Windows)
2022-03-30 23:27:40 -05:00
Cameron Gutman 2e7ffa606b Fix missing DLL in ARM64 builds 2022-03-30 22:43:31 -05:00
Cameron Gutman 055cae90b8 Only apply the AMD color range workaround to new drivers
Applying it to older drivers introduces the very same issues it's meant to fix
2022-03-30 22:43:08 -05:00
Cameron Gutman 23acf92803 Update SDL_GameControllerDB 2022-03-30 22:07:33 -05:00
Cameron Gutman 91ee7d76eb Rerun lupdate and lrelease 2022-03-30 22:07:11 -05:00
Cameron Gutman 570888e2b8 Merge remote-tracking branch 'origin/weblate' 2022-03-30 22:06:02 -05:00
sanhoe 282f27f0c8 Translated using Weblate (Korean)
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ko/
2022-03-30 18:10:36 +02:00
Cameron Gutman 98376ade45 Update SDL to cbdb67b 2022-03-29 22:39:09 -05:00
Cameron Gutman 9682968b55 Fix FFmpeg URL for AppImage 2022-03-29 21:34:34 -05:00
Cameron Gutman 877cb5f1b0 Update SDL2, SDL_ttf, and FFmpeg in AppImage build 2022-03-29 21:03:35 -05:00
Cameron Gutman 6972573a6e Add pointer lock key combo
Fixes #737
2022-03-29 18:26:09 -05:00
Cameron Gutman 742f1b1283 Prefer hevc_nvv4l2 over hevc_nvmpi 2022-03-26 22:54:54 -05:00
The Great Wizard Azkali 0b127a2f3b Add support for h264_nvv4l2 and hevc_nvv4l2 (#745)
* Add support for h264_nvv4l2

A new implementation of nvv4l2 decoder has been made by @CTCaer and will be released in thr next switchroot (Linux for Nintendo Switch) update. This implementation of ffmpeg can also be used by other Jetson boards. A repository will be soon hosted so Jetson users can install it.
Prior to the new implementation distribution, we add it to the project who currently use nvmpi implementation.

* Add support for hevc_nvv4l2

Following previous PR, add hevc support as well.
2022-03-26 22:02:00 -05:00
Wen-haur Chiu a6057835a8 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2022-03-25 18:11:42 +01:00
CorteX c32794477e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hans/
2022-03-23 06:58:35 +01:00
reloxx13 999ac60bda Translated using Weblate (German)
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/de/
2022-03-21 09:59:13 +01:00
bruh bca4b832a8 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (193 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/vi/
2022-03-19 22:58:21 +01:00
Cameron Gutman 2fc1dda232 Partially revert e64b15d and b85d5b8
These changes cause excessive window recreation using the Flatpak on Nvidia with Wayland
2022-03-19 14:50:38 -05:00
Cameron Gutman 99495cff90 Add logging for cases where color range/encoding cannot be set 2022-03-19 13:12:41 -05:00
Caio Gabriel 795962a4ba Translated using Weblate (Portuguese (Brazil))
Currently translated at 7.7% (15 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/pt_BR/
2022-03-18 22:29:44 +01:00
Caio Gabriel 7bde9f447a Translated using Weblate (Portuguese (Brazil))
Currently translated at 7.7% (15 of 193 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/pt_BR/
2022-03-18 20:05:48 +01:00
Cameron Gutman b45c3e3c7f Tweak wording on the keep awake option 2022-03-16 21:59:06 -05:00
Cameron Gutman ce2a01fc59 Allow the screensaver toggle to work even if running on an embedded platform 2022-03-16 21:57:03 -05:00
Cameron Gutman edeea65c3e Rerun lupdate and lrelease 2022-03-16 21:51:17 -05:00
Cameron Gutman 6e8ee94b91 Merge remote-tracking branch 'origin/weblate' 2022-03-16 21:49:44 -05:00
Cameron Gutman 97d8274911 Add option to allow PC to sleep while streaming 2022-03-16 21:48:56 -05:00
Cameron Gutman 73d84dc13f Update SDL and OpenSSL prebuilts 2022-03-15 22:30:55 -05:00
Cameron Gutman f32501d498 Update moonlight-common-c 2022-03-15 21:22:44 -05:00
Cameron Gutman 9c289c3fe9 Update SDL_GameControllerDB 2022-03-15 21:22:21 -05:00
Cameron Gutman 2a610584ee Fix handling of line continuations in FFmpeg logs (for real this time) 2022-03-11 19:15:36 -06:00
sanhoe 8e06421567 Translated using Weblate (Korean)
Currently translated at 100.0% (191 of 191 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ko/
2022-03-10 18:59:01 +01:00
Wen-haur Chiu 57dc3725f5 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (191 of 191 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2022-03-09 15:58:49 +01:00
Cameron Gutman d6ef8945f5 Replace Deviare In-Proc with Microsoft Detours 2022-03-08 20:58:40 -06:00
Cameron Gutman e078a8b7b6 Don't recreate the decoder while the window is minimized
Fixes #726
2022-03-06 15:21:43 -06:00
Cameron Gutman a6395b9025 Fix short UI hang when manually stopping the stream after losing connection with the host 2022-03-06 13:11:36 -06:00
Cameron Gutman 6c0983d77c Reset the audio device if it enters a failed state
Fixes #734
2022-03-05 16:50:06 -06:00
Cameron Gutman 4ae39f2bd5 Properly synchronize rumble with gamepad removal 2022-03-05 13:32:38 -06:00
bruh 71fc701809 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (191 of 191 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/vi/
2022-03-02 11:57:09 +01:00
Aurora Robb Kristiansen d418921e4b Translated using Weblate (Norwegian Bokmål)
Currently translated at 73.2% (140 of 191 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nb_NO/
2022-02-28 11:55:22 +01:00
Cameron Gutman 4b83b022d3 Remove unnecessary assert 2022-02-25 22:47:20 -06:00
Cameron Gutman 8b13e5b47e Update AppImage to libva 2.14 2022-02-25 22:46:52 -06:00
Benjamín Bustos 0bfd565bda Translated using Weblate (Spanish)
Currently translated at 100.0% (191 of 191 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/es/
2022-02-23 16:56:13 +01:00
Emanuele Conti 2224a558ee Translated using Weblate (Italian)
Currently translated at 100.0% (191 of 191 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/it/
2022-02-22 15:56:43 +01:00
Cameron Gutman 93c02fb43a Print GPU info in D3D11VA renderer 2022-02-20 22:10:18 -06:00
Cameron Gutman 93ee51cabb Integrate new languages from Weblate 2022-02-20 14:15:08 -06:00
Cameron Gutman cd6ba554a4 Merge remote-tracking branch 'origin/weblate' 2022-02-20 13:44:11 -06:00
Cameron Gutman 89aa2be358 Rerun lupdate and lrelease 2022-02-20 13:41:48 -06:00
Cameron Gutman da261246b9 Change HDR to be a separate option like other clients 2022-02-19 11:21:06 -06:00
Cameron Gutman 4d3e09f4a0 Raise minimum custom resolution to 256x256 2022-02-19 10:47:25 -06:00
Cameron Gutman 9add6b3696 Add DXVA2 quirk for AMD GPUs to fix color range on the latest drivers 2022-02-17 00:35:33 -06:00
Cameron Gutman ef037e18d0 Add colorspace and color range override options 2022-02-17 00:26:56 -06:00
Cameron Gutman 36db791516 Refactor D3D11 shaders to reduce duplicated code 2022-02-16 19:38:18 -06:00
Emanuele Conti 25d2ea5e94 Translated using Weblate (Italian)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/it/
2022-02-16 13:57:22 +01:00
Jorys Paulin 34f2d18f27 Translated using Weblate (French)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2022-02-16 13:57:21 +01:00
Aurora Robb Kristiansen 4935c846aa Translated using Weblate (Norwegian Bokmål)
Currently translated at 73.0% (138 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nb_NO/
2022-02-14 01:57:01 +01:00
Cameron Gutman b1f980c216 Fix handling of line continuations in FFmpeg logs 2022-02-13 16:06:04 -06:00
Cameron Gutman 738f64c903 Use FP32 for position and texcoords
We need that extra precision for sampling large textures
2022-02-13 13:41:39 -06:00
Emanuele Conti 7235663447 Translated using Weblate (Italian)
Currently translated at 46.0% (87 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/it/
2022-02-11 11:55:30 +01:00
Emanuele Conti 9d78c416f7 Translated using Weblate (Italian)
Currently translated at 44.9% (85 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/it/
2022-02-10 10:57:51 +01:00
Cameron Gutman 9a64c026ea Use optimized pixel shaders for the normal SDR and HDR colorspaces 2022-02-09 20:46:02 -06:00
Cameron Gutman be2af1d17a Add environment variables to configure DXVA2 and D3D11VA options 2022-02-08 22:27:27 -06:00
Cameron Gutman b21131a466 Use FP16 in the D3D11 shaders 2022-02-08 21:43:25 -06:00
Emanuele Conti 41c5126472 Translated using Weblate (Italian)
Currently translated at 39.6% (75 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/it/
2022-02-08 18:54:36 +01:00
Cameron Gutman b96cb1abaf Remove per-app HDR support check
It doesn't seem to make a difference anymore whether it's supported or not.
GFE seems happy to enter HDR mode anyway.
2022-02-07 20:02:19 -06:00
Emanuele Conti 20143606e2 Added translation using Weblate (Italian) 2022-02-07 09:27:18 +01:00
Cameron Gutman 1d79bcc657 Disable waitable swapchains in full-screen mode 2022-02-06 00:28:59 -06:00
Cameron Gutman e8b4494fc3 Add an extra buffer for DirectFlip 2022-02-05 23:22:07 -06:00
Cameron Gutman 2518208c5c Don't set fullScreenDesc fields to prevent entering "proxy" full-screen mode 2022-02-05 19:32:05 -06:00
Cameron Gutman 918fea7d4b Precompute the aspect ratio stretch to avoid having to change viewports twice each frame 2022-02-05 15:44:37 -06:00
Cameron Gutman 4dc07bf63f Don't render the alignment padding area 2022-02-05 15:23:29 -06:00
Cameron Gutman 04a0aca221 Create SRVs for all textures in the pool during initialization 2022-02-05 14:49:08 -06:00
Cameron Gutman 1942e72474 Only bind the constant buffer once 2022-02-05 14:15:35 -06:00
Cameron Gutman f256407789 Implement D3D11VA video rendering 2022-02-04 21:51:34 -06:00
Cameron Gutman 67612f607e WIP: D3D11VA support
Overlays work, but drawing the actual video is unimplemented
2022-02-03 19:45:07 -06:00
Wh1t3st4r 7274c42126 Translated using Weblate (Portuguese)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/pt/
2022-02-01 16:52:52 +01:00
Wh1t3st4r e288402e88 Added translation using Weblate (Portuguese (Brazil)) 2022-01-31 16:08:53 +01:00
Cameron Gutman 76bd4a1c7b Don't set the HDR metadata blob if we don't have one 2022-01-30 22:57:53 -06:00
Cameron Gutman 13dbad6f35 Fix build with old libdrm headers 2022-01-30 22:56:22 -06:00
Cameron Gutman cf089fdfe9 Add support for HDR with VAAPI using DRM frontend renderer 2022-01-29 18:16:39 -06:00
Cameron Gutman 9755e31fa2 Refactor VAAPI surface export check into separate function 2022-01-29 17:45:36 -06:00
Cameron Gutman 3fcf31d009 Improve robustness of EGL retry logic for 10-bit color 2022-01-29 01:12:38 -06:00
Cameron Gutman 1cbdd0e675 Display the HDR option if the platform has a decoder that supports it 2022-01-29 00:59:04 -06:00
Cameron Gutman e0fd84d6f5 Fix build with old libdrm headers 2022-01-29 00:28:46 -06:00
Cameron Gutman 443720c3de Plumb HDR metadata into DRM renderer 2022-01-28 22:40:07 -06:00
Cameron Gutman 254526a213 Plumb HDR mode information to the decoders 2022-01-28 22:10:50 -06:00
Cameron Gutman ad0afb5fc9 Prefer direct rendering when using HDR 2022-01-27 22:36:49 -06:00
Cameron Gutman e64b15d2a7 Rework how we deal with window re-creation for EGLRenderer
Previously we opted to just lie to SDL and tell it that the current
GL context is actually GLES 3.0 when it wasn't. This meant that
we avoided our window being recreated for GLES usage on Wayland
and KMSDRM, but that meant our 10-bit color change didn't apply
either. I suspect this hackery is what led EGLRenderer to get
stuck in a state where SDL_CreateRenderer() always failed.

Now SDL will recreate our window once to configure a compatible GL
API for our renderer. If that fails, we'll move on to a different
renderer (which may recreate the window again).
2022-01-27 21:49:03 -06:00
Cameron Gutman cdc3352318 Ensure SDL also uses X11 if Qt is using X11 2022-01-26 19:00:41 -06:00
Cameron Gutman 2416618b34 Don't require 2 bits of alpha for 10-bit color 2022-01-26 18:55:56 -06:00
GeraltOfTrivia c951d77a52 Translated using Weblate (Greek)
Currently translated at 96.2% (182 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/el/
2022-01-25 17:53:11 +01:00
GeraltOfTrivia 759ddc0b4b Added translation using Weblate (Greek) 2022-01-24 16:49:31 +01:00
Cameron Gutman a0709bec51 Improve debugging and add missing break 2022-01-23 21:12:32 -06:00
Cameron Gutman f5bc4e7a24 Add color properties to DRM renderer 2022-01-23 21:03:56 -06:00
Cameron Gutman b4665b6e5a Pick a 10-bit DRM overlay for Main10 streaming 2022-01-23 19:19:16 -06:00
Cameron Gutman b85d5b8822 Enable P010 surface export from VAAPI to EGL 2022-01-23 18:33:30 -06:00
Cameron Gutman 12ad75a6b0 Move hybrid decode detection logic into a central location 2022-01-23 15:41:33 -06:00
Cameron Gutman af92fe6ad1 Fix Apple silicon CPU check 2022-01-23 13:01:20 -06:00
Cameron Gutman fcf7ed4faa Only use the VT rasterization workaround on Apple silicon 2022-01-22 20:25:50 -06:00
Cameron Gutman a58649fd10 Update Windows and macOS to FFmpeg 5.0 2022-01-22 13:44:05 -06:00
Cameron Gutman ee5918cf4e Revert "Add workaround for duplicate size changed events on Wayland"
Skipping size changed events can cause EGLRenderer to get stuck in
a state where it can't reset itself properly. This seems to happen
consistently when starting a maximized stream then transitioning
to full-screen.

This reverts commit e1b3f90f8b.
2022-01-22 12:29:44 -06:00
Wh1t3st4r d7de3301ed Translated using Weblate (Portuguese)
Currently translated at 76.7% (145 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/pt/
2022-01-22 07:20:29 +01:00
Wh1t3st4r bd1988c775 Added translation using Weblate (Portuguese) 2022-01-22 00:51:36 +01:00
Faiq Chilmi 474010b31d Translated using Weblate (Hindi)
Currently translated at 18.5% (35 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/hi/
2022-01-21 15:52:46 +01:00
Cameron Gutman dd941154d6 Fix EGL renderer overlay rendering with SDL_ttf 2.0.18
Fixes #721
2022-01-20 18:02:44 -06:00
WoweePaw cbb53745f6 Translated using Weblate (German)
Currently translated at 99.4% (188 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/de/
2022-01-20 15:09:46 +01:00
Faiq Chilmi 3dff62e0cf Added translation using Weblate (Hindi) 2022-01-20 15:09:46 +01:00
Cameron Gutman 719024ec01 Prepare for v3.2.0 release 2022-01-18 18:33:23 -06:00
Cameron Gutman f0659b4f3c Fix random crash on stream start with renderers that require test frames 2022-01-18 18:19:28 -06:00
Cameron Gutman a649f2736f Rerun lupdate and lrelease 2022-01-18 18:07:17 -06:00
Cameron Gutman 046ccb1dee Merge remote-tracking branch 'origin/weblate' 2022-01-18 18:05:42 -06:00
Tygo T d340556c28 Translated using Weblate (Dutch)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nl/
2022-01-19 01:04:10 +01:00
Wout Rombouts 32250db126 Translated using Weblate (Dutch)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nl/
2022-01-19 01:04:10 +01:00
Cameron Gutman cb8c30db2e Add workaround for keyboard and UTF-8 events interfering with each other 2022-01-17 21:56:39 -06:00
Cameron Gutman dacd5a9e3d Discard stale gamepad events when enabling gamepad navigation 2022-01-17 19:49:52 -06:00
Cameron Gutman 859d8b96a7 Don't use duplicate resize workaround on SDL 2.0.21+ 2022-01-17 19:25:43 -06:00
Cameron Gutman 02981e3cee Update SDL to pick up HIDAPI deadzone fix 2022-01-17 19:23:42 -06:00
Cameron Gutman 49892b3ce8 Only use SDL_WaitEventTimeout() on SDL 2.0.18+ 2022-01-17 16:59:45 -06:00
Cameron Gutman b223e7ec36 Update SDL_GameControllerDB 2022-01-17 15:57:36 -06:00
Cameron Gutman 0926337c1d Rerun lupdate and lrelease 2022-01-17 15:56:39 -06:00
Cameron Gutman 346e72a678 Merge remote-tracking branch 'origin/weblate' 2022-01-17 15:55:12 -06:00
Wout Rombouts d612e47b62 Translated using Weblate (Dutch)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nl/
2022-01-17 22:54:04 +01:00
Cameron Gutman c138cbf994 Fix Windows build 2022-01-17 15:47:36 -06:00
Cameron Gutman dfe275ab67 Avoid consuming stale data during/after decoder reset 2022-01-17 15:26:00 -06:00
Cameron Gutman d6cfbdb273 Rewrite FFmpeg decoder to use pull model
This allows us to keep asynchronous decoders like MMAL and V4L2M2M fed
while we're waiting for output frames. Behavior for synchronous decoders
should be identical.

Continuing to feed new data while waiting for output frames is crucial for
acceptable performance on 1080p video on the Raspberry Pi using V4L2M2M,
since it allows the decode and copy operations to be pipelined.
2022-01-17 15:06:12 -06:00
Cameron Gutman 8a27fa7bb5 Convert NeedsIdr member into an atomic variable with a getter 2022-01-17 14:30:12 -06:00
Cameron Gutman b9a6fb1fe5 Add workaround for AVSampleBufferDisplayLayer colorspace and artifacting issues
Fixes #493
2022-01-15 14:44:08 -06:00
Cameron Gutman 4b6194e15e Add chroma location buffer attachment 2022-01-15 12:17:31 -06:00
Cameron Gutman e1b3f90f8b Add workaround for duplicate size changed events on Wayland 2022-01-14 23:36:21 -06:00
Wen-haur Chiu c5cc0b8c59 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2022-01-13 12:56:43 +01:00
bruh 5c849ec666 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/vi/
2022-01-13 12:56:42 +01:00
Eric c2a30cbe19 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hans/
2022-01-13 12:56:42 +01:00
Cameron Gutman 31eddd8da0 Remove superfluous colorspace check 2022-01-13 01:19:17 -06:00
Cameron Gutman abf2a14ee6 Handle colorspace changes in SDL renderer 2022-01-13 01:16:09 -06:00
Cameron Gutman e555874485 Refactor WiX bundle description of VCRedist package 2022-01-12 19:14:59 -06:00
Cameron Gutman a7aef8f147 Use new WiX 3.14 variable instead of BuildLabEx hack for ARM64 detection 2022-01-12 19:14:44 -06:00
Cameron Gutman 5b8c11f1a9 Update and rebuild all dependencies with Xcode 13 and VS 2022
macOS minimum target version is now 10.14 Mojave

Updates:
OpenSSL 1.1.1m
SDL 2.0.20
libopus 12a356

https://github.com/cgutman/moonlight-deps 5cd31601c3362562b52d8124dfc33029506d1744
2022-01-11 20:49:11 -06:00
Cameron Gutman 645040c943 Update AppImage to SDL 2.0.20 2022-01-10 20:03:47 -06:00
Cameron Gutman fcc5ea348c Remove old FFmpeg build scripts
Superseded by https://github.com/cgutman/moonlight-deps
2022-01-10 19:49:41 -06:00
Héctor 3fbb45448f Translated using Weblate (Spanish)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/es/
2022-01-10 20:56:47 +01:00
Cameron Gutman 8a83289709 Switch to VS2022 build image 2022-01-09 21:55:41 -06:00
Cameron Gutman 08175de069 Fix incorrect colorspace in MMAL renderer 2022-01-09 17:04:38 -06:00
Cameron Gutman 808933cd70 Use DT files to get status of FKMS and rpivid 2022-01-09 16:44:20 -06:00
Cameron Gutman 384dd2adab Prefer a render node in indirect rendering mode 2022-01-08 18:39:12 -06:00
Jorys Paulin 4a37952b41 Translated using Weblate (French)
Currently translated at 100.0% (189 of 189 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2022-01-08 09:55:55 +01:00
lyashenko.v 1046d264d8 Fixed not working frame pacing on macOS 2022-01-06 23:23:00 -06:00
Cameron Gutman bb235ab1ae Rerun lupdate and lrelease 2022-01-06 23:19:16 -06:00
Cameron Gutman ef88b83727 Merge remote-tracking branch 'origin/weblate' 2022-01-06 23:15:48 -06:00
Cameron Gutman 5612e9864e Fix handling of some validation scenarios
- HEVC forced with no host or client hw support
- H.264 forced with no client hw support
- Client has hw HEVC only and host only supports H.264
- Client has no hw decode at all
2022-01-06 23:15:19 -06:00
Cameron Gutman 8302187dee Remove superfluous availability checks 2022-01-06 23:05:18 -06:00
Cameron Gutman 77d07c7c4d Fix incorrect error message when only HEVC decode is available but HEVC encode is not 2022-01-06 22:08:43 -06:00
Cameron Gutman b2265080fd Allow HEVC decoders to satisfy hardware decoding check if H.264 is unavailable 2022-01-06 22:07:31 -06:00
Cameron Gutman 0d70bd9ac0 Add (untested) VAAPI support for CCS planes on Tiger Lake
See https://github.com/intel/media-driver/issues/1210
2022-01-05 21:09:08 -06:00
Cameron Gutman 8f63d59b81 Correct comment to avoid confusion 2022-01-04 22:00:46 -06:00
Cameron Gutman 0395c0cc95 Revert "Revert "Don't attempt to use direct rendering without DRM master""
The correct fix was 154b5b6ded.

This reverts commit 8219dbef6f.
2022-01-04 21:59:02 -06:00
Cameron Gutman 72065412a3 Don't allow copyback rendering on RPi by default 2022-01-04 20:35:17 -06:00
Jorys Paulin 7af2cdd0ef Translated using Weblate (French)
Currently translated at 100.0% (187 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2022-01-03 11:52:50 +01:00
Cameron Gutman 67c801c4e7 Use av_frame_copy_props() to copy metadata 2022-01-02 17:38:58 -06:00
Cameron Gutman f7c8ad4c5a Fail render frame test for unsupported pixel formats 2022-01-02 15:03:49 -06:00
Cameron Gutman 61092b34de Properly handle mismatched pitch between frame and texture 2022-01-02 14:35:14 -06:00
Cameron Gutman 1e9e96fb8c Small code cleanup for hwframe code 2022-01-02 13:58:37 -06:00
Cameron Gutman 17d1ced07c Add support for mapping hwframes 2022-01-02 13:41:36 -06:00
Cameron Gutman a26ced04ff Add support for negotiating non-default transfer formats for hwframes 2022-01-01 22:15:43 -06:00
Cameron Gutman 154b5b6ded Fix fallback to SDL read-back for DRM contexts when !HAVE_EGL 2022-01-01 20:44:29 -06:00
Cameron Gutman 8219dbef6f Revert "Don't attempt to use direct rendering without DRM master"
We support indirect rendering via SDL, even if EGL is unavailable.

This reverts commit 6145913068.
2022-01-01 20:37:04 -06:00
Cameron Gutman 3da724e76a Fix and enhance the Full KMS check 2021-12-28 17:13:54 -06:00
Cameron Gutman 1616d237ae Avoid h264_v4l2m2m by default on RPi builds 2021-12-28 16:28:04 -06:00
Nikita Epifanov 3d21facc9f Translated using Weblate (Russian)
Currently translated at 100.0% (187 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ru/
2021-12-24 19:53:18 +01:00
Héctor fead2a08a3 Translated using Weblate (Spanish)
Currently translated at 96.2% (180 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/es/
2021-12-20 18:52:37 +01:00
Cameron Gutman d8acf24af0 Don't use SdlRenderer with MMAL 2021-12-19 20:58:50 -06:00
Cameron Gutman 97412b3c79 Display warnings about Full KMS mode and HEVC on the Pi 4 2021-12-19 20:33:48 -06:00
Cameron Gutman 6145913068 Don't attempt to use direct rendering without DRM master 2021-12-19 20:32:15 -06:00
Cameron Gutman e56bb6785f Change display mode when using KMSDRM backend 2021-12-18 21:07:35 -06:00
Cameron Gutman 6d63d6c54a Rerun lupdate and lrelease 2021-12-15 20:52:48 -06:00
Cameron Gutman 6e8a103e70 Merge remote-tracking branch 'origin/weblate' 2021-12-15 20:50:15 -06:00
Cameron Gutman 00d3530f64 Don't try VDPAU on XWayland by default 2021-12-15 20:49:12 -06:00
Cameron Gutman 1e6ca18193 Fix error checking in decode test 2021-12-15 17:33:28 -06:00
Cameron Gutman 5a32992497 Try to learn if decoders support retrying avcodec_receive_frame() 2021-12-14 20:41:27 -06:00
李俊緯 79ba00a2f4 Translated using Weblate (Chinese (Traditional))
Currently translated at 84.4% (158 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2021-12-14 11:53:41 +01:00
bruh fdfaf8ec70 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (187 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/vi/
2021-12-14 11:53:41 +01:00
Héctor 162c58b697 Translated using Weblate (Spanish)
Currently translated at 60.9% (114 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/es/
2021-12-14 11:53:41 +01:00
Allan Nordhøy 75959ca692 Translated using Weblate (Norwegian Bokmål)
Currently translated at 70.5% (132 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nb_NO/
2021-12-14 11:53:40 +01:00
Eric 06fbcd19c8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (187 of 187 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hans/
2021-12-14 11:53:40 +01:00
Cameron Gutman 36e0468a99 Optimize CUDA GL interop and provide fallback 2021-12-13 21:41:00 -06:00
Cameron Gutman c4d85cf928 Don't show HDR option if we know it's unsupported 2021-12-12 17:43:20 -06:00
Cameron Gutman daf8495acb Fix excessive high-res scroll speed on newer GFE versions 2021-12-12 16:50:22 -06:00
Cameron Gutman 9999ded933 Quiet down log spam for asynchronous decoders 2021-12-11 18:37:39 -06:00
Cameron Gutman 80128e8293 Properly support asynchronous decoders that return multiple frames at a time 2021-12-11 18:15:49 -06:00
Cameron Gutman 9579b2c85e Enable Spanish and Traditional Chinese language options 2021-12-11 14:32:38 -06:00
Cameron Gutman eb7f184848 Rerun lupdate and lrelease 2021-12-11 14:32:12 -06:00
Cameron Gutman 71b21920e2 Merge remote-tracking branch 'origin/weblate' 2021-12-11 14:24:07 -06:00
Cameron Gutman 91b787a5be Update SDL and switch to arch-specific headers on Windows
SDL -> e2ade2b
2021-12-11 14:06:26 -06:00
Cameron Gutman 11f659aadb Update Visual C++ Runtime installers 2021-12-11 13:28:48 -06:00
Cameron Gutman 0870dd15a8 Fix improper null termination when stripping clipboard text 2021-12-10 02:04:19 -06:00
Héctor 7cd52041d8 Translated using Weblate (Spanish)
Currently translated at 53.2% (99 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/es/
2021-12-09 17:52:51 +01:00
Cameron Gutman f2bcb49478 Update dependencies for AppImage
SDL -> 2.0.18
nv-codec-headers -> 8.1.24.13
FFmpeg -> 4.4.1
2021-12-06 23:03:53 -06:00
Cameron Gutman 60a4bda94f Switch macOS builds to Qt 6 2021-12-06 22:54:55 -06:00
Cameron Gutman 54cfc46500 Fix VDPAU on X11 2021-12-06 20:42:51 -06:00
Cameron Gutman c09559ade5 Don't try to initialize VDPAU on Wayland 2021-12-06 19:38:28 -06:00
Cameron Gutman 3e9aea1f7a Optimize CUDA support to avoid roundtrip to CPU memory 2021-12-06 18:23:40 -06:00
Cameron Gutman f0c292f508 Update SDL_GameControllerDB 2021-12-03 12:52:23 +03:00
Cameron Gutman 1444ba2c35 Use attached Layout attached properties to set tool button size 2021-12-03 12:24:31 +03:00
Cameron Gutman fac4c85133 Revert "Fix toolbar button size on Qt 6.2"
Breaks running with Qt 5.9

This reverts commit 84ea483b4c.
2021-12-03 12:17:25 +03:00
Cameron Gutman 97a09e0571 Send UTF-8 clipboard text directly rather than emulating keystrokes 2021-12-03 11:32:58 +03:00
Cameron Gutman c7121516c1 Remove workaround for window occlusion issue fixed in SDL 2.0.18 2021-11-29 23:13:50 +03:00
Cameron Gutman 56a5fbf63b Fix get_buffer2() thread-safety warning with FFmpeg 4.4 2021-11-29 19:45:28 +03:00
Cameron Gutman 80604a752b Set SDL_HINT_APP_NAME for SDL 2.0.18 2021-11-27 17:28:01 +03:00
Cameron Gutman 3fe6e18609 Use SDL_GameControllerHasRumble() on SDL 2.0.18 2021-11-27 17:06:02 +03:00
Cameron Gutman 47f3f30d83 Add high resolution scrolling support with SDL 2.0.18 2021-11-27 06:59:16 +03:00
Cameron Gutman 085a904970 Fix false warning when building without libva-x11 or libva-wayland 2021-11-25 17:52:54 +03:00
Cameron Gutman 0fa7723f51 Fix build without libva-x11 2021-11-25 17:51:08 +03:00
Cameron Gutman 84ea483b4c Fix toolbar button size on Qt 6.2 2021-11-25 12:26:29 +03:00
Cameron Gutman 4de3aa96b6 Add YUV colorspace and color range attributes to EGLImage 2021-11-19 01:15:33 -06:00
Cameron Gutman 1193943228 Re-add comment on color_range comparison 2021-11-19 00:56:46 -06:00
Cameron Gutman 2959faca0c Fix colorspace transitions in EGLRenderer 2021-11-19 00:54:59 -06:00
Cameron Gutman d0df4fa3a0 Fix handling of HDR colorspace transitions in VT renderer 2021-11-19 00:28:15 -06:00
liyu 0a301dd2f9 enables H265 HDR option and adds PQ transforeFunction to render HDR stream on macOS 10.13+ 2021-11-18 23:42:44 -06:00
Cameron Gutman 43e3679297 Revert "Disable the EGL render thread on Wayland"
This reverts commit dcc567ebda.
2021-11-15 21:33:28 -06:00
Cameron Gutman 0455063854 Fix driver version check for Intel's updated version schema in 100 and newer drivers
Fixes #673
2021-11-13 20:44:10 -06:00
Cameron Gutman 12d90d77c7 Fix unintentionally concatenated strings 2021-11-08 19:47:01 -06:00
Cameron Gutman 61d7749aaf Update pre-built dependencies
SDL -> 7f308ab
OpenSSL -> 1.1.1l
FFmpeg -> 4.4.1
2021-11-04 22:49:30 -05:00
曹恩逢 69fb4a0c37 Translated using Weblate (Chinese (Traditional))
Currently translated at 77.9% (145 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2021-11-01 07:34:45 +01:00
Cameron Gutman d2c9f058f8 Add names to session threads 2021-10-24 16:22:49 -05:00
Cameron Gutman acaa3afa0f Rerun lupdate and lrelease 2021-10-06 21:14:21 -05:00
Cameron Gutman 3c58e21cbf Merge remote-tracking branch 'origin/weblate' 2021-10-06 21:12:14 -05:00
曹恩逢 9d3c5b9bc6 Translated using Weblate (Chinese (Traditional))
Currently translated at 76.8% (143 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2021-10-07 04:07:30 +02:00
Eric ce34358d46 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hans/
2021-10-07 04:07:29 +02:00
Cameron Gutman 278bcec238 Integrate new languages 2021-10-06 21:03:02 -05:00
Cameron Gutman 128f458848 Merge remote-tracking branch 'origin/weblate' 2021-10-06 20:15:11 -05:00
Cameron Gutman 7ae2bcd6db Update AppImage to libva 2.13 2021-10-06 20:13:05 -05:00
Luna Jernberg 130f252f97 Translated using Weblate (Swedish)
Currently translated at 31.7% (59 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/sv/
2021-10-06 13:05:00 +02:00
SWZ d339e05a3b Added translation using Weblate (Swedish) 2021-10-01 20:57:41 +02:00
Jorys Paulin 933f4813aa Translated using Weblate (French)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-09-25 11:38:59 +02:00
BOYI LIN f14e71c1d6 Translated using Weblate (Chinese (Traditional))
Currently translated at 38.1% (71 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2021-08-27 17:33:01 +02:00
Mert d78dbd7b0f Translated using Weblate (Turkish)
Currently translated at 8.0% (15 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/tr/
2021-08-24 02:37:31 +02:00
Cameron Gutman 71a6ef6eba Update SDL to 402b86f in AppImage 2021-08-15 15:23:05 -05:00
Cameron Gutman 4873862d16 Use SDL_WaitEventTimeout() on SDL 2.0.16 2021-08-15 15:16:51 -05:00
Cameron Gutman 425efe3d72 Switch to SDL audio backend by default on Windows and macOS 2021-08-15 14:58:29 -05:00
Cameron Gutman 666dc13c01 Use SDL's new support for keyboard grab on macOS 2021-08-15 14:54:26 -05:00
Cameron Gutman 267f9f5759 Update SDL to 402b86f for Windows and macOS 2021-08-15 14:47:10 -05:00
Cameron Gutman c8d8c00f84 Update Visual C++ Runtime installers 2021-08-15 12:17:09 -05:00
Cameron Gutman dcc567ebda Disable the EGL render thread on Wayland 2021-07-31 17:24:18 -05:00
LiuAnnan a199a3ccc3 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.4% (185 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hans/
2021-07-30 08:34:39 +02:00
Cameron Gutman 8159e07427 Ensure our GL context is always current 2021-07-28 20:31:22 -05:00
Nikita Epifanov 32d70758c5 Translated using Weblate (Russian)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ru/
2021-07-23 10:32:32 +02:00
Jorys Paulin 3a9e284f29 Translated using Weblate (French)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-07-19 17:34:21 +02:00
Cameron Gutman c658daeac6 Remove unneccessary EVP_get_digestbyname() invocation
This causes problems with pre-OpenSSL 1.1.0 clients that don't
call OpenSSL_add_all_algorithms() during initialization. This
is known to affect Steam Link on firmware 815.
2021-07-17 20:32:50 -05:00
Jorys Paulin f605169b15 Translated using Weblate (French)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-07-15 15:33:00 +02:00
Cameron Gutman f82b495bcc Switch to the new Sectigo certificate 2021-07-14 21:09:48 -05:00
Tygo T 33b44a87c5 Translated using Weblate (Dutch)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nl/
2021-07-06 14:33:19 +02:00
Gerard Joling a88d994fcb Translated using Weblate (Dutch)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/nl/
2021-07-05 13:48:27 +02:00
Gerard Joling dd9224d9a6 Added translation using Weblate (Dutch) 2021-07-05 10:39:15 +02:00
Cameron Gutman 48728efee0 Add support for dynamic HTTPS port 2021-07-03 00:00:27 -05:00
Cameron Gutman 043c55ae66 Add missing changes to fix build 2021-07-02 23:54:17 -05:00
Cameron Gutman fa3f822cf1 Rework handling of addresses to allow alternate HTTP ports 2021-07-02 23:34:54 -05:00
Cameron Gutman 5afab126b3 Refactor NvPairingManager, NvComputer, and NvHTTP to reduce passing of addresses 2021-07-02 17:14:48 -05:00
Cameron Gutman bee8378795 Pass RTSP session URL to moonlight-common-c for dynamic ports 2021-07-02 01:51:08 -05:00
Cameron Gutman cbd42f4a58 Log launch, resume, and quit responses 2021-07-02 01:18:57 -05:00
Furkan 3333fd7fc8 Added translation using Weblate (Turkish) 2021-07-01 17:52:59 +02:00
DankXylese 142258b4b5 Translated using Weblate (Ukrainian)
Currently translated at 1.6% (3 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/uk/
2021-06-30 13:32:33 +02:00
DankXylese 01213b58ba Added translation using Weblate (Ukrainian) 2021-06-29 12:59:43 +02:00
wkopiaspupn 51df7032bb Translated using Weblate (Chinese (Traditional))
Currently translated at 35.4% (66 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2021-06-27 14:32:49 +02:00
wkopiaspupn c033ce5ecf Translated using Weblate (Chinese (Traditional))
Currently translated at 1.6% (3 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/zh_Hant/
2021-06-26 13:33:38 +02:00
wkopiaspupn bfaf57cfd0 Added translation using Weblate (Chinese (Traditional)) 2021-06-26 13:31:04 +02:00
Cameron Gutman 6c523570e5 Prepare for v3.1.4 2021-06-25 20:39:30 -05:00
Cameron Gutman 047e5bdd81 Update AppImage to libva 2.12 2021-06-24 21:47:01 -05:00
Cameron Gutman 6b1559d397 Update moonlight-common-c to fix audio problems with old GFE and Sunshine versions 2021-06-21 19:26:08 -05:00
WALKTHROUGH RAYMAND LEGENDS a3167b8152 Translated using Weblate (Hungarian)
Currently translated at 2.1% (4 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/hu/
2021-06-15 14:32:39 +02:00
Cameron Gutman cbeb23f16a Adjust Steam Link icon size to 116x116 2021-06-13 16:53:03 -05:00
WALKTHROUGH RAYMAND LEGENDS b4a6512784 Added translation using Weblate (Hungarian) 2021-06-13 21:47:33 +02:00
Cameron Gutman 1af2742013 Update moonlight-common-c to fix spurious exit of fast audio recovery mode on startup 2021-06-13 11:20:28 -05:00
Cameron Gutman 8048938158 Fix Linux build 2021-06-12 16:12:46 -05:00
Cameron Gutman 3689c7f982 Don't enable input capture if the window can't be foregrounded 2021-06-12 13:59:13 -05:00
Cameron Gutman 96c7057fee Update moonlight-common-c to avoid qwave.dll dependency 2021-06-12 12:21:55 -05:00
Cameron Gutman df7c4c82a9 Update moonlight-common-c with performance optimizations 2021-06-09 23:23:47 -05:00
Cameron Gutman 18d8db338b Update moonlight-common-c 2021-06-08 20:19:39 -05:00
Cameron Gutman 9637639e31 Update moonlight-common-c with audio FEC support 2021-06-04 18:46:36 -05:00
Héctor 17abe8f164 Translated using Weblate (Spanish)
Currently translated at 35.4% (66 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/es/
2021-05-27 21:33:27 +02:00
Cameron Gutman badaaece04 Update moonlight-common-c 2021-05-25 20:39:53 -05:00
Cameron Gutman 56119eebae Adapt to constification of AVCodec in FFmpeg master 2021-05-24 23:27:31 -05:00
Cameron Gutman c17c8e2a2c Remove receive time from performance overlay
It is largely superseded by network latency
2021-05-22 13:59:14 -05:00
Cameron Gutman e45a60f2ed Save RTT in VIDEO_STATS so it can be logged on disconnect 2021-05-22 13:57:12 -05:00
Cameron Gutman ebe9356937 Integrate Thai and Korean translations 2021-05-22 13:44:45 -05:00
Cameron Gutman 0094305299 Merge remote-tracking branch 'origin/weblate' 2021-05-22 13:33:20 -05:00
NicolasS b27050d3bf Translated using Weblate (French)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-05-22 18:32:19 +02:00
Jorys Paulin d941e596ad Translated using Weblate (French)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-05-22 18:32:19 +02:00
sanhoe ddaec92da5 Translated using Weblate (Korean)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ko/
2021-05-21 16:14:30 +02:00
sanhoe 1c0a4c92a8 Translated using Weblate (Korean)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ko/
2021-05-20 21:45:31 +02:00
sanhoe 383c00afbd Added translation using Weblate (Korean) 2021-05-20 16:32:05 +02:00
Krit789 d3b2bff8ad Translated using Weblate (Thai)
Currently translated at 41.9% (78 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/th/
2021-05-18 00:32:49 +02:00
Cameron Gutman 77aaa6141d Update moonlight-common-c to avoid excessive ENet retransmissions when RTT variance is 0 2021-05-16 15:40:38 -05:00
Krit789 2bb1af61d0 Added translation using Weblate (Thai) 2021-05-16 21:58:44 +02:00
Cameron Gutman 40b29472b3 Update moonlight-common-c with more accurate RTTs, minRequiredFecPackets, and input queue draining 2021-05-16 14:46:57 -05:00
Cameron Gutman 5d5029de59 Increase limit for the --fps option 2021-05-16 14:45:53 -05:00
Cameron Gutman cc96e6a222 Rebase AppImage on Ubuntu Bionic and Qt 5.15.2 2021-05-16 12:45:34 -05:00
Cameron Gutman 581c9438ca Add network latency to stats overlay 2021-05-15 14:40:31 -05:00
Cameron Gutman 54bd427f26 Integrate Japanese and Vietnamese translations 2021-05-13 00:24:00 -05:00
Cameron Gutman c55d184195 Rerun lupdate-pro and lrelease-pro 2021-05-13 00:13:58 -05:00
Cameron Gutman b279f94789 Merge remote-tracking branch 'origin/weblate' 2021-05-13 00:06:47 -05:00
bruh f3a897e99a Translated using Weblate (Vietnamese)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/vi/
2021-05-13 07:04:50 +02:00
bruh 392b1b5904 Added translation using Weblate (Vietnamese) 2021-05-12 07:36:31 +02:00
grtw2116 4daa8066a6 Translated using Weblate (Japanese)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/ja/
2021-05-10 07:33:45 +02:00
NicolasS 8a89951286 Translated using Weblate (French)
Currently translated at 100.0% (186 of 186 strings)

Translation: Moonlight Game Streaming/moonlight-qt
Translate-URL: https://hosted.weblate.org/projects/moonlight/moonlight-qt/fr/
2021-05-08 07:28:33 +02:00
grtw2116 c41ed55291 Added translation using Weblate (Japanese) 2021-05-08 07:28:33 +02:00
146 changed files with 25304 additions and 2739 deletions
+4 -1
View File
@@ -12,8 +12,11 @@ contains(QT_ARCH, i386) {
contains(QT_ARCH, x86_64) {
LIBS += -L$$PWD/../libs/windows/lib/x64
}
contains(QT_ARCH, arm64) {
LIBS += -L$$PWD/../libs/windows/lib/arm64
}
LIBS += -lNktHookLib
LIBS += -ldetours
DEFINES += ANTIHOOKING_LIBRARY
SOURCES += antihookingprotection.cpp
HEADERS += antihookingprotection.h
+45 -22
View File
@@ -1,6 +1,9 @@
#include "antihookingprotection.h"
#include <NktHookLib.h>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <detours.h>
typedef HMODULE (WINAPI *LoadLibraryAFunc)(LPCSTR lpLibFileName);
typedef HMODULE (WINAPI *LoadLibraryWFunc)(LPCWSTR lpLibFileName);
@@ -12,25 +15,35 @@ class AntiHookingProtection
public:
static void enable()
{
#ifdef QT_DEBUG
s_HookManager.SetEnableDebugOutput(true);
#endif
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
HINSTANCE kernel32Handle = NktHookLibHelpers::GetModuleBaseAddress(L"kernel32.dll");
SIZE_T hookId;
s_RealLoadLibraryA = LoadLibraryA;
DetourAttach(&(PVOID&)s_RealLoadLibraryA, LoadLibraryAHook);
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryA,
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryA"),
(LPVOID)AntiHookingProtection::LoadLibraryAHook);
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryW,
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryW"),
(LPVOID)AntiHookingProtection::LoadLibraryWHook);
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryExA,
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryExA"),
(LPVOID)AntiHookingProtection::LoadLibraryExAHook);
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryExW,
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryExW"),
(LPVOID)AntiHookingProtection::LoadLibraryExWHook);
s_RealLoadLibraryW = LoadLibraryW;
DetourAttach(&(PVOID&)s_RealLoadLibraryW, LoadLibraryWHook);
s_RealLoadLibraryExA = LoadLibraryExA;
DetourAttach(&(PVOID&)s_RealLoadLibraryExA, LoadLibraryExAHook);
s_RealLoadLibraryExW = LoadLibraryExW;
DetourAttach(&(PVOID&)s_RealLoadLibraryExW, LoadLibraryExWHook);
DetourTransactionCommit();
}
static void disable()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)s_RealLoadLibraryA, LoadLibraryAHook);
DetourDetach(&(PVOID&)s_RealLoadLibraryW, LoadLibraryWHook);
DetourDetach(&(PVOID&)s_RealLoadLibraryExA, LoadLibraryExAHook);
DetourDetach(&(PVOID&)s_RealLoadLibraryExW, LoadLibraryExWHook);
DetourTransactionCommit();
}
private:
@@ -124,7 +137,6 @@ private:
return s_RealLoadLibraryExW(lpLibFileName, hFile, dwFlags);
}
static CNktHookLib s_HookManager;
static LoadLibraryAFunc s_RealLoadLibraryA;
static LoadLibraryWFunc s_RealLoadLibraryW;
static LoadLibraryExAFunc s_RealLoadLibraryExA;
@@ -139,7 +151,7 @@ private:
L"SS2OSD.dll", // ASUS Sonic Studio 2
L"Nahimic2OSD.dll",
L"NahimicMSIOSD.dll",
L"nhAsusPhoebusOSD.dll" // ASUS Phoebus
L"nhAsusPhoebusOSD.dll", // ASUS Phoebus
// This DLL has been seen in several crash reports. Some Googling
// suggests it's highly unstable and causes issues in many games.
@@ -209,7 +221,6 @@ private:
};
};
CNktHookLib AntiHookingProtection::s_HookManager;
LoadLibraryAFunc AntiHookingProtection::s_RealLoadLibraryA;
LoadLibraryWFunc AntiHookingProtection::s_RealLoadLibraryW;
LoadLibraryExAFunc AntiHookingProtection::s_RealLoadLibraryExA;
@@ -218,14 +229,26 @@ LoadLibraryExWFunc AntiHookingProtection::s_RealLoadLibraryExW;
AH_EXPORT void AntiHookingDummyImport() {}
extern "C"
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID)
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if (DetourIsHelperProcess()) {
return TRUE;
}
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
DetourRestoreAfterWith();
AntiHookingProtection::enable();
DisableThreadLibraryCalls(hinstDLL);
break;
case DLL_PROCESS_DETACH:
// Ignore DLL_PROCESS_DETACH on process exit. No need to waste time
// unhooking everything if the whole process is being destroyed.
if (lpvReserved == NULL) {
AntiHookingProtection::disable();
}
break;
}
return TRUE;
+6 -5
View File
@@ -1,6 +1,6 @@
# Moonlight PC
[Moonlight PC](https://moonlight-stream.org) is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield, but built to run on Windows, Mac, and Linux. This client is the successor to [Moonlight Chrome](https://github.com/moonlight-stream/moonlight-chrome) for streaming on PC.
[Moonlight PC](https://moonlight-stream.org) is an open source PC client for NVIDIA GameStream, as used by the NVIDIA Shield.
Moonlight also has mobile versions for [Android](https://github.com/moonlight-stream/moonlight-android) and [iOS](https://github.com/moonlight-stream/moonlight-ios).
@@ -14,6 +14,7 @@ You can follow development on our [Discord server](https://moonlight-stream.org/
- Hardware accelerated video decoding on Windows, Mac, and Linux
- Supports streaming at up to 120 FPS (high refresh rate monitor recommended)
- Supports streaming at 720p, 1080p, 1440p, 4K, and the client PC's native screen resolution
- HDR streaming support
- 7.1 surround sound audio support
- Support for both pointer capture (for games) and direct mouse control (for remote desktop)
- Support for passing system-wide keyboard shortcuts like Alt+Tab to the host
@@ -43,12 +44,12 @@ Hosting for Moonlight's Raspberry Pi and L4T package repositories is graciously
* [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/) (Community edition is fine)
* Select **MSVC 2019** option during Qt installation. MinGW is not supported.
* [7-Zip](https://www.7-zip.org/) (only if building installers for non-development PCs)
* [WiX Toolset](https://wixtoolset.org/releases/) v3.11 or later (only if building installers for non-development PCs)
* [WiX Toolset](https://wixtoolset.org/releases/v3-14-0-5722/) v3.14.0.5722 or later (only if building installers for non-development PCs)
### macOS Build Requirements
* Qt 5.15 SDK or later
* macOS High Sierra (10.13) or later
* Xcode 11
* Qt 6.2 SDK or later
* macOS Mojave (10.14) or later
* Xcode 13
* [create-dmg](https://github.com/sindresorhus/create-dmg) (only if building DMGs for use on non-development Macs)
### Linux/Unix Build Requirements
+1 -1
View File
@@ -17,7 +17,7 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>LSMinimumSystemVersion</key>
<string>10.13</string>
<string>10.14</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticGraphicsSwitching</key>
+54 -16
View File
@@ -33,25 +33,32 @@ DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
win32 {
INCLUDEPATH += $$PWD/../libs/windows/include
contains(QT_ARCH, i386) {
LIBS += -L$$PWD/../libs/windows/lib/x86
INCLUDEPATH += $$PWD/../libs/windows/include/x86
}
contains(QT_ARCH, x86_64) {
LIBS += -L$$PWD/../libs/windows/lib/x64
INCLUDEPATH += $$PWD/../libs/windows/include/x64
}
contains(QT_ARCH, arm64) {
LIBS += -L$$PWD/../libs/windows/lib/arm64
INCLUDEPATH += $$PWD/../libs/windows/include/arm64
}
LIBS += ws2_32.lib winmm.lib dxva2.lib ole32.lib gdi32.lib user32.lib d3d9.lib dwmapi.lib dbghelp.lib qwave.lib
INCLUDEPATH += $$PWD/../libs/windows/include
LIBS += ws2_32.lib winmm.lib dxva2.lib ole32.lib gdi32.lib user32.lib d3d9.lib dwmapi.lib dbghelp.lib
}
macx {
INCLUDEPATH += $$PWD/../libs/mac/include
INCLUDEPATH += $$PWD/../libs/mac/Frameworks/SDL2.framework/Versions/A/Headers
INCLUDEPATH += $$PWD/../libs/mac/Frameworks/SDL2_ttf.framework/Versions/A/Headers
LIBS += -L$$PWD/../libs/mac/lib -F$$PWD/../libs/mac/Frameworks
# QMake doesn't handle framework-style includes correctly on its own
QMAKE_CFLAGS += -F$$PWD/../libs/mac/Frameworks
QMAKE_CXXFLAGS += -F$$PWD/../libs/mac/Frameworks
QMAKE_OBJECTIVE_CFLAGS += -F$$PWD/../libs/mac/Frameworks
}
unix:!macx {
@@ -88,6 +95,11 @@ unix:!macx {
PKGCONFIG += libdrm
CONFIG += libdrm
}
packagesExist(ffnvcodec) {
PKGCONFIG += ffnvcodec
CONFIG += cuda
}
}
packagesExist(wayland-client) {
@@ -101,14 +113,14 @@ unix:!macx {
}
}
win32 {
LIBS += -llibssl -llibcrypto -lSDL2 -lSDL2_ttf -lavcodec -lavutil -lopus
LIBS += -llibssl -llibcrypto -lSDL2 -lSDL2_ttf -lavcodec -lavutil -lopus -ldxgi -ld3d11
CONFIG += ffmpeg
}
win32:!winrt {
CONFIG += soundio discord-rpc
}
macx {
LIBS += -lssl -lcrypto -lavcodec.58 -lavutil.56 -lopus -framework SDL2 -framework SDL2_ttf
LIBS += -lssl -lcrypto -lavcodec.59 -lavutil.57 -lopus -framework SDL2 -framework SDL2_ttf
LIBS += -lobjc -framework VideoToolbox -framework AVFoundation -framework CoreVideo -framework CoreGraphics -framework CoreMedia -framework AppKit -framework Metal
# For libsoundio
@@ -118,6 +130,7 @@ macx {
}
SOURCES += \
backend/nvaddress.cpp \
backend/nvapp.cpp \
main.cpp \
backend/computerseeker.cpp \
@@ -135,7 +148,6 @@ SOURCES += \
settings/mappingfetcher.cpp \
settings/streamingpreferences.cpp \
streaming/input/abstouch.cpp \
streaming/input/clipboard.cpp \
streaming/input/gamepad.cpp \
streaming/input/input.cpp \
streaming/input/keyboard.cpp \
@@ -156,6 +168,7 @@ SOURCES += \
wm.cpp
HEADERS += \
backend/nvaddress.h \
backend/nvapp.h \
settings/compatfetcher.h \
settings/mappingfetcher.h \
@@ -195,7 +208,6 @@ ffmpeg {
SOURCES += \
streaming/video/ffmpeg.cpp \
streaming/video/ffmpeg-renderers/sdlvid.cpp \
streaming/video/ffmpeg-renderers/cuda.cpp \
streaming/video/ffmpeg-renderers/pacer/pacer.cpp \
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp
@@ -203,7 +215,6 @@ ffmpeg {
streaming/video/ffmpeg.h \
streaming/video/ffmpeg-renderers/renderer.h \
streaming/video/ffmpeg-renderers/sdlvid.h \
streaming/video/ffmpeg-renderers/cuda.h \
streaming/video/ffmpeg-renderers/pacer/pacer.h \
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h
}
@@ -260,6 +271,13 @@ libdrm {
LIBS += -ldl
}
}
cuda {
message(CUDA support enabled)
DEFINES += HAVE_CUDA
SOURCES += streaming/video/ffmpeg-renderers/cuda.cpp
HEADERS += streaming/video/ffmpeg-renderers/cuda.h
}
config_EGL {
message(EGL renderer selected)
@@ -283,15 +301,20 @@ config_SL {
streaming/video/slvid.h \
streaming/audio/renderers/slaud.h
}
win32 {
HEADERS += streaming/video/ffmpeg-renderers/dxutil.h
}
win32:!winrt {
message(DXVA2 renderer selected)
message(DXVA2 and D3D11VA renderers selected)
SOURCES += \
streaming/video/ffmpeg-renderers/dxva2.cpp \
streaming/video/ffmpeg-renderers/d3d11va.cpp \
streaming/video/ffmpeg-renderers/pacer/dxvsyncsource.cpp
HEADERS += \
streaming/video/ffmpeg-renderers/dxva2.h \
streaming/video/ffmpeg-renderers/d3d11va.h \
streaming/video/ffmpeg-renderers/pacer/dxvsyncsource.h
}
macx {
@@ -332,7 +355,24 @@ TRANSLATIONS += \
languages/qml_fr.ts \
languages/qml_nb_NO.ts \
languages/qml_ru.ts \
languages/qml_es.ts
languages/qml_es.ts \
languages/qml_ja.ts \
languages/qml_vi.ts \
languages/qml_th.ts \
languages/qml_ko.ts \
languages/qml_hu.ts \
languages/qml_nl.ts \
languages/qml_sv.ts \
languages/qml_tr.ts \
languages/qml_uk.ts \
languages/qml_zh_Hant.ts \
languages/qml_el.ts \
languages/qml_hi.ts \
languages/qml_it.ts \
languages/qml_pt.ts \
languages/qml_pt_BR.ts \
languages/qml_pl.ts \
languages/qml_cs.ts
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
@@ -371,13 +411,11 @@ INCLUDEPATH += $$PWD/../h264bitstream/h264bitstream
DEPENDPATH += $$PWD/../h264bitstream/h264bitstream
!winrt {
contains(QT_ARCH, i386)|contains(QT_ARCH, x86_64) {
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/release/ -lAntiHooking
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/debug/ -lAntiHooking
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/release/ -lAntiHooking
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/debug/ -lAntiHooking
INCLUDEPATH += $$PWD/../AntiHooking
DEPENDPATH += $$PWD/../AntiHooking
}
INCLUDEPATH += $$PWD/../AntiHooking
DEPENDPATH += $$PWD/../AntiHooking
}
unix:!macx: {
+1 -1
View File
@@ -106,7 +106,7 @@ void BoxArtManager::handleBoxArtLoadComplete(NvComputer* computer, NvApp app, QU
QUrl BoxArtManager::loadBoxArtFromNetwork(NvComputer* computer, int appId)
{
NvHTTP http(computer->activeAddress, computer->serverCert);
NvHTTP http(computer);
QString cachePath = getFilePathForBoxArt(computer, appId);
QImage image;
+38 -27
View File
@@ -27,9 +27,9 @@ public:
}
private:
bool tryPollComputer(QString address, bool& changed)
bool tryPollComputer(NvAddress address, bool& changed)
{
NvHTTP http(address, m_Computer->serverCert);
NvHTTP http(address, 0, m_Computer->serverCert);
QString serverInfo;
try {
@@ -38,7 +38,7 @@ private:
return false;
}
NvComputer newState(address, serverInfo, QSslCertificate());
NvComputer newState(http, serverInfo);
// Ensure the machine that responded is the one we intended to contact
if (m_Computer->uuid != newState.uuid) {
@@ -52,9 +52,7 @@ private:
bool updateAppList(bool& changed)
{
Q_ASSERT(m_Computer->activeAddress != nullptr);
NvHTTP http(m_Computer->activeAddress, m_Computer->serverCert);
NvHTTP http(m_Computer);
QVector<NvApp> appList;
@@ -88,7 +86,7 @@ private:
if (tryPollComputer(address, stateChanged)) {
if (!wasOnline) {
qInfo() << m_Computer->name << "is now online at" << m_Computer->activeAddress;
qInfo() << m_Computer->name << "is now online at" << m_Computer->activeAddress.toString();
}
online = true;
break;
@@ -326,7 +324,7 @@ void ComputerManager::handleMdnsServiceResolved(MdnsPendingComputer* computer,
// address may not be reachable (if the user hasn't installed the IPv6 helper yet
// or if this host lacks outbound IPv6 capability). We want to add IPv6 even if
// it's not currently reachable.
addNewHost(address.toString(), true, v6Global);
addNewHost(NvAddress(address, computer->port()), true, NvAddress(v6Global, computer->port()));
added = true;
break;
}
@@ -340,7 +338,7 @@ void ComputerManager::handleMdnsServiceResolved(MdnsPendingComputer* computer,
if (address.isInSubnet(QHostAddress("fe80::"), 10) ||
address.isInSubnet(QHostAddress("fec0::"), 10) ||
address.isInSubnet(QHostAddress("fc00::"), 7)) {
addNewHost(address.toString(), true, v6Global);
addNewHost(NvAddress(address, computer->port()), true, NvAddress(v6Global, computer->port()));
break;
}
}
@@ -470,7 +468,7 @@ signals:
private:
void run()
{
NvPairingManager pairingManager(m_Computer->activeAddress);
NvPairingManager pairingManager(m_Computer);
try {
NvPairingManager::PairState result = pairingManager.pair(m_Computer->appVersion, m_Pin, m_Computer->serverCert);
@@ -526,7 +524,7 @@ signals:
private:
void run()
{
NvHTTP http(m_Computer->activeAddress, m_Computer->serverCert);
NvHTTP http(m_Computer);
try {
if (m_Computer->currentGameId != 0) {
@@ -592,12 +590,24 @@ void ComputerManager::stopPollingAsync()
}
}
void ComputerManager::addNewHostManually(QString address)
{
QUrl url = QUrl::fromUserInput(address);
if (url.isValid() && !url.host().isEmpty()) {
// If there wasn't a port specified, use the default
addNewHost(NvAddress(url.host(), url.port(DEFAULT_HTTP_PORT)), false);
}
else {
emit computerAddCompleted(false, false);
}
}
class PendingAddTask : public QObject, public QRunnable
{
Q_OBJECT
public:
PendingAddTask(ComputerManager* computerManager, QString address, QHostAddress mdnsIpv6Address, bool mdns)
PendingAddTask(ComputerManager* computerManager, NvAddress address, NvAddress mdnsIpv6Address, bool mdns)
: m_ComputerManager(computerManager),
m_Address(address),
m_MdnsIpv6Address(mdnsIpv6Address),
@@ -661,15 +671,15 @@ private:
void run()
{
NvHTTP http(m_Address, QSslCertificate());
NvHTTP http(m_Address, 0, QSslCertificate());
qInfo() << "Processing new PC at" << m_Address << "from" << (m_Mdns ? "mDNS" : "user") << m_MdnsIpv6Address;
qInfo() << "Processing new PC at" << m_Address.toString() << "from" << (m_Mdns ? "mDNS" : "user") << "with IPv6 address" << m_MdnsIpv6Address.toString();
// Perform initial serverinfo fetch over HTTP since we don't know which cert to use
QString serverInfo = fetchServerInfo(http);
if (serverInfo.isEmpty() && !m_MdnsIpv6Address.isNull()) {
// Retry using the global IPv6 address if the IPv4 or link-local IPv6 address fails
http.setAddress(m_MdnsIpv6Address.toString());
http.setAddress(m_MdnsIpv6Address);
serverInfo = fetchServerInfo(http);
}
if (serverInfo.isEmpty()) {
@@ -677,7 +687,7 @@ private:
}
// Create initial newComputer using HTTP serverinfo with no pinned cert
NvComputer* newComputer = new NvComputer(http.address(), serverInfo, QSslCertificate());
NvComputer* newComputer = new NvComputer(http, serverInfo);
// Check if we have a record of this host UUID to pull the pinned cert
NvComputer* existingComputer;
@@ -691,13 +701,14 @@ private:
// Fetch serverinfo again over HTTPS with the pinned cert
if (existingComputer != nullptr) {
Q_ASSERT(http.httpsPort() != 0);
serverInfo = fetchServerInfo(http);
if (serverInfo.isEmpty()) {
return;
}
// Update the polled computer with the HTTPS information
NvComputer httpsComputer(http.address(), serverInfo, QSslCertificate());
NvComputer httpsComputer(http, serverInfo);
newComputer->update(httpsComputer);
}
@@ -711,11 +722,11 @@ private:
}
// Get the WAN IP address using STUN if we're on mDNS over IPv4
if (QHostAddress(newComputer->localAddress).protocol() == QAbstractSocket::IPv4Protocol) {
if (QHostAddress(newComputer->localAddress.address()).protocol() == QAbstractSocket::IPv4Protocol) {
quint32 addr;
int err = LiFindExternalAddressIP4("stun.moonlight-stream.org", 3478, &addr);
if (err == 0) {
newComputer->remoteAddress = QHostAddress(qFromBigEndian(addr)).toString();
newComputer->setRemoteAddress(QHostAddress(qFromBigEndian(addr)));
}
else {
qWarning() << "STUN failed to get WAN address:" << err;
@@ -723,15 +734,15 @@ private:
}
if (!m_MdnsIpv6Address.isNull()) {
Q_ASSERT(m_MdnsIpv6Address.protocol() == QAbstractSocket::IPv6Protocol);
newComputer->ipv6Address = m_MdnsIpv6Address.toString();
Q_ASSERT(QHostAddress(m_MdnsIpv6Address.address()).protocol() == QAbstractSocket::IPv6Protocol);
newComputer->ipv6Address = m_MdnsIpv6Address;
}
}
else {
newComputer->manualAddress = m_Address;
}
QHostAddress hostAddress(m_Address);
QHostAddress hostAddress(m_Address.address());
bool addressIsSiteLocalV4 =
hostAddress.isInSubnet(QHostAddress("10.0.0.0"), 8) ||
hostAddress.isInSubnet(QHostAddress("172.16.0.0"), 12) ||
@@ -756,7 +767,7 @@ private:
// Tell our client if something changed
if (changed) {
qInfo() << existingComputer->name << "is now at" << existingComputer->activeAddress;
qInfo() << existingComputer->name << "is now at" << existingComputer->activeAddress.toString();
emit computerStateChanged(existingComputer);
}
}
@@ -777,7 +788,7 @@ private:
int err = LiFindExternalAddressIP4("stun.moonlight-stream.org", 3478, &addr);
if (err == 0) {
lock.relock();
newComputer->remoteAddress = QHostAddress(qFromBigEndian(addr)).toString();
newComputer->setRemoteAddress(QHostAddress(qFromBigEndian(addr)));
lock.unlock();
}
else {
@@ -797,12 +808,12 @@ private:
}
ComputerManager* m_ComputerManager;
QString m_Address;
QHostAddress m_MdnsIpv6Address;
NvAddress m_Address;
NvAddress m_MdnsIpv6Address;
bool m_Mdns;
};
void ComputerManager::addNewHost(QString address, bool mdns, QHostAddress mdnsIpv6Address)
void ComputerManager::addNewHost(NvAddress address, bool mdns, NvAddress mdnsIpv6Address)
{
// Punt to a worker thread to avoid stalling the
// UI while waiting for serverinfo query to complete
+10 -1
View File
@@ -24,6 +24,7 @@ public:
explicit MdnsPendingComputer(QMdnsEngine::Server* server,
const QMdnsEngine::Service& service)
: m_Hostname(service.hostname()),
m_Port(service.port()),
m_Server(server),
m_Resolver(nullptr)
{
@@ -41,6 +42,11 @@ public:
return m_Hostname;
}
uint16_t port()
{
return m_Port;
}
private slots:
void handleResolvedTimeout()
{
@@ -75,6 +81,7 @@ private:
}
QByteArray m_Hostname;
uint16_t m_Port;
QMdnsEngine::Server* m_Server;
QMdnsEngine::Resolver* m_Resolver;
QVector<QHostAddress> m_Addresses;
@@ -169,7 +176,9 @@ public:
Q_INVOKABLE void stopPollingAsync();
Q_INVOKABLE void addNewHost(QString address, bool mdns, QHostAddress mdnsIpv6Address = QHostAddress());
Q_INVOKABLE void addNewHostManually(QString address);
void addNewHost(NvAddress address, bool mdns, NvAddress mdnsIpv6Address = NvAddress());
void pairHost(NvComputer* computer, QString pin);
+3 -3
View File
@@ -20,7 +20,7 @@ void ComputerSeeker::start(int timeout)
// if m_ComputerName is UUID, or the name that doesn't resolve to an IP
// address) and by polling it using mDNS, hopefully one of these methods
// would find the host
m_ComputerManager->addNewHost(m_ComputerName, false);
m_ComputerManager->addNewHostManually(m_ComputerName);
m_ComputerManager->startPolling();
}
@@ -44,8 +44,8 @@ bool ComputerSeeker::matchComputer(NvComputer *computer) const
return true;
}
for (const QString& addr : computer->uniqueAddresses()) {
if (addr.toLower() == value) {
for (const NvAddress& addr : computer->uniqueAddresses()) {
if (addr.address().toLower() == value || addr.toString().toLower() == value) {
return true;
}
}
+65
View File
@@ -0,0 +1,65 @@
#include "nvaddress.h"
#include <QHostAddress>
NvAddress::NvAddress()
{
setAddress(nullptr);
setPort(0);
}
NvAddress::NvAddress(QString addr, uint16_t port)
{
setAddress(addr);
setPort(port);
}
NvAddress::NvAddress(QHostAddress addr, uint16_t port)
{
setAddress(addr);
setPort(port);
}
uint16_t NvAddress::port() const
{
return m_Port;
}
QString NvAddress::address() const
{
return m_Address;
}
void NvAddress::setPort(uint16_t port)
{
m_Port = port;
}
void NvAddress::setAddress(QString addr)
{
m_Address = addr;
}
void NvAddress::setAddress(QHostAddress addr)
{
m_Address = addr.toString();
}
bool NvAddress::isNull() const
{
return m_Address.isEmpty();
}
QString NvAddress::toString() const
{
if (m_Address.isEmpty()) {
return "<NULL>";
}
if (QHostAddress(m_Address).protocol() == QAbstractSocket::IPv6Protocol) {
return QString("[%1]:%2").arg(m_Address).arg(m_Port);
}
else {
return QString("%1:%2").arg(m_Address).arg(m_Port);
}
}
+39
View File
@@ -0,0 +1,39 @@
#pragma once
#include <QHostAddress>
#define DEFAULT_HTTP_PORT 47989
#define DEFAULT_HTTPS_PORT 47984
class NvAddress
{
public:
NvAddress();
explicit NvAddress(QString addr, uint16_t port);
explicit NvAddress(QHostAddress addr, uint16_t port);
uint16_t port() const;
void setPort(uint16_t port);
QString address() const;
void setAddress(QString addr);
void setAddress(QHostAddress addr);
bool isNull() const;
QString toString() const;
bool operator==(const NvAddress& other) const
{
return m_Address == other.m_Address &&
m_Port == other.m_Port;
}
bool operator!=(const NvAddress& other) const
{
return !operator==(other);
}
private:
QString m_Address;
uint16_t m_Port;
};
+70 -26
View File
@@ -11,9 +11,13 @@
#define SER_UUID "uuid"
#define SER_MAC "mac"
#define SER_LOCALADDR "localaddress"
#define SER_LOCALPORT "localport"
#define SER_REMOTEADDR "remoteaddress"
#define SER_REMOTEPORT "remoteport"
#define SER_MANUALADDR "manualaddress"
#define SER_MANUALPORT "manualport"
#define SER_IPV6ADDR "ipv6address"
#define SER_IPV6PORT "ipv6port"
#define SER_APPLIST "apps"
#define SER_SRVCERT "srvcert"
#define SER_CUSTOMNAME "customname"
@@ -24,10 +28,14 @@ NvComputer::NvComputer(QSettings& settings)
this->uuid = settings.value(SER_UUID).toString();
this->hasCustomName = settings.value(SER_CUSTOMNAME).toBool();
this->macAddress = settings.value(SER_MAC).toByteArray();
this->localAddress = settings.value(SER_LOCALADDR).toString();
this->remoteAddress = settings.value(SER_REMOTEADDR).toString();
this->ipv6Address = settings.value(SER_IPV6ADDR).toString();
this->manualAddress = settings.value(SER_MANUALADDR).toString();
this->localAddress = NvAddress(settings.value(SER_LOCALADDR).toString(),
settings.value(SER_LOCALPORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
this->remoteAddress = NvAddress(settings.value(SER_REMOTEADDR).toString(),
settings.value(SER_REMOTEPORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
this->ipv6Address = NvAddress(settings.value(SER_IPV6ADDR).toString(),
settings.value(SER_IPV6PORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
this->manualAddress = NvAddress(settings.value(SER_MANUALADDR).toString(),
settings.value(SER_MANUALPORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
this->serverCert = QSslCertificate(settings.value(SER_SRVCERT).toByteArray());
int appCount = settings.beginReadArray(SER_APPLIST);
@@ -41,7 +49,6 @@ NvComputer::NvComputer(QSettings& settings)
settings.endArray();
sortAppList();
this->activeAddress = nullptr;
this->currentGameId = 0;
this->pairState = PS_UNKNOWN;
this->state = CS_UNKNOWN;
@@ -52,6 +59,15 @@ NvComputer::NvComputer(QSettings& settings)
this->pendingQuit = false;
this->gpuModel = nullptr;
this->isSupportedServerVersion = true;
this->externalPort = this->remoteAddress.port();
this->activeHttpsPort = 0;
}
void NvComputer::setRemoteAddress(QHostAddress address)
{
Q_ASSERT(this->externalPort != 0);
this->remoteAddress = NvAddress(address, this->externalPort);
}
void NvComputer::serialize(QSettings& settings) const
@@ -62,10 +78,14 @@ void NvComputer::serialize(QSettings& settings) const
settings.setValue(SER_CUSTOMNAME, hasCustomName);
settings.setValue(SER_UUID, uuid);
settings.setValue(SER_MAC, macAddress);
settings.setValue(SER_LOCALADDR, localAddress);
settings.setValue(SER_REMOTEADDR, remoteAddress);
settings.setValue(SER_IPV6ADDR, ipv6Address);
settings.setValue(SER_MANUALADDR, manualAddress);
settings.setValue(SER_LOCALADDR, localAddress.address());
settings.setValue(SER_LOCALPORT, localAddress.port());
settings.setValue(SER_REMOTEADDR, remoteAddress.address());
settings.setValue(SER_REMOTEPORT, remoteAddress.port());
settings.setValue(SER_IPV6ADDR, ipv6Address.address());
settings.setValue(SER_IPV6PORT, ipv6Address.port());
settings.setValue(SER_MANUALADDR, manualAddress.address());
settings.setValue(SER_MANUALPORT, manualAddress.port());
settings.setValue(SER_SRVCERT, serverCert.toPem());
// Avoid deleting an existing applist if we couldn't get one
@@ -87,9 +107,9 @@ void NvComputer::sortAppList()
});
}
NvComputer::NvComputer(QString address, QString serverInfo, QSslCertificate serverCert)
NvComputer::NvComputer(NvHTTP& http, QString serverInfo)
{
this->serverCert = serverCert;
this->serverCert = http.serverCert();
this->hasCustomName = false;
this->name = NvHTTP::getXmlString(serverInfo, "hostname");
@@ -130,19 +150,38 @@ NvComputer::NvComputer(QString address, QString serverInfo, QSslCertificate serv
});
// We can get an IPv4 loopback address if we're using the GS IPv6 Forwarder
this->localAddress = NvHTTP::getXmlString(serverInfo, "LocalIP");
if (this->localAddress.startsWith("127.")) {
this->localAddress = QString();
this->localAddress = NvAddress(NvHTTP::getXmlString(serverInfo, "LocalIP"), http.httpPort());
if (this->localAddress.address().startsWith("127.")) {
this->localAddress = NvAddress();
}
QString httpsPort = NvHTTP::getXmlString(serverInfo, "HttpsPort");
if (httpsPort.isEmpty() || (this->activeHttpsPort = httpsPort.toUShort()) == 0) {
this->activeHttpsPort = DEFAULT_HTTPS_PORT;
}
// This is an extension which is not present in GFE. It is present for Sunshine to be able
// to support dynamic HTTP WAN ports without requiring the user to manually enter the port.
QString remotePortStr = NvHTTP::getXmlString(serverInfo, "ExternalPort");
if (remotePortStr.isEmpty() || (this->externalPort = remotePortStr.toUShort()) == 0) {
this->externalPort = DEFAULT_HTTP_PORT;
}
QString remoteAddress = NvHTTP::getXmlString(serverInfo, "ExternalIP");
if (!remoteAddress.isEmpty()) {
this->remoteAddress = NvAddress(remoteAddress, this->externalPort);
}
else {
this->remoteAddress = NvAddress();
}
this->remoteAddress = NvHTTP::getXmlString(serverInfo, "ExternalIP");
this->pairState = NvHTTP::getXmlString(serverInfo, "PairStatus") == "1" ?
PS_PAIRED : PS_NOT_PAIRED;
this->currentGameId = NvHTTP::getCurrentGame(serverInfo);
this->appVersion = NvHTTP::getXmlString(serverInfo, "appversion");
this->gfeVersion = NvHTTP::getXmlString(serverInfo, "GfeVersion");
this->gpuModel = NvHTTP::getXmlString(serverInfo, "gputype");
this->activeAddress = address;
this->activeAddress = http.address();
this->state = NvComputer::CS_ONLINE;
this->pendingQuit = false;
this->isSupportedServerVersion = CompatFetcher::isGfeVersionSupported(this->gfeVersion);
@@ -177,7 +216,10 @@ bool NvComputer::wake()
// Add the addresses that we know this host to be
// and broadcast addresses for this link just in
// case the host has timed out in ARP entries.
QVector<QString> addressList = uniqueAddresses();
QVector<QString> addressList;
for (const NvAddress& addr : uniqueAddresses()) {
addressList.append(addr.address());
}
addressList.append("255.255.255.255");
// Try to broadcast on all available NICs
@@ -238,14 +280,14 @@ bool NvComputer::wake()
bool NvComputer::isReachableOverVpn()
{
if (activeAddress.isEmpty()) {
if (activeAddress.isNull()) {
return false;
}
QTcpSocket s;
s.setProxy(QNetworkProxy::NoProxy);
s.connectToHost(activeAddress, 47984);
s.connectToHost(activeAddress.address(), activeAddress.port());
if (s.waitForConnected(3000)) {
Q_ASSERT(!s.localAddress().isNull());
@@ -331,9 +373,9 @@ bool NvComputer::updateAppList(QVector<NvApp> newAppList) {
return true;
}
QVector<QString> NvComputer::uniqueAddresses() const
QVector<NvAddress> NvComputer::uniqueAddresses() const
{
QVector<QString> uniqueAddressList;
QVector<NvAddress> uniqueAddressList;
// Start with addresses correctly ordered
uniqueAddressList.append(activeAddress);
@@ -344,7 +386,7 @@ QVector<QString> NvComputer::uniqueAddresses() const
// Prune duplicates (always giving precedence to the first)
for (int i = 0; i < uniqueAddressList.count(); i++) {
if (uniqueAddressList[i].isEmpty()) {
if (uniqueAddressList[i].isNull()) {
uniqueAddressList.remove(i);
i--;
continue;
@@ -400,10 +442,12 @@ bool NvComputer::update(NvComputer& that)
ASSIGN_IF_CHANGED(name);
}
ASSIGN_IF_CHANGED_AND_NONEMPTY(macAddress);
ASSIGN_IF_CHANGED_AND_NONEMPTY(localAddress);
ASSIGN_IF_CHANGED_AND_NONEMPTY(remoteAddress);
ASSIGN_IF_CHANGED_AND_NONEMPTY(ipv6Address);
ASSIGN_IF_CHANGED_AND_NONEMPTY(manualAddress);
ASSIGN_IF_CHANGED_AND_NONNULL(localAddress);
ASSIGN_IF_CHANGED_AND_NONNULL(remoteAddress);
ASSIGN_IF_CHANGED_AND_NONNULL(ipv6Address);
ASSIGN_IF_CHANGED_AND_NONNULL(manualAddress);
ASSIGN_IF_CHANGED(activeHttpsPort);
ASSIGN_IF_CHANGED(externalPort);
ASSIGN_IF_CHANGED(pairState);
ASSIGN_IF_CHANGED(serverCodecModeSupport);
ASSIGN_IF_CHANGED(currentGameId);
+15 -7
View File
@@ -1,6 +1,7 @@
#pragma once
#include "nvhttp.h"
#include "nvaddress.h"
#include <QThread>
#include <QReadWriteLock>
@@ -21,10 +22,13 @@ private:
bool pendingQuit;
public:
explicit NvComputer(QString address, QString serverInfo, QSslCertificate serverCert);
explicit NvComputer(NvHTTP& http, QString serverInfo);
explicit NvComputer(QSettings& settings);
void
setRemoteAddress(QHostAddress);
bool
update(NvComputer& that);
@@ -34,7 +38,7 @@ public:
bool
isReachableOverVpn();
QVector<QString>
QVector<NvAddress>
uniqueAddresses() const;
void
@@ -57,7 +61,8 @@ public:
// Ephemeral traits
ComputerState state;
PairState pairState;
QString activeAddress;
NvAddress activeAddress;
uint16_t activeHttpsPort;
int currentGameId;
QString gfeVersion;
QString appVersion;
@@ -68,10 +73,10 @@ public:
bool isSupportedServerVersion;
// Persisted traits
QString localAddress;
QString remoteAddress;
QString ipv6Address;
QString manualAddress;
NvAddress localAddress;
NvAddress remoteAddress;
NvAddress ipv6Address;
NvAddress manualAddress;
QByteArray macAddress;
QString name;
bool hasCustomName;
@@ -81,4 +86,7 @@ public:
// Synchronization
mutable QReadWriteLock lock;
private:
uint16_t externalPort;
};
+70 -14
View File
@@ -1,4 +1,4 @@
#include "nvhttp.h"
#include "nvcomputer.h"
#include <Limelight.h>
#include <QDebug>
@@ -18,15 +18,14 @@
#define RESUME_TIMEOUT_MS 30000
#define QUIT_TIMEOUT_MS 30000
NvHTTP::NvHTTP(QString address, QSslCertificate serverCert) :
NvHTTP::NvHTTP(NvAddress address, uint16_t httpsPort, QSslCertificate serverCert) :
m_ServerCert(serverCert)
{
m_BaseUrlHttp.setScheme("http");
m_BaseUrlHttps.setScheme("https");
m_BaseUrlHttp.setPort(47989);
m_BaseUrlHttps.setPort(47984);
setAddress(address);
setHttpsPort(httpsPort);
// Never use a proxy server
QNetworkProxy noProxy(QNetworkProxy::NoProxy);
@@ -35,26 +34,54 @@ NvHTTP::NvHTTP(QString address, QSslCertificate serverCert) :
connect(&m_Nam, &QNetworkAccessManager::sslErrors, this, &NvHTTP::handleSslErrors);
}
NvHTTP::NvHTTP(NvComputer* computer) :
NvHTTP(computer->activeAddress, computer->activeHttpsPort, computer->serverCert)
{
}
void NvHTTP::setServerCert(QSslCertificate serverCert)
{
m_ServerCert = serverCert;
}
void NvHTTP::setAddress(QString address)
void NvHTTP::setAddress(NvAddress address)
{
Q_ASSERT(!address.isEmpty());
Q_ASSERT(!address.isNull());
m_Address = address;
m_BaseUrlHttp.setHost(address);
m_BaseUrlHttps.setHost(address);
m_BaseUrlHttp.setHost(address.address());
m_BaseUrlHttps.setHost(address.address());
m_BaseUrlHttp.setPort(address.port());
}
QString NvHTTP::address()
void NvHTTP::setHttpsPort(uint16_t port)
{
m_BaseUrlHttps.setPort(port);
}
NvAddress NvHTTP::address()
{
return m_Address;
}
QSslCertificate NvHTTP::serverCert()
{
return m_ServerCert;
}
uint16_t NvHTTP::httpPort()
{
return m_BaseUrlHttp.port();
}
uint16_t NvHTTP::httpsPort()
{
return m_BaseUrlHttps.port();
}
QVector<int>
NvHTTP::parseQuad(QString quad)
{
@@ -98,8 +125,8 @@ NvHTTP::getServerInfo(NvLogLevel logLevel, bool fastFail)
{
QString serverInfo;
// Check if we have a pinned cert for this host yet
if (!m_ServerCert.isNull())
// Check if we have a pinned cert and HTTPS port for this host yet
if (!m_ServerCert.isNull() && httpsPort() != 0)
{
try
{
@@ -134,13 +161,26 @@ NvHTTP::getServerInfo(NvLogLevel logLevel, bool fastFail)
}
else
{
// Only use HTTP prior to pairing
// Only use HTTP prior to pairing or fetching HTTPS port
serverInfo = openConnectionToString(m_BaseUrlHttp,
"serverinfo",
nullptr,
fastFail ? FAST_FAIL_TIMEOUT_MS : REQUEST_TIMEOUT_MS,
logLevel);
verifyResponseStatus(serverInfo);
// Populate the HTTPS port
uint16_t httpsPort = getXmlString(serverInfo, "HttpsPort").toUShort();
if (httpsPort == 0) {
httpsPort = DEFAULT_HTTPS_PORT;
}
setHttpsPort(httpsPort);
// If we just needed to determine the HTTPS port, we'll try again over
// HTTPS now that we have the port number
if (!m_ServerCert.isNull()) {
return getServerInfo(logLevel, fastFail);
}
}
return serverInfo;
@@ -151,7 +191,8 @@ NvHTTP::launchApp(int appId,
PSTREAM_CONFIGURATION streamConfig,
bool sops,
bool localAudio,
int gamepadMask)
int gamepadMask,
QString& rtspSessionUrl)
{
int riKeyId;
@@ -181,12 +222,16 @@ NvHTTP::launchApp(int appId,
"&gcmap="+QString::number(gamepadMask),
LAUNCH_TIMEOUT_MS);
qInfo() << "Launch response:" << response;
// Throws if the request failed
verifyResponseStatus(response);
rtspSessionUrl = getXmlString(response, "sessionUrl0");
}
void
NvHTTP::resumeApp(PSTREAM_CONFIGURATION streamConfig)
NvHTTP::resumeApp(PSTREAM_CONFIGURATION streamConfig, QString& rtspSessionUrl)
{
int riKeyId;
@@ -201,8 +246,12 @@ NvHTTP::resumeApp(PSTREAM_CONFIGURATION streamConfig)
"&surroundAudioInfo="+QString::number(SURROUNDAUDIOINFO_FROM_AUDIO_CONFIGURATION(streamConfig->audioConfiguration)),
RESUME_TIMEOUT_MS);
qInfo() << "Resume response:" << response;
// Throws if the request failed
verifyResponseStatus(response);
rtspSessionUrl = getXmlString(response, "sessionUrl0");
}
void
@@ -214,6 +263,8 @@ NvHTTP::quitApp()
nullptr,
QUIT_TIMEOUT_MS);
qInfo() << "Quit response:" << response;
// Throws if the request failed
verifyResponseStatus(response);
@@ -330,6 +381,8 @@ NvHTTP::verifyResponseStatus(QString xml)
}
}
}
throw GfeHttpResponseException(-1, "Malformed GFE XML (missing root element)");
}
QImage
@@ -435,6 +488,9 @@ NvHTTP::openConnection(QUrl baseUrl,
int timeoutMs,
NvLogLevel logLevel)
{
// Port must be set
Q_ASSERT(baseUrl.port(0) != 0);
// Build a URL for the request
QUrl url(baseUrl);
url.setPath("/" + command);
+20 -6
View File
@@ -2,6 +2,7 @@
#include "identitymanager.h"
#include "nvapp.h"
#include "nvaddress.h"
#include <Limelight.h>
@@ -9,6 +10,8 @@
#include <QNetworkAccessManager>
#include <QNetworkReply>
class NvComputer;
class NvDisplayMode
{
public:
@@ -106,7 +109,9 @@ public:
NVLL_VERBOSE
};
explicit NvHTTP(QString address, QSslCertificate serverCert);
explicit NvHTTP(NvAddress address, uint16_t httpsPort, QSslCertificate serverCert);
explicit NvHTTP(NvComputer* computer);
static
int
@@ -138,9 +143,16 @@ public:
void setServerCert(QSslCertificate serverCert);
void setAddress(QString address);
void setAddress(NvAddress address);
void setHttpsPort(uint16_t port);
QString address();
NvAddress address();
QSslCertificate serverCert();
uint16_t httpPort();
uint16_t httpsPort();
static
QVector<int>
@@ -150,14 +162,16 @@ public:
quitApp();
void
resumeApp(PSTREAM_CONFIGURATION streamConfig);
resumeApp(PSTREAM_CONFIGURATION streamConfig,
QString& rtspSessionUrl);
void
launchApp(int appId,
PSTREAM_CONFIGURATION streamConfig,
bool sops,
bool localAudio,
int gamepadMask);
int gamepadMask,
QString& rtspSessionUrl);
QVector<NvApp>
getAppList();
@@ -182,7 +196,7 @@ private:
int timeoutMs,
NvLogLevel logLevel);
QString m_Address;
NvAddress m_Address;
QNetworkAccessManager m_Nam;
QSslCertificate m_ServerCert;
};
+3 -7
View File
@@ -11,8 +11,8 @@
#define REQUEST_TIMEOUT_MS 5000
NvPairingManager::NvPairingManager(QString address) :
m_Http(address, QSslCertificate())
NvPairingManager::NvPairingManager(NvComputer* computer) :
m_Http(computer)
{
QByteArray cert = IdentityManager::get()->getCertificate();
BIO *bio = BIO_new_mem_buf(cert.data(), -1);
@@ -167,11 +167,7 @@ NvPairingManager::signMessage(const QByteArray& message)
EVP_MD_CTX *ctx = EVP_MD_CTX_create();
THROW_BAD_ALLOC_IF_NULL(ctx);
const EVP_MD *md = EVP_get_digestbyname("SHA256");
THROW_BAD_ALLOC_IF_NULL(md);
EVP_DigestInit_ex(ctx, md, NULL);
EVP_DigestSignInit(ctx, NULL, md, NULL, m_PrivateKey);
EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, m_PrivateKey);
EVP_DigestSignUpdate(ctx, reinterpret_cast<unsigned char*>(const_cast<char*>(message.data())), message.length());
size_t signatureLength = 0;
+1 -1
View File
@@ -17,7 +17,7 @@ public:
ALREADY_IN_PROGRESS
};
explicit NvPairingManager(QString address);
explicit NvPairingManager(NvComputer* computer);
~NvPairingManager();
+1 -1
View File
@@ -148,7 +148,7 @@ void SystemProperties::querySdlVideoInfoInternal()
}
}
Session::getDecoderInfo(testWindow, hasHardwareAcceleration, rendererAlwaysFullScreen, maximumResolution);
Session::getDecoderInfo(testWindow, hasHardwareAcceleration, rendererAlwaysFullScreen, supportsHdr, maximumResolution);
SDL_DestroyWindow(testWindow);
+2
View File
@@ -26,6 +26,7 @@ public:
Q_PROPERTY(int maximumStreamingFrameRate MEMBER maximumStreamingFrameRate CONSTANT)
Q_PROPERTY(QSize maximumResolution MEMBER maximumResolution CONSTANT)
Q_PROPERTY(QString versionString MEMBER versionString CONSTANT)
Q_PROPERTY(bool supportsHdr MEMBER supportsHdr CONSTANT)
Q_INVOKABLE void refreshDisplays();
Q_INVOKABLE QRect getDesktopResolution(int displayIndex);
@@ -54,5 +55,6 @@ private:
QList<QRect> monitorDesktopResolutions;
QList<QRect> monitorNativeResolutions;
QString versionString;
bool supportsHdr;
};
+6 -2
View File
@@ -312,6 +312,7 @@ void StreamCommandLineParser::parse(const QStringList &args, StreamingPreference
parser.addToggleOption("background-gamepad", "background gamepad input");
parser.addToggleOption("reverse-scroll-direction", "inverted scroll direction");
parser.addToggleOption("swap-gamepad-buttons", "swap A/B and X/Y gamepad buttons (Nintendo-style)");
parser.addToggleOption("keep-awake", "prevent display sleep while streaming");
parser.addChoiceOption("capture-system-keys", "capture system key combos", m_CaptureSysKeysModeMap.keys());
parser.addChoiceOption("video-codec", "video codec", m_VideoCodecMap.keys());
parser.addChoiceOption("video-decoder", "video decoder", m_VideoDecoderMap.keys());
@@ -350,8 +351,8 @@ void StreamCommandLineParser::parse(const QStringList &args, StreamingPreference
// Resolve --fps option
if (parser.isSet("fps")) {
preferences->fps = parser.getIntOption("fps");
if (!inRange(preferences->fps, 30, 120)) {
parser.showError("FPS must be in range: 30 - 120");
if (!inRange(preferences->fps, 30, 240)) {
parser.showError("FPS must be in range: 30 - 240");
}
}
@@ -423,6 +424,9 @@ void StreamCommandLineParser::parse(const QStringList &args, StreamingPreference
// Resolve --swap-gamepad-buttons and --no-swap-gamepad-buttons options
preferences->swapFaceButtons = parser.getToggleOptionValue("swap-gamepad-buttons", preferences->swapFaceButtons);
// Resolve --keep-awake and --no-keep-awake options
preferences->keepAwake = parser.getToggleOptionValue("keep-awake", preferences->keepAwake);
// Resolve --capture-system-keys option
if (parser.isSet("capture-system-keys")) {
preferences->captureSysKeysMode = mapValue(m_CaptureSysKeysModeMap, parser.getChoiceOptionValue("capture-system-keys"));
@@ -36,6 +36,85 @@
</screenshots>
<releases>
<release version="4.1.0" date="2022-05-23">
<description>
<p>New features:</p>
<ul>
<li>Overlays are now supported on the non-EGL X11 VAAPI renderer (requires RGBA subpicture support in the VAAPI driver)</li>
<li>Cursor lock can now be disabled when in full-screen mode</li>
</ul>
<p>Behavior Changes:</p>
<ul>
<li>Moonlight can now reduce the client display resolution in full-screen mode if the current display mode doesn't have a high enough refresh rate for the selected stream frame rate</li>
<li>When choosing a new client display resolution in full-screen mode, Moonlight will pick a display mode with the closest aspect ratio to the selected stream resolution</li>
<li>Moonlight now defaults to borderless windowed mode on Wayland systems</li>
</ul>
<p>Bugfixes:</p>
<ul>
<li>Fixed missing toolbar buttons in certain languages</li>
<li>Fixed some text on the settings page not updating when the language is changed</li>
<li>Fixed a frame pacing bug that could cause excessive frame drops</li>
<li>Fixed the "keep display awake" setting not being saved when Moonlight restarts</li>
<li>Fixed black screen after unmaximizing the Moonlight window on some Linux systems</li>
<li>Updated included gamepad mappings</li>
<li>Updated community-contributed translations from Weblate</li>
</ul>
</description>
</release>
<release version="4.0.0" date="2022-04-02">
<description>
<p>New features:</p>
<ul>
<li>Added a new key combo for locking the mouse cursor to the window (Ctrl+Alt+Shift+L)</li>
<li>Added an option to avoid keeping the client display awake while streaming</li>
</ul>
<p>Behavior Changes:</p>
<ul>
<li>HDR streaming is now a separate option rather than being part of the Video Codec override dropdown</li>
<li>HDR streaming is no longer restricted to apps that are certified by NVIDIA as compatible with GameStream HDR. Some newer games may require an HDR display or EDID emulator dongle connected to your host PC for HDR options to be available.</li>
</ul>
<p>Bugfixes:</p>
<ul>
<li>Fixed loss of all audio if the active audio device is unplugged while streaming</li>
<li>Fixed the GUI being unresponsive after manually quitting when connection to the host is lost</li>
<li>Fixed a rare crash if a controller disconnects right as rumble is starting</li>
<li>Fixed text rendering on the overlay UI when using SDL_ttf 2.0.18 on Linux</li>
<li>Updated included gamepad mappings</li>
<li>Updated community-contributed translations from Weblate</li>
</ul>
</description>
</release>
<release version="3.2.0" date="2022-01-18">
<description>
<p>New features:</p>
<ul>
<li>Reduced CPU usage while streaming</li>
<li>Non-ASCII characters are now supported when pasting clipboard data to the host</li>
<li>Added support for zero-copy NVDEC rendering for Nvidia Wayland systems</li>
<li>Significantly improved performance with asynchronous decoders like V4L2M2M on Linux</li>
<li>Added support for color compression planes on newer Intel systems when using VAAPI decoding</li>
<li>Added support for copy-back rendering in non-default pixel formats (like the Raspberry Pi SAND format)</li>
</ul>
<p>Bugfixes:</p>
<ul>
<li>Fixed unexpected GUI input after using the gamepad quit combo</li>
<li>Updated included gamepad mappings</li>
<li>Updated community-contributed translations from Weblate</li>
</ul>
</description>
</release>
<release version="3.1.4" date="2021-06-25">
<description>
<p>Changes:</p>
<ul>
<li>Added network latency statistics to the performance overlay</li>
<li>Improved audio quality on unreliable connections (requires GeForce Experience 3.19 or later)</li>
<li>Reduced video frame drops on unreliable connections (requires GeForce Experience 3.22 or later)</li>
<li>Updated community-contributed translations from Weblate</li>
</ul>
</description>
</release>
<release version="3.1.3" date="2021-05-07">
<description>
<p>Changes:</p>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 13 KiB

+2 -2
View File
@@ -1,5 +1,6 @@
import QtQuick 2.0
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
ToolButton {
property string iconSource
@@ -20,8 +21,7 @@ ToolButton {
// This determines the size of the Material highlight. We increase it
// from the default because we use larger than normal icons for TV readability.
background.width: (parent.height - parent.anchors.bottomMargin - parent.anchors.topMargin) * 0.60
background.height: (parent.height - parent.anchors.bottomMargin - parent.anchors.topMargin) * 0.60
Layout.preferredHeight: parent.height
Keys.onReturnPressed: {
clicked()
+205 -45
View File
@@ -11,6 +11,8 @@ Flickable {
id: settingsPage
objectName: qsTr("Settings")
signal languageChanged()
boundsBehavior: Flickable.OvershootBounds
contentWidth: settingsColumn1.width > settingsColumn2.width ? settingsColumn1.width : settingsColumn2.width
@@ -345,7 +347,7 @@ Flickable {
maximumLength: 5
inputMethodHints: Qt.ImhDigitsOnly
placeholderText: resolutionListModel.get(resolutionComboBox.currentIndex).video_width
validator: IntValidator{bottom:128; top:8192}
validator: IntValidator{bottom:256; top:8192}
focus: true
onTextChanged: {
@@ -374,7 +376,7 @@ Flickable {
maximumLength: 5
inputMethodHints: Qt.ImhDigitsOnly
placeholderText: resolutionListModel.get(resolutionComboBox.currentIndex).video_height
validator: IntValidator{bottom:128; top:8192}
validator: IntValidator{bottom:256; top:8192}
onTextChanged: {
// standardButton() was added in Qt 5.10, so we must check for it first
@@ -465,6 +467,7 @@ Flickable {
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
reinitialize()
languageChanged.connect(reinitialize)
}
id: fpsComboBox
@@ -531,28 +534,53 @@ Flickable {
}
AutoResizingComboBox {
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
function createModel() {
var model = Qt.createQmlObject('import QtQuick 2.0; ListModel {}', parent, '')
model.append({
text: qsTr("Fullscreen"),
val: StreamingPreferences.WM_FULLSCREEN
})
model.append({
text: qsTr("Borderless windowed"),
val: StreamingPreferences.WM_FULLSCREEN_DESKTOP
})
model.append({
text: qsTr("Windowed"),
val: StreamingPreferences.WM_WINDOWED
})
// Set the recommended option based on the OS
for (var i = 0; i < model.count; i++) {
var thisWm = model.get(i).val;
if (thisWm === StreamingPreferences.recommendedFullScreenMode) {
model.get(i).text += qsTr(" (Recommended)")
model.move(i, 0, 1)
break
}
}
return model
}
// This is used on initialization and upon retranslation
function reinitialize() {
if (!visible) {
// Do nothing if the control won't even be visible
return
}
// Set the recommended option based on the OS
for (var i = 0; i < windowModeListModel.count; i++) {
var thisWm = windowModeListModel.get(i).val;
if (thisWm === StreamingPreferences.recommendedFullScreenMode) {
windowModeListModel.get(i).text += qsTr(" (Recommended)")
windowModeListModel.move(i, 0, 1);
break
}
}
model = createModel()
currentIndex = 0
// Set the current value based on the saved preferences
var savedWm = StreamingPreferences.windowMode
for (var i = 0; i < windowModeListModel.count; i++) {
var thisWm = windowModeListModel.get(i).val;
for (var i = 0; i < model.count; i++) {
var thisWm = model.get(i).val;
if (savedWm === thisWm) {
currentIndex = i
break
@@ -562,28 +590,18 @@ Flickable {
activated(currentIndex)
}
Component.onCompleted: {
reinitialize()
languageChanged.connect(reinitialize)
}
id: windowModeComboBox
visible: SystemProperties.hasDesktopEnvironment
enabled: !SystemProperties.rendererAlwaysFullScreen
hoverEnabled: true
textRole: "text"
model: ListModel {
id: windowModeListModel
ListElement {
text: qsTr("Fullscreen")
val: StreamingPreferences.WM_FULLSCREEN
}
ListElement {
text: qsTr("Borderless windowed")
val: StreamingPreferences.WM_FULLSCREEN_DESKTOP
}
ListElement {
text: qsTr("Windowed")
val: StreamingPreferences.WM_WINDOWED
}
}
onActivated: {
StreamingPreferences.windowMode = windowModeListModel.get(currentIndex).val
StreamingPreferences.windowMode = model.get(currentIndex).val
}
ToolTip.delay: 1000
@@ -766,7 +784,7 @@ Flickable {
val: StreamingPreferences.LANG_AUTO
}
ListElement {
text: "Deutsch" //German
text: "Deutsch" // German
val: StreamingPreferences.LANG_DE
}
ListElement {
@@ -774,11 +792,11 @@ Flickable {
val: StreamingPreferences.LANG_EN
}
ListElement {
text: "Français" //French
text: "Français" // French
val: StreamingPreferences.LANG_FR
}
ListElement {
text: "简体中文" //Simplified Chinese
text: "简体中文" // Simplified Chinese
val: StreamingPreferences.LANG_ZH_CN
}
ListElement {
@@ -789,11 +807,78 @@ Flickable {
text: "русский" // Russian
val: StreamingPreferences.LANG_RU
}
// Don't list Spanish until it is more complete
/*ListElement {
ListElement {
text: "Español" // Spanish
val: StreamingPreferences.LANG_ES
}*/
}
ListElement {
text: "日本語" // Japanese
val: StreamingPreferences.LANG_JA
}
ListElement {
text: "Tiếng Việt" // Vietnamese
val: StreamingPreferences.LANG_VI
}
ListElement {
text: "ภาษาไทย" // Thai
val: StreamingPreferences.LANG_TH
}
ListElement {
text: "한국어" // Korean
val: StreamingPreferences.LANG_KO
}
/* ListElement {
text: "Magyar" // Hungarian
val: StreamingPreferences.LANG_HU
} */
ListElement {
text: "Nederlands" // Dutch
val: StreamingPreferences.LANG_NL
}
ListElement {
text: "Svenska" // Swedish
val: StreamingPreferences.LANG_SV
}
/* ListElement {
text: "Türkçe" // Turkish
val: StreamingPreferences.LANG_TR
} */
/* ListElement {
text: "Українська" // Ukrainian
val: StreamingPreferences.LANG_UK
} */
ListElement {
text: "繁体字" // Traditional Chinese
val: StreamingPreferences.LANG_ZH_HANT
}
ListElement {
text: "Português" // Portuguese
val: StreamingPreferences.LANG_PT
}
/* ListElement {
text: "Português do Brasil" // Brazilian Portuguese
val: StreamingPreferences.LANG_PT_BR
} */
ListElement {
text: "Ελληνικά" // Greek
val: StreamingPreferences.LANG_EL
}
ListElement {
text: "Italiano" // Italian
val: StreamingPreferences.LANG_IT
}
/* ListElement {
text: "हिन्दी, हिंदी" // Hindi
val: StreamingPreferences.LANG_HI
} */
ListElement {
text: "Język polski" // Polish
val: StreamingPreferences.LANG_PL
}
ListElement {
text: "Čeština" // Czech
val: StreamingPreferences.LANG_CS
}
}
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
@@ -808,6 +893,9 @@ Flickable {
// Force the back operation to pop any AppView pages that exist.
// The AppView stops working after retranslate() for some reason.
window.clearOnBack = true
// Signal other controls to adjust their text
languageChanged()
}
}
}
@@ -894,6 +982,22 @@ Flickable {
ToolTip.visible: hovered
ToolTip.text: qsTr("Updates your Discord status to display the name of the game you're streaming.")
}
CheckBox {
id: keepAwakeCheck
width: parent.width
text: qsTr("Keep the display awake while streaming")
font.pointSize: 12
checked: StreamingPreferences.keepAwake
onCheckedChanged: {
StreamingPreferences.keepAwake = checked
}
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered
ToolTip.text: qsTr("Prevents the screensaver from starting or the display from going to sleep while streaming.")
}
}
}
}
@@ -1213,6 +1317,7 @@ Flickable {
id: decoderComboBox
textRole: "text"
enabled: !enableHdr.checked
model: ListModel {
id: decoderListModel
ListElement {
@@ -1229,9 +1334,26 @@ Flickable {
}
}
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
StreamingPreferences.videoDecoderSelection = decoderListModel.get(currentIndex).val
onActivated: {
if (enabled) {
StreamingPreferences.videoDecoderSelection = decoderListModel.get(currentIndex).val
}
}
// This handles the state of the enableHdr checkbox changing
onEnabledChanged: {
if (enabled) {
StreamingPreferences.videoDecoderSelection = decoderListModel.get(currentIndex).val
}
else {
StreamingPreferences.videoDecoderSelection = StreamingPreferences.VDS_AUTO
}
}
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered && !enabled
ToolTip.text: qsTr("Enabling HDR overrides manual decoder selections.")
}
Label {
@@ -1246,7 +1368,11 @@ Flickable {
// ignore setting the index at first, and actually set it when the component is loaded
Component.onCompleted: {
var saved_vcc = StreamingPreferences.videoCodecConfig
// Default to Automatic (relevant if HDR is enabled,
// where we will match none of the codecs in the list)
currentIndex = 0
for(var i = 0; i < codecListModel.count; i++) {
var el_vcc = codecListModel.get(i).val;
if (saved_vcc === el_vcc) {
@@ -1254,11 +1380,13 @@ Flickable {
break
}
}
activated(currentIndex)
}
id: codecComboBox
textRole: "text"
enabled: !enableHdr.checked
model: ListModel {
id: codecListModel
ListElement {
@@ -1273,15 +1401,47 @@ Flickable {
text: qsTr("HEVC (H.265)")
val: StreamingPreferences.VCC_FORCE_HEVC
}
/*ListElement {
text: qsTr("HEVC HDR (Experimental)")
val: StreamingPreferences.VCC_FORCE_HEVC_HDR
}*/
}
// ::onActivated must be used, as it only listens for when the index is changed by a human
onActivated : {
StreamingPreferences.videoCodecConfig = codecListModel.get(currentIndex).val
if (enabled) {
StreamingPreferences.videoCodecConfig = codecListModel.get(currentIndex).val
}
}
// This handles the state of the enableHdr checkbox changing
onEnabledChanged: {
if (enabled) {
StreamingPreferences.videoCodecConfig = codecListModel.get(currentIndex).val
}
else {
StreamingPreferences.videoCodecConfig = StreamingPreferences.VCC_FORCE_HEVC_HDR
}
}
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered && !enabled
ToolTip.text: qsTr("Enabling HDR overrides manual codec selections.")
}
CheckBox {
id: enableHdr
width: parent.width
text: qsTr("Enable HDR (Experimental)")
font.pointSize: 12
enabled: SystemProperties.supportsHdr
checked: enabled && StreamingPreferences.videoCodecConfig == StreamingPreferences.VCC_FORCE_HEVC_HDR
// Updating StreamingPreferences.videoCodecConfig is handled above
ToolTip.delay: 1000
ToolTip.timeout: 5000
ToolTip.visible: hovered
ToolTip.text: enabled ?
qsTr("The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.")
:
qsTr("HDR streaming is not supported on this PC.")
}
CheckBox {
+4
View File
@@ -103,7 +103,10 @@ Item {
streamSegueErrorDialog.open()
}
}
}
function sessionReadyForDeletion()
{
// Garbage collect the Session object since it's pretty heavyweight
// and keeps other libraries (like SDL_TTF) around until it is deleted.
session = null
@@ -130,6 +133,7 @@ Item {
session.displayLaunchWarning.connect(displayLaunchWarning)
session.quitStarting.connect(quitStarting)
session.sessionFinished.connect(sessionFinished)
session.readyForDeletion.connect(sessionReadyForDeletion)
// Kick off the stream
spinnerTimer.start()
+20 -10
View File
@@ -181,10 +181,20 @@ ApplicationWindow {
}
}
function navigateTo(url, objectName)
// Workaround for lack of instanceof in Qt 5.9.
//
// Based on https://stackoverflow.com/questions/13923794/how-to-do-a-is-a-typeof-or-instanceof-in-qml
function qmltypeof(obj, className) { // QtObject, string -> bool
// className plus "(" is the class instance without modification
// className plus "_QML" is the class instance with user-defined properties
var str = obj.toString();
return str.startsWith(className + "(") || str.startsWith(className + "_QML");
}
function navigateTo(url, objectType)
{
var existingItem = stackView.find(function(item, index) {
return item.objectName === objectName
return qmltypeof(item, objectType)
})
if (existingItem !== null) {
@@ -215,7 +225,7 @@ ApplicationWindow {
}
RowLayout {
spacing: 20
spacing: 10
anchors.leftMargin: 10
anchors.rightMargin: 10
anchors.fill: parent
@@ -251,7 +261,7 @@ ApplicationWindow {
Label {
id: versionLabel
visible: stackView.currentItem.objectName === qsTr("Settings")
visible: qmltypeof(stackView.currentItem, "SettingsView")
text: qsTr("Version %1").arg(SystemProperties.versionString)
font.pointSize: 12
horizontalAlignment: Qt.AlignRight
@@ -261,7 +271,7 @@ ApplicationWindow {
NavigableToolButton {
id: discordButton
visible: SystemProperties.hasBrowser &&
stackView.currentItem.objectName === qsTr("Settings")
qmltypeof(stackView.currentItem, "SettingsView")
iconSource: "qrc:/res/Discord-Logo-White.svg"
@@ -280,7 +290,7 @@ ApplicationWindow {
NavigableToolButton {
id: addPcButton
visible: stackView.currentItem.objectName === qsTr("Computers")
visible: qmltypeof(stackView.currentItem, "PcView")
iconSource: "qrc:/res/ic_add_to_queue_white_48px.svg"
@@ -378,7 +388,7 @@ ApplicationWindow {
iconSource: "qrc:/res/ic_videogame_asset_white_48px.svg"
onClicked: navigateTo("qrc:/gui/GamepadMapper.qml", qsTr("Gamepad Mapping"))
onClicked: navigateTo("qrc:/gui/GamepadMapper.qml", "GamepadMapper")
Keys.onDownPressed: {
stackView.currentItem.forceActiveFocus(Qt.TabFocus)
@@ -390,7 +400,7 @@ ApplicationWindow {
iconSource: "qrc:/res/settings.svg"
onClicked: navigateTo("qrc:/gui/SettingsView.qml", qsTr("Settings"))
onClicked: navigateTo("qrc:/gui/SettingsView.qml", "SettingsView")
Keys.onDownPressed: {
stackView.currentItem.forceActiveFocus(Qt.TabFocus)
@@ -412,7 +422,7 @@ ApplicationWindow {
ErrorMessageDialog {
id: noHwDecoderDialog
text: qsTr("No functioning hardware accelerated H.264 video decoder was detected by Moonlight. " +
text: qsTr("No functioning hardware accelerated video decoder was detected by Moonlight. " +
"Your streaming performance may be severely degraded in this configuration.")
helpText: qsTr("Click the Help button for more information on solving this problem.")
helpUrl: "https://github.com/moonlight-stream/moonlight-docs/wiki/Fixing-Hardware-Decoding-Problems"
@@ -493,7 +503,7 @@ ApplicationWindow {
onAccepted: {
if (editText.text) {
ComputerManager.addNewHost(editText.text.trim(), false)
ComputerManager.addNewHostManually(editText.text.trim())
}
}
+14
View File
@@ -12,6 +12,7 @@
SdlGamepadKeyNavigation::SdlGamepadKeyNavigation()
: m_Enabled(false),
m_UiNavMode(false),
m_FirstPoll(false),
m_LastAxisNavigationEventTime(0)
{
m_PollingTimer = new QTimer(this);
@@ -62,6 +63,9 @@ void SdlGamepadKeyNavigation::enable()
}
}
// Flush events on the first poll
m_FirstPoll = true;
// Poll every 50 ms for a new joystick event
m_PollingTimer->start(50);
@@ -91,6 +95,16 @@ void SdlGamepadKeyNavigation::onPollingTimerFired()
SDL_Event event;
StreamingPreferences prefs;
// Discard any pending button events on the first poll to avoid picking up
// stale input data from the stream session (like the quit combo).
if (m_FirstPoll) {
SDL_PumpEvents();
SDL_FlushEvent(SDL_CONTROLLERBUTTONDOWN);
SDL_FlushEvent(SDL_CONTROLLERBUTTONUP);
m_FirstPoll = false;
}
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
+1
View File
@@ -34,5 +34,6 @@ private:
QList<SDL_GameController*> m_Gamepads;
bool m_Enabled;
bool m_UiNavMode;
bool m_FirstPoll;
Uint32 m_LastAxisNavigationEventTime;
};
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
+202 -155
View File
@@ -93,7 +93,7 @@
<context>
<name>NvHTTP</name>
<message>
<location filename="../backend/nvhttp.cpp" line="327"/>
<location filename="../backend/nvhttp.cpp" line="378"/>
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
<translation>Audioaufnahmegerät fehlt. Eine Neuinstallation von GeForece Experience sollte diesen Fehler beheben.</translation>
</message>
@@ -160,7 +160,7 @@
<message>
<location filename="../gui/PcView.qml" line="224"/>
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
<translation type="unfinished"></translation>
<translation>Diese Version von GeForce Experience wird auf %1 noch nicht von dieser Moonlight Version unterstützt. Du musst Moonlight aktualisieren, um von %1 zu streamen.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="247"/>
@@ -246,7 +246,7 @@
<context>
<name>PendingQuitTask</name>
<message>
<location filename="../backend/computermanager.cpp" line="542"/>
<location filename="../backend/computermanager.cpp" line="540"/>
<source>The running game wasn&apos;t started by this PC. You must quit the game on the host PC manually or use the device that originally started the game.</source>
<translation>Die laufende App wurde von einem anderem PC gestartet. Beende die App auf dem Host manuell oder vom PC welcher die App gestartet hat.</translation>
</message>
@@ -292,147 +292,160 @@
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="89"/>
<location filename="../streaming/session.cpp" line="91"/>
<source>No video received from host.</source>
<translation>Kein Video vom Host empfangen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="90"/>
<location filename="../streaming/session.cpp" line="92"/>
<source>Check your firewall and port forwarding rules for port(s): %1</source>
<translation>Prüfe die Host Firewall und Portweiterleitungsregeln für die Ports: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="95"/>
<location filename="../streaming/session.cpp" line="97"/>
<source>Your network connection isn&apos;t performing well. Reduce your video bitrate setting or try a faster connection.</source>
<translation>Deine Netzwerkverbindung ist nicht gut genug. Reduziere die Video Bitrate oder wechsel zu einer schnelleren Vebrindung.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="100"/>
<location filename="../streaming/session.cpp" line="102"/>
<source>Something went wrong on your host PC when starting the stream.</source>
<translation>Auf deinem Host ist etwas beim Starten vom Stream schiefgelaufen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="101"/>
<location filename="../streaming/session.cpp" line="103"/>
<source>Make sure you don&apos;t have any DRM-protected content open on your host PC. You can also try restarting your host PC.</source>
<translation>Stelle sicher, dass du keine DRM-geschützen Inhalte auf deinem Host geöffnet hast. Du kannst auch einen Neustart des Hosts probieren.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="102"/>
<location filename="../streaming/session.cpp" line="104"/>
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
<translation>Wenn das Problem bestehen bleibt, versuche es mit einer Neuinstallation des Grafikkartentreibers und GeFore Experience.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="107"/>
<location filename="../streaming/session.cpp" line="109"/>
<source>Connection terminated</source>
<translation>Verbindung getrennt</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="592"/>
<location filename="../streaming/session.cpp" line="661"/>
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
<translation type="unfinished"></translation>
<translation>Diese Version von GeForce Experience auf %1 wird von diesem Build von Moonlight nicht unterstützt. Du musst Moonlight aktualisieren, um von %1 zu streamen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="597"/>
<location filename="../streaming/session.cpp" line="666"/>
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
<translation>Die Auswahl des Remote Desktop Maus Modus kann in Spielen zu Problemen führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="602"/>
<location filename="../streaming/session.cpp" line="671"/>
<source>HDR is not supported with software decoding.</source>
<translation>HDR wird nicht von Software Dekodierung unterstützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="606"/>
<location filename="../streaming/session.cpp" line="675"/>
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
<translation>Software Dekodierung kann zu schlecher streaming Leitung führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="611"/>
<location filename="../streaming/session.cpp" line="680"/>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>Nicht unterstützte FPS Optionen können stottern verursachen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="614"/>
<location filename="../streaming/session.cpp" line="683"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>V-Sync wird deaktiviert wenn mit einer höheren Framerate als der des Display gestreamt wird.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="631"/>
<location filename="../streaming/session.cpp" line="710"/>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>Da deine Grafikkarte kein HEVC Decodierung unterstützt wird Software Dekodierung benutzt. Die kann zu einer schlechten streaming Leistung führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="634"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>Die Grafikkarte deines PC&apos;s unterstützt keine HEVC Dekodierung.</translation>
<translation type="vanished">Die Grafikkarte deines PC&apos;s unterstützt keine HEVC Dekodierung.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="641"/>
<location filename="../streaming/session.cpp" line="693"/>
<source>Your host PC GPU doesn&apos;t support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
<translation>Die Grafikkarte deines Host&apos;s unterstützt kein HEVC. Es wird mindestens eine GeForce GTX 900-Series (Maxwell) oder neuer benötigt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="658"/>
<source>%1 doesn&apos;t support HDR10.</source>
<translation>%1 unterstützt kein HDR10.</translation>
<location filename="../streaming/session.cpp" line="724"/>
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
<translation>Verwendung der Software-Decodierung aufgrund deiner Auswahl, H.264 ohne GPU-Unterstützung zu erzwingen. Dies kann zu einer schlechten Streaming-Leistung führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="662"/>
<location filename="../streaming/session.cpp" line="734"/>
<source>Your host PC and client PC don&apos;t support the same video codecs. This may cause poor streaming performance.</source>
<translation>Dein Host-PC und dein Client-PC unterstützen nicht die gleichen Videocodecs. Dies kann zu einer schlechten Streaming-Leistung führen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<source>Your client GPU doesn&apos;t support H.264 decoding. This may cause poor streaming performance.</source>
<translation>Deine Client-GPU unterstützt die H.264-Dekodierung nicht. Dies kann zu einer schlechten Streaming-Leistung führen.</translation>
</message>
<message>
<source>%1 doesn&apos;t support HDR10.</source>
<translation type="vanished">%1 unterstützt kein HDR10.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="748"/>
<source>Your host PC GPU doesn&apos;t support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
<translation>Die Grafikkarte deines Host&apos;s unterstützt kein HDR. Es wird mindestens eine GeForce GTX 1000-Series (Pascal) oder neuer benötigt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="671"/>
<location filename="../streaming/session.cpp" line="757"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC Main10 decoding for HDR streaming.</source>
<translation>Die Grafikkarte deines PC&apos;s unterstützt keine HEVC Main10 Dekodierung für HDR streaming.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="684"/>
<location filename="../streaming/session.cpp" line="770"/>
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
<translation>Für 4K Streaming wird mindestens GeForce Experience 3.0 benötigt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="699"/>
<location filename="../streaming/session.cpp" line="785"/>
<source>Your selected surround sound setting is not supported by the current audio device.</source>
<translation>Deine ausgewählte Surround Sound Einstellung wird von dem momentanen Audiogerät nicht untertützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="706"/>
<location filename="../streaming/session.cpp" line="792"/>
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
<translation>Zugriff auf das Audiogerät fehlgeschlagen. Es wird kein Ton für diese Session verfügbar sein.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="711"/>
<location filename="../streaming/session.cpp" line="797"/>
<source>An attached gamepad has no mapping and won&apos;t be usable. Visit the Moonlight help to resolve this.</source>
<translation>Ein angeschlossener Controller hat keine Tastenbelegung und ist somit nicht nutzbar. Besuche die Moonlight Hilfe um dies zu lösen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="719"/>
<location filename="../streaming/session.cpp" line="805"/>
<source>Your host PC&apos;s GPU doesn&apos;t support streaming video resolutions over 4K.</source>
<translation>Die Grafikkarte deines Host&apos;s unterstüzt keine Videoauflösung über 4K zum Streamen.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="723"/>
<location filename="../streaming/session.cpp" line="809"/>
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
<translation>Videoauflösungen über 4K sind nur mit dem HEVC Codec Verfügbar.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<location filename="../streaming/session.cpp" line="823"/>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>Erzwungene Hardware Dekodierung kann nicht ausgewählt werden, da der PC keine Hardware Decodierung unterstützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="740"/>
<location filename="../streaming/session.cpp" line="826"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>Erzwungene Hardware Dekodierung ist nicht mit deinem ausgewähltem Codec kompatibel, da die Grafikkarte deines PC&apos;s den ausgewählen Codec nicht unterstützt.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1041"/>
<location filename="../streaming/session.cpp" line="1165"/>
<source>GeForce Experience returned error: %1</source>
<translation>GeForce Experience hat einen Fehler gemeldet: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1519"/>
<location filename="../streaming/session.cpp" line="1714"/>
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
<translation>Video Decoder konnte nicht initialisiert werden. Bitte prüfe deine Streaming Einstellungen und versuche es erneut.</translation>
</message>
@@ -445,60 +458,60 @@
<translation>Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="70"/>
<location filename="../gui/SettingsView.qml" line="72"/>
<source>Resolution and FPS</source>
<translation>Auflösung und FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="78"/>
<location filename="../gui/SettingsView.qml" line="80"/>
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
<translation>Zu hohe Werte für deinen PC oder dein Netzwerk können Lags oder Fehler verursachen.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="60"/>
<location filename="../gui/SettingsView.qml" line="62"/>
<source>Basic Settings</source>
<translation>Basis Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="209"/>
<location filename="../gui/SettingsView.qml" line="211"/>
<source>720p</source>
<translation>720p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="215"/>
<location filename="../gui/SettingsView.qml" line="217"/>
<source>1080p</source>
<translation>1080p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="221"/>
<location filename="../gui/SettingsView.qml" line="223"/>
<source>1440p</source>
<translation>1440p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="227"/>
<location filename="../gui/SettingsView.qml" line="229"/>
<source>4K</source>
<translation>4K</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="331"/>
<location filename="../gui/SettingsView.qml" line="333"/>
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
<translation>Benutzerdefinierte Auflösungen sind offiziell nicht von GeForce Experience unterstützt, daher wird es deine Host Auflösung nicht setzen. Du musst es manuell während des Streams setzen.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="332"/>
<location filename="../gui/SettingsView.qml" line="334"/>
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
<translation>Auflösung die nicht von deinem Host oder Client unterstützt sind, können zu Fehlern beim Streamen führen.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="338"/>
<location filename="../gui/SettingsView.qml" line="340"/>
<source>Enter a custom resolution:</source>
<translation>Benutzerdefinierte Auflösung:</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="406"/>
<location filename="../gui/SettingsView.qml" line="407"/>
<location filename="../gui/SettingsView.qml" line="427"/>
<location filename="../gui/SettingsView.qml" line="430"/>
<location filename="../gui/SettingsView.qml" line="408"/>
<location filename="../gui/SettingsView.qml" line="409"/>
<location filename="../gui/SettingsView.qml" line="429"/>
<location filename="../gui/SettingsView.qml" line="432"/>
<source>%1 FPS</source>
<translation>%1 FPS</translation>
</message>
@@ -507,167 +520,192 @@
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="493"/>
<location filename="../gui/SettingsView.qml" line="496"/>
<source>Video bitrate:</source>
<translation>Video Bitrate:</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="501"/>
<location filename="../gui/SettingsView.qml" line="504"/>
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
<translation>Verringere die Bitrate bei einer langsamen Verbindung, Erhöhe sie für eine bessere Videoqualität.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="519"/>
<location filename="../gui/SettingsView.qml" line="522"/>
<source>Video bitrate: %1 Mbps</source>
<translation>Video Bitrate: %1 Mbps</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="527"/>
<location filename="../gui/SettingsView.qml" line="530"/>
<source>Display mode</source>
<translation>Anzeigemodus</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="545"/>
<location filename="../gui/SettingsView.qml" line="560"/>
<source> (Recommended)</source>
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
<translation> (empfohlen)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="573"/>
<location filename="../gui/SettingsView.qml" line="860"/>
<location filename="../gui/SettingsView.qml" line="541"/>
<location filename="../gui/SettingsView.qml" line="948"/>
<source>Fullscreen</source>
<translation>Vollbild</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="592"/>
<location filename="../gui/SettingsView.qml" line="610"/>
<source>Fullscreen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.</source>
<translation>Während der Vollbildmodus die beste Performence bietet, funktionieren im rahmenlosem Fenstermodus Funktionen wie MacOS Spaces, Alt+Tab, Bildschirmfoto-Programme oder On-Screen Overlays, etc., besser.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="577"/>
<location filename="../gui/SettingsView.qml" line="546"/>
<source>Borderless windowed</source>
<translation>Rahmenloses Fenster</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="412"/>
<location filename="../gui/SettingsView.qml" line="415"/>
<location filename="../gui/SettingsView.qml" line="424"/>
<location filename="../gui/SettingsView.qml" line="437"/>
<location filename="../gui/SettingsView.qml" line="440"/>
<location filename="../gui/SettingsView.qml" line="414"/>
<location filename="../gui/SettingsView.qml" line="417"/>
<location filename="../gui/SettingsView.qml" line="426"/>
<location filename="../gui/SettingsView.qml" line="439"/>
<location filename="../gui/SettingsView.qml" line="442"/>
<source>%1 FPS (Unsupported)</source>
<translation>%1 FPS (nicht unterstützt)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="581"/>
<location filename="../gui/SettingsView.qml" line="852"/>
<location filename="../gui/SettingsView.qml" line="551"/>
<location filename="../gui/SettingsView.qml" line="940"/>
<source>Windowed</source>
<translation>Fenster</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="599"/>
<location filename="../gui/SettingsView.qml" line="617"/>
<source>V-Sync</source>
<translation>V-Sync</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="609"/>
<location filename="../gui/SettingsView.qml" line="627"/>
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
<translation>Die Deaktivierung von V-Sync ermöglicht eine Sub-Frame-Rendering-Latenz, aber es kann zu sichtbarem Verzerrungen (Tearing) kommen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="616"/>
<location filename="../gui/SettingsView.qml" line="634"/>
<source>Frame pacing</source>
<translation>Frame Pacing</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="626"/>
<location filename="../gui/SettingsView.qml" line="644"/>
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
<translation>Frame-Pacing reduziert Mikrostottern durch Verzögerung von zu früh eintreffenden Frames</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="636"/>
<location filename="../gui/SettingsView.qml" line="654"/>
<source>Audio Settings</source>
<translation>Audio Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="671"/>
<location filename="../gui/SettingsView.qml" line="689"/>
<source>Stereo</source>
<translation>Stereo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="675"/>
<location filename="../gui/SettingsView.qml" line="693"/>
<source>5.1 surround sound</source>
<translation>5.1 Surround Sound</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="679"/>
<location filename="../gui/SettingsView.qml" line="697"/>
<source>7.1 surround sound</source>
<translation>7.1 Surround Sound</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="693"/>
<location filename="../gui/SettingsView.qml" line="711"/>
<source>Mute host PC speakers while streaming</source>
<translation>Schalte die Host Lautsprecher während des streamens stumm</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="703"/>
<location filename="../gui/SettingsView.qml" line="721"/>
<source>You must restart any game currently in progress for this setting to take effect</source>
<translation>Du musst die laufende App neustarten, damit diese Einstellung aktiv wird</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="709"/>
<location filename="../gui/SettingsView.qml" line="727"/>
<source>Mute audio stream when Moonlight is not the active window</source>
<translation>Schalte den Stream stumm wenn das Moonlight Fenster nicht aktiv ist</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="720"/>
<location filename="../gui/SettingsView.qml" line="738"/>
<source>Mutes Moonlight&apos;s audio when you Alt+Tab out of the stream or click on a different window.</source>
<translation>Schaltet den Stream stumm wenn du mit Alt-Tab oder Klick ein anderes Fenster in den Vordergrund holst.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="729"/>
<location filename="../gui/SettingsView.qml" line="747"/>
<source>UI Settings</source>
<translation>Oberflächen Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="739"/>
<location filename="../gui/SettingsView.qml" line="757"/>
<source>Language</source>
<translation>Sprache</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="765"/>
<location filename="../gui/SettingsView.qml" line="783"/>
<source>Automatic</source>
<translation>Automatisch</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="805"/>
<location filename="../gui/SettingsView.qml" line="890"/>
<source>You must restart Moonlight for this change to take effect</source>
<translation>Du musst Moonlight neustarten, damit diese Einstellung aktiv wird</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="819"/>
<location filename="../gui/SettingsView.qml" line="907"/>
<source>GUI display mode</source>
<translation>Anzeigemodus der Oberfläche</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="856"/>
<location filename="../gui/SettingsView.qml" line="944"/>
<source>Maximized</source>
<translation>Maximiert</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="913"/>
<location filename="../gui/SettingsView.qml" line="1017"/>
<source>Input Settings</source>
<translation>Eingabe Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="934"/>
<location filename="../gui/SettingsView.qml" line="1038"/>
<source>This enables seamless mouse control without capturing the client&apos;s mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
<translation>Dies ermöglicht eine nahtlose Maussteuerung, ohne den Mauszeiger des PCs zu erfassen. Es ist ideal für die Remote-Desktop-Nutzung, funktioniert aber bei den meisten Spielen nicht.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="936"/>
<location filename="../gui/SettingsView.qml" line="1040"/>
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
<translation>HINWEIS: Aufgrund eines Fehlers in GeForce Experience funktioniert diese Option möglicherweise nicht richtig, wenn Ihr Host mehrere Monitore hat.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1356"/>
<source>Enabling HDR overrides manual decoder selections.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1425"/>
<source>Enabling HDR overrides manual codec selections.</source>
<translation>Das Aktivieren von HDR überschriebt die manuelle Codec Auswahl.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1431"/>
<source>Enable HDR (Experimental)</source>
<translation>HDR aktivieren (Experimentell)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1442"/>
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
<translation>Der Stream wird HDR unterstützen, aber einige Spiele erfordern einen angeschlossenen HDR Monitor am Host-PC, um den HDR Modus zu aktiveren.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1444"/>
<source>HDR streaming is not supported on this PC.</source>
<translation>HDR Streaming ist an diesem Client-PC nicht unterstützt.</translation>
</message>
<message>
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
@@ -677,198 +715,208 @@
<translation type="vanished">Dies ermöglicht die Erfassung von systemweiten Tastenkombinationen wie Alt+Tab, die normalerweise vom Client beim Streamen im Vollbildmodus ausgeführt werden würden.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="955"/>
<location filename="../gui/SettingsView.qml" line="1059"/>
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
<translation>HINWEIS: Bestimmte Tastenkombinationen wie Strg+Alt+Entf unter Windows können von keiner Anwendung abgefangen werden, auch nicht von Moonlight.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1018"/>
<location filename="../gui/SettingsView.qml" line="1122"/>
<source>Use touchscreen as a virtual trackpad</source>
<translation>Touchscreen als virtuelles Trackpad verwenden</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1035"/>
<location filename="../gui/SettingsView.qml" line="1139"/>
<source>Swap left and right mouse buttons</source>
<translation>Linke und rechte Maustaste vertauschen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1047"/>
<location filename="../gui/SettingsView.qml" line="1151"/>
<source>Reverse mouse scrolling direction</source>
<translation>Scrollrichtung umkehren</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1061"/>
<location filename="../gui/SettingsView.qml" line="1165"/>
<source>Gamepad Settings</source>
<translation>Controller Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1071"/>
<location filename="../gui/SettingsView.qml" line="1175"/>
<source>Swap A/B and X/Y gamepad buttons</source>
<translation>Tausche A/B und X/Y Controller Tasten</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1089"/>
<location filename="../gui/SettingsView.qml" line="1193"/>
<source>This switches gamepads into a Nintendo-style button layout</source>
<translation>Dies ändert das Controller Tastenlayout in ein Nintento Controller Style Layout</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1095"/>
<location filename="../gui/SettingsView.qml" line="1199"/>
<source>Force gamepad #1 always connected</source>
<translation>Erzwinge das Controller #1 immer verbunden ist</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1105"/>
<location filename="../gui/SettingsView.qml" line="1209"/>
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
<translation>Erzwingt, dass ein Controller immer mit dem Host verbunden bleibt, auch wenn keine Gamepads an diesen PC angeschlossen sind.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="935"/>
<location filename="../gui/SettingsView.qml" line="1039"/>
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
<translation>Du kannst dies während des Streamens umstellen mit Strg+Alt+Shift+M.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1113"/>
<location filename="../gui/SettingsView.qml" line="1217"/>
<source>Enable mouse control with gamepads by holding the &apos;Start&apos; button</source>
<translation>Aktivieren Sie die Maussteuerung mit Controllern, indem Sie die &apos;Start&apos;-Taste gedrückt halten</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1124"/>
<location filename="../gui/SettingsView.qml" line="1228"/>
<source>Process gamepad input when Moonlight is in the background</source>
<translation>Controller-Eingaben ausführen auch wenn Moonlight im Hintergrund ist</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1135"/>
<location filename="../gui/SettingsView.qml" line="1239"/>
<source>Allows Moonlight to capture gamepad inputs even if it&apos;s not the current window in focus</source>
<translation>Erlaubt es Moonlight Controller-Eingaben an den Stream zu schicken auch wenn es nicht das aktive Fenster ist</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1144"/>
<location filename="../gui/SettingsView.qml" line="1248"/>
<source>Host Settings</source>
<translation>Host Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1184"/>
<location filename="../gui/SettingsView.qml" line="1288"/>
<source>Advanced Settings</source>
<translation>Erweiterte Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="646"/>
<location filename="../gui/SettingsView.qml" line="664"/>
<source>Audio configuration</source>
<translation>Audio Einstellungen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="873"/>
<location filename="../gui/SettingsView.qml" line="961"/>
<source>Show connection quality warnings</source>
<translation>Warnung bei Verbindungsproblemen anzeigen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="885"/>
<location filename="../gui/SettingsView.qml" line="973"/>
<source>Discord Rich Presence integration</source>
<translation>Integration von Discord Rich Presence</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="895"/>
<location filename="../gui/SettingsView.qml" line="983"/>
<source>Updates your Discord status to display the name of the game you&apos;re streaming.</source>
<translation>Aktualisiert deinen Discord Status um den Namen der aktuellen App anzuzeigen, wenn du streamst.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1106"/>
<location filename="../gui/SettingsView.qml" line="1210"/>
<source>Only enable this option when streaming a game that doesn&apos;t support gamepads being connected after startup.</source>
<translation>Aktiviere diese Option nur wenn du ein Spiel streamst, dass die Verbindung von Controllern nach dem Start nicht unterstützt.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="924"/>
<location filename="../gui/SettingsView.qml" line="1028"/>
<source>Optimize mouse for remote desktop instead of games</source>
<translation>Optimiere die Maus für Remote Desktop statt für Apps</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="946"/>
<location filename="../gui/SettingsView.qml" line="989"/>
<source>Keep the display awake while streaming</source>
<translation>Verhindere den Bildschirmschoner während des Streamens</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="999"/>
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
<translation>Verhindern, dass der Bildschirmschoner gestartet wird oder der Monitor in den Standby-Modus wechselt, während ein Stream aktiv ist.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1050"/>
<source>Capture system keyboard shortcuts</source>
<translation>Erfasse Systemtastatur Shortcuts</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="954"/>
<location filename="../gui/SettingsView.qml" line="1058"/>
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
<translation>Dies aktiviert das Erfassen von Systemweiten Tastatur Shortcuts wie Alt+Tab, welche nomalerweise auf dem Client ausgeführt werden würden.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="984"/>
<location filename="../gui/SettingsView.qml" line="1088"/>
<source>in fullscreen</source>
<translation>im Vollbildmodus</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="988"/>
<location filename="../gui/SettingsView.qml" line="1092"/>
<source>always</source>
<translation>immer</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1028"/>
<location filename="../gui/SettingsView.qml" line="1132"/>
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
<translation>Wenn aktiviert, verhält sich der Touchscreen wie ein Trackpad. Wenn deaktiviert, steuert der Touchscreen direkt den Mauszeiger.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1154"/>
<location filename="../gui/SettingsView.qml" line="1258"/>
<source>Optimize game settings for streaming</source>
<translation>Optimiere die Spieleinstellungen für das Streamen</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1165"/>
<location filename="../gui/SettingsView.qml" line="1269"/>
<source>Quit app on host PC after ending stream</source>
<translation>Schließe die App auf dem Host nach dem beenden des Streams</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1175"/>
<location filename="../gui/SettingsView.qml" line="1279"/>
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
<translation>Dadurch wird die App, dass du streamst, geschlossen, wenn du deinen Stream beendest. Du verlierst dabei alle ungespeicherten Fortschritte!</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1194"/>
<location filename="../gui/SettingsView.qml" line="1298"/>
<source>Video decoder</source>
<translation>Video Decoder</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1219"/>
<location filename="../gui/SettingsView.qml" line="1265"/>
<location filename="../gui/SettingsView.qml" line="1324"/>
<location filename="../gui/SettingsView.qml" line="1393"/>
<source>Automatic (Recommended)</source>
<translation>Automatisch (empfohlen)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1223"/>
<location filename="../gui/SettingsView.qml" line="1328"/>
<source>Force software decoding</source>
<translation>Erwzinge Software decoding</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1227"/>
<location filename="../gui/SettingsView.qml" line="1332"/>
<source>Force hardware decoding</source>
<translation>Erzwinge Hardware decoding</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1240"/>
<location filename="../gui/SettingsView.qml" line="1362"/>
<source>Video codec</source>
<translation>Video Codec</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1269"/>
<location filename="../gui/SettingsView.qml" line="1397"/>
<source>H.264</source>
<translation>H.264</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1273"/>
<location filename="../gui/SettingsView.qml" line="1401"/>
<source>HEVC (H.265)</source>
<translation>HEVC (H.265)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1290"/>
<location filename="../gui/SettingsView.qml" line="1450"/>
<source>Unlock unsupported FPS options</source>
<translation>Zeige nicht unterstützte FPS Optionen an</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1309"/>
<location filename="../gui/SettingsView.qml" line="1469"/>
<source>Automatically find PCs on the local network (Recommended)</source>
<translation>Suche automatisch nach Hosts im lokalen Netzwerk (empfohlen)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1334"/>
<location filename="../gui/SettingsView.qml" line="1494"/>
<source>Automatically detect blocked connections (Recommended)</source>
<translation>Erkenne automatisch geblockte Verbindungen (empfohlen)</translation>
</message>
@@ -902,22 +950,22 @@
<translation>Die Internetverbindung blockiert Moonlight. Streamen übers Internet könnte in diesem Netzwerk nicht funktionieren.</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Tip:</source>
<translation>Tipp:</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Press %1 to disconnect your session</source>
<translation>Drücke %1 um die Session zu trennen</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Start+Select+L1+R1</source>
<translation>Start+Select+L1+R1</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Ctrl+Alt+Shift+Q</source>
<translation>Strg+Alt+Shift+Q</translation>
</message>
@@ -925,95 +973,94 @@
<context>
<name>main</name>
<message>
<location filename="../gui/main.qml" line="254"/>
<location filename="../gui/main.qml" line="264"/>
<location filename="../gui/main.qml" line="393"/>
<location filename="../gui/main.qml" line="408"/>
<location filename="../gui/main.qml" line="418"/>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
<location filename="../gui/main.qml" line="255"/>
<location filename="../gui/main.qml" line="265"/>
<source>Version %1</source>
<translation>Version %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="271"/>
<location filename="../gui/main.qml" line="281"/>
<source>Join our community on Discord</source>
<translation>Tritt unserer Community auf Discord bei</translation>
</message>
<message>
<location filename="../gui/main.qml" line="283"/>
<source>Computers</source>
<translation>Hosts</translation>
<translation type="vanished">Hosts</translation>
</message>
<message>
<location filename="../gui/main.qml" line="290"/>
<location filename="../gui/main.qml" line="300"/>
<source>Add PC manually</source>
<translation>Host hinzufügen</translation>
</message>
<message>
<location filename="../gui/main.qml" line="330"/>
<location filename="../gui/main.qml" line="340"/>
<source>Update available for Moonlight: Version %1</source>
<translation>Es gibt eine neue Version für Moonlight: Version %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="377"/>
<location filename="../gui/main.qml" line="387"/>
<source>Gamepad Mapper</source>
<translation>Controller Tastenbelegung</translation>
</message>
<message>
<location filename="../gui/main.qml" line="381"/>
<source>Gamepad Mapping</source>
<translation>Controllertasten belegen</translation>
<translation type="vanished">Controllertasten belegen</translation>
</message>
<message>
<location filename="../gui/main.qml" line="415"/>
<source>No functioning hardware accelerated H.264 video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation>Moonlight hat keinen funktionierenden hardwarebeschleunigten H.264-Videodecoder erkannt. Deine Streaming-Performance kann in dieser Konfiguration stark beeinträchtigt sein.</translation>
<translation type="vanished">Moonlight hat keinen funktionierenden hardwarebeschleunigten H.264-Videodecoder erkannt. Deine Streaming-Performance kann in dieser Konfiguration stark beeinträchtigt sein.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="423"/>
<location filename="../gui/main.qml" line="433"/>
<source>Hardware acceleration doesn&apos;t work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
<translation>Die Hardwarebeschleunigung funktioniert nicht auf XWayland. Wenn du mit XWayland weitermachst, kann das zu schlechter Streaming-Leistung führen. Versuche mit QT_QPA_PLATFORM=wayland zu laufen oder wechsle zu X11.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="432"/>
<location filename="../gui/main.qml" line="442"/>
<source>This version of Moonlight isn&apos;t optimized for your PC. Please download the &apos;%1&apos; version of Moonlight for the best streaming performance.</source>
<translation>Diese Version von Moonlight ist nicht für deinen PC optimiert. Bitte lade die Version &apos;%1&apos; von Moonlight herunter, um die beste Streaming-Performance zu erhalten.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="441"/>
<location filename="../gui/main.qml" line="451"/>
<source>Moonlight detected gamepads without a mapping:</source>
<translation>Moonlight hat Controller ohne Tastenbelegung erkannt:</translation>
</message>
<message>
<location filename="../gui/main.qml" line="354"/>
<location filename="../gui/main.qml" line="364"/>
<source>Help</source>
<translation>Hilfe</translation>
</message>
<message>
<location filename="../gui/main.qml" line="417"/>
<location filename="../gui/main.qml" line="425"/>
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation>Moonlight hat keinen funktionierenden hardwarebeschleunigten Videodecoder erkannt. Deine Streaming-Leistung kann in dieser Konfiguration stark beeinträchtigt sein.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="427"/>
<source>Click the Help button for more information on solving this problem.</source>
<translation>Klicke auf Hilfe, um weitere Informationen zur Lösung dieses Problems zu erhalten.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="425"/>
<location filename="../gui/main.qml" line="435"/>
<source>Click the Help button for more information.</source>
<translation>Klicke auf Hilfe für mehr Informationen.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="443"/>
<location filename="../gui/main.qml" line="453"/>
<source>Click the Help button for information on how to map your gamepads.</source>
<translation>Klicke auf Hilfe, um zu erfahren wie du deinen Controller Tastenbelegung änderst.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="451"/>
<location filename="../gui/main.qml" line="461"/>
<source>Are you sure you want to quit?</source>
<translation>Bist du sicher, dass du aufhören willst?</translation>
</message>
<message>
<location filename="../gui/main.qml" line="481"/>
<location filename="../gui/main.qml" line="491"/>
<source>Enter the IP address of your GameStream PC:</source>
<translation>Gib die IP-Adresse deines GameStream Hosts ein:</translation>
</message>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
+465 -414
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.
+227 -176
View File
@@ -87,13 +87,13 @@
<message>
<location filename="../gui/GamepadMapper.qml" line="4"/>
<source>Gamepad Mapping</source>
<translation>Configuration du contrôleur</translation>
<translation>Configuration de la manette</translation>
</message>
</context>
<context>
<name>NvHTTP</name>
<message>
<location filename="../backend/nvhttp.cpp" line="327"/>
<location filename="../backend/nvhttp.cpp" line="378"/>
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
<translation>Dispositif de capture audio manquant. La réinstallation de GeForce Experience devrait résoudre cette erreur.</translation>
</message>
@@ -145,7 +145,7 @@
<message>
<location filename="../gui/PcView.qml" line="193"/>
<source>Test Network</source>
<translation>Test Réseau</translation>
<translation>Test réseau</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="202"/>
@@ -200,7 +200,7 @@
<message>
<location filename="../gui/PcView.qml" line="345"/>
<source>Your PC&apos;s current network connection seems to be blocking Moonlight. Streaming over the Internet may not work while connected to this network.</source>
<translation>La connexion réseau actuelle de votre PC semble bloquer le Moonlight. Il se peut que la diffusion en continu sur Internet ne fonctionne pas lorsque vous êtes connecté à ce réseau.</translation>
<translation>La connexion réseau actuelle de votre PC semble bloquer Moonlight. Il se peut que le stream depuis Internet ne fonctionne pas lorsque vous êtes connecté à ce réseau.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="345"/>
@@ -225,12 +225,12 @@
<message>
<location filename="../gui/PcView.qml" line="171"/>
<source>Online</source>
<translation></translation>
<translation>En ligne</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="171"/>
<source>Offline</source>
<translation></translation>
<translation>Hors ligne</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="177"/>
@@ -246,9 +246,9 @@
<context>
<name>PendingQuitTask</name>
<message>
<location filename="../backend/computermanager.cpp" line="542"/>
<location filename="../backend/computermanager.cpp" line="540"/>
<source>The running game wasn&apos;t started by this PC. You must quit the game on the host PC manually or use the device that originally started the game.</source>
<translation>Le jeu en cours d’exécution n&apos;a pas été démarré par ce PC. Vous devez fermer le jeu sur le PC hôte manuellement ou utiliser l&apos;appareil qui a démarré le jeu à l&apos;origine.</translation>
<translation>Le jeu en cours d’exécution n&apos;a pas été démarré par ce PC. Vous devez le fermer manuellement sur le PC hôte ou le fermer depuis l&apos;appareil qui a démarré ce jeu.</translation>
</message>
</context>
<context>
@@ -257,7 +257,7 @@
<location filename="../cli/quitstream.cpp" line="76"/>
<location filename="../cli/startstream.cpp" line="133"/>
<source>Failed to connect to %1</source>
<translation>N&apos;a pas pu se connecter à %1</translation>
<translation>La connexion à %1 a échoué</translation>
</message>
<message>
<location filename="../cli/quitstream.cpp" line="88"/>
@@ -274,7 +274,7 @@
<message>
<location filename="../cli/startstream.cpp" line="137"/>
<source>Failed to find application %1</source>
<translation>N&apos;a pas trouvé l&apos;application %1</translation>
<translation>L&apos;application %1 n&apos;a pas été trouvée</translation>
</message>
</context>
<context>
@@ -292,147 +292,160 @@
<translation type="vanished">Aucune vidéo reçue de l&apos;hôte. Vérifiez le pare-feu et les règles de transfert de port du PC hôte.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="89"/>
<location filename="../streaming/session.cpp" line="91"/>
<source>No video received from host.</source>
<translation>Aucune vidéo reçue de l&apos;hôte.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="90"/>
<location filename="../streaming/session.cpp" line="92"/>
<source>Check your firewall and port forwarding rules for port(s): %1</source>
<translation>Vérifiez votre pare-feu ainsi que les règles de redirection pour le(s) port(s) suivant(s)&#x202f;: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="95"/>
<location filename="../streaming/session.cpp" line="97"/>
<source>Your network connection isn&apos;t performing well. Reduce your video bitrate setting or try a faster connection.</source>
<translation>Votre connexion réseau ne fonctionne pas très bien. Réduisez votre débit vidéo ou essayez une connexion plus rapide.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="100"/>
<location filename="../streaming/session.cpp" line="102"/>
<source>Something went wrong on your host PC when starting the stream.</source>
<translation>Quelque chose s&apos;est mal passé sur votre PC hôte lors du lancement du streaming.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="101"/>
<location filename="../streaming/session.cpp" line="103"/>
<source>Make sure you don&apos;t have any DRM-protected content open on your host PC. You can also try restarting your host PC.</source>
<translation>Vérifiez que vous n&apos;avez pas de contenu protégé par DRM ouvert sur votre PC hôte. Vous pouvez également essayer de redémarrer le PC hôte.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="102"/>
<location filename="../streaming/session.cpp" line="104"/>
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
<translation>Si le problème persiste, essayez de réinstaller vos pilotes GPU et GeForce Experience.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="107"/>
<location filename="../streaming/session.cpp" line="109"/>
<source>Connection terminated</source>
<translation>Connexion terminée</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="592"/>
<location filename="../streaming/session.cpp" line="661"/>
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
<translation>La version de GeForce Experience sur %1 n&apos;est pas supportée par cette version de Moonlight. Vous devez mettre à jour Moonlight pour streamer depuis %1.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="597"/>
<location filename="../streaming/session.cpp" line="666"/>
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
<translation>Votre sélection pour activer le mode de souris de bureau à distance peut causer des problèmes dans les jeux.</translation>
<translation>Le mode souris pour bureau à distance que vous avez activé peut causer des problèmes dans les jeux.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="602"/>
<location filename="../streaming/session.cpp" line="671"/>
<source>HDR is not supported with software decoding.</source>
<translation>Le HDR n&apos;est pas pris en charge par le décodage logiciel.</translation>
<translation>Le HDR n&apos;est pas pris en charge par le décodeur logiciel.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="606"/>
<location filename="../streaming/session.cpp" line="675"/>
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
<translation>La sélection de vos paramètres pour forcer le décodage logiciel peut entraîner de mauvaises performances de streaming.</translation>
<translation>Vos réglages pour forcer le décodage logiciel peut causer de mauvaises performances.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="611"/>
<location filename="../streaming/session.cpp" line="680"/>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>L&apos;utilisation d&apos;options FPS non prises en charge peut entraîner des saccades ou des lags.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="614"/>
<location filename="../streaming/session.cpp" line="683"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>La synchronisation verticale (V-sync) sera désactivée lors de la diffusion en continu à une fréquence d&apos;images supérieure à celle de l&apos;affichage.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="631"/>
<location filename="../streaming/session.cpp" line="710"/>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>Utilisation du décodage logiciel dû à votre sélection pour forcer le codec HEVC sans support GPU. Ceci peut entraîner de mauvaises performances de streaming.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="634"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>Le GPU de ce PC ne prend pas en charge le décodage HEVC.</translation>
<translation type="vanished">Le GPU de ce PC ne prend pas en charge le décodage HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="641"/>
<location filename="../streaming/session.cpp" line="693"/>
<source>Your host PC GPU doesn&apos;t support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
<translation>Le GPU de votre PC hôte ne prend pas en charge le codec HEVC. Un GPU GeForce GTX série 900 (Maxwell) ou plus récent est nécessaire pour le streaming HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="658"/>
<source>%1 doesn&apos;t support HDR10.</source>
<translation>%1 ne prend pas en charge le HDR10.</translation>
<location filename="../streaming/session.cpp" line="724"/>
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
<translation>Le décodage logiciel est utilisé car vous voulez forcer l&apos;utilisation du H.264 sans support matériel du GPU. Ceci peut causer des problèmes de performances.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="662"/>
<location filename="../streaming/session.cpp" line="734"/>
<source>Your host PC and client PC don&apos;t support the same video codecs. This may cause poor streaming performance.</source>
<translation>Votre PC hôte et PC client ne supportent pas les mêmes codecs vidéo. Ceci peut causer des problèmes de performance.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<source>Your client GPU doesn&apos;t support H.264 decoding. This may cause poor streaming performance.</source>
<translation>Le GPU de votre client ne supporte pas le décodage matériel du H.264. Ceci peut causer des problèmes de performance.</translation>
</message>
<message>
<source>%1 doesn&apos;t support HDR10.</source>
<translation type="vanished">%1 ne prend pas en charge le HDR10.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="748"/>
<source>Your host PC GPU doesn&apos;t support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
<translation>Le GPU de votre PC hôte ne prend pas en charge le streaming HDR. Un GPU GeForce GTX série 1000 (Pascal) ou plus récent est nécessaire pour la diffusion HDR.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="671"/>
<location filename="../streaming/session.cpp" line="757"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC Main10 decoding for HDR streaming.</source>
<translation>Le GPU de ce PC ne prend pas en charge le décodage HEVC pour le streaming HDR.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="684"/>
<location filename="../streaming/session.cpp" line="770"/>
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
<translation>GeForce Experience 3.0 ou supérieur est requis pour le streaming 4K.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="699"/>
<location filename="../streaming/session.cpp" line="785"/>
<source>Your selected surround sound setting is not supported by the current audio device.</source>
<translation>Le réglage du son surround que vous avez sélectionné n&apos;est pas pris en charge par l&apos;appareil audio actuel.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="706"/>
<location filename="../streaming/session.cpp" line="792"/>
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
<translation>Échec de l&apos;ouverture de l&apos;appareil audio. L&apos;audio ne sera pas disponible pendant cette session.</translation>
<translation>L&apos;ouverture de l&apos;appareil audio à échoué. L&apos;audio ne sera pas disponible pendant cette session.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="711"/>
<location filename="../streaming/session.cpp" line="797"/>
<source>An attached gamepad has no mapping and won&apos;t be usable. Visit the Moonlight help to resolve this.</source>
<translation>Une manette de jeu attachée n&apos;a pas été configurée et ne sera pas utilisable. Visitez l&apos;aide Moonlight pour résoudre ce problème.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="719"/>
<location filename="../streaming/session.cpp" line="805"/>
<source>Your host PC&apos;s GPU doesn&apos;t support streaming video resolutions over 4K.</source>
<translation>Le GPU de votre PC hôte ne prend pas en charge les résolutions vidéo en continu supérieures à 4K.</translation>
<translation>Le GPU de votre PC hôte ne prend pas en charge le streaming dans des résolutions supérieures à la 4K.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="723"/>
<location filename="../streaming/session.cpp" line="809"/>
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
<translation>Les résolutions vidéo supérieures à 4K sont uniquement prises en charge par le codec HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<location filename="../streaming/session.cpp" line="823"/>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>Votre choix pour forcer le décodage matériel ne peut être satisfait en raison de l&apos;absence de support de décodage matériel sur le GPU de ce PC.</translation>
<translation>Impossible d&apos;utiliser le décodage matériel car le GPU de cet ordinateur ne supporte pas le décodage matériel.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="740"/>
<location filename="../streaming/session.cpp" line="826"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>Votre sélection de codecs et le réglage du décodage matériel ne sont pas compatibles. Le GPU de ce PC ne prend pas en charge le décodage du codec que vous avez choisi.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1041"/>
<location filename="../streaming/session.cpp" line="1165"/>
<source>GeForce Experience returned error: %1</source>
<translation>GeForce Experience a renvoyé l&apos;erreur : %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1519"/>
<location filename="../streaming/session.cpp" line="1714"/>
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
<translation>Impossible d&apos;initialiser le décodeur vidéo. Veuillez vérifier vos paramètres de diffusion en continu et réessayez.</translation>
</message>
@@ -445,105 +458,105 @@
<translation>Paramètres</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="70"/>
<location filename="../gui/SettingsView.qml" line="72"/>
<source>Resolution and FPS</source>
<translation>Résolution et FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="78"/>
<location filename="../gui/SettingsView.qml" line="80"/>
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
<translation>Fixer des valeurs trop élevées pour votre PC ou votre connexion réseau, peut entraîner un décalage, des saccades ou des erreurs.</translation>
<translation>Des réglages trop élevés pour votre PC ou connexion peuvent causer du lag, des saccades et d&apos;autres problèmes.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="60"/>
<location filename="../gui/SettingsView.qml" line="62"/>
<source>Basic Settings</source>
<translation>Paramètres de base</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="209"/>
<location filename="../gui/SettingsView.qml" line="211"/>
<source>720p</source>
<translation>720p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="215"/>
<location filename="../gui/SettingsView.qml" line="217"/>
<source>1080p</source>
<translation>1080p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="221"/>
<location filename="../gui/SettingsView.qml" line="223"/>
<source>1440p</source>
<translation>1440p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="227"/>
<location filename="../gui/SettingsView.qml" line="229"/>
<source>4K</source>
<translation>4K</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="331"/>
<location filename="../gui/SettingsView.qml" line="333"/>
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
<translation>Les résolutions personnalisées ne sont pas officiellement prises en charge par GeForce Experience, qui ne pourra donc pas définir la résolution de votre écran hôte. Vous devrez la définir manuellement dans le jeu.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="332"/>
<location filename="../gui/SettingsView.qml" line="334"/>
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
<translation>Les résolutions qui ne sont pas prises en charge par votre client ou votre PC hôte peuvent entraîner des problèmes de diffusion.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="338"/>
<location filename="../gui/SettingsView.qml" line="340"/>
<source>Enter a custom resolution:</source>
<translation>Entrez une résolution personnalisée :</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="406"/>
<location filename="../gui/SettingsView.qml" line="407"/>
<location filename="../gui/SettingsView.qml" line="427"/>
<location filename="../gui/SettingsView.qml" line="430"/>
<location filename="../gui/SettingsView.qml" line="408"/>
<location filename="../gui/SettingsView.qml" line="409"/>
<location filename="../gui/SettingsView.qml" line="429"/>
<location filename="../gui/SettingsView.qml" line="432"/>
<source>%1 FPS</source>
<translation>%1 FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="412"/>
<location filename="../gui/SettingsView.qml" line="415"/>
<location filename="../gui/SettingsView.qml" line="424"/>
<location filename="../gui/SettingsView.qml" line="437"/>
<location filename="../gui/SettingsView.qml" line="440"/>
<location filename="../gui/SettingsView.qml" line="414"/>
<location filename="../gui/SettingsView.qml" line="417"/>
<location filename="../gui/SettingsView.qml" line="426"/>
<location filename="../gui/SettingsView.qml" line="439"/>
<location filename="../gui/SettingsView.qml" line="442"/>
<source>%1 FPS (Unsupported)</source>
<translation>%1 FPS (Non supporté)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="493"/>
<location filename="../gui/SettingsView.qml" line="496"/>
<source>Video bitrate:</source>
<translation>Bitrate vidéo :</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="501"/>
<location filename="../gui/SettingsView.qml" line="504"/>
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
<translation>Baissez le débit binaire sur les connexions plus lentes. Augmentez le débit binaire pour améliorer la qualité de l&apos;image.</translation>
<translation>Baissez le débit si votre connexion est lente. Augmentez-le pour plus de qualité d&apos;image.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="519"/>
<location filename="../gui/SettingsView.qml" line="522"/>
<source>Video bitrate: %1 Mbps</source>
<translation>Bitrate vidéo : %1 Mbps</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="527"/>
<location filename="../gui/SettingsView.qml" line="530"/>
<source>Display mode</source>
<translation>Mode d&apos;affichage</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="545"/>
<location filename="../gui/SettingsView.qml" line="560"/>
<source> (Recommended)</source>
<translation> (Recommandé)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="573"/>
<location filename="../gui/SettingsView.qml" line="860"/>
<location filename="../gui/SettingsView.qml" line="541"/>
<location filename="../gui/SettingsView.qml" line="948"/>
<source>Fullscreen</source>
<translation>Plein écran</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="592"/>
<location filename="../gui/SettingsView.qml" line="610"/>
<source>Fullscreen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.</source>
<translation>Le plein écran offre généralement les meilleures performances, mais le mode fenêtre sans bordure peut mieux fonctionner avec des fonctionnalités comme les espaces sur macOS, Alt+Tab, les outils de capture d&apos;écran, les overlays, etc.</translation>
</message>
@@ -552,13 +565,13 @@
<translation type="vanished">Plein écran</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="577"/>
<location filename="../gui/SettingsView.qml" line="546"/>
<source>Borderless windowed</source>
<translation>Fenêtré sans bordure</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="581"/>
<location filename="../gui/SettingsView.qml" line="852"/>
<location filename="../gui/SettingsView.qml" line="551"/>
<location filename="../gui/SettingsView.qml" line="940"/>
<source>Windowed</source>
<translation>Fenêtré</translation>
</message>
@@ -567,211 +580,246 @@
<translation type="vanished">Le plein écran offre généralement les meilleures performances, mais les fenêtres sans bordure peuvent fonctionner mieux avec des fonctionnalités telles que MacOS Spaces, Alt+Tab, les outils de capture d&apos;écran, les superpositions à l&apos;écran, etc.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="599"/>
<location filename="../gui/SettingsView.qml" line="617"/>
<source>V-Sync</source>
<translation>synchronisation verticale</translation>
<translation>Synchronisation verticale (V-Sync)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="609"/>
<location filename="../gui/SettingsView.qml" line="627"/>
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
<translation>La désactivation de V-Sync permet une latence de rendu des sous-images plus faible, mais elle peut afficher des déchirures visibles</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="616"/>
<location filename="../gui/SettingsView.qml" line="634"/>
<source>Frame pacing</source>
<translation>Frame pacing</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="626"/>
<location filename="../gui/SettingsView.qml" line="644"/>
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
<translation>Frame pacing réduit les micro-bégaiements en retardant les images qui arrivent trop tôt</translation>
<translation>Le Frame pacing réduit les micro-saccades en retardant les images qui arrivent trop tôt</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="636"/>
<location filename="../gui/SettingsView.qml" line="654"/>
<source>Audio Settings</source>
<translation>Réglages audio</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="671"/>
<location filename="../gui/SettingsView.qml" line="689"/>
<source>Stereo</source>
<translation>Stéréo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="675"/>
<location filename="../gui/SettingsView.qml" line="693"/>
<source>5.1 surround sound</source>
<translation>Son surround 5.1</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="679"/>
<location filename="../gui/SettingsView.qml" line="697"/>
<source>7.1 surround sound</source>
<translation>Son surround 7.1</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="693"/>
<location filename="../gui/SettingsView.qml" line="711"/>
<source>Mute host PC speakers while streaming</source>
<translation>Couper le son des haut-parleurs du PC hôte pendant la diffusion</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="703"/>
<location filename="../gui/SettingsView.qml" line="721"/>
<source>You must restart any game currently in progress for this setting to take effect</source>
<translation>Vous devez redémarrer tout jeu en cours pour que ce paramètre prenne effet</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="709"/>
<location filename="../gui/SettingsView.qml" line="727"/>
<source>Mute audio stream when Moonlight is not the active window</source>
<translation>Couper le son du stream quand Moonlight n&apos;est pas au premier plan</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="720"/>
<location filename="../gui/SettingsView.qml" line="738"/>
<source>Mutes Moonlight&apos;s audio when you Alt+Tab out of the stream or click on a different window.</source>
<translation>Coupe le son du stream quand vous faites Alt+Tab ou si vous cliquez sur une autre fenêtre.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="729"/>
<location filename="../gui/SettingsView.qml" line="747"/>
<source>UI Settings</source>
<translation>Réglages de l&apos;interface utilisateur</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="739"/>
<location filename="../gui/SettingsView.qml" line="757"/>
<source>Language</source>
<translation>Langue</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="765"/>
<location filename="../gui/SettingsView.qml" line="783"/>
<source>Automatic</source>
<translation>Automatique</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="805"/>
<location filename="../gui/SettingsView.qml" line="890"/>
<source>You must restart Moonlight for this change to take effect</source>
<translation>Vous devez redémarrer Moonlight pour que ce changement prenne effet</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="819"/>
<location filename="../gui/SettingsView.qml" line="907"/>
<source>GUI display mode</source>
<translation>Mode d&apos;affichage de l&apos;interface graphique</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="856"/>
<location filename="../gui/SettingsView.qml" line="944"/>
<source>Maximized</source>
<translation>Maximisé</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="913"/>
<location filename="../gui/SettingsView.qml" line="989"/>
<source>Keep the display awake while streaming</source>
<translation>Garder l&apos;écran allumé lors du streaming</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="999"/>
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
<translation>Désactive l&apos;écran de veille ou la mise en veille de l&apos;écran pendant le streaming.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1017"/>
<source>Input Settings</source>
<translation>Paramètres d&apos;entrée</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="934"/>
<location filename="../gui/SettingsView.qml" line="1038"/>
<source>This enables seamless mouse control without capturing the client&apos;s mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
<translation>Cela permet un contrôle transparent de la souris, sans capturer le curseur du client. C&apos;est idéal pour l’utilisation du bureau à distance, mais ne fonctionnera pas dans la plupart des jeux.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="936"/>
<location filename="../gui/SettingsView.qml" line="1040"/>
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
<translation>REMARQUE : En raison d&apos;un bogue dans GeForce Experience, cette option peut ne pas fonctionner correctement si votre PC hôte a plusieurs moniteurs.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="955"/>
<location filename="../gui/SettingsView.qml" line="1059"/>
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
<translation>REMARQUE : Certains raccourcis clavier comme Ctrl+Alt+Suppr sur Windows ne peuvent jamais être interceptés, y compris par Moonlight.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="984"/>
<location filename="../gui/SettingsView.qml" line="1088"/>
<source>in fullscreen</source>
<translation>en plein écran</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="988"/>
<location filename="../gui/SettingsView.qml" line="1092"/>
<source>always</source>
<translation>toujours</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1018"/>
<location filename="../gui/SettingsView.qml" line="1122"/>
<source>Use touchscreen as a virtual trackpad</source>
<translation>Utiliser l&apos;écran tactile comme un trackpad virtuel</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1035"/>
<location filename="../gui/SettingsView.qml" line="1139"/>
<source>Swap left and right mouse buttons</source>
<translation>Permuter les boutons gauche et droit de la souris</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1047"/>
<location filename="../gui/SettingsView.qml" line="1151"/>
<source>Reverse mouse scrolling direction</source>
<translation>Inverser le sens de défilement de la souris</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1061"/>
<location filename="../gui/SettingsView.qml" line="1165"/>
<source>Gamepad Settings</source>
<translation>Paramètres de la manette</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1071"/>
<location filename="../gui/SettingsView.qml" line="1175"/>
<source>Swap A/B and X/Y gamepad buttons</source>
<translation>Inverser les boutons A/B et X/Y de la manette</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1089"/>
<location filename="../gui/SettingsView.qml" line="1193"/>
<source>This switches gamepads into a Nintendo-style button layout</source>
<translation>Permet d&apos;utiliser les boutons comme sur une manette Nintendo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1095"/>
<location filename="../gui/SettingsView.qml" line="1199"/>
<source>Force gamepad #1 always connected</source>
<translation>Forcer la manette #1 à être toujours connectée</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1105"/>
<location filename="../gui/SettingsView.qml" line="1209"/>
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
<translation>Force une seule manette de jeu à toujours rester connectée à l&apos;hôte, même si aucune manette de jeu n&apos;est réellement connectée à ce PC.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1356"/>
<source>Enabling HDR overrides manual decoder selections.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1425"/>
<source>Enabling HDR overrides manual codec selections.</source>
<translation>Activer l&apos;HDR désactive le choix de codec vidéo.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1431"/>
<source>Enable HDR (Experimental)</source>
<translation>Activer le HDR (Expérimental)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1442"/>
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
<translation>Le stream sera compatible HDR, mais certains jeux requièrent un moniteur HDR côté hôte pour streamer en HDR.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1444"/>
<source>HDR streaming is not supported on this PC.</source>
<translation>Le streaming en HDR n&apos;est pas supporté sur ce PC.</translation>
</message>
<message>
<source>This enables mouse control without capturing the client&apos;s mouse cursor. It will not work in most games.</source>
<translation type="vanished">Cela permet de contrôler la souris sans avoir à capturer le curseur du client. Cela ne fonctionne pas dans la plupart des jeux.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="935"/>
<location filename="../gui/SettingsView.qml" line="1039"/>
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
<translation>Vous pouvez basculer ceci pendant la diffusion en utilisant Ctrl+Alt+Maj+M.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="946"/>
<location filename="../gui/SettingsView.qml" line="1050"/>
<source>Capture system keyboard shortcuts</source>
<translation>Capturer les raccourcis clavier système</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="954"/>
<location filename="../gui/SettingsView.qml" line="1058"/>
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
<translation>Ceci permet la capture de raccourcis clavier système comme Alt+Tab, qui seraient normalement utilisés par le système d’exploitation client.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1113"/>
<location filename="../gui/SettingsView.qml" line="1217"/>
<source>Enable mouse control with gamepads by holding the &apos;Start&apos; button</source>
<translation>Active le contrôle de la souris par la manette en maintenant le bouton « Start »</translation>
<translation>Activer le contrôle de la souris par la manette en maintenant « Start »</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1124"/>
<location filename="../gui/SettingsView.qml" line="1228"/>
<source>Process gamepad input when Moonlight is in the background</source>
<translation>Capturer la manette même lorsque Moonlight est en arrière-plan</translation>
<translation>Capturer la manette même quand Moonlight est en arrière-plan</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1135"/>
<location filename="../gui/SettingsView.qml" line="1239"/>
<source>Allows Moonlight to capture gamepad inputs even if it&apos;s not the current window in focus</source>
<translation>Permet à Moonlight de capturer la manette même si Moonlight n&apos;est pas au premier plan</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1144"/>
<location filename="../gui/SettingsView.qml" line="1248"/>
<source>Host Settings</source>
<translation>Paramètres de l&apos;hôte</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1184"/>
<location filename="../gui/SettingsView.qml" line="1288"/>
<source>Advanced Settings</source>
<translation>Paramètres avancés</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="646"/>
<location filename="../gui/SettingsView.qml" line="664"/>
<source>Audio configuration</source>
<translation>Configuration audio</translation>
</message>
@@ -780,17 +828,17 @@
<translation type="vanished">Maximiser la fenêtre Moonlight au démarrage</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="873"/>
<location filename="../gui/SettingsView.qml" line="961"/>
<source>Show connection quality warnings</source>
<translation>Afficher les avertissements sur la qualité de la connexion</translation>
<translation>Afficher des avertissements sur la qualité de la connexion</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="885"/>
<location filename="../gui/SettingsView.qml" line="973"/>
<source>Discord Rich Presence integration</source>
<translation>Intégration de la présence Discord Rich</translation>
<translation>Activer l&apos;intégration Discord Rich Presence</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="895"/>
<location filename="../gui/SettingsView.qml" line="983"/>
<source>Updates your Discord status to display the name of the game you&apos;re streaming.</source>
<translation>Met à jour votre statut Discord pour afficher le nom du jeu que vous diffusez en continu.</translation>
</message>
@@ -799,12 +847,12 @@
<translation type="vanished">Forcé la manette de jeu Force #1 à être toujours présente</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1106"/>
<location filename="../gui/SettingsView.qml" line="1210"/>
<source>Only enable this option when streaming a game that doesn&apos;t support gamepads being connected after startup.</source>
<translation>N&apos;activez cette option que lorsque vous diffusez en continu un jeu qui ne prend pas en charge la connexion des manettes de jeu après le démarrage.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="924"/>
<location filename="../gui/SettingsView.qml" line="1028"/>
<source>Optimize mouse for remote desktop instead of games</source>
<translation>Optimiser la souris pour le bureau à distance plutôt que pour les jeux</translation>
</message>
@@ -813,7 +861,7 @@
<translation type="vanished">Utiliser l&apos;écran tactile comme trackpad</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1028"/>
<location filename="../gui/SettingsView.qml" line="1132"/>
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
<translation>Lorsqu&apos;il est coché, l&apos;écran tactile agit comme un pavé tactile. Lorsqu&apos;il n&apos;est pas coché, l&apos;écran tactile contrôle directement le pointeur de la souris.</translation>
</message>
@@ -834,7 +882,7 @@
<translation type="vanished">Lorsque la case est cochée, permuter les boutons gauche et droit de la souris</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1154"/>
<location filename="../gui/SettingsView.qml" line="1258"/>
<source>Optimize game settings for streaming</source>
<translation>Optimiser les paramètres du jeu pour la diffusion en continu</translation>
</message>
@@ -843,63 +891,67 @@
<translation type="vanished">Lecture audio sur le PC hôte</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1165"/>
<location filename="../gui/SettingsView.qml" line="1269"/>
<source>Quit app on host PC after ending stream</source>
<translation>Quitter l&apos;application sur le PC hôte après avoir terminé le flux</translation>
<translation>Fermer l&apos;application sur le PC hôte à la fin du stream</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1175"/>
<location filename="../gui/SettingsView.qml" line="1279"/>
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
<translation>Ceci fermera l&apos;application ou le jeu que vous êtes en train de diffuser lorsque vous aurez terminé votre flux. Vous perdrez tout progrès non sauvegardé !</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1194"/>
<location filename="../gui/SettingsView.qml" line="1298"/>
<source>Video decoder</source>
<translation>Décodeur vidéo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1219"/>
<location filename="../gui/SettingsView.qml" line="1265"/>
<location filename="../gui/SettingsView.qml" line="1324"/>
<location filename="../gui/SettingsView.qml" line="1393"/>
<source>Automatic (Recommended)</source>
<translation>Automatique (recommandé)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1223"/>
<location filename="../gui/SettingsView.qml" line="1328"/>
<source>Force software decoding</source>
<translation>Forcer le décodage logiciel</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1227"/>
<location filename="../gui/SettingsView.qml" line="1332"/>
<source>Force hardware decoding</source>
<translation>Forcer le décodage matériel</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1240"/>
<location filename="../gui/SettingsView.qml" line="1362"/>
<source>Video codec</source>
<translation>Codec vidéo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1269"/>
<location filename="../gui/SettingsView.qml" line="1397"/>
<source>H.264</source>
<translation>H.264</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1273"/>
<location filename="../gui/SettingsView.qml" line="1401"/>
<source>HEVC (H.265)</source>
<translation>HEVC (H.265)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1290"/>
<source>HEVC HDR (Experimental)</source>
<translation type="vanished">HEVC HDR (Expérimental)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1450"/>
<source>Unlock unsupported FPS options</source>
<translation>Débloquer les options FPS non supportées</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1309"/>
<location filename="../gui/SettingsView.qml" line="1469"/>
<source>Automatically find PCs on the local network (Recommended)</source>
<translation>Trouver automatiquement les PC sur le réseau local (recommandé)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1334"/>
<location filename="../gui/SettingsView.qml" line="1494"/>
<source>Automatically detect blocked connections (Recommended)</source>
<translation>Détecter automatiquement les connexions bloquées (recommandé)</translation>
</message>
@@ -933,22 +985,22 @@
<translation>La connexion Internet de ce PC bloque Moonlight. Le streaming à travers Internet peut ne pas fonctionner lorsqu&apos;il est connecté à ce réseau.</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Tip:</source>
<translation>Astuce :</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Press %1 to disconnect your session</source>
<translation>Appuyez sur %1 pour déconnecter votre session</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Start+Select+L1+R1</source>
<translation>Start + Select + L1 + R1</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Ctrl+Alt+Shift+Q</source>
<translation>Ctrl + Alt + Maj + Q</translation>
</message>
@@ -956,80 +1008,79 @@
<context>
<name>main</name>
<message>
<location filename="../gui/main.qml" line="254"/>
<location filename="../gui/main.qml" line="264"/>
<location filename="../gui/main.qml" line="393"/>
<location filename="../gui/main.qml" line="408"/>
<location filename="../gui/main.qml" line="418"/>
<source>Settings</source>
<translation>Paramètres</translation>
</message>
<message>
<location filename="../gui/main.qml" line="255"/>
<location filename="../gui/main.qml" line="265"/>
<source>Version %1</source>
<translation>Version %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="271"/>
<location filename="../gui/main.qml" line="281"/>
<source>Join our community on Discord</source>
<translation>Rejoignez notre communauté sur Discord</translation>
</message>
<message>
<location filename="../gui/main.qml" line="283"/>
<source>Computers</source>
<translation>Ordinateurs</translation>
<translation type="vanished">Ordinateurs</translation>
</message>
<message>
<location filename="../gui/main.qml" line="290"/>
<location filename="../gui/main.qml" line="300"/>
<source>Add PC manually</source>
<translation>Ajouter un PC manuellement</translation>
</message>
<message>
<location filename="../gui/main.qml" line="330"/>
<location filename="../gui/main.qml" line="340"/>
<source>Update available for Moonlight: Version %1</source>
<translation>Mise à jour disponible pour Moonlight : Version %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="377"/>
<location filename="../gui/main.qml" line="387"/>
<source>Gamepad Mapper</source>
<translation>Configuration du contrôleur</translation>
</message>
<message>
<location filename="../gui/main.qml" line="381"/>
<source>Gamepad Mapping</source>
<translation>Configuration du contrôleur</translation>
<translation type="vanished">Configuration du contrôleur</translation>
</message>
<message>
<location filename="../gui/main.qml" line="415"/>
<source>No functioning hardware accelerated H.264 video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation>Aucun décodeur vidéo H.264 accéléré par le matériel n&apos;a été détecté par Moonlight. Dans cette configuration, les performances de streaming peuvent être fortement dégradées.</translation>
<translation type="vanished">Aucun décodeur vidéo H.264 accéléré par le matériel n&apos;a été détecté par Moonlight. Dans cette configuration, les performances de streaming peuvent être fortement dégradées.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="423"/>
<location filename="../gui/main.qml" line="433"/>
<source>Hardware acceleration doesn&apos;t work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
<translation>L&apos;accélération matérielle ne fonctionne pas sur XWayland. Continuer sur XWayland peut entraîner de mauvaises performances de streaming. Essayez de fonctionner avec QT_QPA_PLATFORM=wayland ou passez à X11.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="432"/>
<location filename="../gui/main.qml" line="442"/>
<source>This version of Moonlight isn&apos;t optimized for your PC. Please download the &apos;%1&apos; version of Moonlight for the best streaming performance.</source>
<translation>Cette version de Moonlight n&apos;est pas optimisée pour votre PC. Téléchargez la version « %1 » pour de meilleures performances.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="441"/>
<location filename="../gui/main.qml" line="451"/>
<source>Moonlight detected gamepads without a mapping:</source>
<translation>Moonlight a détecté des manettes sans configuration&#x202f;:</translation>
</message>
<message>
<location filename="../gui/main.qml" line="354"/>
<location filename="../gui/main.qml" line="364"/>
<source>Help</source>
<translation>Aide</translation>
</message>
<message>
<location filename="../gui/main.qml" line="417"/>
<location filename="../gui/main.qml" line="425"/>
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation>Aucun décodeur vidéo matériel n&apos;a été détecté par Moonlight. Les performances de streaming risquent d&apos;être sévèrement dégradées dans cette configuration.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="427"/>
<source>Click the Help button for more information on solving this problem.</source>
<translation>Cliquez sur le bouton Aide pour obtenir plus d&apos;informations sur la manière de résoudre ce problème.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="425"/>
<location filename="../gui/main.qml" line="435"/>
<source>Click the Help button for more information.</source>
<translation>Cliquez sur le bouton Aide pour plus d&apos;informations.</translation>
</message>
@@ -1038,17 +1089,17 @@
<translation type="vanished">Ce PC fonctionne avec une version 64 bits de Windows. Veuillez télécharger la version x64 de Moonlight pour obtenir les meilleures performances de diffusion en continu.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="443"/>
<location filename="../gui/main.qml" line="453"/>
<source>Click the Help button for information on how to map your gamepads.</source>
<translation>Cliquez sur le bouton Aide pour obtenir des informations sur la configuration de vos manettes de jeu.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="451"/>
<location filename="../gui/main.qml" line="461"/>
<source>Are you sure you want to quit?</source>
<translation>Êtes-vous sûr de vouloir quitter&#x202f;?</translation>
</message>
<message>
<location filename="../gui/main.qml" line="481"/>
<location filename="../gui/main.qml" line="491"/>
<source>Enter the IP address of your GameStream PC:</source>
<translation>Saisissez l&apos;adresse IP de votre PC GameStream :</translation>
</message>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
+230 -179
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
+206 -155
View File
@@ -93,7 +93,7 @@
<context>
<name>NvHTTP</name>
<message>
<location filename="../backend/nvhttp.cpp" line="327"/>
<location filename="../backend/nvhttp.cpp" line="378"/>
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
<translation>Потеряно виртуальное аудиоустройство. Попробуйте переустановить GeForce Experience.</translation>
</message>
@@ -160,7 +160,7 @@
<message>
<location filename="../gui/PcView.qml" line="224"/>
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
<translation type="unfinished"></translation>
<translation>Версия GeForce Experience на %1 не поддерживается данной сборкой Moonlight. Вы должны обновить Moonlight для потоковой передачи с %1.</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="247"/>
@@ -246,7 +246,7 @@
<context>
<name>PendingQuitTask</name>
<message>
<location filename="../backend/computermanager.cpp" line="542"/>
<location filename="../backend/computermanager.cpp" line="540"/>
<source>The running game wasn&apos;t started by this PC. You must quit the game on the host PC manually or use the device that originally started the game.</source>
<translation>Выбранная игра уже запущена. Вручную закройте игру на хост-ПК, или используйте устройство, с которого она была запущена.</translation>
</message>
@@ -292,147 +292,160 @@
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="89"/>
<location filename="../streaming/session.cpp" line="91"/>
<source>No video received from host.</source>
<translation>Не удалось загрузить видео с хост-ПК. (No video received from host.)</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="90"/>
<location filename="../streaming/session.cpp" line="92"/>
<source>Check your firewall and port forwarding rules for port(s): %1</source>
<translation>Проверьте настройки брандмауэра и проброса портов для следующих портов: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="95"/>
<location filename="../streaming/session.cpp" line="97"/>
<source>Your network connection isn&apos;t performing well. Reduce your video bitrate setting or try a faster connection.</source>
<translation>Ваше сетевое подключение не справляется с заданными настройками. Попробуйте изменить битрейт или использовать более быстрое подключение.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="100"/>
<location filename="../streaming/session.cpp" line="102"/>
<source>Something went wrong on your host PC when starting the stream.</source>
<translation>Что-то пошло не так на хост-ПК при попытке начать стрим.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="101"/>
<location filename="../streaming/session.cpp" line="103"/>
<source>Make sure you don&apos;t have any DRM-protected content open on your host PC. You can also try restarting your host PC.</source>
<translation>Убедитесь, что на нём не открыто защищённых DRM материалов. Также попытайтесь перезагрузить ПК.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="102"/>
<location filename="../streaming/session.cpp" line="104"/>
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
<translation>Если проблема не уходит, попробуйте переустановить драйвер видеокарты и/или GeForce Experience.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="107"/>
<location filename="../streaming/session.cpp" line="109"/>
<source>Connection terminated</source>
<translation>Подключение разорвано</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="592"/>
<location filename="../streaming/session.cpp" line="661"/>
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
<translation type="unfinished"></translation>
<translation>Версия GeForce Experience на %1 не поддерживается данной сборкой Moonlight. Вы должны обновить Moonlight для потоковой передачи с %1.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="597"/>
<location filename="../streaming/session.cpp" line="666"/>
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
<translation>Вы выбрали режим удалённого рабочего стола. Это может вызвать проблемы с мышью в некоторых играх.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="602"/>
<location filename="../streaming/session.cpp" line="671"/>
<source>HDR is not supported with software decoding.</source>
<translation>HDR не поддерживается с программным декодированием.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="606"/>
<location filename="../streaming/session.cpp" line="675"/>
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
<translation>Вы выбрали программное декодирование, что может ухудшить производительность.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="611"/>
<location filename="../streaming/session.cpp" line="680"/>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>Неподдерживаемые значения FPS могут вызвать подтормаживания или повысить задержку.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="614"/>
<location filename="../streaming/session.cpp" line="683"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>V-sync будет отключён, если частота кадров стрима превышает частоту развёртки экрана.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="631"/>
<location filename="../streaming/session.cpp" line="710"/>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>Ваша видеокарта не поддерживает аппаратное декодирование HEVC, используется программное декодирование. Это может ухудшить производительность.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="634"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>Видеокарта этого ПК не поддерживает декодирование HEVC.</translation>
<translation type="vanished">Видеокарта этого ПК не поддерживает декодирование HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="641"/>
<location filename="../streaming/session.cpp" line="693"/>
<source>Your host PC GPU doesn&apos;t support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
<translation>Видеокарта хост-ПК не поддеживает HEVC. Требуется видеокарты GTX 900 серии или новее. Используйте H264.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="658"/>
<source>%1 doesn&apos;t support HDR10.</source>
<translation>%1 не поддеживает HDR10.</translation>
<location filename="../streaming/session.cpp" line="724"/>
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="662"/>
<location filename="../streaming/session.cpp" line="734"/>
<source>Your host PC and client PC don&apos;t support the same video codecs. This may cause poor streaming performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<source>Your client GPU doesn&apos;t support H.264 decoding. This may cause poor streaming performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 doesn&apos;t support HDR10.</source>
<translation type="vanished">%1 не поддеживает HDR10.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="748"/>
<source>Your host PC GPU doesn&apos;t support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
<translation>Видеокарты ПК-хоста не поддеживает стрим в HDR. Нужна видеокарта GTX серии 1000 или новее.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="671"/>
<location filename="../streaming/session.cpp" line="757"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC Main10 decoding for HDR streaming.</source>
<translation>Видеокарта этого ПК не поддерживает декодирование HEVC профиля Main10, HDR недоступен.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="684"/>
<location filename="../streaming/session.cpp" line="770"/>
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
<translation>Разрешение 4K требует GeForce Experience 3.0 или новее.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="699"/>
<location filename="../streaming/session.cpp" line="785"/>
<source>Your selected surround sound setting is not supported by the current audio device.</source>
<translation>Ваша настройка объёмного звука не поддерживается текущим аудиоустройством.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="706"/>
<location filename="../streaming/session.cpp" line="792"/>
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
<translation>Не удалось открыть аудиоустройство на этом ПК. Звук будет отключён на этот раз.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="711"/>
<location filename="../streaming/session.cpp" line="797"/>
<source>An attached gamepad has no mapping and won&apos;t be usable. Visit the Moonlight help to resolve this.</source>
<translation>Подключённый геймпад не настроен и не может быть использован. Посетите раздел помощи Moonlight, чтобы исправить это.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="719"/>
<location filename="../streaming/session.cpp" line="805"/>
<source>Your host PC&apos;s GPU doesn&apos;t support streaming video resolutions over 4K.</source>
<translation>Видеокарта хост-ПК не поддерживает разрешения выше 4K.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="723"/>
<location filename="../streaming/session.cpp" line="809"/>
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
<translation>Разрешения выше 4K работают только с HEVC.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<location filename="../streaming/session.cpp" line="823"/>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>Вы выбрали аппаратное декодирование, но видеокарта этого ПК не поддерживает аппаратное декодирование для выбранного кодека.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="740"/>
<location filename="../streaming/session.cpp" line="826"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>Вы выбрали аппаратное декодирование, но видеокарта этого ПК не поддерживает аппаратное декодирование для выбранного кодека.</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1041"/>
<location filename="../streaming/session.cpp" line="1165"/>
<source>GeForce Experience returned error: %1</source>
<translation>Ошибка GeForce Experience: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1519"/>
<location filename="../streaming/session.cpp" line="1714"/>
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
<translation>Не удалось запустить декодирование видео. Проверьте настройки стрима и попробуйте ещё раз.</translation>
</message>
@@ -445,60 +458,60 @@
<translation>Настройки</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="70"/>
<location filename="../gui/SettingsView.qml" line="72"/>
<source>Resolution and FPS</source>
<translation>Разрешение и FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="78"/>
<location filename="../gui/SettingsView.qml" line="80"/>
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
<translation>Слишком высокие настройки могут вызвать проблемы с производительностью, подтормаживания, или ошибки.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="60"/>
<location filename="../gui/SettingsView.qml" line="62"/>
<source>Basic Settings</source>
<translation>Основные настройки</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="209"/>
<location filename="../gui/SettingsView.qml" line="211"/>
<source>720p</source>
<translation>720p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="215"/>
<location filename="../gui/SettingsView.qml" line="217"/>
<source>1080p</source>
<translation>1080p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="221"/>
<location filename="../gui/SettingsView.qml" line="223"/>
<source>1440p</source>
<translation>1440p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="227"/>
<location filename="../gui/SettingsView.qml" line="229"/>
<source>4K</source>
<translation>4K</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="331"/>
<location filename="../gui/SettingsView.qml" line="333"/>
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
<translation>Кастомные разрешения не поддерживаются официально в GeForce Experience, так что разрешения дисплея хост-ПК не будет изменено. Вам нужно будет задать его вручную в игре.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="332"/>
<location filename="../gui/SettingsView.qml" line="334"/>
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
<translation>Если выбранное разрешение не поддерживается хостом или клиентом, могут возникнуть ошибки.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="338"/>
<location filename="../gui/SettingsView.qml" line="340"/>
<source>Enter a custom resolution:</source>
<translation>Введите желаемое разрешение:</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="406"/>
<location filename="../gui/SettingsView.qml" line="407"/>
<location filename="../gui/SettingsView.qml" line="427"/>
<location filename="../gui/SettingsView.qml" line="430"/>
<location filename="../gui/SettingsView.qml" line="408"/>
<location filename="../gui/SettingsView.qml" line="409"/>
<location filename="../gui/SettingsView.qml" line="429"/>
<location filename="../gui/SettingsView.qml" line="432"/>
<source>%1 FPS</source>
<translation>%1 FPS</translation>
</message>
@@ -507,167 +520,192 @@
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="493"/>
<location filename="../gui/SettingsView.qml" line="496"/>
<source>Video bitrate:</source>
<translation>Битрейт видео:</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="501"/>
<location filename="../gui/SettingsView.qml" line="504"/>
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
<translation>Используйте низкий битрейт при медленном соединении. Высокий битрейт улучшит качество видео.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="519"/>
<location filename="../gui/SettingsView.qml" line="522"/>
<source>Video bitrate: %1 Mbps</source>
<translation>Битрейт видео: %1 Мб/с</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="527"/>
<location filename="../gui/SettingsView.qml" line="530"/>
<source>Display mode</source>
<translation>Режим дисплея</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="545"/>
<location filename="../gui/SettingsView.qml" line="560"/>
<source> (Recommended)</source>
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
<translation> (Рекомендуется)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="573"/>
<location filename="../gui/SettingsView.qml" line="860"/>
<location filename="../gui/SettingsView.qml" line="541"/>
<location filename="../gui/SettingsView.qml" line="948"/>
<source>Fullscreen</source>
<translation>На весь экран</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="592"/>
<location filename="../gui/SettingsView.qml" line="610"/>
<source>Fullscreen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.</source>
<translation>Полноэкранный режим уменьшает задержку и улучшает производительность, но режим в окне без рамки может лучше работать с Alt+Tab, инструментами для создания скриншотов, оверлеями и Spaces в MacOS.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="577"/>
<location filename="../gui/SettingsView.qml" line="546"/>
<source>Borderless windowed</source>
<translation>В окне без рамки</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="412"/>
<location filename="../gui/SettingsView.qml" line="415"/>
<location filename="../gui/SettingsView.qml" line="424"/>
<location filename="../gui/SettingsView.qml" line="437"/>
<location filename="../gui/SettingsView.qml" line="440"/>
<location filename="../gui/SettingsView.qml" line="414"/>
<location filename="../gui/SettingsView.qml" line="417"/>
<location filename="../gui/SettingsView.qml" line="426"/>
<location filename="../gui/SettingsView.qml" line="439"/>
<location filename="../gui/SettingsView.qml" line="442"/>
<source>%1 FPS (Unsupported)</source>
<translation>%1 FPS (не поддерживается)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="581"/>
<location filename="../gui/SettingsView.qml" line="852"/>
<location filename="../gui/SettingsView.qml" line="551"/>
<location filename="../gui/SettingsView.qml" line="940"/>
<source>Windowed</source>
<translation>В окне</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="599"/>
<location filename="../gui/SettingsView.qml" line="617"/>
<source>V-Sync</source>
<translation>V-Sync</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="609"/>
<location filename="../gui/SettingsView.qml" line="627"/>
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
<translation>Отключение V-Sync позволяет уменьшить задержку до менее 1 кадра, но допускает эффект разрывов экрана</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="616"/>
<location filename="../gui/SettingsView.qml" line="634"/>
<source>Frame pacing</source>
<translation>Frame pacing (см. описание)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="626"/>
<location filename="../gui/SettingsView.qml" line="644"/>
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
<translation>Frame pacing улучшает плавность при стриме через интернет, Wi-Fi, и другие каналы с нестабильной задержкой (пингом), но увеличивает задержку. При стриме через проводной LAN желательно отключить.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="636"/>
<location filename="../gui/SettingsView.qml" line="654"/>
<source>Audio Settings</source>
<translation>Настройки звука</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="671"/>
<location filename="../gui/SettingsView.qml" line="689"/>
<source>Stereo</source>
<translation>Стерео</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="675"/>
<location filename="../gui/SettingsView.qml" line="693"/>
<source>5.1 surround sound</source>
<translation>5.1 объёмный звук</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="679"/>
<location filename="../gui/SettingsView.qml" line="697"/>
<source>7.1 surround sound</source>
<translation>7.1 объёмный звук</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="693"/>
<location filename="../gui/SettingsView.qml" line="711"/>
<source>Mute host PC speakers while streaming</source>
<translation>Не воспроизводить звук на хост-ПК</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="703"/>
<location filename="../gui/SettingsView.qml" line="721"/>
<source>You must restart any game currently in progress for this setting to take effect</source>
<translation>Для применения настроек необходим перезапуск игры</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="709"/>
<location filename="../gui/SettingsView.qml" line="727"/>
<source>Mute audio stream when Moonlight is not the active window</source>
<translation>Отключить звук, когда окно Moonlight становится неактивно</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="720"/>
<location filename="../gui/SettingsView.qml" line="738"/>
<source>Mutes Moonlight&apos;s audio when you Alt+Tab out of the stream or click on a different window.</source>
<translation>Когда Вы переключаетесь на другое окно на клиенте, Moonlight будет заглушен, пока Вы не переключитесь обратно.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="729"/>
<location filename="../gui/SettingsView.qml" line="747"/>
<source>UI Settings</source>
<translation>Настройки интерфейса</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="739"/>
<location filename="../gui/SettingsView.qml" line="757"/>
<source>Language</source>
<translation>Язык</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="765"/>
<location filename="../gui/SettingsView.qml" line="783"/>
<source>Automatic</source>
<translation>Автоматически</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="805"/>
<location filename="../gui/SettingsView.qml" line="890"/>
<source>You must restart Moonlight for this change to take effect</source>
<translation>Для применения изменений необходим перезапуск Moonlight</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="819"/>
<location filename="../gui/SettingsView.qml" line="907"/>
<source>GUI display mode</source>
<translation>Режим показа интерфейса</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="856"/>
<location filename="../gui/SettingsView.qml" line="944"/>
<source>Maximized</source>
<translation>Развёрнуто</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="913"/>
<location filename="../gui/SettingsView.qml" line="1017"/>
<source>Input Settings</source>
<translation>Настройки ввода</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="934"/>
<location filename="../gui/SettingsView.qml" line="1038"/>
<source>This enables seamless mouse control without capturing the client&apos;s mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
<translation>Удобно для удалённого рабочего стола, т.к. курсор мыши не будет &quot;захвачен&quot; и может уходить за пределы окна Moonlight. Не будет работать в большинстве игр.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="936"/>
<location filename="../gui/SettingsView.qml" line="1040"/>
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
<translation>Предупреждение: Из-за бага GeForce Experience эта настройка может не работать, если к хост-ПК подключено несколько мониторов.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1356"/>
<source>Enabling HDR overrides manual decoder selections.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1425"/>
<source>Enabling HDR overrides manual codec selections.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1431"/>
<source>Enable HDR (Experimental)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1442"/>
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1444"/>
<source>HDR streaming is not supported on this PC.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
@@ -677,198 +715,212 @@
<translation type="vanished">Dies ermöglicht die Erfassung von systemweiten Tastenkombinationen wie Alt+Tab, die normalerweise vom Client beim Streamen im Vollbildmodus ausgeführt werden würden.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="955"/>
<location filename="../gui/SettingsView.qml" line="1059"/>
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
<translation>Предупреждение: некоторые комбинации клавиш, вроде Ctrl-Alt-Del, не могут быть перехвачены.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1018"/>
<location filename="../gui/SettingsView.qml" line="1122"/>
<source>Use touchscreen as a virtual trackpad</source>
<translation>Использовать сенсорный экран как виртуальный тачпад</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1035"/>
<location filename="../gui/SettingsView.qml" line="1139"/>
<source>Swap left and right mouse buttons</source>
<translation>Поменять местами левую и правую кнопки мыши</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1047"/>
<location filename="../gui/SettingsView.qml" line="1151"/>
<source>Reverse mouse scrolling direction</source>
<translation>Колесо мыши крутит в обратном направлении</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1061"/>
<location filename="../gui/SettingsView.qml" line="1165"/>
<source>Gamepad Settings</source>
<translation>Настройки геймпада</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1071"/>
<location filename="../gui/SettingsView.qml" line="1175"/>
<source>Swap A/B and X/Y gamepad buttons</source>
<translation>Поменять местами кнопки A/B и X/Y</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1089"/>
<location filename="../gui/SettingsView.qml" line="1193"/>
<source>This switches gamepads into a Nintendo-style button layout</source>
<translation>Меняет назначения кнопок в стиль Nintendo</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1095"/>
<location filename="../gui/SettingsView.qml" line="1199"/>
<source>Force gamepad #1 always connected</source>
<translation>Принудительно оставить геймпад №1 подключённым</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1105"/>
<location filename="../gui/SettingsView.qml" line="1209"/>
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
<translation>Хотя бы один виртуальный геймпад всегда будет &quot;подключён&quot; к хост-ПК, даже если физически к ПК-хосту не подключено ни одного.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="935"/>
<location filename="../gui/SettingsView.qml" line="1039"/>
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
<translation>Вы можете переключить эту настройку во время стрима нажатием Ctrl+Alt+Shift+M.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1113"/>
<location filename="../gui/SettingsView.qml" line="1217"/>
<source>Enable mouse control with gamepads by holding the &apos;Start&apos; button</source>
<translation>Переходить в режим управления курсором мыши удержанием кнопки &quot;Start&quot;</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1124"/>
<location filename="../gui/SettingsView.qml" line="1228"/>
<source>Process gamepad input when Moonlight is in the background</source>
<translation>Геймпад работает, когда окно Moonlight в фоне</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1135"/>
<location filename="../gui/SettingsView.qml" line="1239"/>
<source>Allows Moonlight to capture gamepad inputs even if it&apos;s not the current window in focus</source>
<translation>Позволяет захватывать ввод с геймпада, даже когда окно Moonlight неактивно</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1144"/>
<location filename="../gui/SettingsView.qml" line="1248"/>
<source>Host Settings</source>
<translation>Настройки ПК-хоста</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1184"/>
<location filename="../gui/SettingsView.qml" line="1288"/>
<source>Advanced Settings</source>
<translation>Расширенные настройки</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="646"/>
<location filename="../gui/SettingsView.qml" line="664"/>
<source>Audio configuration</source>
<translation>Настройки звука</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="873"/>
<location filename="../gui/SettingsView.qml" line="961"/>
<source>Show connection quality warnings</source>
<translation>Показывать предупреждения о качестве соединения</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="885"/>
<location filename="../gui/SettingsView.qml" line="973"/>
<source>Discord Rich Presence integration</source>
<translation>Интеграция в Discord Rich Presence</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="895"/>
<location filename="../gui/SettingsView.qml" line="983"/>
<source>Updates your Discord status to display the name of the game you&apos;re streaming.</source>
<translation>Пишет статус в Discord с названием запущенноый игры.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1106"/>
<location filename="../gui/SettingsView.qml" line="1210"/>
<source>Only enable this option when streaming a game that doesn&apos;t support gamepads being connected after startup.</source>
<translation>Необходимо для игр, не поддерживающих &quot;горячее&quot; подключение геймпадов.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="924"/>
<location filename="../gui/SettingsView.qml" line="1028"/>
<source>Optimize mouse for remote desktop instead of games</source>
<translation>Оптимизировать мышь для удалённого рабочего стола вместо игр</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="946"/>
<location filename="../gui/SettingsView.qml" line="989"/>
<source>Keep the display awake while streaming</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="999"/>
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1050"/>
<source>Capture system keyboard shortcuts</source>
<translation>Захватывать нажатия горячих клавиш</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="954"/>
<location filename="../gui/SettingsView.qml" line="1058"/>
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
<translation>Это включает захват комбинаций вроде Alt+Tab, которые иначе бы обычно обрабатывались операционной системой.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="984"/>
<location filename="../gui/SettingsView.qml" line="1088"/>
<source>in fullscreen</source>
<translation>только в режиме на весь экран</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="988"/>
<location filename="../gui/SettingsView.qml" line="1092"/>
<source>always</source>
<translation>всегда</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1028"/>
<location filename="../gui/SettingsView.qml" line="1132"/>
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
<translation>Если включено, сенсорный экран будет использоваться как тачпад. Если отключено, сенсорный экран будет прямо управлять курсором мыши.</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1154"/>
<location filename="../gui/SettingsView.qml" line="1258"/>
<source>Optimize game settings for streaming</source>
<translation>Позволить GeForce Experience оптимизировать настройки игры</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1165"/>
<location filename="../gui/SettingsView.qml" line="1269"/>
<source>Quit app on host PC after ending stream</source>
<translation>Завершить игру на ПК-хосте при выходе</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1175"/>
<location filename="../gui/SettingsView.qml" line="1279"/>
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
<translation>Это выйдет из игры или приложения при закрытии окна Moonlight или нажатии Ctrl+Alt+Shift+Q. Несохранённый прогресс может быть утерян!</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1194"/>
<location filename="../gui/SettingsView.qml" line="1298"/>
<source>Video decoder</source>
<translation>Декодер видео</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1219"/>
<location filename="../gui/SettingsView.qml" line="1265"/>
<location filename="../gui/SettingsView.qml" line="1324"/>
<location filename="../gui/SettingsView.qml" line="1393"/>
<source>Automatic (Recommended)</source>
<translation>Автоматически (рекомендуется)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1223"/>
<location filename="../gui/SettingsView.qml" line="1328"/>
<source>Force software decoding</source>
<translation>Программный</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1227"/>
<location filename="../gui/SettingsView.qml" line="1332"/>
<source>Force hardware decoding</source>
<translation>Аппаратный</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1240"/>
<location filename="../gui/SettingsView.qml" line="1362"/>
<source>Video codec</source>
<translation>Видеокодек</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1269"/>
<location filename="../gui/SettingsView.qml" line="1397"/>
<source>H.264</source>
<translation>H.264</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1273"/>
<location filename="../gui/SettingsView.qml" line="1401"/>
<source>HEVC (H.265)</source>
<translation>HEVC (H.265)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1290"/>
<source>HEVC HDR (Experimental)</source>
<translation type="vanished">HEVC HDR (Экспериментальный)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1450"/>
<source>Unlock unsupported FPS options</source>
<translation>Включить неподдерживаемые настройки FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1309"/>
<location filename="../gui/SettingsView.qml" line="1469"/>
<source>Automatically find PCs on the local network (Recommended)</source>
<translation>Автоматически найти ПК-хосты в локальной сети (рекомендуется)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1334"/>
<location filename="../gui/SettingsView.qml" line="1494"/>
<source>Automatically detect blocked connections (Recommended)</source>
<translation>Автоматически определять проблемы с подключением (рекомендуется)</translation>
</message>
@@ -902,22 +954,22 @@
<translation>Интернет-соединение этого ПК блокирует Moonlight. Стриминг через интернет может не работать.</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Tip:</source>
<translation>Совет:</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Press %1 to disconnect your session</source>
<translation>Нажмите %1, чтобы отсоединиться</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Start+Select+L1+R1</source>
<translation>Start+Select+L1+R1</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Ctrl+Alt+Shift+Q</source>
<translation>Ctrl+Alt+Shift+Q</translation>
</message>
@@ -925,95 +977,94 @@
<context>
<name>main</name>
<message>
<location filename="../gui/main.qml" line="254"/>
<location filename="../gui/main.qml" line="264"/>
<location filename="../gui/main.qml" line="393"/>
<location filename="../gui/main.qml" line="408"/>
<location filename="../gui/main.qml" line="418"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
<location filename="../gui/main.qml" line="255"/>
<location filename="../gui/main.qml" line="265"/>
<source>Version %1</source>
<translation>Версия %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="271"/>
<location filename="../gui/main.qml" line="281"/>
<source>Join our community on Discord</source>
<translation>Присоединитесь к нашему Discord (на английском)</translation>
</message>
<message>
<location filename="../gui/main.qml" line="283"/>
<source>Computers</source>
<translation>Компьютеры</translation>
<translation type="vanished">Компьютеры</translation>
</message>
<message>
<location filename="../gui/main.qml" line="290"/>
<location filename="../gui/main.qml" line="300"/>
<source>Add PC manually</source>
<translation>Добавить ПК вручную</translation>
</message>
<message>
<location filename="../gui/main.qml" line="330"/>
<location filename="../gui/main.qml" line="340"/>
<source>Update available for Moonlight: Version %1</source>
<translation>Обновление Moonlight доступно: версия %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="377"/>
<location filename="../gui/main.qml" line="387"/>
<source>Gamepad Mapper</source>
<translation>Назначения кнопок геймпада</translation>
</message>
<message>
<location filename="../gui/main.qml" line="381"/>
<source>Gamepad Mapping</source>
<translation>Назначение кнопок геймпада</translation>
<translation type="vanished">Назначение кнопок геймпада</translation>
</message>
<message>
<location filename="../gui/main.qml" line="415"/>
<source>No functioning hardware accelerated H.264 video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation>Moonlight не может найти декодер для H.264. Программное декодирование может быть намного медленнее.</translation>
<translation type="vanished">Moonlight не может найти декодер для H.264. Программное декодирование может быть намного медленнее.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="423"/>
<location filename="../gui/main.qml" line="433"/>
<source>Hardware acceleration doesn&apos;t work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
<translation>Аппаратное ускорение не работает с XWayland. Попробуйте переключиться на X11 или добавьте параметр &quot;QT_QPA_PLATFORM=wayland&quot;.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="432"/>
<location filename="../gui/main.qml" line="442"/>
<source>This version of Moonlight isn&apos;t optimized for your PC. Please download the &apos;%1&apos; version of Moonlight for the best streaming performance.</source>
<translation>Эта версия Moonlight не оптимизирована для Вашего ПК. Пожалуйста, установите &quot;%1&quot; для лучшей производительности.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="441"/>
<location filename="../gui/main.qml" line="451"/>
<source>Moonlight detected gamepads without a mapping:</source>
<translation>Moonilght обнаружил геймпады без настроек:</translation>
</message>
<message>
<location filename="../gui/main.qml" line="354"/>
<location filename="../gui/main.qml" line="364"/>
<source>Help</source>
<translation>Помощь</translation>
</message>
<message>
<location filename="../gui/main.qml" line="417"/>
<location filename="../gui/main.qml" line="425"/>
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/main.qml" line="427"/>
<source>Click the Help button for more information on solving this problem.</source>
<translation>Нажмите кнопку Помощь, чтобы увидеть способы решения проблемы.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="425"/>
<location filename="../gui/main.qml" line="435"/>
<source>Click the Help button for more information.</source>
<translation>Нажмите кнопку Помощь, чтобы увидеть больше информации.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="443"/>
<location filename="../gui/main.qml" line="453"/>
<source>Click the Help button for information on how to map your gamepads.</source>
<translation>Нажмите кнопку Помощь, чтобы узнать, как настроить геймпад.</translation>
</message>
<message>
<location filename="../gui/main.qml" line="451"/>
<location filename="../gui/main.qml" line="461"/>
<source>Are you sure you want to quit?</source>
<translation>Вы уверены, что хотите выйти?</translation>
</message>
<message>
<location filename="../gui/main.qml" line="481"/>
<location filename="../gui/main.qml" line="491"/>
<source>Enter the IP address of your GameStream PC:</source>
<translation>Введите IP-адрес компьютера с включённым NVIDIA GameStream:</translation>
</message>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
+206 -155
View File
@@ -93,7 +93,7 @@
<context>
<name>NvHTTP</name>
<message>
<location filename="../backend/nvhttp.cpp" line="327"/>
<location filename="../backend/nvhttp.cpp" line="378"/>
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
<translation>缺少音频捕获设备。重新安装 GeForce Experience 可以解决此错误。</translation>
</message>
@@ -173,7 +173,7 @@
<message>
<location filename="../gui/PcView.qml" line="224"/>
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
<translation type="unfinished"></translation>
<translation>在 %1 上已安装的GeForce Experience版本不支持当前版本的Moonlight。你必须升级Moonlight才能从 %1 串流。</translation>
</message>
<message>
<location filename="../gui/PcView.qml" line="247"/>
@@ -234,7 +234,7 @@
<context>
<name>PendingQuitTask</name>
<message>
<location filename="../backend/computermanager.cpp" line="542"/>
<location filename="../backend/computermanager.cpp" line="540"/>
<source>The running game wasn&apos;t started by this PC. You must quit the game on the host PC manually or use the device that originally started the game.</source>
<translation>正在运行的游戏不是由这台计算机启动的。你必须在目标计算机上手动退出游戏或使用最初启动游戏的设备。</translation>
</message>
@@ -276,147 +276,160 @@
<context>
<name>Session</name>
<message>
<location filename="../streaming/session.cpp" line="89"/>
<location filename="../streaming/session.cpp" line="91"/>
<source>No video received from host.</source>
<translation>没有从目标计算机接收到视频画面。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="90"/>
<location filename="../streaming/session.cpp" line="92"/>
<source>Check your firewall and port forwarding rules for port(s): %1</source>
<translation>检查防火墙和端口转发规则: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="95"/>
<location filename="../streaming/session.cpp" line="97"/>
<source>Your network connection isn&apos;t performing well. Reduce your video bitrate setting or try a faster connection.</source>
<translation>网络连接性能不佳。请降低视频比特率或尝试更快的网络连接。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="100"/>
<location filename="../streaming/session.cpp" line="102"/>
<source>Something went wrong on your host PC when starting the stream.</source>
<translation>目标计算机启动流式传输时出现问题。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="101"/>
<location filename="../streaming/session.cpp" line="103"/>
<source>Make sure you don&apos;t have any DRM-protected content open on your host PC. You can also try restarting your host PC.</source>
<translation>确保目标计算机上没有打开任何受 DRM 保护的内容。你也可以尝试重新启动目标计算机。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="102"/>
<location filename="../streaming/session.cpp" line="104"/>
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
<translation>如果问题仍然存在,请尝试重新安装显卡驱动程序和 GeForce Experience。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="107"/>
<location filename="../streaming/session.cpp" line="109"/>
<source>Connection terminated</source>
<translation>会话已终止</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="592"/>
<location filename="../streaming/session.cpp" line="661"/>
<source>The version of GeForce Experience on %1 is not supported by this build of Moonlight. You must update Moonlight to stream from %1.</source>
<translation type="unfinished"></translation>
<translation>%1 上的 GeForce Experience 版本不受当前版本的 Moonlight 支持。你必须更新 Moonlight才能从 %1 串流。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="597"/>
<location filename="../streaming/session.cpp" line="666"/>
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
<translation>启用远程桌面鼠标模式可能会导致游戏出现问题。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="602"/>
<location filename="../streaming/session.cpp" line="671"/>
<source>HDR is not supported with software decoding.</source>
<translation>软件解码不支持 HDR。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="606"/>
<location filename="../streaming/session.cpp" line="675"/>
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
<translation>你选择的用于强制软件解码的设置可能会导致流式传输性能不佳。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="611"/>
<location filename="../streaming/session.cpp" line="680"/>
<source>Using unsupported FPS options may cause stuttering or lag.</source>
<translation>使用不受支持的 FPS 选项可能会导致卡顿或延迟。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="614"/>
<location filename="../streaming/session.cpp" line="683"/>
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
<translation>当流式传输的帧率高于显示时,垂直同步将被禁用。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="631"/>
<location filename="../streaming/session.cpp" line="710"/>
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
<translation>根据你的选择使用软件解码,以在没有显卡支持的情况下强制 HEVC。这可能会导致流式传输性能不佳。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="634"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC decoding.</source>
<translation>此计算机的显卡不支持 HEVC 解码。</translation>
<translation type="vanished">此计算机的显卡不支持 HEVC 解码。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="641"/>
<location filename="../streaming/session.cpp" line="693"/>
<source>Your host PC GPU doesn&apos;t support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
<translation>目标计算机的显卡不支持 HEVC。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="658"/>
<source>%1 doesn&apos;t support HDR10.</source>
<translation>%1 不支持 HDR10。</translation>
<location filename="../streaming/session.cpp" line="724"/>
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
<translation>使用软件解码,因为你选择强制使用没有 GPU 支持的H.264。这可能会导致较差的流性能。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="662"/>
<location filename="../streaming/session.cpp" line="734"/>
<source>Your host PC and client PC don&apos;t support the same video codecs. This may cause poor streaming performance.</source>
<translation>你的主机和客户端 PC 不支持相同的视频编解码器。这可能会导致较差的流性能。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<source>Your client GPU doesn&apos;t support H.264 decoding. This may cause poor streaming performance.</source>
<translation>你的客户端 GPU 不支持 H.264 解码。这可能会导致较差的流性能。</translation>
</message>
<message>
<source>%1 doesn&apos;t support HDR10.</source>
<translation type="vanished">%1 不支持 HDR10。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="748"/>
<source>Your host PC GPU doesn&apos;t support HDR streaming. A GeForce GTX 1000-series (Pascal) or later GPU is required for HDR streaming.</source>
<translation>目标计算机的显卡不支持 HDR 流。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="671"/>
<location filename="../streaming/session.cpp" line="757"/>
<source>This PC&apos;s GPU doesn&apos;t support HEVC Main10 decoding for HDR streaming.</source>
<translation>此计算机的显卡不支持 HEVC Main10 解码 HDR 流。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="684"/>
<location filename="../streaming/session.cpp" line="770"/>
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
<translation>4K 流式传输需要 GeForce Experience 3.0 或更高版本。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="699"/>
<location filename="../streaming/session.cpp" line="785"/>
<source>Your selected surround sound setting is not supported by the current audio device.</source>
<translation>当前音频设备不支持你选择的环绕声设置。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="706"/>
<location filename="../streaming/session.cpp" line="792"/>
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
<translation>无法打开音频设备。音频在此会话期间将不可用。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="711"/>
<location filename="../streaming/session.cpp" line="797"/>
<source>An attached gamepad has no mapping and won&apos;t be usable. Visit the Moonlight help to resolve this.</source>
<translation>附加的手柄没有映射,因此无法使用。请访问 Moonlight 帮助解决此问题。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="719"/>
<location filename="../streaming/session.cpp" line="805"/>
<source>Your host PC&apos;s GPU doesn&apos;t support streaming video resolutions over 4K.</source>
<translation>目标计算机的显卡不支持 4K 以上的流式传输视频分辨率。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="723"/>
<location filename="../streaming/session.cpp" line="809"/>
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
<translation>只有 HEVC 编解码器才支持 4K 以上的视频分辨率。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="737"/>
<location filename="../streaming/session.cpp" line="823"/>
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC&apos;s GPU.</source>
<translation>由于此计算机的显卡上缺少硬件解码支持,无法满足强制硬件解码的选择。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="740"/>
<location filename="../streaming/session.cpp" line="826"/>
<source>Your codec selection and force hardware decoding setting are not compatible. This PC&apos;s GPU lacks support for decoding your chosen codec.</source>
<translation>你选择的编解码器和强制硬件解码设置不兼容。此计算机的显卡不支持解码你选择的编解码器。</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1041"/>
<location filename="../streaming/session.cpp" line="1165"/>
<source>GeForce Experience returned error: %1</source>
<translation>GeForce Experience 返回错误: %1</translation>
</message>
<message>
<location filename="../streaming/session.cpp" line="1519"/>
<location filename="../streaming/session.cpp" line="1714"/>
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
<translation>无法初始化视频解码器。请检查你的流式传输设置,然后重试。</translation>
</message>
@@ -429,264 +442,299 @@
<translation>设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="60"/>
<location filename="../gui/SettingsView.qml" line="62"/>
<source>Basic Settings</source>
<translation>基本设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="70"/>
<location filename="../gui/SettingsView.qml" line="72"/>
<source>Resolution and FPS</source>
<translation>分辨率和 FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="78"/>
<location filename="../gui/SettingsView.qml" line="80"/>
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
<translation>如果你的计算机或网络连接设置的值过高,可能会导致延迟,卡顿或错误。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="209"/>
<location filename="../gui/SettingsView.qml" line="211"/>
<source>720p</source>
<translation>720p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="215"/>
<location filename="../gui/SettingsView.qml" line="217"/>
<source>1080p</source>
<translation>1080p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="221"/>
<location filename="../gui/SettingsView.qml" line="223"/>
<source>1440p</source>
<translation>1440p</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="227"/>
<location filename="../gui/SettingsView.qml" line="229"/>
<source>4K</source>
<translation>4K</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="331"/>
<location filename="../gui/SettingsView.qml" line="333"/>
<source>Custom resolutions are not officially supported by GeForce Experience, so it will not set your host display resolution. You will need to set it manually while in game.</source>
<translation>自定义分辨率不受 GeForce Experience 的正式支持,因此不会设置目标计算机的分辨率。你需要在游戏中手动设置。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="332"/>
<location filename="../gui/SettingsView.qml" line="334"/>
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
<translation>使用当前计算机或目标计算机不支持的分辨率可能会导致流式传输错误。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="338"/>
<location filename="../gui/SettingsView.qml" line="340"/>
<source>Enter a custom resolution:</source>
<translation>输入自定义分辨率:</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="406"/>
<location filename="../gui/SettingsView.qml" line="407"/>
<location filename="../gui/SettingsView.qml" line="427"/>
<location filename="../gui/SettingsView.qml" line="430"/>
<location filename="../gui/SettingsView.qml" line="408"/>
<location filename="../gui/SettingsView.qml" line="409"/>
<location filename="../gui/SettingsView.qml" line="429"/>
<location filename="../gui/SettingsView.qml" line="432"/>
<source>%1 FPS</source>
<translation>%1 FPS</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="412"/>
<location filename="../gui/SettingsView.qml" line="415"/>
<location filename="../gui/SettingsView.qml" line="424"/>
<location filename="../gui/SettingsView.qml" line="437"/>
<location filename="../gui/SettingsView.qml" line="440"/>
<location filename="../gui/SettingsView.qml" line="414"/>
<location filename="../gui/SettingsView.qml" line="417"/>
<location filename="../gui/SettingsView.qml" line="426"/>
<location filename="../gui/SettingsView.qml" line="439"/>
<location filename="../gui/SettingsView.qml" line="442"/>
<source>%1 FPS (Unsupported)</source>
<translation>%1 FPS (不支持)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="493"/>
<location filename="../gui/SettingsView.qml" line="496"/>
<source>Video bitrate:</source>
<translation>视频比特率:</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="501"/>
<location filename="../gui/SettingsView.qml" line="504"/>
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
<translation>在较慢的连接上降低比特率。提高比特率以提高图像质量。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="519"/>
<location filename="../gui/SettingsView.qml" line="522"/>
<source>Video bitrate: %1 Mbps</source>
<translation>视频比特率: %1 Mbps</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="527"/>
<location filename="../gui/SettingsView.qml" line="530"/>
<source>Display mode</source>
<translation>显示模式</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="545"/>
<location filename="../gui/SettingsView.qml" line="560"/>
<source> (Recommended)</source>
<translation> (推荐)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="573"/>
<location filename="../gui/SettingsView.qml" line="860"/>
<location filename="../gui/SettingsView.qml" line="541"/>
<location filename="../gui/SettingsView.qml" line="948"/>
<source>Fullscreen</source>
<translation>全屏</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="577"/>
<location filename="../gui/SettingsView.qml" line="546"/>
<source>Borderless windowed</source>
<translation>无边框窗口</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="581"/>
<location filename="../gui/SettingsView.qml" line="852"/>
<location filename="../gui/SettingsView.qml" line="551"/>
<location filename="../gui/SettingsView.qml" line="940"/>
<source>Windowed</source>
<translation>窗口化</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="592"/>
<location filename="../gui/SettingsView.qml" line="610"/>
<source>Fullscreen generally provides the best performance, but borderless windowed may work better with features like macOS Spaces, Alt+Tab, screenshot tools, on-screen overlays, etc.</source>
<translation>全屏通常提供最好的性能,但是无边框窗口可以更好地与 macOS Spaces、Alt+Tab、屏幕截图工具、屏幕覆盖等功能配合使用。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="599"/>
<location filename="../gui/SettingsView.qml" line="617"/>
<source>V-Sync</source>
<translation>垂直同步</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="609"/>
<location filename="../gui/SettingsView.qml" line="627"/>
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
<translation>禁用垂直同步可允许子帧渲染延迟,但会显示可见的撕裂</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="616"/>
<location filename="../gui/SettingsView.qml" line="634"/>
<source>Frame pacing</source>
<translation>帧速调节</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="626"/>
<location filename="../gui/SettingsView.qml" line="644"/>
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
<translation>通过延迟过早进入的帧来减少卡顿</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="636"/>
<location filename="../gui/SettingsView.qml" line="654"/>
<source>Audio Settings</source>
<translation>音频设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="646"/>
<location filename="../gui/SettingsView.qml" line="664"/>
<source>Audio configuration</source>
<translation>音频配置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="671"/>
<location filename="../gui/SettingsView.qml" line="689"/>
<source>Stereo</source>
<translation>立体声</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="675"/>
<location filename="../gui/SettingsView.qml" line="693"/>
<source>5.1 surround sound</source>
<translation>5.1 环绕声</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="679"/>
<location filename="../gui/SettingsView.qml" line="697"/>
<source>7.1 surround sound</source>
<translation>7.1 环绕声</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="693"/>
<location filename="../gui/SettingsView.qml" line="711"/>
<source>Mute host PC speakers while streaming</source>
<translation>流式传输启动时将目标计算机的扬声器静音</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="703"/>
<location filename="../gui/SettingsView.qml" line="721"/>
<source>You must restart any game currently in progress for this setting to take effect</source>
<translation>要使此设置生效,必须重新启动当前正在进行的所有游戏</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="709"/>
<location filename="../gui/SettingsView.qml" line="727"/>
<source>Mute audio stream when Moonlight is not the active window</source>
<translation>当 Moonlight 失去焦点时静音</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="720"/>
<location filename="../gui/SettingsView.qml" line="738"/>
<source>Mutes Moonlight&apos;s audio when you Alt+Tab out of the stream or click on a different window.</source>
<translation>当你用 Alt+Tab 键离开流式传输或者点击其他窗口时,Moonlight 将静音。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="729"/>
<location filename="../gui/SettingsView.qml" line="747"/>
<source>UI Settings</source>
<translation>界面设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="739"/>
<location filename="../gui/SettingsView.qml" line="757"/>
<source>Language</source>
<translation>语言</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="765"/>
<location filename="../gui/SettingsView.qml" line="783"/>
<source>Automatic</source>
<translation>自动化</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="805"/>
<location filename="../gui/SettingsView.qml" line="890"/>
<source>You must restart Moonlight for this change to take effect</source>
<translation>你必须重新启动 Moonlight 才能使更改生效</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="819"/>
<location filename="../gui/SettingsView.qml" line="907"/>
<source>GUI display mode</source>
<translation>窗口显示模式</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="856"/>
<location filename="../gui/SettingsView.qml" line="944"/>
<source>Maximized</source>
<translation>最大化</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="873"/>
<location filename="../gui/SettingsView.qml" line="961"/>
<source>Show connection quality warnings</source>
<translation>显示连接质量警告</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="885"/>
<location filename="../gui/SettingsView.qml" line="973"/>
<source>Discord Rich Presence integration</source>
<translation>Discord Rich Presence 集成</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="895"/>
<location filename="../gui/SettingsView.qml" line="983"/>
<source>Updates your Discord status to display the name of the game you&apos;re streaming.</source>
<translation>更新你的 Discord 状态,以显示正在运行的游戏名称。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="913"/>
<location filename="../gui/SettingsView.qml" line="989"/>
<source>Keep the display awake while streaming</source>
<translation>在串流时保持屏幕开启</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="999"/>
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
<translation>防止串流时进入屏保或屏幕休眠。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1017"/>
<source>Input Settings</source>
<translation>输入设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="924"/>
<location filename="../gui/SettingsView.qml" line="1028"/>
<source>Optimize mouse for remote desktop instead of games</source>
<translation>为远程桌面而不是游戏优化鼠标</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="934"/>
<location filename="../gui/SettingsView.qml" line="1038"/>
<source>This enables seamless mouse control without capturing the client&apos;s mouse cursor. It is ideal for remote desktop usage but will not work in most games.</source>
<translation>这可以实现无缝鼠标控制,而无需捕获客户端的鼠标光标。这是理想的远程桌面使用方案,但不会在大多数游戏中工作。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="935"/>
<location filename="../gui/SettingsView.qml" line="1039"/>
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
<translation>你可以使用 Ctrl+Alt+Shift+M 切换鼠标控制模式。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="936"/>
<location filename="../gui/SettingsView.qml" line="1040"/>
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
<translation>注意:由于 GeForce Experience 的 Bug,如果你的目标计算机有多个显示器,则此选项可能无法正常工作。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="946"/>
<location filename="../gui/SettingsView.qml" line="1050"/>
<source>Capture system keyboard shortcuts</source>
<translation>捕获系统快捷键</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="954"/>
<location filename="../gui/SettingsView.qml" line="1058"/>
<source>This enables the capture of system-wide keyboard shortcuts like Alt+Tab that would normally be handled by the client OS while streaming.</source>
<translation>这样可以捕获系统范围的键盘快捷键,例如 Alt + Tab,这些快捷键通常在流式传输时由客户端系统处理。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1356"/>
<source>Enabling HDR overrides manual decoder selections.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1425"/>
<source>Enabling HDR overrides manual codec selections.</source>
<translation>启用HDR将覆盖编码器选择设置。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1431"/>
<source>Enable HDR (Experimental)</source>
<translation>启用HDR(实验性)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1442"/>
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
<translation>HDR功能将在串流中可用,但一些游戏可能需要PC端接入HDR显示器以启用HDR模式。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1444"/>
<source>HDR streaming is not supported on this PC.</source>
<translation>此PC不支持HDR。</translation>
</message>
<message>
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
<translation type="vanished">在全屏流式传输时捕获系统键盘快捷键</translation>
@@ -696,158 +744,162 @@
<translation type="vanished">这允许捕获系统范围内的键盘快捷键(如Alt+Tab),这些快捷键通常在全屏流式传输时由客户端操作系统处理。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="955"/>
<location filename="../gui/SettingsView.qml" line="1059"/>
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
<translation>注意:Windows 上的某些键盘快捷键(如 Ctrl+Alt+Del)不能被任何应用程序截获,包括 Moonlight。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="984"/>
<location filename="../gui/SettingsView.qml" line="1088"/>
<source>in fullscreen</source>
<translation>全屏</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="988"/>
<location filename="../gui/SettingsView.qml" line="1092"/>
<source>always</source>
<translation>总是</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1018"/>
<location filename="../gui/SettingsView.qml" line="1122"/>
<source>Use touchscreen as a virtual trackpad</source>
<translation>将触摸屏用作虚拟触控板</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1028"/>
<location filename="../gui/SettingsView.qml" line="1132"/>
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
<translation>选中时,触摸屏就像一个触控板。取消选中时,触摸屏将直接控制鼠标指针。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1035"/>
<location filename="../gui/SettingsView.qml" line="1139"/>
<source>Swap left and right mouse buttons</source>
<translation>交换鼠标左键和右键</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1047"/>
<location filename="../gui/SettingsView.qml" line="1151"/>
<source>Reverse mouse scrolling direction</source>
<translation>反转鼠标滚动方向</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1061"/>
<location filename="../gui/SettingsView.qml" line="1165"/>
<source>Gamepad Settings</source>
<translation>手柄设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1071"/>
<location filename="../gui/SettingsView.qml" line="1175"/>
<source>Swap A/B and X/Y gamepad buttons</source>
<translation>交换手柄的 A/B 和 X/Y 按钮</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1089"/>
<location filename="../gui/SettingsView.qml" line="1193"/>
<source>This switches gamepads into a Nintendo-style button layout</source>
<translation>这会将手柄切换为任天堂风格的按钮布局</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1095"/>
<location filename="../gui/SettingsView.qml" line="1199"/>
<source>Force gamepad #1 always connected</source>
<translation>强制手柄 #1 始终连接</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1105"/>
<location filename="../gui/SettingsView.qml" line="1209"/>
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
<translation>强制单个手柄始终与目标计算机保持连接,即使没有任何手柄实际连接到此计算机。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1106"/>
<location filename="../gui/SettingsView.qml" line="1210"/>
<source>Only enable this option when streaming a game that doesn&apos;t support gamepads being connected after startup.</source>
<translation>仅在游戏启动后不支持手柄连接时才启用此选项。</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1113"/>
<location filename="../gui/SettingsView.qml" line="1217"/>
<source>Enable mouse control with gamepads by holding the &apos;Start&apos; button</source>
<translation>按住手柄的“Start”按钮启用鼠标控制</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1124"/>
<location filename="../gui/SettingsView.qml" line="1228"/>
<source>Process gamepad input when Moonlight is in the background</source>
<translation>当 Moonlight 在后台时处理手柄输入</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1135"/>
<location filename="../gui/SettingsView.qml" line="1239"/>
<source>Allows Moonlight to capture gamepad inputs even if it&apos;s not the current window in focus</source>
<translation>即使不是焦点窗口,也允许 Moonlight 捕获手柄的输入</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1144"/>
<location filename="../gui/SettingsView.qml" line="1248"/>
<source>Host Settings</source>
<translation>目标计算机设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1154"/>
<location filename="../gui/SettingsView.qml" line="1258"/>
<source>Optimize game settings for streaming</source>
<translation>优化游戏设置以进行流式传输</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1165"/>
<location filename="../gui/SettingsView.qml" line="1269"/>
<source>Quit app on host PC after ending stream</source>
<translation>流式传输结束后退出目标计算机上的应用程序</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1175"/>
<location filename="../gui/SettingsView.qml" line="1279"/>
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
<translation>当你结束流式传输时,这将关闭正在运行的应用程序或游戏。这会导致你失去所有未保存的游戏进度!</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1184"/>
<location filename="../gui/SettingsView.qml" line="1288"/>
<source>Advanced Settings</source>
<translation>高级设置</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1194"/>
<location filename="../gui/SettingsView.qml" line="1298"/>
<source>Video decoder</source>
<translation>视频解码器</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1219"/>
<location filename="../gui/SettingsView.qml" line="1265"/>
<location filename="../gui/SettingsView.qml" line="1324"/>
<location filename="../gui/SettingsView.qml" line="1393"/>
<source>Automatic (Recommended)</source>
<translation>自动 (推荐)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1223"/>
<location filename="../gui/SettingsView.qml" line="1328"/>
<source>Force software decoding</source>
<translation>强制软件解码</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1227"/>
<location filename="../gui/SettingsView.qml" line="1332"/>
<source>Force hardware decoding</source>
<translation>强制硬件解码</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1240"/>
<location filename="../gui/SettingsView.qml" line="1362"/>
<source>Video codec</source>
<translation>视频编解码器</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1269"/>
<location filename="../gui/SettingsView.qml" line="1397"/>
<source>H.264</source>
<translation>H.264</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1273"/>
<location filename="../gui/SettingsView.qml" line="1401"/>
<source>HEVC (H.265)</source>
<translation>HEVC (H.265)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1290"/>
<source>HEVC HDR (Experimental)</source>
<translation type="vanished">HEVC HDR (实验性)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1450"/>
<source>Unlock unsupported FPS options</source>
<translation>解锁不受支持的 FPS 选项</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1309"/>
<location filename="../gui/SettingsView.qml" line="1469"/>
<source>Automatically find PCs on the local network (Recommended)</source>
<translation>自动在本地网络上查找计算机 (推荐)</translation>
</message>
<message>
<location filename="../gui/SettingsView.qml" line="1334"/>
<location filename="../gui/SettingsView.qml" line="1494"/>
<source>Automatically detect blocked connections (Recommended)</source>
<translation>自动检测被阻止的连接 (推荐)</translation>
</message>
@@ -881,22 +933,22 @@
<translation>此计算机的互联网连接被阻塞。当连接到此网络时,互联网上的流式传输可能无法工作。</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Tip:</source>
<translation>提示:</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="161"/>
<location filename="../gui/StreamSegue.qml" line="165"/>
<source>Press %1 to disconnect your session</source>
<translation>按 %1 来断开会话</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Start+Select+L1+R1</source>
<translation>Start+Select+L1+R1</translation>
</message>
<message>
<location filename="../gui/StreamSegue.qml" line="162"/>
<location filename="../gui/StreamSegue.qml" line="166"/>
<source>Ctrl+Alt+Shift+Q</source>
<translation>Ctrl+Alt+Shift+Q</translation>
</message>
@@ -904,95 +956,94 @@
<context>
<name>main</name>
<message>
<location filename="../gui/main.qml" line="254"/>
<location filename="../gui/main.qml" line="264"/>
<location filename="../gui/main.qml" line="393"/>
<location filename="../gui/main.qml" line="408"/>
<location filename="../gui/main.qml" line="418"/>
<source>Settings</source>
<translation>设置</translation>
</message>
<message>
<location filename="../gui/main.qml" line="255"/>
<location filename="../gui/main.qml" line="265"/>
<source>Version %1</source>
<translation>版本 %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="271"/>
<location filename="../gui/main.qml" line="281"/>
<source>Join our community on Discord</source>
<translation>加入我们的社区</translation>
</message>
<message>
<location filename="../gui/main.qml" line="283"/>
<source>Computers</source>
<translation>计算机列表</translation>
<translation type="vanished">计算机列表</translation>
</message>
<message>
<location filename="../gui/main.qml" line="290"/>
<location filename="../gui/main.qml" line="300"/>
<source>Add PC manually</source>
<translation>手动添加计算机</translation>
</message>
<message>
<location filename="../gui/main.qml" line="330"/>
<location filename="../gui/main.qml" line="340"/>
<source>Update available for Moonlight: Version %1</source>
<translation>Moonlight 可用更新:版本 %1</translation>
</message>
<message>
<location filename="../gui/main.qml" line="354"/>
<location filename="../gui/main.qml" line="364"/>
<source>Help</source>
<translation>帮助</translation>
</message>
<message>
<location filename="../gui/main.qml" line="377"/>
<location filename="../gui/main.qml" line="387"/>
<source>Gamepad Mapper</source>
<translation>手柄按键映射</translation>
</message>
<message>
<location filename="../gui/main.qml" line="381"/>
<source>Gamepad Mapping</source>
<translation>手柄按键映射</translation>
<translation type="vanished">手柄按键映射</translation>
</message>
<message>
<location filename="../gui/main.qml" line="425"/>
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation>Moonlight 未检测到有效的硬件加速视频解码器。在此配置中,你的流性能可能会严重下降。</translation>
</message>
<message>
<location filename="../gui/main.qml" line="415"/>
<source>No functioning hardware accelerated H.264 video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
<translation>Moonlight 未检测到功能正常的硬件加速 H.264 视频解码器。</translation>
<translation type="vanished">Moonlight 未检测到功能正常的硬件加速 H.264 视频解码器。</translation>
</message>
<message>
<location filename="../gui/main.qml" line="417"/>
<location filename="../gui/main.qml" line="427"/>
<source>Click the Help button for more information on solving this problem.</source>
<translation>单击帮助按钮以获取有关解决此问题的更多信息。</translation>
</message>
<message>
<location filename="../gui/main.qml" line="423"/>
<location filename="../gui/main.qml" line="433"/>
<source>Hardware acceleration doesn&apos;t work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
<translation>硬件加速在 XWayland 上不起作用。在 XWayland 上继续操作可能会导致流式传输性能下降。</translation>
</message>
<message>
<location filename="../gui/main.qml" line="425"/>
<location filename="../gui/main.qml" line="435"/>
<source>Click the Help button for more information.</source>
<translation>单击帮助按钮以获取更多信息。</translation>
</message>
<message>
<location filename="../gui/main.qml" line="432"/>
<location filename="../gui/main.qml" line="442"/>
<source>This version of Moonlight isn&apos;t optimized for your PC. Please download the &apos;%1&apos; version of Moonlight for the best streaming performance.</source>
<translation>此版本的 Moonlight 尚未针对你的计算机优化。请下载“%1”版本的 Moonlight,以获得最佳的流式传输性能。</translation>
</message>
<message>
<location filename="../gui/main.qml" line="441"/>
<location filename="../gui/main.qml" line="451"/>
<source>Moonlight detected gamepads without a mapping:</source>
<translation>Moonlight 检测到没有映射的手柄:</translation>
</message>
<message>
<location filename="../gui/main.qml" line="443"/>
<location filename="../gui/main.qml" line="453"/>
<source>Click the Help button for information on how to map your gamepads.</source>
<translation>单击帮助按钮以获取有关如何映射手柄的信息。</translation>
</message>
<message>
<location filename="../gui/main.qml" line="451"/>
<location filename="../gui/main.qml" line="461"/>
<source>Are you sure you want to quit?</source>
<translation>确定要退出吗?</translation>
</message>
<message>
<location filename="../gui/main.qml" line="481"/>
<location filename="../gui/main.qml" line="491"/>
<source>Enter the IP address of your GameStream PC:</source>
<translation>输入目标计算机的 IP 地址:</translation>
</message>
+26 -10
View File
@@ -22,7 +22,7 @@
#include "streaming/video/ffmpeg.h"
#endif
#if defined(Q_OS_WIN32) && defined(Q_PROCESSOR_X86)
#if defined(Q_OS_WIN32)
#include "antihookingprotection.h"
#elif defined(Q_OS_LINUX)
#include <openssl/ssl.h>
@@ -167,12 +167,22 @@ void ffmpegLogToDiskHandler(void* ptr, int level, const char* fmt, va_list vl)
return;
}
// We need to use the *previous* printPrefix value to determine whether to
// print the prefix this time. av_log_format_line() will set the printPrefix
// value to indicate whether the prefix should be printed *next time*.
bool shouldPrefixThisMessage = printPrefix != 0;
av_log_format_line(ptr, level, fmt, vl, lineBuffer, sizeof(lineBuffer), &printPrefix);
QTime logTime = QTime::fromMSecsSinceStartOfDay(s_LoggerTime.elapsed());
QString txt = QString("%1 - FFmpeg: %2").arg(logTime.toString()).arg(lineBuffer);
logToLoggerStream(txt);
if (shouldPrefixThisMessage) {
QTime logTime = QTime::fromMSecsSinceStartOfDay(s_LoggerTime.elapsed());
QString txt = QString("%1 - FFmpeg: %2").arg(logTime.toString()).arg(lineBuffer);
logToLoggerStream(txt);
}
else {
QString txt = QString(lineBuffer);
logToLoggerStream(txt);
}
}
#endif
@@ -288,10 +298,9 @@ int main(int argc, char *argv[])
SetUnhandledExceptionFilter(UnhandledExceptionHandler);
#endif
#if defined(Q_OS_WIN32) && defined(Q_PROCESSOR_X86)
#if defined(Q_OS_WIN32)
// Force AntiHooking.dll to be statically imported and loaded
// by ntdll on x86/x64 platforms by calling a dummy function.
// AntiHooking.dll is not currently built for ARM64.
// by ntdll on Win32 platforms by calling a dummy function.
AntiHookingDummyImport();
#elif defined(Q_OS_LINUX)
// Force libssl.so to be directly linked to our binary, so
@@ -442,9 +451,15 @@ int main(int argc, char *argv[])
// the mouse motion exactly how it was given to us.
SDL_SetHint("SDL_MOUSE_RELATIVE_SCALING", "0");
// Set our app name for SDL to use with PulseAudio. This matches what we provide
// as our app name to libsoundio too.
// Set our app name for SDL to use with PulseAudio and PipeWire. This matches what we
// provide as our app name to libsoundio too. On SDL 2.0.18+, SDL_APP_NAME is also used
// for screensaver inhibitor reporting.
SDL_SetHint("SDL_AUDIO_DEVICE_APP_NAME", "Moonlight");
SDL_SetHint("SDL_APP_NAME", "Moonlight");
// We handle capturing the mouse ourselves when it leaves the window, so we don't need
// SDL doing it for us behind our backs.
SDL_SetHint("SDL_MOUSE_AUTO_CAPTURE", "0");
#ifdef QT_DEBUG
// Allow thread naming using exceptions on debug builds. SDL doesn't use SEH
@@ -464,6 +479,7 @@ int main(int argc, char *argv[])
if (WMUtils::isRunningWayland() && QGuiApplication::platformName() == "xcb") {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Detected XWayland. This will probably break hardware decoding! Try running with QT_QPA_PLATFORM=wayland or switch to X11.");
qputenv("SDL_VIDEODRIVER", "x11");
}
else if (QGuiApplication::platformName().startsWith("wayland")) {
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Detected Wayland");
+40
View File
@@ -29,6 +29,41 @@
<file>languages/qml_ru.qm</file>
<file>languages/qml_es.ts</file>
<file>languages/qml_es.qm</file>
<file>languages/qml_ja.ts</file>
<file>languages/qml_ja.qm</file>
<file>languages/qml_vi.ts</file>
<file>languages/qml_vi.qm</file>
<file>languages/qml_th.ts</file>
<file>languages/qml_th.qm</file>
<file>languages/qml_ko.ts</file>
<file>languages/qml_ko.qm</file>
<file>languages/qml_hu.ts</file>
<file>languages/qml_hu.qm</file>
<file>languages/qml_nl.ts</file>
<file>languages/qml_nl.qm</file>
<file>languages/qml_sv.ts</file>
<file>languages/qml_sv.qm</file>
<file>languages/qml_tr.ts</file>
<file>languages/qml_tr.qm</file>
<file>languages/qml_uk.ts</file>
<file>languages/qml_uk.qm</file>
<file>languages/qml_zh_Hant.ts</file>
<file>languages/qml_zh_Hant.qm</file>
<file>languages/qml_el.ts</file>
<file>languages/qml_el.qm</file>
<file>languages/qml_hi.ts</file>
<file>languages/qml_hi.qm</file>
<file>languages/qml_it.ts</file>
<file>languages/qml_it.qm</file>
<file>languages/qml_pt.ts</file>
<file>languages/qml_pt.qm</file>
<file>languages/qml_pl.ts</file>
<file>languages/qml_pl.qm</file>
<file>languages/qml_cs.ts</file>
<file>languages/qml_cs.qm</file>
<!-- Don't include pt_BR until it is more complete -->
<!--file>languages/qml_pt_BR.qm</file-->
<!--file>languages/qml_pt_BR.ts</file-->
</qresource>
<qresource prefix="/data">
<file alias="gamecontrollerdb.txt">SDL_GameControllerDB/gamecontrollerdb.txt</file>
@@ -39,5 +74,10 @@
<file alias="egl_opaque.vert">shaders/egl_opaque.vert</file>
<file alias="egl_overlay.frag">shaders/egl_overlay.frag</file>
<file alias="egl_overlay.vert">shaders/egl_overlay.vert</file>
<file alias="d3d11_vertex.fxc">shaders/d3d11_vertex.fxc</file>
<file alias="d3d11_overlay_pixel.fxc">shaders/d3d11_overlay_pixel.fxc</file>
<file alias="d3d11_genyuv_pixel.fxc">shaders/d3d11_genyuv_pixel.fxc</file>
<file alias="d3d11_bt601lim_pixel.fxc">shaders/d3d11_bt601lim_pixel.fxc</file>
<file alias="d3d11_bt2020lim_pixel.fxc">shaders/d3d11_bt2020lim_pixel.fxc</file>
</qresource>
</RCC>
+52 -3
View File
@@ -1,4 +1,5 @@
#include "streamingpreferences.h"
#include "utils.h"
#include <QSettings>
#include <QTranslator>
@@ -41,9 +42,10 @@
#define SER_REVERSESCROLL "reversescroll"
#define SER_SWAPFACEBUTTONS "swapfacebuttons"
#define SER_CAPTURESYSKEYS "capturesyskeys"
#define SER_KEEPAWAKE "keepawake"
#define SER_LANGUAGE "language"
#define CURRENT_DEFAULT_VER 1
#define CURRENT_DEFAULT_VER 2
StreamingPreferences::StreamingPreferences(QObject *parent)
: QObject(parent),
@@ -68,7 +70,13 @@ void StreamingPreferences::reload()
#ifdef Q_OS_DARWIN
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN_DESKTOP;
#else
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN;
// Wayland doesn't support modesetting, so use fullscreen desktop mode.
if (WMUtils::isRunningWayland()) {
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN_DESKTOP;
}
else {
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN;
}
#endif
width = settings.value(SER_WIDTH, 1280).toInt();
@@ -95,6 +103,7 @@ void StreamingPreferences::reload()
backgroundGamepad = settings.value(SER_BACKGROUNDGAMEPAD, false).toBool();
reverseScrollDirection = settings.value(SER_REVERSESCROLL, false).toBool();
swapFaceButtons = settings.value(SER_SWAPFACEBUTTONS, false).toBool();
keepAwake = settings.value(SER_KEEPAWAKE, true).toBool();
captureSysKeysMode = static_cast<CaptureSysKeysMode>(settings.value(SER_CAPTURESYSKEYS,
static_cast<int>(CaptureSysKeysMode::CSK_OFF)).toInt());
audioConfig = static_cast<AudioConfig>(settings.value(SER_AUDIOCFG,
@@ -115,7 +124,7 @@ void StreamingPreferences::reload()
// Perform default settings updates as required based on last default version
if (defaultVer == 0) {
if (defaultVer < 1) {
#ifdef Q_OS_DARWIN
// Update window mode setting on macOS from full-screen (old default) to borderless windowed (new default)
if (windowMode == WindowMode::WM_FULLSCREEN) {
@@ -123,6 +132,11 @@ void StreamingPreferences::reload()
}
#endif
}
if (defaultVer < 2) {
if (windowMode == WindowMode::WM_FULLSCREEN && WMUtils::isRunningWayland()) {
windowMode = WindowMode::WM_FULLSCREEN_DESKTOP;
}
}
}
bool StreamingPreferences::retranslate()
@@ -195,6 +209,40 @@ QString StreamingPreferences::getSuffixFromLanguage(StreamingPreferences::Langua
return "ru";
case LANG_ES:
return "es";
case LANG_JA:
return "ja";
case LANG_VI:
return "vi";
case LANG_TH:
return "th";
case LANG_KO:
return "ko";
case LANG_HU:
return "hu";
case LANG_NL:
return "nl";
case LANG_SV:
return "sv";
case LANG_TR:
return "tr";
case LANG_UK:
return "uk";
case LANG_ZH_HANT:
return "zh_Hant";
case LANG_PT:
return "pt";
case LANG_PT_BR:
return "pt_BR";
case LANG_EL:
return "el";
case LANG_IT:
return "it";
case LANG_HI:
return "hi";
case LANG_PL:
return "pl";
case LANG_CS:
return "cs";
case LANG_AUTO:
default:
return QLocale::system().name();
@@ -237,6 +285,7 @@ void StreamingPreferences::save()
settings.setValue(SER_REVERSESCROLL, reverseScrollDirection);
settings.setValue(SER_SWAPFACEBUTTONS, swapFaceButtons);
settings.setValue(SER_CAPTURESYSKEYS, captureSysKeysMode);
settings.setValue(SER_KEEPAWAKE, keepAwake);
}
int StreamingPreferences::getDefaultBitrate(int width, int height, int fps)
+21 -1
View File
@@ -72,7 +72,24 @@ public:
LANG_DE,
LANG_NB_NO,
LANG_RU,
LANG_ES
LANG_ES,
LANG_JA,
LANG_VI,
LANG_TH,
LANG_KO,
LANG_HU,
LANG_NL,
LANG_SV,
LANG_TR,
LANG_UK,
LANG_ZH_HANT,
LANG_PT,
LANG_PT_BR,
LANG_EL,
LANG_IT,
LANG_HI,
LANG_PL,
LANG_CS,
};
Q_ENUM(Language);
@@ -113,6 +130,7 @@ public:
Q_PROPERTY(bool backgroundGamepad MEMBER backgroundGamepad NOTIFY backgroundGamepadChanged)
Q_PROPERTY(bool reverseScrollDirection MEMBER reverseScrollDirection NOTIFY reverseScrollDirectionChanged)
Q_PROPERTY(bool swapFaceButtons MEMBER swapFaceButtons NOTIFY swapFaceButtonsChanged)
Q_PROPERTY(bool keepAwake MEMBER keepAwake NOTIFY keepAwakeChanged)
Q_PROPERTY(CaptureSysKeysMode captureSysKeysMode MEMBER captureSysKeysMode NOTIFY captureSysKeysModeChanged)
Q_PROPERTY(Language language MEMBER language NOTIFY languageChanged);
@@ -142,6 +160,7 @@ public:
bool backgroundGamepad;
bool reverseScrollDirection;
bool swapFaceButtons;
bool keepAwake;
int packetSize;
AudioConfig audioConfig;
VideoCodecConfig videoCodecConfig;
@@ -180,6 +199,7 @@ signals:
void reverseScrollDirectionChanged();
void swapFaceButtonsChanged();
void captureSysKeysModeChanged();
void keepAwakeChanged();
void languageChanged();
private:
+6
View File
@@ -0,0 +1,6 @@
fxc /T vs_4_0_level_9_3 /Fo d3d11_vertex.fxc d3d11_vertex.hlsl
fxc /T ps_4_0_level_9_3 /Fo d3d11_overlay_pixel.fxc d3d11_overlay_pixel.hlsl
fxc /T ps_4_0_level_9_3 /Fo d3d11_genyuv_pixel.fxc d3d11_genyuv_pixel.hlsl
fxc /T ps_4_0_level_9_3 /Fo d3d11_bt601lim_pixel.fxc d3d11_bt601lim_pixel.hlsl
fxc /T ps_4_0_level_9_3 /Fo d3d11_bt2020lim_pixel.fxc d3d11_bt2020lim_pixel.hlsl
Binary file not shown.
+15
View File
@@ -0,0 +1,15 @@
#include "d3d11_video_pixel_start.hlsli"
static const min16float3x3 cscMatrix =
{
1.1644, 1.1644, 1.1644,
0.0, -0.1874, 2.1418,
1.6781, -0.6505, 0.0,
};
static const min16float3 offsets =
{
16.0 / 255.0, 128.0 / 255.0, 128.0 / 255.0
};
#include "d3d11_video_pixel_end.hlsli"
Binary file not shown.
+15
View File
@@ -0,0 +1,15 @@
#include "d3d11_video_pixel_start.hlsli"
static const min16float3x3 cscMatrix =
{
1.1644, 1.1644, 1.1644,
0.0, -0.3917, 2.0172,
1.5960, -0.8129, 0.0,
};
static const min16float3 offsets =
{
16.0 / 255.0, 128.0 / 255.0, 128.0 / 255.0
};
#include "d3d11_video_pixel_end.hlsli"
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
#include "d3d11_video_pixel_start.hlsli"
cbuffer CSC_CONST_BUF : register(b0)
{
min16float3x3 cscMatrix;
min16float3 offsets;
};
#include "d3d11_video_pixel_end.hlsli"
Binary file not shown.
+13
View File
@@ -0,0 +1,13 @@
Texture2D<min16float4> theTexture : register(t0);
SamplerState theSampler : register(s0);
struct ShaderInput
{
float4 pos : SV_POSITION;
float2 tex : TEXCOORD0;
};
min16float4 main(ShaderInput input) : SV_TARGET
{
return theTexture.Sample(theSampler, input.tex);
}
Binary file not shown.
+19
View File
@@ -0,0 +1,19 @@
struct ShaderInput
{
float2 pos : POSITION;
float2 tex : TEXCOORD0;
};
struct ShaderOutput
{
float4 pos : SV_POSITION;
float2 tex : TEXCOORD0;
};
ShaderOutput main(ShaderInput input)
{
ShaderOutput output;
output.pos = float4(input.pos, 0.0, 1.0);
output.tex = input.tex;
return output;
}
+13
View File
@@ -0,0 +1,13 @@
min16float4 main(ShaderInput input) : SV_TARGET
{
min16float3 yuv = min16float3(luminancePlane.Sample(theSampler, input.tex),
chrominancePlane.Sample(theSampler, input.tex));
// Subtract the YUV offset for limited vs full range
yuv -= offsets;
// Multiply by the conversion matrix for this colorspace
yuv = mul(yuv, cscMatrix);
return min16float4(yuv, 1.0);
}
@@ -0,0 +1,9 @@
Texture2D<min16float> luminancePlane : register(t0);
Texture2D<min16float2> chrominancePlane : register(t1);
SamplerState theSampler : register(s0);
struct ShaderInput
{
float4 pos : SV_POSITION;
float2 tex : TEXCOORD0;
};
+1 -10
View File
@@ -55,20 +55,11 @@ IAudioRenderer* Session::createAudioRenderer(const POPUS_MULTISTREAM_CONFIGURATI
TRY_INIT_RENDERER(SLAudioRenderer, opusConfig)
#endif
#if !defined(Q_OS_WIN32) && !defined(Q_OS_DARWIN)
// Linux defaults to SDL due to persistent glitching issues under libsoundio.
// Platforms that libsoundio doesn't support also default to SDL.
// Default to SDL and use libsoundio as a fallback
TRY_INIT_RENDERER(SdlAudioRenderer, opusConfig)
#ifdef HAVE_SOUNDIO
TRY_INIT_RENDERER(SoundIoAudioRenderer, opusConfig)
#endif
#else
// Windows and macOS default to libsoundio and fall back to SDL
#ifdef HAVE_SOUNDIO
TRY_INIT_RENDERER(SoundIoAudioRenderer, opusConfig)
#endif
TRY_INIT_RENDERER(SdlAudioRenderer, opusConfig)
#endif
return nullptr;
}
+6
View File
@@ -88,6 +88,12 @@ void* SdlAudioRenderer::getAudioBuffer(int*)
bool SdlAudioRenderer::submitAudio(int bytesWritten)
{
// Our device may enter a permanent error status upon removal, so we need
// to recreate the audio device to pick up the new default audio device.
if (SDL_GetAudioDeviceStatus(m_AudioDevice) == SDL_AUDIO_STOPPED) {
return false;
}
if (bytesWritten == 0) {
// Nothing to do
return true;
-190
View File
@@ -1,190 +0,0 @@
#include "input.h"
#include <QString>
int SdlInputHandler::clipboardThreadProc(void *ptr)
{
auto me = (SdlInputHandler*)ptr;
while (!SDL_AtomicGet(&me->m_ShutdownClipboardThread)) {
QString clipboardData;
SDL_LockMutex(me->m_ClipboardLock);
for (;;) {
clipboardData = me->m_ClipboardData;
me->m_ClipboardData.clear();
if (!clipboardData.isEmpty() || SDL_AtomicGet(&me->m_ShutdownClipboardThread)) {
break;
}
SDL_CondWait(me->m_ClipboardHasData, me->m_ClipboardLock);
}
SDL_UnlockMutex(me->m_ClipboardLock);
// We might get here on shutdown, so don't send text if there's
// nothing to send.
if (!clipboardData.isEmpty()) {
me->sendText(clipboardData);
}
}
return 0;
}
#define MAP_KEY(c, sc) \
case c: \
event.key.keysym.scancode = sc; \
break
#define MAP_KEY_SHIFT(c, sc) \
case c: \
event.key.keysym.scancode = sc; \
event.key.keysym.mod = KMOD_SHIFT; \
break
void SdlInputHandler::sendText(QString& string)
{
for (int i = 0; i < string.size(); i++) {
char16_t c = string[i].unicode();
SDL_Event event = {};
// If we're sending a very long string, we might get a termination request
// while we're in the middle of sending a string. In that case, just bail.
if (SDL_AtomicGet(&m_ShutdownClipboardThread)) {
return;
}
if (c >= 'A' && c <= 'Z') {
event.key.keysym.scancode = (SDL_Scancode)((c - 'A') + SDL_SCANCODE_A);
event.key.keysym.mod = KMOD_SHIFT;
}
else if (c >= 'a' && c <= 'z') {
event.key.keysym.scancode = (SDL_Scancode)((c - 'a') + SDL_SCANCODE_A);
}
else if (c >= '1' && c <= '9') {
event.key.keysym.scancode = (SDL_Scancode)((c - '1') + SDL_SCANCODE_1);
}
else {
// Fixup some Unicode characters to be expressible in ASCII
switch (c) {
case u'\U0000201C': // Left "
case u'\U0000201D': // Right "
c = '"';
break;
case u'\U00002018': // Left '
case u'\U00002019': // Right '
c = '\'';
break;
case u'\U00002013': // Smart -
c = '-';
break;
case u'\U00002026': // Ellipsis (...)
// Convert this character into 3 periods
string.insert(i+1, '.');
string.insert(i+1, '.');
c = '.';
break;
case u'\U000000A0': // Non-breaking space
c = ' ';
break;
default:
// Nothing
break;
}
switch (c) {
// Handle CRLF separately to avoid duplicate newlines
case '\r':
if (string[i + 1] == '\n') {
i++;
}
event.key.keysym.scancode = SDL_SCANCODE_RETURN;
break;
MAP_KEY('\b', SDL_SCANCODE_BACKSPACE);
MAP_KEY('\n', SDL_SCANCODE_RETURN);
MAP_KEY('\t', SDL_SCANCODE_TAB);
MAP_KEY(' ', SDL_SCANCODE_SPACE);
MAP_KEY_SHIFT('!', SDL_SCANCODE_1);
MAP_KEY_SHIFT('"', SDL_SCANCODE_APOSTROPHE);
MAP_KEY_SHIFT('#', SDL_SCANCODE_3);
MAP_KEY_SHIFT('$', SDL_SCANCODE_4);
MAP_KEY_SHIFT('%', SDL_SCANCODE_5);
MAP_KEY_SHIFT('&', SDL_SCANCODE_7);
MAP_KEY('\'', SDL_SCANCODE_APOSTROPHE);
MAP_KEY_SHIFT('(', SDL_SCANCODE_9);
MAP_KEY_SHIFT(')', SDL_SCANCODE_0);
MAP_KEY_SHIFT('*', SDL_SCANCODE_8);
MAP_KEY_SHIFT('+', SDL_SCANCODE_EQUALS);
MAP_KEY(',', SDL_SCANCODE_COMMA);
MAP_KEY('-', SDL_SCANCODE_MINUS);
MAP_KEY('.', SDL_SCANCODE_PERIOD);
MAP_KEY('/', SDL_SCANCODE_SLASH);
MAP_KEY('0', SDL_SCANCODE_0);
MAP_KEY_SHIFT(':', SDL_SCANCODE_SEMICOLON);
MAP_KEY(';', SDL_SCANCODE_SEMICOLON);
MAP_KEY_SHIFT('<', SDL_SCANCODE_COMMA);
MAP_KEY('=', SDL_SCANCODE_EQUALS);
MAP_KEY_SHIFT('>', SDL_SCANCODE_PERIOD);
MAP_KEY_SHIFT('?', SDL_SCANCODE_SLASH);
MAP_KEY_SHIFT('@', SDL_SCANCODE_2);
MAP_KEY('[', SDL_SCANCODE_LEFTBRACKET);
MAP_KEY('\\', SDL_SCANCODE_BACKSLASH);
MAP_KEY(']', SDL_SCANCODE_RIGHTBRACKET);
MAP_KEY_SHIFT('^', SDL_SCANCODE_6);
MAP_KEY_SHIFT('_', SDL_SCANCODE_MINUS);
MAP_KEY('`', SDL_SCANCODE_GRAVE);
MAP_KEY_SHIFT('{', SDL_SCANCODE_LEFTBRACKET);
MAP_KEY_SHIFT('|', SDL_SCANCODE_BACKSLASH);
MAP_KEY_SHIFT('}', SDL_SCANCODE_RIGHTBRACKET);
MAP_KEY_SHIFT('~', SDL_SCANCODE_GRAVE);
default:
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Pasting text - non-ASCII character value 'U+%x' ignored",
c);
continue;
}
}
if (event.key.keysym.mod & KMOD_SHIFT) {
SDL_Event modifierEvent = {};
modifierEvent.type = SDL_KEYDOWN;
modifierEvent.key.state = SDL_PRESSED;
modifierEvent.key.keysym.scancode = SDL_SCANCODE_LSHIFT;
handleKeyEvent(&modifierEvent.key);
SDL_Delay(10);
}
event.type = SDL_KEYDOWN;
event.key.state = SDL_PRESSED;
handleKeyEvent(&event.key);
SDL_Delay(10);
event.type = SDL_KEYUP;
event.key.state = SDL_RELEASED;
handleKeyEvent(&event.key);
if (event.key.keysym.mod & KMOD_SHIFT) {
SDL_Event modifierEvent = {};
modifierEvent.type = SDL_KEYUP;
modifierEvent.key.state = SDL_RELEASED;
modifierEvent.key.keysym.scancode = SDL_SCANCODE_LSHIFT;
handleKeyEvent(&modifierEvent.key);
SDL_Delay(10);
}
}
}
+3 -1
View File
@@ -357,7 +357,9 @@ void SdlInputHandler::handleControllerDeviceEvent(SDL_ControllerDeviceEvent* eve
state->controller = controller;
state->jsId = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(state->controller));
#if SDL_VERSION_ATLEAST(2, 0, 9)
#if SDL_VERSION_ATLEAST(2, 0, 18)
hapticCaps = SDL_GameControllerHasRumble(controller) ? ML_HAPTIC_GC_RUMBLE : 0;
#elif SDL_VERSION_ATLEAST(2, 0, 9)
// Perform a tiny rumble to see if haptics are supported.
// NB: We cannot use zeros for rumble intensity or SDL will not actually call the JS driver
// and we'll get a (potentially false) success value returned.
+14 -108
View File
@@ -21,6 +21,8 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int s
m_MousePositionLock(0),
m_MouseWasInVideoRegion(false),
m_PendingMouseButtonsAllUpOnVideoRegionLeave(false),
m_PointerRegionLockActive(false),
m_PointerRegionLockToggledByUser(false),
m_FakeCaptureActive(false),
m_CaptureSystemKeysMode(prefs.captureSysKeysMode),
m_MouseCursorCapturedVisibilityState(SDL_DISABLE),
@@ -33,8 +35,7 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int s
m_RightButtonReleaseTimer(0),
m_DragTimer(0),
m_DragButton(0),
m_NumFingersDown(0),
m_ClipboardData()
m_NumFingersDown(0)
{
// System keys are always captured when running without a DE
if (!WMUtils::isRunningDesktopEnvironment()) {
@@ -116,6 +117,11 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int s
m_SpecialKeyCombos[KeyComboPasteText].scanCode = SDL_SCANCODE_V;
m_SpecialKeyCombos[KeyComboPasteText].enabled = true;
m_SpecialKeyCombos[KeyComboTogglePointerRegionLock].keyCombo = KeyComboTogglePointerRegionLock;
m_SpecialKeyCombos[KeyComboTogglePointerRegionLock].keyCode = SDLK_l;
m_SpecialKeyCombos[KeyComboTogglePointerRegionLock].scanCode = SDL_SCANCODE_L;
m_SpecialKeyCombos[KeyComboTogglePointerRegionLock].enabled = true;
m_OldIgnoreDevices = SDL_GetHint(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES);
m_OldIgnoreDevicesExcept = SDL_GetHint(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT);
@@ -172,10 +178,6 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int s
}
#endif
#ifdef Q_OS_DARWIN
CGSGetGlobalHotKeyOperatingMode(_CGSDefaultConnection(), &m_OldHotKeyMode);
#endif
// Initialize the gamepad mask with currently attached gamepads to avoid
// causing gamepads to unexpectedly disappear and reappear on the host
// during stream startup as we detect currently attached gamepads one at a time.
@@ -202,13 +204,6 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int s
}
m_MouseMoveTimer = SDL_AddTimer(pollingInterval, SdlInputHandler::mouseMoveTimerCallback, this);
// Initialize state used by the clipboard thread before we start it
SDL_AtomicSet(&m_ShutdownClipboardThread, 0);
m_ClipboardHasData = SDL_CreateCond();
m_ClipboardLock = SDL_CreateMutex();
m_ClipboardThread = SDL_CreateThread(SdlInputHandler::clipboardThreadProc, "Clipboard Sender", this);
}
SdlInputHandler::~SdlInputHandler()
@@ -234,21 +229,6 @@ SdlInputHandler::~SdlInputHandler()
SDL_RemoveTimer(m_RightButtonReleaseTimer);
SDL_RemoveTimer(m_DragTimer);
// Wake up the clipboard thread to terminate it
SDL_AtomicSet(&m_ShutdownClipboardThread, 1);
SDL_CondBroadcast(m_ClipboardHasData);
// Wait for it to terminate
SDL_WaitThread(m_ClipboardThread, nullptr);
// Now we can safely clean up its resources
SDL_DestroyCond(m_ClipboardHasData);
SDL_DestroyMutex(m_ClipboardLock);
#ifdef Q_OS_DARWIN
CGSSetGlobalHotKeyOperatingMode(_CGSDefaultConnection(), m_OldHotKeyMode);
#endif
#if !SDL_VERSION_ATLEAST(2, 0, 9)
SDL_QuitSubSystem(SDL_INIT_HAPTIC);
SDL_assert(!SDL_WasInit(SDL_INIT_HAPTIC));
@@ -328,27 +308,11 @@ void SdlInputHandler::notifyFocusLost()
setCaptureActive(false);
}
#ifdef Q_OS_DARWIN
// Ungrab the keyboard
updateKeyboardGrabState();
#endif
// Raise all keys that are currently pressed. If we don't do this, certain keys
// used in shortcuts that cause focus loss (such as Alt+Tab) may get stuck down.
raiseAllKeys();
}
void SdlInputHandler::notifyFocusGained()
{
#ifdef Q_OS_DARWIN
// Re-grab the keyboard if it was grabbed before focus loss
// FIXME: We only do this on macOS because we get a spurious
// focus gain when in SDL_WINDOW_FULLSCREEN_DESKTOP on Windows
// immediately after losing focus by clicking on another window.
updateKeyboardGrabState();
#endif
}
bool SdlInputHandler::isCaptureActive()
{
if (SDL_GetRelativeMouseMode()) {
@@ -372,51 +336,15 @@ void SdlInputHandler::updateKeyboardGrabState()
// Ungrab if it's fullscreen only and we left fullscreen
shouldGrab = false;
}
#ifdef Q_OS_DARWIN
else if (!(windowFlags & SDL_WINDOW_INPUT_FOCUS)) {
// Ungrab if we lose input focus on macOS. SDL will handle
// this internally for platforms where we use the SDL
// SDL_SetWindowKeyboardGrab() API exclusively.
//
// NB: On X11, we may not have input focus at the time of
// the initial keyboard grab update, so we must not enable
// this codepath on Linux.
shouldGrab = false;
}
#endif
// Don't close the window on Alt+F4 when keyboard grab is enabled
SDL_SetHint(SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4, shouldGrab ? "1" : "0");
if (shouldGrab) {
#if SDL_VERSION_ATLEAST(2, 0, 15)
// On SDL 2.0.15, we can get keyboard-only grab on Win32, X11, and Wayland.
// This does nothing on macOS but it sets the SDL_WINDOW_KEYBOARD_GRABBED flag
// that we look for to see if keyboard capture is enabled. We'll handle macOS
// ourselves below using the private CGSSetGlobalHotKeyOperatingMode() API.
SDL_SetWindowKeyboardGrab(m_Window, SDL_TRUE);
#else
// If we're in full-screen desktop mode and SDL doesn't have keyboard grab yet,
// grab the cursor (will grab the keyboard too on X11).
if (SDL_GetWindowFlags(m_Window) & SDL_WINDOW_FULLSCREEN) {
SDL_SetWindowGrab(m_Window, SDL_TRUE);
}
// On SDL 2.0.15+, we can get keyboard-only grab on Win32, X11, and Wayland.
// SDL 2.0.18 adds keyboard grab on macOS (if built with non-AppStore APIs).
SDL_SetWindowKeyboardGrab(m_Window, shouldGrab ? SDL_TRUE : SDL_FALSE);
#endif
#ifdef Q_OS_DARWIN
// SDL doesn't support this private macOS API
CGSSetGlobalHotKeyOperatingMode(_CGSDefaultConnection(), CGSGlobalHotKeyDisable);
#endif
}
else {
#if SDL_VERSION_ATLEAST(2, 0, 15)
// Allow the keyboard to leave the window
SDL_SetWindowKeyboardGrab(m_Window, SDL_FALSE);
#endif
#ifdef Q_OS_DARWIN
// SDL doesn't support this private macOS API
CGSSetGlobalHotKeyOperatingMode(_CGSDefaultConnection(), m_OldHotKeyMode);
#endif
}
}
bool SdlInputHandler::isSystemKeyCaptureActive()
@@ -452,23 +380,6 @@ bool SdlInputHandler::isSystemKeyCaptureActive()
void SdlInputHandler::setCaptureActive(bool active)
{
if (active) {
// If we're in full-screen exclusive mode, grab the cursor so it can't accidentally leave our window.
if ((SDL_GetWindowFlags(m_Window) & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN) {
#if SDL_VERSION_ATLEAST(2, 0, 15)
SDL_SetWindowMouseGrab(m_Window, SDL_TRUE);
#else
SDL_SetWindowGrab(m_Window, SDL_TRUE);
#endif
}
if (!m_AbsoluteMouseMode) {
// If our window is occluded when mouse is captured, the mouse may
// get stuck on top of the occluding window and not be properly
// captured. We can avoid this by raising our window before we
// capture the mouse.
SDL_RaiseWindow(m_Window);
}
// If we're in relative mode, try to activate SDL's relative mouse mode
if (m_AbsoluteMouseMode || SDL_SetRelativeMouseMode(SDL_TRUE) < 0) {
// Relative mouse mode didn't work or was disabled, so we'll just hide the cursor
@@ -504,16 +415,11 @@ void SdlInputHandler::setCaptureActive(bool active)
else {
SDL_SetRelativeMouseMode(SDL_FALSE);
}
#if SDL_VERSION_ATLEAST(2, 0, 15)
// Allow the cursor to leave the bounds of our window again.
SDL_SetWindowMouseGrab(m_Window, SDL_FALSE);
#else
// Allow the cursor to leave the bounds of our window again.
SDL_SetWindowGrab(m_Window, SDL_FALSE);
#endif
}
// Update mouse pointer region constraints
updatePointerRegionLock();
// Now update the keyboard grab
updateKeyboardGrabState();
}
+5 -34
View File
@@ -29,25 +29,6 @@ struct GamepadState {
unsigned char lt, rt;
};
#ifdef Q_OS_DARWIN
#include <CoreGraphics/CGError.h>
extern "C" {
typedef int CGSConnection;
typedef enum {
CGSGlobalHotKeyEnable = 0,
CGSGlobalHotKeyDisable = 1,
} CGSGlobalHotKeyOperatingMode;
extern CGSConnection _CGSDefaultConnection(void);
extern CGError CGSGetGlobalHotKeyOperatingMode(CGSConnection connection,
CGSGlobalHotKeyOperatingMode* mode);
extern CGError CGSSetGlobalHotKeyOperatingMode(CGSConnection connection,
CGSGlobalHotKeyOperatingMode mode);
}
#endif
#define MAX_GAMEPADS 4
#define MAX_FINGERS 2
@@ -98,8 +79,6 @@ public:
void notifyFocusLost();
void notifyFocusGained();
bool isCaptureActive();
bool isSystemKeyCaptureActive();
@@ -114,6 +93,8 @@ public:
void updateKeyboardGrabState();
void updatePointerRegionLock();
static
QString getUnmappedGamepads();
@@ -127,6 +108,7 @@ private:
KeyComboToggleCursorHide,
KeyComboToggleMinimize,
KeyComboPasteText,
KeyComboTogglePointerRegionLock,
KeyComboMax
};
@@ -159,9 +141,6 @@ private:
static
Uint32 dragTimerCallback(Uint32 interval, void* param);
static
int clipboardThreadProc(void *ptr);
SDL_Window* m_Window;
bool m_MultiController;
bool m_GamepadMouse;
@@ -180,6 +159,8 @@ private:
SDL_atomic_t m_MousePositionUpdated;
bool m_MouseWasInVideoRegion;
bool m_PendingMouseButtonsAllUpOnVideoRegionLeave;
bool m_PointerRegionLockActive;
bool m_PointerRegionLockToggledByUser;
int m_GamepadMask;
GamepadState m_GamepadState[MAX_GAMEPADS];
@@ -190,10 +171,6 @@ private:
StreamingPreferences::CaptureSysKeysMode m_CaptureSystemKeysMode;
int m_MouseCursorCapturedVisibilityState;
#ifdef Q_OS_DARWIN
CGSGlobalHotKeyOperatingMode m_OldHotKeyMode;
#endif
struct {
KeyCombo keyCombo;
SDL_Keycode keyCode;
@@ -216,11 +193,5 @@ private:
char m_DragButton;
int m_NumFingersDown;
SDL_Thread* m_ClipboardThread;
SDL_atomic_t m_ShutdownClipboardThread;
QString m_ClipboardData;
SDL_cond* m_ClipboardHasData;
SDL_mutex* m_ClipboardLock;
static const int k_ButtonMap[];
};
+33 -21
View File
@@ -101,13 +101,20 @@ void SdlInputHandler::performSpecialKeyCombo(KeyCombo combo)
// with the text we're going to type.
raiseAllKeys();
const char* text;
char* text;
if (SDL_HasClipboardText() && (text = SDL_GetClipboardText()) != nullptr) {
// Append this data to the clipboard data string for the thread to process
SDL_LockMutex(m_ClipboardLock);
m_ClipboardData.append(text);
SDL_CondSignal(m_ClipboardHasData);
SDL_UnlockMutex(m_ClipboardLock);
// Sending both CR and LF will lead to two newlines in the destination for
// each newline in the source, so we fix up any CRLFs into just a single LF.
for (char* c = text; *c != 0; c++) {
if (*c == '\r' && *(c + 1) == '\n') {
// We're using strlen() rather than strlen() - 1 since we need to add 1
// to copy the null terminator which is not included in strlen()'s count.
memmove(c, c + 1, strlen(c));
}
}
// Send this text to the PC
LiSendUtf8TextEvent(text, strlen(text));
// SDL_GetClipboardText() allocates, so we must free
SDL_free((void*)text);
@@ -119,13 +126,24 @@ void SdlInputHandler::performSpecialKeyCombo(KeyCombo combo)
break;
}
case KeyComboTogglePointerRegionLock:
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
"Detected pointer region lock toggle combo");
m_PointerRegionLockActive = !m_PointerRegionLockActive;
// Remember that the user changed this manually, so we don't mess with it anymore
// during windowed <-> full-screen transitions.
m_PointerRegionLockToggledByUser = true;
// Apply the new region lock
updatePointerRegionLock();
break;
default:
Q_UNREACHABLE();
}
}
#define IS_SYNTHETIC_KEY_EVENT(x) ((x)->timestamp == 0)
void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
{
short keyCode;
@@ -138,9 +156,7 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
}
// Check for our special key combos
// Ignore timestamp == 0 which are sent from our keyboard code.
if (!IS_SYNTHETIC_KEY_EVENT(event) &&
(event->state == SDL_PRESSED) &&
if ((event->state == SDL_PRESSED) &&
(event->keysym.mod & KMOD_CTRL) &&
(event->keysym.mod & KMOD_ALT) &&
(event->keysym.mod & KMOD_SHIFT)) {
@@ -403,16 +419,12 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
}
}
// If this is a synthetic keypress from the clipboard code,
// this will be on a non-main thread, so don't touch m_KeysDown.
if (!IS_SYNTHETIC_KEY_EVENT(event)) {
// Track the key state so we always know which keys are down
if (event->state == SDL_PRESSED) {
m_KeysDown.insert(keyCode);
}
else {
m_KeysDown.remove(keyCode);
}
// Track the key state so we always know which keys are down
if (event->state == SDL_PRESSED) {
m_KeysDown.insert(keyCode);
}
else {
m_KeysDown.remove(keyCode);
}
LiSendKeyboardEvent(0x8000 | keyCode,
+73
View File
@@ -212,14 +212,36 @@ void SdlInputHandler::handleMouseWheelEvent(SDL_MouseWheelEvent* event)
}
}
#if SDL_VERSION_ATLEAST(2, 0, 18)
if (event->preciseY != 0.0f) {
// Invert the scroll direction if needed
if (m_ReverseScrollDirection) {
event->preciseY = -event->preciseY;
}
#ifdef Q_OS_DARWIN
// HACK: Clamp the scroll values on macOS to prevent OS scroll acceleration
// from generating wild scroll deltas when scrolling quickly.
event->preciseY = SDL_clamp(event->preciseY, -1.0f, 1.0f);
#endif
LiSendHighResScrollEvent((short)(event->preciseY * 120)); // WHEEL_DELTA
}
#else
if (event->y != 0) {
// Invert the scroll direction if needed
if (m_ReverseScrollDirection) {
event->y = -event->y;
}
#ifdef Q_OS_DARWIN
// See comment above
event->y = SDL_clamp(event->y, -1, 1);
#endif
LiSendScrollEvent((signed char)event->y);
}
#endif
}
bool SdlInputHandler::isMouseInVideoRegion(int mouseX, int mouseY, int windowWidth, int windowHeight)
@@ -261,3 +283,54 @@ Uint32 SdlInputHandler::mouseMoveTimerCallback(Uint32 interval, void *param)
return interval;
}
void SdlInputHandler::updatePointerRegionLock()
{
// Pointer region lock is irrelevant in relative mouse mode
if (SDL_GetRelativeMouseMode()) {
return;
}
// Our pointer lock behavior tracks with the fullscreen mode unless the user has
// toggled it themselves using the keyboard shortcut. If that's the case, they
// have full control over it and we don't touch it anymore.
if (!m_PointerRegionLockToggledByUser) {
// Lock the pointer in true full-screen mode and leave it unlocked in other modes
m_PointerRegionLockActive = (SDL_GetWindowFlags(m_Window) & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN;
}
// If region lock is enabled, grab the cursor so it can't accidentally leave our window.
if (isCaptureActive() && m_PointerRegionLockActive) {
#if SDL_VERSION_ATLEAST(2, 0, 18)
SDL_Rect src, dst;
src.x = src.y = 0;
src.w = m_StreamWidth;
src.h = m_StreamHeight;
dst.x = dst.y = 0;
SDL_GetWindowSize(m_Window, &dst.w, &dst.h);
// Use the stream and window sizes to determine the video region
StreamUtils::scaleSourceToDestinationSurface(&src, &dst);
// SDL 2.0.18 lets us lock the cursor to a specific region
SDL_SetWindowMouseRect(m_Window, &dst);
#elif SDL_VERSION_ATLEAST(2, 0, 15)
// SDL 2.0.15 only lets us lock the cursor to the whole window
SDL_SetWindowMouseGrab(m_Window, SDL_TRUE);
#else
SDL_SetWindowGrab(m_Window, SDL_TRUE);
#endif
}
else {
// Allow the cursor to leave the bounds of our video region or window
#if SDL_VERSION_ATLEAST(2, 0, 18)
SDL_SetWindowMouseRect(m_Window, nullptr);
#elif SDL_VERSION_ATLEAST(2, 0, 15)
SDL_SetWindowMouseGrab(m_Window, SDL_FALSE);
#else
SDL_SetWindowGrab(m_Window, SDL_FALSE);
#endif
}
}

Some files were not shown because too many files have changed in this diff Show More