Solved Rocky Linux 9 minimal jail working, need to figure out the next steps

the issue is there isnt a i915 driver present on rocky linux
as its supposed to be a kernel module

but the directory where it should be is empty
and lsmod doesnt show any kernel modules loaded

taking another look at ubuntu mantic
and going to see if changing editing the group file makes any difference

ubuntu group file

Code:
vi /etc/group

i comment out the root entry
and add a new entry for the wheel group which doesnt exist on ubuntu

Code:
wheel:*:0:root,username
#root:x:0:

that fixes the permissions on the dri, drm and nvidia devices

the issue i was having on ubuntu is not beening able to render ( export ) the footage
Thus one should patch the Rocky Linux code to use the FreeBSD driver?
Why don't just hack the nvidia driver to give SR-IOV and pass thorough the vGPU to a bhyve VM?
It certainly sound much easier than cross-platform driver compatibility hell.
 
i can install Davinci Resolve 19.1 in a Ubuntu Mantic Jail

but the render queue gets stuck
Signal Number = 15 in the ResolveDebug.txt

the fix for Davinci Resolve libraries on Ubuntu using LD_PRELOAD

Code:
# ~/.zshenv

# for ZSH
case "$OSTYPE" in
  freebsd*)
  # Path
  typeset -U PATH path
  path=("$path[@]")
  export PATH

  # XDG_RUNTIME_DIR
  export XDG_RUNTIME_DIR=/var/run/xdg/"${USER}"

  # wayland - uncomment to use wayland
  export WAYLAND_DISPLAY=wayland-0
  export QT_QPA_PLATFORM=wayland
  export GDK_BACKEND=wayland

  # x11 - comment out to use wayland
  #export DISPLAY=unix:0
  #export QT_QPA_PLATFORM=xcb
  #export GDK_BACKEND=x11
  ;;
  linux*)
  typeset -U PATH path
  path=("/opt/resolve/bin" "$path[@]")
  export PATH

  # XDG_RUNTIME_DIR
  export XDG_RUNTIME_DIR="/run/user/`id -u`"

  # dummy-uvm.so for access to the gpu
  export LD_PRELOAD="${HOME}"/.config/gpu/dummy-uvm.so:/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0:/usr/lib/x86_64-linux-gnu/libgio-2.0.so:/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so
  export __NV_PRIME_RENDER_OFFLOAD=1
  export __GLX_VENDOR_LIBRARY_NAME=nvidia

  # wayland - uncomment to use wayland
  #export WAYLAND_DISPLAY=wayland-0
  #export QT_QPA_PLATFORM=wayland
  #export GDK_BACKEND=wayland

  # x11 - comment out to use wayland
  export DISPLAY=unix:0
  export QT_QPA_PLATFORM=xcb
  export GDK_BACKEND=x11
  ;;
esac

# xdg directories
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_DATA_HOME="$HOME/.local/share"

# qt5
export QT_QPA_PLATFORMTHEME=qt5ct


20240920_22h23m09s_grim.png
 
installed mpv in the ubuntu jail to test the gpu

trying to play big buck bunny

Code:
Warning: using insecure memory!
 (+) Video --vid=1 (*) (vp9 1280x720 24.000fps)
 (+) Audio --aid=1 --alang=eng (*) (aac 6ch 48000Hz)
libEGL warning: wayland-egl: drmGetMagic failed
[vo/gpu/opengl] Suspected software renderer or indirect context.
libEGL warning: MESA-LOADER: failed to retrieve device information

[vo/gpu/opengl] Suspected software renderer or indirect context.
[vo/gpu/drm] VT_GETMODE failed: Inappropriate ioctl for device
[vo/gpu/drm] Failed to set up VT switcher. Terminal switching will be unavailable.
WARNING: Kernel has no file descriptor comparison support: Function not implemented
[vo/gpu/drm] Failed to acquire DRM master: Permission denied
[vo/gpu/drm] Failed to commit ModeSetting atomic request: Permission denied
[vo/gpu/opengl] Failed to set CRTC for connector 95: Permission denied
[vo/gpu] Failed to commit atomic request: Permission denied
[vo/gpu/drm] Failed to commit ModeSetting atomic request: Permission denied
[vo/gpu/drm] Failed to restore previous mode
[vo/gpu/drm] Failed to drop DRM master: Permission denied
 
Davinci Resolve opened in a Rocky Linux 9 jail

i had to install the kernel-modules before installing the Nvidia driver

Code:
sudo dnf install kernel-modules

that enabled the i915 driver
and now Davinci Resolve 19.1 doesnt crash on the splash screen when it tries to load fusion

however i havent got the audio working yet
Rocky Linux uses pipewire for the audio

in a Ubuntu jail i can get pulseaudio working from the jail to the host
using a pulseaudio socket by mounting the /tmp directory from the host to the jail

so i need to look at either using pipewire pulse in the jail
or starting pipewire on the host

time for more tea and biscuits

20240922_19h50m21s_grim.png
 
i think the issue is i need to start pulseaudio on the host

Code:
pulseaudio --start --daemonize 2>/dev/null

and pipewire in the jail

Code:
pipewire -v &

thats what i had to do when i ran kde in a jail which uses pipewire to get the audio working
 
that didnt get the audio working in resolve
of course the last step is going to need more than a couple of commands

obviously i havent drunk enough tea yet
 
it makes more sense to try and use pipewire in the jail and on the host
rather than using pipewire and pulseaudio

so what i need to figure out is how to start pipewire and wireplumber
on the freebsd host as a server

and in the jail set pipewire to be a client and connect to pipewire on the host

with puseaudio that dont using a pulseaudio socket
so need to figure out the same thing with pipewire
 
looking into pipewire

rocky jail create the pipewire directory

Code:
mkdir -p "${HOME}"/.config/pipewire

copy the pipewire client.conf to the pipewire directory

Code:
cp /usr/share/pipewire/client.conf "${HOME}"/.config/pipewire

client.conf

Code:
# Client config file for PipeWire version "1.0.1" #
#
# Copy and edit this file in /etc/pipewire for system-wide changes
# or in ~/.config/pipewire for local changes.
#
# It is also possible to place a file with an updated section in
# /etc/pipewire/client.conf.d/ for system-wide changes or in
# ~/.config/pipewire/client.conf.d/ for local changes.
#

