ALSA Software Mixing and Java

This page documents the fix I have been searching for, off and on, for many years. I use Softsqueeze to listen to my music on a Dell Optiplex GX260 running CentOS 4. Softsqueeze never allowed me to hear any other sounds that the system made while it was open. I would have to close the app to hear any other sounds. But it wasn’t Softsqueeze that was causing the problem: it was Sun’s Java and it’s ALSA library.

It seems that Sun’s ALSA library likes to grab the plughw:0,0 device instead of the default device. This bypasses any attempts at redefining the default device as a dmix plugin. Simply redefining plughw in a user’s .asoundrc file solves our problem.

I was also getting some stuttering after redefining pcm.!plughw to be a dmix plugin, so I defined pcm.dmixer to solve it.

$ cat /etc/redhat-release
CentOS release 4.4 (Final)

$ rpm -qa|egrep '(java|alsa)'|sort

$ java -version
java version "1.5.0_10"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: I82801DBICH4 [Intel 82801DB-ICH4], device 0: Intel ICH [Intel 82801DB-ICH4]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: I82801DBICH4 [Intel 82801DB-ICH4], device 4: Intel ICH - IEC958 [Intel 82801DB-ICH4 - IEC958]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

$ cat ~/.asoundrc
# ~/.asoundrc

# Example /etc/asound.conf or ~/.asoundrc file showing how
# to configure ALSA so that a dmix plugin is used by default
# Make ALSA apps default to using dmix plugin instead of hw plugin
# (Exclamation point is needed in order to override the assignment to
# pcm.default in /etc/alsa/alsa.conf.)
pcm.!default {
    type plug
    #slave.pcm "dmix"
    slave.pcm "dmixer"
# Make OSS apps default to using dmix plugin too.
pcm.dsp0 {
    type plug
    #slave.pcm "dmix"
    slave.pcm "dmixer"
# I understand some things get cranky with no mixer defined.
ctl.mixer0 {
    type hw
    card 0

# Java Sound is broken.  Lets make it play nice with others.
# Softsqueeze finally shares the sound device!
pcm.!plughw {
    type plug
    #slave.pcm "dmix"
    slave.pcm "dmixer"

# We have some stuttering.  Lets define larger period_size and buffer_size.
# Then we have to replace any "slave.pcm dmix" with "slave.pcm dmixer" above.
pcm.dmixer {
    type dmix
    ipc_key 1024
    slave {
        pcm "hw:0,0"
        period_time 0
        buffer_time 0
        period_size 2048
        buffer_size 32768
        rate 44100
    bindings {
        0 0
        1 1
ctl.dmixer {
    type hw
    card 0



About Michael Arnold
This is where I write about all of my unix hacking experiences so that you may be able to learn from my troubles.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s

%d bloggers like this: