You are not logged in.

#1 2024-03-02 14:59:08

Strangiato
Member
Registered: 2020-01-10
Posts: 382

[solved] Audio device is not detected after switching users on Plasma

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:

https://0x0.st/H7oq.txt

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

#2 2024-03-02 15:12:33

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,811

Re: [solved] Audio device is not detected after switching users on Plasma

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

#3 2024-03-02 15:20:38

Strangiato
Member
Registered: 2020-01-10
Posts: 382

Re: [solved] Audio device is not detected after switching users on Plasma

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

#4 2024-03-02 15:31:20

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,811

Re: [solved] Audio device is not detected after switching users on Plasma

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

#5 2024-03-02 15:40:15

Strangiato
Member
Registered: 2020-01-10
Posts: 382

Re: [solved] Audio device is not detected after switching users on Plasma

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

#6 2024-03-04 14:40:30

Strangiato
Member
Registered: 2020-01-10
Posts: 382

Re: [solved] Audio device is not detected after switching users on Plasma

I have reported the issue described here on pipewire bug tracker:
https://gitlab.freedesktop.org/pipewire … ssues/3891

Offline

#7 2024-03-05 12:55:02

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,811

Re: [solved] Audio device is not detected after switching users on Plasma

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

#8 2024-03-05 13:19:40

Strangiato
Member
Registered: 2020-01-10
Posts: 382

Re: [solved] Audio device is not detected after switching users on Plasma

V1del wrote:

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

#9 2024-03-05 13:31:20

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,811

Re: [solved] Audio device is not detected after switching users on Plasma

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

#10 2024-03-24 12:57:08

Strangiato
Member
Registered: 2020-01-10
Posts: 382

Re: [solved] Audio device is not detected after switching users on Plasma

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

Board footer

Powered by FluxBB