Commit graph

10679 commits

Author SHA1 Message Date
Wim Taymans
be59d2b5d0 jack: don't emit callbacks from do_wait()
Some functions need to wait for the reply of the server before they can
complete but the JACK API does not allow us to emit notifications while
blocking a function.

Delay emiting notifications when we are in selected methods and send a
notify to an eventfd to call the queued notifications.

Fixes #3183
2023-05-02 14:41:46 +02:00
Wim Taymans
bcec0ad103 impl-node: implement pw_impl_node_trigger
The trigger operation decrements the activation count on a node and
signals the eventfd when 0.

Implement pw_stream_trigger_process() with this new function.
Make the 3 types of trigger operations on a stream more explicit.

trigger:       -> do node_trigger()
driver/driving -> start graph with ready callback
other:         -> emit request trigger event.
2023-05-02 14:32:21 +02:00
Wim Taymans
953876bd58 impl-node: always wake up nodes with the eventfd
Don't call into the node process directly but use the eventfd to wake up
the node.

This is slightly slower and causes some change in behaviour
because we now need to go back to the poll loop and then let the node be
scheduled.

It is however nicer to have a uniform way to wake up nodes and it
opens up some new possibilities such as scheduling nodes in their own
threads on the server.
2023-05-02 14:14:45 +02:00
Wim Taymans
6bbe64a64b node: small cleanups and debug improvements 2023-05-02 14:11:37 +02:00
Wim Taymans
dd36352a5c stream: move from dequeued to queued for capture stream flush
When flushing a capture stream we move all dequeued buffers to the
queued queue for recycling. The dequeued queue is filled again when
captured buffers become available. Otherwise we might never recycle
some dequeued buffers.
2023-05-02 13:41:00 +02:00
Wim Taymans
b1a80a8f46 impl-node: call process_node directly
Don't go through the signal_func when we need to complete the graph
or when we need to process the node, do directly to process_node.

The signal_func is really only for nodes activating peers.
2023-05-01 13:42:50 +02:00
Wim Taymans
adb7559359 impl-node: fix timing for client-nodes using trigger
For client-nodes that use trigger, set the signal and wakeup time when
they start the server node. Also set finish time before we resume the
peers on the server.

Client-nodes should really resume the peers directly without going
through the server but this is something to improve later.
2023-05-01 13:37:44 +02:00
Wim Taymans
c23c27b566 module-raop: fix warning on uninitialised res variable 2023-05-01 09:59:55 +02:00
Christian Glombek
0bb0b524c7 raop: Deduplicate sink creation
Currently, RAOP sinks referencing the same remote ip and port may be created multiple times:
One each for IPv4 and IPv6, times the number of network interfaces used for mDNS discovery.

A recent change added `(IPv4)`and `(IPv6)`identifiers to the sinks' pretty names, however that
is misleading, as often times the service advertised through an mDNSv6 record is actually an
IPv4 service (i.e. the IP reference contained in the IPv6 record may be an IPv4 address).

With this change, sink creation is skipped if a sink with the same advertised name already exists.
2023-05-01 07:48:19 +00:00
Pauli Virtanen
0e831c52d8 module-access: determine trusted application executable
Determine application executable file so that the result can be trusted,
and the file exists in the current namespace.

Don't use /proc/pid/cmdline, since that contains whatever was specified
by the exec() call.
2023-05-01 07:44:08 +00:00
Wim Taymans
64235419a6 impl-node: handle ready callback correctly
Only stop processing the ready callback if we are a driver and not currently
driving the graph.

Streams that use trigger will also emit the ready callback and are not
driving the graph (but also are not a driver) and should therefore be
allowed to continue to resume_node to schedule the peer nodes.

See #3184
2023-05-01 09:22:56 +02:00
Pauli Virtanen
a6481c48aa module-combine-stream: propagate latency
Propagate latency information from the target streams to the combine
stream.
2023-04-30 19:02:52 +00:00
Pauli Virtanen
04951ac15f bluez5: make set transport volume calls async
The transport set volume call may take a long time or never complete, so
make them async to not block main loop.

