some rewriting, must do command line args
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