Pipewire doesn't actually recognize any Sound outputs (devices)

Pulse Audio Control show no devices what so ever. The services for both pipewire-pulse and pipewire are running under my user.

I can switch back to pulse audio and everything works fine…

# Enable pipewire and disable pulse
sudo dnf install --allowerasing pipewire-pulseaudio
systemctl --user start pipewire-pulse.service pipewire-pulse.socket
# pavucontrol shows no sound devices, and provides no sound output

# Disable pipewire and switch back
sudo dnf swap --allowerasing pipewire-pulseaudio pulseaudio
# Working again, pavucontrol shows devices as expected.

I assume this might be a bug. I thought I would ask here first. No logs of note in dmesg or journalctl.

Worth noting, the only guide I could find for fedora pipewire was this… Changes/DefaultPipeWire - Fedora Project Wiki

Is it possible I am missing a package or library?

2 Likes

I’ve had a problem with an interface and I’ve fixed it by adding myself to the audio group.
This is not recommended but you can manually modify etc/group and etc/group- to enable standard or privileged access to anything that falls in those “groups” (sorry for the redundancy of words).

2 Likes

Manually editing the /etc/group file is possible, but even better is to use the command designed for that purpose.

sudo usermod -a -G audio <username>

which adds that user to the audio group.

3 Likes

Good thinking but sadly this doesn’t change the issue.

Still no output devices seen…

I like your line of reasoning. I wonder if there is any other group I need to be part of to allow my user level pipewire services to see my hardware. In other words maybe this is an issue with user access to hardware? This is not an issue on arch, so it’s something specific to fedora and its implementation of pipewire.

EDIT: i tried adding the pipewire and pulse groups to my user as well. Still no change. Rebooted after all changes BTW.

Yes when F34 was released it came with a bug. The /etc/pipewire path is not used anymore for default settings.
So please check if you have a pipewire.conf in /etc/pipewire . If yes rename it or better delete if you not made any changes on your own.

The system uses /usr/share/pipewire as default. If you want to do a user config for you you have to take the file from there and copy it to /etc/pipewire .

After this try your first step again and check with:
(if you get an error it will display on the end of the status)

systemctl --user status pipewire-pulse.service
● pipewire-pulse.service - PipeWire PulseAudio
     Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.service; disabled; vendor preset: disabled)
     Active: active (running) since Tue 2021-10-05 22:26:47 EDT; 4min 2s ago
TriggeredBy: ● pipewire-pulse.socket
   Main PID: 1660 (pipewire-pulse)
      Tasks: 2 (limit: 2298)
     Memory: 2.9M
        CPU: 22ms
     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire-pulse.service
             └─1660 /usr/bin/pipewire-pulse

Oct 05 22:26:47 localhost-live systemd[1382]: Started PipeWire PulseAudio.
[liveuser@localhost-live ~]$ 

2 Likes

Also, install QJackCtl , PulseAudioManager, PulseAudio Volume Control to make your life easier.
If there’s anything, it must show up there.

1 Like
❯ systemctl --user status pipewire-pulse.service
● pipewire-pulse.service - PipeWire PulseAudio
     Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2021-10-06 10:54:33 CDT; 29min ago
TriggeredBy: ● pipewire-pulse.socket
   Main PID: 1141 (pipewire-pulse)
      Tasks: 2 (limit: 19093)
     Memory: 2.3M
        CPU: 7ms
     CGroup: /user.slice/user-1000.slice/user@1000.service/session.slice/pipewire-pulse.service
             └─1141 /usr/bin/pipewire-pulse

Oct 06 10:54:33 caliburn systemd[1096]: Started PipeWire PulseAudio.

Good to know but this also doesn’t appear to be the issue. I checked /etc/pipewire and it didn’t exist. I created it and copied the pipewire.conf from /etc/share/pipewire to /etc/pipewire. Still no change. So with no /etc/pipewire at all, and with an /etc/pipewire with the preferred pipewire.conf yield the same result.

Either way pipewire-pulse starts up fine and doesn’t throw any errors. Still no sound (output) devices are recognized by pipewire. Worth mentioning I can for example start up mpd and play some music. It will show up in Pulse Audio Control as a device providing audio input, it just doesn’t have any device to send that output to (i.e. my soundcard, GPU hdmi sound, or external usb DAC), and as a result no audio is heard. All the three mentioned sound outputs show up fine under pulse.

