11

I'd like my RasPi to send audio to my on board audio out port, and also to my Digital out card (an I2S Hifiberry Digi). This ought to be possible with ALSA. I have the drivers loaded and can send to both sound devices individually, but combining them just isn't working. There are several posts out there explaining how to do this, but I can't get my config to work.

The error from 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 of "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

Output of "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`

Contents of /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
  • 241
  • 2
  • 8

2 Answers2

1

It's a bit hacky but have you considered the tee command? Read more on StackExchange on tee re-direction and see Wiki's artical for more examples. I'm thinking that if you have a command that outputs the file name or link to media content, ls perhaps, and use tee to call commands to your prefered media player. Here's how I would script around the problem...


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

Notes:

The above could be hard coded to have sertain options for each out-put forking and the InputParcer variable should be edited if you plan on submitting a directory or web link that contains more than one media file. But one file at a time this should output to both if the MediaOptions1/2 are either hard coded or set on each run. It's a bit hacky, you've been warned.

... after testing and such I'd then likely toss in if [ ${#} < 4]; then echo "error"; fi near the top; editing the 4 for how many arguments I've felt needs to be there. Running as is it would be bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>' be sure to modify for your system the options and file paths you wished run; the stuff between <>.

Issues with using tee are that it is not very portible between flavors of Linux and it may cause issues with audio not playing in sync between outputs. Instead I would suggest using omxplayer -o both for outputting sound to two seperate devices, but as this has only been tested on an RPi that has HDMI & Audio out plugged in, not quite the setup used by the OP and the OP requested something for alsa.

There is also a nice blog on the subject of alsa multi sound card multi user configurations you may wish to look through; perhaps you've a error in yours that'll make my above code block a moot point; just note that the guide there was geared towards Slaker flavored Linux not Raspbian.

S0AndS0
  • 196
  • 1
  • 1
  • 7
-1

Multiple audio devices work in Ubuntu 64 with Pulse audio preferences

sudo apt install paprefs

paprefs runs and could be installed in Raspbian and in Twister OS, but it's not working for me.

Sorry yes it works with Twister OS, look at this link: Play sound through two or more outputs/devices.

Edit

I´m sorry, yes it works in Ubuntu and in twister OS, but not in Raspian ( or i don´t know how to do it, i am not a linux expert), so run in a terminal

sudo apt install paprefs

paprefs (To open the preference window)

and in this windows chose simultaneosly output, i can hear with hdmi, with the jack output of the raspberry pi 4 and with bluetooth, if you have a connected bluetooth speaker or headset, all at the same time

Darth Vader
  • 4,218
  • 24
  • 47
  • 70