Raspberry Pi Dual Audio Output

Background (skip if you want)

I use the raspberry pi to connect to my thrift store keyboard with a USB MIDI cable so that I can use better software instruments than the crappy ones built in to the keyboard.

I have made 2 songs using this so far: MIDI Cable Is Here Magically Infinite Dank Inspiration

In addition to plugging in some headphones to the Pi and hearing the sound, I also wanted the option to pipe the audio to another device at the same time. The problem was that the user interface on the Pi only allows you to select one audio output at a time. After some digging online, I found this post on how to output to 2 devices. However this guide was general, and the device names were wrong for the Pi. So I eventually found out that you can do aplay --list-pcms to get the right names, so I put the name for the HDMI device and the audio jack device into the config file.

Solution

Edit the .asoundrc file in the home directory and replace the entire thing with this:

#from
# duplicate audio to both devices
pcm.!default plug:both

ctl.!default {
  type hw
  card 0
}

pcm.both {
  type route;
  slave.pcm {
      type multi;
      #aplay --list-pcm
      slaves.a.pcm "sysdefault:CARD=b1";
      slaves.b.pcm "sysdefault:CARD=Headphones";
      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;
#      bindings.4.slave b;
#      bindings.4.channel 2;
#      bindings.5.slave b;
#      bindings.5.channel 3;
  }

  ttable.0.0 1;
  ttable.1.1 1;

  ttable.0.2 1; # front left
  ttable.1.3 1; # front right
#  ttable.0.4 1; # copy front left to rear left
#  ttable.1.5 1; # copy front right to rear right
}

ctl.both {
  type hw;
  card Live;
}

pcm.onboard {
   type dmix
   ipc_key 1024
   slave {
       pcm "hw:1,0"
       period_time 0
       period_size 2048
       buffer_size 65536
       buffer_time 0
       periods 128
       rate 48000
       channels 4
    }
    bindings {
       0 0
       1 1
       2 2
       3 3
    }
}

pcm.sblive {
   type dmix
   ipc_key 2048
   slave {
       pcm "hw:0,0"
       period_time 0
       period_size 2048
       buffer_size 65536
       buffer_time 0
       periods 128
       rate 48000
       channels 2
    }
    bindings {
       0 0
       1 1
    }
}

ctl.onboard {
   type hw
   card 1
}

ctl.sblive {
   type hw
   card 0
}

If you ever interact with the audio settings, this file will be overwritten, so make sure to make a copy of the file so you can always restore it. Or you can copy it from here again.