練習として、aurioTouchを変更して、マイクから入ってきた最初の60秒間のPCMを保存しようとしています。私は、これに加えて、低遅延のリアルタイム処理をいくつか構築したいので、より高レベルのライブラリを避けています。私はこれを単純に大きなsaveBufferを作成した後、drawBuffers []に格納された各 "inNumberFrames"の値をPerformThruに追加するだけで、これを行いました。その後、60秒が経過した後、ワンショットでディスクにバッファリングする。ios core audio: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;
}