使用 SDL2_mixer 效果时出现访问冲突?
Access Violation when using SDL2_mixer effects?
我一直在使用 SDL2_Mixer 和 Vinne Falco 的 DSPFilters 开发我自己的 3D 音频库。
目前我正处于需要创建自定义 DSP 来过滤音频的阶段,而 SDL_mixer 负责效果器的注册,实际的 DSP 被证明是困难的。
SDL 提供:
void Effect(int chan, void* stream, int len, void* udata){}
从这里我们有一个交错的音频流,stream[0L],stream[0R],stream[1L],等等...
我试过将它分解成单独的频道:
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];
}
}
一旦拆分成通道,过滤器就会成功处理它。
这一切都很好,但我现在需要将其重新组合成流或如何直接处理流数据。尝试了多种方法,但大多数都以访问冲突或堆损坏告终。
EDIT1: 重组阶段:
///Combine output///
for (int i = 0; i < length; i++)
{
p[i*2]=audioData[0][i];
p[(i*2)+1]=audioData[1][i];
}
谁能给我指出处理流的更好方向或修复这段代码的方法?
I'm pretty sure len is in bytes, not in float elements. You could use len/sizeof(float). – keltar
这是 keltar 提供的答案,修复了访问冲突。
(它是在一个单独的简化问题上提供的)
我一直在使用 SDL2_Mixer 和 Vinne Falco 的 DSPFilters 开发我自己的 3D 音频库。 目前我正处于需要创建自定义 DSP 来过滤音频的阶段,而 SDL_mixer 负责效果器的注册,实际的 DSP 被证明是困难的。
SDL 提供:
void Effect(int chan, void* stream, int len, void* udata){}
从这里我们有一个交错的音频流,stream[0L],stream[0R],stream[1L],等等... 我试过将它分解成单独的频道:
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];
}
}
一旦拆分成通道,过滤器就会成功处理它。 这一切都很好,但我现在需要将其重新组合成流或如何直接处理流数据。尝试了多种方法,但大多数都以访问冲突或堆损坏告终。
EDIT1: 重组阶段:
///Combine output///
for (int i = 0; i < length; i++)
{
p[i*2]=audioData[0][i];
p[(i*2)+1]=audioData[1][i];
}
谁能给我指出处理流的更好方向或修复这段代码的方法?
I'm pretty sure len is in bytes, not in float elements. You could use len/sizeof(float). – keltar
这是 keltar 提供的答案,修复了访问冲突。 (它是在一个单独的简化问题上提供的)