Switching from PulseAudio to PipeWire as a result of the PulseEffects update

I had to switch from PulseAudio to PipeWire as a result of the PulseEffects update. I have been excitedly anticipating this and hoping it would resolve the audio configuration issues I’ve had to deal with every time I reboot. It wasn’t obvious how to make the switch, but I did it.

Before explaining what I did, here are the general audio problems I must handle system-wide:

  1. My speakers are uncomfortably and unnaturally bassy by default, so they sound bad without having their bass reduced by a system-wide equalizer. I’ve been using PulseEffects equalizer for this, since the simpler PulseAudio-equalizer software had a bug which caused YouTube videos to make horrible noises when seeking.
  2. My microphone is old and makes a constant waterfall hissing noise as of a few years ago. I’ve been using NoiseTorch for this, which is only compatible with PulseAudio.

With PulseAudio, these tools have had problems with their default configurations which I have had to work around after each reboot. Here are those problems:

  1. PulseEffects with PulseAudio had a bug causing it to route microphone audio through the speakers instead of to an input source, I had to disable all its input processing entirely, and use NoiseTorch exclusively.
  2. With NoiseTorch, on each boot, it didn’t apply despite a small script I wrote to run PulseEffects on boot, load NoiseTorch, then set default source to its microphone. Here’s that script:
#!/bin/bash
pulseeffects --gapplication-service
noisetorch -t 0 -i -s "alsa_input.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.mono-fallback"
pacmd "set-default-source nui_mic_remap"
###eof###
  1. The script was working for a couple months, but some time in November, it stopped working, and I haven’t been able to figure out why.
  2. Therefore, every time I reboot, I have had to run the NoiseTorch GUI, make it overwrite an “inconsistent state” with “Unload NoiseTorch” and “Load NoiseTorch”, and sometimes manually fix the audio routing if the microphone started playing through my speakers, then change both default output and input sources with the PulseAudio system tray, pasystray.

That all being said, here was my update process, and how I handled issues:

  1. I installed everything I could that was available from the stable update, including the official PulseEffects package which went from 4.x (the PulseAudio version) to 5.x (the PipeWire version).
  2. I installed manjaro-pipewire and gst-plugin-pipewire, which removed a bunch of PulseAudio packages. This succeeded. This was something I read from this forum thread.
  3. I removed NoiseTorch because I read in a github issue ticket that it does not work with PipeWire and I could use the “Noise Reduction” effect in PulseEffects instead to accomplish the same noise reduction using RNNoise.
  4. I rebooted.
  5. PulseEffects did not work at all to reduce my bass and I couldn’t get input from my microphone at all.
  6. I installed pulseeffects-git from the AUR, which removed the official PulseEffects package.
  7. I rebooted.
  8. I checked the audio input source in pasystray and set it to my microphone because it wasn’t set to that.
  9. I tested my bass output with PulseEffects via an audio player. It worked to reduce my bass via its equalizer and I could get input from my microphone, but noise reduction didn’t work.
  10. I ran pulseeffects -q and pulseeffects --gapplication-service & disown from the terminal.
  11. I ran the PulseEffects GUI from my whisker menu.
  12. Suddenly PulseEffects was working completely, with both the output equalizer and input noise reduction.
  13. I saved a PulseEffects preset with the output equalizer and input noise reduction.
  14. I rebooted.
  15. I checked the audio input source in pasystray and set it to my microphone because it wasn’t set to that.
  16. I tested audio input and output again. PulseEffects worked from then on after reboots, for both input and output, but I still have to set the default audio input source in pasystray after each reboot.

So, the only problem I have remaining is that the default audio input source is set to “Monitor of Built-in Audio Analog Stereo” instead of “Audio Adapter (Unitek Y-247A) Mono” each time I reboot. I don’t know how to set the default default input source with PipeWire, and I can’t find a GUI that lets me set that. Yes, double “default”, because I want the one that the default is set to when I start my PC. There seems to be no obvious way to set that.

