Commit graph

15607 commits

Author SHA1 Message Date
Simon A. Eugster
8e5617c439 docs: Add routing examples 2026-06-26 10:00:15 +00:00
Simon A. Eugster
8a659f1aaa docs: Explain PipeWire role, add graphics 2026-06-26 10:00:15 +00:00
Simon A. Eugster
6a6feb45fe docs: Add user overview docs for PipeWire 2026-06-26 10:00:15 +00:00
Elliot Chen
9b2ff82aea pipewiresrc: unlock loop when failing to wait negotiated 2026-06-26 09:57:23 +00:00
Val Lorentz
acbcf5cece doc: Fix paths to config files 2026-06-26 09:52:08 +00:00
Wim Taymans
07955ff312 Doc: fix some formatting and syntax issues
In pipewire-props.7.md changed ALSA-specific audio.* entries from @PAR@ node-prop
to plain \par to eliminate duplicate section label anchors.
2026-06-26 11:15:38 +02:00
Wim Taymans
f1658434be docs: fix some signedness compilation warnings 2026-06-26 10:27:34 +02:00
Pauli Virtanen
393da55797 bluez5: backend-native: fix multiple profile registration
Handling pending RegisterProfile callbacks was wrong as it forgot that
there can be multiple profiles to be registered.

Fix the handling by allowing several concurrent register callbacks.
2026-06-25 18:21:46 +03:00
Pauli Virtanen
422765c91d test: bluezenv: check multiple backend-native profiles can be registered 2026-06-25 18:21:46 +03:00
Wim Taymans
7dc35030dc filter-graph: add normalize option for sofa
Add an option to enable the use of the sofa loudness function to
normalize the IR.

See #5322
2026-06-25 16:24:38 +02:00
Barnabás Pőcze
a5ade5f96e spa: {libcamera,v4l2}: device: remove params
No params are implemented, so remove them from the emitted `spa_device_info`.
For v4l2, `n_params` was already set to 0 in 938e2b1451
("v4l2: profiles params are not implement yet"), effectively removing them.

No implementation has materialized in the last 5 years, so remove them
altogether, and do the same in the libcamera plugin as well.
2026-06-25 12:05:04 +02:00
Wim Taymans
2a4222a538 jack: fix race in get_buffer_output()
When a single output port is linked to multiple input ports of the same
client and the client uses multiple threads to process the input ports,
get_buffer_output() is called from multiple threads concurrently and
causes a race.

Multiple threads will try to dequeue a buffer concurrently and set the
HAVE_DATA io status, which causes the port to run out of buffers quickly
and the io are to become corrupted.

Use CAS to make sure only one thread dequeues and sets the io status.
The other concurrent threads will spin until there is a buffer. The fast
path will be that the buffer is already dequeued and then it is simply
reused.

Fixes #5324
2026-06-25 11:21:01 +02:00
Wim Taymans
d97a9bf44b pulse-server: actually print properties of module
When inspecting the loaded modules, actually list the properties that
were used when loading the module instead of the informational generic
ones from the info.

Pulsaudio also does not list the Usage properties when listing modules.
2026-06-25 09:21:27 +02:00
Wim Taymans
9bcbd7b586 pulse: generate Usage from module_args definition
Add some more fields like the type, default value and possible enum
values for the module_args.

Use this to generate the Usage in describe-module and the docs.

This should give more consistent and correct Usage output in all
modules.
2026-06-24 18:59:19 +02:00
AMG
9f7eb63486 refactor: pr 2026-06-24 16:32:43 +00:00
AMG
b4b4e03816 pw-container: Add socket path parameter 2026-06-24 16:32:43 +00:00
Julian Bouzas
62e98466fa conf: fix matching of property values with colons
Use spa_json_begin_array() instead of the relaxed variant when parsing
property values in pw_conf_find_match().

This prevents plain string values containing ':' (such as object.path)
from being incorrectly tokenized while preserving support for actual
JSON array properties.
2026-06-24 10:52:49 -04:00
Wim Taymans
7dac6a71d5 conf: avoid using close_range when undefined
Only call close_range when CLOSE_RANGE_UNSHARE is defined.

