ExtAudioFileRead 太慢了。如何让它更快?

ExtAudioFileRead is too slow. How to make it faster?

我已经编写了自己的音频库。 (愚蠢,我知道,但我喜欢它。)现在,我正在用它来播放 iOS 上 iPod 库中的立体声文件。除了有时对 ExtAudioFileRead() 的调用需要超过 23 毫秒之外,它运行良好。由于我的 AudioUnits 输出设置正在以 44.1KHz 播放音频,并且每个回调要求 1024 帧。我的代码 + ExtAudioFileRead() 的响应时间不得超过 23 毫秒。

我很惊讶 ExtAudioFileRead() 这么慢。我正在做的事情似乎很正常。我在想一定有一些我没有做的未记录的配置魔术。这是我的相关配置代码:

ExtAudioFileRef _extAudioFileRef;
OSStatus        result;

result = ::ExtAudioFileOpenURL((__bridge CFURLRef)_url, &_extAudioFileRef);

AudioStreamBasicDescription     format;

format.mBitsPerChannel = 8 * sizeof(float);
format.mBytesPerFrame = sizeof(float);
format.mBytesPerPacket = sizeof(float);
format.mChannelsPerFrame = channelCount;
format.mFormatFlags = kAudioFormatFlagIsFloat|kAudioFormatFlagIsNonInterleaved;
format.mFormatID = kAudioFormatLinearPCM;
format.mFramesPerPacket = 1;
format.mSampleRate = framesPerSecond;
result = ::ExtAudioFileSetProperty(_extAudioFileRef,
                                    kExtAudioFileProperty_ClientDataFormat,
                                    sizeof(format),
                                    &format);

我没有设置 _extAudioFileRef 的任何其他属性。

我已经追查到这到底是怎么回事了。我已经将时间测量放在我对 ExtAudioFileRead() 的调用周围,所以我知道这不是我的代码减慢了这个过程。应该是配置问题吧?

非常感谢您的帮助甚至猜测!

干杯, 克里斯托弗

您不应该在音频回调中读取音频文件 - 您应该在另一个线程中缓冲并传递样本。

你打破了cardinal audio rule #4

  1. Don’t do file or network IO on the audio thread. Like read, write or sendto.