context.properties = {
    ## Configure properties in the system.
    #mem.warn-mlock  = false
    #mem.allow-mlock = true
    #mem.mlock-all   = false
    log.level        = 0

    #default.clock.quantum-limit = 8192
}

context.spa-libs = {
    #<factory-name regex> = <library-name>
    #
    # Used to find spa factory names. It maps an spa factory name
    # regular expression to a library name that should contain
    # that factory.
    #
    audio.convert.* = audioconvert/libspa-audioconvert
    support.*       = support/libspa-support
}

context.modules = [
    #{ name = <module-name>
    #    ( args  = { <key> = <value> ... } )
    #    ( flags = [ ( ifexists ) ( nofail ) ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # Loads a module with the given parameters.
    # If ifexists is given, the module is ignored when it is not found.
    # If nofail is given, module initialization failures are ignored.
    #

    # The native communication protocol.
    { name = libpipewire-module-protocol-native }

    # Allows creating nodes that run in the context of the
    # client. Is used by all clients that want to provide
    # data to PipeWire.
    { name = libpipewire-module-client-node }

    # Allows creating devices that run in the context of the
    # client. Is used by the session manager.
    { name = libpipewire-module-client-device }

    # Makes a factory for wrapping nodes in an adapter with a
    # converter and resampler.
    { name = libpipewire-module-adapter }

    # Allows applications to create metadata objects. It creates
    # a factory for Metadata objects.
    { name = libpipewire-module-metadata }

    # Provides factories to make session manager objects.
    { name = libpipewire-module-session-manager }
]

filter.properties = {
    #node.latency = 1024/48000
}

stream.properties = {
    #node.latency          = 1024/48000
    #node.autoconnect      = true
    #resample.quality      = 4
    #channelmix.normalize  = false
    #channelmix.mix-lfe    = true
    #channelmix.upmix      = true
    #channelmix.upmix-method = psd  # none, simple
    #channelmix.lfe-cutoff = 150
    #channelmix.fc-cutoff  = 12000
    #channelmix.rear-delay = 12.0
    #channelmix.stereo-widen = 0.0
    #channelmix.hilbert-taps = 0
    #dither.noise = 0
}

freebsd host

create the pipewire directory

Code:
mkdir -p "${HOME}"/.config/pipewire

copy the pipewire pipewire.conf to the pipewire directory

Code:
cp /usr/local/share/pipewire/pipewire.conf "${HOME}"/.config/pipewire

pipewire.conf

Code:
# Daemon config file for PipeWire version "1.0.4" #
#
# Copy and edit this file in /usr/local/etc/pipewire for system-wide changes
# or in ~/.config/pipewire for local changes.
#
# It is also possible to place a file with an updated section in
# /usr/local/etc/pipewire/pipewire.conf.d/ for system-wide changes or in
# ~/.config/pipewire/pipewire.conf.d/ for local changes.
#

context.properties = {
    ## Configure properties in the system.
    #library.name.system                   = support/libspa-support
    #context.data-loop.library.name.system = support/libspa-support
    #support.dbus                          = true
    #link.max-buffers                      = 64
    link.max-buffers                       = 16                       # version < 3 clients can't handle more
    #mem.warn-mlock                        = false
    #mem.allow-mlock                       = true
    #mem.mlock-all                         = false
    #clock.power-of-two-quantum            = true
    #log.level                             = 2
    #cpu.zero.denormals                    = false

    core.daemon = true              # listening for socket connections
    core.name   = pipewire-0        # core name and socket name

    ## Properties for the DSP configuration.
    #default.clock.rate          = 48000
    #default.clock.allowed-rates = [ 48000 ]
    #default.clock.quantum       = 1024
    #default.clock.min-quantum   = 32
    #default.clock.max-quantum   = 2048
    #default.clock.quantum-limit = 8192
    #default.clock.quantum-floor = 4
    #default.video.width         = 640
    #default.video.height        = 480
    #default.video.rate.num      = 25
    #default.video.rate.denom    = 1
    #
    #settings.check-quantum      = false
    #settings.check-rate         = false
    #
    # These overrides are only applied when running in a vm.
    vm.overrides = {
        default.clock.min-quantum = 1024
    }

    # keys checked below to disable module loading
    module.x11.bell = true
    # enables autoloading of access module, when disabled an alternative
    # access module needs to be loaded.
    module.access = true
    # enables autoloading of module-jackdbus-detect
    module.jackdbus-detect = true
}

context.spa-libs = {
    #<factory-name regex> = <library-name>
    #
    # Used to find spa factory names. It maps an spa factory name
    # regular expression to a library name that should contain
    # that factory.
    #
    audio.convert.* = audioconvert/libspa-audioconvert
    avb.*           = avb/libspa-avb
    api.alsa.*      = alsa/libspa-alsa
    api.v4l2.*      = v4l2/libspa-v4l2
    api.libcamera.* = libcamera/libspa-libcamera
    api.bluez5.*    = bluez5/libspa-bluez5
    api.vulkan.*    = vulkan/libspa-vulkan
    api.jack.*      = jack/libspa-jack
    support.*       = support/libspa-support
    #videotestsrc   = videotestsrc/libspa-videotestsrc
    #audiotestsrc   = audiotestsrc/libspa-audiotestsrc
}

