Commit graph

4579 commits

Author SHA1 Message Date
Wim Taymans
043245ca11 v4l2: set the NO_RATE clock flag
These sources have very inaccurate position/duration/rate information
that is not suitable for use as a clock so set the NO_RATE flag.
2024-11-26 17:05:20 +01:00
Wim Taymans
3f0fe0032f node: add a clock flag to mark rate/duration inaccurate
Some clocks (v4l2) don't process exactly process buffers at the given
rate/duration so mark this in the clock flags.

We need to use the nsec field in the clock to derive ticks in pw-stream
in that case to get a good clock.
2024-11-26 17:02:02 +01:00
Wim Taymans
25e06e5912 spa: remove some old includes 2024-11-26 13:30:58 +01:00
Wim Taymans
853c4783bc spa: inline some metadata functions 2024-11-26 12:46:58 +01:00
Wim Taymans
9fc33a6142 spa: add some more functions 2024-11-26 12:21:05 +01:00
Wim Taymans
d966a36fdd spa: compile all function into libspa.so 2024-11-26 11:58:51 +01:00
Wim Taymans
31802d4994 add per type API defines 2024-11-26 11:58:51 +01:00
Wim Taymans
90b0e45037 make static inline -> SPA_API_IMPL
So that we can export the symbols as well.
2024-11-26 11:35:49 +01:00
Wim Taymans
84bd4b7ea9 spa: use static inline for interfaces instead of macro
It gives better typechecking and a path to make a library of functions.
2024-11-26 11:35:49 +01:00
Pauli Virtanen
e74e7b938e bluez5: don't re-emit nodes on device set events if unchanged
Only re-emit nodes on BAP device set changes, if our configuration
actually needs to be changed.
2024-11-25 21:26:13 +02:00
Pauli Virtanen
656ebcfcbb bluez5: fix handling of multiple transports for same profile
Don't mark a profile disconnected, if it still has active transports.

For BAP, emit device set changed events when transports come and go, so
that the SPA device can reconfigure accordingly.
2024-11-25 21:26:13 +02:00
Pauli Virtanen
e08846dc9c alsa-card-profiles: move HDMI/AC3 profiles to separate profile set
These shouldn't be enabled by default, because they cannot be
autodetected, and if the configuration is not a supported one, they
produce loud BRRRT at 100% volume and ALSA errors.
2024-11-23 14:58:17 +02:00
Pauli Virtanen
603c67628e bluez5: fix BAP route non-deviceset availability
Fix issue where BAP routes are marked unavailable for devices not in a
device set.

Fixes: a154169942
2024-11-23 11:25:46 +02:00
Philip Withnall
89a605b7a2 filter-graph: Remove duplicate install keyword from meson.build
This fixes building with `--fatal-meson-warnings`.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-11-22 16:24:51 +00:00
Arun Raghavan
90075b838c spa: alsa: Try to initialise card_index from path if needed
If the PCM is loaded directly using only api.alsa.path,
state->card_index may never be initialised, and then we end up opening
the wrong ctl device. Let's try a fallback for this case.
2024-11-22 10:36:26 -05:00
Wim Taymans
1084cc24b6 alsa: handle the case where the driver is destroyed
When the driver node is destroyed (like when unplugging the cable) it
will drop/pause all of the follower ALSA nodes. This is something that
happens internally because of how the ALSA nodes work together, on the
PipeWire level, the nodes are still running and they will just be moved to
another driver.

The problem is that nothing will then start the nodes again after moving
it to the new driver. Fix this by keeping track of the desired target
state of the ALSA node and restoring that state when we detect that we are
paused when moved to a new driver.

Fixes #4401
2024-11-15 16:09:36 +01:00
Wim Taymans
3b51dbba1c filter-graph: improve output port number calculations
When no output ports are given, use the number of graph outputs, which
needs to take into account the number of times we duplicated the graph.
2024-11-15 12:21:49 +01:00
Wim Taymans
f261b2f96f filter-chain: update channels from filter-graph
Add a filter-graph info structure with the number of inputs and outputs
in the graph definition.

Use the input/outputs to update the number of channels on the capture and
playback streams when not explicitly given. Also copy over the positions
when they match the other stream and were not explicitly specified.

Fixes #4404
2024-11-15 10:53:45 +01:00
Wim Taymans
8c59fae42d loop: add overflow queues again
Add the overflow queues again. We can easily iterate atomically over the
overflow queues and flush them.

