Я хочу записать свой микрофон и обработать в режиме реального времени, например. показать осциллографом вид сигнала микрофона.
Я пробовал 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
ведет себя как примеры программ.