/*
  Simple DirectMedia Layer
  Copyright (C) 1997-2026 Sam Lantinga <slouken@libsdl.org>

  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 }
};

