Commit graph

2423 commits

Author SHA1 Message Date
Wim Taymans
e1fc3de595 modules: use pw_stream_set_rate() some more 2024-11-22 09:55:36 +01:00
Wim Taymans
433afeaa1e stream: add function to set adaptive resampler rate
Make a function to set the adaptive resampler.
2024-11-22 09:29:53 +01:00
Wim Taymans
a997627906 impl-node: save all previous timestamps on start
When the driver starts, save all previous node timestamps, not just the
previous signal time.

For async nodes, uses the previous timestamps in the profiler messages
so that we get stats with 1 cycle of delay instead of bogus values
because the node is still processing.

Fixes pw-top for async nodes.
2024-11-15 18:06:12 +01:00
Wim Taymans
bb2d848bf6 impl-node: don't remove from graph when creating
When we were in the CREATING state, don't remove ourselves from the
graph because we were not added yet.
2024-11-14 15:56:57 +01:00
Wim Taymans
7abf11210d stream: expose the lazy flag with pw_stream_is_lazy()
Together with the is_driver() status, this can be used to check if the
stream is using lazy scheduling or not.
2024-11-06 12:57:48 +01:00
Wim Taymans
f16f074725 context: set lazy scheduling flags in clock
Collect the request scheduling flags and when there is a lazy driver,
set the lazy scheduling flag in its clock. This means that the driver
can expect RequestProcess commands to start the scheduling.

Pass the lazy scheduling clock flag to the node.

Make sure lazy scheduling driver have a higher priority than their
request drivers.
2024-11-06 12:57:48 +01:00
Wim Taymans
9c49bffc22 keys: add lazy scheduling flags and docs 2024-11-06 12:57:48 +01:00
Wim Taymans
bc57b9ec86 impl-node: return a result from pw_impl_node_trigger()
Return 0 when the peer was not triggered, 1 when it was triggered and
an error when there was an error.
2024-11-05 15:53:12 +01:00
Wim Taymans
9ed57c1dba impl-node: improve property parsing
Use pw_properties_get_uint32() and friends to parse properties and have
a fallback when the property is not there.
2024-11-04 16:52:09 +01:00
Pauli Virtanen
7f885a2e94 proxy: invalidate proxy id when removed from map
Client-side bugs calling methods on destroyed proxies like

    pw_proxy_ref(p);
    pw_proxy_destroy(p);
    ...
    wait for server to ack the remove
    ...
    pw_core_destroy(p->core, p); /* p already removed & destroyed */

should not send messages with the stale proxy id to server.

Set id to SPA_ID_INVALID when removing a proxy from the id map, so that
such client bugs only result to ENOENT.
2024-10-24 13:46:09 +00:00
Wim Taymans
da86026b7a latency: handle negative latency correctly
In our current world, it is possible to have a negative delay. This
means that the stream should be delayed to sync with other streams.

The pulse-server sets negative delay and the Latency message can hold
those negative values so make sure we handle them in the helper
functions as well.

Do the delay calculations in pw_stream and JACK with signed values to
correctly handle negative values. Clamp JACK latency range to 0 because
negative latency is not supported in JACK.

We should also probably make sure we never end up with negative
latency, mostly in ALSA when we set a Latency offset, but that is
another detail.
2024-10-23 10:47:58 +02:00
Wim Taymans
9243ed0cbd pulse-server: add condition support in pulse.cmd
So that a config override can disable the execution of the command by
setting the property to false in the pulse.properties config override.

Expose some conf.c method for this purpose.
2024-10-23 09:08:50 +02:00
Wim Taymans
82b9f76b0d impl-node: lower the xrun debug level
Make the xrun reporting as info. This can generate a lot of logging if
the error is persistent and the errors are also reported in pw-top etc.

Fixes #4361
2024-10-22 09:59:15 +02:00
Wim Taymans
ffbcf853e6 stream: improve the flush handling and docs
Flush with drain calls the drained callback for each cycle until paused
or resumed. Setting the stream to active again, clears the drained state
and makes things resume.

Flush without drain does not set the state to PAUSED but simply clears
the queued data. This is mostly useful when pausing or stopping.

At no point should the flush operation result in a PAUSED state change.
2024-10-07 17:15:18 +02:00
Wim Taymans
3efa3483db impl-node: pass the RequestProcess command around as is
Convert the RequestProcess event to a command and send this to the
driver node. This ensures that any future properties on the Event will be
passed to the Command as well, such as timestamps etc.

Save the complete RequestProcess command when we need to send it later
when the node is RUNNING so that we preserver the properties.
2024-10-02 16:18:44 +02:00
Wim Taymans
242e530aeb stream: add pw_stream_emit_event()
Make a function to emit an event from a stream. Use this function
internally to emit the RequestProcess.

Make the RequestProcess event construction a little more efficient.
2024-10-02 16:17:17 +02:00
Wim Taymans
c05f03c7da keys: improve comments and indentation 2024-10-02 12:46:39 +02:00
Wim Taymans
9b80855821 impl-node: make exported nodes complete state change sync
Don't queue an async state change completion for exported nodes. The
server sends a ping to check for completion and we want this ping reply
to happen after the state completion.

Consider the case where we have a follower and a driver, the follower is
sent the Start/Ping commands and replies to the ping but is still
processing the state change async. The server can then Start the driver,
which will then try to schedule the (still starting) follower and fail.

We could add the ping to the work queue as well but that creates
complications because modules (clients) and server share the same work
queues right now and block each other completions.

We could also make a method to process the work queue immediately but
that would be dangerous as well because it could contain a BUSY item
from some module that would block things.
2024-10-01 10:44:12 +02:00
Jonas Holmberg
648badb427 properties: Fix memory leak
Do not initialize changes in update_string() if
spa_json_begin_object_relax() fails to avoid having to clear changes
before returning.
2024-09-27 11:59:54 +02:00
Wim Taymans
2ab773ce14 stream: emit the Pause command early
Don't wait for the completion of the Pause command of the node but send
it to the stream immediately. Delaying it might make it come after the
set_param calls are done and confuse the stream.
2024-09-24 10:50:14 +02:00
Wim Taymans
7e436ad499 impl-link: also handle unprepared active links
An ACTIVE link going to < PAUSED is unprepared.
2024-09-24 10:46:21 +02:00
Gleb Popov
3f31935cac Include <pthread_np.h> on FreeBSD to access pthread_setaffinity 2024-09-23 08:09:45 +00:00
Wim Taymans
44a1d93b7d stream: improve the docs 2024-09-20 15:52:26 +02:00
Wim Taymans
c07663b236 impl-node: only process RequestProcess after state change
Wait until we are in the RUNNING state before sending
RequestProcess.
2024-09-19 19:12:54 +02:00
Wim Taymans
cd68819feb stream: update state based on node
Follow the state of the node and update the stream state accordingly.

The most important part is that Start is async and so it's better to
wait for completion from the node before emiting the STREAMING state.
2024-09-19 19:12:31 +02:00
Wim Taymans
2301d3000b impl-link: improve debug, add the node async state 2024-09-19 19:01:43 +02:00
Wim Taymans
911a601b95 impl-node: only let the server send RequestProcess commands
When we emit the RequestProcess event from an exported node, don't
send the RequestProcess command to ourselves but let the server
decide where to send it to.
2024-09-17 09:25:58 +02:00
Wim Taymans
ce390d5b22 spa: add spa_json_object_next
This gets the next key and value from an object. This function is better
because it will skip key/value pairs that don't fit in the array to hold
the key.

The previous code patter would stop parsing the object as soon as a key
larger than the available space was found.
2024-09-16 09:50:36 +02:00
Wim Taymans
cd81b5f39a spa: add spa_json_begin_array/object and relaxed versions
Add spa_json_begin_array/object to replace
spa_json_init+spa_json_begin_array/object

This function is better because it does not waste a useless spa_json
structure as an iterator. The relaxed versions also error out when the
container is mismatched because parsing a mismatched container is not
going to give any results anyway.
2024-09-16 09:50:33 +02:00
Wim Taymans
b8c6bfae1a stream: Add support for setting ProcessLatency
Pass the ProcessLatency set on the stream to the implementor.
2024-09-10 15:32:00 +02:00
Wim Taymans
0ef30aecab impl-link: silence some debug 2024-09-06 15:08:12 +02:00
Wim Taymans
b57375ba85 stream: enable videoadapter in all cases
It works fine without an explicitly selected converter.
2024-09-06 12:25:20 +02:00
Wim Taymans
1751575fc2 global: avoid recursive destroy calls
Fixes #4250
2024-09-04 18:05:29 +02:00
Wim Taymans
c84cf9a9d4 impl-link: handle errors better
Keep the original sequence number of the port_set_param(Format) and
port_use_buffer() calls around. When they produce an error, we will
get an error with the same sequence number.

When the sync completes, check if we got an error for the pending
operation and return that as the result.

We then also mark the link in error. We don't mark the port in error
because that is not really the case.

This should make the link error when negotiation of format or buffers
fails instead of silently continuing.
2024-09-02 10:04:05 +02:00
Wim Taymans
b5d0532a77 impl-node: improve compatibility with older clients
Clients before version 1 don't update the active_driver_id and so we
must do on the server ourselves or else the node will not be scheduled.
2024-08-21 17:41:13 +02:00
Wim Taymans
1ef6db7d54 impl-node: only increment pending when not async
Place the async state of the node in its activation.

Don't increment the pending state of the driver when an async node is
found because the async nodes will not trigger the driver when they
complete.

