Giter Club home page Giter Club logo

wolf's Introduction

Games on Whales docs portal

Quickstart

npm i
npx antora --fetch antora-playbook.yml

wolf's People

Contributors

abeltramo avatar almino avatar bludyh avatar cancrusher avatar cupown avatar drakulix avatar e-dong avatar murazaki avatar randomninjaatk avatar zb140 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

wolf's Issues

Wolf API

Overview

The basic idea is to properly separate the core of Wolf from the Moonlight protocol:

Drawing 2023-06-30 20 02 14 excalidraw

The main benefit of this approach is that the same underlying core methods (create virtual remote sessions and stream them) could be accessed by any other kind of client, for example:

  • A web config page where you can see live what's running and have full control over start/stop of any part of it
  • A different streaming protocol like WebRTC
  • As a normal API accessible from any other kind of language

This would also allow controlling multiple distributed servers (aka: Kubernetes support, as requested by many)

Implementation

So... a REST API?
A typical REST API could work, but it doesn't cover all the events that are starting from the backend and that needs to be sent to clients, ex: an application stopped running, a pipeline failed, or a remote controller received rumble data.

So... a WebSocket?
A WebSocket allows having a communication channel that is bidirectional, and has the good advantage that can also be used natively by browser based languages. This might be one way forward, but then I discovered something that might be a better fit:

MQTT:

  • Event driven, a great fit to how Wolf is already structured
  • Can work over TCP/UDP and WebSockets.
  • Supports QoS, persistent sessions, encryption and authentication
  • Lots of well-supported libraries to use it in most programming languages

My only concern is how well it'll be suited for carrying mouse/keyboard/joypad inputs where latency is absolutely fundamental.

This still needs to be fleshed out properly, in the meantime, here are a few interesting links:

Display apps box arts

I've completely forgot about the appassets API call. We should add (optional) images as paths or base64 to the config file.

Add virtual mouse/kb/pad

We can already parse and decrypt the control stream, we should use the user information that Moonlight is sending.
We should probably use libevdev to control uinput; see: kernel.org

Docker: mount different folders for different sessions

At the moment users have to specify the "state" folder in the config.toml ex: /home/ale/retro:/home/retro:rw.

Ideally, we should have a way to mount different folders for different sessions so that it resolves to something like: <HOST_STATE_FOLDER>/<SESSION_ID>/<APP_NAME>:/home/retro:rw.

To keep this as flexible as possible I think we should add an extra option under [[paired_clients]]:

[[paired_clients]]
app_state_folder = "12345" # Defaults to session_id (which is hash(client_cert))

That app_state_folder will be concatenated with HOST_STATE_FOLDER which is a new env variable (so that users don't have to fiddle with the config.toml when first starting).

This way, by default each user will have his own state folder, but if you want to share the same folders with multiple users you can just override the config.toml file.

Add a way to emulate the GUIDE button

Many moonlight platforms (like Android TV or Apple TVs) will capture the GUIDE button of an attached controller. It would be nice if wolf provided a way to translate a weird combination like Hold select for 5 seconds or Start+Select into this button to bring up the Steam Overlay for example more easily.

Wolf logo?

Anyone wants to craft some nice logo for the project?

app_state_folder not using sessionID

On a fresh install of Wolf, the config file has the app_state_folder for each paired client is set to

app_state_folder = ""

This results in that paired client using /etc/wolf as the root folder instead of /etc/woft//

Work Around

  1. Open the config.toml
  2. For each paired client remove the line for app_state_folder, this will result in correct behavior

Integrate the NVIDIA container toolkit

This is an issue that has been spun off from the Discord channel.

@Murazaki : It might be good to find a better workflow for providing drivers to Wolf.
On Debian, drivers are pretty old in the main stable repo, and updated ones can be found on CUDA drivers, but do not exactly match manual installation ones.

@ABeltramo : I guess I should go back to look into the Nvidia Docker Toolkit for people that would like to use that
I agree though, it's a bit of a pain point at the moment

@Murazaki : Cuda drivers repo :
https://developer.download.nvidia.com/compute/cuda/repos/

Linux manual installer :
https://download.nvidia.com/XFree86/Linux-x86_64/

right now, latest in cuda packaged installs is 545.23.08.
It doesn't exist as a manual installer.
that breaks the dockerfile and renders wolf unusable
I wanted to make a docker image for debian packages install, but it uses apt-add-repository which is installing a bunch of supplementary stuff
Here it is for Debian Bookworm :
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Debian&target_version=12&target_type=deb_network

More thorough installation steps here :
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

@juliosueiras : There is one problem though, nvidia driver toolkit doesn’t inject driver in the container and still require a driver installed in the container image itself,


And here, I start with what interventions I made with NVIDIA for the last three years to not require the NVIDIA drivers to run Wayland inside the NVIDIA container toolkit.

What NVIDIA container toolkit does: it's pretty simple. It injects (1) kernel devices, and (2) userspace libraries, into a container. (1) and (2) compose a subset of the driver.

(1) kernel devices: /dev/nvidiaN, /dev/nvidiactl, /dev/nvidia-modeset, /dev/nvidia-uvm, and /dev/nvidia-uvm-tools. In addition, /dev/dri/cardX and /dev/dri/renderDY, where N, X, and Y depend on the GPU the container toolkit provisions. The /dev/dri devices were added with NVIDIA/libnvidia-container#118.

(2) userspace libraries:
OpenGL libraries including EGL: '/usr/lib/libGL.so.1', '/usr/lib/libEGL.so.1', '/usr/lib/libGLESv1_CM.so.525.78.01', '/usr/lib/libGLESv2.so.525.78.01', '/usr/lib/libEGL_nvidia.so.0', '/usr/lib/libOpenGL.so.0', '/usr/lib/libGLX.so.0', and '/usr/lib/libGLdispatch.so.0', '/usr/lib/libnvidia-tls.so.525.78.01'

Vulkan libraries: '/usr/lib/libGLX_nvidia.so.0' and the configuration '/etc/vulkan/icd.d/nvidia_icd.json'

EGLStreams-Wayland and GBM-Wayland libraries: '/usr/lib/libnvidia-egl-wayland.so.1' and the config '/usr/share/egl/egl_external_platform.d/10_nvidia_wayland.json' '/usr/lib/libnvidia-egl-gbm.so.1' and the config '/usr/share/egl/egl_external_platform.d/15_nvidia_gbm.json'

NVENC libraries: /usr/lib/libnvidia-encode.so.525.78.01, which depends on /usr/lib/libnvcuvid.so.525.78.01, which depends on /usr/lib/x86_64-linux-gnu/libcuda.so.1

VDPAU libraries: /usr/lib/vdpau/libvdpau_nvidia.so.525.78.01
NVFBC libraries: /usr/lib/libnvidia-fbc.so.525.78.01
OPTIX libraries: /usr/lib/libnvoptix.so.1

Not very relevant but of note, perhaps for XWayland: NVIDIA X.Org driver: /usr/lib/xorg/modules/drivers/nvidia_drv.so, NVIDIA X.org GLX driver: /usr/lib/xorg/modules/extensions/libglxserver_nvidia.so.525.78.01

In many cases, things don't work because the below configuration files are absent inside the container. Without these, applications inside the container don't know which library to call (what each file does is self-explanatory):

The contents of /usr/share/glvnd/egl_vendor.d/10_nvidia.json:

{
    "file_format_version" : "1.0.0",
    "ICD" : {
        "library_path" : "libEGL_nvidia.so.0"
    }
}

The contents of /etc/vulkan/icd.d/nvidia_icd.json (note that api_version is variable based on the Driver version):

{
    "file_format_version" : "1.0.0",
    "ICD": {
        "library_path": "libGLX_nvidia.so.0",
        "api_version" : "1.3.205"
    }
}

The contents of /etc/OpenCL/vendors/nvidia.icd:

libnvidia-opencl.so.1

The contents of /usr/share/egl/egl_external_platform.d/15_nvidia_gbm.json:

{
        "file_format_version" : "1.0.0",
        "ICD" : {
                "library_path" : "libnvidia-egl-gbm.so.1"
        }
}

The contents of /usr/share/egl/egl_external_platform.d/10_nvidia_wayland.json:

{
    "file_format_version" : "1.0.0",
    "ICD" : {
        "library_path" : "libnvidia-egl-wayland.so.1"
    }
}

I'm pretty sure that now (was different a few months ago), the newest NVIDIA container toolkit provisions all of the required libraries plus the json configurations for Wayland (not for X11 but you don't have to care).
If only the json configurations are absent, it's trivial to manually add the above template.

About GStreamer:
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3108

Now, it is correct that NVENC does require CUDA. But that doesn't mean that it requires the whole CUDA Toolkit (separate from the CUDA drivers). The CUDA drivers are the four following libraries installed with the display drivers, independent of the CUDA Toolkit: libcuda.so, libnvidia-ptxjitcompiler.so, libnvidia-nvvm.so, libcudadebugger.so

These versions go with the display drivers, and are all injected into the container by the NVIDIA container toolkit.

