Commit graph

3892 commits

Author SHA1 Message Date
Pauli Virtanen
50437fb4eb bluez5: set device.routes on device set nodes
Device set node props are controlled by a Route, so set device.routes=1
to avoid Wireplumber restoring node props on it.
2025-01-26 21:04:49 +02:00
Pauli Virtanen
de0f54c324 bluez5: support BAP hardware volume on device sets
Enable hardware volume for device sets, when all devices in the set
support HW volume.
2025-01-25 15:37:52 +00:00
Pauli Virtanen
34ac0d8256 bluez5: support BAP hardware volume
Support BAP HW volume now that it's implemented in BlueZ, with the
volume range 0-255 per spec.
2025-01-25 15:37:52 +00:00
Wim Taymans
b72eed8f03 audioadapter: don't emit result events for internal param enums
All of the _sync param enum calls are internal end should not result in
a result event externally.

See !2260
2025-01-25 16:34:35 +01:00
Wim Taymans
0c8f803d59 audioconvert: optimise f32d to/from s16s conversions
They are mostly used for sending and receiving RTP so it might be worth
to make them a bit faster.
2025-01-24 10:37:02 +01:00
Sanchayan Maity
6e67b3a2d7 bluez5: media-sink: Use correct profile name for ASHA 2025-01-23 10:13:48 +05:30
George Kiagiadakis
d0b3c00d29 bluez: enable delay reporting for a2dp-source
This allows our a2dp-source (sink endpoint) to report delay to the
remote source endpoint. Setting the "Delay" property is already
implemented, but by failing to configure DelayReporting, bluez rejects
the property change.
2025-01-21 16:11:08 +00:00
Arun Raghavan
980d37fb80 audioadapter: Trivial whitespace fix
Makes an annoying clang warning about mismatched indents.
2025-01-21 10:47:14 -05:00
Arun Raghavan
e57a01594e audioconvert: Only use rate_scale when working at DSP rate
In convert mode, we will be resampling directly to the output rate, so
don't try to scale to driver rate.
2025-01-21 08:50:43 -05:00
Andrew Sayers
db972b5bc1 Downgrade snd_pcm_mmap_commit error to warning 2025-01-21 11:20:23 +00:00
Wim Taymans
d2c2276088 adapter: pass follower direction to converter
Partially revert 86af9de739

The PortParam does not give enough information to derive the direction
of the converter. If the converter is configured in convert/convert
there is just no way to know when to output a quantum or not.

Fix this by doing a quick probe of the follower and then pass the
direction to the converter.

See !2227
2025-01-21 11:43:11 +01:00
Wim Taymans
b4c9135799 filter-graph: also support float fequency
Parse the frequency as string and then try to convert it to float so
that it also supports float frequencies.

See #4418
2025-01-20 09:55:42 +01:00
Pauli Virtanen
29a6552cc9 bluez5: take fractional resampler delay into account for reference time
Improve sample reference time accuracy by including the fractional part
of the resampler delay.
2025-01-19 17:11:13 +02:00
Pauli Virtanen
5f21ee8669 audioconvert: add delay_frac to spa_io_rate_match
Report the "fractional" part of the resampler delay in
spa_io_rate_match::delay_frac, in nanosamples (1/1e9 sample) at node
rate.

The delay values are best reported in units where it is clear what the
clock domain is, so report the value in fractional samples instead of
nanoseconds. Conversion to ns is also just dividision by the appropriate
rate.
2025-01-19 17:11:13 +02:00
Pauli Virtanen
f3a9ebd569 audioconvert: resampler: change resample_phase() unit to input samples
Report fractional delay in input samples instead of nsec at the nominal
input rate, as that is closer to what the value actually means.
2025-01-19 17:11:13 +02:00
Wim Taymans
9889d1ce0a alsa: close the sequence on error. 2025-01-19 15:56:01 +01:00
Wim Taymans
e4fc8d43bb alsa: handle error from _set_client_midi_version()
See #4507
2025-01-19 15:52:48 +01:00
Pauli Virtanen
eb91f097d9 audioconvert: resampler: fix off-by-one issues
Resampler without prefill was sometime outputting with different delay
than with prefill. Adjust initial history by 1 which seems to bring it
more in line.

