Commit graph

979 commits

Author SHA1 Message Date
Wim Taymans
7701786016 audioconvert: demote a debug log to trace_fp 2022-06-29 17:30:04 +02:00
Wim Taymans
0b62cea4f9 audioconvert: use faster noise generator 2022-06-29 14:33:58 +02:00
Wim Taymans
938f2b123e audioconvert: improve format conversion
Make dither noise as a value between -0.5 and 0.5 and add this
to the scaled samples.
For this, we first need to do the scaling and then the CLAMP to
the target depth. This optimizes to the same code but allows us
to avoid under and overflows when we add the dither noise.

Add more dithering methods.

Expose a dither.method property on audioconvert. Disable dither when
the target depth > 16.
2022-06-29 14:10:15 +02:00
Wim Taymans
d23b96b033 audioconvert: fix some compiler warnings 2022-06-29 14:08:30 +02:00
Wim Taymans
0b73fa97d0 audioconvert: use loop for channelmix method enum 2022-06-29 14:05:48 +02:00
Wim Taymans
22d02a7891 audioconvert: dither in 24 bits
This saves some shifts.
2022-06-28 17:15:27 +02:00
Wim Taymans
7a0f201dc7 audioconvert: set right flags for functions 2022-06-28 17:02:15 +02:00
Wim Taymans
6b49bded3a audioconvert: move dither and noise to fmt-ops
We need to do dithering and noise when converting f32 to the
target format. This is more natural because we can work in 32 bits
integers instead of floats.

This will also make it possible to actually calculate the error between
source and target values and implement some sort of feedback and
noise shaping later.
2022-06-28 16:55:50 +02:00
Wim Taymans
51f4f1fb69 audioconvert: expose the selected function names
And debug them.
2022-06-28 16:50:14 +02:00
Wim Taymans
048e10ee3b audioconvert: expose upmix-method in PROP_INFO 2022-06-28 11:32:05 +02:00
Wim Taymans
a84bf672e8 audioconvert: add dither passthrough flag 2022-06-28 11:31:40 +02:00
Wim Taymans
b5e0151cc0 audioconvert: add dither noise setting in dither struct
Move the noise setting in the dither struct so that it can be
handled separately.
Setup dither separately.
Set used cpu_flags in structures after setup.
2022-06-28 10:52:31 +02:00
Wim Taymans
b7e26002be audiocovert: improve dither setup
The quantize is the amount of bits we want to keep from the original
signal, subtract the amount of bits for noise. Clamp this to 0 (all
noise).
Calculate the scale factor better with powf() and avoid overflows.

Fixes #2479
2022-06-28 10:11:46 +02:00
Wim Taymans
67c2202044 audioconvert: improve setup of quantization
Use the quantize value to specify how many bits to quantize to.
2022-06-27 20:03:30 +02:00
Wim Taymans
916050aacd audioconvert: handle errors 2022-06-27 20:03:30 +02:00
Wim Taymans
00998ffd7e audioconvert: ensure alignment
Allocate a little bit more data to ensure alignment and overread of the
dither data.
Ensure sse2 can load aligned data in all cases.
2022-06-27 17:18:23 +02:00
Wim Taymans
b41d52cfd1 audioconvert: optimize dither
Add sse2 dither optimization
2022-06-27 14:15:01 +02:00
Wim Taymans
9f55708e9d audioconvert: Always apply noise when asked
Rename empty.noise -> dither.noise and always add this amount of noise
when > 0. This also adds the noise to silent sounds, not only when
nothing is connected because that would also be a problem when an amp
needs to be kept alive with an non-0 signal.

Rename noise -> dither because we can use this also for dithering later.

See #705
2022-06-27 11:19:01 +02:00
Wim Taymans
abcf7cb8d8 add some SPA_LIKELY 2022-06-27 09:37:33 +02:00
Barnabás Pőcze
1ac02db6a9 spa: audioconvert: ensure that noise::intesity is not too big
Shifting by 64 or more would not fit into `uint64_t`.
2022-06-24 16:27:43 +02:00
Barnabás Pőcze
bb205d3d85 spa: audioconvert: use unsigned 64-bit integer for creating divisor
Using `int` results in UndefinedBehaviorSanitizer errors
when `noise::intensity` is 31 as that would shift the 1 into
the sign bit of a signed integer type.
2022-06-24 16:27:43 +02:00
Barnabás Pőcze
43f7831d14 spa: audioconvert: use SPA_N_ELEMENTS in noise_init() 2022-06-24 16:27:39 +02:00
Wim Taymans
13ccccbfbd audioconvert: add missing file 2022-06-24 14:15:17 +02:00
Wim Taymans
1c6cb049ce audioconvert: add an option generate silence noise
Add an empty.noise option that specifies the number of bits to
use for noise when the input signal is pure silence.

Some amplifiers can go into suspend mode pretty easily when they
get pure silence. With empty.noise = 1, audioconvert will now generate
a bitpattern that can keep those amplifiers alive, together with
disabling suspend in the session manager.