Also reduce log level to info for the failed volume setting, as this is
something the user can do nothing about.
2023-04-30 18:44:33 +03:00
Pauli Virtanen
9c788d0c7e bluez5: unref pending calls after cancel
Cancel doesn't decrease refcount, so needs unref too.
2023-04-30 18:38:30 +03:00
Wim Taymans
90c8cb42ff meson: fix filename 2023-04-30 10:39:06 +02:00
Wim Taymans
4a81c17b68 modules: add jackdbus-detect module
Loads jack-tunnel based on jackdbus state.
2023-04-30 10:34:19 +02:00
Wim Taymans
39f9fa9c05 jack-tunnel: let client cleanup continue in on_shutdown
We should close the client eventually so don't set the client to NULL.
2023-04-30 10:19:51 +02:00
Wim Taymans
663e6f1bf5 impl-node: set driving state correctly
If a node becomes a driver and it had itself as the driver, it also
becomes a driving node.
2023-04-30 10:16:29 +02:00
Wim Taymans
7c5b61295d JACK: update to newer headers
Fixes #3181
2023-04-28 17:32:04 +02:00
Wim Taymans
56c59630c9 Revert "jack-tunnel: run graph from JACK thread"
This reverts commit d89df144f0.

This is not better than using a semaphore and the regular data thread.
2023-04-28 17:17:04 +02:00
Wim Taymans
d89df144f0 jack-tunnel: run graph from JACK thread
Stop our own data-loop and enter/iterate/leave it from the jack thread.
This runs all our nodes in the JACK thread and removes 2 context
switches (jack to and from pw thread).

We can possibly do this nicer by only pushing our own streams onto a
new custom data-loop but that's for later.
2023-04-28 17:06:29 +02:00
Wim Taymans
2112216d28 context: hide data_loop_impl 2023-04-28 17:04:29 +02:00
Wim Taymans
216d788ce5 filter: implement set_active()
Make a node implementation and export it, just like we do for the
stream. This way we can use the node to implement set_active().

Tweak the draining logic like pw_stream.
2023-04-28 12:50:11 +02:00
Wim Taymans
d0ac5c2e1d stream: move pw_impl_node to private.h
The listener is there as well.
2023-04-28 12:39:06 +02:00
Wim Taymans
472a948974 loop: keep loop and system around
So that we don't have to go through the context all the time.
2023-04-28 11:12:02 +02:00
Wim Taymans
8f7acb717c audioconvert: clear format and buffers on start error.
When we get an error, clear the ready state again and also clear the
format a buffers that we might have negotiated before starting.
2023-04-28 10:47:30 +02:00
Wim Taymans
9e7921b37d module-jack: improve xrun reporting 2023-04-27 18:10:41 +02:00
Wim Taymans
381aa90b54 module-jack-tunnel: improve some docs 2023-04-27 17:22:05 +02:00
Wim Taymans
b262812643 audioconvert: always allow peaks resampler
When we're using the peaks resampler, allow resampling, even when it is
disabled in the config.

The peaks resampler is just for GUI and would not really change the
signal, so we can allow this.
2023-04-27 17:10:41 +02:00
Wim Taymans
ab0cee29dd doc: add jack-tunnel to docs 2023-04-27 17:03:10 +02:00
Wim Taymans
73f5f7ae65 jack-tunnel: add a new 0-latency JACK sink/source module
Add a new JACK sink/source pair that translates to a single JACK
client.

The JACK playback port appears as PipeWire source and is processed
directly, synchronously, through the complete pipewire graph into
the PipeWire sink that is then made available on the JACK capture
ports.

Because all this happens in the same JACK cycle with no delay, the
latency is 0. A jack_iodelay on the JACK server has exactly the same
latency as the jack_iodelay on the PipeWire side.

The PipeWire sink and source are forced into the same rate and
buffer_size as the JACK server and can't dynamically change.

This only supports Audio for now.
2023-04-27 16:27:54 +02:00
Wim Taymans
0844f72f50 private: improve ensure_loop debug message
The result can be 0 when the loop is not running or when the current
thread is not the thread loop. Make a better message than "Success" in
that case.
2023-04-27 15:18:26 +02:00
Wim Taymans
9eb1633b02 protocol-native: don't remove all fds in clear
When we consumed all the buffer data, don't clear all the fds but only
those that were already consumed in the message. It is possible that we
already have fds for the next message and we don't want to discard
those.

Fixes some intermittend memory map errors.
2023-04-27 11:03:53 +02:00
Wim Taymans
0ac465854b jack: improve error reporting 2023-04-27 09:52:35 +02:00
Wim Taymans
3cae535da0 impl-node: calculate stats at cycle start
Calculate the stats at the start of the new cycle. The results will be
about the previous cycle but this gives more accurate results because
we can also include awake and finish times of remote nodes.

Make sure not to change the status of the activation in the ready event
so that we don't overwrite the status of the last cycle yet.