The resampler phase also appears to depend on how many samples remain in
history which leads to possibly unexpected +-1 variation. Take this into
account in reported phase.

These changes make the resampler delay tests pass.

Both changes are sort of empirical --- I don't fully understand why
these would fix things but they seem to be needed to make the delay
calculations agree with what the resampler outputs.
2025-01-17 19:10:43 +02:00
Pauli Virtanen
79384530b5 audioconvert: resampler: add more resampler delay tests
Test also conversions between different rates, and with and without
prefill.
2025-01-17 19:10:43 +02:00
Pauli Virtanen
07f6dde3dd audioconvert: add function to get phase to resampler API
Support getting any fractional phase part of the resampler delay in its
API.
2025-01-17 19:10:43 +02:00
Wim Taymans
85c5d65c97 audioconvert: only consume from input what the resampler used
Keep track of the consumed samples from the input and use that to update
the in_offset. The resampler can tell us how much samples were used.
2025-01-17 12:20:06 +01:00
Wim Taymans
f914cf9327 audioconvert: the delay of the resampler is in input rate
The resampler needs ntaps/2-1 (delay) input samples to produce 1 output
sample so the delay is measured in input rate.
2025-01-15 17:02:39 +01:00
Wim Taymans
0913b3ef7b audioconvert: report delay in input rate
The delay is always expressed in samples at the output rate of the
resampler. For input streams we need to convert this to the expected
input rate.

Make the delay reporting in playback streams more accurate.
2025-01-15 15:25:49 +01:00
Pauli Virtanen
b952cfbe38 bluez5: remove resampler delay fudge factor
The resampler delay was off by one sample, so remove the corresponding
fudge factor here.  This matters for BAP output synchronization.

The resampler has also some fractional delay, so there can still be
sub-sample offset between the original and resampled timelines.  This is
not currently taken into account.
2025-01-13 19:05:58 +02:00
Pauli Virtanen
2c2bed2aeb audioconvert: fix resampler delay value and add test
Resampler delay for N taps is N/2-1 input samples.

Add test that checks this.

When input rate is varying, the resampler also accumulates additional
sub-sample delay. The resampler does not currently have API to report
the instantaneous sub-sample delay.  Add knownfail test for it.
2025-01-13 19:05:58 +02:00
Wim Taymans
049ab37a6d audioconvert: only deactive old filter when new filter loaded
When we fail to load the new filter, keep the old filter active or else
we will cause a crash when we clean up the old graph.
2025-01-13 16:58:28 +01:00
Wim Taymans
0868ff1ada math: improve denormal check
Use isnormal() when we can
2025-01-13 16:10:34 +01:00
Wim Taymans
73e11eea46 audioconvert: add wav stage only when needed 2025-01-13 15:39:32 +01:00
Pauli Virtanen
1ec814977c logger: support logging local timestamps and other timestamp logs
In timestamps, support different clocks and local time as formats.

Local real time timestamps are useful when trying to correlate logs from
different sources.
2025-01-13 13:48:22 +00:00
Pauli Virtanen
b9e130fd8c spa: alsa: do not allow setting Route that is not in current profile
When setting Route param, check that the route actually is part of the
active profile.

Also, check that the device given corresponds to the given route, before
setting properties. acp_device_set_port() also checks this, but we
shouldn't allow updating properties of Routes in non-active profiles.

Setting ports or applying props on devices not part of the profile can
do unexpected things e.g. alter mixer settings.
2025-01-12 11:13:47 +00:00
Pauli Virtanen
7d8657b7f4 audioconvert: recalculate stages on volume change
Volume changes may change mix passthrough status, so force stage
recalculation when they are done.
2025-01-11 16:13:11 +02:00
Sanchayan Maity
fc102e517a bluez5: g722: Fix format specifiers for log
This fixes build failure on 32-bit systems.
2025-01-10 13:24:23 +05:30
Pauli Virtanen
65f6e5ffa7 bluez5: clean up ASHA transport handling
Don't mix endpoint and transport paths, they're generally different.

If ASHA transport already existed, free the old one but not the device,
as the ASHA device existence should track how it appears in DBus.
2025-01-09 22:15:03 +00:00
Sanchayan Maity
b1e4799ea6 bluez5: Ensure codec_id comparison is against codec of right type
G722 codec id for ASHA is chosen arbitrarily to be different from
A2DP and BAP codec IDs. ASHA spec does not specify a codec ID like
A2DP/BAP.

