使用 SDL2_mixer 效果时访问冲突?

Posted

技术标签:

【中文标题】使用 SDL2_mixer 效果时访问冲突?【英文标题】:Access Violation when using SDL2_mixer effects? 【发布时间】:2020-07-20 18:42:07 【问题描述】:

我一直在使用 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]等...... 我试过把它分解成不同的渠道:

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

谁能指出我处理流的更好方向或解决这段代码的问题?

【问题讨论】:

您应该显示您为重组部分尝试的代码,您有访问冲突。 minimal reproducible example 你是对的,我今天能够隔离代码的某些部分,所以我将删除并重新发布一个更好的问题。 【参考方案1】:

我很确定 len 是字节,而不是浮点元素。您可以使用 len/sizeof(float)。 – 凯尔塔

这是 keltar 提供的答案,它修复了访问冲突。 (它是在一个单独的简化问题上提供的)

【讨论】:

以上是关于使用 SDL2_mixer 效果时访问冲突?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Microsoft Detours 时访问冲突

访问dll方法时访问冲突读取位置

使用 DLL 函数时的访问冲突异常

使用 GLFW + GLEW 时 glGenFramebuffers() 访问冲突

使用 alloca 时访问冲突

例外:使用 strcpy_s 时访问冲突写入位置