This means we can always set the AWAKE and awake_time, the remote node
might update it when triggered but that's ok.

After processing we can update the FINISHED state for non-remote nodes,
the remote nodes will update it after they complete the process
function.
2023-04-27 09:34:07 +02:00
Wim Taymans
e7a9dcfacc impl-node: improve profile reporting
Handle the update of the activation status before calling resume_node()
because we can call this when starting a cycle or when completing
a node.

Only set the AWAKE status and time in process_node when not exported or
not driving. For an exported driving driver, the server will have
already updated the values before it triggered our last process and then
completed the graph. If we update again in the client, the server will
read wrong values.

Because there is not really a way yet to get the finish time of the remote
driver the awake and finish times are too early. We might be able to fix
this later by making the stats at the start of the cycle from the
previous values.

Keep 2 extra variables to record the driver start and previos driver
start values. This way we can measure the period. This used to be done
with a little hack, using the finish_time of the driver, which was set
previously in resume_node().

For exported driving nodes, the TRIGGERED time is set in the remote-node
before it writes the eventfd to trigger the node_ready event. For
non-exported nodes, we need to set this ourselves.

For non-driver nodes that trigger node_ready, mean that they did an
async resume of the node. This means the node is finished and we can set
the finish_time accordingly.
2023-04-26 16:46:13 +02:00
Wim Taymans
4df2982ba1 impl-node: refactor gettime 2023-04-26 16:43:01 +02:00
Wim Taymans
5e6dc48013 impl-node: initialize the driving state correctly
A new node is driving only when it is a driver.
2023-04-26 16:37:01 +02:00
Wim Taymans
5303fced50 client-node: pass the ready status in the activation state
Pass the ready status to the client-node using the state array.

Don't just SPA_STATUS_HAVE_DATA on the server side but use the value
from the client.

This avoids some potential extra work when a driver sink pulls in data
with the NEED_DATA ready callback but then the server performs the
actions (tee) as if it were SPA_STATUS_HAVE_DATA.
2023-04-26 15:56:29 +02:00
Wim Taymans
989f597860 client-node: update the driving node status
Look at the clock and position to see if we are selected as the driver
or not.
2023-04-26 15:47:41 +02:00
Pauli Virtanen
420f7cb48e bluez5: select BAP audio locations in SelectProperties
Do BAP audio location selection properly in SelectProperties, now that
BlueZ provides the supported locations there. Remove a previous
workaround.

The audio location in SelectProperties determines the audio channel
allocation, which determines the channel positions.
2023-04-25 21:44:38 +03:00
Wim Taymans
815501cc1f jack: improve jack-sink and jack-source
Add more properties to sink/source to make them always process and
have the right priorities. Make sure the sink has higher priority than
the source so that we can pull in samples through the graph.

Only trigger the graph cycle when driving the graph.

Make sure to return something from process to signal that the graph can
continue processing.
2023-04-25 20:17:11 +02:00
Wim Taymans
b9381a9da6 audioconvert: use a new boolean to check if ready
Use a new boolean to check if the follower is allowed to emit a ready
event. This can be done right after negotiating.

Set the started field to true after we finish setting the state of the
converter and follower. This fields is used to block calling into the
process function before we complete the setup.

This avoid a crash in always-process nodes when the node is scheduled
before the audioconverter completes setup.
2023-04-25 20:16:28 +02:00
Jonas Holmberg
ecbb1b0c4c pipewire-alsa: Propagate stream errors
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.
2023-04-25 17:04:54 +02:00
Wim Taymans
a544c5d4ad impl-node: don't move rate/quantum when moving drivers
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
2023-04-25 10:13:02 +02:00
Wim Taymans
78e54b1b2a jack: make spa_return macros log a warning
.. instead of using fprintf to stderr.
2023-04-24 13:23:40 +02:00
Wim Taymans
5a65d67f3a jack: we don't need a completed link in jack_port_connected
Return true from jack_port_connected() right after jack_connect(), there
is no reason to wait for the completed state of the link.

See #2638
2023-04-24 12:59:32 +02:00
Wim Taymans
b87f7251d8 jack: activate/deactivate should trigger port register
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
2023-04-24 12:55:56 +02:00
Wim Taymans
0f0d56e783 jack: avoid registering same port names twice
Don't register port names that are too long or that already exist.

See #2638
2023-04-24 12:53:56 +02:00
Daniel Houck
c20e7788c5 Add 3M WorkTunes Connect to bluez-hardware.conf 2023-04-24 07:20:05 +00:00