PulseAudio не может читать буферы с постоянной скоростью - PullRequest
1 голос
/ 19 мая 2019

Я хочу записать свой микрофон и обработать в режиме реального времени, например. показать осциллографом вид сигнала микрофона.

Я пробовал 3 способа извлечь данные из PulseAudio, и все они работают одинаково. Я ожидаю плавный поток двоичных файлов, но вместо этого есть пример, примерно такой: зависание на ~ 300 мс, вывод тонны вывода, повтор.
3 разных способа, 2 разных машины, одинаковые результаты.

1-й путь был parec.

2-й и 3-й путь - это привет миры в C и Haskell, оба используют библиотеку pulse-simple.

C: https://freedesktop.org/software/pulseaudio/doxygen/parec-simple_8c-example.html#a7

Haskell:

import Sound.Pulse.Simple
import Control.Monad
import System.IO

main = do

  s <- simpleNew Nothing "example" Record Nothing
       "this is an example application"
       (SampleSpec (F32 LittleEndian) 44100 1) Nothing Nothing


  forever $ do

  let numSamples = 4410
  xs <- simpleRead s $ numSamples :: IO [Float]

  putStrLn $ "hello"

  hFlush stdout

Промывка стандартного вывода в теле петли не имеет значения.
Добавление задержки в цикл изменяет производительность, но не соответствует желаемому.

Каким-то образом pavucontrol VU метр понимает это правильно. Чего мне не хватает?

EDIT: я обнаружил, что во время работы pavucontrol я получаю отличные результаты, как в моих примерах программ, так и с parec. Почему ??

Кроме того, я посмотрел на источник pavucontrol и parec, и оказалось, что они оба используют API asynchronous, а мои 2 примера программ используют API simple. Таким образом, проблема не полностью связана с использованием одного API или другого, поскольку parec ведет себя как примеры программ.

...