如何让这个音频延迟生效?

3
我正在尝试实现基本的音频延迟,但我得到的只是垃圾数据,可能是一些非常显而易见的问题,但我似乎无法发现它...
音频通过在运行时确定大小的缓冲区进行处理。
我认为我在指针方面做错了什么,尝试查看其他代码 - 但它们都似乎"不完整",总是缺少一些基本的东西 - 可能也是我的代码中缺少的东西。
// Process audio
// 1
void Gain::subProcessSimpleDelay( int bufferOffset, int sampleFrames )
{
    // Assign pointers to your in/output buffers. 
    // Each buffer is an array of float samples.
    float* in1  = bufferOffset + pinInput1.getBuffer();
    float* in2  = bufferOffset + pinInput2.getBuffer();
    float* out1 = bufferOffset + pinOutput1.getBuffer();

    // SampleFrames = how many samples to process (can vary). 
    // Repeat (loop) that many times
    for( int s = sampleFrames; s > 0; --s ) 
    {
        // get the sample 'POINTED TO' by in1.
        float input1 = *in1;    

        float feedback = *in2;
        float output;
        unsigned short int p, r;
        unsigned short int len;
        len =  600;

        // check at delay length calculation
        if (len > 65535) 
            len = 65535; 
        // otherwise, a length of 0 will output the input from 
        // 65536 samples ago
        else if (len < 1) 
            len = 1; 

        r = p - len; // loop
        output = buffer[r];
        buffer[p] = input1 + output * feedback;
        p++;

        *out1 = output;

        // store the result in the output buffer.
        // increment the pointers (move to next sample in buffers).
        in1++;
        in2++;
        out1++;
    }
}

有人能告诉我出了什么问题吗?

1个回答

2

您没有初始化p。在此代码中需要注意的其他事项:

  • 您确定sampleFrames + bufferOffset小于输入和输出缓冲区的大小吗?您确实需要一种检查的方法。
  • 不清楚buffer来自何处,或者还有什么其他东西可能会写入它。如果在您的代码运行之前它是垃圾,那么您最终会得到垃圾数据,因为您首先要从它读取数据。
  • 您没有说明pinInput1.getBuffer()等返回的类型。如果它们返回一个char*,并且您只知道它恰好指向一个浮点数数组,则需要在进行任何指针算术之前将结果强制转换为float*,以确保您正在前进到数组中的下一个浮点数,而不是数组的下一个字节。

嗨 - 忘了说 - 问题在于for循环中。这段代码是为了一个.dll而写的 - 用于流式传输音频float in -> float out - pinInput1.getBuffer()只是标准调用约定。缓冲区应该是循环延迟缓冲区 -> 在.h文件中初始化为float buffer[65536]。 - ichad.c
你是对的!p没有被正确初始化 - r也是一样!它们需要单独的初始化 - 因为它们需要一个1个样本延迟才能成为“随意”的。我真是个笨蛋;-)感谢你的帮助! - ichad.c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接