Fixes compilation on alpine.
2026-06-23 18:36:52 +02:00
Barnabás Pőcze
559a30b0b4 spa: libcamera: source: reject buffers with incorrect number of planes
`SPA_PARAM_BUFFERS_blocks` is a specific value, the plugin host should
not use any other number of data planes, so reject other values.

For example, the `buffers[i]->n_datas > planes.size()` situation was
not handled correctly, and this removes the need for handling that.
2026-06-23 15:00:15 +00:00
Barnabás Pőcze
44176d4118 spa: libcamera: expose libcamera version
Expose the libcamera header and library versions in the device properties
similarly to `api.v4l2.cap.version` used by the v4l2 plugin.

The keys are not yet promoted into the public `keys.h` header file.
2026-06-23 15:00:15 +00:00
Barnabás Pőcze
6dc55d2cb4 spa: libcamera: move CameraManager acquisition
Now that there is a "libcamera.cpp", move `libcamera_manager_acquire()` into
that file since it is a common function used by all three factories.
2026-06-23 15:00:15 +00:00
Barnabás Pőcze
390a4ce432 spa: libcamera: compile fully as C++
There was one file "libcamera.c" that was a C source file, which
prevents the addition of C++ functions, includes, etc. to "libcamera.h".
So compile that file as C++ as well.
2026-06-23 15:00:15 +00:00
Barnabás Pőcze
d46361a1b9 spa: libcamera: remove some unnecessary includes
Also add the missing include guard.
2026-06-23 15:00:15 +00:00
Barnabás Pőcze
dbc97942f4 spa: libcamera: manager: simplify property emission
There are no conditional properties, so everything can be in the array
initializer, which always deduces the size correctly, so do that.
2026-06-23 15:00:15 +00:00
Julian Bouzas
187187e41f pipewire-pulse: Expose profile preference setting as a message
Makes it easier for libpulse-based clients to modify this setting if they want.
2026-06-23 08:58:12 -04:00
Carlos Rafael Giani
d8f5ed0c13 module-rtp-sink: Add ability to add / remove receivers through commands
This makes it possible to dynamically add / remove receivers, which is
necesary for sending to multiple receivers. Mixed multi- and unicast
receivers are possible. Example pw-cli calls (56 is the ID of the RTP
sink node):

pw-cli c 56 User '{ extra="{ \"command.id\" : \"add-receiver\" , \"destination.ip\" : \"10.42.0.1\", \"destination.port\" : 55001 }" }'
pw-cli c 56 User '{ extra="{ \"command.id\" : \"remove-receiver\", \"destination.ip\" : \"10.42.0.1\" }" }'
pw-cli c 56 User '{ extra="{ \"command.id\" : \"clear-receivers\" }" }'

Commands and their arguments:

* "add-receiver" : Adds a receiver to the sink's list. If the given
  IP address <-> port combination was already added, the command is
  logged, but otherwise ignored. Arguments:
  - "destination.ip" : IP address to send data to. Can be a uni- or
    multicast address, but must be a valid address.
  - "destination.port" : Port to send data to. Must be valid.
  - "local.ifname", "source.ip", "net.ttl", "net.dscp", "net.loop" :
    These are all optional, and work just like in the RTP sink
    module's properties.

* "remove-receiver" : Removes a receiver from the sink's list. The
  receiver is identified by the given IP address. A port can optionally
  be specified as well. If it isn't, then the first receiver with that IP
  address is removed. If no matching receiver is in the sink's list,
  this command does nothing. Arguments:
  - "destination.ip" : IP address to send data to. Can be a uni- or
    multicast address, but must be a valid address.
  - "destination.port" : Port to send data to. This is optional. But, if
    it is set, it must be a valid port number.

* "clear-receivers" : Removes all receivers from the sink's list. If the
  list is empty, this does nothing. This command has no arguments.

If the RTP sink module is created with the "destination.ip" and
"destination.port" properties set, it behaves as if "add-receiver" were
called right after the module was initialized. This means that if none
of these commands are used, the module behaves just as it did prior to
this patch. Note that the "remove-receivers" command can remove this
initial receiver as well.

If no receivers are added, the module continues to work normally.
Adding and removing receivers mid-operation is supported.

