wwmm / easyeffects

Limiter, compressor, convolver, equalizer and auto volume and many other plugins for PipeWire applications
GNU General Public License v3.0
6.63k stars 270 forks source link

EasyEffects Crashes with "interpolation error" #2747

Closed evamvid closed 8 months ago

evamvid commented 1 year ago

EasyEffects Version

7.1.3

What package are you using?

Flatpak (Flathub)

Distribution

Manjaro Linux

Describe the bug

I've had the same issue with nearly the same error with both the Arch package and the flathub package. When trying to run the program, it appears for about half a second, playing audio skips, and then it crashes.

The output for the flathub package reads:

libEGL warning: failed to get driver name for fd -1

libEGL warning: MESA-LOADER: failed to retrieve device information

libEGL warning: failed to get driver name for fd -1

gsl: interp.c:150: ERROR: interpolation error
Default GSL error handler invoked.

The output from the native arch package is similar:

gsl: interp.c:150: ERROR: interpolation error
Default GSL error handler invoked.
[1]    281421 IOT instruction (core dumped)  easyeffects

I have some custom clock rate settings in /etc/pipewire/pipewire.conf due to problems with HDMI audio. Specifically, the following lines were added:

default.clock.rate        = 19200
default.clock.quantum     = 512
default.clock.min-quantum = 32
default.clock.max-quantum = 4096

Expected Behavior

No response

Debug Log

Debug Log
``` (process:2): easyeffects-DEBUG: 10:13:46.931: easyeffects.cpp:35 easyeffects version: 7.1.3 (process:2): easyeffects-DEBUG: 10:13:46.932: easyeffects.cpp:45 locale directory: /app/share/locale (easyeffects:2): easyeffects-DEBUG: 10:13:46.944: presets_manager.cpp:162 user presets directory already exists: /home/user/.var/app/com.github.wwmm.easyeffects/config/easyeffects/ (easyeffects:2): easyeffects-DEBUG: 10:13:46.944: presets_manager.cpp:162 user presets directory already exists: /home/user/.var/app/com.github.wwmm.easyeffects/config/easyeffects/input (easyeffects:2): easyeffects-DEBUG: 10:13:46.944: presets_manager.cpp:162 user presets directory already exists: /home/user/.var/app/com.github.wwmm.easyeffects/config/easyeffects/output (easyeffects:2): easyeffects-DEBUG: 10:13:46.944: presets_manager.cpp:162 user presets directory already exists: /home/user/.var/app/com.github.wwmm.easyeffects/config/easyeffects/autoload/input (easyeffects:2): easyeffects-DEBUG: 10:13:46.944: presets_manager.cpp:162 user presets directory already exists: /home/user/.var/app/com.github.wwmm.easyeffects/config/easyeffects/autoload/output libEGL warning: failed to get driver name for fd -1 libEGL warning: MESA-LOADER: failed to retrieve device information libEGL warning: failed to get driver name for fd -1 (easyeffects:2): easyeffects-DEBUG: 10:13:47.053: pipe_manager.cpp:1429 compiled with PipeWire: 0.3.79 (easyeffects:2): easyeffects-DEBUG: 10:13:47.053: pipe_manager.cpp:1430 linked to PipeWire: 0.3.81 (easyeffects:2): easyeffects-DEBUG: 10:13:47.056: pipe_manager.cpp:1400 core version: 0.3.81 (easyeffects:2): easyeffects-DEBUG: 10:13:47.056: pipe_manager.cpp:1401 core name: pipewire-0 (easyeffects:2): easyeffects-DEBUG: 10:13:47.057: pipe_manager.cpp:1312 found metadata: settings (easyeffects:2): easyeffects-DEBUG: 10:13:47.057: pipe_manager.cpp:1312 found metadata: default (easyeffects:2): easyeffects-DEBUG: 10:13:47.057: pipe_manager.cpp:1312 found metadata: route-settings (easyeffects:2): easyeffects-DEBUG: 10:13:47.057: pipe_manager.cpp:1167 Audio/Sink 45 alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_5__sink with serial 46 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.057: pipe_manager.cpp:1167 Audio/Sink 46 alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_4__sink with serial 47 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1167 Audio/Sink 47 alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_3__sink with serial 48 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1167 Audio/Sink 48 alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__sink with serial 49 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1167 Audio/Source 49 alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__source with serial 50 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1167 Audio/Source 50 alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source with serial 51 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1167 Stream/Output/Audio 84 spotify with serial 1128 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1207 spotify port 97 is connected to alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__sink port 62 (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1207 spotify port 85 is connected to alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__sink port 64 (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1167 Audio/Sink 135 easyeffects_sink with serial 1401 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:1167 Audio/Source/Virtual 133 easyeffects_source with serial 1402 has been added (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:900 new metadata property: 0, default.configured.audio.sink, Spa:String:JSON, { "name": "alsa_output.usb-FiiO_FiiO_USB_DAC_Q1-01.analog-stereo" } (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:900 new metadata property: 0, default.audio.sink, Spa:String:JSON, { "name": "alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__sink" } (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:900 new metadata property: 0, default.audio.source, Spa:String:JSON, { "name": "alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source" } (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:900 new metadata property: 0, default.video.source, Spa:String:JSON, { "name": "v4l2_input.pci-0000_00_14.0-usb-0_8_1.0" } (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:900 new metadata property: 84, target.node, Spa:Id, 117 (easyeffects:2): easyeffects-DEBUG: 10:13:47.058: pipe_manager.cpp:900 new metadata property: 84, target.object, Spa:Id, 1301 (easyeffects:2): easyeffects-DEBUG: 10:13:47.059: pipe_manager.cpp:1526 easyeffects_sink node successfully retrieved with id 135 and serial 1401 (easyeffects:2): easyeffects-DEBUG: 10:13:47.059: pipe_manager.cpp:1531 easyeffects_source node successfully retrieved with id 133 and serial 1402 (easyeffects:2): easyeffects-DEBUG: 10:13:47.061: pipe_manager.cpp:1207 spotify port 97 is connected to easyeffects_sink port 123 (easyeffects:2): easyeffects-DEBUG: 10:13:47.061: pipe_manager.cpp:1207 spotify port 85 is connected to easyeffects_sink port 94 (easyeffects:2): easyeffects-DEBUG: 10:13:47.065: plugin_base.cpp:370 soe: output_level successfully connected to PipeWire graph (easyeffects:2): easyeffects-DEBUG: 10:13:47.067: plugin_base.cpp:370 soe: spectrum successfully connected to PipeWire graph (easyeffects:2): easyeffects-DEBUG: 10:13:47.071: plugin_base.cpp:370 sie: output_level successfully connected to PipeWire graph (easyeffects:2): easyeffects-DEBUG: 10:13:47.073: plugin_base.cpp:370 sie: spectrum successfully connected to PipeWire graph (easyeffects:2): easyeffects-DEBUG: 10:13:47.106: output_level.cpp:37 soe: output_level: PipeWire blocksize: 1024 (easyeffects:2): easyeffects-DEBUG: 10:13:47.106: output_level.cpp:38 soe: output_level: PipeWire sampling rate: 19200 easyeffects-INFO: 10:13:47.130: application.cpp:50 disabling global bypass (easyeffects:2): easyeffects-DEBUG: 10:13:47.135: application_ui.cpp:86 Icon Theme Adwaita detected (easyeffects:2): easyeffects-DEBUG: 10:13:47.352: application.cpp:78 new default output device: alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__sink (easyeffects:2): easyeffects-DEBUG: 10:13:47.357: application.cpp:86 new default input device: alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source (easyeffects:2): easyeffects-DEBUG: 10:13:47.361: application.cpp:130 device alsa_card.pci-0000_00_1f.3-platform-skl_hda_dsp_generic has changed its output route to: [Out] Headphones (easyeffects:2): easyeffects-DEBUG: 10:13:47.361: application.cpp:150 output autoloading: the target node name does not match the output device name (easyeffects:2): easyeffects-DEBUG: 10:13:47.361: application.cpp:98 device alsa_card.pci-0000_00_1f.3-platform-skl_hda_dsp_generic has changed its input route to: [In] Mic1 (easyeffects:2): easyeffects-DEBUG: 10:13:47.361: application.cpp:118 input autoloading: the target node name does not match the input device name gsl: interp.c:150: ERROR: interpolation error Default GSL error handler invoked. ```

