You are not logged in.
Hello
I use fully updated Arch + KDE Plasma 6. This is not a KDE Plasma 6 issue, KDE Plasma 5 was also affected.
Steps to reproduce:
1. have two or more user accounts on your system
2. boot
3. log in with userA - the sound device is detected with this user
4. logout
5. log in with userB - the sound device is not detected anymore
If in the step 3 I use userB instead of userA, the sound device is detected in such step.
Here is the journal log gotten after the steps above:
Any idea on how to make my system always to detect the sound device, with any user account?
Thanks for reading.
Last edited by Strangiato (2024-03-05 13:20:48)
Offline
Looks like your user session is not cleared properly, I see some navidrome that might occupy the device away. From the faulty user what's your output of
sudo fuser -v /dev/snd/*
Also some failures to load the roc module, are you actively using that/do you have conflicting user specific configs?
Offline
The bug occurs even when navidrome is inactive. Yes, I use ROC module to stream audio over network. I have configured my pipewire system-wide, in /etc/pipewire/pipewire.conf file.
Your command produces no output.
Offline
Your pipewire dies here
mar 02 11:42:06 Arch-PC pipewire[1998]: 11:42:06.925 [2011] [err] roc_netio: udp receiver: <udprecv 0x76cd68000b88 bind=0.0.0.0:10001>: uv_udp_bind(): [EADDRINUSE] address already in use
mar 02 11:42:06 Arch-PC pipewire[1998]: 11:42:06.925 [2011] [err] roc_netio: network loop: can't add udp receiver port 0.0.0.0:10001: can't start udp receiver
mar 02 11:42:06 Arch-PC pipewire[1998]: 11:42:06.925 [1998] [err] roc_node: receiver node: can't bind audiosrc interface of slot 0: can't bind interface to local port
mar 02 11:42:06 Arch-PC pipewire[1998]: 11:42:06.925 [1998] [err] roc_node: receiver node: marking slot 0 as broken, it needs to be unlinked
mar 02 11:42:06 Arch-PC pipewire[1998]: 11:42:06.925 [1998] [err] roc_api: roc_receiver_bind(): operation failed
mar 02 11:42:06 Arch-PC pipewire[1998]: mod.roc-source: can't connect roc receiver to local source address
mar 02 11:42:06 Arch-PC rtkit-daemon[845]: Successfully made thread 1998 of process 1998 owned by '1003' high priority at nice level -11.
mar 02 11:42:06 Arch-PC rtkit-daemon[845]: Supervising 9 threads of 5 processes of 2 users.
mar 02 11:42:06 Arch-PC pipewire[1998]: pw.conf: 0x651e6468ecd0: could not load mandatory module "libpipewire-module-roc-source": Invalid argument
mar 02 11:42:06 Arch-PC rtkit-daemon[845]: Supervising 9 threads of 5 processes of 2 users.
mar 02 11:42:06 Arch-PC pipewire[1998]: default: failed to create context: Invalid argument
mar 02 11:42:06 Arch-PC rtkit-daemon[845]: Supervising 9 threads of 5 processes of 2 users.
mar 02 11:42:06 Arch-PC rtkit-daemon[845]: Supervising 9 threads of 5 processes of 2 users.
mar 02 11:42:06 Arch-PC systemd[1824]: pipewire.service: Main process exited, code=exited, status=234/n/a
because it can't reestablish the ROC connection as it is already running, so this is either not properly torn down on switch, or you're actually still running this from some other context.
Offline
I have configured ROC source module according to pipewire documentation.
https://docs.pipewire.org/page_module_roc_source.html
My /etc/pipewire/pipewire.conf file:
$ cat /etc/pipewire/pipewire.conf
# Daemon config file for PipeWire version "0.3.59" #
#
# 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 = 16
#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
#
#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
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 ] ]
#}
#
# 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
# }
#}
{ name = libpipewire-module-rtp-source
args = {
#sap.ip = 224.0.0.56
#sap.port = 9875
#local.ifname = eth0
sess.latency.msec = 100
stream.props = {
node.name = "rtp-source"
#media.class = "Audio/Source"
}
}
}
#{ name = libpipewire-module-pulse-tunnel
# args = {
# tunnel.mode = source
# Set the remote address to tunnel to
# pulse.server.address = "tcp:192.168.0.50"
#audio.rate=<sample rate>
#audio.channels=<number of channels>
#audio.position=<channel map>
#target.object=<remote target name>
# pulse.latency = 200
# stream.props = {
# extra sink properties
# node.name = "tunnel-source"
# media.class = Audio/Source
# }
# }
#}
{ name = libpipewire-module-roc-source
args = {
local.ip = 0.0.0.0
resampler.profile = medium
fec.code = disable
sess.latency.msec = 0
local.source.port = 10001
local.repair.port = 10002
local.control.port = 10003
source.name = "ROC Source"
source.props = {
node.name = "roc-source"
}
}
}
]
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" }
]
Offline
I have reported the issue described here on pipewire bug tracker:
https://gitlab.freedesktop.org/pipewire … ssues/3891
Offline
Something I'm just remembering, afaik there's a default session linger to not restart services if you intend to relog quickly: Try setting UserStopDelaySec= to 0 or at least a lower value than 10 seconds/wait ten seconds between login attempts, in your /etc/systemd/logind.conf: https://man.archlinux.org/man/logind.conf.5.en
Offline
Something I'm just remembering, afaik there's a default session linger to not restart services if you intend to relog quickly: Try setting UserStopDelaySec= to 0 or at least a lower value than 10 seconds/wait ten seconds between login attempts, in your /etc/systemd/logind.conf: https://man.archlinux.org/man/logind.conf.5.en
I'm unable to reproduce the bug after following your instructions. Thank you very much.
Offline
Right, please don't forget to mention/close the upstream bug report since this isn't really a pipewire bug or a bug in general in the first place
Offline
Unfortunately editing /etc/systemd/logind.conf file as previously mentioned did not solve the problem completely. Again my system did not detect the sound device after switching user accounts several times in a row. Currently the problem is harder to reproduce at least.
My report on pipewire bug tracker is still open.
Offline