作为练习,我试图修改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;
}