GStreamer 1.22 and before in nvcodec requires just two files of the CUDA Toolkit: libnvrtc.so and libnvrtc-bulletins.so. This can be installed from the network repository like the current approach, or be extracted from a PyPi package:

# Extract NVRTC dependency, https://developer.download.nvidia.com/compute/cuda/redist/cuda_nvrtc/LICENSE.txt
cd /tmp && curl -fsSL -o nvidia_cuda_nvrtc_linux_x86_64.whl "https://developer.download.nvidia.com/compute/redist/nvidia-cuda-nvrtc/nvidia_cuda_nvrtc-11.0.221-cp36-cp36m-linux_x86_64.whl" && unzip -joq -d ./nvrtc nvidia_cuda_nvrtc_linux_x86_64.whl && cd nvrtc && chmod 755 libnvrtc* && find . -maxdepth 1 -type f -name "*libnvrtc.so.*" -exec sh -c 'ln -snf $(basename {}) libnvrtc.so' \; && mv -f libnvrtc* /opt/gstreamer/lib/x86_64-linux-gnu/ && cd /tmp && rm -rf /tmp/*

One thing to note here is that libnvrtc.so is not minor version compatible with CUDA. Thus, it will error on any display driver version older than its corresponding display driver version. However, backwards compatibility always works. Thus, it is a good idea to use the oldest possible libnvrtc.so version.

Display CUDA
545 - 12.3
535 - 12.2
530 - 12.1
525 - 12.0
520 - 11.8
515 - 11.7
(and so on...)

https://docs.nvidia.com/deploy/cuda-compatibility/

So, I have moderate to high confidence that if you guys try the newest NVIDIA container toolkit again, you won't need to install the drivers, assuming that you ensure the json files are present or written.

Environment variables that currently work for me:

RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
    echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf
# Expose NVIDIA libraries and paths
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
# Make all NVIDIA GPUs visible by default
ENV NVIDIA_VISIBLE_DEVICES all
# All NVIDIA driver capabilities should preferably be used, check `NVIDIA_DRIVER_CAPABILITIES` inside the container if things do not work
ENV NVIDIA_DRIVER_CAPABILITIES all
# Disable VSYNC for NVIDIA GPUs
ENV __GL_SYNC_TO_VBLANK 0

Corrupted stream with Intel iGPU

Hi,

I'm in the process of setting up a small retro game server and came across the "gow" project. Then I came across this project. But unfortunately the output of the emulation station “Server” is corrupted.

Some specs of my server

  • Intel iGPU HD Graphics 530
  • CPU Intel(R) Core(TM) i5-6500T CPU @ 2.50GHz
  • Podman 4.6.2 (Container is setuped using the Docker Compose file of the wiki)

Wolf Log:

[2023-10-05 14:57:30] 

[2023-10-05 14:57:30] [ /etc/cont-init.d/10-setup_user.sh: executing... ]

[2023-10-05 14:57:30] **** Configure default user ****

[2023-10-05 14:57:30] Container running as root. Nothing to do.

[2023-10-05 14:57:30] DONE

[2023-10-05 14:57:30] 

[2023-10-05 14:57:30] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]

[2023-10-05 14:57:30] **** Configure devices ****

[2023-10-05 14:57:30] Exec device groups

[2023-10-05 14:57:30] Adding user 'root' to groups: gow-gid-106,root

[2023-10-05 14:57:31] DONE

[2023-10-05 14:57:31] 

[2023-10-05 14:57:31] [ /etc/cont-init.d/30-nvidia.sh: executing... ]

[2023-10-05 14:57:31] 

[2023-10-05 14:57:31] 

[2023-10-05 14:57:31] [ /etc/cont-init.d/init-gamescope.sh: executing... ]

[2023-10-05 14:57:31] **** Setting up Gamescope ****

[2023-10-05 14:57:31] Launching the container's startup script as user 'root'

libva info: VA-API version 1.17.0

libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so

libva info: Found init function __vaDriverInit_1_17

libva info: va_openDriver() returns 0

0:00:00.302829809    83 0x5603ec78f9d0 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library

0:00:00.303631545    83 0x5603ec78f9d0 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library

0:00:00.304971545    83 0x5603ec78f9d0 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library

0:00:00.373203948    83 0x5603ec78f9d0 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x5603ec6b5d60> Could not set value on item: format-version

0:00:00.373319656    83 0x5603ec78f9d0 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x5603ec7c1d20> Could not set value on item: format-version

0:00:00.373375787    83 0x5603ec78f9d0 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x5603ec7c24d0> Could not set value on item: format-version

0:00:00.375318331    83 0x5603ec78f9d0 WARN               structure gststructure.c:2334:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype

0:00:00.514929339    83 0x5603ec78f9d0 WARN                 default gstvaapi.c:231:plugin_init: Cannot create a VA display

0:00:00.518486509    83 0x5603ec78f9d0 WARN      GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise

0:00:00.625562292    83 0x5603ec78f9d0 WARN              cudaloader gstcudaloader.c:169:gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory

0:00:00.625613598    83 0x5603ec78f9d0 WARN                 nvcodec plugin.c:93:plugin_init: Failed to load cuda library

0:00:00.830298712    83 0x5603ec78f9d0 WARN      GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise

14:57:32.088505639 INFO  | Gstreamer version: 1.22.0-0

14:57:32.093558093 INFO  | Reading config file from: /wolf/cfg/config.toml

0:00:00.930457280     1 0x563b07b65920 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh264enc"!

libva info: VA-API version 1.17.0

libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so

libva info: Found init function __vaDriverInit_1_17

libva info: va_openDriver() returns 0

14:57:32.207282496 INFO  | Selected H264 encoder: qsv

0:00:01.005504260     1 0x563b07b65920 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh265enc"!

14:57:32.207535474 INFO  | Selected HEVC encoder: qsv

14:57:32.210521645 INFO  | RTSP server started on port: 48010

14:57:32.210597091 INFO  | HTTP server listening on port: 47989 

14:57:32.210932412 WARN  | [PULSE] Unable to connect, Access denied

14:57:32.211077857 INFO  | Starting PulseAudio docker container

14:57:32.211313625 INFO  | RTP server started on port: 48000

14:57:32.211321237 INFO  | RTP server started on port: 47998

14:57:32.211784691 INFO  | Control server started on port: 47999

14:57:32.213460119 INFO  | HTTPS server listening on port: 47984 

14:58:06.399474336 INFO  | Starting container: /WolfES-DE_2422947761925974632

0:00:36.470339327     1 0x7f86ec001050 WARN            audioencoder gstaudioencoder.c:1014:gst_audio_encoder_finish_frame:<opusenc0> Can't copy metadata because input buffer disappeared

0:02:09.872976069     1 0x7f86c4002470 WARN                audiosrc gstaudiosrc.c:227:audioringbuffer_thread_func:<pulsesrc0> error reading data -1 (reason: Success), skipping segment

14:59:49.648466542 INFO  | Stopped container: /WolfES-DE_2422947761925974632

Emulationstation Container

[2023-10-05 15:11:21] 

[2023-10-05 15:11:21] [ /etc/cont-init.d/10-setup_user.sh: executing... ]

[2023-10-05 15:11:21] **** Configure default user ****

[2023-10-05 15:11:21] Setting default user uid=1000(retro) gid=1000(retro)

[2023-10-05 15:11:21] Setting umask to 000

[2023-10-05 15:11:21] Ensure retro home directory is writable

[2023-10-05 15:11:21] Ensure XDG_RUNTIME_DIR is writable

[2023-10-05 15:11:21] DONE

[2023-10-05 15:11:21] 

[2023-10-05 15:11:21] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]

[2023-10-05 15:11:21] **** Configure devices ****

[2023-10-05 15:11:21] Exec device groups

[2023-10-05 15:11:22] Adding user 'retro' to groups: gow-gid-109,gow-gid-106,video

[2023-10-05 15:11:22] DONE

[2023-10-05 15:11:22] 

[2023-10-05 15:11:22] [ /etc/cont-init.d/30-nvidia.sh: executing... ]

[2023-10-05 15:11:22] 

[2023-10-05 15:11:22] 

[2023-10-05 15:11:22] [ /etc/cont-init.d/init-gamescope.sh: executing... ]

[2023-10-05 15:11:22] **** Setting up Gamescope ****

[2023-10-05 15:11:22] 

[2023-10-05 15:11:22] [ /etc/cont-init.d/setup-de.sh: executing... ]

[2023-10-05 15:11:22] Starting Application preparation

[2023-10-05 15:11:22] Copying custom config - retroarch.cfg, if not edited

[2023-10-05 15:11:22] Copying custom config - ES-DE Custom Scripts Platform, if not edited

[2023-10-05 15:11:22] Copying custom gamelist - ES-DE Custom Scripts Platform, if not edited

[2023-10-05 15:11:22] Copying custom config - RPCS3 Controller Bindings for Wolf and disable Auto-Update pop-up, if not edited

[2023-10-05 15:11:22] Copying custom config - PCSX2 settings, if not edited

[2023-10-05 15:11:22] Copying custom config - XEMU settings, if not edited

[2023-10-05 15:11:22] Copying hdd for XEMU if it is present in bioses or newer

[2023-10-05 15:11:22] Copying keys for YUZU if it is present in bioses or newer

[2023-10-05 15:11:22] Copying custom config - YUZU QT settings, if not edited

[2023-10-05 15:11:22] Copying default config - EmulationStation settings, if not edited

[2023-10-05 15:11:22] Change media directory for EmulationStation to /media

[2023-10-05 15:11:22] Change ROMs directory for EmulationStation to /ROMs

[2023-10-05 15:11:22] Copying custom launch scripts for emulators and programs, if not edited

[2023-10-05 15:11:22] Checking RA Assets presence, if none - install them

[2023-10-05 15:11:22] Symlinking AppImage Emulators from /Applications

[2023-10-05 15:11:22] Symlinking Bioses from /Bioses

[2023-10-05 15:11:22] Launching the container's startup script as user 'retro'

[2023-10-05 15:11:22] Launching EmulationStation-Desktop Edition

No CAP_SYS_NICE, falling back to regular-priority compute and threads.

Performance will be affected.

wlserver: [backend/headless/backend.c:68] Creating headless backend

Couldn't open plugin directory: No such file or directory

No plugins found, falling back on no decorations

vulkan: selecting physical device 'Intel(R) HD Graphics 530 (SKL GT2)': queue family 0

vulkan: physical device supports DRM format modifiers

vulkan: supported DRM formats for sampling usage:

vulkan:   AR24 (0x34325241)

vulkan:   XR24 (0x34325258)

vulkan:   AB24 (0x34324241)

vulkan:   XB24 (0x34324258)

vulkan:   NV12 (0x3231564E)

vulkan:   AB4H (0x48344241)

vulkan:   XB4H (0x48344258)

vulkan:   AB48 (0x38344241)

vulkan:   XB48 (0x38344258)

vulkan:   AB30 (0x30334241)

vulkan:   XB30 (0x30334258)

vulkan:   AR30 (0x30335241)

vulkan:   XR30 (0x30335258)

wlserver: Running compositor on wayland display 'gamescope-0'

wlserver: [backend/headless/backend.c:16] Starting headless backend

wlserver: [xwayland/sockets.c:118] Created /tmp/.X11-unix ourselves -- other users will be unable to create X11 UNIX sockets of their own

wlserver: [xwayland/server.c:108] Starting Xwayland on :0

wlserver: [types/wlr_compositor.c:681] New wlr_surface 0x5581a5cf2780 (res 0x5581a5c1f330)

wlserver: [xwayland/server.c:273] Xserver is ready

[W][04629.649822] pw.conf      | [          conf.c:  939 try_load_conf()] can't load config client.conf: No such file or directory

[E][04629.650013] pw.conf      | [          conf.c:  963 pw_conf_load_conf_for_context()] can't load default config client.conf: No such file or directory

pipewire: pw_context_new failed

Warning: failed to setup PipeWire, screen capture won't be available

xwm: Failed to load host cursor. Falling back to left_ptr.

WARNING: Kernel has no file descriptor comparison support: Operation not permitted

wlserver: [types/wlr_compositor.c:681] New wlr_surface 0x5581a5d9f560 (res 0x5581a5c22580)

The XKEYBOARD keymap compiler (xkbcomp) reports:

> Warning:          Unsupported maximum keycode 708, clipping.

>                   X11 cannot support keycodes above 255.

Errors from xkbcomp are not fatal to the X server

ALSA lib confmisc.c:855:(parse_card) cannot find card '0'

ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_card_inum returned error: No such file or directory

ALSA lib confmisc.c:422:(snd_func_concat) error evaluating strings

ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory

ALSA lib confmisc.c:1334:(snd_func_refer) error evaluating name

ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory

ALSA lib conf.c:5703:(snd_config_expand) Evaluate error: No such file or directory

ALSA lib pcm.c:2666:(snd_pcm_open_noupdate) Unknown PCM default

Oct 05 15:11:26 Error:  Unable to open audio device: ALSA: Couldn't open audio device: No such file or directory

Moonlight Stream:

Glitch

I should mention that the Firefox container, for example, works fine.

Steam-Related Problems Encountered While Using Wolf

After my first attempt to use Wolf on my main PC, I decided to give it another try on a different PC with different specs. The goal was to figure out why I can't use Steam with Wolf. I installed Archlinux on the second PC and after setting things up, I tested Wolf again. Unfortunately, I encountered the exact same problems as with my other PC. Just as a reminder, the issues I'm facing on both PCs are:

  • When I launch the Steam docker and connect to it via Moonlight, there's a significant delay between starting the docker and the screen transitioning from black to the UI. On my new PC, I had to wait for more than 10 minutes before being able to log in to Steam.

  • After installing a game in the Steam docker, the download completes successfully. However, once the download is finished, the screen turns completely black, and I'm unable to do anything except exit the Steam docker and restart it.

  • Games are not functioning, particularly when using Proton (since I don't have native Linux games).

Here's my configuration:

$ sudo lshw -short
Chemin matériel  Périphérique  Classe         Description
============================================================
                                  system         GL502VMZ
/0                                bus            GL502VMZ
/0/0                              memory         64KiB BIOS
/0/8                              memory         8GiB Mémoire Système
/0/8/0                            memory         8GiB SODIMM DDR4 Synchrone 2400 MHz (0,4 ns)
/0/8/1                            memory         Project-Id-Version: @(#) $Id: fr.po 2151 2010-03-15 20:26:20Z lyone
/0/8/2                            memory         Project-Id-Version: @(#) $Id: fr.po 2151 2010-03-15 20:26:20Z lyone
/0/8/3                            memory         Project-Id-Version: @(#) $Id: fr.po 2151 2010-03-15 20:26:20Z lyone
/0/e                              memory         256KiB L1 cache
/0/f                              memory         1MiB L2 cache
/0/10                             memory         6MiB L3 cache
/0/11                             processor      Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz
/0/100                            bridge         Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
/0/100/1                          bridge         6th-10th Gen Core Processor PCIe Controller (x16)
/0/100/1/0                        display        GP106M [GeForce GTX 1060 Mobile]
/0/100/1/0.1      card1           multimedia     GP106 High Definition Audio Controller
/0/100/1/0.1/0    input16         input          HDA NVidia HDMI/DP,pcm=3
/0/100/1/0.1/1    input17         input          HDA NVidia HDMI/DP,pcm=7
/0/100/1/0.1/2    input18         input          HDA NVidia HDMI/DP,pcm=8
/0/100/1/0.1/3    input19         input          HDA NVidia HDMI/DP,pcm=9
/0/100/4                          generic        Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem
/0/100/14                         bus            100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller
/0/100/14/0       usb1            bus            xHCI Host Controller
/0/100/14/0/4                     multimedia     USB2.0 HD UVC WebCam
/0/100/14/0/8     input6          input          Asus Keyboard
/0/100/14/0/9                     communication  Bluetooth wireless interface
/0/100/14/1       usb2            bus            xHCI Host Controller
/0/100/14.2                       generic        100 Series/C230 Series Chipset Family Thermal Subsystem
/0/100/15                         generic        100 Series/C230 Series Chipset Family Serial IO I2C Controller #0
/0/100/15.1                       generic        100 Series/C230 Series Chipset Family Serial IO I2C Controller #1
/0/100/16                         communication  100 Series/C230 Series Chipset Family MEI Controller #1
/0/100/17                         storage        HM170/QM170 Chipset SATA Controller [AHCI Mode]
/0/100/1c                         bridge         100 Series/C230 Series Chipset Family PCI Express Root Port #1
/0/100/1c.2                       bridge         100 Series/C230 Series Chipset Family PCI Express Root Port #3
/0/100/1c.2/0     wlan0           network        Wireless 8260
/0/100/1c.3                       bridge         100 Series/C230 Series Chipset Family PCI Express Root Port #4
/0/100/1c.3/0     enp4s0          network        RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
/0/100/1d                         bridge         100 Series/C230 Series Chipset Family PCI Express Root Port #9
/0/100/1d/0       /dev/nvme0      storage        BT58SSD13E
/0/100/1d/0/0     hwmon3          disk           NVMe disk
/0/100/1d/0/2     /dev/ng0n1      disk           NVMe disk
/0/100/1d/0/1     /dev/nvme0n1    disk           1TB NVMe disk
/0/100/1d/0/1/1   /dev/nvme0n1p1  volume         511MiB Windows FAT volume
/0/100/1d/0/1/2   /dev/nvme0n1p2  volume         931GiB EFI partition
/0/100/1f                         bridge         HM175 Chipset LPC/eSPI Controller
/0/100/1f/0                       system         Motherboard registers
/0/100/1f/1                       system         Motherboard registers
/0/100/1f/2                       system         AT Real-Time Clock
/0/100/1f/3                       generic        PnP device INT3f0d
/0/100/1f/4                       generic        PnP device ATK3001
/0/100/1f/5                       system         Motherboard registers
/0/100/1f/6                       system         Motherboard registers
/0/100/1f/7                       system         Motherboard registers
/0/100/1f/8                       system         Motherboard registers
/0/100/1f.2                       memory         Memory controller
/0/100/1f.3       card0           multimedia     CM238 HD Audio Controller
/0/100/1f.3/0     input20         input          HDA Intel PCH Headphone
/0/100/1f.4                       bus            100 Series/C230 Series Chipset Family SMBus
/1                /dev/fb0        display        EFI VGA
/2                input0          input          Lid Switch
/3                input1          input          Sleep Button
/4                input10         input          PC Speaker
/5                input11         input          Asus WMI hotkeys
/6                input14         input          ELAN1200:00 04F3:3049 Mouse
/7                input15         input          ELAN1200:00 04F3:3049 Touchpad
/8                input2          input          Power Button
/9                input3          input          Power Button
/a                input35         input          Wolf mouse virtual device
/b                input36         input          Wolf touchpad virtual device
/c                input37         input          Wolf keyboard virtual device
/d                input38         input          Wolf X-Box One (virtual) pad
/e                input39         input          Wolf X-Box One (virtual) pad
/f                input4          input          Video Bus
/10               input40         input          Wolf X-Box One (virtual) pad
/11               input41         input          Wolf X-Box One (virtual) pad
/12               input5          input          AT Translated Set 2 keyboard
/13               input9          input          Asus Wireless Radio Control
$ nvidia-smi
Wed Aug 23 13:26:17 2023       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.98                 Driver Version: 535.98       CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce GTX 1060        Off | 00000000:01:00.0  On |                  N/A |
| N/A   56C    P8               8W /  78W |    382MiB /  6144MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

Here are the steps I took to install Wolf:

I began by using Pacman to install the following packages:

  • docker 1:24.0.5-1
  • nvidia-container-toolkit 1.13.5-1
  • cuda 12.2.0-1

Next, I enabled Docker using the command:

sudo systemctl enable docker.service

To prevent permission issues with Docker, I added myself to the Docker group:

sudo usermod -aG docker ${USER}

After that, I rebooted the system.

Following the Nvidia section of the Wolf wiki's quickstart guide, I did the following:

curl https://raw.githubusercontent.com/games-on-whales/gow/master/images/nvidia-driver/Dockerfile | docker build -t gow/nvidia-driver:latest -f - --build-arg NV_VERSION=$(cat /sys/module/nvidia/version)

docker run --name nvidia-driver-container --rm --mount source=nvidia-driver-vol,destination=/usr/nvidia gow/nvidia-driver:latest sh

I verified everything was in order by executing the following commands:

$ docker volume ls | grep nvidia-driver
local     nvidia-driver-vol

$ sudo cat /sys/module/nvidia_drm/parameters/modeset
[sudo] Password for david:
Y

I also ran the script to start nvidia_uvm devices:

$ #!/bin/bash
## Script to initialize nvidia device nodes.
## https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-verifications

/sbin/modprobe nvidia
if [ "$?" -eq 0 ]; then
  # Count the number of NVIDIA controllers found.
  NVDEVS=`lspci | grep -i NVIDIA`
  N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
  NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`
  N=`expr $N3D + $NVGA - 1`
  for i in `seq 0 $N`; do
    mknod -m 666 /dev/nvidia$i c 195 $i
  done
  mknod -m 666 /dev/nvidiactl c 195 255
else
  exit 1
fi

/sbin/modprobe nvidia-uvm
if [ "$?" -eq 0 ]; then
  # Find out the major device number used by the nvidia-uvm driver
  D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
  mknod -m 666 /dev/nvidia-uvm c $D 0
  mknod -m 666 /dev/nvidia-uvm-tools c $D 0
fiexit 1
mknod: /dev/nvidia0: Le fichier existe
mknod: /dev/nvidiactl: Le fichier existe
mknod: /dev/nvidia-uvm: Le fichier existe
mknod: /dev/nvidia-uvm-tools: Le fichier existe

For those not speaking french, the last 4 lines say "The file exists"

I also followed the steps to utilize uinput by executing the following two commands:

$ ls -la /dev/uinput
crw-rw----+ 1 root input 10, 223 Aug 23 13:06 /dev/uinput

sudo usermod -a -G input $USER

Subsequently, I created the file 85-wolf-virtual-inputs.rules in the directory /etc/udev/rules.d/ and included the following lines in it:

KERNEL=="uinput", SUBSYSTEM=="misc", MODE="0660", GROUP="input", OPTIONS+="static_node=uinput"
SUBSYSTEMS=="input", ATTRS{id/vendor}=="ab00", MODE="0660", GROUP="input", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{id/vendor}=="045e", ATTRS{id/product}=="02d1", ATTRS{id/version}=="ab00", MODE="0660", GROUP="input"

After completing these steps, I proceeded to start Wolf:

docker run \
    --name wolf \
    --network=host \
    -e XDG_RUNTIME_DIR=/tmp/sockets \
    -v /tmp/sockets:/tmp/sockets:rw \
    -e NVIDIA_DRIVER_VOLUME_NAME=nvidia-driver-vol \
    -v nvidia-driver-vol:/usr/nvidia:rw \
    -e HOST_APPS_STATE_FOLDER=/etc/wolf \
    -v /etc/wolf/wolf:/wolf/cfg \
    -v /var/run/docker.sock:/var/run/docker.sock:rw \
    --device-cgroup-rule "c 13:* rmw" \
    --device /dev/nvidia-uvm \
    --device /dev/nvidia-uvm-tools \
    --device /dev/dri/ \
    --device /dev/nvidia-caps/nvidia-cap1 \
    --device /dev/nvidia-caps/nvidia-cap2 \
    --device /dev/nvidiactl \
    --device /dev/nvidia0 \
    --device /dev/nvidia-modeset \
    --device /dev/uinput \
    -v /dev/shm:/dev/shm:rw \
    -v /dev/input:/dev/input:rw \
    -v /run/udev:/run/udev:rw \
    ghcr.io/games-on-whales/wolf:stable

Subsequently, I encountered an issue where Wolf wouldn't start properly, and I quickly received the following error:

ERRO[0000] error waiting for container:
Error response from daemon: error gathering device information while adding custom device "/dev/nvidia-caps/nvidia-cap1": no such file or directory

To resolve this, I discovered that running the following command before launching the container helped:

sudo nvidia-container-cli --load-kmods info

With this command in place, I can successfully start the Wolf container without any issues, but this workaround is necessary after each computer restart. Upon restart, I need to execute the aforementioned command (the one with nvidia-container-cli) again.

To initiate the Wolf container after its initial installation, I utilize the following command:

docker start wolf -a

As detailed here: https://github.com/games-on-whales/wolf/issues/38, I also made modifications to /etc/wolf/wolf/config.toml to configure it for the initial launch like this:

[[apps]]
title = "Steam"
start_virtual_compositor = true

[apps.runner]
type = "docker"
name = "WolfSteam"
image = "ghcr.io/games-on-whales/steam:edge"
mounts = ["/run/udev:/run/udev:ro"]
env = [
"STEAM_STARTUP_FLAGS=-nogamepadui","PROTON_LOG=1","RUN_GAMESCOPE=true","GOW_REQUIRED_DEVICES=/dev/uinput /dev/input/event* /dev/dri/* /dev/nvidia*",
]
devices = []
ports = []
base_create_json = """
{
  "HostConfig": {
    "IpcMode": "host",
    "CapAdd": ["SYS_ADMIN", "SYS_NICE"],
    "Privileged": true
  }
}
\
"""

After successfully logging in, I only removed the "STEAM_STARTUP_FLAGS=-nogamepadui" from the file.

Now that the setup is operational, I'm able to connect to Wolf using Moonlight. Most applications work relatively well, although I haven't extensively explored them. The one application I'm particularly interested in is Steam, and that's where I encountered the issues I initially mentioned in this message.

I would also like to provide some logs, but I'm unsure where they might exist and where to locate them.

Where do your games go?

So, for example, for retroarch -- where do you put your games? I'm using docker-compose, and.. I've attempted to set up my games folder like so /server/games/:/home/retro/ and yet, it doesn't show games in there -- but I suspect this is because of how complex GOW/Wolf is -- I'm still getting used to even docker, lol.

Browser steaming

Is streaming games through the browser possible with this repo? As for moonlight the closest thing to that is Moonlight for ChromeOS but is there anything on the browser like what webRTC could? Thank you.

Async pair PIN

Currently, it only works by inserting the PIN in the console; we should implement something better (and secure).

How to keep GOW apps updated?

Wolf starts an app today and if the image is not present it'll pull; after that we have no way to automatically update images when we release updates in GOW.
I think we should add it, and possibly add a way to configure it; ex: cron style cadency for updates.

Nvidia 545.29.06 and Gamescope issue

This has been reported by a couple users; when starting an app it gets stuck on startup spamming the following error:

vblankmanager: write failed: Resource temporarily unavailable

it seems to be a well known issue on Gamescope with the latest Nvidia drivers: ValveSoftware/gamescope#497

Downgrading to 535.x seems to fix the issue.

RTSP error with higher bitrates

i'm running moonlight 4.3.1
i have noticed, that when i up the bandwidth in the moonlight client, i get a RTSP handshake error.

in another ticket, you mentioned that you cannot reproduce the error. Perhaps now you can.
for me, The max bitrate seems to be 14 and works fine. Above 14 i always get the RTSP error.

Here is is a Trace log.

11:03:08.789252581 DEBUG | [RTSP] received command SETUP
11:03:08.789262930 TRACE | [RTSP] setup type: audio
11:03:08.789277367 TRACE | [RTSP] sending reply:
RTSP/1.0 200 OK
CSeq: 3
Session: DEADBEEFCAFE;timeout = 90
Transport: server_port=48000


11:03:08.789313904 TRACE | [RTSP] sent reply of size: 94
11:03:08.792855603 TRACE | [RTP] Received ping from 192.168.11.38:52607
11:03:08.792869485 TRACE | [PING] audio from 192.168.11.38:52607
11:03:08.794414154 TRACE | [RTSP] received connection from IP: 192.168.11.38
11:03:08.794840912 TRACE | [RTSP] received message 214 bytes
SETUP streamid=video/0/0 RTSP/1.0
CSeq: 4
X-GS-ClientVersion: 14
Host: 192.168.10.253
Session:  DEADBEEFCAFE
Transport: unicast;X-GS-ClientPort=50000-50001
If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT


11:03:08.799286165 DEBUG | [RTSP] received command SETUP
11:03:08.799304233 TRACE | [RTSP] setup type: video
11:03:08.799321054 TRACE | [RTSP] sending reply:
RTSP/1.0 200 OK
CSeq: 4
Session: DEADBEEFCAFE;timeout = 90
Transport: server_port=47998


11:03:08.799373125 TRACE | [RTSP] sent reply of size: 94
11:03:08.799419869 DEBUG | 192.168.11.38 [GET] HTTP://192.168.10.253/serverinfo
11:03:08.799443811 TRACE | Header: {"uuid": "143a605282d040f5ac17775d2a4b8f1f", "uniqueid": "0123456789ABCDEF"}
11:03:08.800737210 TRACE | Response: <?xml version="1.0" encoding="utf-8"?>
<root status_code="200"><hostname>Wolf</hostname><appversion>7.1.431.-1</appversion><GfeVersion>3.23.0.74</GfeVersion><uniqueid>7a63d314-30a6-44f8-ad7b-05977f2249ca</uniqueid><MaxLumaPixelsHEVC>1869449984</MaxLumaPixelsHEVC><ServerCodecModeSupport>259</ServerCodecModeSupport><HttpsPort>47984</HttpsPort><ExternalPort>47989</ExternalPort><mac>48:21:0b:3e:a2:e8</mac><LocalIP>192.168.10.253</LocalIP><SupportedDisplayMode><DisplayMode><Width>1920</Width><Height>1080</Height><RefreshRate>60</RefreshRate></DisplayMode><DisplayMode><Width>1024</Width><Height>768</Height><RefreshRate>30</RefreshRate></DisplayMode></SupportedDisplayMode><PairStatus>0</PairStatus><currentgame>4</currentgame><state>SUNSHINE_SERVER_BUSY</state></root>
11:03:08.804673437 TRACE | [RTSP] received connection from IP: 192.168.11.38
11:03:08.806982028 TRACE | [RTSP] received message 217 bytes
SETUP streamid=control/13/0 RTSP/1.0
CSeq: 5
X-GS-ClientVersion: 14
Host: 192.168.10.253
Session:  DEADBEEFCAFE
Transport: unicast;X-GS-ClientPort=50000-50001
If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT


11:03:08.811337699 DEBUG | [RTSP] received command SETUP
11:03:08.811353000 TRACE | [RTSP] setup type: control
11:03:08.811367299 TRACE | [RTSP] sending reply:
RTSP/1.0 200 OK
CSeq: 5
Session: DEADBEEFCAFE;timeout = 90
Transport: server_port=47999


11:03:08.811426467 TRACE | [RTSP] sent reply of size: 94
11:03:08.820650448 TRACE | [RTSP] received connection from IP: 192.168.11.38
11:03:08.821115002 TRACE | [RTSP] received message 512 bytes
ANNOUNCE streamid=control/13/0 RTSP/1.0
CSeq: 6
X-GS-ClientVersion: 14
Host: 192.168.10.253
Session:  DEADBEEFCAFE
Content-type: application/sdp
Content-length: 1348

v=0
o=android 0 14 IN IPv4 192.168.10.253
s=NVIDIA Streaming Client
a=x-nv-video[0].clientViewportWd:1920
a=x-nv-video[0].clientViewportHt:1080
a=x-nv-video[0].maxFPS:60
a=x-nv-video[0].packetSize:1392
a=x-nv-video[0].rateControlMode:4
a=x-nv-video[0].timeoutLengthMs:7000
a=x-nv-video[0].framesWithInvalidRefThreshold:0
11:03:08.826180808 ERROR | [RTSP] error parsing message
11:03:08.826208619 TRACE | [RTSP] sending reply:
RTSP/1.0 400 BAD REQUEST
CSeq: 0


11:03:08.826265091 TRACE | [RTSP] sent reply of size: 37
11:03:08.833145442 TRACE | X509 certificate verification error: self-signed certificate
11:03:08.833320525 DEBUG | 192.168.11.38 [GET] HTTPS://192.168.10.253/serverinfo
11:03:08.833339730 TRACE | Header: {"uuid": "01a694470a3d469697e00124df9b7c7a", "uniqueid": "0123456789ABCDEF"}
11:03:08.834374496 TRACE | Response: <?xml version="1.0" encoding="utf-8"?>

Connection is not properly disestablished upon ending a session

Use netstat to illustrate the issue. When you first start streaming using moonlight:
sudo nsenter -t "$(docker inspect -f '{{.State.Pid}}' "[WOLF_CONTAINER_ID]")" -n netstat -anup

Within the list of records will be an entry describing the established connection for wolf:
udp 0 0 192.168.0.207:53602 192.168.0.141:44965 ESTABLISHED 1404/wolf

Terminate the stream session and issue the command again. The record will still be present.

The issue is highlighted when creating a new stream with the same client -- another connection will be established without terminating the previous one:

udp        0      0 192.168.0.207:53602     192.168.0.141:44965     ESTABLISHED 1404/wolf
udp        0      0 192.168.0.207:39660     192.168.0.141:58315     ESTABLISHED 1404/wolf

The connections will release upon stopping the wolf container.

New Steam Game Pad UI (Steam Deck) Prevents Proper Setup

The UI falsely displays network scanning errors during setup. This causes the inability to properly set up Steam.

Possibly related, the UI shows the following exception:
image

One workaround is to use the normal desktop UI initially to log into Steam by setting the startup flag -nogamepadui. Example section in config.toml:

 [[apps]]
title = "Steam"
start_virtual_compositor = true

[apps.runner]
type = "docker"
name = "WolfSteam"
image = "ghcr.io/games-on-whales/steam:edge"
mounts = ["/run/udev:/run/udev:ro"]
env = [
"STEAM_STARTUP_FLAGS=-nogamepadui","PROTON_LOG=1","RUN_GAMESCOPE=true","GOW_REQUIRED_DEVICES=/dev/uinput /dev/input/event* /dev/dri/* /dev/nvidia*",
]
devices = []
ports = []
base_create_json = """
{
  "HostConfig": {
    "IpcMode": "host",
    "CapAdd": ["SYS_ADMIN", "SYS_NICE"],
    "Privileged": false
  }
}
\
"""

After logging in, Steam can continue to be used with the flag omitted if desired.

Initially tried plain old GOW, but that failed with an error on there -- so my first attempt was to head here, and these are the errors I'm getting. Any ideas?

wolf-1  | [2024-02-13 23:10:32] 
wolf-1  | [2024-02-13 23:10:32] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
wolf-1  | [2024-02-13 23:10:32] **** Configure default user ****
wolf-1  | [2024-02-13 23:10:32] Container running as root. Nothing to do.
wolf-1  | [2024-02-13 23:10:32] DONE
wolf-1  | [2024-02-13 23:10:32] 
wolf-1  | [2024-02-13 23:10:32] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
wolf-1  | [2024-02-13 23:10:32] **** Configure devices ****
wolf-1  | [2024-02-13 23:10:32] Exec device groups
wolf-1  | [2024-02-13 23:10:34] Adding user 'root' to groups: root,gow-gid-174
wolf-1  | [2024-02-13 23:10:35] DONE
wolf-1  | [2024-02-13 23:10:35] 
wolf-1  | [2024-02-13 23:10:35] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
wolf-1  | [2024-02-13 23:10:35] 
wolf-1  | [2024-02-13 23:10:35] 
wolf-1  | [2024-02-13 23:10:35] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
wolf-1  | [2024-02-13 23:10:35] **** Setting up Gamescope ****
wolf-1  | [2024-02-13 23:10:35] Launching the container's startup script as user 'root'
wolf-1  | 0:00:00.031637433   143 0x55e777241870 WARN                 default gstvaapi.c:231:plugin_init: Cannot create a VA display
wolf-1  | 0:00:00.054764632   143 0x55e777241870 WARN      GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
wolf-1  | 0:00:00.097293497   143 0x55e777241870 WARN              cudaloader gstcudaloader.c:169:gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory
wolf-1  | 0:00:00.097307267   143 0x55e777241870 WARN                 nvcodec plugin.c:93:plugin_init: Failed to load cuda library
wolf-1  | 0:00:00.101347323   143 0x55e777241870 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
wolf-1  | 0:00:00.101454083   143 0x55e777241870 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
wolf-1  | 0:00:00.101582594   143 0x55e777241870 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
wolf-1  | 0:00:00.124699284   143 0x55e777241870 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x55e7775ab510> Could not set value on item: format-version
wolf-1  | 0:00:00.124721164   143 0x55e777241870 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x55e7775e9120> Could not set value on item: format-version
wolf-1  | 0:00:00.124732724   143 0x55e777241870 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x55e7775e98d0> Could not set value on item: format-version
wolf-1  | 0:00:00.125341366   143 0x55e777241870 WARN               structure gststructure.c:2334:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype
wolf-1  | amdgpu: os_same_file_description couldn't determine if two DRM fds reference the same file description.
wolf-1  | If they do, bad things may happen!
wolf-1  | 0:00:00.331289794   143 0x55e777241870 WARN                vafilter gstvafilter.c:1727:gst_va_filter_has_compose:<vafilter0> VPP does not support alpha blending
wolf-1  | 0:00:00.353918972   143 0x55e777241870 WARN      GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
wolf-1  | 23:10:35.667725162 INFO  | Gstreamer version: 1.22.0-0
wolf-1  | 23:10:35.672037029 INFO  | Reading config file from: /wolf/cfg/config.toml
wolf-1  | 23:10:35.672122599 WARN  | Unable to open config file: /wolf/cfg/config.toml, creating one using defaults
wolf-1  | 0:00:00.548764277     1 0x559bd4f61da0 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh264enc"!
wolf-1  | 0:00:00.548783437     1 0x559bd4f61da0 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "qsvh264enc"!
wolf-1  | 0:00:00.574392216     1 0x559bd4f61da0 WARN                vafilter gstvafilter.c:1727:gst_va_filter_has_compose:<vafilter0> VPP does not support alpha blending
wolf-1  | 23:10:35.728597238 INFO  | Selected H264 encoder: vaapi
wolf-1  | 0:00:00.590368688     1 0x559bd4f61da0 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh265enc"!
wolf-1  | 0:00:00.590378818     1 0x559bd4f61da0 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "qsvh265enc"!
wolf-1  | 23:10:35.735798876 INFO  | Selected HEVC encoder: vaapi
wolf-1  | 23:10:35.736188078 INFO  | x509 certificates not present, generating: /wolf/cfg/cert.pem /wolf/cfg/key.pem
wolf-1  | 23:10:35.908795207 INFO  | RTSP server started on port: 48010
wolf-1  | 23:10:35.908889417 INFO  | Control server started on port: 47999
wolf-1  | 23:10:35.909027298 INFO  | HTTP server listening on port: 47989 
wolf-1  | 23:10:35.909623290 WARN  | [PULSE] Unable to connect, Access denied
wolf-1  | 23:10:35.909677060 INFO  | Starting PulseAudio docker container
wolf-1  | 23:10:35.910931655 INFO  | HTTPS server listening on port: 47984 
wolf-1  | 23:10:35.911454327 WARN  | [DOCKER] Image ghcr.io/games-on-whales/pulseaudio:master not present, downloading...
wolf-1  | 23:11:19.183446620 WARN  | [PULSE] Unable to connect, Access denied

Go fully headless

This needs to be fleshed out properly but ideally we don't need any of the followings:

  • a "real" compositor plugged to a monitor
  • an audio sink server (pulse/pipewire)
  • uinput, udev and any kernel support for it

If we implement a self-contained Wayland compositor and advertise it to applications we should be in a position of:

  • push the raw video/audio as the source to the gstreamer pipeline, encode it and push it via UDP to clients.
  • send client events (mouse/kb/pads) directly to applications without passing via udev

I need to learn more about this, here are a bunch of random links.

Official tools

https://gitlab.freedesktop.org/wlroots/wlroots

Reading material

https://drewdevault.com/2017/06/10/Introduction-to-Wayland.html
https://drewdevault.com/2018/02/17/Writing-a-Wayland-compositor-1.html

https://wayland-book.com/
https://wayland.app/protocols/
https://zamundaaa.github.io/wayland/2021/12/14/about-gaming-on-wayland.html

Projects to look at

https://github.com/Hjdskes/cage
https://github.com/Plagman/gamescope

https://gitlab.freedesktop.org/mstoeckl/waypipe/
https://mstoeckl.com/notes/gsoc/blog.html

Stuck on deployment

Hi,

I was trying to deploy Wolf, and all seems to be fine, until I reach the docker cli or compose instructions.

I get the following error and cannot continue:

docker: Error response from daemon: error gathering device information while adding custom device "/dev/nvidia-caps/nvidia-cap1": no such file or directory.
ERRO[0000] error waiting for container: context canceled

I have an RTX nVidia Quadro GPU with driver version: 545.29.06

And the devices nvidia-caps do not exist on my system.

Running on Ubuntu 22.04
Kernel: Linux 5.15.0-92-lowlatency x86_64

Thanks

Statically link Gstreamer

It's difficult to manually configure and build plugins that aren't included in the standard available packages (ex: HEVC and Nvidia).
We should probably generate our own set of plugins and statically link Wolf to it or put the bundle under the GST_PLUGIN_PATH.

See also: Generate a minimal GStreamer build

pulseaudio container errors

I'm happily running gow for months now :)
I thought, it would be nice to have multiple applications, and also work without a dummy plug, so i'm giving wolf a spin.

I'm running debian bookworm

root@debian:/# uname -a
Linux debian 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-1 (2023-07-14) x86_64 GNU/Linux

Consider the following compose (just a copy / paste from the docs :))

version: "3.8"
services:
  wolf:
    image: ghcr.io/games-on-whales/wolf:stable
    environment:
      - XDG_RUNTIME_DIR=/tmp/sockets
      - HOST_APPS_STATE_FOLDER=/etc/wolf
    volumes:
      - /etc/wolf/wolf:/wolf/cfg
      - /tmp/sockets:/tmp/sockets:rw
      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /dev/shm:/dev/shm:rw
      - /dev/input:/dev/input:rw
      - /run/udev:/run/udev:rw
    devices:
      - /dev/dri
      - /dev/uinput
    device_cgroup_rules:
      - 'c 13:* rmw'
    network_mode: host
    restart: unless-stopped

Wolf starts. i can connect with moonlight etc, and also the pin stuff worked :)

the logging from the wolf container looks like this:


[2023-08-30 06:31:17] 
[2023-08-30 06:31:17] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
[2023-08-30 06:31:17] **** Configure default user ****
[2023-08-30 06:31:17] Container running as root. Nothing to do.
[2023-08-30 06:31:17] DONE
[2023-08-30 06:31:17] 
[2023-08-30 06:31:17] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
[2023-08-30 06:31:17] **** Configure devices ****
[2023-08-30 06:31:17] Exec device groups
[2023-08-30 06:31:17] Adding user 'root' to groups: gow-gid-102,root
[2023-08-30 06:31:17] DONE
[2023-08-30 06:31:17] 
[2023-08-30 06:31:17] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
[2023-08-30 06:31:17] 
[2023-08-30 06:31:17] 
[2023-08-30 06:31:17] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
[2023-08-30 06:31:17] **** Setting up Gamescope ****
[2023-08-30 06:31:17] Launching the container's startup script as user 'root'
0:00:00.008668538   121 0x55d6344aa520 WARN              cudaloader gstcudaloader.c:169:gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory
0:00:00.008682509   121 0x55d6344aa520 WARN                 nvcodec plugin.c:93:plugin_init: Failed to load cuda library
0:00:00.049087777   121 0x55d6344aa520 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x55d634d49f90> Could not set value on item: format-version
0:00:00.049107117   121 0x55d6344aa520 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x55d634830a70> Could not set value on item: format-version
0:00:00.049114952   121 0x55d6344aa520 WARN                 default ges-meta-container.c:236:_set_value:<GESAsset@0x55d634831150> Could not set value on item: format-version
0:00:00.049343376   121 0x55d6344aa520 WARN               structure gststructure.c:2334:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype
0:00:00.057037098   121 0x55d6344aa520 WARN      GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
0:00:00.068276825   121 0x55d6344aa520 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
0:00:00.068374330   121 0x55d6344aa520 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
0:00:00.068480866   121 0x55d6344aa520 WARN          adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
0:00:00.116867793   121 0x55d6344aa520 WARN                 default gstvaapi.c:231:plugin_init: Cannot create a VA display
0:00:00.118825913   121 0x55d6344aa520 WARN      GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
06:31:17.883901064 INFO  | Gstreamer version: 1.22.0-0
06:31:17.884551159 INFO  | Reading config file from: /wolf/cfg/config.toml
06:31:17.884593355 WARN  | Unable to open config file: /wolf/cfg/config.toml, creating one using defaults
0:00:00.150018113     1 0x5611c102ea90 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh264enc"!
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
06:31:17.943254116 INFO  | Selected H264 encoder: qsv
0:00:00.199723112     1 0x5611c102ea90 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh265enc"!
06:31:17.943390422 INFO  | Selected HEVC encoder: qsv
06:31:17.943588567 INFO  | x509 certificates not present, generating: /wolf/cfg/cert.pem /wolf/cfg/key.pem
06:31:18.001459867 INFO  | RTSP server started on port: 48010
06:31:18.001502513 INFO  | HTTP server listening on port: 47989 
06:31:18.001517984 INFO  | RTP server started on port: 48000
06:31:18.001514812 INFO  | RTP server started on port: 47998
06:31:18.001574178 INFO  | Control server started on port: 47999
06:31:18.001741509 WARN  | [PULSE] Unable to connect, Access denied
06:31:18.001785872 INFO  | Starting PulseAudio docker container
06:31:18.002461215 INFO  | HTTPS server listening on port: 47984 

Seems that wolf cannot connect to pulseaudio.
This is the log listing of the pulseaudio container.


[2023-08-30 06:31:18] 
[2023-08-30 06:31:18] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
[2023-08-30 06:31:18] **** Configure default user ****
[2023-08-30 06:31:18] Container running as root. Nothing to do.
[2023-08-30 06:31:18] DONE
[2023-08-30 06:31:18] 
[2023-08-30 06:31:18] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
[2023-08-30 06:31:18] **** Configure devices ****
[2023-08-30 06:31:18] Exec device groups
[2023-08-30 06:31:18] Not modifying user groups ()
[2023-08-30 06:31:18] DONE
[2023-08-30 06:31:18] 
[2023-08-30 06:31:18] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
[2023-08-30 06:31:18] 
[2023-08-30 06:31:18] Launching the container's startup script as user 'root'
[2023-08-30 06:31:18] Removing all files from /root/.config/pulse
[2023-08-30 06:31:18] Starting pulseaudio
W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
W: [pulseaudio] authkey.c: Failed to open cookie file '/root/.config/pulse/cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to load authentication key '/root/.config/pulse/cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to open cookie file '/root/.pulse-cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to load authentication key '/root/.pulse-cookie': No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
W: [pulseaudio] server-lookup.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
W: [pulseaudio] main.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

The reason wolf cannot connect to pulse audio, is because the pulseaudio container doesn't seem to run properly ?
The container does keep running, however.

When i run the firefox app from moonlight, this is the error log from the Wolf container:


06:44:35.315159515 INFO  | Starting container: /WolfFirefox_7518890674366070471
0:01:48.975311740     1 0x7fcd5c00c800 WARN                   pulse pulsesrc.c:1016:gst_pulsesrc_open:<pulsesrc1> error: Failed to connect: Connection refused
06:44:35.581917610 ERROR | [GSTREAMER] Pipeline error: Failed to connect: Connection refused
0:01:49.127863038     1 0x7fcd5c00c800 WARN                   pulse pulsesrc.c:1016:gst_pulsesrc_open:<pulsesrc1> error: Failed to connect: Connection refused
0:01:49.128217085     1 0x7fcd5c00c800 WARN                   pulse pulsesrc.c:1016:gst_pulsesrc_open:<pulsesrc1> error: Failed to connect: Connection refused
06:44:35.593150932 ERROR | [GSTREAMER] Pipeline error: Failed to connect: Connection refused

(wolf:1): GLib-CRITICAL **: 06:44:35.593: g_main_loop_quit: assertion 'g_atomic_int_get (&loop->ref_count) > 0' failed
06:44:35.593266201 ERROR | [GSTREAMER] Pipeline error: Failed to connect: Connection refused

(wolf:1): GLib-CRITICAL **: 06:44:35.593: g_main_loop_quit: assertion 'g_atomic_int_get (&loop->ref_count) > 0' failed
06:44:35.937384923 INFO  | Stopped container: /WolfFirefox_7518890674366070471
06:44:35.960137438 WARN  | [ENET] Received packet from unrecognised client 172.18.0.57:44512

Is there something i'm doing wrong ?

Implement Reference Frame Invalidation (RFI)

Moonlight recently added support for it, we should add it as well.

CGutman on Discord

Video codecs make heavy use of previous frames as references to reduce the size of new frames. However, that means a frame can only be successfully decoded if prior frames were also successfully decoded. That means we have a problem if a frame gets dropped by the network, because a future frame could try to reference it.

There are 2 main ways of dealing with lost frames. The way we've dealt with this in the past is to just request a key frame (which contains no references to prior frames) to get the decoder back to a known state. That is the way most applications handle this situation (or they depend on periodic key frames to recover from any lost frames). The big downside is that key frames are huge and usually end up a much lower quality because they hit bitrate limits. You can sometimes see the blocky artifacts for a couple frames after a key frame while the encoder sends additional detail in following frames.

However, there is a more clever way of handling this that NVENC also supports. You can actually tell the host which exact frames you lost (reference frame invalidation or RFI) and it can avoid referencing those lost frames in newly encoded frames. That means recovering from a loss doesn't require re-encoding the entire screen, just the portion that was lost (and still relevant to what's currently on screen). This means much smaller recovery frames and smaller frames have better image quality (since they aren't hitting the bitrate ceiling) and are less prone to packet loss or network congestion.

RFI also allows us to do some other clever tricks. In the recent updates for Android and iOS, I implemented a feature that I called "speculative RFI". In the past, we would only know for sure that we lost frame N when we received the first packet in frame N+1. That means that we were already dropping a minimum of 2 frames (N which was dropped by the network and N+1 which has to be dropped because we haven't received an RFI recovery frame yet). There are also some cases where it could be much longer than 2 frames to recover, particularly if the network is unstable.

However, If we aren't seeing out of order packets from the host, we can predict if the current frame is likely to be successfully received based on the packets we've received so far. When we receive frame N, we are keeping track of what the latest sequence number of packet we've received is. If we see packets 1, 2, and 8, we can be pretty sure that packets 3-7 have been dropped (since we've never seen out of order packets from the host). That allows Moonlight to do clever things like predict whether it will be able to recover the frame based on what it knows about the number of packets remaining to be received. If we predict that we won't be able to reconstruct the frame because too many packets have been dropped, we can immediately send an RFI request to the host. That can allow us to potentially recover in a single frame.

Changing WOLF_RENDER_NODE does not seem to work

I tried setting WOLF_RENDER_NODE to /dev/dri/renderD129 to use the GPU instead of Intel QuickSync. But it keeps using Intel and D128.

I verified that the environment variable is correctly set by running -ti ... bash on the docker run command:

root@game-srv:/wolf# env | grep WOLF_RENDER_NODE
WOLF_RENDER_NODE=/dev/dri/renderD129

The way I found out it is using Intel is because of the HEVC encoder selection: 19:11:16.370946074 INFO | Selected HEVC encoder: qsv

After pulling the latest image..

After pulling the latest image, I'm getting the following error:

[user@user-NAS:/aeternae/data_servers/wolf-GOW]$ sudo docker-compose up
[+] Running 1/1
 ✔ Container wolf-gow-wolf-1  Recreated                                                                                                                             4.6s 
Attaching to wolf-1
wolf-1  | [2024-02-17 21:33:58] 
wolf-1  | [2024-02-17 21:33:58] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
wolf-1  | [2024-02-17 21:33:58] **** Configure default user ****
wolf-1  | [2024-02-17 21:33:58] Container running as root. Nothing to do.
wolf-1  | [2024-02-17 21:33:58] DONE
wolf-1  | [2024-02-17 21:33:58] 
wolf-1  | [2024-02-17 21:33:58] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
wolf-1  | [2024-02-17 21:33:58] **** Configure devices ****
wolf-1  | [2024-02-17 21:33:58] Exec device groups
wolf-1  | [2024-02-17 21:33:58] Adding user 'root' to groups: gow-gid-174
wolf-1  | [2024-02-17 21:33:59] DONE
wolf-1  | [2024-02-17 21:33:59] 
wolf-1  | [2024-02-17 21:33:59] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
wolf-1  | [2024-02-17 21:33:59] 
wolf-1  | [2024-02-17 21:33:59] 
wolf-1  | [2024-02-17 21:33:59] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
wolf-1  | [2024-02-17 21:33:59] **** Setting up Gamescope ****
wolf-1  | [2024-02-17 21:33:59] Launching the container's startup script as user 'root'
wolf-1  | cp: cannot create regular file '/aeternae/data_servers/wolf-GOW/sessions/fake-udev': No such file or directory
wolf-1 exited with code 0

What can I do to fix it? Completely vanilla docker-compose file, for the most part, too...lemme include it just in-case.

version: "3.8"
services:
  wolf:
    image: ghcr.io/games-on-whales/wolf:stable
    environment:
      - XDG_RUNTIME_DIR=/tmp/sockets
      - HOST_APPS_STATE_FOLDER=./sessions
    volumes:
      - ./wolf/:/etc/wolf
      - /tmp/sockets:/tmp/sockets:rw
      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /dev/shm:/dev/shm:rw
      - /dev/input:/dev/input:rw
      - /run/udev:/run/udev:rw
    device_cgroup_rules:
      - 'c 13:* rmw'
    devices:
      - /dev/dri
      - /dev/uinput
    network_mode: host
    restart: unless-stopped

containerised firefox fails to start with virtual devices support configured

Hi,
Firstly, thanks for making this all open source and sorry for the support "issue".
I've been looking for ways to run and expose GUI applications in containers and wolf seems really slick. I'm hoping to contribute to the project once I can get my "feet wet".

Issue:
After following the quickstart and installing moonlight I was able to stream the example firefox browser, great! However, the mouse cursor interaction was quite strange, with it being "pinned" to the left of the container window. I then tried changing the settings with Ctrl+Alt+Shift+M and then when entering the application window the mouse cursor is immediately sent to the location on the screen of the host PC.

I then noted the virtual devices support section of the quickstart hoping that this might resolve the issue.
After following the guide https://games-on-whales.github.io/wolf/stable/user/quickstart.html#_virtual_devices_support, the firefox container crashes almost immediately after launching.

When firefox was running (prior to configuring virtual devices support) the keyboard was working as expected.

Are there specific logs that would help you identify what might be going on here and how this might be resolved? I'm happy to help debug but I'm not sure where to start.

Host system OS is Ubuntu 22.04
Moonlight 4.3.1

Thanks,
Sam

Associate Devices to Sessions

Today when a client is registered it will have its own app_state_data and the default action is to create a new profile under /etc/wolf for each session.

As a feature enhancement would be good to be able to goto an admin portal created multiple profiles and associate registered devices to that profiles so that app_state_data is shared across devices. This portal could also be a means to more easily serve the device pin page when trying to register the device.

While today is possible to just go into the config.toml and set the app_state_data to be the same for all clients you want this shared, was thinking this could be a better way to more easily set this up.

Joypad rumble

It's missing, I guess we have to send this event via the control bus when the uinput device receives the event.

Add Avahi

So that Wolf can be easily discovered over LAN

Dev-Input-Protocol Testing - Nintendo Pro Controllers incorrect mapping

Per discussion, here is the testing of the mapping issues I am seeing using a Nintendo Pro Controller (8BitDo Pro 2 in Switch mode)

Wolf image used for testing
ghcr.io/games-on-whales/wolf:dev-input-protocol

Host machine sees this device as:
Input device ID: bus 0x3 vendor 0x57e product 0x2009 version 0x8111
Input device name: "Nintendo Switch Pro Controller"

Virtual Device created by Wolf
Input device ID: bus 0x3 vendor 0x57e product 0x2009 version 0xab00
Input device name: "Wolf Nintendo (virtual) pad"

General mapping issues:

  • Virtual device is missing Event code 309 (BTN_Z) "Capture" key
  • Virtual device is missing Event code 312 (BTN_TL2) "L-Trigger" [although this might be coming through as ABS_Z?]
  • Virtual device is missing Event code 313 (BTN_TR2) "R-Trigger" [although this might be coming through as ABS_RZ?]

Full list of mapping testing

| Physical Button | Yuzu Mapped To | When Pressed Appears As | Yuzu Should Be | Linux EventCode (Host) | Status?   |
|-----------------+----------------+-------------------------+----------------+------------------------+-----------|
| L-Stick Up      | Axis 1+        | L-Stick Up              | Axis 1+        | Event code 1 (ABS_Y)S- | OK        |
| L-Stick Down    | Axis 1-        | L-Down                  | Axis 1-        | +                      | OK        |
| L-Stick Left    | Axis 0-        | L-Left                  | Axis 0-        | EC 0 (ABS_X)         - | OK        |
| L-Stick Right   | Axis 0+        | L-Right                 | Axis 0+        | +                      | OK        |
| L-Stick Pressed | Button 12      | Minus                   | Button 7       | EC 317 (BTN_THUMBL)    | Needs fix |
| R-Stick Up      | Axis 3+        | R-Up                    | Axis 3+        | EC 4 (ABS_RY)        - | OK        |
| R-Stick Down    | Axis 3-        | R-Down                  | Axis 3-        | +                      | OK        |
| R-Stick Left    | Axis 2-        | No response             | Axis 2-        | EC 3 (ABS_RX)        - | Needs fix |
| R-Stick Right   | Axis 2+        | No response             | Axis 2+        | +                      | Needs fix |
| R-Stick Pressed | Button 13      | Plus                    | Button 8       | EC 318 (BTN_THUMBR)    | Needs fix |
| D-Pad Up        | Hat Up         | D-Up                    | Button 11      | EC 17 (ABS_HAT0Y) -1   | OK        |
| D-Pad Down      | Hat Down       | D-Down                  | Button 12      | EC 17 (ABS_HAT0Y)  1   | OK        |
| D-Pad Left      | Hat Left       | D-Left                  | Button 13      | EC 16 (ABS_HAT0X) -1   | OK        |
| D-Pad Right     | Hat Right      | D-Right                 | Button 14      | EC 16 (ABS_HAT0x)  1   | OK        |
| Plus            | Button 10      | L-Trigger               | Button 6       | EC 315 (BTN_START)     | Needs fix |
| Minus           | Button 9       | R-Bumper                | Button 4       | EC 314 (BTN_SELECT)    | Needs fix |
| Home            | Button 11      | R-Trigger               | Button 5       | EC 316 (BTN_MODE)      | Needs fix |
| Capture         | Button 4       | NA (nothing)            | Button 15      | EC 309 (BTN_Z)         | Missing   |
| A               | Button 1       | B                       | Button 1       | EC 305 (BTN_EAST)      | Needs fix |
| B               | Button 0       | A                       | Button 0       | EC 304 (BTN_SOUTH)     | Needs fix |
| X               | Button 2       | X                       | Button 3       | EC 307 (BTN_NORTH)     | OK        |
| Y               | Button 3       | Y                       | Button 2       | EC 308 (BTN_WEST)      | OK        |
| L (Bumper)      | Button 5       | Capture                 | Button 9       | EC 310 (BTN_TL)        | Needs fix |
| R (Bumper)      | Button 6       | L-Bumper                | Button 10      | EC 311 (BTN_TR)        | Needs fix |
| ZL (Trigger)    | Button 7       | R-Stick Right           | Axis 4         | EC 312 (BTN_TL2)       | Needs fix |
| ZR (Trigger)    | Button 8       | No response             | Axis 5         | EC 313 (BTN_TR2)       | Needs fix |
| Motion          | ?              |                         |                |                        |           |
| Vibration       | ?              |                         |                | 80,81,88,89,90,96      |           |

Other notes
Reviewing event codes between the host device and virtual device (via evtest) appear generally the same. So I'm a bit confused as to why the mappings are off when used within applications. Is it possible Moonlight is changing these mappings? I'm not familiar enough where to look within the code to check this.

Additionally, evtest reports lots of L-Stick movement within the virtual device even though no activity is taking place on the physical device. This at times appears as chaotic movement on screen.

Let me know if any clarification is needed.

Audio: investigate better encoding defaults

From Discord:

I played around with the settings a bit. I think I set some of these numbers too high, but I don't want to mess with it as it sounds much better. I think what really solved it was changing bitrate-type="constrained-vbr".
Here's all the stuff I threw in there:

default_audio_params = "audio/x-raw, channels={channels}"
default_opus_encoder = """
opusenc bitrate=4000000 bitrate-type="constrained-vbr" frame-size={packet_duration} bandwidth=fullband audio-type="restricted-lowdelay"
max-payload-size=8000 complexity=100
\
"""

I probably set things way too high. It sounds MUCH better though.

Support new Moonlight input extensions

Sunshine PRs

Moonlight code

Corrupted stream on Android TV (TCL 55P725)

Host (Server) specs:
CPU - Ryzen 1400
GPU - RX560 2GB OSS Mesa drivers
RAM - 8GB
OS - Ubuntu 22 LTS
Encoder - H265 (VAAPI). H264 doesnt work at the moment for me.

Client specs
Model - TCL 55P725
Platform - RT51 (chipset)
CPU - 64-bit A55×4 1.3GHz
GPU - G31x2 800MHz
RAM - DDR3-1866: 2 gb
OS - Android R

Logs from Wolf container when issue persists
wolf_log.txt

After starting the Steam container Stream is corrupted, also corrupts rendering of Android itself (flickering in the corners, and lower framerate across all Android UI) Only solution - Rebooting the TV, killing stream or Moonlight didnt help

Custom Resolutions causing screen corrumption

If you set a custom resolution in Moonlight and then connect to the Wolf server all applications output a corrupted screen.

Steps to reproduce
In the moonlight client set a custom resolution and then connect to any application presented in Wolf

screenshot
image

HARDWARE

  • AMD 7900 XTX
  • AMD Ryzen

LOGS
Here are the logs I have for the container
wolf-wolf-1_logs.txt

Some additional output captured while troubleshooting
rror: can't connect to X server!
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.17 (libva 2.12.0)
vainfo: Driver version: Mesa Gallium driver 23.0.2 for AMD Radeon Graphics (gfx1100, LLVM 15.0.7, DRM 3.52, 6.4.10-202.fsync.fc38.x86_64)
vainfo: Supported profile and entrypoints
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileAV1Profile0 : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.