The Raspberry Pi has an on-board audio jack, which is super handy for all kinds of sound effects and speech, just plug and go! However, for when you want better audio for music playback, a USB audio card can greatly improve the sound quality and volume, this tutorial will show you how.

This guide will also show you how to record audio via the headphone jack on the adapter

Pre-requisites

First up, you will need a fully set up Raspberry Pi that is otherwise working and you can log into. We have tons of tutorials on that front, so get your SD card loaded with Raspbian (that's what we're using in this tutorial), and either ssh in, log in with a monitor and keyboard, or a USB console cable
Just a reminder, this tutorial is only known good for the USB audio card in the Adafruit shop. Audio cards all use different chipsets so if you have another card, it may not work here! You'll have to figure out what's different for your model.

Figure out your chipset


Start by having your Raspi turned off/shutdown (perform a clean shutdown!) and then plugging in your USB audio card. Then boot the Pi as normal.

Once you log in, type dmesg | grep cm109 to look at the boot messages. You should either see some lines about cm109 if you have a CM109 chipset

raspberry_pi_grepcm109.png

or if nothing comes up, try dmesg | grep Headphone you will see the C-Media USB Headphone Set driver. This means its a CM-headphone

or if nothing comes up, try dmesg | grep C-Media you will see some C-Media notes but no mention of the cm109 driver. This means its a CM108 or PCM2902

or if nothing comes up, try dmesg | grep General you will see mention of GeneralPlus. This means it's a GeneralPlus

If you have CM108


If you type in lsusb you should see a reference to C-Media Electronics, Inc. CM108 Audio Adapter or Texas Instruments PCM2902 Audio Codec

We'll need to update the firmware, this requires Internet access but only takes 15 minutes or so. You might want to run sudo apt-get update first if you haven't lately. Then run the following commands in order:
sudo apt-get update
sudo apt-get upgrade
sudo reboot

You may see a lot of stuff happening like the below:

Now you can go down to the update alsa module options section

Type dmesg to look at the boot messages. You should see a bunch of lines that talk about C-Media USB Headphone Set
And if you type in lsusb you should see a reference to C-Media Electronics Audio Adapter but no mention of CM108 and the VID/PID is 0x0d8c:0x00c
Nothing special needs to be done! Hurray! Continue on to the Updating ALSA Config section
Type dmesg to look at the boot messages. You should see a bunch of lines that talk about cm109
And if you type in lsusb you should see a reference to C-Media Electronics Audio Adapter but no mention of CM108
Nothing special needs to be done! Hurray! Continue on to the next section

Type dmesg to look at the boot messages. You should see a bunch of lines that talk about GeneralPlus

And if you type in lsusb you should see a reference to Generalplus Technology with ID 1b3f:2008

Nothing special needs to be done! Hurray! Continue on to the next section

Raspbian Bullseye - Updating alsa options

First make sure you can see the alsa card for the USB audio device with

cat /proc/asound/cards

And look for something that says "USB Audio" or similar

Depending on whether you are running a Pi 4 or other, it may be device 1, 2 or 3.

we used to recommend manually setting the device number to be your USB audio card but that turned out to be fragile because the HDMI audio device numbers would change. 

So now we suggest just disabling the built in headphone jack audio, and letting the USB audio card be 'first'

Start by disabling the built-in headphone jack with

sudo nano /etc/modprobe.d/raspi-blacklist.conf

and typing in 

blacklist snd_bcm2835

hit return, then save with Control-X then Y then Return (to save)

 

Then enable the USB audio card with

sudo nano /lib/modprobe.d/aliases.conf

find the line with

options snd-usb-audio index=-2

and put a # in the beginning of that line. Then exit and save file.

Then sudo reboot to 'set' the changes

Upon reboot, if you run sudo aplay -l  to list the interface, the USB audio card will be first and the default!

Testing!

OK now that you've configured ALSA depending on your OS...that's it! Now reboot with sudo reboot and log in again, you can test with speaker-test by running

speaker-test -c2

Which will play white noise through the left and right 'speakers' on the audio card. Once you've got something coming out, try to play an audio file with speaker-test (for WAV files, not MP3)

speaker-test -c2 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav

If you want to play a stream of music, you can try

sudo apt-get install mpg123
mpg123 http://ice1.somafm.com/u80s-128-mp3

If you want to play MP3's on command, check out this tutorial which covers how to set that up

Headphone vs Audio card

Don't forget, you still have the built in headphone jack on the Pi, if you edited alsa.conf it might be called card 1 now (not the default card 0)

You can run aplay -l to list the devices

If you want to aplay through a specific card, specify card 1 with -D plughw:1,0 or card 0 -D plughw:0,0 etc

speaker-test -c2 -D plughw:1,0

aplay --device=hw:1,0 test.wav

You can set audio levels for both output and input with

alsamixer -c 1

Use the arrow keys and return/escape to set and save the settings. It's a sorta-cute text-graphics system

At least with the CM-Headphone type adapter, you can also record audio.

 arecord --device=hw:1,0 --format S16_LE --rate 44100 -c1 test.wav

Will record signed 16-bit (S16_LE) audio at 44100 Hz (--rate 44100) mono (-c1) audio to test.wav. We've noted that any audio input will be echoed out the speakers as well

You can have a little VU meter show up if you add to the-V mono command line. Press control-C to quit

Once you're done recording you can play back with

aplay --device=plughw:1,0 test.wav

If you're using a Raspberry Pi and notice the output isnt totally clean, some USB Audio adapters don't like USB-1.2 and produce crackling in the output. You can work around the problem by adding dwc_otg.speed=1 to /boot/cmdline.txt and setting the USB ports to USB-1.1 mode.

You can get user access to the audio hardware with other devices by granting access using sudo usermod -a -G audio username

This guide was first published on Sep 17, 2013. It was last updated on Mar 08, 2024.