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
alsa-lib-1.0.6-5.RHEL4
alsamixergui-0.9.0-0.2.rc1.el4.kb
alsaplayer-0.99.76-3
alsa-utils-1.0.6-5
gcc-java-3.4.6-3
java-1.4.2-gcj-compat-1.4.2.0-27jpp
java-1.5.0-javadoc-1.5.0-1jpp
java-1.5.0-sun-1.5.0.10-2jpp
java-1.5.0-sun-alsa-1.5.0.10-2jpp
java-1.5.0-sun-devel-1.5.0.10-2jpp
java-1.5.0-sun-fonts-1.5.0.10-2jpp
java-1.5.0-sun-jce-policy-1.5.0-1jpp
java-1.5.0-sun-manual-1.5.0-1jpp
java-1.5.0-sun-plugin-1.5.0.10-2jpp

$ 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

# http://www.liddicott.com/~sam/?p=14
# 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
}

# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6271108
# 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"
}

# http://alsa.opensrc.org/DmixPlugin#Still_Hearing_Stuttering.3F
# 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
}

Links:

Advertisements

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:

WordPress.com Logo

You are commenting using your WordPress.com 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 )

Google+ photo

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

Connecting to %s

%d bloggers like this: