Propagate stream errors and check for successful negotioation or error
in _prepare(). This will return an error from _prepare() if there is no
target node to link to (unless PIPEWIRE_AUTOCONNECT=false).
It would be preferable to also set PW_STREAM_FLAG_INACTIVE to not start
processing until _start() is called but then it would not be possible to
signal successful negotiation.
When we move a node from one driver to another, don't move the rate
and quantum because this tricks the new driver into thinking it's
already in the correct rate and it will skip doing a complete rate
switch.
This causes some nodes to fail to switch to the new rate, like in this
scenario:
1. mpv (node.always-process = true) appears and is added to the dummy
driver with rate/quantum of 48000/512
2. mpv is linked to an equalizer, linked to a sink, nodes are moved
to the new sink, target rate/quantum is copied to the new sink.
3. sink and followers are started in 48000/512, all is good. The sink
is now configured in 48000/512.
4. mpv is stopped, sinks and eq (input, not output) suspend
5. mpv appears again with 44100/512 and is added to dummy driver, which
is then configured in 44100/512
6. mpv is linked again to eq, nodes are moved, the sink rate/quantum
is copied and the sink thinks it's in 44100/512
7. sink and followes are started but no rate switch is happening because
rate/quantum was copied in step 6. Some followers are not suspended
and don't apply the rate change correctly (eq output).
By eliminating the rate/quantum copy when moving drivers, the sink will
correctly perform the rate change on all nodes.
Fixes#3159
Port added before activate should trigger a port_register callback when
the client is activated.
When calling jack_deactivate, the port_register callback should be
called.
See #2638
The duplex polling issue was due to spa_loop_add_source failing
when source and sink were both using the same fd. We now dup, so the
issue no longer exists.
Remove the now unnecessary workaround, and check the return values from
spa_add_source.
There are core errors that should not trigger a shutdown, like invalid
or destroyed proxy replies. Only do shutdown when we get EPIPE, which is
when the server is stopped.
See #3070
Let's avoid doing timestamp math as much as possible and let `GstBaseSrc`
do it for us instead.
This bring the source more in line with others in Gstreamer and
may help to avoid bugs and share concepts or code.
Add an option to put {} around the properties.
Add option to skip the keys and put [] around the properties.
Add option to recursively serialize properties.
When a config name was given and it fails to load, don't fall back to
client.conf but return the error. Only load client.conf when nothing
else was specified.
Don't emit node error for A2DP duplex sink channel, or when BAP server.
These can occur under normal conditions (remote side suspends
transport), and are not errors.
The Ubuntu image needs a rebuild, because there's already an image with that
same version which lacks meson. And likewise Fedora needs a rebuild, because
we still need python3-pip for two sub-images and this is (probably) the least
bad way to deal with that.
Signed-off-by: Niklāvs Koļesņikovs <89q1r14hd@relay.firefox.com>
According to gkiagia Fedora 37 is a better choice, because it's newer and its
compatibility with Coverity has been verified by WirePlumber's CI setup already.
Therefore upgrading the CI image to F37 should be safe.
Also fixed a typo in a previous commit's comment introduced by autocompletion.
Signed-off-by: Niklāvs Koļesņikovs <89q1r14hd@relay.firefox.com>
Back when it was added, the latest stable version was used. So it makes sense
to keep using using the latest stable image, which is now 3.17.
Signed-off-by: Niklāvs Koļesņikovs <89q1r14hd@relay.firefox.com>
Intercept the stream volume/mute and set it as the remove volume/mute.
Listen for remote volume/mute changes and set this as the local stream
volume. Make sure the adapter is using 1.0 software volume but reports
the real channelVolume of the remote stream.
Add a new pw_stream_set_param() method to configure a param on the
adapter.
This can be used to override the volume param for the adapter, for
example.
When the node receives a set_param Props, it calls the follower
set_param implementation. If that one calls set_param again on the
adapter, discards the original set_param.
This makes it possible for the follower to intercept the Props param and
set a modified version on the converter. This can be used to intercept
volume changes.
Make the XOpenDiplay call failure print an info message instead of a
warning. We usually ignore this error in the config file. Add a
suggestion for how to fix this issue in the info log.
Fixes#2918
As soon as we find a failed match, break the loop so that we don't check
uselessly the other properties but that we proceeed to the next set of
properties to match.