mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-04-04 07:15:35 -04:00
parent
0115042adb
commit
b421331275
2 changed files with 26 additions and 4 deletions
|
|
@ -460,10 +460,21 @@ This is only active when the `psd` up-mix method is used.
|
||||||
\endparblock
|
\endparblock
|
||||||
|
|
||||||
@PAR@ client.conf dither.noise = 0
|
@PAR@ client.conf dither.noise = 0
|
||||||
This option will add N bits of random data to the signal. This can be used
|
\parblock
|
||||||
to keep some amplifiers alive during silent periods. This is usually used together with
|
This option will add N bits of random data to the signal. When no dither.method is
|
||||||
|
specified, the random data will flip between [-(1<<(N-1)), 0] every 1024 samples. With
|
||||||
|
a dither.method, the dither noise is amplified with 1<<(N-1) bits.
|
||||||
|
|
||||||
|
This can be used to keep some amplifiers alive during silent periods. One or two bits of noise is
|
||||||
|
usually enough, otherwise the noise will become audible. This is usually used together with
|
||||||
`session.suspend-timeout-seconds` to disable suspend in the session manager.
|
`session.suspend-timeout-seconds` to disable suspend in the session manager.
|
||||||
|
|
||||||
|
Note that PipeWire uses floating point operations with 24 bits precission for all of the audio
|
||||||
|
processing. Conversion to 24 bits integer sample formats is lossless and conversion to 32 bits
|
||||||
|
integer sample formats are simply padded with 0 bits at the end. This means that the dither noise
|
||||||
|
is always only in the 24 most significant bits.
|
||||||
|
\endparblock
|
||||||
|
|
||||||
@PAR@ client.conf dither.method = none
|
@PAR@ client.conf dither.method = none
|
||||||
\parblock
|
\parblock
|
||||||
Optional [dithering](https://en.wikipedia.org/wiki/Dither) can be done on the quantized
|
Optional [dithering](https://en.wikipedia.org/wiki/Dither) can be done on the quantized
|
||||||
|
|
@ -472,8 +483,11 @@ output signal.
|
||||||
There are 6 modes available:
|
There are 6 modes available:
|
||||||
|
|
||||||
1. none No dithering is done.
|
1. none No dithering is done.
|
||||||
2. rectangular Dithering with a rectangular noise distribution.
|
2. rectangular Dithering with a rectangular noise distribution. This adds random
|
||||||
3. triangular Dithering with a triangular noise distribution.
|
bits in the [-0.5, 0.5] range to the signal with even distribution.
|
||||||
|
3. triangular Dithering with a triangular noise distribution. This add random
|
||||||
|
bits in the [-1.0, 1.0] range to the signal with triangular distribution
|
||||||
|
around 0.0.
|
||||||
4. triangular-hf Dithering with a sloped triangular noise distribution.
|
4. triangular-hf Dithering with a sloped triangular noise distribution.
|
||||||
5. wannamaker3 Additional noise shaping is performed on the sloped triangular
|
5. wannamaker3 Additional noise shaping is performed on the sloped triangular
|
||||||
dithering to move the noise to the more inaudible range. This is using
|
dithering to move the noise to the more inaudible range. This is using
|
||||||
|
|
|
||||||
|
|
@ -468,6 +468,8 @@ int convert_init(struct convert *conv)
|
||||||
const struct noise_info *ninfo;
|
const struct noise_info *ninfo;
|
||||||
uint32_t i, conv_flags, data_size[3];
|
uint32_t i, conv_flags, data_size[3];
|
||||||
|
|
||||||
|
/* we generate int32 bits of random values. With this scale
|
||||||
|
* factor, we bring this in the [-1.0, 1.0] range */
|
||||||
conv->scale = 1.0f / (float)(INT32_MAX);
|
conv->scale = 1.0f / (float)(INT32_MAX);
|
||||||
|
|
||||||
/* disable dither if not needed */
|
/* disable dither if not needed */
|
||||||
|
|
@ -483,6 +485,9 @@ int convert_init(struct convert *conv)
|
||||||
switch (conv->noise_method) {
|
switch (conv->noise_method) {
|
||||||
case NOISE_METHOD_NONE:
|
case NOISE_METHOD_NONE:
|
||||||
conv->noise_method = NOISE_METHOD_PATTERN;
|
conv->noise_method = NOISE_METHOD_PATTERN;
|
||||||
|
/* the pattern method does not use a random number
|
||||||
|
* but flips the noise between [-(1<<(N-1)), 0] every
|
||||||
|
* 1024 samples. */
|
||||||
conv->scale = -1.0f * (1 << (conv->noise_bits-1));
|
conv->scale = -1.0f * (1 << (conv->noise_bits-1));
|
||||||
break;
|
break;
|
||||||
case NOISE_METHOD_RECTANGULAR:
|
case NOISE_METHOD_RECTANGULAR:
|
||||||
|
|
@ -490,10 +495,13 @@ int convert_init(struct convert *conv)
|
||||||
SPA_FALLTHROUGH;
|
SPA_FALLTHROUGH;
|
||||||
case NOISE_METHOD_TRIANGULAR:
|
case NOISE_METHOD_TRIANGULAR:
|
||||||
case NOISE_METHOD_TRIANGULAR_HF:
|
case NOISE_METHOD_TRIANGULAR_HF:
|
||||||
|
/* Amplify the random noise, with additional
|
||||||
|
* N-1 bits of noise. */
|
||||||
conv->scale *= (1 << (conv->noise_bits-1));
|
conv->scale *= (1 << (conv->noise_bits-1));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* RECTANGULAR dither goes from [-0.5, 0.5] */
|
||||||
if (conv->noise_method < NOISE_METHOD_TRIANGULAR)
|
if (conv->noise_method < NOISE_METHOD_TRIANGULAR)
|
||||||
conv->scale *= 0.5f;
|
conv->scale *= 0.5f;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue