Como encaminhar o dispositivo de áudio de pulso para um loopback (microfone virtual)?

1

Eu quero um aplicativo flash que queira gravar meu microfone (algo como link ) para gravar uma fonte de áudio de pulso.

Eu percebi que o flash usa o ALSA. Então, instalei o dispositivo de loop Alsa sudo modprobe snd-aloop , que apareceu nitidamente em pavucontrol e em alplay -l (no final da listagem):

adam@adam-g551jm:~ 130 $ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0] Subdevices: 0/1 Subdevice #0: subdevice #0 card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: PCH [HDA Intel PCH], device 0: ALC668 Analog [ALC668 Analog] Subdevices: 0/1 Subdevice #0: subdevice #0 card 2: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM] Subdevices: 7/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7 card 2: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM] Subdevices: 8/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7

Depois confirmei que o som é encaminhado para o dispositivo de loopback:

Infelizmente, o plugin flash não vê o som - como se eu estivesse gravando zeros.

O plugin Flash vê todas as fontes de som voltadas para o ALSA:

  1. Por que não há som visível para o plug-in do Flash?
  2. O que fazer para rotear a saída de um pulso de áudio na entrada ALSA?
por Adam Ryczkowski 21.03.2017 / 10:31

1 resposta

3

A resposta simples é no final. Mas, para ajudar a entender a solução, tentarei ser o mais inteligível possível. Minha suposição: "Dispositivo de loopback" é a placa nº 2, dispositivo nº 0 e nº 1, portanto, em todos os exemplos, isso vale (por exemplo, /dev/snd/pcmC2D0p significa "cartão 2, dispositivo 0, reprodução"). Sua instalação pode variar, então modifique os valores respectivos.

Primeiro, criei / modifiquei /etc/modprobe.d/alsa-aloop.conf para ter apenas um cartão com apenas um substream (apenas para simplificar):

user@desk:~$ cat /etc/modprobe.d/alsa-aloop.conf 
options snd-aloop index=2 pcm_substreams=1 id=Loopback

Depois de sudo modprobe snd_aloop , aplay -l e arecord -l show

user@desk:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
.
.
card 2: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 2: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

user@desk:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 2: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Agora, há um problema: os dois dispositivos da placa de loopback são dispositivos de reprodução e gravação. Mas a função de snd_aloop é rotear a entrada no dispositivo 0 para a saída no dispositivo 1 e vice-versa (ver, por exemplo, link ). Você pode ver isso no diretório /proc/asound :

user@desk:~$ ls /proc/asound/card2
cable#0  cable#1  id  pcm0c  pcm0p  pcm1c  pcm1p

onde "pcm0c" é o dispositivo de captura 0, "pcm0p" é o dispositivo de reprodução 0, etc.

Portanto, pavucontrol mostra (e seleciona) dois dispositivos de loop, uma reprodução (hw: 2,0) e um registro (hw: 2,1):

Você não pode selecionar o dispositivo de reprodução em pavucontrol , então ele seleciona o dispositivo 0:

Você verá isso ao loking no arquivo do dispositivo de reprodução:

user@desk:~$ lsof | grep /dev/snd/pcmC2
pulseaudi 3314               user  mem       CHR             116,13                 556 /dev/snd/pcmC2D0p
pulseaudi 3314               user   48u      CHR             116,13      0t0        556 /dev/snd/pcmC2D0p
alsa-sink 3314 3320          user  mem       CHR             116,13                 556 /dev/snd/pcmC2D0p
alsa-sink 3314 3320          user   48u      CHR             116,13      0t0        556 /dev/snd/pcmC2D0p
.
.

Então, isso significa que a captura desse fluxo de áudio deve ser feita via /dev/snd/pcmC2D1c ; se você selecionar loopback como o dispositivo de entrada para flash, ele usará /dev/snd/pcmC2D0c ( plugin-co significa que o flash do contêiner de plug-in está sendo executado):

user@desk:~$ lsof | grep /dev/snd/pcmC2
pulseaudi 3314               user  mem       CHR             116,13                 556 /dev/snd/pcmC2D0p
pulseaudi 3314               user   48u      CHR             116,13      0t0        556 /dev/snd/pcmC2D0p
.
.
plugin-co 5093               user  mem       CHR             116,14                 557 /dev/snd/pcmC2D0c
plugin-co 5093               user   21u      CHR             116,14      0t0        557 /dev/snd/pcmC2D0c
.
.

Você pode verificar quando reproduzir o som explicitamente em /dev/snd/pcmC2D1p , por exemplo, com

user@desk:~$ aplay -D hw:2,1 test1.wav
Playing WAVE 'test1.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Mono

Agora, o plug-in do Flash grava som e você pode ver a diferença:

user@desk:~$ lsof | grep pcmC2
.
.
aplay     7256               user  mem       CHR             116,15                  558 /dev/snd/pcmC2D1p
aplay     7256               user    4u      CHR             116,15       0t0        558 /dev/snd/pcmC2D1p
.
.
plugin-co 7237               user  mem       CHR             116,14                  557 /dev/snd/pcmC2D0c
plugin-co 7237               user   21u      CHR             116,14       0t0        557 /dev/snd/pcmC2D0c
.
.

Então, a tarefa agora é: Como ter pulseaudio para selecionar o dispositivo nº 1 da placa de loopback para reprodução?

Assumindo os valores acima, você pode modificar /etc/pulse/default.pa para ler

.
.
### Load audio drivers statically
### (it's probably better to not load these drivers manually, but instead
### use module-udev-detect -- see below -- for doing this automatically)
#load-module module-alsa-sink
#load-module module-alsa-source device=hw:1,0
.
.
load-module module-alsa-sink device=hw:2,1
.
.

Certifique-se de definir o (s) driver (s) estaticamente antes dos dinâmicos. Agora, após o reinício do PA ( pulseaudio -k ), a saída loopback do PA vai para o card2, dispositivo 1 ( device=hw:2,1 ). Para verificar:

user@desk:~$ lsof | grep pcmC2
pulseaudi 8584               user  mem       CHR             116,15                  558 /dev/snd/pcmC2D1p
pulseaudi 8584               user   18u      CHR             116,15       0t0        558 /dev/snd/pcmC2D1p
alsa-sink 8584 8585          user  mem       CHR             116,15                  558 /dev/snd/pcmC2D1p
alsa-sink 8584 8585          user   18u      CHR             116,15       0t0        558 /dev/snd/pcmC2D1p
.
.

Assim, o seu gravador de flash é capaz de gravar a partir da saída de pulseaudio.

Observação: Se você não quiser editar /etc/pulse/default.pa , poderá carregar o módulo interativamente com pacmd load-module module-alsa-sink device=hw:2,1 . Isso fornecerá um segundo loopback device em pavucontrol . E se você quiser apenas um dispositivo de loopback, primeiro descarregue o respectivo módulo:

user@desk:~$ pacmd list-modules
.
.
    index: 7
    name: <module-alsa-card>
    argument: <device_id="2" name="platform-snd_aloop.0" card_name="alsa_card.platform-snd_aloop.0" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1">
    used: 0
    load once: no
    properties:
        module.author = "Lennart Poettering"
        module.description = "ALSA Card"
        module.version = "8.0"

Procure o índice em que device-id=2 (aqui: 7), depois descarregue o módulo ( pacmd unload-module 7 ) e depois carregue o coletor para o loopback ( pacmd load-module module-alsa-sink device=hw:2,1 ).

    
por ridgy 24.03.2017 / 12:39