Overflowing a queue is quite common when heavy swapping is done and
should never cause a lockup, so allocate new queues as we need them. We
can share the eventfd with the main queue to avoid wastings fds.

The limit on the number of queues is then only for when concurrent
threads want to invoke things, so 128 is plenty enough.
2024-11-14 17:38:43 +01:00
Wim Taymans
6cf320e387 loop: handle queue overflow better
When a queue overflows we place the queue back in the stack and try
again. Because it's at the top of the stack we take exactly the same
queue and keep on looping forever if the other thread is blocked for
some reason.

Instead, mark the queue as overflowed and only place it back in the
stack when we have flushed it.

This avoids a deadlock when the main-thread invokes on the data loop
and blocks and when the data loop invokes on the main-thread and
overflows the queue.
2024-11-14 15:58:09 +01:00
Wim Taymans
d32ab4d8ea alsa: remove unused variable 2024-11-14 12:03:55 +01:00
Wim Taymans
2ad8904ac8 spa: update the UNPOSITIONED flag
When we can't parse valid positions, make sure the UNPOSITIONED flag is
set for raw audio info.
2024-11-14 11:06:11 +01:00
Wim Taymans
567b484386 filter-chain: move the filter-graph to plugins 2024-11-13 11:12:06 +01:00
Wim Taymans
b2dd733520 v4l2: Add mmap fallback when USERPTR is not supported
When we don't support EXPBUF according to the probe, the host will
allocate memory for us. We will then try to use USERPTR to import the
memory into v4l2.

If this is not supported, try to fall back to MMAP support, mmap the
buffers and memcpy the MMAP buffer to the host allocated buffers.
2024-11-07 15:55:38 +01:00
Wim Taymans
c4df4a0371 v4l2: improve debug a little 2024-11-07 15:55:38 +01:00
Wim Taymans
b9df297e2a v4l2: use a separate flag to skip the first buffer
The buf.sequence value might stay to 0 (v4l2loopback)
2024-11-07 15:55:38 +01:00
Wim Taymans
877c262e78 v4l2: probe number of buffers as well
Instead of just probing with 2 buffers, probe with the MAX_BUFFERS and
remember how many buffers we received.

Some drivers (v4l2loopback) work with less than MAX_BUFFERS (8) and we
need to set the max number of buffers in the Buffers param.
2024-11-07 15:55:33 +01:00
Wim Taymans
71f6d269db v4l2: first probe and then update port flags
The probe is to decide it we can use EXPBUF or not and this is used to
decide on the flags.

This got broken with 842ac9e110
2024-11-07 11:17:33 +01:00
Wim Taymans
9c49bffc22 keys: add lazy scheduling flags and docs 2024-11-06 12:57:48 +01:00
Wim Taymans
68877dcee7 audioconvert: only output when there is something to output
Or else we get 0 sized output buffers.
2024-11-06 09:28:09 +01:00
Wim Taymans
c0fcc9b83f videoconvert: add more ffmpeg format mappings 2024-11-05 10:40:14 +01:00
Pauli Virtanen
1b5c244ee0 bluez5: clean up route/profile building
Clean up route/profile building a bit so that it is easier to add new
device profiles.

Use names instead of magic numbers for the routes.

Fix marking BAP set input route unavailable by error due to magic number
off by one.
2024-11-04 21:54:29 +02:00
Pauli Virtanen
8504e58120 bluez5: reduce quirks logspam
There's no need to log quirks every time they are used, it's enough to
log them once when a device connects.
2024-11-04 21:41:24 +02:00
George Kiagiadakis
726234c82f audioconvert: always push out data when the out_offset reaches max_out
No matter if the input data (n_samples) is > 0, the code here should
flush out existing data if the output buffer is full
2024-11-04 20:36:12 +02:00
Elliot Chen
d5e2a0df6c libcamera: update buffers datas information according to plane info 2024-11-04 17:00:18 +00:00
Wim Taymans
9c19284f7f support: make the loop queue handling lockfree
Don't use TSS to store per-thread queues but keep a lockfree stack of
queues. We can then pick off a queue and write to that one and place it
back after use.

We need to keep the queues indexed by id in the stack because otherwise
we would need to compare-and-swap 128 bits (pointer + tag), which is
more problematic.

