進歩的な洞察のために質問を編集しました:-)
音声入力をリッスンするアプリを作成しています。ピークを数えてほしい。(ピークは約10 Hzの最大周波数になります。)
多くの検索を行った後、生の入力データを取得できるAudioQueueサービスを使用することになりました。SpeakHereの例の簡略版(再生なし)を使用していますが、単にファイルシステムにバッファーを書き込むのではなく、個々のサンプルデータを確認したいと思います。
私は今正しい方向に進んでいると思いますが、バッファの操作方法がわかりません。1つのサンプルのデータを分離しようとしています。次の関数のforループでは、それは意味がありますか?1つのサンプルを取得するには、そこに何を入れる必要がありますか?
void AQRecorder::MyInputBufferHandler( void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription* inPacketDesc)
{
// AudioQueue callback function, called when an input buffers has been filled.
AQRecorder *aqr = (AQRecorder *)inUserData;
try {
if (inNumPackets > 0) {
/* // write packets to file
XThrowIfError(AudioFileWritePackets(aqr->mRecordFile,FALSE,inBuffer->mAudioDataByteSize,inPacketDesc,aqr->mRecordPacket,&inNumPackets,inBuffer->mAudioData),
"AudioFileWritePackets failed");*/
SInt16 sample;
for (UInt32 sampleIndex=0; sampleIndex < inNumPackets; ++sampleIndex) {
// What do I put here to look at one sample at index sampleIndex ??
}
aqr->mRecordPacket += inNumPackets;
}
// if we're not stopping, re-enqueue the buffe so that it gets filled again
if (aqr->IsRunning())
XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL),
"AudioQueueEnqueueBuffer failed");
} catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
}
(多分私は元の質問の多くを削除するべきではありませんでした...ポリシーは何ですか?)
もともとはAurioTouchの例を使うことを考えていましたが、コメントで指摘されているように、スループットを使用しており、入力のみが必要です。また、SpeakHereよりもはるかに複雑な例です。