Audio in Linux is insanely quirky and weird, but now I only have to do 1 small workaround when I reboot, which is the best I’ve had yet. If I could finally eliminate the need for that workaround, my Linux audio would reach the goodness I had on Windows 7 before switching to Manjaro last year.

If anyone can tell me how to set the default default audio input source with PipeWire, I would be grateful. Thank you for reading.

2 Likes

Audio in Linux is not usually ‘insanely quirky and weird’, but it can be too flat and clean; which will reveal all the shortcomings in audio hardware

I might have been able to help with the PulseAudio script if you had asked at the time
But I can’t help with Pipewire, and I do not know if there is anyone else on this forum that is up to speed on Pipewire yet

All I can suggest is you look in Pipewire Wiki

Or possibly GitHub - wwmm/pulseeffects

2 Likes

Thanks. The hardware issues with my speakers and microphone are purely hardware issues, which I have tested in Windows as well. I used EqualizerAPO there to handle them. The audio response is, to my ear, identical in Windows and Linux before any software modifications, which is great.

The bit about “insanely quirky and weird” I mentioned was regarding specifically the microphone being sent directly through the speakers or the microphone input or a particular application’s output (like zoom) no longer working seemingly spontaneously, and having to use NoiseTorch and pavucontrol to fix audio routing manually whenever it happened. Nothing like that ever happened in the other OSes I’ve tried. The great news, though, is that since switching to PipeWire 2 days ago through the process I described, I haven’t experienced any issues like that!

I still think it’s a bit quirky that the system is seemingly using several different audio systems, including ALSA, JACK, PulseAudio (via a PipeWire compatibility layer), PipeWire, and gstreamer. It’s very confusing, and I’m not sure exactly which of these named layers does what. In Windows, if there is a similar level of complication and weirdness, it’s hidden from me. While I’m all for revealing information, most other systems in my Linux machine seem less complicated to understand. That being said, since the issues I had with random routing changes are seemingly gone, I’m a lot less worried about it. The developers of those tools are the ones who have to deal with that, not the users, and the devs are doing a great job!

Thanks for your support. I hope my post can help someone else who is deciding whether to make the jump from PulseAudio to PipeWire. I’ll read bulk PipeWire wiki information to educate myself on its configuration soon, since I’m not sure exactly where to look to figure out how to set a default default input source.

have you checked with pavucontrol ?

I’ve switched to the -git packages for all pipewire-related packages and now my microphone is the default on startup. I guess this is a bug that was fixed with a later change.

Confusion was to be expected. and was predicted when Pipewire arrived in Manjaro
But no mention on this forum about ‘reinventing the wheel’ or the Relevant xkcd or any sense of déjà moo with the history of PulseAudio. The discussions during promotion of Pipewire happened outside Manjaro community so recent changes probably came as a surprise to most users

I agree your comments that it is quirky and confusing to have 2 sound servers and a compatibility layer and gstreamer.

I have been using JACK and ALSA with a bit of PulseAudio for a few years now and it has proven quality and reliability. If you prefer using Pipewire I would suggest you remove PulseAudio and the compatibility layer. That would simplify the audio stack, and should make it easier to understand and manage audio streams. But Pipewire still has a lack of knowledge and experienced users to help with troubleshooting and maintenance, so you may have to work a lot of this out for yourself

So, I’m not sure why this thread was split off. My post isn’t a support post, and in fact, it’s the post I wrote for the stable update saying what issue I had with the update and how I solved it. Can it please be un-split?

For separate discussion as not to clutter the main Announcement thread.

It sure looked like one to me, you asked for help.

It will stay where it is.

That part was a very small part of the overall post, and was definitely not the main focus. The announcement threads shouldn’t tell users to explain how they solved their problems and then remove the posts that do that. I spent a lot of effort making my solution available for others also updating and encountering the big hurdle of switching to PipeWire due to the PulseEffects dependency change. It feels a bit rude to me to remove the whole post from the thread after that effort just because there was one sentence about wanting to know how to fix the last tiny issue, after having shared my solution to the whole hurdle for anyone else in the community facing a similar hurdle.

