1
0
Fork 0

Downmix 4/6/8-channel audio to stereo

This commit is contained in:
Bernat Arlandis 2025-02-10 14:25:47 +01:00
parent 5fbd83ed43
commit 55986d6fb4
1 changed files with 18 additions and 13 deletions

View File

@ -76,32 +76,37 @@ uint32_t AudioRBResampler::_resample(AudioFrame *p_dest, int p_todo, int32_t p_i
}
// This will probably never be used, but added anyway
// Downmix to stereo. Apply -3dB to center, and sides, -6dB to rear.
// four channels - channel order: front left, front right, rear left, rear right
if constexpr (C == 4) {
float v0 = rb[(pos << 2) + 0];
float v1 = rb[(pos << 2) + 2];
float v0n = rb[(pos_next << 2) + 0];
float v1n = rb[(pos_next << 2) + 2];
float v0 = rb[(pos << 2) + 0] + rb[(pos << 2) + 2] / 2;
float v1 = rb[(pos << 2) + 1] + rb[(pos << 2) + 3] / 2;
float v0n = rb[(pos_next << 2) + 0] + rb[(pos_next << 2) + 2] / 2;
float v1n = rb[(pos_next << 2) + 1] + rb[(pos_next << 2) + 3] / 2;
v0 += (v0n - v0) * frac;
v1 += (v1n - v1) * frac;
p_dest[i] = AudioFrame(v0, v1);
}
// six channels - channel order: front left, center, front right, rear left, rear right, LFE
if constexpr (C == 6) {
float v0 = rb[(pos * 6) + 0];
float v1 = rb[(pos * 6) + 2];
float v0n = rb[(pos_next * 6) + 0];
float v1n = rb[(pos_next * 6) + 2];
float v0 = rb[(pos * 6) + 0] + rb[(pos * 6) + 1] / Math_SQRT2 + rb[(pos * 6) + 3] / 2;
float v1 = rb[(pos * 6) + 2] + rb[(pos * 6) + 1] / Math_SQRT2 + rb[(pos * 6) + 4] / 2;
float v0n = rb[(pos_next * 6) + 0] + rb[(pos_next * 6) + 1] / Math_SQRT2 + rb[(pos_next * 6) + 3] / 2;
float v1n = rb[(pos_next * 6) + 2] + rb[(pos_next * 6) + 1] / Math_SQRT2 + rb[(pos_next * 6) + 4] / 2;
v0 += (v0n - v0) * frac;
v1 += (v1n - v1) * frac;
p_dest[i] = AudioFrame(v0, v1);
}
// eight channels - channel order: front left, center, front right, side left, side right, rear left, rear
// right, LFE
if constexpr (C == 8) {
float v0 = rb[(pos << 3) + 0];
float v1 = rb[(pos << 3) + 2];
float v0n = rb[(pos_next << 3) + 0];
float v1n = rb[(pos_next << 3) + 2];
float v0 = rb[(pos << 3) + 0] + rb[(pos << 3) + 1] / Math_SQRT2 + rb[(pos << 3) + 3] / Math_SQRT2 + rb[(pos << 3) + 5] / 2;
float v1 = rb[(pos << 3) + 2] + rb[(pos << 3) + 1] / Math_SQRT2 + rb[(pos << 3) + 4] / Math_SQRT2 + rb[(pos << 3) + 6] / 2;
float v0n = rb[(pos_next << 3) + 0] + rb[(pos_next << 3) + 1] / Math_SQRT2 + rb[(pos_next << 3) + 3] / Math_SQRT2 + rb[(pos_next << 3) + 5] / 2;
float v1n = rb[(pos_next << 3) + 2] + rb[(pos_next << 3) + 1] / Math_SQRT2 + rb[(pos_next << 3) + 4] / Math_SQRT2 + rb[(pos_next << 3) + 6] / 2;
v0 += (v0n - v0) * frac;
v1 += (v1n - v1) * frac;
p_dest[i] = AudioFrame(v0, v1);