我一直在使用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提供的答案,它可以解决访问冲突。
(它是在一个单独的简化问题上提供的)