我正在尝试接收声音并将其反馈给扬声器。我正在使用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;
}
}
}
这是有效的,但质量似乎罂粟和脆弱。我想我可能需要实现一个合适的循环缓冲区,或者双缓冲,但我不确定。
有没有人能指出我正确的方向,我可以使用尽可能简单的方法让音频听起来不错?
答案 0 :(得分:2)
我肯定建议使用双缓冲。否则,缓冲区在您需要缓冲区的同时变为可用。这可能导致您编辑当前正在使用的缓冲区。
通常,当收到音频时,你将它添加到缓冲区1.当请求音频时,你给它缓冲区2.现在收到音频时把它放在缓冲区2中,当请求到达时给它缓冲区1.依此类推。