2011-05-26 6 views
3

練習として、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; 
} 

答えて

0

使用CAMediaCurrentTime(メディア電流/現在のメディア - 私はいつも道のラウンドを忘れてしまった)

おやっ、このソースコード尻醜いです、誰アップルでそれを書いたことを書いているという点で学ぶためにたくさん持っています読み取り可能なコード。パブリックサンプルとして実際に使用されているという事実は単なる冗談です。

すべてのことを正しく行っているようです。なぜあなたは他のすべての機能を無効にして、サンプルをあなたのバッファに送ってみませんか?

ピッチ検出器を作成していて、うまくいきました。 30秒間のサンプルを取得したら、ファイルに保存するだけで、すべてをコンソールに表示しました。

私は本当に、視覚化装置を最初からコーディングする方がはるかにメリットがあると思います。 AurioTouchは混乱しており、実際にどのように動作するかを理解するのに時間がかかります。

関連する問題