Estou tentando gerar dados de som, convertê-los e armazená-los em um formato WAV. Eu estou quase lá - exceto que eu gostaria de ouvir o som gerado "while" sendo "gravado".
Esta linha de comando apenas gera dados e os reproduz:
perl -e 'for ($c=0; $c<4*44100; $c++) {
$k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
} ' |
aplay -t raw -c 1 -r 44100 -f FLOAT_LE
(Note que se você pressionar Ctrl-C aqui depois que o som parar, aplay
may segfault)
Usando sox
e mplayer
, posso gravar bem, mas não ouço nenhum som ao mesmo tempo:
perl -e 'for ($c=0; $c<4*44100; $c++) {
$k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
} ' |
sox -V -r 44100 -c 1 -b 32 -e floating-point -t raw - \
-c 2 -b 16 -t wav - trim 0 3 gain -1 dither |
mplayer - -cache 8092 -endpos 3 -vo null -ao pcm:waveheader:file=test.wav
Observe que play test.wav
(onde play
é de sox
package, não alsa
' aplay
) informará "Duration: 00: 00: 03.00" para o arquivo test.wav
. Além disso, este processo parece correr mais rápido do que em tempo real (isto é, conclui em (aparentemente) menos de 3 segundos).
Ao tentar enganar usando tee
para capturar o fluxo em disco,
perl -e 'for ($c=0; $c<4*44100; $c++) {
$k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
} ' |
sox -V -r 44100 -c 1 -b 32 -e floating-point -t raw - \
-c 2 -b 16 -t wav - trim 0 3 gain -1 dither |
tee test.wav |
aplay
Aqui, aparentemente, eu ouço o som enquanto ele é gerado - e test.wav
é jogável também, no entanto, play test.wav
reportará "Duration: unknown".
Então, eu gostaria de perguntar - é possível fazer algo como a linha de comando "one-liner" acima, para gerar, tocar e gravar um som "ao mesmo tempo" - no entanto, sem a necessidade de instalar jack
?
PS: alguns links relevantes: