如何从iOS中的AudioQueueRef获取浮点音频数据数组?

bui*_*ded 13 objective-c core-audio avaudiorecorder audioqueue ios

我正在努力将音频传输到iPhone中,我可以将其传递给(C++)分析算法.当然,有很多选择:在trailinthes上的AudioQueue教程开始工作.

然而,音频回调给出了一个AudioQueueRef,我发现Apple的文档在这方面很薄.内置方法可以写入文件,但实际上您不会在数据包内部查找数据.

我需要数据.我不想在文件中写任何内容,这就是所有教程 - 甚至Apple的便利I/O对象 - 似乎都是针对的.Apple AVAudioRecorder(激怒)会给你级别并写入数据,但实际上并没有让你访问它.除非我遗漏了什么......

这该怎么做?在下面的代码中有inBuffer->mAudioData一个非常接近,但我找不到有关这个'数据'的格式或如何访问它的信息.

AudioQueue回调:

void AudioInputCallback(void *inUserData,
    AudioQueueRef inAQ,
    AudioQueueBufferRef inBuffer,
    const AudioTimeStamp *inStartTime,
    UInt32 inNumberPacketDescriptions,
    const AudioStreamPacketDescription *inPacketDescs)
{
    static int count = 0;
    RecordState* recordState = (RecordState*)inUserData;    
    AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL);

    ++count;
    printf("Got buffer %d\n", count);
}
Run Code Online (Sandbox Code Playgroud)

以及将音频写入文件的代码:

OSStatus status = AudioFileWritePackets(recordState->audioFile,
                false,
                inBuffer->mAudioDataByteSize,
                inPacketDescs,
                recordState->currentPacket,
                &inNumberPacketDescriptions,
                inBuffer->mAudioData); // THIS! This is what I want to look inside of.
if(status == 0)
{
     recordState->currentPacket += inNumberPacketDescriptions;
}
Run Code Online (Sandbox Code Playgroud)

bui*_*ded 10

  // so you don't have to hunt them all down when you decide to switch to float: 
  #define AUDIO_DATA_TYPE_FORMAT SInt16

  // the actual sample-grabbing code:
  int sampleCount = inBuffer->mAudioDataBytesCapacity / sizeof(AUDIO_DATA_TYPE_FORMAT);
  AUDIO_DATA_TYPE_FORMAT *samples = (AUDIO_DATA_TYPE_FORMAT*)inBuffer->mAudioData;
Run Code Online (Sandbox Code Playgroud)

然后,你有你的(这种情况下SInt16)阵列samples,你可以从访问samples[0]samples[sampleCount-1].