context.modules = [
    #{ name = <module-name>
    #    ( args  = { <key> = <value> ... } )
    #    ( flags = [ ( ifexists ) ( nofail ) ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # Loads a module with the given parameters.
    # If ifexists is given, the module is ignored when it is not found.
    # If nofail is given, module initialization failures are ignored.
    # If condition is given, the module is loaded only when the context
    # properties all match the match rules.
    #

    # Uses realtime scheduling to boost the audio thread priorities. This uses
    # RTKit if the user doesn't have permission to use regular realtime
    # scheduling. You can also clamp utilisation values to improve scheduling
    # on embedded and heterogeneous systems, e.g. Arm big.LITTLE devices.
    { name = libpipewire-module-rt
        args = {
            nice.level    = -11
            rt.prio       = 88
            #rt.time.soft = -1
            #rt.time.hard = -1
            #uclamp.min = 0
            #uclamp.max = 1024
        }
        flags = [ ifexists nofail ]
    }

    # The native communication protocol.
    { name = libpipewire-module-protocol-native
        args = {
            # List of server Unix sockets, and optionally permissions
            #sockets = [ { name = "pipewire-0" }, { name = "pipewire-0-manager" } ]
        }
    }

    # The profile module. Allows application to access profiler
    # and performance data. It provides an interface that is used
    # by pw-top and pw-profiler.
    { name = libpipewire-module-profiler }

    # Allows applications to create metadata objects. It creates
    # a factory for Metadata objects.
    { name = libpipewire-module-metadata }

    # Creates a factory for making devices that run in the
    # context of the PipeWire server.
    { name = libpipewire-module-spa-device-factory }

    # Creates a factory for making nodes that run in the
    # context of the PipeWire server.
    { name = libpipewire-module-spa-node-factory }

    # Allows creating nodes that run in the context of the
    # client. Is used by all clients that want to provide
    # data to PipeWire.
    { name = libpipewire-module-client-node }

    # Allows creating devices that run in the context of the
    # client. Is used by the session manager.
    { name = libpipewire-module-client-device }

    # The portal module monitors the PID of the portal process
    # and tags connections with the same PID as portal
    # connections.
    { name = libpipewire-module-portal
        flags = [ ifexists nofail ]
    }

    # The access module can perform access checks and block
    # new clients.
    { name = libpipewire-module-access
        args = {
            # Socket-specific access permissions
            #access.socket = { pipewire-0 = "default", pipewire-0-manager = "unrestricted" }

            # Deprecated legacy mode (not socket-based),
            # for now enabled by default if access.socket is not specified
            #access.legacy = true
        }
        condition = [ { module.access = true } ]
    }

    # Makes a factory for wrapping nodes in an adapter with a
    # converter and resampler.
    { name = libpipewire-module-adapter }

    # Makes a factory for creating links between ports.
    { name = libpipewire-module-link-factory }

    # Provides factories to make session manager objects.
    { name = libpipewire-module-session-manager }

    # Use libcanberra to play X11 Bell
    { name = libpipewire-module-x11-bell
        args = {
            #sink.name = "@DEFAULT_SINK@"
            #sample.name = "bell-window-system"
            #x11.display = null
            #x11.xauthority = null
        }
        flags = [ ifexists nofail ]
        condition = [ { module.x11.bell = true } ]
    }
    { name = libpipewire-module-jackdbus-detect
        args = {
            #jack.library     = libjack.so.0
            #jack.server      = null
            #jack.client-name = PipeWire
            #jack.connect     = true
            #tunnel.mode      = duplex  # source|sink|duplex
            source.props = {
                #audio.channels = 2
        #midi.ports = 1
                #audio.position = [ FL FR ]
                # extra sink properties
            }
            sink.props = {
                #audio.channels = 2
        #midi.ports = 1
                #audio.position = [ FL FR ]
                # extra sink properties
            }
        }
        flags = [ ifexists nofail ]
        condition = [ { module.jackdbus-detect = true } ]
    }
]

context.objects = [
    #{ factory = <factory-name>
    #    ( args  = { <key> = <value> ... } )
    #    ( flags = [ ( nofail ) ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # Creates an object from a PipeWire factory with the given parameters.
    # If nofail is given, errors are ignored (and no object is created).
    # If condition is given, the object is created only when the context properties
    # all match the match rules.
    #
    #{ factory = spa-node-factory   args = { factory.name = videotestsrc node.name = videotestsrc node.description = videotestsrc "Spa:Pod:Object:Param:Props:patternType" = 1 } }
    #{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] }
    #{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } }
    #{ factory = spa-node-factory   args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } }
    #{ factory = adapter            args = { factory.name = audiotestsrc node.name = my-test node.description = audiotestsrc } }
    #{ factory = spa-node-factory   args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } }

    # A default dummy driver. This handles nodes marked with the "node.always-process"
    # property when no other driver is currently active. JACK clients need this.
    { factory = spa-node-factory
        args = {
            factory.name    = support.node.driver
            node.name       = Dummy-Driver
            node.group      = pipewire.dummy
            priority.driver = 20000
            #clock.id       = monotonic # realtime | tai | monotonic-raw | boottime
            #clock.name     = "clock.system.monotonic"
        }
    }
    { factory = spa-node-factory
        args = {
            factory.name    = support.node.driver
            node.name       = Freewheel-Driver
            priority.driver = 19000
            node.group      = pipewire.freewheel
            node.freewheel  = true
        }
    }

    # This creates a new Source node. It will have input ports
    # that you can link, to provide audio for this source.
    #{ factory = adapter
    #    args = {
    #        factory.name     = support.null-audio-sink
    #        node.name        = "my-mic"
    #        node.description = "Microphone"
    #        media.class      = "Audio/Source/Virtual"
    #        audio.position   = "FL,FR"
    #        monitor.passthrough = true
    #    }
    #}

    # This creates a single PCM source device for the given
    # alsa device path hw:0. You can change source to sink
    # to make a sink in the same way.
    #{ factory = adapter
    #    args = {
    #        factory.name           = api.alsa.pcm.source
    #        node.name              = "alsa-source"
    #        node.description       = "PCM Source"
    #        media.class            = "Audio/Source"
    #        api.alsa.path          = "hw:0"
    #        api.alsa.period-size   = 1024
    #        api.alsa.headroom      = 0
    #        api.alsa.disable-mmap  = false
    #        api.alsa.disable-batch = false
    #        audio.format           = "S16LE"
    #        audio.rate             = 48000
    #        audio.channels         = 2
    #        audio.position         = "FL,FR"
    #    }
    #}

    # Use the metadata factory to create metadata and some default values.
    #{ factory = metadata
    #    args = {
    #        metadata.name = my-metadata
    #        metadata.values = [
    #            { key = default.audio.sink   value = { name = somesink } }
    #            { key = default.audio.source value = { name = somesource } }
    #        ]
    #    }
    #}
]

