Как получить меньший размер буфера в многоканальном аудиоприложении с Oboe
Я использую Oboe 1.2 в аудио-приложении для Android. Когда я вызываю getFramesPerBurst(), который дает размер буфера конечной точки, я получаю ожидаемые результаты (240 кадров), если число выходных каналов установлено на 2. Однако когда я устанавливаю 4 выходных канала, значение, возвращаемое getFramesPerBurst(), составляет около 960 (!). Это нормально? Это ограничение аппаратного обеспечения (хотя я тестировал на 4 разных устройствах, с другой версией ОС)? Ограничение гобоя? Я также заметил, что это значение отличается от значения, заданного свойством PROPERTY_OUTPUT_FRAMES_PER_BUFFER AudioManager из AudioService.
oboe::AudioStreamBuilder builder;
if (!oboe::AudioStreamBuilder::isAAudioRecommended()){
builder.setAudioApi(oboe::AudioApi::OpenSLES);
}
builder.setSharingMode(oboe::SharingMode::Exclusive);
builder.setFormat(oboe::AudioFormat::Float);
builder.setChannelCount(4);
builder.setCallback(&_oboeCallback);
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);
oboe::Result result = builder.openStream(&_stream);
if (result == oboe::Result::OK) {
int framePerBurst = _stream->getFramesPerBurst(); // gives value around 960 for 4 channels, 240 for 2 channels
_stream->setBufferSizeInFrames(2*framePerBurst);
}
0 ответов
Если вы не подключаетесь к аудиоустройству, которое на самом деле имеет 4 независимых канала (например, аудиоинтерфейс USB или DJ-контроллер, подобный этому), тогда ваш 4-канальный поток необходимо будет микшировать в поток N каналов, где N - количество каналов в ваше аудиоустройство. Это может быть 2 (стерео) для наушников или 1 (моно) для встроенного динамика.
Микшер обеспечивает задержку и больший размер буфера. Это разница в размерах буфера, которую вы видите, когда запрашиваете количество каналов 2 против 4.
Для минимальной задержки всегда оставляйте количество каналов неопределенным при создании потока, а затем выполняйте любое преобразование количества каналов в своем собственном приложении. Вот пример этого.