home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Demo / sgi / audio_stdwin / rec.py < prev    next >
Text File  |  1996-11-27  |  6KB  |  269 lines

  1. #! /usr/bin/env python
  2.  
  3. import sys
  4. import audio
  5. import stdwin
  6.  
  7. import string
  8. import getopt
  9.  
  10. from stdwinevents import *
  11. from Buttons import *
  12. from Sliders import *
  13. #from Soundogram import Soundogram
  14. from VUMeter import VUMeter
  15. from WindowParent import WindowParent, MainLoop
  16. from HVSplit import HSplit, VSplit
  17.  
  18. class TimeOutToggleButton(ToggleButton):
  19.     def define(self, parent):
  20.         self = ToggleButton.define(self, parent)
  21.         self.parent.need_timer(self)
  22.         self.timer_hook = 0
  23.         return self
  24.     def timer(self):
  25.         if self.timer_hook:
  26.             self.timer_hook(self)
  27.  
  28. K = 1024
  29. BUFSIZE = 30*8*K
  30. Rates = [0, 32*K, 16*K, 8*K]
  31. Magics = ['', '0032', '0016', '0008']
  32.  
  33. class Struct: pass
  34. G = Struct()
  35.  
  36. def main():
  37.     #
  38.     # Turn off scroll bars
  39.     #
  40.     stdwin.setdefscrollbars(0, 0)
  41.     #
  42.     # Set default state
  43.     #
  44.     G.gain = 60
  45.     G.rate = 3
  46.     G.nomuting = 0
  47.     G.savefile = '@rec'
  48.     #
  49.     # Set default values
  50.     #
  51.     G.data = ''
  52.     G.playing = 0
  53.     G.recording = 0
  54.     G.sogram = 0
  55.     #
  56.     # Parse options
  57.     #
  58.     optlist, args = getopt.getopt(sys.argv[1:], 'mdg:r:')
  59.     #
  60.     for optname, optarg in optlist:
  61.         if 0: # (So all cases start with elif)
  62.             pass
  63.         elif optname == '-d':
  64.             G.debug = 1
  65.         elif optname == '-g':
  66.             G.gain = string.atoi(optarg)
  67.             if not (0 < G.gain < 256):
  68.                 raise optarg.error, '-g gain out of range'
  69.         elif optname == '-m':
  70.             G.nomuting = (not G.nomuting)
  71.         elif optname == '-r':
  72.             G.rate = string.atoi(optarg)
  73.             if not (1 <= G.rate <= 3):
  74.                 raise optarg.error, '-r rate out of range'
  75.     #
  76.     if args:
  77.         G.savefile = args[0]
  78.     #
  79.     # Initialize the sound package
  80.     #
  81.     audio.setoutgain(G.nomuting * G.gain)    # Silence the speaker
  82.     audio.setrate(G.rate)
  83.     #
  84.     # Create the WindowParent and VSplit
  85.     #
  86.     G.window = WindowParent().create('Recorder', (0, 0))
  87.     w = G.vsplit = VSplit().create(G.window)
  88.     #
  89.     # VU-meter
  90.     #
  91.     G.vubtn = VUMeter().define(w)
  92.     #
  93.     # Radiobuttons for rates
  94.     #
  95.     r1btn = RadioButton().definetext(w, '32 K/sec')
  96.     r1btn.on_hook = rate_hook
  97.     r1btn.rate = 1
  98.     #
  99.     r2btn = RadioButton().definetext(w, '16 K/sec')
  100.     r2btn.on_hook = rate_hook
  101.     r2btn.rate = 2
  102.     #
  103.     r3btn = RadioButton().definetext(w, '8 K/sec')
  104.     r3btn.on_hook = rate_hook
  105.     r3btn.rate = 3
  106.     #
  107.     radios = [r1btn, r2btn, r3btn]
  108.     r1btn.group = r2btn.group = r3btn.group = radios
  109.     for r in radios:
  110.         if r.rate == G.rate: r.select(1)
  111.     #
  112.     # Other controls
  113.     #
  114.     G.recbtn = TimeOutToggleButton().definetext(w, 'Record')
  115.     G.recbtn.on_hook = record_on_hook
  116.     G.recbtn.timer_hook = record_timer_hook
  117.     G.recbtn.off_hook = record_off_hook
  118.     #
  119.     G.mutebtn = CheckButton().definetext(w, 'Mute')
  120.     G.mutebtn.select(not G.nomuting)
  121.     G.mutebtn.hook = mute_hook
  122.     #
  123.     G.playbtn = TimeOutToggleButton().definetext(w, 'Playback')
  124.     G.playbtn.on_hook = play_on_hook
  125.     G.playbtn.timer_hook = play_timer_hook
  126.     G.playbtn.off_hook = play_off_hook
  127.     #
  128.     G.gainbtn = ComplexSlider().define(w)
  129.     G.gainbtn.settexts('  Volume: ', '  ')
  130.     G.gainbtn.setminvalmax(0, G.gain, 255)
  131.     G.gainbtn.sethook(gain_hook)
  132.     #
  133.     G.sizebtn = Label().definetext(w, `len(G.data)` + ' bytes')
  134.     #
  135.     #G.showbtn = PushButton().definetext(w, 'Sound-o-gram...')
  136.     #G.showbtn.hook = show_hook
  137.     #
  138.     G.savebtn = PushButton().definetext(w, 'Save...')
  139.     G.savebtn.hook = save_hook
  140.     #
  141.     G.quitbtn = PushButton().definetext(w, 'Quit')
  142.     G.quitbtn.hook = quit_hook
  143.     G.playbtn.enable(0)
  144.     G.savebtn.enable(0)
  145.     #G.showbtn.enable(0)
  146.     start_vu()
  147.     G.window.realize()
  148.     #
  149.     # Event loop
  150.     #
  151.     MainLoop()
  152.  
  153. # XXX Disabled...
  154. def show_hook(self):
  155.     savetext = self.text
  156.     self.settext('Be patient...')
  157.     close_sogram()
  158.     stdwin.setdefwinsize(400, 300)
  159.     win = stdwin.open('Sound-o-gram')
  160.     G.sogram = Soundogram().define(win, G.data)
  161.     win.buttons = [G.sogram]
  162.     self.settext(savetext)
  163.  
  164. def close_sogram():
  165.     if G.sogram:
  166.         # Break circular references
  167.         G.sogram.win.buttons[:] = []
  168.         del G.sogram.win
  169.         G.sogram = 0
  170.  
  171. def mute_hook(self):
  172.     G.nomuting = (not self.selected)
  173.     audio.setoutgain(G.nomuting * G.gain)
  174.  
  175. def rate_hook(self):
  176.     G.rate = self.rate
  177.     audio.setrate(G.rate)
  178.  
  179. def record_on_hook(self):
  180.     stop_vu()
  181.     close_sogram()
  182.     audio.setrate(G.rate)
  183.     audio.setoutgain(G.nomuting * G.gain)
  184.     audio.start_recording(BUFSIZE)
  185.     G.recording = 1
  186.     G.playbtn.enable(0)
  187.     G.window.settimer(10 * BUFSIZE / Rates[G.rate])
  188.  
  189. def record_timer_hook(self):
  190.     if G.recording:
  191.         if audio.poll_recording():
  192.             self.hilite(0)
  193.             record_off_hook(self)
  194.         else:
  195.             self.parent.settimer(5)
  196.  
  197. def record_off_hook(self):
  198.     if not G.recording:
  199.         return
  200.     G.data = audio.stop_recording()
  201.     G.recording = 0
  202.     G.sizebtn.settext(`len(G.data)` + ' bytes')
  203.     audio.setoutgain(G.nomuting * G.gain)
  204.     G.playbtn.enable((len(G.data) > 0))
  205.     G.savebtn.enable((len(G.data) > 0))
  206.     #G.showbtn.enable((len(G.data) > 0))
  207.     G.window.settimer(0)
  208.     start_vu()
  209.  
  210. def play_on_hook(self):
  211.     stop_vu()
  212.     audio.setrate(G.rate)
  213.     audio.setoutgain(G.gain)
  214.     audio.start_playing(G.data)
  215.     G.playing = 1
  216.     G.recbtn.enable(0)
  217.     G.window.settimer(max(10 * len(G.data) / Rates[G.rate], 1))
  218.  
  219. def play_timer_hook(self):
  220.     if G.playing:
  221.         if audio.poll_playing():
  222.             self.hilite(0)
  223.             play_off_hook(self)
  224.         else:
  225.             self.parent.settimer(5)
  226.  
  227. def play_off_hook(self):
  228.     if not G.playing:
  229.         return
  230.     x = audio.stop_playing()
  231.     G.playing = 0
  232.     audio.setoutgain(G.nomuting * G.gain)
  233.     G.recbtn.enable(1)
  234.     G.window.settimer(0)
  235.     start_vu()
  236.  
  237. def gain_hook(self):
  238.     G.gain = self.val
  239.     if G.playing or G.nomuting: audio.setoutgain(G.gain)
  240.  
  241. def save_hook(self):
  242.     if not G.data:
  243.         stdwin.fleep()
  244.     else:
  245.         prompt = 'Store sampled data on file: '
  246.         try:
  247.             G.savefile = stdwin.askfile(prompt, G.savefile, 1)
  248.         except KeyboardInterrupt:
  249.             return
  250.         try:
  251.             fp = open(G.savefile, 'w')
  252.             fp.write(Magics[G.rate] + G.data)
  253.         except:
  254.             stdwin.message('Cannot create ' + file)
  255.  
  256. def stop_vu():
  257.     G.vubtn.stop()
  258.  
  259. def start_vu():
  260.     G.vubtn.start()
  261.  
  262. def quit_hook(self):
  263.     G.window.delayed_destroy()
  264.  
  265. try:
  266.     main()
  267. finally:
  268.     audio.setoutgain(0)
  269.