context.exec = [
    #{   path = <program-name>
    #    ( args = "<arguments>" )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # Execute the given program with arguments.
    # If condition is given, the program is executed only when the context
    # properties all match the match rules.
    #
    # You can optionally start the session manager here,
    # but it is better to start it as a systemd service.
    # Run the session manager with -h for options.
    #
    #{ path = "/usr/local/bin/pipewire-media-session" args = ""
    #  condition = [ { exec.session-manager = null } { exec.session-manager = true } ] }
    #
    # You can optionally start the pulseaudio-server here as well
    # but it is better to start it as a systemd service.
    # It can be interesting to start another daemon here that listens
    # on another address with the -a option (eg. -a tcp:4713).
    #
    #{ path = "/usr/local/bin/pipewire" args = "-c pipewire-pulse.conf"
    #  condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] }
]

start pipewire on the freebsd host

Code:
pipewire --start --daemonize 2>/dev/null

i think thats the correct command
but i may be wrong

still no audio
 
It is not service pipewire start?

Code:
doas service pipewire start

pipewire does not exist in /etc/rc.d or the local startup
directories (/usr/local/etc/rc.d), or is not executable

not sure if wireplumber is needed on freebsd as well
 
when i start pipewire on the freebsd host

Code:
pipewire

it creates some files in the XDG_RUNTIME_DIR

Code:
/var/run/xdg/djwilcox

Code:
srwxr-xr-x  1 djwilcox djwilcox 0 23 Sep 12:37 Alacritty-wayland-0-40736.sock
drwx------  2 djwilcox djwilcox 3 23 Sep 12:37 at-spi
drwx------  3 djwilcox djwilcox 3 23 Sep 12:37 dbus-1
drwx------  2 djwilcox djwilcox 3 23 Sep 12:37 dconf
drwx------  2 djwilcox djwilcox 2 23 Sep 12:57 doc
drwx------  2 djwilcox djwilcox 3 23 Sep 12:37 dwlb
drwx------  2 djwilcox djwilcox 3 23 Sep 12:37 emacs
srwxr-xr-x  1 djwilcox djwilcox 0 23 Sep 14:26 pipewire-0
srwxr-xr-x  1 djwilcox djwilcox 0 23 Sep 14:26 pipewire-0-manager
-rw-r-----  1 djwilcox djwilcox 0 23 Sep 14:26 pipewire-0-manager.lock
-rw-r-----  1 djwilcox djwilcox 0 23 Sep 14:26 pipewire-0.lock
drwx------  2 djwilcox djwilcox 3 23 Sep 14:26 pulse
-rw-------  1 djwilcox djwilcox 0 23 Sep 12:57 tofi.lock
srwxr-xr-x  1 djwilcox djwilcox 0 23 Sep 12:37 wayland-0
-rw-r-----  1 djwilcox djwilcox 0 23 Sep 12:37 wayland-0.lock
-rwx------  1 root     djwilcox 0 23 Sep 12:37 xdg_session.0

the XDG_RUNTIME_DIR is mounted from the host to the jail

Code:
ls -l /var/run/user/1001

Code:
srwxr-xr-x 1 djwilcox djwilcox 0 Sep 23 11:37 Alacritty-wayland-0-40736.sock
drwx------ 2 djwilcox djwilcox 3 Sep 23 11:37 at-spi
drwx------ 3 djwilcox djwilcox 3 Sep 23 11:37 dbus-1
drwx------ 2 djwilcox djwilcox 3 Sep 23 11:37 dconf
drwx------ 2 djwilcox djwilcox 2 Sep 23 11:57 doc
drwx------ 2 djwilcox djwilcox 3 Sep 23 11:37 dwlb
drwx------ 2 djwilcox djwilcox 3 Sep 23 11:37 emacs
srwxr-xr-x 1 djwilcox djwilcox 0 Sep 23 13:26 pipewire-0
srwxr-xr-x 1 djwilcox djwilcox 0 Sep 23 13:26 pipewire-0-manager
-rw-r----- 1 djwilcox djwilcox 0 Sep 23 13:26 pipewire-0-manager.lock
-rw-r----- 1 djwilcox djwilcox 0 Sep 23 13:26 pipewire-0.lock
drwx------ 2 djwilcox djwilcox 3 Sep 23 13:26 pulse
-rw------- 1 djwilcox djwilcox 0 Sep 23 11:57 tofi.lock
srwxr-xr-x 1 djwilcox djwilcox 0 Sep 23 11:37 wayland-0
-rw-r----- 1 djwilcox djwilcox 0 Sep 23 11:37 wayland-0.lock
-rwx------ 1 root     djwilcox 0 Sep 23 11:37 xdg_session.0

so the jail has access to the pipewire files in the XDG_RUNTIME_DIR

playing a audio file with aplay or mpv doesnt work

i had to figure out so many things to actually launch davinci resolve 19.1 on rocky linux
and this is the last issue to fix ( hopefully )

not sure if its an issue with the config files
a package that needs to be installed in the jail or on the host

or the command used to start pipewire
 
this is the pulseaudio set up

freebsd host

Code:
~/.config/pulse/default.pa

Code:
#!/usr/local/bin/pulseaudio -nF

# include default.pa and override
.include /usr/local/etc/pulse/default.pa

.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix
.endif
load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket

jail

Code:
~/.config/pulse/client.conf

Code:
default-server = /tmp/pulseaudio.socket

start pulseaudio on the host

Code:
pulseaudio --start --daemonize 2>/dev/null

the /tmp directory with the pulseaudio.socket
is mounted from the host to the jail

so when you play audio in the jail it uses the client.conf
and the pulseaudio.socket in the /tmp directory

and the audio from the jail is routed to the freebsd host

so i need to work out how to do the same thing with pipewire

and of course most of the documentation suggests running systemd commands ( which wont work )
just to wind me up
 
installed wireplumber on the freebsd host
i already have pipewire installed

scottro did an article about pipewire


pinched a few steps from his page

Code:
doas pkg install wireplumber pipewire

start pipewire

Code:
pipewire

wireplumber

