Sortie audio sur plusieurs périphériques audio simultanément

10

J'aimerais que mon RasPi envoie de l'audio à mon port de sortie audio intégré, ainsi qu'à ma carte de sortie numérique (un I2S Hifiberry Digi). Cela devrait être possible avec ALSA. J'ai les pilotes chargés et je peux envoyer aux deux périphériques audio individuellement, mais les combiner ne fonctionne tout simplement pas. Il existe plusieurs articles expliquant comment procéder, mais je ne parviens pas à faire fonctionner ma configuration.

L'erreur de 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

Sortie de "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

Sortie de "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`

Contenu de /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
la source
Je pense que vous devriez regarder pulseaudio. Mais je peux me tromper ici
Gerben
3
J'ai regardé dans pulseaudio. D'après mon expérience, cela n'a pas fonctionné.
Christi
Après une enquête plus approfondie (et une deuxième tentative avec pulseaudio), je pense que le problème est que ce type de fonctionnalité nécessite un accès partagé à la mémoire de la carte son et / ou au support mmap. Le pilote RasPi I2S ne prend pas en charge cela. Je ne peux pas vraiment le confirmer, car il n'y a pas d'informations de débogage particulièrement utiles d'ALSA ou de PulseAudio - en général, tout fonctionne jusqu'à ce que vous essayiez d'engager plusieurs sources sonores. Je ne sais pas si cela sera corrigé dans les noyaux RasPi ou non, mais essayer de le réparer prendrait plus de temps que je ne suis prêt à investir.
Christi
Je ne peux que suggérer d' essayer de faire fonctionner pulseaudio , car il est capable de faire exactement ce que vous souhaitez faire (y compris l'étendre à d'autres cartes son sur le réseau).
earthmeLon
Comme je l'ai mentionné ci-dessus, j'ai réussi à faire fonctionner Pulseaudio. Il fonctionne correctement sur chaque périphérique individuel, puis échoue lorsque vous essayez de créer un flux vers plusieurs sorties à la fois. Je pense que le manque de mappage de la mémoire dans le pilote RasPi I2S est le coupable, mais un débogage supplémentaire impliquerait essentiellement l'apprentissage de la structure interne d'ALSA et / ou de Pulseaudio, ce que je n'ai pas le temps ni l'envie de faire.
Christi

Réponses:

1

C'est un peu hacky mais avez-vous pensé à la teecommande? En savoir plus sur StackExchange sur la re-direction du tee et voir l' artique de Wiki pour plus d'exemples. Je pense que si vous avez une commande qui génère le nom de fichier ou le lien vers le contenu multimédia, lspeut-être, et que vous utilisez teepour appeler des commandes vers votre lecteur multimédia préféré. Voici comment j'écrirais le problème ...


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

Remarques:

Ce qui précède peut être codé en dur pour avoir des options de sertain pour chaque fourche de sortie et la InputParcervariable doit être modifiée si vous prévoyez de soumettre un répertoire ou un lien Web contenant plus d'un fichier multimédia. Mais un fichier à la fois, cela devrait sortir aux deux si les MediaOptions1/2 sont codés en dur ou définis à chaque exécution. C'est un peu hacky, on vous a prévenu.

... après avoir testé et tel, je serais alors susceptible de lancer if [ ${#} < 4]; then echo "error"; fiprès du sommet; éditer le 4pour combien d'arguments j'ai ressenti doit être là. En cours d'exécution tel quel, vous bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'serez sûr de modifier pour votre système les options et les chemins de fichiers que vous souhaitez exécuter; le truc entre <>.

Les problèmes d'utilisation teesont qu'il n'est pas très transférable entre les versions de Linux et cela peut entraîner des problèmes avec l'audio qui ne joue pas en synchronisation entre les sorties. Au lieu de cela, je suggérerais d'utiliser omxplayer -o bothpour la sortie du son vers deux appareils séparés, mais comme cela n'a été testé que sur un RPi qui a une sortie HDMI et audio branchée, pas tout à fait la configuration utilisée par l'OP et l'OP a demandé quelque chose alsa.

Il y a aussi un joli blog sur le sujet des configurations multi-utilisateurs de la carte son multi alsa que vous voudrez peut-être parcourir; vous avez peut-être une erreur dans la vôtre qui fera de mon code ci-dessus un point discutable; il suffit de noter que le guide était orienté vers Linux à saveur Slaker et non Raspbian.

S0AndS0
la source