See !2104
2024-08-16 22:44:53 +02:00
Barnabás Pőcze
d4de97a473 impl-link: fix error message memory leak
`pw_link_info::error` was previously not cleared when a link was destroyed,
leading to a memory leak if an error message had been set. For example,
if format negotiation fails, and as a result the link is destroyed.
2024-08-13 09:12:48 +00:00
Wim Taymans
89bf8b8566 impl-node: improve driver activation counter calculation
Don't schedule nodes that didn't receive us as the driver node yet
because they will not be able to signal us when they complete and leave
us xrun.

Also only count the nodes that we will actually schedule and expect a
signal from, set this in the pending activation counter. This can be
less when some nodes are still starting or receiving the driver
activation record.

This eleminates some errors when adding and removing nodes.

See #4182
2024-08-08 15:20:38 +02:00
Wim Taymans
338e32e57c impl-node: Do xrun check a bit better
Check if the node is FINISHED instead of checking the refcounts. It's
possible that the refcounts are 0 but the node was not scheduled or
finished yet.

If the node is not FINISHED but TRIGGERED, we can run the recover
without reporting an error.

Any other state is an error and we need to log this and recover.

See #4182
2024-08-08 15:17:27 +02:00
Wim Taymans
cc2c86a55b impl-node: always INACTIVATE a node when stopping
Set the node state INACTIVE on the client and server side in all cases
when stopping to ensure nothing tries to schedule the node anymore.
2024-08-08 15:15:39 +02:00
Wim Taymans
5afdd54277 impl-node: improve debug
Use ATOMIC_LOAD to get status.
Debug the pending state after decrementing so we debug the value we
are actually going to test.
Add node id to debug lines to better track things.
2024-08-08 15:00:07 +02:00
Wim Taymans
8fb05935d3 impl-node: improve xrun debug
Debug the xrun state before we change things and run the recovery
process.
2024-08-08 15:00:07 +02:00
Wim Taymans
3376dff72b impl-node: don't overwrite node state when finished
Don't just overwrite the state with FINISHED but only do this when the
state was AWAKE.

The server might already have started a new cycle and placed
NOT_TRIGGERED as the state. Or, it might have changed the state to
INACTIVE. In all cases, we should not overwrite the state unless it was
AWAKE and we should only trigger peers when we were AWAKE.

This fixes some spurious xruns and glitches.

See #4182
2024-08-08 15:00:07 +02:00
Wim Taymans
8c1a69f1b5 loop: don't usleep when queue is full
When the queue is full, before this patch we used to go into usleep in
the hope that the other thread will run and empty the queue and that we
can retry after the usleep.

This however does not always work because the other thread might be waiting
for the thread that does the invoke call and we lock forever.

Therefore we should always try to make progress in some way. Instead of
waiting, allocate an (or use the previously allocated) overflow queue and
write to that one. We can chain multiple overflow queues together as many
as we need (but we might want to bound that as well).

The loop.retry-timeout property is now deprecated.

See #4114
2024-08-06 12:05:11 +02:00
Wim Taymans
f4b2854770 impl-node: include config.h to define HAVE_MALLOC_TRIM
It was previously not used..
2024-07-30 17:50:04 +02:00
Wim Taymans
5cc7e583e2 impl-node: reset pending state when moving driving node
Commit d04a28daef moved the configuration
of the IO_Position after we removed the node from the old driver but
forgot to move the code that updates the pending_state.

See #4094
2024-07-30 14:17:58 +02:00
Wim Taymans
7f38653589 filter: Use the stream DSP format to negotiate control types
Add OSC and UMP control types and make sure the mixer converts to the
selected format.

Mostly useful for legacy filters that use the old MIDI format, placing
the Midi control type in the format will make the mixer convert to it.
2024-07-30 09:38:18 +02:00
Wim Taymans
bb82b2e493 impl-port: improve IO_Buffers management on ports
Make sure we clear IO_Buffers on the port and mixer before we clear the
buffers or the format. The IO_Buffer is used to check if the port should
be processed or not and its update is synchronized with the data-thread.

Set IO_Buffers on the mixer and node only after we have configured the
buffers on the node.

See #4094
2024-07-29 18:15:09 +02:00
Wim Taymans
db710359ad impl-link: make async link when on e of the nodes is async
We simply cannot schedule async nodes properly if we don't have the
async link. This change was done to make sure that driver sources don't
end up with async buffers and cause a unneccesary 1 cycle delay in
async clients. But we can fix this in a better way, like this:

Increment the cycle counter after we copy the output port buffers. This
ensures the async clients immediately pick up the new buffers (or the
output buffers from the previous cycle).

Also remove some old compatibility code that is no longer useful.

Fixes #4138
See #4133
2024-07-22 13:10:33 +02:00
Wim Taymans
32e4553a05 impl-node: always INACTIVATE when stopping
A remote node is prepared when the Start command sync reply has been
received.

If we however quickly switch from active to inactive, the
pending reply is cancelled but the remote node will have set the
FINISHED status and will be ready to be scheduled.

Make it so that we always set the INACTIVE status when the node is
canceled and unprepared, even if we didn't get the reply and the node
was not prepared.

Fixes #4122
2024-07-18 13:44:36 +02:00