Как направить импульсное аудиоустройство в петлю Alsa (виртуальный микрофон)?

Я хочу флэш-приложение, которое хочет записать мой микрофон (что-то вроде https://online-voice-recorder.com/) для записи источника Pulse Audio.

Я понял, что вспышка использует ALSA. Поэтому я установил петлевое устройство Alsa sudo modprobe snd-aloop, который аккуратно появился как в pavucontrol И в alplay -l (в конце списка):

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

Затем я подтвердил, что звук направляется на петлевое устройство:

К сожалению, плагин вспышки вообще не видит звука - как будто я записывал нули.

Плагин вспышки видит все источники звука, обращенные к ALSA:

  1. Почему нет звука, видимого для плагина?
  2. Что делать, чтобы направить выход Pulse Audio на вход ALSA?

1 ответ

Решение

Простой ответ в конце. Но чтобы помочь понять решение, я постараюсь быть максимально понятным. Мое предположение: "Устройство с обратной связью" это карта № 2, устройство № 0 и № 1, поэтому во всех примерах это верно (например, /dev/snd/pcmC2D0pозначает "карта 2, устройство 0, воспроизведение"). Ваша установка может отличаться, поэтому измените соответствующие значения.

Сначала я создал / модифицировал /etc/modprobe.d/alsa-aloop.conf иметь только одну карту с одним подпотоком (просто для простоты):

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

После sudo modprobe snd_aloop, aplay -l а также arecord -l шоу

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

Теперь есть одна проблема: оба устройства карты обратной связи являются устройствами воспроизведения и записи. Но функция snd_aloop является маршрутизацией ввода в устройстве 0 для вывода в устройстве 1 и наоборот (см., например, https://www.alsa-project.org/main/index.php/Matrix:Module-aloop). Вы можете увидеть это в /proc/asoundкаталог:

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

где "pcm0c" - устройство захвата 0, "pcm0p" - устройство воспроизведения 0 и т. д.

Так pavucontrol показывает (и выбирает) два устройства петли, одно воспроизведение (hw:2,0) и одну запись (hw:2,1):

Вы не можете выбрать устройство воспроизведения в pavucontrol, поэтому он выбирает устройство 0:

Вы увидите это при просмотре файла устройства воспроизведения:

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
.
.

Таким образом, это означает, что захват этого аудиопотока должен быть сделан через /dev/snd/pcmC2D1c; если вы выберете loopbackв качестве устройства ввода для вспышки, он будет использовать /dev/snd/pcmC2D0cвместо (plugin-coозначает, что флэш-контейнер плагина работает):

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
.
.

Вы можете проверить, когда явно воспроизводить звук через /dev/snd/pcmC2D1pнапример, с

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

Теперь плагин flash записывает звук, и вы можете увидеть разницу:

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
.
.

Итак, задача теперь такова: как заставить Puluaudio выбрать устройство № 1 петлевой карты для воспроизведения?

Предполагая значения сверху, вы можете изменить /etc/pulse/default.pa читать

.
.
### 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
.
.

Обязательно определите статические драйверы перед динамическими. Теперь после перезагрузки ПА (pulseaudio -k), то loopback выход PA идет на card 2, устройство 1 (device=hw:2,1). Проверять:

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
.
.

Таким образом, ваш флеш-рекордер способен записывать с выхода pulseaudio.

Замечание: если вы не хотите редактировать /etc/pulse/default.paВы можете загрузить модуль в интерактивном режиме с pacmd load-module module-alsa-sink device=hw:2,1, Это даст вам секунду loopbackустройство в pavucontrol, И если вам нужно только одно петлевое устройство, сначала выгрузите соответствующий модуль:

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"

Ищите индекс где device-id=2 (здесь:7), затем выгрузите модуль (pacmd unload-module 7) и после этого загрузите приемник для обратной петли (pacmd load-module module-alsa-sink device=hw:2,1).

Другие вопросы по тегам