由于渐进的见解而编辑了问题:-)
我正在创建一个正在收听音频输入的应用程序。我希望它计算峰值。(峰值将在大约 10 Hz 的最大频率处。)
经过大量搜索,我最终使用了 AudioQueue 服务,因为它可以为我提供原始输入数据。我正在使用 SpeakHere 示例的精简版本(不播放),但不是简单地将缓冲区写入文件系统,我想查看单个样本数据。
认为我现在走在正确的轨道上,但我不明白如何使用缓冲区。我正在尝试隔离一个样本的数据。因此,以下函数中的 for 循环是否有意义,我应该在其中放入什么来获取一个样本?
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 复杂得多的例子。