2010-12-14 18 views
1

我目前正试图采取的声音并反馈到扬声器。我使用的是使这非常简单的openframeworks库。喂食声音从直接输入到输出,听起来干净C++

我使用这个类

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; 

     } 

    } 
} 

这是工作,但质量似乎罂粟和crackly。我想我可能不得不实施一个适当的循环缓冲区,或双缓冲区,但我不确定。

任何人都可以点我对我怎么可以得到音频好听的正确方向,用简单的方法尽可能?

回答

2

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

通常,当音频接收你将它添加到缓冲区1音频时要求你给它缓冲2.现在,当接收到的音频把它放在缓冲区2且当该请求到达时给它缓冲区1等等。

+0

而不是2个独立的缓冲剂,可以我只使用一个单一的较大的缓冲区,并且只在阵列中使用不同的位置?还是有一些性能问题呢?在移动数组时,还应该使用单独的指针,还是可以使用相同的指针? – 2010-12-15 00:09:02

+0

我没有得到这条底线,所以我将不得不等待,直到我可以在此工作了。谢谢。 – 2011-06-05 11:38:26