Code:
wpctl status | more

Code:
PipeWire 'pipewire-0' [1.0.4, djwilcox@pollux, cookie:2021917696]
 └─ Clients:
        32. wpctl                               [1.0.4, djwilcox@pollux, pid:38185]

Audio
 ├─ Devices:
 │
 ├─ Sinks:
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:

Video
 ├─ Devices:
 │
 ├─ Sinks:
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:

Settings
 └─ Default Configured Devices:
--More--(END)
 
running pipewire on the freebsd host

Code:
pipewire

using pw-cat to play an audio file in the jail
used by pipewire to play an audio file

Code:
pw-cat out.wav

freebsd host

Code:
wpctl status | more

shows the pw-cat command listed under clients
but still no audio

Code:
PipeWire 'pipewire-0' [1.0.4, djwilcox@pollux, cookie:66229322]
 └─ Clients:
        32. pw-cat                              [1.0.1, djwilcox@rocky, pid:23968]
        34. wpctl                               [1.0.4, djwilcox@pollux, pid:41193]

Audio
 ├─ Devices:
 │
 ├─ Sinks:
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:
        33. pw-play

Video
 ├─ Devices:
 │
 ├─ Sinks:
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:

Settings
 └─ Default Configured Devices:
 
just on freebsd

start pipewire

Code:
pipewire

pw-cat to play and audio file on freebsd

Code:
pw-cat out.wav

Code:
wpctl status | more

no audio plays on freebsd
so maybe some config needed on the freebsd side of things

Code:
PipeWire 'pipewire-0' [1.0.4, djwilcox@pollux, cookie:3673817071]
 └─ Clients:
        39. wpctl                               [1.0.4, djwilcox@pollux, pid:93436]
        40. pw-cat                              [1.0.4, djwilcox@pollux, pid:89528]

Audio
 ├─ Devices:
 │
 ├─ Sinks:
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:
        32. pw-play

Video
 ├─ Devices:
 │
 ├─ Sinks:
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:

Settings
 └─ Default Configured Devices:
 
im guessing the issue is pipewire doesnt work with oss audio
and you have to use pulse, alsa or jack

i tried starting pipewire, pipewire-pulse and wireplumber
and then using pw-cat to play a file on freebsd

looking in pavucontrol i can see the audio listed but its using a dummy audio device
so no audio

looks like you need to specify an output device for the audio
like a pulse audio sink or something
 
more detective work

run pulseaudio

Code:
pulseaudio --start --daemonize 2>/dev/null

pactl info

Code:
pactl info

Code:
Server String: /var/run/xdg/djwilcox/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 0
Tile Size: 65472
User Name: djwilcox
Host Name: pollux
Server Name: pulseaudio
Server Version: 16.1
Default Sample Specification: s16le 2ch 44100Hz
Default Channel Map: front-left,front-right
Default Sink: oss_output.dsp1
Default Source: oss_input.dsp0
Cookie: e183:156b

kill pulseaudio before starting pipewire

Code:
pulseaudio -k

pipewire-pulse set up

Code:
mkdir -p "${HOME}"/.config/pipewire/pipewire-pulse.conf.d/

Code:
cp /usr/local/share/pipewire/pipewire-pulse.conf "${HOME}"/.config/pipewire/pipewire-pulse.conf.d/

Code:
# PulseAudio config file for PipeWire version "1.0.4" #
#
# Copy and edit this file in /usr/local/etc/pipewire for system-wide changes
# or in ~/.config/pipewire for local changes.
#
# It is also possible to place a file with an updated section in
# /usr/local/etc/pipewire/pipewire-pulse.conf.d/ for system-wide changes or in
# ~/.config/pipewire/pipewire-pulse.conf.d/ for local changes.
#

context.properties = {
    ## Configure properties in the system.
    #mem.warn-mlock  = false
    #mem.allow-mlock = true
    #mem.mlock-all   = false
    #log.level       = 2

    #default.clock.quantum-limit = 8192
}

context.spa-libs = {
    audio.convert.* = audioconvert/libspa-audioconvert
    support.*       = support/libspa-support
}

context.modules = [
    { name = libpipewire-module-rt
        args = {
            nice.level   = -11
            #rt.prio      = 83
            #rt.time.soft = -1
            #rt.time.hard = -1
            #uclamp.min = 0
            #uclamp.max = 1024
        }
        flags = [ ifexists nofail ]
    }
    { name = libpipewire-module-protocol-native }
    { name = libpipewire-module-client-node }
    { name = libpipewire-module-adapter }
    { name = libpipewire-module-metadata }

    { name = libpipewire-module-protocol-pulse
        args = {
        # contents of pulse.properties can also be placed here
        # to have config per server.
        }
    }
]

# Extra scripts can be started here. Setup in default.pa can be moved in
# a script or in pulse.cmd below
context.exec = [
    #{ path = "pactl"        args = "load-module module-always-sink" }
    #{ path = "pactl"        args = "upload-sample my-sample.wav my-sample" }
    #{ path = "/usr/bin/sh"  args = "~/.config/pipewire/default.pw" }
]

# Extra commands can be executed here.
#   load-module : loads a module with args and flags
#      args = "<module-name> <module-args>"
#      ( flags = [ nofail ] )
pulse.cmd = [
    { cmd = "load-module" args = "module-always-sink" flags = [ ] }
    #{ cmd = "load-module" args = "module-switch-on-connect" }
    #{ cmd = "load-module" args = "module-gsettings" flags = [ nofail ] }
]

stream.properties = {
    #node.latency          = 1024/48000
    #node.autoconnect      = true
    #resample.quality      = 4
    #channelmix.normalize  = false
    #channelmix.mix-lfe    = true
    #channelmix.upmix      = true
    #channelmix.upmix-method = psd  # none, simple
    #channelmix.lfe-cutoff = 150
    #channelmix.fc-cutoff  = 12000
    #channelmix.rear-delay = 12.0
    #channelmix.stereo-widen = 0.0
    #channelmix.hilbert-taps = 0
    #dither.noise = 0
}

