I want to deliver sound from my Raspberry Pi's (RPi) Audio Output 3.5mm jack. I'll need to get audio drivers working on Audio Out, and to test it, I'll need some sound files and players. I'm choosing the Advanced Linux Sound Architecture (ALSA) drivers because its widely supported and because ALSA not only provides audio but Musical Instrument Digital Interface (MIDI) functionality to Linux. I'll also be using the popular command line MP3 players, mpg321 and the WAV player that comes with ALSA, aplay.
To get things going, I installed ALSA, a MP3 tools, and a WAV to MP3 conversion tool via the following commands:
sudo apt-get install alsa-utils sudo apt-get install mpg321 sudo apt-get install lame
Enabling the Sound Module
Reboot the RP and when it comes back up, its time to load the Sound Drivers. This will be done via loadable kernel module (LKM) which are object file that contains code to extend the Linux kernel. lsmod
is a command on Linux systems which prints the contents of the /proc/modules
file. It shows which loadable kernel modules are currently loaded. In my case, lsmod
gives me:

The snd-bcm2835
module appears to be already installed. RPi has a Broadcom BCM2835 system on a chip (SoC) which is a High Definition 1080p Embedded Multimedia Applications Processor. snd-bcm2835
is the sound driver. If lsmod
doesn't list the snd-bcn2835
module, then it can be installed via the following command:
sudo modprobe snd-bcm2835
Enabling Audio Output
By default, the RPi audio output is set to automatically select the digital HDMI interface if its being used, otherwise the analog audio output. You can force it to use a specific interface via the sound mixer controls. amixer
allows command-line control of the mixer for the ALSA driver.
You can force the RPi to use a specific interface using the command amixer cset numid=3 N
where the N
parameter means the following: 0=auto, 1=analog, 2=hdmi. Therefore, to force the Raspberry Pi to use the analog output:
amixer cset numid=3 1
Sound Check
With this done, you should be ready for a simple test. Plug a speaker into the (RPi) Audio Output 3.5mm jack. I used a simple battery powered iHM60 iHome speaker. The jack will not deliver much power, so the speaker needs to be powered.
To test the RPi audio, you can play a WAV file (download this ... excellent for user-error notification) with aplay
, mpg321
for MP3 files, or use the speaker-test
command if you don't have a WAV/MP3 file.
aplay numnuts.wav speaker-test -t sine -f 440 -c 2 -s 1 mpg321 "Mannish Boy.mp3"
More on the ALSA Sound Drivers and Utilities
While ALSA is a powerful tool, it documentation appears is very weak. Also, it appears that the capabilities of ALSA drivers and utilities are very dependent on the hardware used. The best sources of documentation that I found include Advanced Linux Sound Architecture (ALSA) project homepage, archlinux Advanced Linux Sound Architecture, and ALSA-sound-mini-HOWTO.
You can find useful information in the directory /proc, which is a "virtual" file system (meaning that it does not exist in real life, but merely is a mapping to various processes and tasks in your computer).
/proc/modules
gives information about loaded kernel modules. The commandlsmod | grep snd
will list modules relevant to the sound system.- You can check the existence of a soundcard by looking at
cat /proc/asound/cards
.
amixer
command can provide useful information (sometimes):
- You can look at the mixer settings by typing
amixer
without any arguments. This command lists the mixer settings of the various parts of the soundcard. The output fromamixer
can greatly differ from card to card. Unfortunately you can't find much documentation on how to interpret the out. - The RPi doesn't have a "Master" control only "PCM". So commands like
amixer set Master...
will not work. You must useamixer set PCM ...
- You can mute /unmute the sound via these commands:
amixer set PCM mute
andamixer set PCM unmute
- As of August 2012, there appears to be a known bug in RPi ALSA driver that ignores volume settings at the start of playback and always plays at max volume. Therefore, commands like
amixer set PCM 50% unmute
will not set the volume to 50%, at least until this bug is fixed. Maybe this isn't really a bug but a limitation of the hardware because there is a workaround for this .... see below.
Volume Control
The RPi built-in sound chips don't have a "master volume" control, and as a result, you must control the volume via software. I guess the RPi views itself as a preamplifier (preamp) and volume controls would be supplied down stream. ALSA provides a software volume control using the softvol plugin.The /etc/asound.conf
file is a configuration files for ALSA drivers (system-wide). The main use of this configuration file is to add functionality. It allows you to create "virtual devices" that pre or post-process audio streams. Any properly written ALSA program can use these virtual devices as though they were normal devices. My RPi /etc/asound.conf
file looks like this:

For most changes to /etc/asound.conf
you will need to restart the sound server for the changes to take effect.
You can do this via
sudo /etc/init.d/alsa-utils restart
I attempted to implement the software volume controls outline in a softvol how-to that I found, but I couldn't get it to work. I did some additional digging, and I found a solution buried within a python script for a Adafruit project. The following works for controlling the volume (in this case, reducing the volume to 80% of maximum):
amixer cset numid=1 -- 80%
Note that you can use this command to change the volume while sound is being played an its effect takes place immediately. Also, I noticed that once the volume has been adjusted, its effect remains even after a reboot.
WAV and MP3 Conversion
The MP3 playermpg321
can convert MP3 files to WAV files but the WAV player, aplay
, can not do a conversion. To make a MP3 file from a WAV file, you'll need the tool lame
.
- To convert from WAV to MP3:
lame input.wav output.mp3
- To convert from MP3 to WAV:
mpg321 -w output.wav input.mp3
Bottomeline
While you can get ALSA working on the Raspberry Pi, it appears only partly supported, maybe buggy, and poorly documented. If you just want to simply get sound out of the device (like I do), you'll be fine. But if you have some desire to do some sound processing with ALSA, your likely to be very frustrated.Epilogue
This specific post has gotten about 25% of all the viewings of my blog. I'm not sure why this is the case but I speculate that there are many people tying to make RPi into a Media Player and looking for answers to their technical problems.At this point in time, others have done some additional postings and they are more instructive than my post. You should check out: