Почему 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 кадровых буфера хоста. Но я бы попробовал вышеупомянутое сначала.