How to get array of float audio data from AudioQueueRef in iOS?

前端 未结 2 1841
梦毁少年i
梦毁少年i 2020-12-14 04:09

I\'m working on getting audio into the iPhone in a form where I can pass it to a (C++) analysis algorithm. There are, of course, many options: the AudioQueue tutorial at tra

相关标签:
2条回答
  • 2020-12-14 04:17

    The above solution did not work for me, I was getting the wrong sample data itself.(an endian issue) If incase someone is getting wrong sample data in future, I hope this helps you :

    -(void)feedSamplesToEngine:(UInt32)audioDataBytesCapacity audioData:(void *)audioData { int sampleCount = audioDataBytesCapacity / sizeof(SAMPLE_TYPE);

    SAMPLE_TYPE *samples = (SAMPLE_TYPE*)audioData;
    //SAMPLE_TYPE *sample_le = (SAMPLE_TYPE *)malloc(sizeof(SAMPLE_TYPE)*sampleCount );//for swapping endians
    
    std::string shorts;
    double power = pow(2,10);
    for(int i = 0; i < sampleCount; i++)
    {
        SAMPLE_TYPE sample_le =  (0xff00 & (samples[i] << 8)) | (0x00ff & (samples[i] >> 8)) ; //Endianess issue
        char dataInterim[30];
        sprintf(dataInterim,"%f ", sample_le/power); // normalize it.
        shorts.append(dataInterim);
    }
    
    0 讨论(0)
  • 2020-12-14 04:22
      // 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;
    

    Then you have your (in this case SInt16) array samples which you can access from samples[0] to samples[sampleCount-1].

    0 讨论(0)
提交回复
热议问题