从输入直接输入音频到输出,听起来干净的c ++

时间:2010-12-14 23:17:38

标签: c++ audio

我正在尝试接收声音并将其反馈给扬声器。我正在使用openframeworks库,这使得它非常简单。

我正在使用这个课程

http://www.openframeworks.cc/documentation?detail=ofSoundStream

设置功能

ofSoundStreamSetup(int nOutputs, int nInputs, ofSimpleApp * OFSA, int sampleRate, int bufferSize, int nBuffers)

我正在使用

ofSoundStreamSetup(1, 1, this, 44100, 512, 4)

我的标题信息是

float buffer1[1000000];
float buffer2[1000000]; 

float* readPointer;
float* writePointer;
int readp;
int writep;

我有两个功能

audioReceived (float * input, int bufferSize, int nChannels)

if (writep < 10)
    {

    for (int i = 0;i < bufferSize; i++)
        {
                     writePointer[writep*i] = input[i];
        }           

            writep++;

        if (writep >= 10)
        {               
            writep = 0; 
        }
    }


audioRequested(float * output, int buffersize, int numChannels)
{
if (writep > 0)
    {
        for (int i = 0; i < bufferSize; i++)
            {
                output[i] = readPointer[readp * i];
            }


        readp++;

        if (readp >=10)
        {
            readp = 0;

        }

    }
}

这是有效的,但质量似乎罂粟和脆弱。我想我可能需要实现一个合适的循环缓冲区,或者双缓冲,但我不确定。

有没有人能指出我正确的方向,我可以使用尽可能简单的方法让音频听起来不错?

1 个答案:

答案 0 :(得分:2)

我肯定建议使用双缓冲。否则,缓冲区在您需要缓冲区的同时变为可用。这可能导致您编辑当前正在使用的缓冲区。

通常,当收到音频时,你将它添加到缓冲区1.当请求音频时,你给它缓冲区2.现在收到音频时把它放在缓冲区2中,当请求到达时给它缓冲区1.依此类推。