2011-05-26 108 views
3

作为练习,我试图修改aurioTouch,以便通过麦克风节省前60秒的PCM。我正在避免更高级别的库,因为我想在此基础上构建一些低延迟的实时处理。我通过简单地创建一个大的saveBuffer,然后简单地追加存储在drawBuffers []中的data_ptr [2]值为每个“inNumberFrames”每次调用PerformThru ...然后,60秒后,我转储缓冲到磁盘一次。ios核心音频:修改aurioTouch以保存pcm数据

我尝试通过提供统一点击此代码。问题在于,当我在gnuplot中显示saveBuffer数据时,我会在非均匀时间出现峰值,从稳定点击中减少30-40%,这意味着某些峰值靠得很近,而其他峰值则相距甚远。我可以看到输入点击.wav并且它非常平均,但saveBuffer图具有奇怪的峰值。这让我怀疑我是否正确保存了pcm数据?也许我不知道如何花费太长时间并因此丢失数据?

在PerformThru()我有变化:

{ //分配缓冲区 静态INT * saveBuffer =(INT *)malloc的(10000000 *的sizeof(int)的); 。 。 。

SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData); 

    for (i=0; i<inNumberFrames; i++) 
    { 
     if ((i+drawBufferIdx) >= drawBufferLen) 
     { 
      cycleOscilloscopeLines(); 
      drawBufferIdx = -i; 
     } 
     drawBuffers[0][i + drawBufferIdx] = data_ptr[2]; 

     // XXXX I added this line 
     if (saveBuffer) { saveBuffer[ saveBufferIdx++ ] = (data_ptr[ 2 ]); } 


     data_ptr += 4; 
    } 

    // XXX - I added this block: dump saveBuffer after 60 seconds 
    if (saveBuffer && (CAHostTimeBase::HostDeltaToNanos(initialHostTime, inTimeStamp->mHostTime)/1000000000) > 60) 
    { 
     std::ofstream bufferOut; 
     bufferOut.open("pcmBuffer.txt"); 
     for (UInt64 i = 0; i < saveBufferIdx; i++) 
     { 
      bufferOut << saveBuffer[ i ] << std::endl; 
     } 
     bufferOut.close(); 
     free(saveBuffer); 
     saveBuffer = 0; 
    } 
    drawBufferIdx += inNumberFrames; 
} 

回答

0

使用CAMediaCurrentTime(媒体电流/当前媒体 - 我总是忘了这一轮的方式)

天哪这个​​源代码是屁股难看,谁写的,在苹果有很多写作方面的学习可读的代码。它实际上用作公共样本的事实只是一个笑话。

它看起来像你一切正常。你为什么不尝试禁用其他所有东西,只将样本送入缓冲区?

我在编写音高检测器时已经完成了这项工作,并且工作正常。一旦我有30秒的样本,我就把所有东西都打印到控制台上,就像保存到文件一样。

我真的认为从头开始编码可视化器有很多好处。 AurioTouch是一团糟,需要花费更长时间才能找出它的工作原理,然后才能真正建立一个。