MattGallagherのAudioStreamerを使用してmp3オーディオストリームを再生しています。次に、リアルタイムでFFTを実行し、iPhoneでOpenGLESを使用して周波数を視覚化します。
オーディオデータをどこでキャッチして「Super-Fancy-FFT-Computing-3D-Visualization-Method」に渡すのか疑問に思っています。MattはAudioQueueFrameworkを使用しており、次のように設定されたコールバック関数があります。
err = AudioQueueNewOutput(&asbd, ASAudioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue);
コールバックは次のようになります。
static void ASAudioQueueOutputCallback(void* inClientData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer){...}
現時点では、AudioQueueBufferRefからデータを渡していますが、結果は非常に奇妙に見えます。しかし、FFTと視覚化では、それを台無しにする可能性のあるポイントが非常に多いため、少なくとも適切なデータをFFTに渡すようにしたかったのです。1つのチャネルのみを分析したいので、1秒おきの値を無視してこの方法でバッファからデータを読み取っています。
SInt32* buffPointer = (SInt32*)inBuffer->mAudioData;
int count = 0;
for (int i = 0; i < inBuffer->mAudioDataByteSize/2; i++) {
myBuffer[i] = buffPointer[count];
count += 2;
}
次に、512個の値を含むmyBufferを使用したFFT計算に従います。