Почему portaudio возвращает обратные вызовы в пакетном режиме?

Я работаю с примером программы записи, которая доступна здесь на веб-сайте portaudio. И я запутался в том, как увеличивается индекс кадра

Учитывая, что размер буфера составляет 512 кадров, а частота дискретизации установлена ​​на 44100 Гц, можно предположить, что программа работает через буфер, возвращает обратный вызов и увеличивает индекс кадра примерно на 512 примерно каждые 11,6 мс. В main() у меня есть программа, выводящая текущий индекс кадра каждые 12 мс (в отличие от каждых 1000 мс, как в примере, но остальная часть моего кода идентична их), и я предположил, что он будет увеличиваться на 512 с каждым линия вывода, но это не так. Это кусок вывода:

index at 12 ms = 0
index at 24 ms = 0
index at 36 ms = 1024
index at 48 ms = 1024
index at 60 ms = 2048
index at 72 ms = 2048
index at 84 ms = 2048
index at 96 ms = 3072
index at 108 ms = 3072
index at 120 ms = 3072
index at 132 ms = 4096
index at 144 ms = 4096
index at 156 ms = 4096
index at 168 ms = 5120
index at 180 ms = 5120
index at 192 ms = 5120
index at 204 ms = 6144
index at 216 ms = 7680

Как видите, это увеличивается странным образом. Индекс остается от 0 до 36 мсек, где он затем прыгает до 1024, а затем индекс внезапно увеличивается с 1024 до 2048 при 60 мс. Увеличение индекса - это не то, чего от него ожидают, и это также противоречиво. Вы заметите, что для увеличения индекса от 1024 до 2048 требуется 24 мс, а затем для увеличения от 2048 до 3072 - 36 мс, а затем для увеличения от 6144 до 7680 - только 12 мс.

У меня вопрос: что здесь происходит и что я могу сделать, чтобы результаты происходили с более постоянной скоростью? Возможно, это связано с размером аудио буфера ALSA?

1 ответ

Размер буфера обратного вызова PortAudio не обязательно является размером буфера хоста. Отношения между ними сложны, потому что не все хост-API поддерживают все размеры буфера, но PortAudio будет "адаптироваться" для поддержки запрошенного размера буфера обратного вызова.

PortAudio вычисляет размер буфера хоста, используя алгоритм, который включает в себя несколько ограничений, включая: размер буфера пользователя, запрошенную задержку, поддерживаемые размеры буфера хоста и эвристику.

Например, если вы запрашиваете очень маленький размер буфера обратного вызова, но большую задержку, вероятно, что PortAudio будет использовать больший размер буфера хоста, и вы можете наблюдать прерывистые обратные вызовы. Это похоже на то, что происходит для вас: размер буфера хоста 1024 кадра, но размер буфера обратного вызова PA 512 кадров.

В моем ответе больше информации: время между обратными вызовами?

Что я могу сделать, чтобы вывод происходил с более постоянной скоростью?

Запросите меньшую задержку в соответствующих параметрах для Pa_OpenStream().

Для некоторых хост-API PortAudio также существует специальный механизм хост-API для принудительной установки размера буфера хоста. Я не уверен, что ALSA предоставляет такую ​​возможность.

Кроме того, вы можете использовать paFramesPerBufferUnspecified опция, которая должна приводить к более регулярным обратным вызовам при любом размере буфера, согласованного PortAudio и ALSA на основе запрошенной вами задержки.

Обратите внимание, что может быть какая-то специфичная для ALSA или устройства причина, по которой вы получаете 1024 кадровых буфера хоста. Но я бы попробовал вышеупомянутое сначала.

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