Gleichzeitige Ausgabe von Audio an mehrere Audiogeräte


10

Ich möchte, dass mein RasPi Audio an meinen integrierten Audioausgang und auch an meine Digitalausgangskarte (ein I2S Hifiberry Digi) sendet. Dies sollte mit ALSA möglich sein. Ich habe die Treiber geladen und kann sie einzeln an beide Audiogeräte senden, aber das Kombinieren funktioniert einfach nicht. Es gibt mehrere Beiträge, in denen erklärt wird, wie das geht, aber ich kann meine Konfiguration nicht zum Laufen bringen.

Der Fehler von 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

Ausgabe von "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

Ausgabe von "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`

Inhalt von /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
}

Ich denke, Sie sollten sich mit pulseaudio befassen. Aber ich könnte mich hier irren
Gerben

3
Ich habe in pulseaudio geschaut. Meine Erfahrung war, dass es im Grunde nicht funktioniert hat.
Christi

Nach weiteren Untersuchungen (und einem zweiten Versuch mit pulseaudio) besteht meines Erachtens das Problem darin, dass für diese Art von Funktion ein gemeinsamer Zugriff auf den Soundkartenspeicher und / oder die mmap-Unterstützung erforderlich ist. Der RasPi I2S-Treiber unterstützt dies nicht. Ich kann dies nicht wirklich bestätigen, da es weder von ALSA noch von PulseAudio besonders nützliche Debugging-Informationen gibt. Im Allgemeinen funktioniert alles, bis Sie versuchen, mehrere Soundquellen einzuschalten. Ich bin mir nicht sicher, ob dies in den RasPi-Kerneln behoben wird oder nicht, aber der Versuch, es zu beheben, würde mehr Zeit in Anspruch nehmen, als ich bereit bin zu investieren.
Christi

Ich kann nur vorschlagen, dass Sie versuchen, pulseaudio zum Laufen zu bringen , da es genau das kann, was Sie möchten (einschließlich der Erweiterung auf andere Soundkarten im Netzwerk).
EarthmeLon

Wie ich oben erwähnt habe, habe ich Pulseaudio zum Laufen gebracht. Es funktioniert auf jedem einzelnen Gerät einwandfrei und schlägt dann fehl, wenn Sie versuchen, einen Stream mit mehreren Ausgängen gleichzeitig zu erstellen. Ich glaube, dass ein Mangel an Speicherzuordnung im RasPi I2S-Treiber der Schuldige ist, aber weiteres Debuggen würde im Wesentlichen das Erlernen der internen Struktur von ALSA und / oder Pulseaudio beinhalten, wozu ich nicht die Zeit oder Neigung habe.
Christi

Antworten:


1

Es ist ein bisschen hacky, aber haben Sie den teeBefehl in Betracht gezogen ? Lesen Sie mehr über StackExchange über die Umleitung von Abschlägen und sehen Sie sich Wikis Artikel für weitere Beispiele an. Ich denke, wenn Sie einen Befehl haben, der den Dateinamen oder den Link zu Medieninhalten ausgibt ls, und teedamit Befehle an Ihren bevorzugten Media Player aufrufen. Hier ist, wie ich das Problem umgehen würde ...


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

Anmerkungen:

Das Obige könnte hart codiert sein, um bestimmte Optionen für jede Ausgabegabelung zu haben, und die InputParcerVariable sollte bearbeitet werden, wenn Sie ein Verzeichnis oder einen Weblink senden möchten , der mehr als eine Mediendatei enthält. Aber eine Datei zu einem Zeitpunkt dies sollte Ausgabe , wenn sowohl die MediaOptions1/2 entweder hart codiert oder Satz auf jedem Lauf. Es ist ein bisschen hacky, du wurdest gewarnt.

... nach dem Testen und so würde ich dann wahrscheinlich in der if [ ${#} < 4]; then echo "error"; fiNähe der Spitze werfen ; Das Bearbeiten der 4für wie viele Argumente ich dachte, muss da sein. Wenn bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'Sie es so ausführen, wie es ist, müssen Sie die Optionen und Dateipfade, die Sie ausführen möchten, für Ihr System ändern. das Zeug dazwischen <>.

Probleme bei der Verwendung teesind, dass es zwischen Linux-Varianten nicht sehr portabel ist und Probleme mit Audio verursachen kann, das nicht synchron zwischen den Ausgängen abgespielt wird. Stattdessen würde ich vorschlagen, omxplayer -o bothfür die Ausgabe von Ton an zwei separate Geräte zu verwenden. Da dies jedoch nur auf einem RPi getestet wurde, an das HDMI- und Audioausgang angeschlossen ist, wurde nicht ganz das vom OP und OP verwendete Setup angefordert alsa.

Es gibt auch einen schönen Blog zum Thema Alsa Multi-Soundkarten-Multi-User-Konfigurationen, die Sie vielleicht durchsehen möchten. Vielleicht haben Sie einen Fehler in Ihrem, der meinen obigen Codeblock zu einem strittigen Punkt macht. Beachten Sie nur, dass die Anleitung dort auf Linux mit Slaker-Geschmack und nicht auf Raspbian ausgerichtet war.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.