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++;
    }
}

谁能告诉我怎么了?

4

1 回答 1

2

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

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