Looping back is always an interesting thing to play with. It comes with its own set of applications, ranging from testing & debugging to replicating & integration. It has been used in various fields including hardware and software. At hardware level, we often short the Rx (receive) & Tx (transmit) lines to do the loopback in devices like serial, network, etc. In software, we do it using pipes, files, etc. However, an even more interesting crop is the concept of virtual devices doing loopback. We had talked about virtual video loopback devices in the previous article “Simultaneous Access to Single Camera“. Similarly, we can have virtual audio loopback devices.
snd-aloop is the kernel module for setting up virtual audio loopback devices.
$ sudo modprobe snd-aloop
creates two devices 0 & 1 under a new “Loopback” card for both playback & capturing, as shown below, respectively:
In the above images, the card 2 is the loopback card. It may vary depending on which is the next free available card number. Moreover, each of the two devices under it, has 8 subdevices, which would be accessed using the format hw:c,d,s, where c stands for card number, d for device number, and s for subdevice number, e.g. hw:2,0,0
Now in this, whatever audio is played back into hw:2,0,s could be captured from hw:2,1,s and viceversa, s ranging from 0 to 7. For example, audio played back into hw:2,0,4 could be captured from hw:2,1,4; audio played back into hw:2,1,7 could be captured from hw:2,0,7 – these are what are the loopbacks. A simple experiment could demonstrate the same.
Start recording audio from hw:2,1,4:
$ arecord -D hw:2,1,4 -f S16_LE -c 2 -r 48000 recorded.wav
Note that providing the sample format, channel count, frame rate in recording ensures that playback picks up the same settings – this is because there is no real hardware underneath it is just a virtual loopback connection.
And in parallel (from another shell) play an audio from audio.wav into hw:2,0,4:
$ aplay -D hw:2,0,4 audio.wav
And you’d find that recorded audio contains the played one – a loopback in action. You may play the recorded audio as follows:
$ aplay recorded.wav
This would play on your system’s default speaker.
Also, note that there may be problem in just playing any audio.wav file because of the mismatched audio format etc support. For that, just record a new wave file with your speech using the following command:
$ arecord -f S16_LE -c 2 -r 48000 audio.wav
This would record from your system’s default mic.
Interestingly, audio loopback could also be achieved in user space using alsaloop from alsa-utils package. Here is a demo of the same. From the output of aplay -l, hw:1,0 is the analog out (speaker). Note that hw:1,0 is same as hw:1,0,0. Find the equivalent on your system. And, now let’s loopback the virtual audio capture device hw:2,1,4 to this:
alsaloop -C hw:2,1,4 -P hw:1,0
On another shell, do the earlier playing:
$ aplay -D hw:2,0,4 audio.wav
This time you should be able to hear the audio.wav directly through system’s default speaker – again a loopback in action – rather two loopbacks in action: audio.wav -> hw:2,0,4 -> (loopback through snd-aloop driver) -> hw:2,1,4 -> (loopback through alsaloop app) -> hw:1,0 -> heard on speaker.