Отрегулируйте длину буфера 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 вещи:

  1. Длина буфера будет меняться только на устройстве, поэтому не удивляйтесь, если вы измените его и не увидите никакой разницы на симуляторе.
  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 аргумента все еще работают. Вы должны изменить его, если, например, вам нужно установить обратный вызов прослушивателя прерываний.

Другие вопросы по тегам