Testing¶
Automated unit tests¶
WirePlumber has automated tests that you can easily run with:
$ meson test -C build
This will automatically compile all test dependencies, so you can be sure that this always tests your latest changes.
If you wish to run a specific test instead of all of them, you can run:
$ meson test -C build test-name
When debugging a single test, you can additionally enable verbose test output
by appending -v
and you can also run the test in gdb by appending --gdb
.
For more information on how to use meson test
, please refer to
meson’s manual
Important
When submitting changes for review, always ensure that all tests pass
Please note that many WirePlumber tests require specific SPA test plugins to be available in your PipeWire installation. More specifically, PipeWire needs to be configured with the following options enabled:
-Dvideotestsrc=true -Daudiotestsrc=true -Dtest=true
If these SPA plugins are not found in the system, some tests will fail. This is expected.
WirePlumber examples¶
WirePlumber ships examples in test/examples
.
Execute them from the top-level directory with wp-uninstalled.sh
:
$ ./wp-uninstalled.sh ./build/tests/examples/audiotestsrc-play
Assuming there is no other process actively using hw:0,0
from alsa,
the above example should play a test tone on hw:0,0
without errors.
Native API clients¶
pw-cat¶
Using the default endpoint:
$ wpctl status # verify the default endpoints
$ pw-record test.wav
$ pw-play test.wav
Using a non-default endpoint:
$ pw-record --list-targets # find the node id
$ pw-record --target <node_id> test.wav
$ pw-play --list-targets # find the node id
$ pw-play --target <node_id> test.wav
or
$ wpctl status # find the capture & playback endpoint ids
$ pw-record --target <endpoint_id> test.wav
$ pw-play --target <endpoint_id> test.wav
Note
node ids and endpoint ids can be used interchangeably when specifying targets in all use cases
video-play¶
Using the default endpoint:
$ cd path/to/pipewire-source-dir
$ ./build/src/examples/video-play
Using a non-default endpoint:
$ wpctl status # find the endpoint id from the list
$ cd path/to/pipewire-source-dir
$ ./build/src/examples/video-play <endpoint_id>
Tip
enable videotestsrc in wireplumber’s configuration to have more video sources available
PulseAudio compat API clients¶
pacat¶
Using the default endpoint:
$ wpctl status # verify the default endpoints
$ parecord test.wav
$ paplay test.wav
pavucontrol¶
Use the command:
$ pavucontrol
Volume level meters should work
Changing the volume should work
ALSA compat API clients¶
aplay / arecord¶
Note
unless you have installed PipeWire in the default system prefix
(/usr
), the ALSA compat API will not work, unless you copy
libasound_module_pcm_pipewire.so
in the alsa plugins directory
(usually /usr/<libdir>/alsa-lib/
) and that you add the contents of
pipewire-alsa/conf/50-pipewire.conf
in your ~/.asoundrc
(or anywhere else, system-wide, where libasound can read it)
Using the default endpoint:
$ wpctl status # verify the default endpoints
$ arecord -D pipewire -f S16_LE -r 48000 test.wav
$ aplay -D pipewire test.wav
Using a non-default endpoint:
$ wpctl status # find the capture & playback endpoint ids
$ PIPEWIRE_NODE=<endpoint_id> arecord -D pipewire -f S16_LE -r 48000 test.wav
$ PIPEWIRE_NODE=<endpoint_id> aplay -D pipewire test.wav
or
$ wpctl status # find the capture & playback endpoint ids
$ arecord -D pipewire:NODE=<endpoint_id> -f S16_LE -r 48000 test.wav
$ aplay -D pipewire:NODE=<endpoint_id> test.wav
JACK compat API clients¶
qjackctl¶
$ pw-jack qjackctl
This should correctly connect.
The “Graph” window should show the PipeWire graph.
jack_simple_client¶
$ wpctl status # find the target endpoint id
$ wpctl inspect <endpoint_id> # find the node.id
$ PIPEWIRE_NODE=<node_id> pw-jack jack_simple_client
Note
The JACK layer is not controlled by the session manager, it creates its own links; which is why it is required to specify a node id (endpoint id will not work)
Device Reservation¶
with PulseAudio¶
With PulseAudio running, start a pulseaudio client.
$ gst-launch-1.0 audiotestsrc ! pulsesink
Start PipeWire & WirePlumber
The device in use by PA will not be available in PW
Stop the PA client
A few seconds later, WirePlumber should assume control of the device
wpctl status
should be able to confirm that the device is availableStart a PA client again
It should not be able to play; it will just freeze
Stop WirePlumber
The PA client should immediately start playing
with JACK¶
Start PipeWire & WirePlumber
All devices should be available
Start
jackdbus
through
qjackctl
:Enable Setup -> Misc -> Enable JACK D-Bus interface
Click Start on the main window
or manually:
Run
jackdbus auto
Run
qdbus org.jackaudio.service /org/jackaudio/Controller org.jackaudio.JackControl.StartServer
Wait a few seconds and run
wpctl status
to inspectThe devices taken by JACK should no longer be available
There should be two JACK System endpoints (sink & source)
Run an audio client on PipeWire (ex
pw-play test.wav
)Notice how audio now goes through JACK
Stop JACK
through
qjackctl
, click Stopor manually:
qdbus org.jackaudio.service /org/jackaudio/Controller org.jackaudio.JackControl.StopServer
Wait a few seconds and run
wpctl status
to inspectThe devices that were release by JACK should again be available
There should be no JACK System endpoint
Note
You may also start WirePlumber after starting JACK. It should immediately go to the state described in step 3