What you are saying makes sense tho, any chance pipewire needs further manual config through pipewire.conf file? I am reading up on it now but I am not seeing a setting or change needed that would make this work.

As an aside, we may want to post an edit to the pipewire wiki with your info. I am sure someone else has hit this when trying to use that doc.

1 Like

Nice, thanks. I have installed pavucontrol and that is what I am using to test right now. It works great under pulse and pipewire in Arch linux (latest). Thanks for the head up on QJackCTL. I have grabbed that as well. Sadly none of these show any output devices under pipewire.

1 Like

Fedora 35 comes with wireplumber, if you wana give a try , test with the live image.
Changes/WirePlumber - Fedora Project Wiki

2 Likes

I may give it a shot at some point. For now I will likely just carry on with Fedora 34 pulse, i don’t want to move to a less stable release. Worth mentioning I am not on Gnome. I am using i3wm via xinitrc/xorg. I have a minimal build, so it’s likely something like this is probably needed but Fedora doesn’t recognize it as dependency.

Another thing I should mention. I use startx to bring up my i3wm session and X windows in general. I had to remove the default “unset” of the DBUS_SESSION_BUS_ADDRESS. This was done in order to allow my desktop notifications to actually work (under dunst, it needs a DBUS_SESSION_BUS_ADDRESS).

Example of what I had to do.

sed -i 's/unset\ DBUS_SESSION_BUS_ADDRESS/#unset\ DBUS_SESSION_BUS_ADDRESS/g' /usr/bin/startx

Not sure if the fact a DBUS_SESSION_BUS_ADDRESS exists would cause pipewire to be not work? I don’t see why that is the case but this is the only build related oddity I have in my fedora deployment.

Can you also check the status of pipewire.service?

Also see if pipewire-media-session is running.

1 Like

Check groups again and see if you have the following too:

pulse-access:x:972:admin,standarduser
pulse-rt:x:971:admin,standarduser
pulse:x:171:admin,standarduser
pipewire:x:987:admin,standarduser
audio:x:63:admin,standarduser
video:x:39:admin,standarduser

Change admin and standarduser(if you have any) with your accounts.

Also, I know this sounds stupid by try disabling secure boot in the bios. I had a problem with an external graphic card not being recognized with secure boot AFTER installing the system with secure boot enabled without the card attached.

With this, I have the following in PulseAudio Manager:


Everything works on my end on Fedora 34.

1 Like

Good information here thanks! I was missing pipewire-rt and video from my user. Sadly however there is no change once those were added (and rebooted). I can see in dmesg that my audio hardware is recognized by the OS and loaded so I don’t think it’s secure boot (looking through my bios it appears my board may be so old I don’t have secure boot). It’s almost as if pipewire is missing some configuration. The program itself seems to run fine.

1 Like

pipewire-media-session doesn’t exist. Maybe this is part of the problem.

I assumed the lack of it is part of the Fedora implementation, possibly rolling it into pipewire-pulse. I also was unable to find any media-session like package in the repo, nor any mention of it in the fedora pipewire implementation doc. All this lead me to believe it was not in use or it’s functionality was wrapped into one of the other two packages. Can people with a working pipewire install show me the results of ps -ef | grep pipwire on their system?

If this does end up being the problem, the question would then be where can I install pipewire-media-session from?

❯ sudo systemctl status | grep pipewire
           │   │ │ ├─pipewire-pulse.service
           │   │ │ │ └─1284 /usr/bin/pipewire-pulse
           │   │ │ └─pipewire.service
           │   │ │   └─1283 /usr/bin/pipewire
           │     ├─1689 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox pipewire
❯ ps -ef | grep pipewire
me         1283    1274  0 10:43 ?        00:00:00 /usr/bin/pipewire
me         1284    1274  0 10:43 ?        00:00:00 /usr/bin/pipewire-pulse

I hope this is the issue because it would likely be an easy fix once we identify the package that pipewire-media-session is apart of. However that would also mean pipewire-pulse is missing a dependency lol.

Yep this was the issue!