Fixes #705
2022-06-24 13:45:35 +02:00
Wim Taymans
9430df0ba6 channelmix: undefine the function macro 2022-06-24 13:45:35 +02:00
Wim Taymans
974ab5348e audioconvert: reset props before parsing config
Or else we undo all settings from the config params.
2022-06-24 13:45:35 +02:00
Wim Taymans
f2dee23085 buffer: add EMPTY chunk flag
Add an EMPTY chunk flag to mark a piece of memory as 'empty'. For audio
this means silence.
Use the empty flag to avoid mixing 0 samples.
Set the empty flag in output buffers on audioconvert.
2022-06-24 11:09:01 +02:00
Wim Taymans
da95043002 channelmix: guard against invalid channels 2022-06-23 11:40:22 +02:00
Wim Taymans
cc463da63e audioadapter: adjust max input ports
The control port adds an extra input port.
2022-06-23 11:39:27 +02:00
Wim Taymans
a365b19110 audioconvert: handle too many channels earlier 2022-06-23 11:28:27 +02:00
Pauli Virtanen
6bfe9a362c audioconvert: avoid crash on 64 channels + monitor enabled
this->monitor enabled adds an additional port in reconfigure_mode. If
there was already the maximum 64, this will crash.

Make maximum number of ports one larger than max channels to avoid
problems.
2022-06-23 09:11:25 +00:00
Wim Taymans
0f62d3442c alsa: handle driver bugs better
Use the NEAREST flag when setting a format. This only works for raw
formats and will update the format with the nearest accepted rate
or channels. We can then query the real configured format and use that
for the converter.

This makes things work when a driver tells us it can do 44100Hz but then
refuses and changes the rate to 48000.

See #2197, #2457, #2455, rhbz#2096193
2022-06-23 10:20:49 +02:00
Wim Taymans
a427e602bd audioconvert: in merge mode, flush input
In merge mode we handle 1 quantum and then flush the input and
output. Fixes a case were samples were cut at the start.
2022-06-22 15:48:09 +02:00
Wim Taymans
d13a206866 audioconvert: fix resampler in_offset
Only advance the in_offset with the number of samples that were consumed
by the resampler. In case when the resampler is filling up an old
buffer, this can be less than n_samples.

Fixes a2dp source and possibly others.
2022-06-20 12:33:52 +02:00
Lucas Holt
6a15a02ec2 Add support for MidnightBSD
Fix build issue

Fix build issue
2022-06-19 18:22:47 +00:00
Barnabás Pőcze
492a328227 spa: audioconvert: free resampler
resample::free() needs to be called in `impl_clear()` otherwise the
resampler's private data is leaked when the audioconvert instance is destroyed.
2022-06-16 19:49:50 +02:00
Wim Taymans
3cb5fab176 audioconvert: rework the control loop
Use the offset to skip entries in the sequence array.
Use one loop to handle intermediate and trailing samples.
Fixes an issue where the last chunk of a sequence would be ignored.
2022-06-16 16:45:32 +02:00
Wim Taymans
de2e819fec audioconvert2: rename to audioconvert 2022-06-16 09:19:05 +02:00
Wim Taymans
cf04bb573c audioconvert: remove old plugins 2022-06-16 09:16:49 +02:00
Wim Taymans
c160cd0176 audioconvert2: implement control port
Add a control port when requested in the PortConfig.
Fix the sequence loop.
Make a copy of the sample pointers before changing them.
2022-06-16 09:09:27 +02:00
Wim Taymans
5a60fd7041 audioconvert2: remove unused monitor field 2022-06-16 09:09:27 +02:00
Wim Taymans
194b8e2d97 audioconvert2: emit param change when volume changes 2022-06-16 09:09:27 +02:00
Wim Taymans
0ec41e60ef audioconvert2: fix for quantum changes
Use the offset as the buffer size.
Use the amount of requested - amount of used samples as queued samples.
2022-06-16 09:09:27 +02:00
Wim Taymans
fa9baa6488 examples: fix up adapter-control
Negotiate format, then buffers.
Give quantum-limit as a property when making nodes.
Set clock and position io and fill in rate and duration.
2022-06-16 09:09:27 +02:00
Wim Taymans
db49021104 audioconvert2: add control port processing 2022-06-16 09:09:27 +02:00
Wim Taymans
d5c28149f1 audioconvert2: fix in/out queued samples 2022-06-16 09:09:27 +02:00
Wim Taymans
7fe15ee5db audioconvert2: add beginnings of control ports 2022-06-16 09:09:27 +02:00
Wim Taymans
d3baa16559 audioconvert2: reset node in Flush/Suspend 2022-06-16 09:09:27 +02:00
Wim Taymans
8e6a8a705b audioconvert2: clamp in and output samples
Make sure we don't read or write more samples than available in the
buffers.
2022-06-16 09:09:27 +02:00
Wim Taymans
9e93fe3c36 audioconvert2: remap volumes to right channels
We get the volumes with a channelmap of the input/output, remap this to
the channelmixer internal layout.
2022-06-16 09:09:27 +02:00