pipewire-jack incompatible with GStreamer
- PipeWire version: 0.3.50
- GStreamer version: 1.20.1
- Distribution and distribution version: Arch Linux
- Desktop Environment: GNOME
- Kernel version: 5.17.4-zen1-1-zen
Description of Problem:
A pipeline using a "jackaudiosink" element will not be able to play any sound, most of the time.
Steps to Reproduce:
- Run a pipeline like
gst-launch-1.0 uridecodebin uri="https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm" ! audioconvert ! audioresample ! jackaudiosink
The following error will be printed:
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Got context from element 'source': gst.soup.session=context, session=(GstSoupSession)NULL;
ERROR: from element /GstPipeline:pipeline0/GstJackAudioSink:jackaudiosink0: Resource not found.
Additional debug info:
../gstreamer/subprojects/gst-plugins-good/ext/jack/gstjackaudiosink.c(308): jack_shutdown_cb (): /GstPipeline:pipeline0/GstJackAudioSink:jackaudiosink0:
Jack server shutdown
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
Debugging
The issue is related to the gstreamer client not supporting a change in buffer-size or sample-rate and disconnecting form the server when this happens (see here).
Forcing a fixed value for this parameters with pw-metadata (or a config file) didn't help.
After some debugging I've concluded that the issue seems to be caused by a race-condition. From what I can understand pipewire-jack is "initializing" the buffer size in the client thread, likely after the client has been activated, while jack2 is explicit in having this operation "synchronized" with the client activation (code here)
Here's the "offending" backtrace for pipiewire (jack_shutdown_cb will disconnect the client if active):
#0 jack_shutdown_cb (arg=0x555555851a30) at ../gstreamer/subprojects/gst-plugins-good/ext/jack/gstjackaudioclient.c:206
#1 0x00007ffff6b82350 in jack_buffer_size_cb.lto_priv () at ../gstreamer/subprojects/gst-plugins-good/ext/jack/gstjackaudioclient.c:238
#2 0x00007ffff683941f in do_buffer_frames (loop=<optimized out>, async=<optimized out>, seq=<optimized out>, data=<optimized out>, size=<optimized out>, user_data=0x55555589f200)
at ../pipewire/pipewire-jack/src/pipewire-jack.c:1270
#3 0x00007ffff671b391 in flush_items (impl=0x5555558a2028) at ../pipewire/spa/plugins/support/loop.c:181
#4 0x00007ffff671a3ea in source_event_func (source=0x55555589ea50) at ../pipewire/spa/plugins/support/loop.c:576
#5 0x00007ffff671be3d in loop_iterate (object=<optimized out>, timeout=<optimized out>) at ../pipewire/spa/plugins/support/loop.c:409
#6 0x00007ffff67d9c8a in do_loop (user_data=0x55555589ee80) at ../pipewire/src/pipewire/thread-loop.c:262
#7 0x00007ffff7b1f5c2 in start_thread () at /usr/lib/libc.so.6
#8 0x00007ffff7ba4584 in clone () at /usr/lib/libc.so.6