From 5a079a2d114f96d4847d1ee305d5b7c16eeec50e Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 27 Dec 2025 12:03:39 -0800 Subject: Initial commit --- .../src/audio/SDL_audio_channel_converters.h | 1068 ++++++++++++++++++++ 1 file changed, 1068 insertions(+) create mode 100644 contrib/SDL-3.2.8/src/audio/SDL_audio_channel_converters.h (limited to 'contrib/SDL-3.2.8/src/audio/SDL_audio_channel_converters.h') diff --git a/contrib/SDL-3.2.8/src/audio/SDL_audio_channel_converters.h b/contrib/SDL-3.2.8/src/audio/SDL_audio_channel_converters.h new file mode 100644 index 0000000..ab682e6 --- /dev/null +++ b/contrib/SDL-3.2.8/src/audio/SDL_audio_channel_converters.h @@ -0,0 +1,1068 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +// DO NOT EDIT, THIS FILE WAS GENERATED BY build-scripts/gen_audio_channel_conversion.c + + +typedef void (*SDL_AudioChannelConverter)(float *dst, const float *src, int num_frames); + +static void SDL_ConvertMonoToStereo(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("mono", "stereo"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1); + dst += (num_frames-1) * 2; + for (i = num_frames; i; i--, src--, dst -= 2) { + const float srcFC = src[0]; + dst[1] /* FR */ = srcFC; + dst[0] /* FL */ = srcFC; + } + +} + +static void SDL_ConvertMonoTo21(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("mono", "2.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1); + dst += (num_frames-1) * 3; + for (i = num_frames; i; i--, src--, dst -= 3) { + const float srcFC = src[0]; + dst[2] /* LFE */ = 0.0f; + dst[1] /* FR */ = srcFC; + dst[0] /* FL */ = srcFC; + } + +} + +static void SDL_ConvertMonoToQuad(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("mono", "quad"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1); + dst += (num_frames-1) * 4; + for (i = num_frames; i; i--, src--, dst -= 4) { + const float srcFC = src[0]; + dst[3] /* BR */ = 0.0f; + dst[2] /* BL */ = 0.0f; + dst[1] /* FR */ = srcFC; + dst[0] /* FL */ = srcFC; + } + +} + +static void SDL_ConvertMonoTo41(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("mono", "4.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1); + dst += (num_frames-1) * 5; + for (i = num_frames; i; i--, src--, dst -= 5) { + const float srcFC = src[0]; + dst[4] /* BR */ = 0.0f; + dst[3] /* BL */ = 0.0f; + dst[2] /* LFE */ = 0.0f; + dst[1] /* FR */ = srcFC; + dst[0] /* FL */ = srcFC; + } + +} + +static void SDL_ConvertMonoTo51(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("mono", "5.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1); + dst += (num_frames-1) * 6; + for (i = num_frames; i; i--, src--, dst -= 6) { + const float srcFC = src[0]; + dst[5] /* BR */ = 0.0f; + dst[4] /* BL */ = 0.0f; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = srcFC; + dst[0] /* FL */ = srcFC; + } + +} + +static void SDL_ConvertMonoTo61(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("mono", "6.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1); + dst += (num_frames-1) * 7; + for (i = num_frames; i; i--, src--, dst -= 7) { + const float srcFC = src[0]; + dst[6] /* SR */ = 0.0f; + dst[5] /* SL */ = 0.0f; + dst[4] /* BC */ = 0.0f; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = srcFC; + dst[0] /* FL */ = srcFC; + } + +} + +static void SDL_ConvertMonoTo71(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("mono", "7.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1); + dst += (num_frames-1) * 8; + for (i = num_frames; i; i--, src--, dst -= 8) { + const float srcFC = src[0]; + dst[7] /* SR */ = 0.0f; + dst[6] /* SL */ = 0.0f; + dst[5] /* BR */ = 0.0f; + dst[4] /* BL */ = 0.0f; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = srcFC; + dst[0] /* FL */ = srcFC; + } + +} + +static void SDL_ConvertStereoToMono(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("stereo", "mono"); + + for (i = num_frames; i; i--, src += 2, dst++) { + dst[0] /* FC */ = (src[0] * 0.500000000f) + (src[1] * 0.500000000f); + } + +} + +static void SDL_ConvertStereoTo21(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("stereo", "2.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 2; + dst += (num_frames-1) * 3; + for (i = num_frames; i; i--, src -= 2, dst -= 3) { + dst[2] /* LFE */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertStereoToQuad(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("stereo", "quad"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 2; + dst += (num_frames-1) * 4; + for (i = num_frames; i; i--, src -= 2, dst -= 4) { + dst[3] /* BR */ = 0.0f; + dst[2] /* BL */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertStereoTo41(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("stereo", "4.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 2; + dst += (num_frames-1) * 5; + for (i = num_frames; i; i--, src -= 2, dst -= 5) { + dst[4] /* BR */ = 0.0f; + dst[3] /* BL */ = 0.0f; + dst[2] /* LFE */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertStereoTo51(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("stereo", "5.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 2; + dst += (num_frames-1) * 6; + for (i = num_frames; i; i--, src -= 2, dst -= 6) { + dst[5] /* BR */ = 0.0f; + dst[4] /* BL */ = 0.0f; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertStereoTo61(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("stereo", "6.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 2; + dst += (num_frames-1) * 7; + for (i = num_frames; i; i--, src -= 2, dst -= 7) { + dst[6] /* SR */ = 0.0f; + dst[5] /* SL */ = 0.0f; + dst[4] /* BC */ = 0.0f; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertStereoTo71(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("stereo", "7.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 2; + dst += (num_frames-1) * 8; + for (i = num_frames; i; i--, src -= 2, dst -= 8) { + dst[7] /* SR */ = 0.0f; + dst[6] /* SL */ = 0.0f; + dst[5] /* BR */ = 0.0f; + dst[4] /* BL */ = 0.0f; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert21ToMono(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("2.1", "mono"); + + for (i = num_frames; i; i--, src += 3, dst++) { + dst[0] /* FC */ = (src[0] * 0.333333343f) + (src[1] * 0.333333343f) + (src[2] * 0.333333343f); + } + +} + +static void SDL_Convert21ToStereo(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("2.1", "stereo"); + + for (i = num_frames; i; i--, src += 3, dst += 2) { + const float srcLFE = src[2]; + dst[0] /* FL */ = (src[0] * 0.800000012f) + (srcLFE * 0.200000003f); + dst[1] /* FR */ = (src[1] * 0.800000012f) + (srcLFE * 0.200000003f); + } + +} + +static void SDL_Convert21ToQuad(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("2.1", "quad"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 3; + dst += (num_frames-1) * 4; + for (i = num_frames; i; i--, src -= 3, dst -= 4) { + const float srcLFE = src[2]; + dst[3] /* BR */ = (srcLFE * 0.111111112f); + dst[2] /* BL */ = (srcLFE * 0.111111112f); + dst[1] /* FR */ = (srcLFE * 0.111111112f) + (src[1] * 0.888888896f); + dst[0] /* FL */ = (srcLFE * 0.111111112f) + (src[0] * 0.888888896f); + } + +} + +static void SDL_Convert21To41(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("2.1", "4.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 3; + dst += (num_frames-1) * 5; + for (i = num_frames; i; i--, src -= 3, dst -= 5) { + dst[4] /* BR */ = 0.0f; + dst[3] /* BL */ = 0.0f; + dst[2] /* LFE */ = src[2]; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert21To51(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("2.1", "5.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 3; + dst += (num_frames-1) * 6; + for (i = num_frames; i; i--, src -= 3, dst -= 6) { + dst[5] /* BR */ = 0.0f; + dst[4] /* BL */ = 0.0f; + dst[3] /* LFE */ = src[2]; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert21To61(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("2.1", "6.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 3; + dst += (num_frames-1) * 7; + for (i = num_frames; i; i--, src -= 3, dst -= 7) { + dst[6] /* SR */ = 0.0f; + dst[5] /* SL */ = 0.0f; + dst[4] /* BC */ = 0.0f; + dst[3] /* LFE */ = src[2]; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert21To71(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("2.1", "7.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 3; + dst += (num_frames-1) * 8; + for (i = num_frames; i; i--, src -= 3, dst -= 8) { + dst[7] /* SR */ = 0.0f; + dst[6] /* SL */ = 0.0f; + dst[5] /* BR */ = 0.0f; + dst[4] /* BL */ = 0.0f; + dst[3] /* LFE */ = src[2]; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertQuadToMono(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("quad", "mono"); + + for (i = num_frames; i; i--, src += 4, dst++) { + dst[0] /* FC */ = (src[0] * 0.250000000f) + (src[1] * 0.250000000f) + (src[2] * 0.250000000f) + (src[3] * 0.250000000f); + } + +} + +static void SDL_ConvertQuadToStereo(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("quad", "stereo"); + + for (i = num_frames; i; i--, src += 4, dst += 2) { + const float srcBL = src[2]; + const float srcBR = src[3]; + dst[0] /* FL */ = (src[0] * 0.421000004f) + (srcBL * 0.358999997f) + (srcBR * 0.219999999f); + dst[1] /* FR */ = (src[1] * 0.421000004f) + (srcBL * 0.219999999f) + (srcBR * 0.358999997f); + } + +} + +static void SDL_ConvertQuadTo21(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("quad", "2.1"); + + for (i = num_frames; i; i--, src += 4, dst += 3) { + const float srcBL = src[2]; + const float srcBR = src[3]; + dst[0] /* FL */ = (src[0] * 0.421000004f) + (srcBL * 0.358999997f) + (srcBR * 0.219999999f); + dst[1] /* FR */ = (src[1] * 0.421000004f) + (srcBL * 0.219999999f) + (srcBR * 0.358999997f); + dst[2] /* LFE */ = 0.0f; + } + +} + +static void SDL_ConvertQuadTo41(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("quad", "4.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 4; + dst += (num_frames-1) * 5; + for (i = num_frames; i; i--, src -= 4, dst -= 5) { + dst[4] /* BR */ = src[3]; + dst[3] /* BL */ = src[2]; + dst[2] /* LFE */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertQuadTo51(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("quad", "5.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 4; + dst += (num_frames-1) * 6; + for (i = num_frames; i; i--, src -= 4, dst -= 6) { + dst[5] /* BR */ = src[3]; + dst[4] /* BL */ = src[2]; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_ConvertQuadTo61(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("quad", "6.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 4; + dst += (num_frames-1) * 7; + for (i = num_frames; i; i--, src -= 4, dst -= 7) { + const float srcBL = src[2]; + const float srcBR = src[3]; + dst[6] /* SR */ = (srcBR * 0.796000004f); + dst[5] /* SL */ = (srcBL * 0.796000004f); + dst[4] /* BC */ = (srcBR * 0.500000000f) + (srcBL * 0.500000000f); + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = (src[1] * 0.939999998f); + dst[0] /* FL */ = (src[0] * 0.939999998f); + } + +} + +static void SDL_ConvertQuadTo71(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("quad", "7.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 4; + dst += (num_frames-1) * 8; + for (i = num_frames; i; i--, src -= 4, dst -= 8) { + dst[7] /* SR */ = 0.0f; + dst[6] /* SL */ = 0.0f; + dst[5] /* BR */ = src[3]; + dst[4] /* BL */ = src[2]; + dst[3] /* LFE */ = 0.0f; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert41ToMono(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("4.1", "mono"); + + for (i = num_frames; i; i--, src += 5, dst++) { + dst[0] /* FC */ = (src[0] * 0.200000003f) + (src[1] * 0.200000003f) + (src[2] * 0.200000003f) + (src[3] * 0.200000003f) + (src[4] * 0.200000003f); + } + +} + +static void SDL_Convert41ToStereo(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("4.1", "stereo"); + + for (i = num_frames; i; i--, src += 5, dst += 2) { + const float srcLFE = src[2]; + const float srcBL = src[3]; + const float srcBR = src[4]; + dst[0] /* FL */ = (src[0] * 0.374222219f) + (srcLFE * 0.111111112f) + (srcBL * 0.319111109f) + (srcBR * 0.195555553f); + dst[1] /* FR */ = (src[1] * 0.374222219f) + (srcLFE * 0.111111112f) + (srcBL * 0.195555553f) + (srcBR * 0.319111109f); + } + +} + +static void SDL_Convert41To21(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("4.1", "2.1"); + + for (i = num_frames; i; i--, src += 5, dst += 3) { + const float srcBL = src[3]; + const float srcBR = src[4]; + dst[0] /* FL */ = (src[0] * 0.421000004f) + (srcBL * 0.358999997f) + (srcBR * 0.219999999f); + dst[1] /* FR */ = (src[1] * 0.421000004f) + (srcBL * 0.219999999f) + (srcBR * 0.358999997f); + dst[2] /* LFE */ = src[2]; + } + +} + +static void SDL_Convert41ToQuad(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("4.1", "quad"); + + for (i = num_frames; i; i--, src += 5, dst += 4) { + const float srcLFE = src[2]; + dst[0] /* FL */ = (src[0] * 0.941176474f) + (srcLFE * 0.058823530f); + dst[1] /* FR */ = (src[1] * 0.941176474f) + (srcLFE * 0.058823530f); + dst[2] /* BL */ = (srcLFE * 0.058823530f) + (src[3] * 0.941176474f); + dst[3] /* BR */ = (srcLFE * 0.058823530f) + (src[4] * 0.941176474f); + } + +} + +static void SDL_Convert41To51(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("4.1", "5.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 5; + dst += (num_frames-1) * 6; + for (i = num_frames; i; i--, src -= 5, dst -= 6) { + dst[5] /* BR */ = src[4]; + dst[4] /* BL */ = src[3]; + dst[3] /* LFE */ = src[2]; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert41To61(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("4.1", "6.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 5; + dst += (num_frames-1) * 7; + for (i = num_frames; i; i--, src -= 5, dst -= 7) { + const float srcBL = src[3]; + const float srcBR = src[4]; + dst[6] /* SR */ = (srcBR * 0.796000004f); + dst[5] /* SL */ = (srcBL * 0.796000004f); + dst[4] /* BC */ = (srcBR * 0.500000000f) + (srcBL * 0.500000000f); + dst[3] /* LFE */ = src[2]; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = (src[1] * 0.939999998f); + dst[0] /* FL */ = (src[0] * 0.939999998f); + } + +} + +static void SDL_Convert41To71(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("4.1", "7.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 5; + dst += (num_frames-1) * 8; + for (i = num_frames; i; i--, src -= 5, dst -= 8) { + dst[7] /* SR */ = 0.0f; + dst[6] /* SL */ = 0.0f; + dst[5] /* BR */ = src[4]; + dst[4] /* BL */ = src[3]; + dst[3] /* LFE */ = src[2]; + dst[2] /* FC */ = 0.0f; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert51ToMono(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("5.1", "mono"); + + for (i = num_frames; i; i--, src += 6, dst++) { + dst[0] /* FC */ = (src[0] * 0.166666672f) + (src[1] * 0.166666672f) + (src[2] * 0.166666672f) + (src[3] * 0.166666672f) + (src[4] * 0.166666672f) + (src[5] * 0.166666672f); + } + +} + +static void SDL_Convert51ToStereo(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("5.1", "stereo"); + + for (i = num_frames; i; i--, src += 6, dst += 2) { + const float srcFC = src[2]; + const float srcLFE = src[3]; + const float srcBL = src[4]; + const float srcBR = src[5]; + dst[0] /* FL */ = (src[0] * 0.294545442f) + (srcFC * 0.208181813f) + (srcLFE * 0.090909094f) + (srcBL * 0.251818180f) + (srcBR * 0.154545456f); + dst[1] /* FR */ = (src[1] * 0.294545442f) + (srcFC * 0.208181813f) + (srcLFE * 0.090909094f) + (srcBL * 0.154545456f) + (srcBR * 0.251818180f); + } + +} + +static void SDL_Convert51To21(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("5.1", "2.1"); + + for (i = num_frames; i; i--, src += 6, dst += 3) { + const float srcFC = src[2]; + const float srcBL = src[4]; + const float srcBR = src[5]; + dst[0] /* FL */ = (src[0] * 0.324000001f) + (srcFC * 0.229000002f) + (srcBL * 0.277000010f) + (srcBR * 0.170000002f); + dst[1] /* FR */ = (src[1] * 0.324000001f) + (srcFC * 0.229000002f) + (srcBL * 0.170000002f) + (srcBR * 0.277000010f); + dst[2] /* LFE */ = src[3]; + } + +} + +static void SDL_Convert51ToQuad(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("5.1", "quad"); + + for (i = num_frames; i; i--, src += 6, dst += 4) { + const float srcFC = src[2]; + const float srcLFE = src[3]; + dst[0] /* FL */ = (src[0] * 0.558095276f) + (srcFC * 0.394285709f) + (srcLFE * 0.047619049f); + dst[1] /* FR */ = (src[1] * 0.558095276f) + (srcFC * 0.394285709f) + (srcLFE * 0.047619049f); + dst[2] /* BL */ = (srcLFE * 0.047619049f) + (src[4] * 0.558095276f); + dst[3] /* BR */ = (srcLFE * 0.047619049f) + (src[5] * 0.558095276f); + } + +} + +static void SDL_Convert51To41(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("5.1", "4.1"); + + for (i = num_frames; i; i--, src += 6, dst += 5) { + const float srcFC = src[2]; + dst[0] /* FL */ = (src[0] * 0.586000025f) + (srcFC * 0.414000005f); + dst[1] /* FR */ = (src[1] * 0.586000025f) + (srcFC * 0.414000005f); + dst[2] /* LFE */ = src[3]; + dst[3] /* BL */ = (src[4] * 0.586000025f); + dst[4] /* BR */ = (src[5] * 0.586000025f); + } + +} + +static void SDL_Convert51To61(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("5.1", "6.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 6; + dst += (num_frames-1) * 7; + for (i = num_frames; i; i--, src -= 6, dst -= 7) { + const float srcBL = src[4]; + const float srcBR = src[5]; + dst[6] /* SR */ = (srcBR * 0.796000004f); + dst[5] /* SL */ = (srcBL * 0.796000004f); + dst[4] /* BC */ = (srcBR * 0.500000000f) + (srcBL * 0.500000000f); + dst[3] /* LFE */ = src[3]; + dst[2] /* FC */ = (src[2] * 0.939999998f); + dst[1] /* FR */ = (src[1] * 0.939999998f); + dst[0] /* FL */ = (src[0] * 0.939999998f); + } + +} + +static void SDL_Convert51To71(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("5.1", "7.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 6; + dst += (num_frames-1) * 8; + for (i = num_frames; i; i--, src -= 6, dst -= 8) { + dst[7] /* SR */ = 0.0f; + dst[6] /* SL */ = 0.0f; + dst[5] /* BR */ = src[5]; + dst[4] /* BL */ = src[4]; + dst[3] /* LFE */ = src[3]; + dst[2] /* FC */ = src[2]; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert61ToMono(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("6.1", "mono"); + + for (i = num_frames; i; i--, src += 7, dst++) { + dst[0] /* FC */ = (src[0] * 0.143142849f) + (src[1] * 0.143142849f) + (src[2] * 0.143142849f) + (src[3] * 0.142857149f) + (src[4] * 0.143142849f) + (src[5] * 0.143142849f) + (src[6] * 0.143142849f); + } + +} + +static void SDL_Convert61ToStereo(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("6.1", "stereo"); + + for (i = num_frames; i; i--, src += 7, dst += 2) { + const float srcFC = src[2]; + const float srcLFE = src[3]; + const float srcBC = src[4]; + const float srcSL = src[5]; + const float srcSR = src[6]; + dst[0] /* FL */ = (src[0] * 0.247384623f) + (srcFC * 0.174461529f) + (srcLFE * 0.076923080f) + (srcBC * 0.174461529f) + (srcSL * 0.226153851f) + (srcSR * 0.100615382f); + dst[1] /* FR */ = (src[1] * 0.247384623f) + (srcFC * 0.174461529f) + (srcLFE * 0.076923080f) + (srcBC * 0.174461529f) + (srcSL * 0.100615382f) + (srcSR * 0.226153851f); + } + +} + +static void SDL_Convert61To21(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("6.1", "2.1"); + + for (i = num_frames; i; i--, src += 7, dst += 3) { + const float srcFC = src[2]; + const float srcBC = src[4]; + const float srcSL = src[5]; + const float srcSR = src[6]; + dst[0] /* FL */ = (src[0] * 0.268000007f) + (srcFC * 0.188999996f) + (srcBC * 0.188999996f) + (srcSL * 0.245000005f) + (srcSR * 0.108999997f); + dst[1] /* FR */ = (src[1] * 0.268000007f) + (srcFC * 0.188999996f) + (srcBC * 0.188999996f) + (srcSL * 0.108999997f) + (srcSR * 0.245000005f); + dst[2] /* LFE */ = src[3]; + } + +} + +static void SDL_Convert61ToQuad(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("6.1", "quad"); + + for (i = num_frames; i; i--, src += 7, dst += 4) { + const float srcFC = src[2]; + const float srcLFE = src[3]; + const float srcBC = src[4]; + const float srcSL = src[5]; + const float srcSR = src[6]; + dst[0] /* FL */ = (src[0] * 0.463679999f) + (srcFC * 0.327360004f) + (srcLFE * 0.040000003f) + (srcSL * 0.168960005f); + dst[1] /* FR */ = (src[1] * 0.463679999f) + (srcFC * 0.327360004f) + (srcLFE * 0.040000003f) + (srcSR * 0.168960005f); + dst[2] /* BL */ = (srcLFE * 0.040000003f) + (srcBC * 0.327360004f) + (srcSL * 0.431039989f); + dst[3] /* BR */ = (srcLFE * 0.040000003f) + (srcBC * 0.327360004f) + (srcSR * 0.431039989f); + } + +} + +static void SDL_Convert61To41(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("6.1", "4.1"); + + for (i = num_frames; i; i--, src += 7, dst += 5) { + const float srcFC = src[2]; + const float srcBC = src[4]; + const float srcSL = src[5]; + const float srcSR = src[6]; + dst[0] /* FL */ = (src[0] * 0.483000010f) + (srcFC * 0.340999991f) + (srcSL * 0.175999999f); + dst[1] /* FR */ = (src[1] * 0.483000010f) + (srcFC * 0.340999991f) + (srcSR * 0.175999999f); + dst[2] /* LFE */ = src[3]; + dst[3] /* BL */ = (srcBC * 0.340999991f) + (srcSL * 0.449000001f); + dst[4] /* BR */ = (srcBC * 0.340999991f) + (srcSR * 0.449000001f); + } + +} + +static void SDL_Convert61To51(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("6.1", "5.1"); + + for (i = num_frames; i; i--, src += 7, dst += 6) { + const float srcBC = src[4]; + const float srcSL = src[5]; + const float srcSR = src[6]; + dst[0] /* FL */ = (src[0] * 0.611000001f) + (srcSL * 0.223000005f); + dst[1] /* FR */ = (src[1] * 0.611000001f) + (srcSR * 0.223000005f); + dst[2] /* FC */ = (src[2] * 0.611000001f); + dst[3] /* LFE */ = src[3]; + dst[4] /* BL */ = (srcBC * 0.432000011f) + (srcSL * 0.568000019f); + dst[5] /* BR */ = (srcBC * 0.432000011f) + (srcSR * 0.568000019f); + } + +} + +static void SDL_Convert61To71(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("6.1", "7.1"); + + // convert backwards, since output is growing in-place. + src += (num_frames-1) * 7; + dst += (num_frames-1) * 8; + for (i = num_frames; i; i--, src -= 7, dst -= 8) { + const float srcBC = src[4]; + dst[7] /* SR */ = src[6]; + dst[6] /* SL */ = src[5]; + dst[5] /* BR */ = (srcBC * 0.707000017f); + dst[4] /* BL */ = (srcBC * 0.707000017f); + dst[3] /* LFE */ = src[3]; + dst[2] /* FC */ = src[2]; + dst[1] /* FR */ = src[1]; + dst[0] /* FL */ = src[0]; + } + +} + +static void SDL_Convert71ToMono(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("7.1", "mono"); + + for (i = num_frames; i; i--, src += 8, dst++) { + dst[0] /* FC */ = (src[0] * 0.125125006f) + (src[1] * 0.125125006f) + (src[2] * 0.125125006f) + (src[3] * 0.125000000f) + (src[4] * 0.125125006f) + (src[5] * 0.125125006f) + (src[6] * 0.125125006f) + (src[7] * 0.125125006f); + } + +} + +static void SDL_Convert71ToStereo(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("7.1", "stereo"); + + for (i = num_frames; i; i--, src += 8, dst += 2) { + const float srcFC = src[2]; + const float srcLFE = src[3]; + const float srcBL = src[4]; + const float srcBR = src[5]; + const float srcSL = src[6]; + const float srcSR = src[7]; + dst[0] /* FL */ = (src[0] * 0.211866662f) + (srcFC * 0.150266662f) + (srcLFE * 0.066666670f) + (srcBL * 0.181066677f) + (srcBR * 0.111066669f) + (srcSL * 0.194133341f) + (srcSR * 0.085866667f); + dst[1] /* FR */ = (src[1] * 0.211866662f) + (srcFC * 0.150266662f) + (srcLFE * 0.066666670f) + (srcBL * 0.111066669f) + (srcBR * 0.181066677f) + (srcSL * 0.085866667f) + (srcSR * 0.194133341f); + } + +} + +static void SDL_Convert71To21(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("7.1", "2.1"); + + for (i = num_frames; i; i--, src += 8, dst += 3) { + const float srcFC = src[2]; + const float srcBL = src[4]; + const float srcBR = src[5]; + const float srcSL = src[6]; + const float srcSR = src[7]; + dst[0] /* FL */ = (src[0] * 0.226999998f) + (srcFC * 0.160999998f) + (srcBL * 0.194000006f) + (srcBR * 0.119000003f) + (srcSL * 0.208000004f) + (srcSR * 0.092000000f); + dst[1] /* FR */ = (src[1] * 0.226999998f) + (srcFC * 0.160999998f) + (srcBL * 0.119000003f) + (srcBR * 0.194000006f) + (srcSL * 0.092000000f) + (srcSR * 0.208000004f); + dst[2] /* LFE */ = src[3]; + } + +} + +static void SDL_Convert71ToQuad(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("7.1", "quad"); + + for (i = num_frames; i; i--, src += 8, dst += 4) { + const float srcFC = src[2]; + const float srcLFE = src[3]; + const float srcSL = src[6]; + const float srcSR = src[7]; + dst[0] /* FL */ = (src[0] * 0.466344833f) + (srcFC * 0.329241365f) + (srcLFE * 0.034482758f) + (srcSL * 0.169931039f); + dst[1] /* FR */ = (src[1] * 0.466344833f) + (srcFC * 0.329241365f) + (srcLFE * 0.034482758f) + (srcSR * 0.169931039f); + dst[2] /* BL */ = (srcLFE * 0.034482758f) + (src[4] * 0.466344833f) + (srcSL * 0.433517247f); + dst[3] /* BR */ = (srcLFE * 0.034482758f) + (src[5] * 0.466344833f) + (srcSR * 0.433517247f); + } + +} + +static void SDL_Convert71To41(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("7.1", "4.1"); + + for (i = num_frames; i; i--, src += 8, dst += 5) { + const float srcFC = src[2]; + const float srcSL = src[6]; + const float srcSR = src[7]; + dst[0] /* FL */ = (src[0] * 0.483000010f) + (srcFC * 0.340999991f) + (srcSL * 0.175999999f); + dst[1] /* FR */ = (src[1] * 0.483000010f) + (srcFC * 0.340999991f) + (srcSR * 0.175999999f); + dst[2] /* LFE */ = src[3]; + dst[3] /* BL */ = (src[4] * 0.483000010f) + (srcSL * 0.449000001f); + dst[4] /* BR */ = (src[5] * 0.483000010f) + (srcSR * 0.449000001f); + } + +} + +static void SDL_Convert71To51(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("7.1", "5.1"); + + for (i = num_frames; i; i--, src += 8, dst += 6) { + const float srcSL = src[6]; + const float srcSR = src[7]; + dst[0] /* FL */ = (src[0] * 0.518000007f) + (srcSL * 0.188999996f); + dst[1] /* FR */ = (src[1] * 0.518000007f) + (srcSR * 0.188999996f); + dst[2] /* FC */ = (src[2] * 0.518000007f); + dst[3] /* LFE */ = src[3]; + dst[4] /* BL */ = (src[4] * 0.518000007f) + (srcSL * 0.481999993f); + dst[5] /* BR */ = (src[5] * 0.518000007f) + (srcSR * 0.481999993f); + } + +} + +static void SDL_Convert71To61(float *dst, const float *src, int num_frames) +{ + int i; + + LOG_DEBUG_AUDIO_CONVERT("7.1", "6.1"); + + for (i = num_frames; i; i--, src += 8, dst += 7) { + const float srcBL = src[4]; + const float srcBR = src[5]; + dst[0] /* FL */ = (src[0] * 0.541000009f); + dst[1] /* FR */ = (src[1] * 0.541000009f); + dst[2] /* FC */ = (src[2] * 0.541000009f); + dst[3] /* LFE */ = src[3]; + dst[4] /* BC */ = (srcBL * 0.287999988f) + (srcBR * 0.287999988f); + dst[5] /* SL */ = (srcBL * 0.458999991f) + (src[6] * 0.541000009f); + dst[6] /* SR */ = (srcBR * 0.458999991f) + (src[7] * 0.541000009f); + } + +} + +static const SDL_AudioChannelConverter channel_converters[8][8] = { // [from][to] + { NULL, SDL_ConvertMonoToStereo, SDL_ConvertMonoTo21, SDL_ConvertMonoToQuad, SDL_ConvertMonoTo41, SDL_ConvertMonoTo51, SDL_ConvertMonoTo61, SDL_ConvertMonoTo71 }, + { SDL_ConvertStereoToMono, NULL, SDL_ConvertStereoTo21, SDL_ConvertStereoToQuad, SDL_ConvertStereoTo41, SDL_ConvertStereoTo51, SDL_ConvertStereoTo61, SDL_ConvertStereoTo71 }, + { SDL_Convert21ToMono, SDL_Convert21ToStereo, NULL, SDL_Convert21ToQuad, SDL_Convert21To41, SDL_Convert21To51, SDL_Convert21To61, SDL_Convert21To71 }, + { SDL_ConvertQuadToMono, SDL_ConvertQuadToStereo, SDL_ConvertQuadTo21, NULL, SDL_ConvertQuadTo41, SDL_ConvertQuadTo51, SDL_ConvertQuadTo61, SDL_ConvertQuadTo71 }, + { SDL_Convert41ToMono, SDL_Convert41ToStereo, SDL_Convert41To21, SDL_Convert41ToQuad, NULL, SDL_Convert41To51, SDL_Convert41To61, SDL_Convert41To71 }, + { SDL_Convert51ToMono, SDL_Convert51ToStereo, SDL_Convert51To21, SDL_Convert51ToQuad, SDL_Convert51To41, NULL, SDL_Convert51To61, SDL_Convert51To71 }, + { SDL_Convert61ToMono, SDL_Convert61ToStereo, SDL_Convert61To21, SDL_Convert61ToQuad, SDL_Convert61To41, SDL_Convert61To51, NULL, SDL_Convert61To71 }, + { SDL_Convert71ToMono, SDL_Convert71ToStereo, SDL_Convert71To21, SDL_Convert71ToQuad, SDL_Convert71To41, SDL_Convert71To51, SDL_Convert71To61, NULL } +}; + -- cgit v1.2.3