That being said, thanks for acknowledging my concern and responding. You’re doing a great job. I realize there are misunderstandings and the thread being split doesn’t ruin my day.

It was mainly to not encourage others to turn the Announcement thread into a big PulseEffects discussion. It’s been a hot topic lately.

In the future, I suggest creating a new thread in the appropriate category then make a short post in the Announcement thread and link to it.

1 Like

That’s a good idea. If I have a lot to say about handling a large hurdle, I’ll do that. Thanks!

Moved, still searchable and available.

Why not split this thread off into a ‘Pointless Arguments about splitting threads’ thread?

There was a point and it got through to me.

2 Likes

pulseeffects-git does not seem to exist anymore in the AUR.
The original pulseeffects package from the official repository crashes here:

systemd-coredump[930]: [🡕] Process 871 (pulseeffects) of user 1000 dumped core.

                                                   Stack trace of thread 871:
                                                    #0  0x000055c7c44124d4 n/a (pulseeffects + 0x8d4d4)
                                                    #1  0x000055c7c447f335 n/a (pulseeffects + 0xfa335)
                                                    #2  0x000055c7c446cd38 n/a (pulseeffects + 0xe7d38)
                                                    #3  0x000055c7c4410676 n/a (pulseeffects + 0x8b676)
                                                    #4  0x00007f62fd5540fc _ZN3Gio17Application_Class16startup_callbackEP13_GApplication (libgiomm-2.4.so.1 >
                                                    #5  0x00007f62fe4cd030 g_signal_emit_valist (libgobject-2.0.so.0 + 0x30030)
                                                    #6  0x00007f62fe4cd1a0 g_signal_emit (libgobject-2.0.so.0 + 0x301a0)
                                                    #7  0x00007f62fdbebae6 g_application_register (libgio-2.0.so.0 + 0xcbae6)
                                                    #8  0x00007f62fdbec4ec n/a (libgio-2.0.so.0 + 0xcc4ec)
                                                    #9  0x00007f62fd553c0a _ZN3Gio11Application24local_command_line_vfuncERPPcRi (libgiomm-2.4.so.1 + 0xd7c0>
                                                    #10 0x00007f62fd553f01 _ZN3Gio17Application_Class33local_command_line_vfunc_callbackEP13_GApplicationPPP>
                                                    #11 0x00007f62fdbec84a g_application_run (libgio-2.0.so.0 + 0xcc84a)
                                                    #12 0x000055c7c4409b39 main (pulseeffects + 0x84b39)
                                                    #13 0x00007f62fcce8b25 __libc_start_main (libc.so.6 + 0x27b25)
                                                    #14 0x000055c7c440ae1e n/a (pulseeffects + 0x85e1e)
                                                    
                                                    Stack trace of thread 894:
                                                    #0  0x00007f62fcdb4b2f __poll (libc.so.6 + 0xf3b2f)
                                                    #1  0x00007f62fe624b29 n/a (libglib-2.0.so.0 + 0xa7b29)
                                                    #2  0x00007f62fe5ce871 g_main_context_iteration (libglib-2.0.so.0 + 0x51871)
                                                    #3  0x00007f62fe5ce8c2 n/a (libglib-2.0.so.0 + 0x518c2)
                                                    #4  0x00007f62fe5ff2c1 n/a (libglib-2.0.so.0 + 0x822c1)
                                                    #5  0x00007f62fce96259 start_thread (libpthread.so.0 + 0x9259)
                                                    #6  0x00007f62fcdbf5e3 __clone (libc.so.6 + 0xfe5e3)
                                                    
                                                    Stack trace of thread 900:
                                                    #0  0x00007f62fcdb4b2f __poll (libc.so.6 + 0xf3b2f)
                                                    #1  0x00007f62fe624b29 n/a (libglib-2.0.so.0 + 0xa7b29)
                                                    #2  0x00007f62fe5ce871 g_main_context_iteration (libglib-2.0.so.0 + 0x51871)
                                                    #3  0x00007f62f7b51ebe n/a (libdconfsettings.so + 0x5ebe)
                                                    #4  0x00007f62fe5ff2c1 n/a (libglib-2.0.so.0 + 0x822c1)
                                                    #5  0x00007f62fce96259 start_thread (libpthread.so.0 + 0x9259)
                                                    #6  0x00007f62fcdbf5e3 __clone (libc.so.6 + 0xfe5e3)
                                                    
                                                    Stack trace of thread 903:
                                                    #0  0x00007f62fcdb4b2f __poll (libc.so.6 + 0xf3b2f)
                                                    #1  0x00007f62fe6e5ae4 n/a (libpulse.so.0 + 0x33ae4)
                                                    #2  0x00007f62fe6cf4b9 pa_mainloop_poll (libpulse.so.0 + 0x1d4b9)
                                                    #3  0x00007f62fe6d9709 pa_mainloop_iterate (libpulse.so.0 + 0x27709)
                                                    #4  0x00007f62fe6d97c1 pa_mainloop_run (libpulse.so.0 + 0x277c1)
                                                    #5  0x00007f62fe6e9c9e n/a (libpulse.so.0 + 0x37c9e)
                                                    #6  0x00007f62fcc94403 n/a (libpulsecommon-15.0.so + 0x5c403)
                                                    #7  0x00007f62fce96259 start_thread (libpthread.so.0 + 0x9259)
                                                    #8  0x00007f62fcdbf5e3 __clone (libc.so.6 + 0xfe5e3)
                                                    
                                                    Stack trace of thread 895:
                                                    #0  0x00007f62fcdb4b2f __poll (libc.so.6 + 0xf3b2f)
                                                    #1  0x00007f62fe624b29 n/a (libglib-2.0.so.0 + 0xa7b29)
                                                    #2  0x00007f62fe5d0693 g_main_loop_run (libglib-2.0.so.0 + 0x53693)
                                                    #3  0x00007f62fdc218c8 n/a (libgio-2.0.so.0 + 0x1018c8)
                                                    #4  0x00007f62fe5ff2c1 n/a (libglib-2.0.so.0 + 0x822c1)
                                                    #5  0x00007f62fce96259 start_thread (libpthread.so.0 + 0x9259)
                                                    #6  0x00007f62fcdbf5e3 __clone (libc.so.6 + 0xfe5e3)

