Can someone explain to me what pipewire's goal is? to be a better pulseaudio? if so, in what way is it trying to be better? also, how's the codebase quality? from what i heard, pulse's codebase is a mess, so if it can improve in that sense, i guess that's a win (?)
why does it do video? is trying to do media capture like OBS or be a compositor like wayland? if so why bother? those solutions exist already... maybe it should just stick to audio, cuz that part of it feels like feature creep.
Pipewire is driven by the need to handle synchronized media from multiple sources delivered to multiple sinks in real time with minimal, constant latency. The reference problem is cars, which often have a dash cam, back-up cam, dash video display, instrument panel display, bluetooth phone connection, radio receiver, satellite receiver, audio amplifier, dash microphone, backseat video display with audio, seatbelt alarm, and more besides, that all have to be managed sensibly with minimal engagement.
Handling audio without video fails if they have to be kept in sync.
* (LAN-)devices, most a source/sink/control for various Audio/Video streams.
* Those devices (can) share/use any HW (Microphones/Speakers/V4L-devices) available
* programs producing/consuming sound/video, to be "exported" as individual sinks/sources
* Eventing support to dynamically change media routing
Your stated "reference problem" (Car AV) is (imho) not the most user-"relatable" scenario (after all, who has "hackable car"), a more common scenario I'd see:
* In several of the rooms of the dwelling there are
* Devices large/small with several connection types
* LAN (PCs, TVs, AV-HW, MediaPlayers, ...) with protocols including e.g.
* Well-known programs (VLC, KODI) with their "own" protocol
* UPNP/DLNA/AirPlay/Miracast/PulseAudio/RTSP/...
* SIP/WebRTC devices/clients (Doorbells, VoIP-Phones, VideoConf)
* Devices with Vendor-specific protocols. e.g LG WebOS
* USB connection to one of the above (WebCam, Android-devices, phones)
* Wifi-P2P (Some of LAN devices have this too, for e.g. screencasting)
* Bluetooth BTLE/Classic (devices can be stationary/mobile/transient)
I would like to enable these usecases:
* Send [emulated] [second] screen from PC to any Display surface
* View any desktop/UI/program/device on any other display surface
* Control all the above from PCs/Phones/Tablets, or Events (Doorbell -> Camera PiP @TV)
* Route any audio/video source to my speech-recognition/video-conf/VoIP Software
* Use Android device [connected to USB[ of another Device]] as 8+ devices: Camera F/R, Screen I/O, Audio I/O Headphone/Speaker/BT Microphone/App-Output
* Use "hook"-scripts for eventing/device control (TV might need some command to switch to HDMI3)
I realize most of the above can be probably be done using some GST/FFMPEG glue scripts/code and some systemd dependencies, but I'm haven't found quickly relatable examples of:
* "Run this command/config to add an ffpmeg commandline as virtual camera"
* "Use this config to represent your TV as another display output device"
* "Run this command On DevA to launch a GUI-binary on DevB, and make this "stream" available as VideoSource in Browser@DevA"
* "Use the Webcam on DevA, bluetooth headsets via DevB for input, TV1 as VideoOutput, AudioOut on AVR, runnings VideoConf on DevC"
* "Do this to implement access-control" (Bob can see Input "foo", but Alice can't)
Cars are a hard but representative problem, with intrinsic advantages:
- Multiple data flows
- Limited available attention
- Need for "just works"
- Need for trivial override
- Funding available
- Strong demand for solution
>Can someone explain to me what pipewire's goal is? to be a better pulseaudio?
Yes, and also the goal is to support video in addition to audio.
>if so, in what way is it trying to be better?
Well in addition to supporting video, it also supports jack clients without needing to run a separate server. There are a few other things like better security policies, but those are the major ones.
>also, how's the codebase quality? from what i heard, pulse's codebase is a mess, so if it can improve in that sense, i guess that's a win (?)
Pulseaudio's code is fine and pipewire is about the same, it's a relatively small core daemon with most of the major functionality split out into a large collection of loadable modules.
>why does it do video?
A few reasons, but the major one is because video on Linux has the same problem as audio: the low-level device API (V4L) can only be used by one program at a time. This leads to failures if you try to do something like access your webcam in two applications at the same time. Most applications should basically not be using ALSA or V4L directly to access devices for this reason. A sound server like pulseaudio is the typical way to mux/demux the audio devices to allow multiple applications to access it at once, and now pipewire extends that to video.
>is trying to do media capture like OBS or be a compositor like wayland?
Neither, it's used to route video sources between programs. Media players and cameras and Wayland compositors that want to do screencasting can send their video into pipewire; casting programs like OBS or any ffmpeg-based tools can receive any of these video streams from pipewire and do whatever they want with them, or could also output to pipewire so another program can consume their output. If applications support it then the idea is you'll be able to easily connect together any two applications that produce/consume video and it'll all just work.
>No, it isn't. Pulseaudio is based on a push model, which is completely broken.
These two statements are both very wrong. The push model is absolutely not broken, it's actually better for media players, networked sound and other non-pro-audio applications because it uses less power and can do more efficient buffering strategies. You're right that it's not good for pro-audio and other latency-sensitive applications, but pulseaudio was not designed to do that on purpose because jack already filled that niche. The pull model has to wake up every application every quantum on a strict deadline to do processing. In some situations pulseaudio should still be able to provide the smallest power usage compared to pipewire, even just continuing to use the pulseaudio API to do buffering on top of pipewire should be a benefit for applications that want it.
Even if it was broken (it's not), that would be an aspect of the design, not the code itself. The code itself is structured in mostly the same way as pipewire.
why does it do video? is trying to do media capture like OBS or be a compositor like wayland? if so why bother? those solutions exist already... maybe it should just stick to audio, cuz that part of it feels like feature creep.