Jump to content

Configuring Sound on Linux/Printable version

From Wikibooks, open books for an open world


Configuring Sound on Linux

The current, editable version of this book is available in Wikibooks, the open-content textbooks collection, at
https://en.wikibooks.org/wiki/Configuring_Sound_on_Linux

Permission is granted to copy, distribute, and/or modify this document under the terms of the Creative Commons Attribution-ShareAlike 3.0 License.

Pulse Audio/Pulse apps

A typical PulseAudio distribution comes with numerous different programs. Refer to the man pages for more information. All official PulseAudio applications are prefixed with pa.

paplay
Plays wavs and select other audio files. This is not an mp3 player.
pacat
Plays and records streams
PulseAudio alternative to aplay
pasuspender
Permits another device to access the sound device directly. Typically this is used for applications that can not plug into pulseaudio.
pactl
Controls the running pulseaudio server/daemon.
padsp
Creates a dsp and other devices for a transparent abstraction of a non-existent device.
pacmd
PulseAudio shell into pactl


Pulse Audio/Testing

To test a PulseAudio installation use pacat which is equivalent to ALSA's aplay utility. Warning: the output from this command may be _very_ loud.

 pacat < /dev/urandom

Using pacmd

[edit | edit source]

Firstly run pacmd.

~$ pacmd
Welcome to PulseAudio! Use "help" for usage information.

Next run the command list-sinks.

>>> list-sinks
1 sink(s) available.
  * index: 0
        name: <alsa_output.pci_8086_27d8_sound_card_0_alsa_playback_0>
        driver: <modules/module-alsa-sink.c>
        flags: HW_VOLUME_CTRL LATENCY HARDWARE 
        state: RUNNING
        volume: <0:  63% 1:  63%>
        mute: <0>
        latency: <78911 usec>
        monitor source: <1>
        sample spec: <s16le 2ch 44100Hz>
        channel map: <front-left,front-right>
        used by: <1>
        linked by: <1>
        module: <1>
        description: <ALSA PCM on front:0 (AD198x Analog) via DMA>

Now you know the name of your sink and your index. In this example the name is alsa_output.pci_8086_27d8_sound_card_0_alsa_playback_0, and the index is 0. Now you will want a list of samples, use list-samples to accomplish this.

>>> list-samples
3 cache entries available.
    name: <pulse-hotplug>
        index: <0>
        sample spec: <n/a>
        channel map: <n/a>
        length: <0>
        duration: <0.0s>
        volume: <0: 100% 1: 100%>
        lazy: yes
        filename: /usr/share/sounds/startup3.wav
    name: <esound.gnome-2/logout>
        index: <1>
        sample spec: <s16le 2ch 44100Hz>
        channel map: <front-left,front-right>
        length: <317500>
        duration: <1.8s>
        volume: <0: 100% 1: 100%>
        lazy: no
        filename: n/a
    name: <esound.gnome-2/login>
        index: <2>
        sample spec: <s16le 2ch 44100Hz>
        channel map: <front-left,front-right>
        length: <1361924>
        duration: <7.7s>
        volume: <0: 100% 1: 100%>
        lazy: no
        filename: n/a

Now you can use the command play-sample followed by the name of the sample, and the index or the sink-name to test your PulseAudio configuration.

>>> play-sample pulse-hotplug 0
-or-
>>> play-sample pulse-hotplug alsa_output.pci_8086_27d8_sound_card_0_alsa_playback_0



Pulse Audio/Troubleshooting

This document entails issues you might encounter with PulseAudio.

Verbose error capturing

[edit | edit source]

Wanto to figure out what PulseAudio is doing? Try the following.

 $ pulseaudio -v --log-target=stderr

Errors and solutions

[edit | edit source]

Wrong Sample Freq

[edit | edit source]

Symptom

[edit | edit source]

If you have the sample frequence set wrong you might encounter an error like this when you startup PulseAudio

$ pulseaudio
W: alsa-util.c: Device HDMI doesn't support 44800 Hz, changed to 48000 Hz.

Solution

