Rewrite, simplification of command line option parsing.  Many GUI
fixes.  Input sources are mutually exclusive.
diff --git a/Tools/audiopy/audiopy b/Tools/audiopy/audiopy
index 178b11f..2f3f00a 100755
--- a/Tools/audiopy/audiopy
+++ b/Tools/audiopy/audiopy
@@ -61,14 +61,14 @@
         #
         # where does input come from?
         frame = Frame(root, bd=1, relief=RAISED)
-        frame.grid(row=0, column=0)
+        frame.grid(row=0, column=0, sticky='NSEW')
         label = Label(frame, text='Input From:')
         label.grid(row=0, column=0, sticky=E)
-        self.__micvar = IntVar()
-        btn = Checkbutton(frame,
+        self.__inputvar = IntVar()
+        btn = Radiobutton(frame,
                           text='Microphone',
-                          variable=self.__micvar,
-                          onvalue=MICROPHONE,
+                          variable=self.__inputvar,
+                          value=MICROPHONE,
                           command=self.__pushtodev,
                           underline=0)
         btn.grid(row=0, column=1, sticky=W)
@@ -78,11 +78,10 @@
             btn.configure(state=DISABLED)
         buttons.append(btn)
         ##
-        self.__lineinvar = IntVar()
-        btn = Checkbutton(frame,
+        btn = Radiobutton(frame,
                           text='Line In',
-                          variable=self.__lineinvar,
-                          onvalue=LINE_IN,
+                          variable=self.__inputvar,
+                          value=LINE_IN,
                           command=self.__pushtodev,
                           underline=5)
         btn.grid(row=1, column=1, sticky=W)
@@ -92,11 +91,10 @@
             btn.configure(state=DISABLED)
         buttons.append(btn)
         ##
-        self.__cdvar = IntVar()
-        btn = Checkbutton(frame,
+        btn = Radiobutton(frame,
                           text='CD',
-                          variable=self.__cdvar,
-                          onvalue=CD,
+                          variable=self.__inputvar,
+                          value=CD,
                           command=self.__pushtodev,
                           underline=0)
         btn.grid(row=2, column=1, sticky=W)
@@ -108,7 +106,7 @@
         #
         # where does output go to?
         frame = Frame(root, bd=1, relief=RAISED)
-        frame.grid(row=1, column=0)
+        frame.grid(row=1, column=0, sticky='NSEW')
         label = Label(frame, text='Output To:')
         label.grid(row=0, column=0, sticky=E)
         self.__spkvar = IntVar()
@@ -181,10 +179,8 @@
         except AttributeError:
             pass
         else:
-            import struct
             import fcntl
             import signal
-            import FCNTL
             import STROPTS
             # set up the signal handler
             signal.signal(signal.SIGPOLL, self.__update)
@@ -207,21 +203,19 @@
         # underlying module does not support the SIGPOLL notification
         # interface.
         info = self.__devctl.getinfo()
+        # input
+        self.__inputvar.set(info.i_port)
+        # output
         self.__spkvar.set(info.o_port & SPEAKER)
         self.__headvar.set(info.o_port & HEADPHONE)
         self.__linevar.set(info.o_port & LINE_OUT)
-        self.__micvar.set(info.i_port & MICROPHONE)
-        self.__lineinvar.set(info.i_port & LINE_IN)
-        self.__cdvar.set(info.i_port & CD)
 
     def __pushtodev(self, event=None):
         info = self.__devctl.getinfo()
         info.o_port = self.__spkvar.get() + \
                       self.__headvar.get() + \
                       self.__linevar.get()
-        info.i_port = self.__micvar.get() + \
-                      self.__lineinvar.get() + \
-                      self.__cdvar.get()
+        info.i_port = self.__inputvar.get()
         self.__devctl.setinfo(info)
 
     def __getset(self, var, onvalue):
@@ -232,15 +226,13 @@
         self.__pushtodev()
 
     def __mic(self, event=None):
-        self.__getset(self.__micvar, MICROPHONE)
+        self.__getset(self.__inputvar, MICROPHONE)
 
     def __linein(self, event=None):
-        self.__getset(self.__lineinvar, LINE_IN)
+        self.__getset(self.__inputvar, LINE_IN)
 
     def __cd(self, event=None):
-        print 'pre:', self.__cdvar.get()
-        self.__getset(self.__cdvar, CD)
-        print 'post:', self.__cdvar.get()
+        self.__getset(self.__inputvar, CD)
 
     def __speaker(self, event=None):
         self.__getset(self.__spkvar, SPEAKER)
@@ -286,113 +278,47 @@
                ('--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
     for arg in sys.argv[1:]:
         if arg in ('-h', '--help'):
             usage(code=0)
-        # SPEAKER
-        elif arg in ('-s', '--speaker'):
-            sval = -1
-        elif arg[:3] == '-s=':
+            # does not return
+        for long, short, io, mask in options:
+            if arg in (long, short):
+                # toggle the option
+                if io == 0: 
+                    info.i_port = info.i_port ^ mask
+                else:
+                    info.o_port = info.o_port ^ mask
+                break
+            val = None
             try:
-                sval = int(arg[3:])
+                if arg[:len(long)+1] == long+'=':
+                    val = int(arg[len(long)+1:])
+                elif arg[:len(short)+1] == short+'=':
+                    val = int(arg[len(short)+1:])
             except ValueError:
-                pass
-            if sval <> 0 and sval <> 1:
-                usage('Invalid option: ' + arg)
-        elif arg[:10] == '--speaker=':
-            try:
-                sval = int(arg[10:])
-            except ValueError:
-                pass
-            if sval <> 0 and sval <> 1:
-                usage('Invalid option: ' + arg)
-        # HEADPHONES
-        elif arg in ('-p', '--headphones'):
-            hval = -1
-        elif arg[:3] == '-p=':
-            try:
-                hval = int(arg[3:])
-            except ValueError:
-                pass
-            if hval <> 0 and hval <> 1:
-                usage('Invalid option: ' + arg)
-        elif arg[:13] == '--headphones=':
-            try:
-                hval = int(arg[130:])
-            except ValueError:
-                pass
-            if hval <> 0 and hval <> 1:
-                usage('Invalid option: ' + arg)
-        # LINEOUT
-        elif arg in ('-l', '--lineout'):
-            lval = -1
-        elif arg[:3] == '-l=':
-            try:
-                lval = int(arg[3:])
-            except ValueError:
-                pass
-            if lval <> 0 and lval <> 1:
-                usage('Invalid option: ' + arg)
-        elif arg[:10] == '--lineout=':
-            try:
-                lval = int(arg[10:])
-            except ValueError:
-                pass
-            if lval <> 0 and lval <> 1:
-                usage('Invalid option: ' + arg)
+                usage(msg='Invalid option: ' + arg)
+                # does not return
+            if val == 0:
+                if io == 0:
+                    info.i_port = info.i_port & ~mask
+                else:
+                    info.o_port = info.o_port & ~mask
+                break
+            elif val == 1:
+                if io == 0:
+                    info.i_port = info.i_port | mask
+                else:
+                    info.o_port = info.o_port | mask
+                break
+            # else keep trying next option
         else:
-            usage('Invalid option: ' + arg)
+            usage(msg='Invalid option: ' + arg)
     # now set the values
-    try:
-        devctl = sunaudiodev.open('control')
-        info = devctl.getinfo()
-        if sval is not None:
-            if sval == -1:
-                if info.o_port & SPEAKER:
-                    sval = 0
-                else:
-                    sval = SPEAKER
-            else:
-                sval = sval * SPEAKER
-        else:
-            sval = info.o_port & SPEAKER
-        if hval is not None:
-            if hval == -1:
-                if info.o_port & HEADPHONE:
-                    hval = 0
-                else:
-                    hval = HEADPHONE
-            else:
-                hval = hval * HEADPHONE
-        else:
-            hval = info.o_port & HEADPHONE
-        if lval is not None:
-            if lval == -1:
-                if info.o_port & LINE_OUT:
-                    lval = 0
-                else:
-                    lval = LINE_OUT
-            else:
-                lval = lval * LINE_OUT
-        else:
-            lval = info.o_port & LINE_OUT
-        info.o_port = sval + hval + lval
-        devctl.setinfo(info)
-    finally:
-        devctl.close()
+    device.setinfo(info)
+    device.close()