如何让这个音频延迟工作?

时间:2012-06-27 19:10:10

标签: c++ arrays debugging audio pointers

我想要实现一个基本的音频延迟 - 但我得到的只是垃圾,可能非常明显 - 但我似乎无法发现它...

通过在运行时确定的缓冲区处理音频。

我认为我正在对指针做一些可怕的错误,尝试查看其他一些代码 - 但它们似乎都“不完整”总是缺少基本的东西 - 也许我的代码中也错过了。

// 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 个答案:

答案 0 :(得分:2)

您尚未初始化p。此代码中需要注意的其他事项: -

  • 您确定sampleFrames + bufferOffset是否小于输入和输出缓冲区的大小?你可以用一种方法来检查它。
  • 目前尚不清楚buffer来自哪里,或者其他什么可能写给它。如果在你的代码运行之前它是垃圾,你到处都会遇到垃圾,因为你做的第一件事就是从中读取。
  • 您没有说明pinInput1.getBuffer()等类型的回复。如果它们返回char*,并且您只知道它恰好指向一个浮点数组,则需要在进行任何指针算法之前将结果转换为float* ,以确保你前进到数组中的下一个浮点数,而不是数组的下一个字节。