You are not logged in.

#1 2022-05-12 03:54:26

mrlamud
Member
Registered: 2014-09-27
Posts: 104

[SOLVED] pipewire-pluse : mod.filter-chain: error...

I Just replace pipewire-media-session with wireplumber , everything works as expected but I found this warning (which I would like to get rid of).

Sender : pipewire-pulse
time : 
Message :Security mod.filter-chain: error id:3 seq:21 res:-2 (No such file or directory): no node available
Audi Session : 4
Priority : 3
 pipewire-pulse.service - PipeWire PulseAudio
     Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-05-12 09:41:47 +07; 50min ago
TriggeredBy: ● pipewire-pulse.socket
   Main PID: 1290 (pipewire-pulse)
      Tasks: 2 (limit: 16603)
     Memory: 35.6M
        CPU: 18.402s
     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire-pulse.service
             └─ 1290 /usr/bin/pipewire-pulse

May 12 09:41:47 archbox systemd[1043]: Started PipeWire PulseAudio.
May 12 09:41:47 archbox pipewire-pulse[1298]: 536870912
May 12 09:41:47 archbox pipewire-pulse[1304]: 536870914
May 12 09:41:47 archbox pipewire-pulse[1300]: 536870915
May 12 09:41:47 archbox pipewire-pulse[1290]: mod.filter-chain: error id:3 seq:21 res:-2 (No such file or directory): no node available
~

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-ladspa-sink sink_name=compressor1 sink_master=compressor2 plugin=sc4_1882 label=sc4 control=1,180,350,-26.67,1.4,7,10" }
    { path = "pactl"        args = "load-module module-ladspa-sink sink_name=compressor2 sink_master=normalized3 plugin=sc4_1882 label=sc4 control=0,2,650,-30,1.4,6,0" }
    { path = "pactl"        args = "load-module module-ladspa-sink sink_name=normalized3 sink_master=alsa_output.usb-E__Corp._DAC_Audio-01.iec958-stereo plugin=fast_lookahead_limiter_1913 label=fastLookaheadLimiter control=10,0,0.5057" }
    { path = "pactl"	    args = "set-default-sink compressor1" }
   #{ path = "pactl"        args = "load-module module-switch-on-connect" }
    #{ path = "/usr/bin/sh"  args = "~/.config/pipewire/default.pw" }
]

stream.properties = {
    #node.latency          = 1024/96000
    #node.autoconnect      = true
    resample.quality      = 10	  
    #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
}

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
    #ipulse.default.frag     = 96000/48000   # 2 seconds
    #pulse.default.tlength  = 96000/48000   # 2 seconds
    #pulse.min.quantum      = 256/48000     # 5ms
    pulse.default.format   = S24LE
    #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
            }
        }
    }
]

pactl info

Server String: /run/user/1000/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 296
Tile Size: 65472
User Name: lamud
Host Name: archbox
Server Name: PulseAudio (on PipeWire 0.3.51)
Server Version: 15.0.0
Default Sample Specification: s24le 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: compressor1
Default Source: alsa_output.usb-E__Corp._DAC_Audio-01.iec958-stereo.monitor

Last edited by mrlamud (2022-09-29 12:25:11)

Offline

#2 2022-09-29 12:24:45

mrlamud
Member
Registered: 2014-09-27
Posts: 104

Re: [SOLVED] pipewire-pluse : mod.filter-chain: error...

F.Y.I - Problems solved by using filter-chain format drop-in file.

I found information how to compose daisy-chain ladspa plugins to filter-chain format that works from :
https://forum.endeavouros.com/t/pipewir … sion/31661
by Echoa...Thank you very much.

For the example  this is  the filter-chain file dropped in ~/.config/pipewire/filter-chain.conf.d/

~/.config/pipwire/filter-chain.conf.d/whatever.conf

# Dynamic compress 
# ~/.config/pipewire/filter-chain.conf.d/