[edit | edit source]

Explicitly set the rate for the PulseAudio module in /etc/pulse/default.pa.

load-module module-alsa-sink device=HDMI rate=48000

Sound Stops Working

[edit | edit source]

Symptom

[edit | edit source]

You suddenly have no sound afer you wake up your computer or when you plug headphones, but alsamixer show that sound is enabled and volume can be hight.

Solution

[edit | edit source]

Check pacmd command if your sound is not mute:

$ pacmd
Welcome to PulseAudio! Use "help" for usage information.
>>> list-sinks
2 sink(s) available.
    index: 0
	name: <alsa_output.pci-0000_01_05.1.hdmi-stereo>
	driver: <module-alsa-card.c>
	flags: HARDWARE DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
	state: SUSPENDED
	suspend cause: IDLE 
	priority: 9050
	volume: 0: 100% 1: 100%
	        0: 0,00 dB 1: 0,00 dB
	        balance 0,00
	base volume: 100%
	             0,00 dB
	volume steps: 65537
	muted: no

     ...

  * index: 1
	name: <alsa_output.pci-0000_00_14.2.analog-stereo>
	driver: <module-alsa-card.c>
	flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
	state: RUNNING
	suspend cause: 
	priority: 9959
	volume: 0: 100% 1: 100%
	        0: 0,00 dB 1: 0,00 dB
	        balance 0,00
	base volume:  63%
	             -12,00 dB
	volume steps: 65537
	muted: yes

Second sink is mute so we need to unmute it

>>> set-sink-mute 1 false

Additionaly restarting pulseaudio may be needed

$ sudo /etc/init.d/pulseaudio restart

NOTE: If you play video using flash in Browser (like YouTube) you can enable sound but when you exit from pacmd the sound stop and when you try to enter pacmd again to show that pulseaudio is not running in the session, in this case refreshing the page with the video solve the issue.


Pulse Audio/Remote server

RTP streams use multicast IP adresses like 224.0.0.56 (default) and UDP datagrams for transport. Multicasts are generally not allowed in Internet (blocked by ISPs). RTP is designed for low latency.

Server

[edit | edit source]
 $ pactl load-module module-rtp-recv

Client

[edit | edit source]
 $ pactl load-module module-rtp-send

Only uncompressed audio is supported.

Configuring the Server

[edit | edit source]

This process is rather simple. You will need to load module-native-protocol-tcp. You can optionally specify an auth-ip-acl to permit/blacklist anonymous connections from specific ips or IP ranges (to list more than one, separate by semicolon).

$ pactl load-module module-native-protocol-tcp auth-ip-acl=192.168.1.138

Configuring the Client

[edit | edit source]

Simply set the environmental variable PULSE_SERVER to the destination and PulseAudio will redirect the stream over tcp to the provided destination.

$ PULSE_SERVER=192.168.1.146 totem


HW Address

This document will teach you how to find an address and confirm it is working.

Find the hardware address

[edit | edit source]

Using aplay

[edit | edit source]

The stock ALSA utility aplay can tell you the hardware addresses of the devices it is ready to use. Simply supply to aplay the --list-devices argument.

