Отрегулируйте длину буфера AudioUnit
Моя проблема касается AudioUnits. Чтобы создать приложение для изменения голоса для iPhone (с Objective-C xCode), я использую образец RemoteIO audioUnit с этого сайта:
http://atastypixel.com/blog/using-remoteio-audio-unit/
Буферы audioUnit имеют длину 256 выборок. Для моего проекта мне нужно много больше (около 22050). На цитируемой странице сказано, что длина буферов audioUnit может быть отрегулирована следующим образом:
float aBufferLength = 0.005; // In seconds
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,
sizeof(aBufferLength), &aBufferLength);
Теперь мой конкретный вопрос: приведенный выше код не подходит для упомянутого audioUnit, потому что AudioSession не используется, никогда не инициализируется и поэтому выдает ошибку. Есть ли другая возможность изменить длительность буфера, кроме "kAudioSessionProperty_PreferredHardwareIOBufferDuration"? Документация в этом случае не совсем полезна... Заранее спасибо, Лукас.
1 ответ
Нет проблем в определении и инициализации AudioSession
с RemoteIO
Аудиоустройство, и это способ установить желаемую длину буфера. У меня есть какой-то код, делающий именно это, но мне потребуется несколько часов, пока я вернусь домой и смогу опубликовать его. Вы можете посмотреть образец кода Apple AurioTouch или подождать, пока я не опубликую его позже.
В любом случае имейте в виду 2 вещи:
- Длина буфера будет меняться только на устройстве, поэтому не удивляйтесь, если вы измените его и не увидите никакой разницы на симуляторе.
- Вы не можете получить желаемую длину буфера - поэтому свойство называется
PreferredHardwareIOBufferDuration
, Размер буфера всегда является степенью 2.
Имея это в виду, вы рассматривали вопрос о выделении своего собственного буфера и его накоплении до тех пор, пока у вас не будет желаемого количества выборок?
РЕДАКТИРОВАТЬ
Код для инициализации аудио сеанса (должен идти до инициализации аудиоустройства):
OSStatus result;
result = AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory);
// set preferred buffer size
Float32 preferredBufferSize = .04; // in seconds
result = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize);
// get actuall buffer size
Float32 audioBufferSize;
UInt32 size = sizeof (audioBufferSize);
result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &audioBufferSize);
result = AudioSessionSetActive(true);
Вы можете / должны проверить result
после каждого звонка, чтобы искать возможные ошибки. Вы можете прочитать документацию для AudioSessionInitialize
для получения дополнительной информации, но прохождение NULL
для всех 4 аргумента все еще работают. Вы должны изменить его, если, например, вам нужно установить обратный вызов прослушивателя прерываний.