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