Отрегулируйте длину буфера AudioUnit


person Lukas    schedule 01.02.2011    source источник
comment
Я добавил соответствующий код в свой ответ.   -  person Itamar Katz    schedule 01.02.2011


Ответы (1)


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

person Itamar Katz    schedule 01.02.2011
comment
Спасибо за этот полезный ответ! Я немедленно испытаю это и опубликую свои впечатления. Но мне трудно поверить, что длина буфера меняется только на устройстве... Что, если последовательной функции нужен длинный буфер в качестве входных данных? Означает ли это, что он не будет работать должным образом в симуляторе, но отлично работает на iphone? - person Lukas; 01.02.2011
comment
Что вы имеете в виду под successive function? В любом случае, звуковое оборудование не заботится о ваших потребностях - все, что оно знает, это попросить вас дать ему N сэмплов для воспроизведения (в обратном вызове воспроизведения), когда ему нужно, или предоставить вам N семплов для обработки (в записи). Перезвони). Если вам нужно больше, вы должны накопить и подождать, пока у вас не будет достаточно. - person Itamar Katz; 01.02.2011