NOTE: "destination.ip") handling in stream_props_changed() is removed,
since it never really did anything other than change the param value.
2026-06-23 10:47:36 +00:00
Wim Taymans
f2ccfe12c2 pw-cli: return errno-style error codes from command handlers
So that callers have more information to report useful error
messages.
2026-06-23 11:25:27 +02:00
Wim Taymans
9c5ea39f4e tools: return error when there was an error
Fixes #4286
2026-06-23 11:13:50 +02:00
Wim Taymans
656add0ae8 test: update copyright
Claude gladly transfered copyright to me.
2026-06-23 09:33:23 +02:00
Wim Taymans
208348ff2a conf: use close_range() before execvp()
Avoids leaking fds to the new program.
2026-06-22 14:35:11 +02:00
Wim Taymans
7fafc5f969 filter-graph: small cleanups
Use some constants and rename some variables.
2026-06-22 13:38:02 +02:00
Wim Taymans
a389a553e3 filter-graph: use pffft aligned alloc in all cases
Always use the pffft aligned alloc function. The fftw alloc function
only aligns to 16 bytes and the AVX code uses stores that rely on an
alignment of 32 bytes. The pffft alloc alignes to 64 bytes.

Fixes #5320
2026-06-22 13:05:32 +02:00
Wim Taymans
10b08df3f5 filter-graph: avoid warnings for unknown keys
Don't warn for the keys that were parsed previously.
2026-06-22 13:04:17 +02:00
zuozhiwei
541d627482 module-rtp: release data_loop on rtp_stream_new error path
rtp_stream_new() acquires a data loop with pw_context_acquire_loop() but
the out: error path never calls pw_context_release_loop(), leaking the loop
reference on every failure after acquisition.

Mirror rtp_stream_destroy() and other modules that pair acquire with release.
2026-06-22 10:14:02 +00:00
刘佳和
51ea8aab2f Please replace the comma operator with the correct semicolon when setting aec.name and aec.latency. This will help avoid syntax errors and improve readability.
Signed-off-by: liujiahe <liujiahe@uniontech.com>
2026-06-22 17:40:01 +08:00
Wim Taymans
db569ab566 buffers: fix the params iteration logic
A 0 result from the iteration with a NULL filter means the end of the
iteration, if we get this for the first item, we assume there was no
item (same as unknown item)

A 0 result for the iteration with filter means nothing matches the
filter and so the filter should not be included in the result. A result
of -ENOENT means the param is unknown and the filter should be included
in the result.

Fixes #5313
2026-06-19 14:26:42 +02:00
Wim Taymans
31e48d56f9 pulse-server: use the client properties for the zeroramp.gap 2026-06-19 10:05:56 +02:00
Wim Taymans
8c9b0b19d8 audioconvert: use constants for the gap modes 2026-06-19 10:03:15 +02:00
Wim Taymans
b21cad1eab impl-node: trigger a graph recalc on active node with driver
When adding the freeze/thaw recalc graph calls, triggering the actual
recalc of the graph (when an active node with a driver was removed) was
removed.

The thaw only actually recalcs the graph when something set the
recalc_pending flag so we still need something to set this. Normally
this would be because of some of the ports or links that got destroyed
but if not, the original recalc trigger needs to remain as a fallback.
2026-06-19 08:59:15 +02:00
Wim Taymans
6dafdd1b7a context: add freeze/thaw recalc
Some operations like deactivating nodes deactivates all links to the
node and this causes a graph recalc for each link.

It's actually a bit more problematic with suspend, which first
deactivates the links and then suspends the ports. The suspension of the
ports cause a recalc, which for the not yet suspended ports makes the
link active again, causing issues then when the port is suspended later.

Make recalc a counter and only recalc when the counter is 0. If the
counter is not 0, set the pending recalc, which will trigger when the
counter goes to 0.

With this, we can add a freeze/thaw operation on the recalc and delay
recalculation until all ports and links are handled.

We can also group some other operations with a freeze/thaw pair, such as
the destruction of ports, which destroys all links. Also the destruction
of nodes can freeze the recalc until all ports are destroyed.
2026-06-18 17:59:13 +02:00
Wim Taymans
6ce3b75e9d gaps: special case the gaps check
When we only do ramp down we can simplify some things.
2026-06-18 12:09:16 +02:00
Wim Taymans
377bab0430 mixer-dsp: fade-in/out on xrun as well
When there is no input buffer because of an xrun or the io was removed,
ramp down the signal. Only remove the port from the mix list when the io
was removed, otherwise, ramp back up when there is a buffers on the
input again.

