ExtAudioFileRead работает слишком медленно. Как сделать это быстрее?
Я написал свою собственную аудио библиотеку. (Глупо, я знаю, но мне это нравится.) Сейчас я использую его для воспроизведения стереофонических файлов из библиотеки iPod на iOS. Это работает хорошо, за исключением того, что иногда вызов ExtAudioFileRead() занимает больше 23 мс. Так как мои выходные настройки AudioUnits воспроизводят звук на частоте 44,1 кГц, и он запрашивает 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(), так что я знаю, что это не мой код, замедляющий этот процесс. Это должно быть проблема конфигурации, верно?
Большое спасибо за любую помощь или даже догадки!
Ура, Кристофер
1 ответ
Вы не должны читать из аудиофайла в вашем звуковом обратном вызове - вы должны буферизовать в другом потоке и передавать сэмплы.
Вы нарушаете кардинальное аудио правило № 4:
- Не делайте файловый или сетевой ввод-вывод в аудиопотоке. Нравится читать, написать или отправить.