diff --git a/Tools/audiopy/audiopy b/Tools/audiopy/audiopy
index afc7fd0..178b11f 100755
--- a/Tools/audiopy/audiopy
+++ b/Tools/audiopy/audiopy
@@ -6,23 +6,26 @@
 choose which audio output device you want sound to go to.
 
 This program can be driven via the command line, and when done so, no window
-pops up.  Here are the options:
+pops up.  Options have the general form:
 
-    --headphones[={0,1}]
-    -p[={0,1}]
-        Set the headphones output device.  With no value, it toggles the
-        headphone device.  With a value, 0 turns the headphones off and 1
-        turns the headphones on.
+    --device[={0,1}]
+    -d[={0,1}]
+        Set the I/O device.  With no value, it toggles the specified device.
+        With a value, 0 turns the device off and 1 turns the device on.
 
-    --speaker[={0,1}]
-    -s[={0,1}]
-        Set the speaker output device.  Value semantics are the same as
-        above.
+The list of devices and their short options are:
 
-    --lineout[={0,1}]
-    -l[={0,1}]
-        Set the line out output device.  Value semantics are the same as
-        above.
+ (input)
+    microphone  -- m
+    linein      -- i
+    cd          -- c
+
+ (output)
+    headphones  -- p
+    speaker     -- s
+    lineout     -- o
+
+Other options are:
 
     --help
     -h
@@ -41,38 +44,20 @@
 
 
 class MainWindow:
-    def __init__(self):
+    def __init__(self, device):
+        self.__devctl = device
+        info = device.getinfo()
+        #
         self.__tkroot = tkroot = Tk(className='Pynche')
         tkroot.withdraw()
-        # create the menubar
-        menubar = Menu(tkroot)
-        #
-        # File menu
-        #
-        filemenu = Menu(menubar, tearoff=0)
-        filemenu.add_command(label='Quit',
-                             command=self.__quit,
-                             accelerator='Alt-Q',
-                             underline=0)
-        #
-        # Tie them together
-        #
-        menubar.add_cascade(label='File',
-                            menu=filemenu,
-                            underline=0)
         # now create the top level window
-        root = self.__root = Toplevel(tkroot, class_='Audiopy', menu=menubar)
+        root = self.__root = Toplevel(tkroot, class_='Audiopy')
         root.protocol('WM_DELETE_WINDOW', self.__quit)
         root.title('Audiopy')
         root.iconname('Audiopy')
         root.tk.createtimerhandler(KEEPALIVE_TIMER, self.__keepalive)
-        root.bind('<Alt-q>', self.__quit)
-        root.bind('<Alt-Q>', self.__quit)
         #
-        # Open up the audio control device and query for the current output
-        # device
-        self.__devctl = sunaudiodev.open('control')
-        info = self.__devctl.getinfo()
+        buttons = []
         #
         # where does input come from?
         frame = Frame(root, bd=1, relief=RAISED)
@@ -89,6 +74,10 @@
         btn.grid(row=0, column=1, sticky=W)
         root.bind('<Alt-m>', self.__mic)
         root.bind('<Alt-M>', self.__mic)
+        if not info.i_avail_ports & MICROPHONE:
+            btn.configure(state=DISABLED)
+        buttons.append(btn)
+        ##
         self.__lineinvar = IntVar()
         btn = Checkbutton(frame,
                           text='Line In',
@@ -99,6 +88,10 @@
         btn.grid(row=1, column=1, sticky=W)
         root.bind('<Alt-i>', self.__linein)
         root.bind('<Alt-I>', self.__linein)
+        if not info.i_avail_ports & LINE_IN:
+            btn.configure(state=DISABLED)
+        buttons.append(btn)
+        ##
         self.__cdvar = IntVar()
         btn = Checkbutton(frame,
                           text='CD',
@@ -109,6 +102,9 @@
         btn.grid(row=2, column=1, sticky=W)
         root.bind('<Alt-c>', self.__cd)
         root.bind('<Alt-C>', self.__cd)
+        if not info.i_avail_ports & CD:
+            btn.configure(state=DISABLED)
+        buttons.append(btn)
         #
         # where does output go to?
         frame = Frame(root, bd=1, relief=RAISED)
@@ -125,6 +121,10 @@
         btn.grid(row=0, column=1, sticky=W)
         root.bind('<Alt-s>', self.__speaker)
         root.bind('<Alt-S>', self.__speaker)
+        if not info.o_avail_ports & SPEAKER:
+            btn.configure(state=DISABLED)
+        buttons.append(btn)
+        ##
         self.__headvar = IntVar()
         btn = Checkbutton(frame,
                           text='Headphones',
@@ -135,6 +135,10 @@
         btn.grid(row=1, column=1, sticky=W)
         root.bind('<Alt-h>', self.__headphones)
         root.bind('<Alt-H>', self.__headphones)
+        if not info.o_avail_ports & HEADPHONE:
+            btn.configure(state=DISABLED)
+        buttons.append(btn)
+        ##
         self.__linevar = IntVar()
         btn = Checkbutton(frame,
                           variable=self.__linevar,
@@ -145,6 +149,29 @@
         btn.grid(row=2, column=1, sticky=W)
         root.bind('<Alt-l>', self.__lineout)
         root.bind('<Alt-L>', self.__lineout)
+        if not info.o_avail_ports & LINE_OUT:
+            btn.configure(state=DISABLED)
+        buttons.append(btn)
+        #
+        # Fix up widths
+        widest = 0
+        for b in buttons:
+            width = b['width']
+            if width > widest:
+                widest = width
+        for b in buttons:
+            b.configure(width=widest)
+        #
+        # Add quit button
+        frame = Frame(root)
+        frame.grid(row=2, column=0, sticky='EW', ipady=5)
+        btn = Button(frame,
+                     text='Quit',
+                     command=self.__quit,
+                     underline=0)
+        btn.pack(expand=YES)
+        root.bind('<Alt-q>', self.__quit)
+        root.bind('<Alt-Q>', self.__quit)
         #
         # do we need to poll for changes?
         self.__needtopoll = 1
@@ -211,7 +238,9 @@
         self.__getset(self.__lineinvar, LINE_IN)
 
     def __cd(self, event=None):
+        print 'pre:', self.__cdvar.get()
         self.__getset(self.__cdvar, CD)
+        print 'post:', self.__cdvar.get()
 
     def __speaker(self, event=None):
         self.__getset(self.__spkvar, SPEAKER)
@@ -235,16 +264,38 @@
 
 
 def main():
+    #
+    # Open up the audio control device and query for the current output
+    # device
+    device = sunaudiodev.open('control')
+
     if len(sys.argv) == 1:
         # GUI
-        w = MainWindow()
+        w = MainWindow(device)
         try:
             w.start()
         except KeyboardInterrupt:
             pass
         return
 
-    # command line
+    # spec:    LONG OPT, SHORT OPT, 0=input,1=output, MASK
+    options = (('--microphone', '-m', 0, MICROPHONE),
+               ('--linein',     '-i', 0, LINE_IN),
+               ('--cd',         '-c', 0, CD),
+               ('--headphones', '-p', 1, HEADPHONE),
+               ('--speaker',    '-s', 1, SPEAKER),
+               ('--lineout',    '-o', 1, LINE_OUT),
+               )
+    values = []
+    info = device.getinfo()
+    # first get the existing values
+    for long, short, io, mask in options:
+        if io == 0:
+            flags = info.i_port
+        else:
+            flags = info.o_port
+        values.append(flags & mask)
+
     sval = None
     hval = None
     lval = None