Additional Information

The entire pipewire.conf is as follows:

# Daemon config file for PipeWire version "0.3.80" #
#
# 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/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.video.width         = 640
    #default.video.height        = 480
    #default.video.rate.num      = 25
    #default.video.rate.denom    = 1
    #
    #added to address audio stuttering: https://unix.stackexchange.com/a/604756
    default.clock.rate        = 19200
    default.clock.quantum     = 512
    default.clock.min-quantum = 32
    default.clock.max-quantum = 4096

    #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
}

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.
    { name = libpipewire-module-rt
        args = {
            nice.level    = -11
            #rt.prio      = 88
            #rt.time.soft = -1
            #rt.time.hard = -1
        }
        flags = [ ifexists nofail ]
    }

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

    # 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 = {
            # access.allowed to list an array of paths of allowed
            # apps.
            #access.allowed = [
            #    /usr/bin/pipewire-media-session
            #]

            # An array of rejected paths.
            #access.rejected = [ ]

            # An array of paths with restricted access.
            #access.restricted = [ ]

            # Anything not in the above lists gets assigned the
            # access.force permission.
            #access.force = flatpak
        }
        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 = ""
            #sample.name = "bell-window-system"
            #x11.display = null
            #x11.xauthority = null
        }
        flags = [ ifexists nofail ]
        condition = [ { module.x11.bell = 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-driver"
    # 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"
    #    }
    #}

    # 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/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/bin/pipewire" args = "-c pipewire-pulse.conf"
    #  condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] }
]
wwmm commented 1 year ago

I have some custom clock rate settings in /etc/pipewire/pipewire.conf due to problems with HDMI audio. PipeWire sampling rate: 19200

As far as I am aware of no audio content uses this sampling rate value. Are you sure you can not use the common rate values? I am not sure if this is the reason for the crash considering you have other unusual errors too

libEGL warning: failed to get driver name for fd -1

libEGL warning: MESA-LOADER: failed to retrieve device information

libEGL warning: failed to get driver name for fd -1

. But it does not seem a good idea to force PipeWire to use 19200 as rate value. Maybe you intended to put 192000?

evamvid commented 8 months ago

You were absolutely right, my HDMI audio 'fix' was a snippet from #1021 that had been copied somewhere on stackexchange and had a typo from 192000 to 19200. Changing it to 192000 fixed the issue with easyeffects.