summaryrefslogtreecommitdiffstats
path: root/Tools/audiopy
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>1998-10-30 18:21:52 (GMT)
committerBarry Warsaw <barry@python.org>1998-10-30 18:21:52 (GMT)
commit2a06084ed51d06cdea9544b5ab02586d300dec83 (patch)
treeca53ec6bcb2eac03134eae0b58b61e49dfa1825a /Tools/audiopy
parent11b7ae51210713823d6f3228e5db7affe9e101aa (diff)
downloadcpython-2a06084ed51d06cdea9544b5ab02586d300dec83.zip
cpython-2a06084ed51d06cdea9544b5ab02586d300dec83.tar.gz
cpython-2a06084ed51d06cdea9544b5ab02586d300dec83.tar.bz2
Added command line options
Diffstat (limited to 'Tools/audiopy')
-rwxr-xr-xTools/audiopy/audiopy274
1 files changed, 273 insertions, 1 deletions
diff --git a/Tools/audiopy/audiopy b/Tools/audiopy/audiopy
index c3272dd..3e6d88a 100755
--- a/Tools/audiopy/audiopy
+++ b/Tools/audiopy/audiopy
@@ -1 +1,273 @@
-#! /usr/env/bin python
+#! /usr/bin/env python
+
+"""Program to control the Solaris audio device.
+
+When no arguments are given, this pops up a graphical window which lets you
+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:
+
+ --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.
+
+ --speaker[={0,1}]
+ -s[={0,1}]
+ Set the speaker output device. Value semantics are the same as
+ above.
+
+ --lineout[={0,1}]
+ -l[={0,1}]
+ Set the line out output device. Value semantics are the same as
+ above.
+
+ --help
+ -h
+ Print this message and exit.
+
+"""
+
+import sys
+from Tkinter import *
+import sunaudiodev
+from SUNAUDIODEV import *
+
+# Milliseconds between interrupt checks
+KEEPALIVE_TIMER = 500
+
+
+
+class MainWindow:
+ def __init__(self):
+ 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.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()
+
+ #
+ # create the speaker/headphone radio button
+ label = Label(root, text='Output to:')
+ label.grid(row=0, column=0, sticky=E)
+ self.__spkvar = IntVar()
+ btn = Checkbutton(root,
+ text='Speaker',
+ variable=self.__spkvar,
+ onvalue=SPEAKER,
+ command=self.__outputto,
+ underline=0)
+ btn.grid(row=0, column=1, sticky=W)
+ root.bind('<Alt-s>', self.__speaker)
+ root.bind('<Alt-S>', self.__speaker)
+ self.__headvar = IntVar()
+ btn = Checkbutton(root,
+ text='Headphones',
+ variable=self.__headvar,
+ onvalue=HEADPHONE,
+ command=self.__outputto,
+ underline=0)
+ btn.grid(row=1, column=1, sticky=W)
+ root.bind('<Alt-h>', self.__headphones)
+ root.bind('<Alt-H>', self.__headphones)
+ self.__linevar = IntVar()
+ btn = Checkbutton(root,
+ variable=self.__linevar,
+ onvalue=LINE_OUT,
+ text='Line out',
+ command=self.__outputto,
+ underline=0)
+ btn.grid(row=2, column=1, sticky=W)
+ root.bind('<Alt-l>', self.__lineout)
+ root.bind('<Alt-L>', self.__lineout)
+
+ def __quit(self, event=None):
+ self.__devctl.close()
+ self.__root.quit()
+
+ def __keepalive(self):
+ # Exercise the Python interpreter regularly so keyboard interrupts get
+ # through.
+ self.__tkroot.tk.createtimerhandler(KEEPALIVE_TIMER, self.__keepalive)
+ #
+ # We have to poll because the device could have changed state and the
+ # underlying module does not support the SIGPOLL notification
+ # interface.
+ info = self.__devctl.getinfo()
+ self.__spkvar.set(info.o_port & SPEAKER)
+ self.__headvar.set(info.o_port & HEADPHONE)
+ self.__linevar.set(info.o_port & LINE_OUT)
+
+ def __outputto(self, event=None):
+ info = self.__devctl.getinfo()
+ info.o_port = self.__spkvar.get() + \
+ self.__headvar.get() + \
+ self.__linevar.get()
+ self.__devctl.setinfo(info)
+
+ def __getset(self, var, onvalue):
+ if var.get():
+ var.set(0)
+ else:
+ var.set(onvalue)
+ self.__outputto()
+
+ def __speaker(self, event=None):
+ self.__getset(self.__spkvar, SPEAKER)
+
+ def __headphones(self, event=None):
+ self.__getset(self.__headvar, HEADPHONE)
+
+ def __lineout(self, event=None):
+ self.__getset(self.__linevar, LINE_OUT)
+
+ def start(self):
+ self.__keepalive()
+ self.__tkroot.mainloop()
+
+
+
+def usage(msg='', code=1):
+ print __doc__
+ print msg
+ sys.exit(code)
+
+
+def main():
+ if len(sys.argv) == 1:
+ # GUI
+ w = MainWindow()
+ w.start()
+ return
+
+ # command line
+ 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=':
+ try:
+ sval = int(arg[3:])
+ 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)
+ else:
+ usage('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()
+
+
+
+if __name__ == '__main__':
+ main()