But actually, since switching the AV sync is off using my Bluetooth earphones, at least in Firefox.
Curiously, I can fix it with latency adjustment in pavucontrol, but it only has an affect when the 'advanced' drop down is revealed in that tab of the menu. Close it, and it's off again. Open, and the value has persisted, and it works again. Haven't really dug into that because I've been hoping the (presumably) underlying Pipewire issue will be fixed.
Pulse is still broken a year later, pipewire is fixed.
So it goes.
That is not to say Pipewire could not also be a problem, but I haven't encountered such complaints about it.
I finally gave up on using an XPS15 with Ubuntu because I could not get over the fact it cannot do high quality bi-direction bluetooth audio.
Edit: Looks like it does offer some improvments over pulseaudio: https://www.redpill-linpro.com/techblog/2021/05/31/better-bl....
Throw hardware at the software problem, because software absolutely cannot be trusted not to foul this up. Not Windows, not linux, not pipewire, not pulse, none of it. Evidently not mac either, though I've personally never had trouble with bluetooth on mac. Bluetooth is 23 years old and its flagship application is still completely broken across huge swaths of the client/server compatibility matrix.
EDIT: Perhaps the parent means Helvum, which ldd says links to libgtk-4.so.1 => /usr/lib/libgtk-4.so.1. However, I can't figure out how to open a popover (https://python-gtk-3-tutorial.readthedocs.io/en/latest/popov...) in the app; all I can do is drag to create or break connections.
I haven't tested EasyEffects. With that in mind, PipeWire is buggy AF for the time being, and I've been working over the past week to clean things up (fixed a few bugs in plasmashell and pipewire so far, but I'm still learning and there's a great deal of bugs I haven't diagnosed and explained to the maintainers, it will probably take weeks longer for me to work through everything, and I'd very much prefer the program was written to handle race conditions and edge cases properly, instead of leaving users to discover bugs and trace the root cause through the labyrinthine IPC-heavy event-driven codebase after the fact).
An advantage of C is that it comes with a stable ABI, where Rust is unstable and C++ is a subject of conflict (though you can achieve a stable ABI by restricting your external API to C functions, and if you want cross-shared-object virtual calls like Pipewire, you might have to write the same pile of macros as PipeWire, which you were trying to save yourself from). The downsides are memory and type unsafety (surprisingly the only crash I've seen so far is a null pointer dereference, and I haven't hit any obvious memory or type errors), and a complete absence of "vocabulary" or templated types (they've created their own slotmap-like ID allocator but without a generation count resulting in ever-present "logical use-after-frees" in library and application code, and an intrusive linked list which they use even when hashmaps might provide somewhat faster iteration and asymptotically faster search).
The saving grace is that it can at any time be switched over to be built with a C++ compiler, and then start to be modernized incrementally.
It would be cool (not necessarily useful, probably not a good use of time) to rewrite it in Rust while keeping the dependency count in the single digits. It would be helpful to contributors to add architectural documentation.