This is a discussion copied from

Re: [PD-dev] audioindev with several devices

Jason Plumb Tue, 18 Sep 2007 00:39:21 -0700

David Merrill wrote:

yes, I've heard that alsa has the ability to create a single, “virtual > sound card” from multiple individual cards, but so far I haven't been
able to make this work - I'm interested though, to hear from anyone
who has done it. also heard a rumor that new versions of jack may be
able to connect to multiple cards at the same time - again, I don't
have specific info, but am curious to hear if anyone has done it.


In my audiopint setup, I'm using 4 USB iMics in a cheapo USB 1.1 hub. I use all 4 stero inputs and the one single stereo output of the first iMic. I haven't confirmed it, but I'm confident that fully duplexed stereo on all 4 devices would go over the theoretical 1.1 bandwidth (my setup does not).

I multiplex the 4 cards into a single virtual card using the attached asoundrc (which should be named as ~/.asoundrc).

I am successfully using this 8-in-2-out virtual card with jackd 0.103.0 (realtime) and pd 0.40-2 (realtime). Jackd > 0.102.20 is required to pick up MMAP_COMPLEX, which allows memory mapping multiple multiplexed cards (??). My jackd usage is:

 jackd --realtime -d alsa -C capture8 -P iMic1 -p64 -n2

and then I make sure I start pd with -jack -inchannels 8 -outchannels 2

(and other less relevant params). I'm pretty sure the clocks aren't exactly synchronized (I would appreciate confirmation or refutation), but it hasn't really caused me any pain yet, even though I should likely back -p64 down to -p128.

I'm pretty sure I had limited success getting pd to work in alsa mode with the given .asoundrc…but to be honest, my focus was on jack first.


pcm.iMic1 {

      type hw
      card 0

} ctl.iMic1 {

      type hw;
      card 0;


pcm.iMic2 {

      type hw
      card 1


pcm.iMic3 {

      type hw
      card 2


pcm.iMic4 {

      type hw
      card 3


pcm.capture8 {

      type multi;
      slaves.a.pcm hw:0
      slaves.a.channels 2;
      slaves.b.pcm hw:1
      slaves.b.channels 2;
      slaves.c.pcm hw:2
      slaves.c.channels 2;
      slaves.d.pcm hw:3
      slaves.d.channels 2;
      bindings.0.slave a; 0; 
      bindings.1.slave a; 1; 
      bindings.2.slave b; 0;
      bindings.3.slave b; 1;
      bindings.4.slave c; 0;
      bindings.5.slave c; 1;
      bindings.6.slave d; 0;
      bindings.7.slave d; 1;


ctl.capture8 {

      type hw;
      card 0;