In places where codec_id comparisons are done, ensure that the check
is done against the codec of the right type viz. A2DP/BAP/ASHA.
2025-01-09 14:51:50 +00:00
Sanchayan Maity
c7496c847f bluez5: asha/g722: bump media_codec version 2025-01-09 14:51:50 +00:00
Sanchayan Maity
e83f01a33b bluez5: Clean up ASHA implementation 2025-01-09 14:51:50 +00:00
Sanchayan Maity
13c026417b bluez5: Implement support for ASHA
ASHA is a Bluetooth specification for hearing aids.

For a high level overview of the ASHA Specification for BlueZ.
https://asymptotic.notion.site/ASHA-Spec-for-Bluez-61a46027fd46458d8235e14d6bedb2ce

The original specification in Android.
https://source.android.com/docs/core/connect/bluetooth/asha

Corresponding support in BlueZ.
https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/profiles/audio/asha.c

This only implements handling of one side of a ASHA device
pair. Stereo support/handling of both "left" & "right" side
will follow later requiring work on clock synchronization
between the pair.
2025-01-09 14:51:50 +00:00
Sanchayan Maity
41d099a580 bluez5: Add G722 codec for ASHA
For documentation on ASHA, see
https://source.android.com/docs/core/connect/bluetooth/asha
2025-01-09 14:51:50 +00:00
Sanchayan Maity
6a5f2bbd1f bluez5: media-sink: Log need_flush in flush_buffer 2025-01-09 14:51:50 +00:00
Arun Raghavan
71e403bbdb spa: aec: Add support for webrtc-audio-processing-2 2025-01-09 12:06:58 +00:00
Wim Taymans
48416b32ad audioconvert: improve Buffer params
Make sure we only make the buffer for the follower larger when we
downsample because then we need to ask for more data from the follower
to fill up a quantum.

Never try to make the follower buffer smaller than the quantum limit.
The reason is that the graph rate could be decreased dynamically and
then we would end up with too small buffers.

See #4490
2025-01-09 11:30:02 +01:00
Wim Taymans
3a65472e9e audioconvert: add support for filter-graphs
Load multiple graphs with audioconvert.filter-graph.N where N is the
order where the graph is inserted/replaced. Run the graphs before the
channelmixer.

Graphs can be added and removed at runtime.
2025-01-07 13:20:31 +01:00
Wim Taymans
1f4e8b96c2 audioconvert: fix remap stages
Merge remap with convert to simplify some things.
2025-01-07 12:58:59 +01:00
Wim Taymans
c00df67c12 audioconvert: schedule work offline
Instead of recalculating what to do every cycle, we can prepare a
static schedule and just run that. We only need to reevaluate it when
something changes.
2025-01-07 12:58:55 +01:00
Wim Taymans
3fbf84f612 audioconvert: run resampler depending on direction
For input streams, first run the resampler and then the channelmix. This
ensures that the channelmix is run with the rate of the graph instead
of the rate of the input. This is nicer because rate and quantum align
with the graph and the sample accurate volume ramps will work as
intended.

For output streams, leave the resampler after the channelmix for the same
reasons.
2025-01-07 12:03:59 +01:00
Wim Taymans
3cf9ccf4a7 filter-graph: handle NULL in and out
We need to pass exactly n_inputs and n_outputs pointers to the process
function but make it possible to set some to NULL so that the data is
ignored.
2025-01-07 10:42:04 +01:00
Wim Taymans
49f48a5fda filter-graph: separate data and size for filter graph
Remove the chunk and add separate arrays with data and n_samples. This aligns
better with other methods and makes it possible to more easily reuse
arrays of pointers as input and output.
2025-01-07 10:38:32 +01:00
Wim Taymans
d6030adada filter-graph: optimize mix function a little
Make special cases for no and 1 gain value when mixing.
2025-01-07 09:40:45 +01:00
Wim Taymans
efa615945e filter-graph: rename some properties 2025-01-07 09:35:05 +01:00
Wim Taymans
9f9e962dd6 filter-graph: pass spa_pod in get_props 2025-01-07 09:31:48 +01:00