Commit 4218fdd7 authored by Volker Rümelin's avatar Volker Rümelin Committed by Gerd Hoffmann
Browse files

audio: change mixing engine float range to [-1.f, 1.f]



Currently the internal float range of the mixing engine is
[-.5f, .5f]. PulseAudio, SDL2 and libasound use a [-1.f, 1.f]
range. This means with float samples the audio playback volume
is 6dB too low and audio recording signals will be clipped in
most cases.

To avoid another scaling factor in the conv_natural_float_* and
clip_natural_float_* functions with FLOAT_MIXENG defined this
patch changes the mixing engine float range to [-1.f, 1.f].

Signed-off-by: default avatarVolker Rümelin <vr_qemu@t-online.de>
Message-id: 20200308193321.20668-4-vr_qemu@t-online.de
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 33a93bae
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -271,11 +271,11 @@ f_sample *mixeng_clip[2][2][2][3] = {
#define CONV_NATURAL_FLOAT(x) (x)
#define CLIP_NATURAL_FLOAT(x) (x)
#else
static const float float_scale = UINT_MAX;
static const float float_scale = UINT_MAX / 2.f;
#define CONV_NATURAL_FLOAT(x) ((x) * float_scale)

#ifdef RECIPROCAL
static const float float_scale_reciprocal = 1.f / UINT_MAX;
static const float float_scale_reciprocal = 2.f / UINT_MAX;
#define CLIP_NATURAL_FLOAT(x) ((x) * float_scale_reciprocal)
#else
#define CLIP_NATURAL_FLOAT(x) ((x) / float_scale)
+8 −9
Original line number Diff line number Diff line
@@ -41,32 +41,31 @@ static inline mixeng_real glue (conv_, ET) (IN_T v)

#ifdef RECIPROCAL
#ifdef SIGNED
    return nv * (1.f / (mixeng_real) (IN_MAX - IN_MIN));
    return nv * (2.f / ((mixeng_real)IN_MAX - IN_MIN));
#else
    return (nv - HALF) * (1.f / (mixeng_real) IN_MAX);
    return (nv - HALF) * (2.f / (mixeng_real)IN_MAX);
#endif
#else  /* !RECIPROCAL */
#ifdef SIGNED
    return nv / (mixeng_real) ((mixeng_real) IN_MAX - IN_MIN);
    return nv / (((mixeng_real)IN_MAX - IN_MIN) / 2.f);
#else
    return (nv - HALF) / (mixeng_real) IN_MAX;
    return (nv - HALF) / ((mixeng_real)IN_MAX / 2.f);
#endif
#endif
}

static inline IN_T glue (clip_, ET) (mixeng_real v)
{
    if (v >= 0.5) {
    if (v >= 1.f) {
        return IN_MAX;
    }
    else if (v < -0.5) {
    } else if (v < -1.f) {
        return IN_MIN;
    }

#ifdef SIGNED
    return ENDIAN_CONVERT ((IN_T) (v * ((mixeng_real) IN_MAX - IN_MIN)));
    return ENDIAN_CONVERT((IN_T)(v * (((mixeng_real)IN_MAX - IN_MIN) / 2.f)));
#else
    return ENDIAN_CONVERT ((IN_T) ((v * IN_MAX) + HALF));
    return ENDIAN_CONVERT((IN_T)((v * ((mixeng_real)IN_MAX / 2.f)) + HALF));
#endif
}