pulse.properties = {
    # the addresses this server listens on
    server.address = [
        "unix:native"
        #"unix:/tmp/pulseaudio.socket"              # absolute paths may be used
        #"unix:/tmp/something"              # absolute paths may be used
        #"tcp:4713"                         # IPv4 and IPv6 on all addresses
        #"tcp:[::]:9999"                    # IPv6 on all addresses
        #"tcp:127.0.0.1:8888"               # IPv4 on a single address
        #
        #{ address = "tcp:4713"             # address
        #  max-clients = 64                 # maximum number of clients
        #  listen-backlog = 32              # backlog in the server listen queue
        #  client.access = "restricted"     # permissions for clients
        #}
    ]
    #server.dbus-name       = "org.pulseaudio.Server"
    #pulse.min.req          = 128/48000     # 2.7ms
    #pulse.default.req      = 960/48000     # 20 milliseconds
    #pulse.min.frag         = 128/48000     # 2.7ms
    #pulse.default.frag     = 96000/48000   # 2 seconds
    #pulse.default.tlength  = 96000/48000   # 2 seconds
    #pulse.min.quantum      = 128/48000     # 2.7ms
    #pulse.idle.timeout     = 0             # don't pause after underruns
    #pulse.default.format   = F32
    #pulse.default.position = [ FL FR ]
    # These overrides are only applied when running in a vm.
    vm.overrides = {
        pulse.min.quantum = 1024/48000      # 22ms
    }
}

# client/stream specific properties
pulse.rules = [
    {
        matches = [
            {
                # all keys must match the value. ! negates. ~ starts regex.
                #client.name                = "Firefox"
                #application.process.binary = "teams"
                #application.name           = "~speech-dispatcher.*"
            }
        ]
        actions = {
            update-props = {
                #node.latency = 512/48000
            }
            # Possible quirks:"
            #    force-s16-info                 forces sink and source info as S16 format
            #    remove-capture-dont-move       removes the capture DONT_MOVE flag
            #    block-source-volume            blocks updates to source volume
            #    block-sink-volume              blocks updates to sink volume
            #quirks = [ ]
        }
    }
    {
        # skype does not want to use devices that don't have an S16 sample format.
        matches = [
             { application.process.binary = "teams" }
             { application.process.binary = "teams-insiders" }
             { application.process.binary = "skypeforlinux" }
        ]
        actions = { quirks = [ force-s16-info ] }
    }
    {
        # firefox marks the capture streams as don't move and then they
        # can't be moved with pavucontrol or other tools.
        matches = [ { application.process.binary = "firefox" } ]
        actions = { quirks = [ remove-capture-dont-move ] }
    }
    {
        # speech dispatcher asks for too small latency and then underruns.
        matches = [ { application.name = "~speech-dispatcher.*" } ]
        actions = {
            update-props = {
                pulse.min.req          = 512/48000      # 10.6ms
                pulse.min.quantum      = 512/48000      # 10.6ms
                pulse.idle.timeout     = 5              # pause after 5 seconds of underrun
            }
        }
    }
    #{
    #    matches = [ { application.process.binary = "Discord" } ]
    #    actions = { quirks = [ block-source-volume ] }
    #}
]

run pipewire

Code:
pipewire

run pipewire-pulse

Code:
pipewire-pulse -c ~/.config/pipewire/pipewire-pulse.conf.d/pipewire-pulse.conf

pactl info

Code:
Server String: /var/run/xdg/djwilcox/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 34
Tile Size: 65472
User Name: djwilcox
Host Name: pollux
Server Name: PulseAudio (on PipeWire 1.0.4)
Server Version: 15.0.0
Default Sample Specification: float32be 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: @DEFAULT_SINK@
Default Source: @DEFAULT_SOURCE@
Cookie: 2582:cb12

2 things to note

1 - we are using pipewire

Code:
Server Name: PulseAudio (on PipeWire 1.0.4)

2 - Default Sink and Default Source

Code:
Default Sink: @DEFAULT_SINK@
Default Source: @DEFAULT_SOURCE@

pulseaudio pactl info
Default Sink and Default Source are set to oss devices

Code:
Default Sink: oss_output.dsp1
Default Source: oss_input.dsp0

play an audio file with pw-play

Code:
pw-play out.wav

wpctl status

Code:
wpctl status

Code:
PipeWire 'pipewire-0' [1.0.4, djwilcox@pollux, cookie:629328658]
 └─ Clients:
        32. pipewire                            [1.0.4, djwilcox@pollux, pid:65633]
        34. wpctl                               [1.0.4, djwilcox@pollux, pid:87126]
        36. pw-cat                              [1.0.4, djwilcox@pollux, pid:85115]

Audio
 ├─ Devices:
 │
 ├─ Sinks:
 │      33. Dummy Output                        [vol: 1.00]
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:
        37. pw-play

Video
 ├─ Devices:
 │
 ├─ Sinks:
 │
 ├─ Sources:
 │
 ├─ Filters:
 │
 └─ Streams:

Settings
 └─ Default Configured Devices:

pavucontrol screenshots

the issue is its using a dummy output for audio

so i need to figure out how to set the Default Sink and Default Source
with pipewire so they are the same as on Pulseaudio

which i think is from this section of pipewire-pulse.conf

Code:
pulse.cmd = [
    { cmd = "load-module" args = "module-always-sink" flags = [ ] }
    #{ cmd = "load-module" args = "module-switch-on-connect" }
    #{ cmd = "load-module" args = "module-gsettings" flags = [ nofail ] }
]

20240924_15h33m54s_grim.png


20240924_15h34m00s_grim.png
 
pactl list sinks

Code:
pactl list sinks

Code:
Sink #33
        State: SUSPENDED
        Name: auto_null
        Description: Dummy Output
        Driver: PipeWire
        Sample Specification: float32be 2ch 48000Hz
        Channel Map: front-left,front-right
        Owner Module: 4294967295
        Mute: no
        Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
                balance 0.00
        Base Volume: 65536 / 100% / 0.00 dB
        Monitor Source: auto_null.monitor
        Latency: 0 usec, configured 0 usec
        Flags: DECIBEL_VOLUME LATENCY
        Properties:
                node.name = "auto_null"
                device.description = "Dummy Output"
                audio.rate = "48000"
                audio.channels = "2"
                audio.position = "FL,FR"
                media.class = "Audio/Sink"
                factory.name = "support.null-audio-sink"
                node.virtual = "true"
                monitor.channel-volumes = "true"
                factory.id = "18"
                clock.quantum-limit = "8192"
                client.id = "32"
                node.driver = "true"
                factory.mode = "merge"
                audio.adapt.follower = ""
                library.name = "audioconvert/libspa-audioconvert"
                object.id = "33"
                object.serial = "33"
        Formats:
                pcm

pactl list sources

Code:
pactl list sources

Code:
Source #33
        State: SUSPENDED
        Name: auto_null.monitor
        Description: Monitor of Dummy Output
        Driver: PipeWire
        Sample Specification: float32be 2ch 48000Hz
        Channel Map: front-left,front-right
        Owner Module: 4294967295
        Mute: no
        Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
                balance 0.00
        Base Volume: 65536 / 100% / 0.00 dB
        Monitor of Sink: auto_null
        Latency: 0 usec, configured 0 usec
        Flags: DECIBEL_VOLUME LATENCY
        Properties:
                node.name = "auto_null"
                device.description = "Dummy Output"
                audio.rate = "48000"
                audio.channels = "2"
                audio.position = "FL,FR"
                media.class = "Audio/Sink"
                factory.name = "support.null-audio-sink"
                node.virtual = "true"
                monitor.channel-volumes = "true"
                factory.id = "18"
                clock.quantum-limit = "8192"
                client.id = "32"
                node.driver = "true"
                factory.mode = "merge"
                audio.adapt.follower = ""
                library.name = "audioconvert/libspa-audioconvert"
                object.id = "33"
                object.serial = "33"
                device.class = "monitor"
        Formats:
                pcm
 
starting pipewire

Code:
pipewire

pipewire-pulse

Code:
pipewire-pulse -c ~/.config/pipewire/pipewire-pulse.conf.d/pipewire-pulse.conf

and wireplumber

Code:
wireplumber

play and audio file with pw-play

Code:
pw-play out.wav

pavucontrol screenshots

the dummy audio device now has audio going through the device
as can be seen from the meters ( but still no actual audio )

so is it wireplumber i need to look at

20240924_16h13m14s_grim.png


20240924_16h13m18s_grim.png
 
the only references to the dummy driver i could find

Code:
/usr/share/examples/pipewire/pipewire.conf

has reference to a dummy driver

Code:
    # A default dummy driver. This handles nodes marked with the "node.always-process"
    # property when no other driver is currently active. JACK clients need this.
    { factory = spa-node-factory
        args = {
            factory.name    = support.node.driver
            node.name       = Dummy-Driver
            node.group      = pipewire.dummy
            priority.driver = 20000
            #clock.id       = monotonic # realtime | tai | monotonic-raw | boottime
            #clock.name     = "clock.system.monotonic"
        }
    }

wireplumber

Code:
/usr/share/examples/wireplumber/scripts/fallback-sink.lua

Code:
function createFallbackSink()
  if fallback_node then
    return
  end

  Log.info("Create fallback sink")

  local properties = {}

  properties["node.name"] = "auto_null"
  properties["node.description"] = "Dummy Output"

  properties["audio.rate"] = 48000
  properties["audio.channels"] = 2
  properties["audio.position"] = "FL,FR"

  properties["media.class"] = "Audio/Sink"
  properties["factory.name"] = "support.null-audio-sink"
  properties["node.virtual"] = "true"
  properties["monitor.channel-volumes"] = "true"

  properties["wireplumber.is-fallback"] = "true"
  properties["priority.session"] = 500

  fallback_node = LocalNode("adapter", properties)
  fallback_node:activate(Feature.Proxy.BOUND)
end
 
more tests

running pipewire and pipewire-pulse

Code:
pipewire
pipewire-pulse -c ~/.config/pipewire/pipewire-pulse.conf.d/pipewire-pulse.conf

Code:
pactl info

Code:
Server String: /var/run/xdg/djwilcox/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 34
Tile Size: 65472
User Name: djwilcox
Host Name: pollux
Server Name: PulseAudio (on PipeWire 1.0.4)
Server Version: 15.0.0
Default Sample Specification: float32be 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: @DEFAULT_SINK@
Default Source: @DEFAULT_SOURCE@
Cookie: c249:4008

running pipewire and pipewire-pulse and wireplumber

Code:
pipewire
pipewire-pulse -c ~/.config/pipewire/pipewire-pulse.conf.d/pipewire-pulse.conf
wireplumber


Code:
pactl info

Code:
Server String: /var/run/xdg/djwilcox/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 48
Tile Size: 65472
User Name: djwilcox
Host Name: pollux
Server Name: PulseAudio (on PipeWire 1.0.4)
Server Version: 15.0.0
Default Sample Specification: float32be 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: auto_null
Default Source: auto_null.monitor
Cookie: c249:4008

pipewire and pipewire-pulse

Code:
Default Sink: @DEFAULT_SINK@
Default Source: @DEFAULT_SOURCE@

pipewire and pipewire-pulse and wireplumber

Code:
Default Sink: auto_null
Default Source: auto_null.monitor
 
how to driver yourself insane in several easy steps

pick an obscure project that no one on the forum can help with

make sure there are no man pages for the programs

Code:
man pipewire
No manual entry for "pipewire"

man wireplumber
No manual entry for "wireplumber"

ensure there are multiple programs and config files involved

return the same dozen search results in google
and if you actually get any result ensure they are only for linux and require systemd

then get the audio playing
but with a dummy pulseaudio output you cant actually hear
 
looking at the pipewire package


Code:
===> The following configuration options are available for pipewire-1.2.1_1:
     AVAHI=off: Automatic service discovery for the Pulseaudio module via Avahi
     DOCS=on: Build and/or install documentation
     DOXYGEN=off: Build documentation with Doxygen
     GSTREAMER=on: Multimedia support via GStreamer
     JACK=on: JACK audio server support
     LV2=off: Support lv2-based audio plugins via lilv
     PULSEAUDIO=off: PulseAudio sound server support
     VULKAN=off: Enable Vulkan integration
     X11_BELL=off: Support for X11 bell via libcanberra
