From af8ef237ad0b890e10b25a6184e2d095f9e2a260 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 17:05:34 +0000 Subject: [PATCH 1/7] build(deps): bump third-party/build-deps from `ccac368` to `a558c92` (#3429) Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `ccac368` to `a558c92`. - [Commits](https://github.com/LizardByte/build-deps/compare/ccac36854da7697ee3beae0c1d46bb1137403b2e...a558c922d083ec543c713ad302f9d9592c68b452) --- updated-dependencies: - dependency-name: third-party/build-deps dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- third-party/build-deps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/build-deps b/third-party/build-deps index ccac3685..a558c922 160000 --- a/third-party/build-deps +++ b/third-party/build-deps @@ -1 +1 @@ -Subproject commit ccac36854da7697ee3beae0c1d46bb1137403b2e +Subproject commit a558c922d083ec543c713ad302f9d9592c68b452 From 0bc3130edff6731f1029c379d78e1d2380fe3e70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 08:31:01 -0500 Subject: [PATCH 2/7] build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from `6f611f1` to `a1eb29c` (#3432) build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `6f611f1` to `a1eb29c`. - [Commits](https://github.com/flatpak/flatpak-builder-tools/compare/6f611f108b1bfeff57dbeb93d34254cd541aeeb7...a1eb29c5f3038413ffafd4fea34e62c361c109ad) --- updated-dependencies: - dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packaging/linux/flatpak/deps/flatpak-builder-tools | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/linux/flatpak/deps/flatpak-builder-tools b/packaging/linux/flatpak/deps/flatpak-builder-tools index 6f611f10..a1eb29c5 160000 --- a/packaging/linux/flatpak/deps/flatpak-builder-tools +++ b/packaging/linux/flatpak/deps/flatpak-builder-tools @@ -1 +1 @@ -Subproject commit 6f611f108b1bfeff57dbeb93d34254cd541aeeb7 +Subproject commit a1eb29c5f3038413ffafd4fea34e62c361c109ad From 5c3bad945a32e35417760ff9ce1b0a974ecd8fe9 Mon Sep 17 00:00:00 2001 From: LizardByte-bot <108553330+LizardByte-bot@users.noreply.github.com> Date: Sat, 7 Dec 2024 21:14:52 -0500 Subject: [PATCH 3/7] chore: update global workflows (#3434) --- .github/workflows/release-notifier.yml | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/.github/workflows/release-notifier.yml b/.github/workflows/release-notifier.yml index 1ac8a3a3..aeb33ed2 100644 --- a/.github/workflows/release-notifier.yml +++ b/.github/workflows/release-notifier.yml @@ -57,22 +57,6 @@ jobs: username: ${{ secrets.DISCORD_USERNAME }} webhook: ${{ secrets.DISCORD_RELEASE_WEBHOOK }} - facebook_group: - if: >- - startsWith(github.repository, 'LizardByte/') && - !github.event.release.prerelease && - !github.event.release.draft - runs-on: ubuntu-latest - steps: - - name: facebook-post-action - uses: ReenigneArcher/facebook-post-action@v1 - with: - page_id: ${{ secrets.FACEBOOK_GROUP_ID }} - access_token: ${{ secrets.FACEBOOK_ACCESS_TOKEN }} - message: | - ${{ github.event.repository.name }} ${{ github.ref_name }} Released - url: ${{ github.event.release.html_url }} - facebook_page: if: >- startsWith(github.repository, 'LizardByte/') && @@ -81,7 +65,7 @@ jobs: runs-on: ubuntu-latest steps: - name: facebook-post-action - uses: ReenigneArcher/facebook-post-action@v1 + uses: LizardByte/facebook-post-action@v2024.1207.15428 with: page_id: ${{ secrets.FACEBOOK_PAGE_ID }} access_token: ${{ secrets.FACEBOOK_ACCESS_TOKEN }} From 706e37719fa5bb19e70c8cfc90ca22a0adede55d Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sat, 7 Dec 2024 22:21:38 -0500 Subject: [PATCH 4/7] chore(l10n): update translations (#3408) --- .../assets/web/public/assets/locale/de.json | 2 +- .../assets/web/public/assets/locale/pt.json | 6 +-- .../assets/web/public/assets/locale/zh.json | 42 +++++++++---------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src_assets/common/assets/web/public/assets/locale/de.json b/src_assets/common/assets/web/public/assets/locale/de.json index 751c4df0..641090c1 100644 --- a/src_assets/common/assets/web/public/assets/locale/de.json +++ b/src_assets/common/assets/web/public/assets/locale/de.json @@ -1,6 +1,6 @@ { "_common": { - "apply": "Anwenden", + "apply": "Übernehmen", "auto": "Automatisch", "autodetect": "AutoDetection (empfohlen)", "beta": "(Beta)", diff --git a/src_assets/common/assets/web/public/assets/locale/pt.json b/src_assets/common/assets/web/public/assets/locale/pt.json index cbfa4a9f..96ae44cb 100644 --- a/src_assets/common/assets/web/public/assets/locale/pt.json +++ b/src_assets/common/assets/web/public/assets/locale/pt.json @@ -70,7 +70,7 @@ "image": "Imagem:", "image_desc": "Caminho da aplicação icon/imagem/imagem que será enviado para o cliente. Imagem deve ser um arquivo PNG. Se não estiver definido, Sunshine irá enviar a imagem da caixa padrão.", "loading": "Carregandochar@@0", - "name": "Nome:", + "name": "Nome", "output_desc": "O arquivo onde a saída do comando é armazenada, se não for especificado, a saída é ignorada", "output_name": "Saída", "run_as_desc": "Isto pode ser necessário para que alguns aplicativos que requerem permissões de administrador sejam executados corretamente.", @@ -110,7 +110,7 @@ "amd_rc_cqp": "cqp -- modo qp constante", "amd_rc_desc": "Isto controla o método de controle da taxa para garantir que não estamos a exceder o alvo da taxa de bits do cliente. 'cqp' não é adequado para segmentação de taxa de bits e outras opções além de 'vbr_latency' dependem da aplicação HRD para ajudar a restringir os fluxos de taxa de bits.", "amd_rc_group": "Configurações de controle de taxa AMF", - "amd_rc_vbr_latency": "latência vbr_ency -- taxa de bits com restrição de latência", + "amd_rc_vbr_latency": "vbr_latency -- bitrate variável limitado pela latência (recomendado se o HDR estiver desabilitado; padrão)", "amd_rc_vbr_peak": "vbr_pico -- pico de taxa de bits variável restrita", "amd_usage": "Uso do AMF", "amd_usage_desc": "Isso define o perfil de codificação base. Todas as opções apresentadas abaixo substituirão um subconjunto do perfil de uso, mas há configurações ocultas adicionais aplicadas que não podem ser configuradas em outro lugar.", @@ -359,7 +359,7 @@ }, "pin": { "device_name": "Nome do dispositivo", - "pair_failure": "Falha no pareamento: Verifique se o PIN é digitado corretamente", + "pair_failure": "Pareamento Falhou: Verifique se o PIN foi digitado corretamente", "pair_success": "Sucesso! Por favor, verifique a Lua Lunar para continuar", "pin_pairing": "PIN Pairing", "send": "Mandar", diff --git a/src_assets/common/assets/web/public/assets/locale/zh.json b/src_assets/common/assets/web/public/assets/locale/zh.json index 2b586460..36470972 100644 --- a/src_assets/common/assets/web/public/assets/locale/zh.json +++ b/src_assets/common/assets/web/public/assets/locale/zh.json @@ -49,10 +49,10 @@ "env_app_name": "应用名称", "env_client_audio_config": "客户端请求的音频配置 (2.0/5.1/7.1)", "env_client_enable_sops": "客户端请求自动更改游戏设置以实现最佳串流效果 (true/false)", - "env_client_fps": "客户请求的 FPS (int)", + "env_client_fps": "客户端请求的帧率 (int)", "env_client_gcmap": "客户端请求的游戏手柄掩码,采用 bitset/bitfield 格式 (int)", "env_client_hdr": "HDR 已被客户端启用 (true/false)", - "env_client_height": "客户端请求的高度 (int)", + "env_client_height": "客户端请求的分辨率的高度 (int)", "env_client_host_audio": "客户端请求在主机播放声音 (true/false)", "env_client_width": "客户端请求的分辨率的宽度 (int)", "env_displayplacer_example": "示例 - 使用 displayplacer 自动更改分辨率:", @@ -103,7 +103,7 @@ "amd_quality_balanced": "balanced -- 平衡(默认)", "amd_quality_desc": "这将控制编码速度和质量之间的平衡。", "amd_quality_group": "AMF 质量设置", - "amd_quality_quality": "质量 - 偏好质量", + "amd_quality_quality": "quality -- 偏好质量", "amd_quality_speed": "speed -- 偏好速度", "amd_rc": "AMF 码率控制", "amd_rc_cbr": "cbr -- 恒定比特率(在启用HDR时推荐)", @@ -120,7 +120,7 @@ "amd_usage_ultralowlatency": "ultralowlatency -- 超低延迟(最快;默认)", "amd_usage_webcam": "webcam -- 网络摄像头(慢)", "amd_vbaq": "AMF 基于方差的自适应量化 (VBAQ)", - "amd_vbaq_desc": "人的视觉系统通常对高成形地区的艺术品不太敏感。 在 VBAQ 模式下,像素差异用于表示空间纹理的复杂性,使编码器能够将更多的比特分配给较平的区域。 启用此功能可提高主观视觉品质及一些内容。", + "amd_vbaq_desc": "人类的视觉系统通常对高度纹理化区域中的瑕疵不太敏感。在VBAQ模式下,像素方差被用来指示空间纹理的复杂性,这使得编码器可以将更多的比特分配给更平滑的区域。启用这个特性可以在某些内容上提升主观视觉质量。", "apply_note": "点击“应用”重启 Sunshine 并应用更改。这将终止任何正在运行的会话。", "audio_sink": "音频输出设备", "audio_sink_desc_linux": "手动指定需要抓取的音频输出设备。如果您没有指定此变量,PulseAudio 将选择默认监测设备。 您可以使用以下任何命令找到音频输出设备的名称:", @@ -130,8 +130,8 @@ "audio_sink_placeholder_windows": "扬声器(High Definition Audio Device)", "av1_mode": "AV1 支持", "av1_mode_0": "Sunshine 将基于编码器能力通告对 AV1 的支持(推荐)", - "av1_mode_1": "阳光将不会为AV1做广告支持", - "av1_mode_2": "Sunshine 将为AV1 主8位配置文件做广告支持", + "av1_mode_1": "Sunshine 将不会通告对 AV1 的支持", + "av1_mode_2": "Sunshine 将通告 AV1 Main 8-bit 配置支持", "av1_mode_3": "Sunshine 将通告 AV1 Main 8-bit 和 10-bit (HDR) 配置支持", "av1_mode_desc": "允许客户端请求 AV1 Main 8-bit 或 10-bit 视频流。AV1 的编码对 CPU 的要求较高,因此在使用软件编码时,启用此功能可能会降低性能。", "back_button_timeout": "主页/导航按钮模拟超时", @@ -141,7 +141,7 @@ "cert": "证书", "cert_desc": "用于 Web UI 和 Moonlilght 客户端配对的证书。为了最佳兼容性,这应该是一个 RSA-2048 公钥。", "channels": "最多同时连接客户端数", - "channels_desc_1": "阳光可以允许单个流媒体会话同时与多个客户端共享。", + "channels_desc_1": "Sunshine 允许多个客户端同时共享一个串流会话。", "channels_desc_2": "某些硬件编码器可能存在限制,在编码多条流时会降低性能。", "coder_cabac": "cabac -- 上下文自适应二进制算术编码- 较高质量", "coder_cavlc": "cavlc -- 上下文适应变量编码 - 更快解码", @@ -166,7 +166,7 @@ "file_state_desc": "Sunshine 保存当前状态的文件", "gamepad": "模拟游戏手柄类型", "gamepad_auto": "自动选择选项", - "gamepad_desc": "选择要在主机上模拟的游戏手表类型", + "gamepad_desc": "选择要在主机上模拟的游戏手柄类型", "gamepad_ds4": "DS4 (PS4)", "gamepad_ds5": "DS5 (PS5)", "gamepad_switch": "Nintendo Pro (Switch)", @@ -181,7 +181,7 @@ "hevc_mode_2": "Sunshine 将通告 HEVC Main 配置支持", "hevc_mode_3": "Sunshine 将通告 HEVC Main 和 Main10 (HDR) 配置支持", "hevc_mode_desc": "允许客户端请求HEVC 主流或 HEVC Main10 视频流。 HEVC更需要编码,因此在使用软件编码时可能降低性能。", - "high_resolution_scrolling": "高分辨率鼠标滚动支持", + "high_resolution_scrolling": "高分辨率滚动支持", "high_resolution_scrolling_desc": "启用后,Sunshine 将透传来自 Moonlight 客户端的高分辨率滚动事件。对于那些使用高分辨率滚动事件时滚动速度过快的旧版应用程序来说,禁用此功能非常有用。", "install_steam_audio_drivers": "安装 Steam 音频驱动程序", "install_steam_audio_drivers_desc": "如果安装了 Steam,则会自动安装 Steam Streaming Speakers 驱动程序,以支持 5.1/7.1 环绕声和主机音频静音。", @@ -203,8 +203,8 @@ "log_level_0": "详细 (Verbose)", "log_level_1": "调试 (Debug)", "log_level_2": "信息 (Info)", - "log_level_3": "警告", - "log_level_4": "错误", + "log_level_3": "警告 (Warning)", + "log_level_4": "错误 (Error)", "log_level_5": "致命 (Fatal)", "log_level_6": "无 (None)", "log_level_desc": "打印到标准输出的最小日志级别", @@ -213,7 +213,7 @@ "min_fps_factor": "最小帧率系数", "min_fps_factor_desc": "Sunshine 将使用此系数来计算帧之间的最小时间。当串流的内容主要为静态内容时,稍微增加此值可能会有帮助。更大的值将会使用更大的带宽。", "min_threads": "最低 CPU 线程数", - "min_threads_desc": "增加值稍微降低编码效率,但是交易通常值得使用更多的 CPU 核心进行编码。 理想值是可以在您的硬件上的流媒体设置中可靠编码的最低值。", + "min_threads_desc": "提高该值会略微降低编码效率,但为了获得更多的 CPU 内核用于编码,通常是值得的。理想值是在您的硬件配置上以所需的串流设置进行可靠编码的最低值。", "misc": "杂项选项", "motion_as_ds4": "如果客户端报告游戏手柄存在陀螺仪,则模拟一个 DS4 游戏手柄", "motion_as_ds4_desc": "如果禁用,则在选择游戏手柄类型时不会考虑陀螺仪的存在。", @@ -237,7 +237,7 @@ "nvenc_realtime_hags_desc": "目前,当启用 HAGS、使用实时优先级且 VRAM 利用率接近最大值时,NVIDIA 驱动程序可能会冻结编码器。禁用该选项可将优先级降至高,从而避免冻结,但代价是在 GPU 负载较高时捕捉性能会降低。", "nvenc_spatial_aq": "Spatial AQ", "nvenc_spatial_aq_desc": "将较高的 QP 值分配给视频的平场区域。建议在以较低的比特率进行串流时启用。", - "nvenc_spatial_aq_disabled": "已禁用 (aster, 默认)", + "nvenc_spatial_aq_disabled": "禁用(更快,默认)", "nvenc_spatial_aq_enabled": "启用(较慢)", "nvenc_twopass": "二次编码模式", "nvenc_twopass_desc": "添加二次编码。这样可以检测到更多的运动矢量,更好地分配整个帧的比特率,并更能防止比特率超过限制。不建议禁用它,因为这会导致偶尔的比特率超限和随后的丢包。", @@ -245,7 +245,7 @@ "nvenc_twopass_full_res": "全分辨率(较慢)", "nvenc_twopass_quarter_res": "四分之一分辨率(快速,默认)", "nvenc_vbv_increase": "单帧 VBV/HRD 百分比增加", - "nvenc_vbv_increase_desc": "默认情况下,Sunshine 使用单帧 VBV/HRD,这意味着任何编码的视频帧大小都不会超过所请求的码率除以所请求的帧速率。放宽这一限制可能会带来好处,起到低延迟可变码率的作用,但如果网络没有缓冲空间来处理码率峰值,也可能导致数据包丢失。可接受的最大值为 400,相当于编码视频帧的大小上限增加到 5 倍。", + "nvenc_vbv_increase_desc": "默认情况下,日光使用单帧VBV/HRD,这意味着任何编码的视频帧大小预计不会超过请求的比特率除以请求的帧率。 放松此限制可能是有益的,并可作为低延迟变量比特率。 但如果网络没有缓冲区来处理比特率跳跃,也可能导致数据包丢失。 最大接受值为400,相当于5倍增加的编码视频帧上限值。", "origin_web_ui_allowed": "允许的 Web UI 访问来源", "origin_web_ui_allowed_desc": "未被拒绝访问 Web UI 的远端地址来源", "origin_web_ui_allowed_lan": "仅局域网中的设备可以访问 Web UI", @@ -262,7 +262,7 @@ "port": "端口", "port_alert_1": "Sunshine 不能使用低于1024 的端口! ", "port_alert_2": "超过 65535 的端口不可用!", - "port_desc": "设置阳光使用的端口类", + "port_desc": "设置 Sunshine 使用的端口族", "port_http_port_note": "使用此端口连接 Moonlight。", "port_note": "说明", "port_port": "端口", @@ -289,21 +289,21 @@ "sunshine_name_desc": "在 Moonlight 中显示的名称。如果未指定,则使用 PC 的主机名", "sw_preset": "软件编码预设", "sw_preset_desc": "在编码速度和压缩效率之间权衡。默认为 superfast - 超快。", - "sw_preset_fast": "快速的", + "sw_preset_fast": "fast - 快", "sw_preset_faster": "faster - 更快", - "sw_preset_medium": "介质", + "sw_preset_medium": "medium - 中等", "sw_preset_slow": "slow - 慢", "sw_preset_slower": "slower - 更慢", "sw_preset_superfast": "superfast - 超快(默认)", "sw_preset_ultrafast": "ultrafast - 极快", "sw_preset_veryfast": "veryfast - 非常快", - "sw_preset_veryslow": "veryslow", - "sw_tune": "西色调", + "sw_preset_veryslow": "veryslow - 非常慢", + "sw_tune": "软件编码调校", "sw_tune_animation": "animation -- 适合动画片;使用更高的去块和更多的参考帧", "sw_tune_desc": "调校选项,在预设后应用。默认值为 zerolatency。", "sw_tune_fastdecode": "fastdecode -- 通过禁用某些过滤器来加快解码速度", "sw_tune_film": "film -- 用于高质量的电影内容;降低去块", - "sw_tune_grain": "谷物——保存老旧的谷物结构,灰色胶卷材料", + "sw_tune_grain": "grain -- 保留旧的颗粒胶片材料的颗粒结构", "sw_tune_stillimage": "stillimage -- 适用于类似幻灯片的内容", "sw_tune_zerolatency": "zerolatency -- 适用于快速编码和低延迟串流(默认值)", "touchpad_as_ds4": "如果客户端报告游戏手柄存在触摸板,则模拟一个 DS4 游戏手柄", @@ -384,7 +384,7 @@ "logs_desc": "查看 Sunshine 上传的日志", "logs_find": "查找...", "restart_sunshine": "重启 Sunshine", - "restart_sunshine_desc": "如果阳光工作不正常,您可以尝试重新启动它。这将终止任何已运行的会话。", + "restart_sunshine_desc": "如果 Sunshine 无法正常工作,可以尝试重新启动。这将终止任何正在运行的会话。", "restart_sunshine_success": "Sunhine 正在重启", "troubleshooting": "故障排除", "unpair_all": "全部取消配对", From f73eb88ba9f35477ab0466048e7a60ffdf93317c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Dec 2024 23:10:26 -0500 Subject: [PATCH 5/7] build(deps): bump codecov/codecov-action from 4 to 5 (#3399) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/CI.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b82ad7be..9bf13e2a 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -502,7 +502,7 @@ jobs: always() && (steps.test_report.outcome == 'success') && startsWith(github.repository, 'LizardByte/') - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: disable_search: true fail_ci_if_error: true @@ -935,7 +935,7 @@ jobs: always() && (steps.test_report.outcome == 'success') && startsWith(github.repository, 'LizardByte/') - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: disable_search: true fail_ci_if_error: false # todo: re-enable this when action is fixed @@ -1199,7 +1199,7 @@ jobs: always() && (steps.test_report.outcome == 'success') && startsWith(github.repository, 'LizardByte/') - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: disable_search: true fail_ci_if_error: true From 0cc98f113e69a3764d3a413af022e5e2fe1aef31 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:11:54 -0500 Subject: [PATCH 6/7] docs: various updates (#3366) Co-authored-by: BillyTom <953688+billytom@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug-report.yml | 7 ++++--- README.md | 14 +++++++++++--- docs/troubleshooting.md | 6 ++++++ gh-pages-template/index.html | 4 ++++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 6e0a87ff..6356add1 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -94,13 +94,14 @@ body: - Linux - AUR (Third Party) - Linux - deb - Linux - Docker + - Linux - Fedora Copr - Linux - flathub/flatpak - Linux - Homebrew - Linux - LizardByte/pacman-repo - Linux - nixpkgs (Third Party) - Linux - pkg.tar.zst - - Linux - Fedora Copr - Linux - solus (Third Party) + - Linux - Unraid (Third Party) - macOS - Homebrew - macOS - Portfile - Windows - Chocolatey (Third Party) @@ -123,7 +124,7 @@ body: - AMD - Apple Silicon - Intel - - Nvidia + - NVIDIA - none (software encoding) - n/a validations: @@ -149,7 +150,7 @@ body: description: The capture method being used. options: - AVCaptureScreen (macOS) - - KMX (Linux) + - KMS (Linux) - NvFBC (Linux) - wlroots (Linux) - X11 (Linux) diff --git a/README.md b/README.md index be73eb71..72e074b9 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,11 @@ the local server or any mobile device. AMD: VCE 1.0 or higher, see: obs-amd hardware support - Intel: VAAPI-compatible, see: VAAPI hardware support + + Intel:
+   Linux: VAAPI-compatible, see: VAAPI hardware support
+   Windows: Skylake or newer with QuickSync encoding support + Nvidia: NVENC enabled cards, see: nvenc support matrix @@ -90,7 +94,11 @@ the local server or any mobile device. AMD: Video Coding Engine 3.1 or higher - Intel: HD Graphics 510 or higher + + Intel:
+   Linux: HD Graphics 510 or higher
+   Windows: Skylake or newer with QuickSync encoding support + Nvidia: GeForce GTX 1080 or higher @@ -125,7 +133,7 @@ the local server or any mobile device. Intel: HD Graphics 730 or higher - Nvidia: Nvidia: Pascal-based GPU (GTX 10-series) or higher + Nvidia: Pascal-based GPU (GTX 10-series) or higher CPU diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 7260ec6c..1ba8d6e0 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -23,6 +23,9 @@ If you forgot your credentials to the web UI, try this. @tip{Don't forget to replace `{new-username}` and `{new-password}` with your new credentials. Do not include the curly braces.} +### Unusual Mouse Behavior +If you experience unusual mouse behavior, try attaching a physical mouse to the Sunshine host. + ### Web UI Access Can't access the web UI? @@ -190,6 +193,9 @@ has. You may get permission denied errors when attempting to launch a game or ap You will need to modify the security permissions on your disk. Ensure that user/principal SYSTEM has full permissions on the disk. +### Stuttering +If you experience stuttering using NVIDIA, try disabling `vsync:fast` in the NVIDIA Control Panel. +
| Previous | Next | diff --git a/gh-pages-template/index.html b/gh-pages-template/index.html index ad8cbbc0..8e3ee384 100644 --- a/gh-pages-template/index.html +++ b/gh-pages-template/index.html @@ -654,6 +654,10 @@ Docker + + + Flathub + Homebrew From 1543f584abf33adfa50731b2a84083c70faaa18d Mon Sep 17 00:00:00 2001 From: Lukas Senionis Date: Wed, 11 Dec 2024 21:17:44 +0200 Subject: [PATCH 7/7] feat(display)!: Add libdisplaydevice dependency and output name mapping (#2894) --- .gitmodules | 4 + cmake/compile_definitions/common.cmake | 3 + cmake/dependencies/common.cmake | 3 + docs/configuration.md | 52 +++++++++++- .../flatpak/dev.lizardbyte.app.Sunshine.yml | 3 + .../linux/flatpak/modules/nlohmann_json.json | 15 ++++ src/display_device.cpp | 85 +++++++++++++++++++ src/display_device.h | 39 +++++++++ src/logging.cpp | 33 +++++++ src/logging.h | 7 ++ src/main.cpp | 15 +++- src/platform/macos/input.cpp | 3 +- src/platform/windows/display_base.cpp | 4 +- src/video.cpp | 15 ++-- .../assets/web/configs/tabs/AudioVideo.vue | 5 +- .../tabs/audiovideo/DisplayOutputSelector.vue | 53 ++++++++++++ .../LegacyDisplayOutputSelector.vue | 46 ---------- .../audiovideo/NewDisplayOutputSelector.vue | 38 --------- .../assets/web/public/assets/locale/en.json | 4 +- third-party/libdisplaydevice | 1 + 20 files changed, 327 insertions(+), 101 deletions(-) create mode 100644 packaging/linux/flatpak/modules/nlohmann_json.json create mode 100644 src/display_device.cpp create mode 100644 src/display_device.h create mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/DisplayOutputSelector.vue delete mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue delete mode 100644 src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue create mode 160000 third-party/libdisplaydevice diff --git a/.gitmodules b/.gitmodules index be1c418a..412ddca6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,6 +22,10 @@ path = third-party/inputtino url = https://github.com/games-on-whales/inputtino.git branch = stable +[submodule "third-party/libdisplaydevice"] + path = third-party/libdisplaydevice + url = https://github.com/LizardByte/libdisplaydevice.git + branch = master [submodule "third-party/moonlight-common-c"] path = third-party/moonlight-common-c url = https://github.com/moonlight-stream/moonlight-common-c.git diff --git a/cmake/compile_definitions/common.cmake b/cmake/compile_definitions/common.cmake index 02ec7224..0c576426 100644 --- a/cmake/compile_definitions/common.cmake +++ b/cmake/compile_definitions/common.cmake @@ -68,6 +68,8 @@ set(SUNSHINE_TARGET_FILES "${CMAKE_SOURCE_DIR}/src/uuid.h" "${CMAKE_SOURCE_DIR}/src/config.h" "${CMAKE_SOURCE_DIR}/src/config.cpp" + "${CMAKE_SOURCE_DIR}/src/display_device.h" + "${CMAKE_SOURCE_DIR}/src/display_device.cpp" "${CMAKE_SOURCE_DIR}/src/entry_handler.cpp" "${CMAKE_SOURCE_DIR}/src/entry_handler.h" "${CMAKE_SOURCE_DIR}/src/file_handler.cpp" @@ -146,6 +148,7 @@ list(APPEND SUNSHINE_EXTERNAL_LIBRARIES ${MINIUPNP_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} enet + libdisplaydevice::display_device opus ${FFMPEG_LIBRARIES} ${Boost_LIBRARIES} diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index 810f8a87..27da728b 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -12,6 +12,9 @@ add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/moonlight-common-c/enet") # web server add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/Simple-Web-Server") +# libdisplaydevice +add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/libdisplaydevice") + # common dependencies find_package(OpenSSL REQUIRED) find_package(PkgConfig REQUIRED) diff --git a/docs/configuration.md b/docs/configuration.md index d4e33540..659e3d29 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -865,10 +865,56 @@ editing the `conf` file in a text editor. Use the examples as reference.
**Windows:**
- Enter the following command in command prompt or PowerShell. + During Sunshine startup, you should see the list of detected displays: @code{} - %ProgramFiles%\Sunshine\tools\dxgi-info.exe + Info: Currently available display devices: + [ + { + "device_id": "{64243705-4020-5895-b923-adc862c3457e}", + "display_name": "", + "friendly_name": "IDD HDR", + "info": null + }, + { + "device_id": "{77f67f3e-754f-5d31-af64-ee037e18100a}", + "display_name": "", + "friendly_name": "SunshineHDR", + "info": null + }, + { + "device_id": "{daeac860-f4db-5208-b1f5-cf59444fb768}", + "display_name": "\\\\.\\DISPLAY1", + "friendly_name": "ROG PG279Q", + "info": { + "hdr_state": null, + "origin_point": { + "x": 0, + "y": 0 + }, + "primary": true, + "refresh_rate": { + "type": "rational", + "value": { + "denominator": 1000, + "numerator": 119998 + } + }, + "resolution": { + "height": 1440, + "width": 2560 + }, + "resolution_scale": { + "type": "rational", + "value": { + "denominator": 100, + "numerator": 100 + } + } + } + } + ] @endcode + You need to use the `device_id` value. } @@ -891,7 +937,7 @@ editing the `conf` file in a text editor. Use the examples as reference. Example (Windows) @code{} - output_name = \\.\DISPLAY1 + output_name = {daeac860-f4db-5208-b1f5-cf59444fb768} @endcode diff --git a/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml b/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml index bead37b8..303f2e7e 100644 --- a/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml +++ b/packaging/linux/flatpak/dev.lizardbyte.app.Sunshine.yml @@ -32,6 +32,9 @@ modules: # Test dependencies - "modules/xvfb/xvfb.json" + # Build dependencies + - "modules/nlohmann_json.json" + # Runtime dependencies - shared-modules/libayatana-appindicator/libayatana-appindicator-gtk3.json - "modules/avahi.json" diff --git a/packaging/linux/flatpak/modules/nlohmann_json.json b/packaging/linux/flatpak/modules/nlohmann_json.json new file mode 100644 index 00000000..158f8b5b --- /dev/null +++ b/packaging/linux/flatpak/modules/nlohmann_json.json @@ -0,0 +1,15 @@ +{ + "name": "nlohmann_json", + "buildsystem": "cmake-ninja", + "config-opts": [ + "-DJSON_MultipleHeaders=OFF", + "-DJSON_BuildTests=OFF" + ], + "sources": [ + { + "type": "archive", + "url": "https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz", + "sha256": "d6c65aca6b1ed68e7a182f4757257b107ae403032760ed6ef121c9d55e81757d" + } + ] +} diff --git a/src/display_device.cpp b/src/display_device.cpp new file mode 100644 index 00000000..f273104b --- /dev/null +++ b/src/display_device.cpp @@ -0,0 +1,85 @@ +/** + * @file src/display_device.cpp + * @brief Definitions for display device handling. + */ +// header include +#include "display_device.h" + +// lib includes +#include +#include +#include + +// local includes +#include "platform/common.h" + +// platform-specific includes +#ifdef _WIN32 + #include + #include + #include +#endif + +namespace display_device { + namespace { + /** + * @brief A global for the settings manager interface whose lifetime is managed by `display_device::init()`. + */ + std::unique_ptr> SM_INSTANCE; + + /** + * @brief Construct a settings manager interface to manage display device settings. + * @return An interface or nullptr if the OS does not support the interface. + */ + std::unique_ptr + make_settings_manager() { +#ifdef _WIN32 + // TODO: In the upcoming PR, add audio context capture and settings persistence + return std::make_unique( + std::make_shared(std::make_shared()), + nullptr, + std::make_unique(nullptr), + WinWorkarounds {}); +#else + return nullptr; +#endif + } + } // namespace + + std::unique_ptr + init() { + // We can support re-init without any issues, however we should make sure to cleanup first! + SM_INSTANCE = nullptr; + + // If we fail to create settings manager, this means platform is not supported and + // we will need to provided error-free passtrough in other methods + if (auto settings_manager { make_settings_manager() }) { + SM_INSTANCE = std::make_unique>(std::move(settings_manager)); + + const auto available_devices { SM_INSTANCE->execute([](auto &settings_iface) { return settings_iface.enumAvailableDevices(); }) }; + BOOST_LOG(info) << "Currently available display devices:\n" + << toJson(available_devices); + + // TODO: In the upcoming PR, schedule recovery here + } + + class deinit_t: public platf::deinit_t { + public: + ~deinit_t() override { + // TODO: In the upcoming PR, execute recovery once here + SM_INSTANCE = nullptr; + } + }; + return std::make_unique(); + } + + std::string + map_output_name(const std::string &output_name) { + if (!SM_INSTANCE) { + // Fallback to giving back the output name if the platform is not supported. + return output_name; + } + + return SM_INSTANCE->execute([&output_name](auto &settings_iface) { return settings_iface.getDisplayName(output_name); }); + } +} // namespace display_device diff --git a/src/display_device.h b/src/display_device.h new file mode 100644 index 00000000..6562f5a3 --- /dev/null +++ b/src/display_device.h @@ -0,0 +1,39 @@ +/** + * @file src/display_device.h + * @brief Declarations for display device handling. + */ +#pragma once + +// lib includes +#include + +// forward declarations +namespace platf { + class deinit_t; +} // namespace platf + +namespace display_device { + /** + * @brief Initialize the implementation and perform the initial state recovery (if needed). + * @returns A deinit_t instance that performs cleanup when destroyed. + * + * @examples + * const auto init_guard { display_device::init() }; + * @examples_end + */ + std::unique_ptr + init(); + + /** + * @brief Map the output name to a specific display. + * @param output_name The user-configurable output name. + * @returns Mapped display name or empty string if the output name could not be mapped. + * + * @examples + * const auto mapped_name_config { map_output_name(config::video.output_name) }; + * const auto mapped_name_custom { map_output_name("{some-device-id}") }; + * @examples_end + */ + std::string + map_output_name(const std::string &output_name); +} // namespace display_device diff --git a/src/logging.cpp b/src/logging.cpp index 6d108563..e4057d9e 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -15,6 +15,7 @@ #include #include #include +#include // local includes #include "logging.h" @@ -106,6 +107,7 @@ namespace logging { } setup_av_logging(min_log_level); + setup_libdisplaydevice_logging(min_log_level); sink = boost::make_shared(); @@ -159,6 +161,37 @@ namespace logging { }); } + void + setup_libdisplaydevice_logging(int min_log_level) { + constexpr int min_level { static_cast(display_device::Logger::LogLevel::verbose) }; + constexpr int max_level { static_cast(display_device::Logger::LogLevel::fatal) }; + const auto log_level { static_cast(std::min(std::max(min_level, min_log_level), max_level)) }; + + display_device::Logger::get().setLogLevel(log_level); + display_device::Logger::get().setCustomCallback([](const display_device::Logger::LogLevel level, const std::string &message) { + switch (level) { + case display_device::Logger::LogLevel::verbose: + BOOST_LOG(verbose) << message; + break; + case display_device::Logger::LogLevel::debug: + BOOST_LOG(debug) << message; + break; + case display_device::Logger::LogLevel::info: + BOOST_LOG(info) << message; + break; + case display_device::Logger::LogLevel::warning: + BOOST_LOG(warning) << message; + break; + case display_device::Logger::LogLevel::error: + BOOST_LOG(error) << message; + break; + case display_device::Logger::LogLevel::fatal: + BOOST_LOG(fatal) << message; + break; + } + }); + } + void log_flush() { if (sink) { diff --git a/src/logging.h b/src/logging.h index ee580e5d..88f26274 100644 --- a/src/logging.h +++ b/src/logging.h @@ -66,6 +66,13 @@ namespace logging { void setup_av_logging(int min_log_level); + /** + * @brief Setup logging for libdisplaydevice. + * @param min_log_level The log level. + */ + void + setup_libdisplaydevice_logging(int min_log_level); + /** * @brief Flush the log. * @examples diff --git a/src/main.cpp b/src/main.cpp index c4ded3d5..b9ffc049 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ // local includes #include "confighttp.h" +#include "display_device.h" #include "entry_handler.h" #include "globals.h" #include "httpcommon.h" @@ -133,6 +134,14 @@ main(int argc, char *argv[]) { return fn->second(argv[0], config::sunshine.cmd.argc, config::sunshine.cmd.argv); } + // Adding guard here first as it also performs recovery after crash, + // otherwise people could theoretically end up without display output. + // It also should be destroyed before forced shutdown to expedite the cleanup. + auto display_device_deinit_guard = display_device::init(); + if (!display_device_deinit_guard) { + BOOST_LOG(error) << "Display device session failed to initialize"sv; + } + #ifdef WIN32 // Modify relevant NVIDIA control panel settings if the system has corresponding gpu if (nvprefs_instance.load()) { @@ -230,7 +239,7 @@ main(int argc, char *argv[]) { // Create signal handler after logging has been initialized auto shutdown_event = mail::man->event(mail::shutdown); - on_signal(SIGINT, [&force_shutdown, shutdown_event]() { + on_signal(SIGINT, [&force_shutdown, &display_device_deinit_guard, shutdown_event]() { BOOST_LOG(info) << "Interrupt handler called"sv; auto task = []() { @@ -241,9 +250,10 @@ main(int argc, char *argv[]) { force_shutdown = task_pool.pushDelayed(task, 10s).task_id; shutdown_event->raise(true); + display_device_deinit_guard = nullptr; }); - on_signal(SIGTERM, [&force_shutdown, shutdown_event]() { + on_signal(SIGTERM, [&force_shutdown, &display_device_deinit_guard, shutdown_event]() { BOOST_LOG(info) << "Terminate handler called"sv; auto task = []() { @@ -254,6 +264,7 @@ main(int argc, char *argv[]) { force_shutdown = task_pool.pushDelayed(task, 10s).task_id; shutdown_event->raise(true); + display_device_deinit_guard = nullptr; }); #ifdef _WIN32 diff --git a/src/platform/macos/input.cpp b/src/platform/macos/input.cpp index 6be72233..bc6cf394 100644 --- a/src/platform/macos/input.cpp +++ b/src/platform/macos/input.cpp @@ -8,6 +8,7 @@ #include #include +#include "src/display_device.h" #include "src/logging.h" #include "src/platform/common.h" #include "src/utility.h" @@ -541,7 +542,7 @@ const KeyCodeMap kKeyCodesMap[] = { // Default to main display macos_input->display = CGMainDisplayID(); - auto output_name = config::video.output_name; + auto output_name = display_device::map_output_name(config::video.output_name); // If output_name is set, try to find the display with that display id if (!output_name.empty()) { uint32_t max_display = 32; diff --git a/src/platform/windows/display_base.cpp b/src/platform/windows/display_base.cpp index c6167886..3239c68b 100644 --- a/src/platform/windows/display_base.cpp +++ b/src/platform/windows/display_base.cpp @@ -16,6 +16,7 @@ typedef long NTSTATUS; #include "display.h" #include "misc.h" #include "src/config.h" +#include "src/display_device.h" #include "src/logging.h" #include "src/platform/common.h" #include "src/video.h" @@ -1101,7 +1102,8 @@ namespace platf { BOOST_LOG(debug) << "Detecting monitors..."sv; // We must set the GPU preference before calling any DXGI APIs! - if (!dxgi::probe_for_gpu_preference(config::video.output_name)) { + const auto output_name { display_device::map_output_name(config::video.output_name) }; + if (!dxgi::probe_for_gpu_preference(output_name)) { BOOST_LOG(warning) << "Failed to set GPU preference. Capture may not work!"sv; } diff --git a/src/video.cpp b/src/video.cpp index 20d22385..bf039ca8 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -18,6 +18,7 @@ extern "C" { #include "cbs.h" #include "config.h" +#include "display_device.h" #include "globals.h" #include "input.h" #include "logging.h" @@ -994,6 +995,8 @@ namespace video { */ void refresh_displays(platf::mem_type_e dev_type, std::vector &display_names, int ¤t_display_index) { + // It is possible that the output name may be empty even if it wasn't before (device disconnected) or vice-versa + const auto output_name { display_device::map_output_name(config::video.output_name) }; std::string current_display_name; // If we have a current display index, let's start with that @@ -1012,7 +1015,7 @@ namespace video { return; } else if (display_names.empty()) { - display_names.emplace_back(config::video.output_name); + display_names.emplace_back(output_name); } // We now have a new display name list, so reset the index back to 0 @@ -1032,7 +1035,7 @@ namespace video { } else { for (int x = 0; x < display_names.size(); ++x) { - if (display_names[x] == config::video.output_name) { + if (display_names[x] == output_name) { current_display_index = x; return; } @@ -2346,6 +2349,7 @@ namespace video { bool validate_encoder(encoder_t &encoder, bool expect_failure) { + const auto output_name { display_device::map_output_name(config::video.output_name) }; std::shared_ptr disp; BOOST_LOG(info) << "Trying encoder ["sv << encoder.name << ']'; @@ -2365,7 +2369,7 @@ namespace video { config_t config_autoselect { 1920, 1080, 60, 1000, 1, 0, 1, 0, 0, 0 }; // If the encoder isn't supported at all (not even H.264), bail early - reset_display(disp, encoder.platform_formats->dev_type, config::video.output_name, config_autoselect); + reset_display(disp, encoder.platform_formats->dev_type, output_name, config_autoselect); if (!disp) { return false; } @@ -2473,7 +2477,7 @@ namespace video { const config_t generic_hdr_config = { 1920, 1080, 60, 1000, 1, 0, 3, 1, 1, 0 }; // Reset the display since we're switching from SDR to HDR - reset_display(disp, encoder.platform_formats->dev_type, config::video.output_name, generic_hdr_config); + reset_display(disp, encoder.platform_formats->dev_type, output_name, generic_hdr_config); if (!disp) { return false; } @@ -2654,8 +2658,9 @@ namespace video { } if (chosen_encoder == nullptr) { + const auto output_name { display_device::map_output_name(config::video.output_name) }; BOOST_LOG(fatal) << "Unable to find display or encoder during startup."sv; - if (!config::video.adapter_name.empty() || !config::video.output_name.empty()) { + if (!config::video.adapter_name.empty() || !output_name.empty()) { BOOST_LOG(fatal) << "Please ensure your manually chosen GPU and monitor are connected and powered on."sv; } else { diff --git a/src_assets/common/assets/web/configs/tabs/AudioVideo.vue b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue index 21160dfe..0f18f9a1 100644 --- a/src_assets/common/assets/web/configs/tabs/AudioVideo.vue +++ b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue @@ -3,8 +3,7 @@ import {ref} from 'vue' import {$tp} from '../../platform-i18n' import PlatformLayout from '../../PlatformLayout.vue' import AdapterNameSelector from './audiovideo/AdapterNameSelector.vue' -import LegacyDisplayOutputSelector from './audiovideo/LegacyDisplayOutputSelector.vue' -import NewDisplayOutputSelector from './audiovideo/NewDisplayOutputSelector.vue' +import DisplayOutputSelector from './audiovideo/DisplayOutputSelector.vue' import DisplayDeviceOptions from "./audiovideo/DisplayDeviceOptions.vue"; import DisplayModesSettings from "./audiovideo/DisplayModesSettings.vue"; @@ -71,7 +70,7 @@ const config = ref(props.config) :config="config" /> - diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayOutputSelector.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayOutputSelector.vue new file mode 100644 index 00000000..d5f906e7 --- /dev/null +++ b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayOutputSelector.vue @@ -0,0 +1,53 @@ + + + diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue deleted file mode 100644 index 9dc3b21f..00000000 --- a/src_assets/common/assets/web/configs/tabs/audiovideo/LegacyDisplayOutputSelector.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue deleted file mode 100644 index d9d79bdc..00000000 --- a/src_assets/common/assets/web/configs/tabs/audiovideo/NewDisplayOutputSelector.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - diff --git a/src_assets/common/assets/web/public/assets/locale/en.json b/src_assets/common/assets/web/public/assets/locale/en.json index a41617fe..b277c8af 100644 --- a/src_assets/common/assets/web/public/assets/locale/en.json +++ b/src_assets/common/assets/web/public/assets/locale/en.json @@ -252,9 +252,9 @@ "origin_web_ui_allowed_pc": "Only localhost may access Web UI", "origin_web_ui_allowed_wan": "Anyone may access Web UI", "output_name_desc_unix": "During Sunshine startup, you should see the list of detected displays. Note: You need to use the id value inside the parenthesis. Below is an example; the actual output can be found in the Troubleshooting tab.", - "output_name_desc_windows": "Manually specify a display to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. The appropriate values can be found using the following command:", + "output_name_desc_windows": "Manually specify a display device id to use for capture. If unset, the primary display is captured. Note: If you specified a GPU above, this display must be connected to that GPU. During Sunshine startup, you should see the list of detected displays. Below is an example; the actual output can be found in the Troubleshooting tab.", "output_name_unix": "Display number", - "output_name_windows": "Output Name", + "output_name_windows": "Display Device Id", "ping_timeout": "Ping Timeout", "ping_timeout_desc": "How long to wait in milliseconds for data from moonlight before shutting down the stream", "pkey": "Private Key", diff --git a/third-party/libdisplaydevice b/third-party/libdisplaydevice new file mode 160000 index 00000000..bbcd179c --- /dev/null +++ b/third-party/libdisplaydevice @@ -0,0 +1 @@ +Subproject commit bbcd179c475eeccf1928b1249da2b663efefc949