Виводить аудіо на декілька звукових пристроїв одночасно


10

Я хотів би, щоб мій RasPi надсилав аудіо на мій портовий аудіо борт, а також на мою цифрову карту (I2S Hifiberry Digi). Це повинно бути можливо за допомогою ALSA. У мене драйвери завантажені і можуть надсилати на обидва звукові пристрої окремо, але їх поєднання просто не працює. Існує кілька публікацій, де пояснюється, як це зробити, але я не можу заставити свою конфігурацію працювати.

Помилка від aplay:

Playing WAVE 'sin1000_48khz.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) Slave PCM not usable
aplay: set_params:1059: Broken configuration for this PCM: no configurations available

Вихід "aplay -l"

**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_digi], device 0: HifiBerry Digi HiFi wm8804-spdif-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  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
card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Вихід "aplay -L"

null
   Discard all samples (playback) or generate zero samples (capture)
sysdefault:CARD=sndrpihifiberry
    snd_rpi_hifiberry_digi,
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device`

Зміст /etc/asound.conf

pcm.both {
    type route
    slave.pcm {
        type multi    
        slaves.a.pcm "hw:0,0"
        slaves.b.pcm "hw:1,0"
        slaves.a.channels 2
        slaves.b.channels 2

        bindings.0.slave a
        bindings.0.channel 0    
        bindings.1.slave a
        bindings.1.channel 1

        bindings.2.slave b
        bindings.2.channel 0
        bindings.3.slave b
        bindings.3.channel 1
    }

    ttable.0.0 1
    ttable.1.1 1

    ttable.0.2 1
    ttable.1.3 1
}

ctl.both {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.hifiberry {
    type hw    
    card sndrpihifiberry
    device 0
}

ctl.hifiberry {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.audioout {
    type hw
    card ALSA
    device 0
}

ctl.audioout {
    type hw
    card ALSA
    device 0
}

pcm.!default {
    type plug
    slave {
        pcm both
    }
}

#pcm.!default {    
#    type hw
#    card sndrpihifiberry
#    device 0
#}

ctl.!default {
    type hw
    card sndrpihifiberry
    device 0
}

Я думаю, ви повинні заглянути в pulseaudio. Але я можу помилятися тут
Гербен

3
Я заглянув у pulseaudio. Мій досвід полягав у тому, що це в основному не спрацювало.
Крісті

Після подальшого дослідження (і другої спроби з pulseaudio), я думаю, що проблема полягає в тому, що цей тип функцій вимагає спільного доступу до пам'яті звукової карти та / або підтримки mmap. Драйвер RasPi I2S не підтримує це. Я не можу реально підтвердити це, оскільки немає особливо корисної інформації про налагодження ні від ALSA, ні від PulseAudio - загалом, все працює, поки ви не спробуєте задіяти кілька джерел звуку. Я не впевнений, чи буде це зафіксовано в ядрах RasPi чи ні, але намагатися виправити це потребує часу більше часу, ніж я готовий інвестувати.
Крісті

Я можу лише запропонувати спробувати працювати з імпульсним аудіо , оскільки він здатний робити саме те, що ви хочете зробити (включаючи поширення на інші звукові карти в мережі).
земляLon

Як я вже згадував вище, я працював над Pulseaudio. Він працює чудово на кожному окремому пристрої, а потім виходить з ладу при спробі створити потік на декілька виходів одночасно. Я вважаю, що винуватцем відсутності відображення пам’яті у драйвері RasPi I2S, але подальше налагодження по суті означатиме вивчення внутрішньої структури ALSA та / або Pulseaudio, на що я не маю часу чи схильності робити.
Крісті

Відповіді:


1

Це трохи гакітно, але ви вважали teeкоманду? Читайте докладніше про StackExchange про перенаправлення трійника та перегляньте зображення артикулу Wiki для отримання додаткових прикладів. Я думаю, що якщо у вас є команда, яка виводить ім'я файлу або посилання на медіа-контент, lsможливо, і використовує teeдля виклику команд бажаному медіаплеєру. Ось як я сценарій навколо проблеми ...


#!/bin/bash
MediaPlayer="$1"
MediaOptions1="$2"
MediaOptions2="$3"
InputParcer="ls $4"
${InputParcer} | tee >(${MediaPlayer} ${MediaOptions1}) >(${MediaPlayer} ${MediaOptions2}) || echo 'Exiting baddly'

Примітки:

Вищезазначене може бути важко закодованим, щоб мати параметри для кожного розгортання, а InputParcerзмінна повинна бути відредагована, якщо ви плануєте подати каталог або веб-посилання, що містить більше одного медіа-файлу. Але один файл одночасно має виводитись на обидва, якщо MediaOptions1/2 або жорстко закодовані, або встановлені під час кожного запуску. Це трохи хакі, вас попередили.

... після тестування і подібного я тоді, швидше за все, кинувся б if [ ${#} < 4]; then echo "error"; fiбіля вершини; редагування того, 4скільки аргументів я відчував, потрібно там. Працюючи так, як це було б, bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'обов'язково змініть для вашої системи параметри та шляхи до файлів, які ви хотіли запустити; речі між <>.

Проблеми з використанням teeполягають у тому, що він не дуже переноситься між ароматами Linux, і це може спричинити проблеми із звуком, який не відтворюється синхронізовано між виходами. Натомість я б запропонував використовувати omxplayer -o bothдля виведення звуку два окремі пристрої, але оскільки це було протестовано лише на RPi, у якому підключено HDMI & Audio, не зовсім налаштування, використовуване ОП та ОП, вимагало чогось alsa.

Також є приємний блог на тему про багатокористувацькі конфігурації alsa multi sound, які ви можете побачити; можливо у вас є помилка у вашому, що змусить мій вищезгаданий код блокувати точку спору; лише зауважте, що посібник там був орієнтований на смак Linux з Slaker, а не Raspbian.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.