Jednoczesne przesyłanie dźwięku do wielu urządzeń dźwiękowych

10

Chciałbym, aby mój RasPi wysyłał dźwięk do mojego portu wyjścia audio na pokładzie, a także do mojej karty wyjścia cyfrowego (I2S Hifiberry Digi). Powinno to być możliwe dzięki ALSA. Mam załadowane sterowniki i mogę wysyłać je do obu urządzeń dźwiękowych osobno, ale ich połączenie po prostu nie działa. Istnieje kilka postów wyjaśniających, jak to zrobić, ale nie mogę uruchomić konfiguracji.

Błąd z gry:

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

Wyjście „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

Wyjście „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`

Zawartość pliku /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
}
Christi
źródło
Myślę, że powinieneś zajrzeć do pulseaudio. Ale mogę się tutaj mylić
Gerben
3
Zajrzałem do pulseaudio. Moje doświadczenie było takie, że w zasadzie nie działało.
Christi
Po dalszych badaniach (i drugiej próbie z pulseaudio) myślę, że problem polega na tym, że ten rodzaj funkcji wymaga wspólnego dostępu do pamięci karty dźwiękowej i / lub obsługi mmap. Sterownik RasPi I2S nie obsługuje tego. Naprawdę nie mogę tego potwierdzić, ponieważ nie ma szczególnie przydatnych informacji debugowania ani z ALSA, ani z PulseAudio - ogólnie rzecz biorąc, wszystko działa, dopóki nie spróbujesz zaangażować wielu źródeł dźwięku. Nie jestem pewien, czy zostanie to naprawione w jądrach RasPi, czy nie, ale próba naprawienia go zajęłaby więcej czasu niż jestem skłonny zainwestować.
Christi
Mogę tylko zasugerować próbę uruchomienia pulseaudio , ponieważ jest on w stanie robić dokładnie to, co chcesz (w tym rozszerzać na inne karty dźwiękowe w sieci).
earthmeLon
Jak wspomniałem powyżej, uruchomiłem Pulseaudio. Działa dobrze na każdym urządzeniu, a następnie kończy się niepowodzeniem, gdy próbujesz utworzyć strumień do wielu wyjść jednocześnie. Uważam, że winowajcą jest brak mapowania pamięci w sterowniku RasPi I2S, ale dalsze debugowanie zasadniczo polegałoby na nauce wewnętrznej struktury ALSA i / lub Pulseaudio, do czego nie mam czasu ani ochoty.
Christi

Odpowiedzi:

1

To trochę zuchwałe, ale czy zastanawiałeś się nad teepoleceniem? Przeczytaj więcej o StackExchange na temat zmiany kierunku tee i zobacz artykuł Wiki, aby uzyskać więcej przykładów. Myślę, że jeśli masz polecenie, które wyświetla nazwę pliku lub link do treści multimedialnej, lsbyć może używasz go teedo wywoływania poleceń do preferowanego odtwarzacza multimedialnego. Oto jak opisałbym problem ...


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

Uwagi:

Powyższe może być zakodowane na stałe, aby mieć opcje obsługi dla każdego rozwidlenia wyjścia, a InputParcerzmienną należy edytować, jeśli planujesz przesłać katalog lub łącze internetowe zawierające więcej niż jeden plik multimedialny. Ale jeden plik na raz powinien być wyprowadzany do obu, jeśli MediaOptions1/2 jest albo zakodowane na stałe, albo ustawione przy każdym uruchomieniu. To trochę zuchwałe, zostałeś ostrzeżony.

... po testach i tak dalej prawdopodobnie rzuciłbym się if [ ${#} < 4]; then echo "error"; fiblisko szczytu; edytowanie 4liczby argumentów, które według mnie powinny tam być. Działając w takim stanie, należy bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'koniecznie zmodyfikować w systemie opcje i ścieżki plików, które chcesz uruchomić; rzeczy pomiędzy <>.

Problemy z używaniem teepolegają na tym, że nie jest bardzo przenośny pomiędzy wersjami Linuksa i może powodować problemy z odtwarzaniem dźwięku niezsynchronizowanego między wyjściami. Zamiast tego sugerowałbym użycie omxplayer -o bothdo przesyłania dźwięku do dwóch oddzielnych urządzeń, ale ponieważ zostało to przetestowane tylko na RPi z podłączonym wyjściem HDMI i Audio, nie do końca używana przez OP konfiguracja wymagała czegoś alsa.

Jest też fajny blog na temat konfiguracji wielu użytkowników kart dźwiękowych alsa multi, które możesz przejrzeć; być może masz błąd, który sprawi, że mój powyższy kod stanie się spornym punktem; zwróć uwagę, że przewodnik był skierowany do Slakera o smaku Linuksa, a nie Raspbian.

S0AndS0
źródło