Trasmissione audio su più dispositivi audio contemporaneamente


10

Vorrei che il mio RasPi inviasse l'audio alla mia porta di uscita audio integrata e anche alla mia scheda di uscita digitale (un I2S Hifiberry Digi). Questo dovrebbe essere possibile con ALSA. Ho i driver caricati e posso inviare singolarmente a entrambi i dispositivi audio, ma combinarli semplicemente non funziona. Esistono diversi post che spiegano come farlo, ma non riesco a far funzionare la mia configurazione.

L'errore da 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

Output di "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

Uscita di "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`

Contenuto di /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
}

Penso che dovresti esaminare pulseaudio. Ma potrei sbagliarmi qui
Gerben

3
Ho esaminato pulseaudio. La mia esperienza è stata che sostanzialmente non ha funzionato.
Christi,

Dopo ulteriori indagini (e un secondo tentativo con pulseaudio), penso che il problema sia che questo tipo di funzionalità richiede l'accesso condiviso alla memoria della scheda audio e / o al supporto mmap. Il driver RasPi I2S non supporta questo. Non posso davvero confermarlo, poiché non ci sono informazioni di debug particolarmente utili né da ALSA né da PulseAudio - in generale, tutto funziona fino a quando non si tenta di coinvolgere più fonti audio. Non sono sicuro se questo verrà risolto nei kernel RasPi o meno, ma cercare di risolverlo richiederebbe più tempo di quanto io sia disposto a investire.
Christi,

Posso solo suggerire di provare a far funzionare pulseaudio , in quanto è in grado di fare esattamente quello che desideri fare (inclusa l'estensione ad altre schede audio sulla rete).
earthmeLon

Come ho detto sopra, ho fatto funzionare Pulseaudio. Funziona bene su ogni singolo dispositivo e quindi non riesce quando si tenta di creare un flusso su più uscite contemporaneamente. Credo che la mancanza di mappatura della memoria nel driver RasPi I2S sia il colpevole, ma un ulteriore debug implicherebbe essenzialmente l'apprendimento della struttura interna di ALSA e / o Pulseaudio, che non ho il tempo o la tendenza a fare.
Christi,

Risposte:


1

È un po ' confuso ma hai considerato il teecomando? Leggi di più su StackExchange sulla re-direzione del tee e vedi l' arte di Wiki per altri esempi. Sto pensando che se hai un comando che emette il nome del file o il collegamento al contenuto multimediale, lsforse, e usi teeper chiamare i comandi per il tuo lettore multimediale preferito. Ecco come scriverei il problema ...


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

Appunti:

Quanto sopra potrebbe essere hardcoded per avere opzioni sertain per ogni biforcazione di output e la InputParcervariabile dovrebbe essere modificata se si prevede di inviare una directory o un collegamento Web che contiene più di un file multimediale. Ma un file alla volta dovrebbe essere generato su entrambi se MediaOptions1/2 è codificato o impostato su ogni esecuzione. È un po 'confuso, sei stato avvertito.

... dopo i test e cose simili, probabilmente mi sarei lanciato if [ ${#} < 4]; then echo "error"; fivicino alla cima; modificando il 4numero di argomenti che ho sentito deve essere lì. In esecuzione così com'è sarebbe bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'sicuro di modificare per il tuo sistema le opzioni e i percorsi dei file che desideri eseguire; la roba in mezzo <>.

I problemi con l'utilizzo teesono che non è molto suddivisibile tra le versioni di Linux e può causare problemi con l'audio che non viene riprodotto in sincronia tra le uscite. Invece, suggerirei di utilizzare omxplayer -o bothper trasmettere l'audio a due dispositivi separati, ma poiché questo è stato testato solo su un RPi con HDMI e audio collegati, non proprio la configurazione utilizzata dall'OP e l'OP ha richiesto qualcosa alsa.

C'è anche un bel blog sull'argomento delle configurazioni multiutente multi scheda audio alsa che potresti voler esaminare; forse hai un errore nel tuo che renderà il mio codice di cui sopra un punto controverso; basta notare che la guida lì è stata orientata verso Slaker e non su Raspbian.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.