Отрегулируйте длину буфера AudioUnit - PullRequest
4 голосов
/ 01 февраля 2011

Моя проблема касается 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 Ответ

8 голосов
/ 01 февраля 2011

Нет проблем в определении и инициализации AudioSession с помощью RemoteIO Audio-Unit, и это способ установить желаемую длину буфера.У меня есть код, делающий именно это, но мне понадобится несколько часов, пока я вернусь домой и смогу опубликовать его.Вы можете посмотреть образец кода Apple от Apple или подождать, пока я не опубликую его позже.

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

...