我一直在使用Vinne Falco的SDL2_Mixer和DSPFilters开发自己的3D音频库。
目前,我正处于需要创建自定义DSP来过滤音频的阶段,而SDL_mixer负责效果的注册,事实证明实际的DSP很难。
SDL提供:

void Effect(int chan, void* stream, int len, void* udata){}
在这里,我们有一个相关的音频流,stream [0L],stream [0R],stream [1L]等。
我尝试将其分解为单独的 channel :
    float *p = (float*)stream;
    int length = len / 2;

    float* audioData[2];
    audioData[0] = new float[length];
    audioData[1] = new float[length];

    for (int i = 0; i < len; i++)
    {
        if (i %2 == 0)
        {
            audioData[0][i / 2] = p[i];
        }
        else
        {
            audioData[1][(i - 1) / 2] = p[i];
        }
    }
拆分为通道后,将由过滤器成功处理。
一切都很好,但是我现在需要将其重新组合为流或如何直接处理流数据。尝试了许多方法,但大多数方法最终导致访问冲突或堆损坏。
编辑1:重组阶段:
    ///Combine output///
    for (int i = 0; i < length; i++)
    {
        p[i*2]=audioData[0][i];
        p[(i*2)+1]=audioData[1][i];
    }
有人可以在中向我指出一个更好的处理流的方向,还是在此代码摘录中进行修复?

最佳答案


这是keltar提供的答案,它可以解决访问冲突。
(它是在一个单独的简化问题上提供的)

10-05 19:44