This avoids pops and click around xrun nodes.
2026-06-18 11:06:44 +02:00
Wim Taymans
b6fc57a299 mixer-dsp: only ramp down when io was removed
Only ramp down when the IO was removed. We don't want to ramp down
because there was no buffer because of an xrun, because after the
ramp down, the port is removed from the mix ports and stays silent.
2026-06-18 10:58:52 +02:00
Wim Taymans
13c5e3c756 pulse-server: add a pulse.zeroramp.gap property
Add a new pulse.zeroramp.gap property that will enable gap detection and
fade-in/fade-out on gaps on playback streams.

Make a rule to enable this on chrome, which does not do a cork/pause
when a stream is paused but sends out silence. With the gap detection
enabled, this allows the audioconvert to perform fades to avoid pops and
clocks from sudden DC changes at the gaps.

Fixes #4745
2026-06-17 17:17:54 +02:00
Wim Taymans
8971c488f3 audioconvert: add zeroramp and gap detection to audioconvert
Make a new zeroramp.duration and zeroramp.gap property on audioconver.
It detects N samples of silence before triggering a fade-in or fade-out
of the given zeroramp.duration.

The zeroramp.duration is by default 5ms and zeroramp.gap is set to 0.

When the zeroramp.gap is set to 0, the audioconver will not do any gap
detection but it will only do fade-out from the last sample when the IO
Buffer area is removed from a port.

This by default makes the audio adapter perform a fade-out when the last
input of the port mixer was removed and the mixer is no longer scheduled
and the IO Area removed from the audioconverter input port.
2026-06-17 17:11:42 +02:00
Wim Taymans
c2083336a4 impl-port: pass the zeroramp.duration to the mixer
Pass the zeroramp.duration property from the node to the port and then
to the mixer so that it can be configured.

Add the zeroramp.duration to the docs.
2026-06-17 17:08:50 +02:00
Wim Taymans
214b9f6daa mixer-dsp: add support for fade-in and fade-out
When the port IO_Buffers is set, do a fade-in of the next buffer data
into the final mixed output.

When the port IO Buffers in cleared, do a fade-out of that last sample.

Add a zeroramp.duration property that controls the length in seconds of
the fade-in/out curve. By default, set this to 5ms.

The fade-in and fade-outs avoid popping noise from sudden DC voltage
changes when ports a linked and unlinked.

It will also trigger when the upstream peer is paused, because that will
also remove the IO Buffers from the mixer ports.
2026-06-17 17:06:17 +02:00
Wim Taymans
9a19091ac7 buffers: tweak some limits
Allow max 64 metadatas on a buffer
2026-06-16 18:24:14 +02:00
Torkel Niklasson
1a638fba60 module-client-node: Remove unused MAX defines
Cleanup of previous commit based on merge request !2865
2026-06-16 17:55:22 +02:00
Torkel Niklasson
650a96b8aa module-client-node: allocate port mix buffers dynamically
Each port mix embedded its buffer table in struct mix as a fixed array
buffers[MAX_BUFFERS] (MAX_BUFFERS == 64), and every struct buffer in turn
embedded datas[MAX_DATAS] (MAX_DATAS == 256) and metas[MAX_METAS]. This
reserved ~674 KB per mix in create_mix() regardless of the actual buffer,
data and meta counts, multiplied by every port mix (one per link end).

Turn buffers, datas and metas into pointers and allocate the buffer table
together with the per-buffer data and meta pools in a single calloc in
do_port_use_buffers(), sized to the real number of buffers and their
n_datas/n_metas, and release it in clear_buffers(). create_mix() now starts
with an empty (NULL) table, so an idle mix costs only the struct header.
This mirrors the dynamic-allocation approach already used for the
audioconvert and audiomixer port buffers and removes the dominant heap and
mmap consumer in the client-node graph.

Co-authored-by: Copilot <copilot@github.com>
2026-06-16 16:11:06 +02:00