Because we keep the queues in an array and no queue is ever removed and
the array can only grow, we can quite easily just iterate the array
without a lock. Without the lock we also fix one of the potential
problems with ardour where the queue_flush thread is canceled while
flushing and the queue_mutex remains locked.

Because we end up with all queues in the array now, we can overflow the
fixed max amount of queues we can manage. When that happens, sleep for a
while and try again. This is a case where more than QUEUES_MAX (128) threads
are invoking at the same time and is rather unlikely.

There is also the queue overflow case which we now also must handle with
a retry. This potentially uses more eventfds but again this should be
unlikely and cause no further problems.

See #4356
2024-11-04 17:41:14 +01:00
Pauli Virtanen
c9acdd2f1f bluez5: backend-native: update HFP SDP records
Advertise SWB since we implement it.  Update HFP version to 1.9
accordingly.
2024-10-31 08:18:45 +00:00
Elliot
d67882fa10 libcamera: allocate memory according to the number of discontiguous memory 2024-10-30 15:20:21 +00:00
Wim Taymans
fb2b314660 audioconvert: interchange the resampler loops
Iterate the channels in the inner loop instead of the outer loop. This
makes it handle with 0 channels better but also does the more
complicated phase increment code only once for all channels. Also the
filters might stay in the cache for each channel now.
2024-10-30 13:31:24 +01:00
Iulia Tanasescu
b2a70f5933 bluez5: Add support for Broadcast links
This adds support for BAP Broadcast transport links.

Unlike unicast, broadcast links are used by a BAP Broadcast Sink
device to link together multiple transports in the same BIG that
the user wants to start receiving audio from. Each transport is
associated with a different BIS, so each one has a different fd.
Thus, each link needs to be acquired and released separately.
2024-10-28 17:57:44 +00:00
Wim Taymans
7906dc854a json: improve infinite checks
Avoid compiler errors like this:

 /usr/include/spa-0.2/spa/utils/json-core.h:417:25: error: comparing floating-point with '==' or '!=' is unsafe [-Werror=float-equal]
|   417 |                 if (val == INFINITY)
|       |                         ^~
2024-10-23 15:37:07 +02:00
Arun Raghavan
f0b81a4628 spa: audiotestsrc: Validate loop and system before using them
Makes sure we don't crash if those are not available (like with
DataSystem under spa-inspect).

Fixes: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/4365
2024-10-23 08:25:30 -04:00
Wim Taymans
2c132be626 audioconvert: align some buffers
so that we can use aligned read and writes in SSE.
2024-10-23 12:54:23 +02:00
Wim Taymans
662bf68122 audioconvert: handle odd writes in delay
Add some padding to the delay buffer. If we wrap around, copy the
spilled samples to the front of the buffer. This makes it possible to
use the more optimized sse delay function in more cases.
2024-10-23 12:34:04 +02:00
Wim Taymans
3309e0b244 audioconvert: don't unroll when unaligned write pointer
We require the write pointer to be a multiple of 4 for our unrolled SSE
loop to work, so enforce this to avoid segfaults.
2024-10-23 11:40:34 +02: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
22c45af7e0 loop: refcount the queues
The loop in the TSS gets an extra refcount and is unreffed when the TSS
destroy is called.

We can then also ref the queue during the function callback. When the
queue (thread) was destroyed during the callback, ignore the result and
continue with the next queues.

See #4356
2024-10-21 17:47:31 +02:00
Wim Taymans
bb53aa08ad loop: warn when some queues are still in TSS
When we clear we need to have all our queues removed from the TSS when
we delete the tss key or else they are leaked, check an warn about this
using a refcount of queued in the TSS.

See #4356
2024-10-21 17:08:10 +02:00
Wim Taymans
c4fece74a5 loop: fix race in shutdown
Make it possible to call loop_queue_destroy() from both the TSS destroy
and impl_clear() without races. We make sure that only one can remove
the queue from the queue list and cleanup. We also store the IN_TSS flag
in the flags so that we can see them before the queue is added to the
queue list. Only free the IN_TSS queue when the TSS destroy is called.

See #4356
2024-10-21 16:45:17 +02:00
Wim Taymans
6549e313ef alsa: clean up followers and our driver link in _clear
When we are going to be freed, make sure we remove ourself from the
driver list and also remove all the followers that we might still have.

Fixes #4355
2024-10-21 15:47:21 +02:00