$ aplay --list-devices
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA ATI HDMI], device 3: ATI HDMI [ATI HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Note, for this card the notation for the physical address would be hw:0,3. While the device name, is HDMI

Using /proc

[edit | edit source]

Here we will use proc to query our kernel for information.

By viewing the virtual file /proc/asound/cards your kernel will show you the device names for the cards it is has ready for use. If your card isn't listed here then your kernel does not support it. The device names can be found in the brackets.

$ cat /proc/asound/cards

An example of the output for device HDMI might be:

 0 [HDMI           ]: HDA-Intel - HDA ATI HDMI
                      HDA ATI HDMI at 0xfbee8000 irq 19

The kernel should have created a virtual directory for each card in /proc/asound. The directories associated with the card will be prefixed by 'card' and suffixed by the number of the card, ex., card0, card1, etc.; i.e., '0' in our example.

Inside of these directories you will find a simple list of files.

$ tree /proc/asound/card0/
/proc/asound/card0/
|-- codec#0
|-- id
|-- oss_mixer
`-- pcm3p
    |-- info
    `-- sub0
        |-- hw_params
        |-- info
        |-- prealloc
        |-- prealloc_max
        |-- status
        `-- sw_params

2 directories, 10 files

The most important file is the pcm3p/info, by examining this file we can finish our search for the hardware coordinates of the sound devices.

$ cat /proc/asound/card0/pcm3p/info
card: 0
device: 3
subdevice: 0
stream: PLAYBACK
id: ATI HDMI
name: ATI HDMI
subname: subdevice #0
class: 0
subclass: 0
subdevices_count: 1
subdevices_avail: 1

Writing the hardware address

[edit | edit source]

Now you know the basics about your card! Specifically, you'll need the card number, and the device number. These two are often seen in ALSA hardware notation as hw:CARD,DEVICE, which is totally dependent on the order the kernel detects them.

Test the address

[edit | edit source]

Firstly, make sure your device in question is un-muted! You can test the functionality of you default card at any time by using the following command:

 cat /dev/urandom | aplay

This will bombard your card with random and totally irrelevant data. Your card will present this data to you in the form of sound à la modem noise. To stop that noise ^D (hold Control and press D). Alternatively, you can use the dd command to flash-test.

 dd if=/dev/urandom count=5 | aplay

Presumably, if you're reading this tutorial your sound isn't working. You might want to explicitly test a sound device, or you might be having problems with the default and want to try out another device. Whatever have you, the -D argument to aplay does just that.

 cat /dev/urandom | aplay -D hw:0,3 ## Where 0,3 is your hardware's coordinates

If you hear sound, enjoy—your card works and is fully compatible with your operating system.


ALSA/Testing

Testing Alsa on each channel

[edit | edit source]

Modern versions of ALSA should include the utility speaker-test that permits you to test each channel of output, this is necessary to confirm modern systems are properly configured.

You can invoke this command on the ALSA Device:

speaker-test -D HDMI


ALSA/Troubleshooting

Errors and Solutions

[edit | edit source]

Kernel lacks appropriate modules

[edit | edit source]

Symptom

[edit | edit source]

Indicated by:

  • The virtual directory /proc/asound is not present
  • The command aplay -l returns no sound cards present
  • The sound card shows up under some hardware detection mechanism, i.e., lspci

Sometimes the cause of this is selectively pulling out modules suggested by a dist-upgrade, such as the kernel, without the kernel modules.

Solution

[edit | edit source]

Add the appropriate modules to your kernel. In Ubuntu you can upgrade to the newest kernel and modules by issuing the following command:

 $ sudo apt-get install linux-generic

Invalid card specified

[edit | edit source]

Symptom

[edit | edit source]

If you encounter the following error it simply means you are targeting a non-existent or erroneous device:

$ cat /dev/urandom | aplay
ALSA lib pcm_hw.c:1207:(_snd_pcm_hw_open) Invalid value for card
aplay: main:546: audio open error: No such file or directory

Solution

[edit | edit source]

This can often be remedied by simply specifying the device explicitly.

 cat /dev/urandom | aplay -D hw:0,3

Bad sample

[edit | edit source]

Symptom

[edit | edit source]

This is a rather complex option . Essentially, hardware expects a certain datatype for the sound sample, and you're providing the wrong one.

 aplay: set_params:901: Sample format non available

Solution

[edit | edit source]

Specify the sample format, or amend the rate in the ALSA conf file.

 cat /dev/urandom | aplay -f S16_LE ## Where S16_LE is your desired rate

No channel count

[edit | edit source]

Symptom

[edit | edit source]

If you do not provide to ALSA the amount of channels you wish to output to, you'll get the following error:

 aplay: set_params:901: Channels count non available

Solution

[edit | edit source]

Specify the amount of channels you wish to output too. Two is considered safe for the purpose of troubleshooting.

 cat /dev/urandom | aplay -c 2 ## Two channels is stereo sound