A simple Python mixer (to solve a problem with sound in Natty)
I had to buy a new hard drive recently, and figured as long as I had a new install ahead of me, why not try the latest Ubuntu 11.04 beta, "Natty Narwhal"?One of the things I noticed right away was that sound was really LOUD! -- and my usual volume keys weren't working to change that.
I have a simple setup under openbox: Meta-F7 and Meta-F8 call a shell
script called "louder" and "softer" (two links to the same script),
and depending on how it's invoked, the script calls
aumix -v +4
or aumix -v -4
.
Great, except it turns out aumix doesn't work -- at all -- under Natty (bug 684416). Rumor has it that Natty has dropped all support for OSS sound, though I don't know if that's actually true -- the bug has been sitting for four months without anyone commenting on it. (Ubuntu never seems terribly concerned about having programs in their repositories that completely fail to do anything; sadly, programs can persist that way for years.)
The command-line replacement for aumix seems to be amixer, but its
documentation is sketchy at best. After a bit of experimentation, I
found if I set the Master volume to 100% using alsamixergui, I could
call amixer set PCM 4-
or 4-
. But I couldn't
use amixer set Master 4+
-- sometimes it would work but
most of the time it wouldn't.
That all seemed a bit too flaky for me -- surely there must be a better way? Some magic Python library? Sure enough, there's python-alsaaudio, and learning how to use it took a lot less time than I'd already wasted trying random amixer commands to see what worked. Here's the program:
#!/usr/bin/env python # Set the volume louder or softer, depending on program name. import alsaaudio, sys, os increment = 4 # First find a mixer. Use the first one. try : mixer = alsaaudio.Mixer('Master', 0) except alsaaudio.ALSAAudioError : sys.stderr.write("No such mixer\n") sys.exit(1) cur = mixer.getvolume()[0] if os.path.basename(sys.argv[0]).startswith("louder") : mixer.setvolume(cur + increment, alsaaudio.MIXER_CHANNEL_ALL) else : mixer.setvolume(cur - increment, alsaaudio.MIXER_CHANNEL_ALL) print "Volume from", cur, "to", mixer.getvolume()[0]
[ 21:13 Apr 18, 2011 More programming | permalink to this entry | ]