context.modules = [
   {   name = libpipewire-module-filter-chain
        args = {
	    node.description = "Dynamic compression Ladspa"
            media.name = "Dynamic compression Ladspa"
            filter.graph = {
                nodes = [
                    {
                        type = ladspa
                        name = comp2
                        plugin = /usr/lib/ladspa/sc4_1882.so
                        label = sc4
                        control = {"RMS/peak" = 0 "Attack time (ms)" = 2 "Release time (ms)" = 650 "Threshold level (dB)" = -30 "Ratio (1:n)" = 1.4 "Knee radius (dB)" = 6 "Makeup gain (dB)" = 10 }

                        }
                    {
                        type = ladspa
                        name = comp1
                        plugin = /usr/lib/ladspa/sc4_1882.so
                        label = sc4
                        control = { "RMS/peak" = 1 "Attack time (ms)" = 180 "Release time (ms)" = 350 "Threshold level (dB)" = -26.67 "Ratio (1:n)" = 1.4 "Knee radius (dB)" = 7 "Makeup gain (dB)" = 10 }

                        }

                    {
                        type = ladspa
                        name = norm3
                        plugin = /usr/lib/ladspa/fast_lookahead_limiter_1913.so
                        label = fastLookaheadLimiter
                        control = { "Input gain (dB)" = 8 "Limit (dB)" = 0 "Release time (s)" = 0.5057 } 

                        }
                 
                ]
                links = [
                { output = "comp2:Left output" input = "comp1:Left input" }
                { output = "comp2:Right output" input = "comp1:Right input" }
                { output = "comp1:Left output" input = "norm3:Input 1" }
                { output = "comp1:Right output" input = "norm3:Input 2" }
                	]
                inputs  = [ "comp2:Left input" "comp2:Right input" ]
                outputs = [ "norm3:Output 1" "norm3:Output 2" ]
                
	    }

            capture.props = {
                node.name 	= "effect_input.dynamic"
		audio.channels = 2
          	audio.position = [ FL FR ]            	
            	#node.passive	= true
            	media.class 	= Audio/Sink
            	}

            	playback.props = {
                node.name = "effect_output.dynamic"
             	node.passive   = true
             	audio.channels = 2
             	audio.position = [ FL FR ]
             	node.target    = "alsa_output.target"
            	}

            }
	}
]

The plugin's control , Output, Input can be obtained by running analyseplugin command for example: -

SC4_1882

$analyseplugin sc4_1882

Plugin Name: "SC4"
Plugin Label: "sc4"
Plugin Unique ID: 1882
Maker: "Steve Harris <steve@plugin.org.uk>"
Copyright: "GPL"
Must Run Real-Time: No
Has activate() Function: No
Has deactivate() Function: No
Has run_adding() Function: Yes
Environment: Normal or Hard Real-Time
Ports:	"RMS/peak" input, control, 0 to 1, default 0
	"Attack time (ms)" input, control, 1.5 to 400, default 101.125
	"Release time (ms)" input, control, 2 to 800, default 401
	"Threshold level (dB)" input, control, -30 to 0, default 0
	"Ratio (1:n)" input, control, 1 to 20, default 1
	"Knee radius (dB)" input, control, 1 to 10, default 3.25
	"Makeup gain (dB)" input, control, 0 to 24, default 0
	"Amplitude (dB)" output, control, -40 to 12
	"Gain reduction (dB)" output, control, -24 to 0
	"Left input" input, audio
	"Right input" input, audio
	"Left output" output, audio
	"Right output" output, audio

fast_lookahead_limiter_1913

$fast_lookahead_limiter_1913

Plugin Name: "Fast Lookahead limiter"
Plugin Label: "fastLookaheadLimiter"
Plugin Unique ID: 1913
Maker: "Steve Harris <steve@plugin.org.uk>"
Copyright: "GPL"
Must Run Real-Time: No
Has activate() Function: Yes
Has deactivate() Function: No
Has run_adding() Function: Yes
Environment: Normal or Hard Real-Time
Ports:	"Input gain (dB)" input, control, -20 to 20, default 0
	"Limit (dB)" input, control, -20 to 0, default 0
	"Release time (s)" input, control, 0.01 to 2, default 0.5075
	"Attenuation (dB)" output, control, 0 to 70
	"Input 1" input, audio
	"Input 2" input, audio
	"Output 1" output, audio
	"Output 2" output, audio
	"latency" output, control

You can test the filter-chain config file by running

$ pipewire -c filter-chain.conf

after execute the above command , it should be in wait-state , not begin new prompt line until you decide to terminate it by Ctrl+c. On the other hand if something wrong with the filter-chain file, after execute the command , new prompt line will appear instead of the wait-stae and without any error messages.

Your could review the by running command:

$ pipewire -c ~/.config/pipewire/filter-chain.conf.d/whatever.conf

The output:

[E][04111.333744] pw.core      | [          core.c:  382 core_new()] 0x5597bcf05c50: can't find protocol 'PipeWire:Protocol:Native': Operation not supported
[E][04111.333812] mod.filter-chain | [module-filter-ch: 2248 pipewire__module_init()] can't connect: Operation not supported
[E][04111.334026] pw.conf      | [          conf.c:  594 load_module()] 0x5597bcec3130: could not load mandatory module "libpipewire-module-filter-chain": Operation not supported
[E][04111.334097] default      | [      pipewire.c:  125 main()] failed to create context: Operation not supported

any errors beside the above example (which I have no clue about them...stupid me!) could be told what's wrong in your new created filter-chain config file .

After all experiment - if it works, you can put the command

    { path = "/usr/bin/pipewire" args = "-c filter-chain.conf" }   

under context.exec[.......
....]
section either in pipewire or pipewire-pulse config file

Thanks for reading , anyone should have any advices to improve my config file will be highly appreciate.

Offline

Board footer

Powered by FluxBB