===> Use 'make config' to modify these settings

PULSEAUDIO=off

however the package includes this binary

Code:
bin/pipewire-pulse

running the following commands

Code:
pipewire
pipewire-pulse
wireplumber
pactl info

shows PulseAudio on PipeWire

Code:
Server Name: PulseAudio (on PipeWire 1.0.4)

what odd is a couple of things

why is PulseAudio off for the package
but the package include pipewire-pulse

pipewire-pulse creates a dummy pulseaudio output
and you can see the audio levels changing when using pw-play to play and audio file
 
running pipewire and then wireplumber

Code:
pipewire

Code:
wireplumber

Code:
N 15:06:00.438620          wp-device ../lib/wp/device.c:620:wp_spa_device_new_from_spa_factory: SPA handle 'api.alsa.enum.udev' could not be loaded; is it installed?
N 15:06:00.438671         s-monitors alsa.lua:317:createMonitor: PipeWire's ALSA SPA plugin is missing or broken. Sound cards will not be supported

i have alsa-libs installed which was installed as a dependency for some package or other

Code:
ls /usr/local/etc/alsa/conf.d

Code:
50-oss.conf

Code:
pcm.oss {
    @args [ DEVICE ]
    @args.DEVICE {
        type string
        default "/dev/dsp"
    }
    type oss
    device $DEVICE
    hint {
        show {
            @func refer
            name defaults.namehint.basic
        }
        description "Open Sound System"
    }
}

ctl.oss {
    @args [ DEVICE ]
    @args.DEVICE {
        type string
        default "/dev/mixer"
    }
    type oss
    device $DEVICE
}

i think that wireplumber uses alsa to get the audio card names
and because freebsd uses oss it cant find the audio devices

and so it falls back to using the dummy output device

could the issue be either you need a

Code:
~/.asoundrc

with the default card

Code:
defaults.pcm.card 1

Code:
cat /dev/sndstat

Code:
Installed devices:
pcm0: <Realtek ALC298 (Internal Analog)> (play/rec)
pcm1: <Realtek ALC298 (Left Analog Headphones)> (play) default
pcm2: <Intel Kaby Lake (HDMI/DP 8ch)> (play)
No devices installed from userspace.

or is the issue a missing package

Code:
pkg search alsa

Code:
alsa-lib-1.2.12                ALSA compatibility library
alsa-plugins-1.2.7.1_3         ALSA compatibility library plugins
alsa-seq-server-1.1.0_2        ALSA MIDI sequencer server
alsa-sndio-0.2_1               ALSA PCM sndio plugin
alsa-utils-1.2.12              ALSA compatibility utilities
balsa-2.6.4_1                  Mail reader for the GNOME desktop
libdssialsacompat-1.0.8a_2     Alsa compatibility library to build DSSI
linux-c7-alsa-lib-1.1.8        Advanced Linux Sound Architecture libraries (Linux CentOS 7.9.2009)
linux-c7-alsa-lib-devel-1.1.8  Advanced Linux Sound Architecture headers (Linux CentOS 7.9.2009)
linux-c7-alsa-plugins-oss-1.1.6_4 OSS plugin for ALSA (Linux CentOS 7.9.2009)
linux-c7-alsa-plugins-pulseaudio-1.1.6_1 PulseAudio plugin for ALSA (Linux CentOS 7.9.2009)
linux-c7-alsa-utils-1.1.8      Advanced Linux Sound Architecture utilities (Linux CentOS 7.9.2009)
linux-rl9-alsa-lib-1.2.10      Advanced Linux Sound Architecture libraries (Rocky Linux 9.4)
linux-rl9-alsa-lib-devel-1.2.10 Advanced Linux Sound Architecture headers (Rocky Linux 9.4)
linux-rl9-alsa-plugins-oss-1.2.7.1 PulseAudio plugin for ALSA (Rocky Linux 9.4)
linux-rl9-alsa-plugins-pulseaudio-1.2.7.1 PulseAudio plugin for ALSA (Rocky Linux 9.4)
zita-alsa-pcmi-0.6.1           Easy access to ALSA PCM devices

Code:
pkg search pipewire

Code:
pipewire-1.0.4_3               Server and user space API to deal with multimedia pipelines
pipewire-module-xrdp-0.1       PipeWire module which enables xrdp to use audio redirection
plasma5-kpipewire-5.27.11      Plasma5 Plasma pipewire plugin
plasma6-kpipewire-6.1.2        Components relating to Flatpak 'pipewire' use in Plasma

Code:
pkg search wireplumber

Code:
wireplumber-0.4.90_1           Session and policy manager for PipeWire
 
Euerka

Davinci Resolve 19.1 audio working in a Rocky Linux 9 jail with Pulseaudio


i couldnt get pipewire working

the reason pulseaudio wasnt working was because i needed to install alsa-plugins-pulseaudio package

Code:
sudo dnf install pulseaudio pulseaudio-utils alsa-plugins-pulseaudio

i start pulseaudio on the freebsd host and create a pulseaudio.socket in /tmp
which is mounted in the jail which then use the socket for the audio in the jail

there are 3 advantages to using rocky linux instead of ubuntu

1 - on ubuntu you have to use the makeresolve script
to create a deb installer from the resolve installer

2 - on ubuntu you always get conflicts with the libraries installed with resolve and the system libraries
so you have to either use LD_PRELOAD to load particular libraries or move some of the resolve out of the way

3 - versions of ubuntu after mantic wont install in a freebsd jail because of systemd

Davinci Resolve 19.1 in a Rocky Linux 9 jail on Freebsd 14.1 p4

20240926_21h13m39s_grim.png


20240926_21h15m02s_grim.png


20240926_21h15m19s_grim.png


20240926_21h15m48s_grim.png


20240926_21h16m06s_grim.png


Note:

You need to reduce the render speed from maximum to 10
depending on the amount of ram on your system

ill create a git repo for this project
with all the commands and files

Davinci Resolve is opened using a desktop entry with your application launcher on freebsd
just like a native application
 
Back
Top