I just manually started /usr/bin/pipewire-media-session from the command line. And it’s working!

So it appears for a default install pipewire-media-session is neither run with any of the other services nor does it have a service of it own. I will go about creating a custom systemctl service for pipewire-media-session. This sounds like a bug. Is this supposed to have it’s own service?
Can someone run a systemctl status --user pipewire-media-session?

After building a custom service for pipewire-media-session I could start it. i am still curious if this how it is supposed to be run. Does everyone else just have this service?

I had to create this service and enable/start…

❯ cat /usr/lib/systemd/user/pipewire-media-session.service
[Unit]
Description=PipeWire Media Session Service

Requires=pipewire-pulse.socket
ConditionUser=!root
Wants=pipewire.service
After=pipewire.service
Conflicts=pulseaudio.service

[Service]
LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
RestrictNamespaces=yes
SystemCallArchitectures=native
SystemCallFilter=@system-service
Type=simple
ExecStart=/usr/bin/pipewire-media-session
Restart=on-failure
Slice=session.slice

[Install]
WantedBy=default.target

In short it does look like this is installed as a apart of the pipewire pacakge. There is just no instruction in it to run it as a service…

dnf provides pipewire-media-session

pipewire-0.3.25-1.fc34.i686 : Media Sharing Server
Repo        : fedora
Matched from:
Filename    : /usr/bin/pipewire-media-session

Wild, the service currently even asks for it but no errors are thrown…

❯ cat /usr/lib/systemd/user/pipewire-pulse.service
[Unit]
Description=PipeWire PulseAudio

# We require pipewire-pulse.socket to be active before starting the daemon, because
# while it is possible to use the service without the socket, it is not clear
# why it would be desirable.
#
# A user installing pipewire and doing `systemctl --user start pipewire-pulse`
# will not get the socket started, which might be confusing and problematic if
# the server is to be restarted later on, as the client autospawn feature
# might kick in. Also, a start of the socket unit will fail, adding to the
# confusion.
#
# After=pipewire-pulse.socket is not needed, as it is already implicit in the
# socket-service relationship, see systemd.socket(5).
Requires=pipewire-pulse.socket
ConditionUser=!root
Wants=pipewire.service pipewire-session-manager.service
After=pipewire.service pipewire-session-manager.service
Conflicts=pulseaudio.service

[Service]
LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
RestrictNamespaces=yes
SystemCallArchitectures=native
SystemCallFilter=@system-service
Type=simple
ExecStart=/usr/bin/pipewire-pulse
Restart=on-failure
Slice=session.slice

[Install]
Also=pipewire-pulse.socket
WantedBy=default.target
❯ cat /usr/lib/systemd/user/pipewire.service
[Unit]
Description=PipeWire Multimedia Service

# We require pipewire.socket to be active before starting the daemon, because
# while it is possible to use the service without the socket, it is not clear
# why it would be desirable.
#
# A user installing pipewire and doing `systemctl --user start pipewire`
# will not get the socket started, which might be confusing and problematic if
# the server is to be restarted later on, as the client autospawn feature
# might kick in. Also, a start of the socket unit will fail, adding to the
# confusion.
#
# After=pipewire.socket is not needed, as it is already implicit in the
# socket-service relationship, see systemd.socket(5).
Requires=pipewire.socket

[Service]
LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
RestrictNamespaces=yes
SystemCallArchitectures=native
SystemCallFilter=@system-service
Type=simple
ExecStart=/usr/bin/pipewire
Restart=on-failure
Slice=session.slice

[Install]
Also=pipewire.socket
WantedBy=default.target

You forgot the parameter --user.
To start and check the status.

Apologies, edited. Out of curiosity did you have this service?

With F34 yes. I’m on F35 now.

F35 uses wireplumber instaed.

btw. in the wiki document you posted on the beginning, in the section Documentation, see the video:

1 Like

Interesting, so maybe they jumped the gun on some of this in the latest 34 install? Expecting wireplumber to be used instead of the media session service. My install is fresh and only a week or two old.

Very cool, wireplumber sounds like a neat idea. That said, still doesn’t explain why pipewire didn’t ship with a .service for the media session on fedora 34. I opened a bug report here. Bug Access Denied

Guess we will see if this is intentional.