easyeffects
easyeffects copied to clipboard
Crackling and laggy behavior when capturing from easyeffects source/sink
EasyEffects Version
6.25
What package are you using?
Gentoo
Distribution
Gentoo
Describe the bug
When capturing from easyeffects source in obs as my microphone, frequent crackling will begin on my audio output, that may sometimes progress to downright unbearable screeching, this can be replicated with ffmpeg as well by using ffmpeg -f pulse -i easyeffects_source
, or simply by opening pavucontrol. On top of this, capturing audio from easyeffects_sink, the only thing I could capture that is before the filter chain so as to not equalize recorded audio, results in very laggy audio in the recording that is not present when capturing my headphones device directly, which causes poor playback quality for me due to it being after the filter chain and being equalized twice, and undoubtedly impacts others playback experience as well as this equalizer is fine tuned for my headsets response curve. This happens regardless of whether I capture the device from pipewire or pulseaudio in obs, ffmpeg does not have a pipewire source, so no testing can be done there. The only filters I am making use of are the equalizer for my headphones and noise reduction for my microphone.
Expected Behavior
Capturing mic audio does not cause any crackling or screeching, capturing output audio does not result in a laggy recording, the screeching cannot be captured in recording for demonstration purpose unfortunately.
Debug Log
When adding this, my comment was too long, so I'm omitting some warnings about not installed plugins
Debug Log
G_MESSAGES_DEBUG=easyeffects easyeffects
(process:14404): easyeffects-DEBUG: 15:46:03.850: easyeffects version: 6.2.5
(process:14404): easyeffects-DEBUG: 15:46:03.850: main: locale directory: /usr/share/locale
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: system input presets directory: "/etc/easyeffects/input";
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: system input presets directory: "/etc/xdg/easyeffects/input";
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: system output presets directory: "/etc/easyeffects/output";
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: system output presets directory: "/etc/xdg/easyeffects/output";
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: user presets directory already exists: /home/obamid/.config/easyeffects/
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: user presets directory already exists: /home/obamid/.config/easyeffects/input
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: user presets directory already exists: /home/obamid/.config/easyeffects/output
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: user presets directory already exists: /home/obamid/.config/easyeffects/autoload/input
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.851: presets_manager: user presets directory already exists: /home/obamid/.config/easyeffects/autoload/output
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.915: pipe_manager: compiled with PipeWire: 0.3.51
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.915: pipe_manager: linked to PipeWire: 0.3.52
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: core version: 0.3.52
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: core name: pipewire-0
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: found metadata: settings
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: found metadata: default
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: found metadata: route-settings
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: Audio/Sink 80 alsa_output.usb-Google_Inc_Headphone_adapter_88RG019BLXTK0PML-00.analog-stereo with timestamp 1657050363920753860 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: Audio/Sink 81 alsa_output.pci-0000_11_00.3.analog-stereo with timestamp 1657050363920781220 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: Audio/Source 82 alsa_input.pci-0000_11_00.3.analog-stereo with timestamp 1657050363920822901 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: Stream/Input/Audio 275 OBS Studio with timestamp 1657050363920916753 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: alsa_output.pci-0000_11_00.3.analog-stereo port 88 is connected to OBS Studio port 50
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.920: pipe_manager: alsa_output.pci-0000_11_00.3.analog-stereo port 90 is connected to OBS Studio port 75
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Stream/Input/Audio 138 OBS Studio with timestamp 1657050363920993855 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Stream/Input/Audio 286 OBS Studio with timestamp 1657050363921009935 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Stream/Input/Audio 97 OBS Studio with timestamp 1657050363921052176 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Stream/Input/Audio 211 OBS with timestamp 1657050363921203109 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: alsa_input.pci-0000_11_00.3.analog-stereo port 91 is connected to OBS port 51
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: alsa_input.pci-0000_11_00.3.analog-stereo port 92 is connected to OBS port 120
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Stream/Output/Audio 250 Firefox with timestamp 1657050363921257320 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Firefox port 117 is connected to alsa_output.pci-0000_11_00.3.analog-stereo port 87
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Firefox port 243 is connected to alsa_output.pci-0000_11_00.3.analog-stereo port 89
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Audio/Sink 262 easyeffects_sink with timestamp 1657050363921310021 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.921: pipe_manager: Audio/Source/Virtual 59 easyeffects_source with timestamp 1657050363921323581 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 0, default.configured.audio.sink, Spa:String:JSON, { "name": "alsa_output.pci-0000_11_00.3.analog-stereo" }
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 0, default.configured.audio.source, Spa:String:JSON, { "name": "alsa_input.pci-0000_11_00.3.analog-stereo" }
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 0, default.audio.sink, Spa:String:JSON, {"name":"alsa_output.pci-0000_11_00.3.analog-stereo"}
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 0, default.audio.source, Spa:String:JSON, {"name":"alsa_input.pci-0000_11_00.3.analog-stereo"}
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 275, target.node, Spa:Id, -1
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 0, default.video.source, Spa:String:JSON, {"name":"xdg-desktop-portal-wlr"}
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 176, target.node, Spa:Id, -1
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 211, target.node, Spa:Id, -1
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: new metadata property: 250, target.node, Spa:Id, 241
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: easyeffects_sink node successfully retrieved with id 262 and timestamp 1657050363921310021
(easyeffects:14404): easyeffects-DEBUG: 15:46:03.922: pipe_manager: easyeffects_source node successfully retrieved with id 59 and timestamp 1657050363921323581
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.376: sie: output_level successfully connected to PipeWire graph
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.378: sie: spectrum successfully connected to PipeWire graph
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.391: sie: rnnoise successfully connected to PipeWire graph
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.396: sie: rnnoise latency: 0.011609977 s
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.396: sie: output_level: new PipeWire blocksize: 256
easyeffects-INFO: 15:46:04.404: application: disabling global bypass
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.409: application_ui: Icon Theme Adwaita detected
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.413: sie: rnnoise latency: 0.004126984 s
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.465: sie: rnnoise latency: 0.00036281178 s
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.506: sie: rnnoise latency: 0.0009070295 s
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.584: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.585: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.586: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.587: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.590: rnnoise_box: model directory already exists: /home/obamid/.config/easyeffects/rnnoise
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.658: new default output device: alsa_output.pci-0000_11_00.3.analog-stereo
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.658: new default input device: alsa_input.pci-0000_11_00.3.analog-stereo
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.659: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.659: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.659: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.659: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: application: device alsa_card.usb-Google_Inc_Headphone_adapter_88RG019BLXTK0PML-00 has changed its output route to: analog-output-headphones
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: application: output autoloading: the target node name does not match the output device name
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: application: device alsa_card.pci-0000_11_00.3 has changed its input route to: analog-input-rear-mic
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: application: device alsa_card.pci-0000_11_00.3 has changed its output route to: analog-output-lineout
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.660: app_info: cannot lookup application icon obs studio in /usr/local/share/pixmaps
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.661: sie: pipeline latency: 0.9070295 ms
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.661: sie: pipeline latency: 0.9070295 ms
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.661: sie: pipeline latency: 0.9070295 ms
(easyeffects:14404): easyeffects-DEBUG: 15:46:04.661: sie: pipeline latency: 0.9070295 ms
(easyeffects:14404): easyeffects-DEBUG: 15:46:07.675: pipe_manager: new metadata property: 250, target.node, Spa:Id, 262
(easyeffects:14404): easyeffects-DEBUG: 15:46:07.675: pipe_manager: new metadata property: 250, target.object, Spa:Id, 7203
(easyeffects:14404): easyeffects-DEBUG: 15:46:07.675: pipe_manager: Firefox port 117 is connected to easyeffects_sink port 142
(easyeffects:14404): easyeffects-DEBUG: 15:46:07.675: pipe_manager: Firefox port 243 is connected to easyeffects_sink port 264
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.318: pipe_manager: Stream/Input/Audio OBS was removed
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.319: pipe_manager: Stream/Input/Audio 211 OBS with timestamp 1657050373319025787 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.319: app_info: OBS disposed
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.319: app_info: OBS finalized
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.319: app_info: data struct destroyed
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.319: node holder: 211, OBS finalized
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.321: soe: output_level: new PipeWire blocksize: 512
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.321: pipe_manager: new metadata property: 211, , ,
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.328: pipe_manager: easyeffects_source port 242 is connected to OBS port 273
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.328: pipe_manager: easyeffects_source port 100 is connected to OBS port 120
(easyeffects:14404): easyeffects-DEBUG: 15:46:13.333: soe: output_level: new PipeWire blocksize: 64
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.615: pipe_manager: Stream/Input/Audio OBS was removed
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.615: pipe_manager: Stream/Input/Audio 211 OBS with timestamp 1657050375615720763 was added
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.616: app_info: OBS disposed
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.616: app_info: OBS finalized
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.616: app_info: data struct destroyed
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.616: node holder: 211, OBS finalized
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.617: soe: output_level: new PipeWire blocksize: 512
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.622: pipe_manager: new metadata property: 211, target.node, Spa:Id, -1
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.625: pipe_manager: alsa_input.pci-0000_11_00.3.analog-stereo port 91 is connected to OBS port 52
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.625: pipe_manager: alsa_input.pci-0000_11_00.3.analog-stereo port 92 is connected to OBS port 120
(easyeffects:14404): easyeffects-DEBUG: 15:46:15.629: soe: output_level: new PipeWire blocksize: 64
(easyeffects:14404): easyeffects-DEBUG: 15:46:18.408: sie: No app linked to our device wants to play. Unlinking our filters.
Additional Information
Compile flags
media-sound/easyeffects-6.2.5::gentoo was built with the following:
USE="doc mda-lv2 -calf -zamaudio" ABI_X86="(64)"
CFLAGS="-march=native -O3 -fgraphite-identity -floop-nest-optimize -fdevirtualize-at-ltrans -fipa-pta -fno-semantic-interposition -flto=16 -fuse-linker-plugin -pipe -Wl,-O1 -Wl,--as-needed"
CXXFLAGS="-march=native -O3 -fgraphite-identity -floop-nest-optimize -fdevirtualize-at-ltrans -fipa-pta -fno-semantic-interposition -flto=16 -fuse-linker-plugin -pipe -Wl,-O1 -Wl,--as-needed"
LDFLAGS="-Wl,-O1 -Wl,--as-needed -march=native -O3 -fgraphite-identity -floop-nest-optimize -fdevirtualize-at-ltrans -fipa-pta -fno-semantic-interposition -flto=16 -fuse-linker-plugin -pipe"
pipewire.conf
# Daemon config file for PipeWire version "0.3.51" #
#
# 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 = true # Gentoo should have good RLIMITs now
#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 = 192000
default.clock.allowed-rates = [ 48000, 96000, 192000 ]
# I actually modified the above line a while ago trying to guess if it was the 44100 hz clock causing the problems
# but I never got around to actually restarting pipewire to check, this isn't part of the config file but I thought I should mention this
# to explain the discrepancy between this config and other debug output
#default.clock.allowed-rates = [ 192000 ]
#default.clock.quantum = 1024
default.clock.min-quantum = 16
#default.clock.max-quantum = 2048
#default.clock.quantum-limit = 8192
default.video.width = 1920
default.video.height = 1080
default.video.rate.num = 120
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
}
}
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
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 ] ]
#}
#
# 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.
#
# 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
}
}
# 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
# }
#}
]
context.objects = [
#{ factory = <factory-name>
# [ args = { <key> = <value> ... } ]
# [ flags = [ [ nofail ] ]
#}
#
# Creates an object from a PipeWire factory with the given parameters.
# If nofail is given, errors are ignored (and no object is created).
#
#{ factory = spa-node-factory args = { factory.name = videotestsrc node.name = 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 } }
#{ 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
}
}
{ 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"
# }
#}
]
context.exec = [
#{ path = <program-name> [ args = "<arguments>" ] }
#
# Execute the given program with arguments.
#
# 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 = "" }
#
# 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" }
]
pipewire-pulse.conf
# PulseAudio config file for PipeWire version "0.3.51" #
#
# 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-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 = 88
#rt.time.soft = -1
#rt.time.hard = -1
}
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 modules can be loaded here. Setup in default.pa can be moved here
context.exec = [
{ path = "pactl" args = "load-module module-always-sink" }
#{ path = "pactl" args = "load-module module-switch-on-connect" }
#{ path = "/usr/bin/sh" args = "~/.config/pipewire/default.pw" }
]
stream.properties = {
#node.latency = 1024/48000
#node.autoconnect = true
#resample.quality = 4
#channelmix.normalize = false
#channelmix.mix-lfe = false
#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
}
pulse.properties = {
# the addresses this server listens on
server.address = [
"unix:native"
#"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
#}
]
#pulse.min.req = 256/48000 # 5ms
#pulse.default.req = 960/48000 # 20 milliseconds
#pulse.min.frag = 256/48000 # 5ms
#pulse.default.frag = 96000/48000 # 2 seconds
#pulse.default.tlength = 96000/48000 # 2 seconds
#pulse.min.quantum = 256/48000 # 5ms
#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. ~ 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
#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 = 1024/48000 # 21ms
pulse.min.quantum = 1024/48000 # 21ms
}
}
}
]
client.conf
# Client config file for PipeWire version "0.3.51" #
#
# 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 ] ]
#}
#
# 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 = 10
#channelmix.normalize = false
#channelmix.mix-lfe = false
#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
}
this can be replicated with ffmpeg as well by using ffmpeg -f pulse -i easyeffects_source, or simply by opening pavucontrol.
Nothing unusual happened on my system. But there is something in your logs that may explain the noises you are hearing
soe: output_level: new PipeWire blocksize: 64
The blocksize is related the latency currently set by PipeWire. 64
is a very low latency that not every system is capable of handling. You may be having underflows https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Troubleshooting#underrununderflow-and-broken-pipe-errors.
You can verify if the too low latency is the problem by temporarily setting a higher value. Take a look at the quantum range
section of https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PipeWire#quantum-ranges.
Yeah it seems the crackling issues with what I hear in the moment are definitely related to how low the buffer is, but it seems that the issue with recording is the inverse, the higher I set the quantum, when recording from easyeffects sink, the bigger the gaps in audio get for the recording, a constant oscillation between some sound and silence, no effect when recording from my headset no matter the quantum. Interestingly enough, removing the equalizer effect seems to get rid of the lag, which I figured wouldn't happen because helvum shows this as obs plugging into the sink before the filter, changing the mode between IIR and the others doesn't seem to have any effect on the lag either.
I have delved into a solution that works for my simple use case by making use of the base pipewire filter-chain config file which doesn't produce this issue, seeing as I have easyeffects no longer installed and cannot troubleshoot or give any more insight I'm going to close this