Additionally, pulseeffects is not able to find any of its plugins when started manually from the terminal:

pulseeffects --gapplication-service

(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.054: limiter plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.054: compressor plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.054: filter plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.054: equalizer plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.055: reverb plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.055: bass_enhancer plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.056: exciter plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.060: maximizer plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.060: multiband_compressor plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.060: loudness plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.061: gate plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.061: pitch plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.061: multiband_gate plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.061: deesser plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.061: stereo_tools plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.081: delay plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.081: rnnoise plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.092: limiter plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.092: compressor plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.093: filter plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.093: equalizer plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.093: reverb plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.093: gate plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.093: deesser plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.093: pitch plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.105: multiband_compressor plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.105: multiband_gate plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.105: stereo_tools plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.105: maximizer plugin was not found!
(pulseeffects:2172): pulseeffects-WARNING **: 10:19:13.106: rnnoise plugin was not found!

Doing some research, I found the reason:

So, I had to remove pulseeffects whatsoever and install easyeffects:

sudo pacman -R pulseeffects-legacy
sudo pacman -S easyeffects

Now, it looks like this is working. Only glitch: When starting playback of any audio, I get a loud click sound from the speakers, right before the playback starts.
For pulseaudio, the fix was disabling / commenting out the line

load-module module-suspend-on-idle

in /etc/pulse/default.pa.
Is there something similar for pipewire?

Maybe try experimenting with what the Arch wiki says here: PipeWire - ArchWiki (this is a direct link to “Noticeable audio delay when starting playback”)

Thank you very much for making me aware. Meanwhile, I was able to find and to make use of some of that information: Click sound before playing any audio - #2 by DAC324