diff options
Diffstat (limited to 'Demo/sgi/video/Vb.py')
-rwxr-xr-x | Demo/sgi/video/Vb.py | 962 |
1 files changed, 0 insertions, 962 deletions
diff --git a/Demo/sgi/video/Vb.py b/Demo/sgi/video/Vb.py deleted file mode 100755 index e1b06d6..0000000 --- a/Demo/sgi/video/Vb.py +++ /dev/null @@ -1,962 +0,0 @@ -#! /usr/bin/env python - -# Video bag of tricks: record video(+audio) in various formats and modes - -# XXX To do: -# - audio -# - improve user interface -# - help button? -# - command line options to set initial settings -# - save settings in a file -# - ...? - -import sys -import time -import getopt -import string -import os -sts = os.system('makemap') # Must be before "import fl" to work -import sgi -import gl -import GL -import DEVICE -import fl -import FL -import flp -import watchcursor -import sv -import SV -import VFile -import VGrabber -import imageop -sys.path.append('/ufs/jack/src/av/vcr') -import VCR -try: - import cl -except ImportError: - cl = None - -ARROW = 0 -WATCH = 1 -watchcursor.defwatch(WATCH) - -def main(): -## fl.set_graphics_mode(0, 1) - vb = VideoBagOfTricks() - while 1: - dummy = fl.do_forms() - [dummy] - -StopCapture = 'StopCapture' - -VideoFormatLabels = ['Video off', 'rgb8', 'grey8', 'grey4', 'grey2', \ - 'grey2 dith', 'mono dith', 'mono thresh', 'rgb24', 'rgb24-jpeg', \ - 'compress'] -VideoFormats = ['', 'rgb8', 'grey', 'grey4', 'grey2', \ - 'grey2', 'mono', 'mono', 'rgb', 'jpeg', 'compress'] - -VideoModeLabels = ['Continuous', 'Burst', 'Single frame', 'VCR sync'] -[VM_CONT, VM_BURST, VM_SINGLE, VM_VCR] = range(1, 5) - -AudioFormatLabels = ['Audio off', \ - '16 bit mono', '16 bit stereo', '8 bit mono', '8 bit stereo'] -[A_OFF, A_16_MONO, A_16_STEREO, A_8_MONO, A_8_STEREO] = range(1, 6) - -VcrSpeedLabels = ['normal', '1/3', '1/5', '1/10', '1/30', 'single-step'] -VcrSpeeds = [None, 5, 4, 3, 2, 1, 0] - -RgbSizeLabels = ['full', 'quarter', 'sixteenth'] - -# init file stuff: -if os.environ.has_key('HOME'): - HOME=os.environ['HOME'] -else: - HOME='.' -VB_INIT_FILE=HOME + '/.Vb_init' - -VB_INIT_KEYS=['vfile', 'vmode', 'mono_thresh', 'vformat', 'comp_scheme', \ - 'rgb24_size', 'afile', 'aformat'] - -class VideoBagOfTricks: - - # Init/close stuff - - def __init__(self): - self.window = None - formdef = flp.parse_form('VbForm', 'form') - flp.create_full_form(self, formdef) - self.setdefaults() - if self.vmode <> VM_CONT: - self.g_cont.hide_object() - if self.vmode <> VM_BURST: - self.g_burst.hide_object() - if self.vmode <> VM_SINGLE: - self.g_single.hide_object() - if self.vmode <> VM_VCR: - self.g_vcr.hide_object() - if self.vformat <> 'compress': - self.g_compress.hide_object() - - self.openvideo() - self.makewindow() - self.bindvideo() - if self.use_24: - self.optfullsizewindow() - self.showform() - fl.set_event_call_back(self.do_event) - - def close(self): - self.close_video() - self.close_audio() - self.savedefaults() - raise SystemExit, 0 - - def showform(self): - # Get position of video window - gl.winset(self.window) - x, y = gl.getorigin() - width, height = gl.getsize() - # Calculate position of form window - x1 = x + width + 10 - x2 = x1 + int(self.form.w) - 1 - y2 = y + height - 1 - y1 = y2 - int(self.form.h) + 1 - # Position and show form window - gl.prefposition(x1, x2, y1, y2) - self.form.show_form(FL.PLACE_FREE, FL.TRUE, 'Vb Control') - - def getdefaultdefaults(self): - # Video defaults - self.vfile = 'film.video' - self.vmode = VM_CONT - self.mono_thresh = 128 - self.vformat = 'rgb8' - self.comp_scheme = 'Uncompressed' - self.rgb24_size = 1 - # Missing: drop, rate, maxmem, nframes, rate, vcrspeed - # Audio defaults: - self.afile = 'film.aiff' - self.aformat = A_OFF - - def getdefaults(self): - self.getdefaultdefaults() - # XXXX Read defaults file and override. - try: - fp = open(VB_INIT_FILE, 'r') - except IOError: - print 'Vb: no init file' - self.initcont = {} - return - data = fp.read(1000000) - try: - self.initcont = eval(data) - except: - print 'Vb: Ill-formatted init file' - self.initcont = {} - for k in self.initcont.keys(): - if hasattr(self, k): - setattr(self, k, self.initcont[k]) - - def savedefaults(self): - newdb = {} - for k in VB_INIT_KEYS: - newdb[k] = getattr(self, k) - if newdb <> self.initcont: - try: - fp = open(VB_INIT_FILE, 'w') - except IOError: - print 'Vb: Cannot create', VB_INIT_FILE - return - fp.write(`newdb`) - fp.close() - - def setdefaults(self): - self.getdefaults() - self.vcr = None - self.vout = None - self.capturing = 0 - self.c_vformat.clear_choice() - for label in VideoFormatLabels: - self.c_vformat.addto_choice(label) - self.c_vformat.set_choice(1 + VideoFormats.index(self.vformat)) - self.c_vmode.clear_choice() - for label in VideoModeLabels: - self.c_vmode.addto_choice(label) - self.c_vmode.set_choice(self.vmode) - self.get_vformat() - self.b_drop.set_button(1) - self.in_rate.set_input('2') - self.in_maxmem.set_input('1.0') - self.in_nframes.set_input('0') - self.in_nframes_vcr.set_input('1') - self.in_rate_vcr.set_input('1') - self.c_vcrspeed.clear_choice() - for label in VcrSpeedLabels: - self.c_vcrspeed.addto_choice(label) - self.c_vcrspeed.set_choice(4) - self.c_rgb24_size.clear_choice() - for label in RgbSizeLabels: - self.c_rgb24_size.addto_choice(label) - self.c_rgb24_size.set_choice(self.rgb24_size) - if cl: - algs = cl.QueryAlgorithms(cl.VIDEO) - self.all_comp_schemes = [] - for i in range(0, len(algs), 2): - if algs[i+1] in (cl.COMPRESSOR, cl.CODEC): - self.all_comp_schemes.append(algs[i]) - self.c_cformat.clear_choice() - for label in self.all_comp_schemes: - self.c_cformat.addto_choice(label) - i = self.all_comp_schemes.index(self.comp_scheme) - self.c_cformat.set_choice(i+1) - # Audio defaults - self.aout = None - self.aport = None - self.c_aformat.clear_choice() - for label in AudioFormatLabels: - self.c_aformat.addto_choice(label) - self.c_aformat.set_choice(self.aformat) - self.get_aformat() - - def openvideo(self): - try: - self.video = sv.OpenVideo() - except sv.error, msg: - print 'Error opening video:', msg - self.video = None - param = [SV.BROADCAST, SV.PAL] - if self.video: self.video.GetParam(param) - if param[1] == SV.PAL: - x = SV.PAL_XMAX - y = SV.PAL_YMAX - elif param[1] == SV.NTSC: - x = SV.NTSC_XMAX - y = SV.NTSC_YMAX - else: - print 'Unknown video standard:', param[1] - sys.exit(1) - self.maxx, self.maxy = x, y - self.curx = 256 - self.cury = 256*3/4 - - def makewindow(self): - x, y = self.maxx, self.maxy - gl.foreground() - gl.maxsize(x, y) - gl.keepaspect(x, y) - gl.stepunit(8, 6) - width = self.curx - height = self.cury - if width and height: - # Place the window at (150, 150) from top left - # (the video board likes this location...) - x1 = 150 - x2 = x1+width-1 - SCRHEIGHT = 768 - y2 = SCRHEIGHT-1-150 - y1 = y2-height+1 - gl.prefposition(x1, x2, y1, y2) - self.window = gl.winopen('Vb video') - self.settitle() - if width: - gl.maxsize(x, y) - gl.keepaspect(x, y) - gl.stepunit(8, 6) - gl.winconstraints() - gl.qdevice(DEVICE.LEFTMOUSE) - gl.qdevice(DEVICE.WINQUIT) - gl.qdevice(DEVICE.WINSHUT) - - def optfullsizewindow(self): - if not self.window: - return - gl.winset(self.window) - if self.use_24: - x, y = self.maxx, self.maxy - else: - x, y = self.curx, self.cury - left, bottom = gl.getorigin() - width, height = gl.getsize() - bottom = bottom+height-y - gl.prefposition(left, left+x-1, bottom, bottom+y-1) - gl.winconstraints() - if not self.use_24: - gl.keepaspect(x, y) - gl.stepunit(8, 6) - gl.maxsize(self.maxx, self.maxy) - gl.winconstraints() - self.bindvideo() - - def bindvideo(self): - if not self.video: return - x, y = gl.getsize() - if not self.use_24: - self.curx, self.cury = x, y - self.video.SetSize(x, y) - drop = self.b_drop.get_button() - if drop: - param = [SV.FIELDDROP, 1, SV.GENLOCK, SV.GENLOCK_OFF] - else: - param = [SV.FIELDDROP, 0, SV.GENLOCK, SV.GENLOCK_ON] - if self.rgb: - param = param+[SV.COLOR, SV.DEFAULT_COLOR, \ - SV.DITHER, 1, \ - SV.INPUT_BYPASS, 0] - else: - param = param+[SV.COLOR, SV.MONO, SV.DITHER, 0, \ - SV.INPUT_BYPASS, 1] - self.video.BindGLWindow(self.window, SV.IN_REPLACE) - self.video.SetParam(param) - - def rebindvideo(self): - gl.winset(self.window) - self.bindvideo() - - def reset(self): - self.close_video() - self.close_audio() - if self.vcr: - try: - ok = self.vcr.still() - except VCR.error: - pass - self.vcr = None - self.b_capture.set_button(0) - - # Event handler (catches resize of video window) - - def do_event(self, dev, val): - #print 'Event:', dev, val - if dev in (DEVICE.WINSHUT, DEVICE.WINQUIT): - self.close() - if dev == DEVICE.REDRAW and val == self.window: - self.rebindvideo() - self.settitle() - - # Video controls: format, mode, file - - def cb_vformat(self, *args): - self.reset() - self.get_vformat() - if self.mono_use_thresh: - s = `self.mono_thresh` - s = fl.show_input('Please enter mono threshold', s) - if s: - try: - self.mono_thresh = string.atoi(s) - except string.atoi_error: - fl.show_message('Bad input, using', \ - `self.mono_thresh`, '') - self.rebindvideo() - - def cb_cformat(self, *args): - i = self.c_cformat.get_choice() - self.comp_scheme = self.all_comp_schemes[i-1] - - - def cb_vmode(self, *args): - if self.vcr: - self.vcr = None - self.vmode = self.c_vmode.get_choice() - self.form.freeze_form() - self.g_cont.hide_object() - self.g_burst.hide_object() - self.g_single.hide_object() - self.g_vcr.hide_object() - if self.vmode == VM_CONT: - self.g_cont.show_object() - elif self.vmode == VM_BURST: - self.g_burst.show_object() - elif self.vmode == VM_SINGLE: - self.g_single.show_object() - elif self.vmode == VM_VCR: - self.g_vcr.show_object() - self.form.unfreeze_form() - - def cb_vfile(self, *args): - filename = self.vfile - hd, tl = os.path.split(filename) - filename = fl.file_selector('Video save file:', hd, '', tl) - if filename: - self.reset() - hd, tl = os.path.split(filename) - if hd == os.getcwd(): - filename = tl - self.vfile = filename - - # Video mode specific video controls - - def cb_rate(self, *args): - pass - - def cb_drop(self, *args): - self.rebindvideo() - - def cb_maxmem(self, *args): - pass - - def cb_nframes(self, *args): - pass - - def cb_fps(self, *args): - pass - - def cb_nframes_vcr(self, *args): - pass - - def cb_rate_vcr(self, *args): - pass - - def cb_vcrspeed(self, *args): - pass - - def cb_rgb24_size(self, *args): - i = self.c_rgb24_size.get_choice() - if i: - self.rgb24_size = i - - # Audio controls: format, file - - def cb_aformat(self, *args): - self.get_aformat() - - def cb_afile(self, *args): - filename = self.afile - hd, tl = os.path.split(filename) - filename = fl.file_selector('Audio save file:', hd, '', tl) - if filename: - self.reset() - hd, tl = os.path.split(filename) - if hd == os.getcwd(): - filename = tl - self.afile = filename - - # General controls: capture, reset, play, quit - - def cb_capture(self, *args): - if self.capturing: - raise StopCapture - if not self.b_capture.get_button(): - return - if not self.video or not self.vformat: - gl.ringbell() - return - if self.vmode == VM_CONT: - self.cont_capture() - elif self.vmode == VM_BURST: - self.burst_capture() - elif self.vmode == VM_SINGLE: - self.single_capture(None, None) - elif self.vmode == VM_VCR: - self.vcr_capture() - - def cb_reset(self, *args): - self.reset() - - def cb_play(self, *args): - self.reset() - sts = os.system('Vplay -q ' + self.vfile + ' &') - - def cb_quit(self, *args): - self.close() - - # Capture routines - - def burst_capture(self): - self.setwatch() - gl.winset(self.window) - x, y = gl.getsize() - if self.use_24: - fl.show_message('Sorry, no 24 bit continuous capture yet', '', '') - return - vformat = SV.RGB8_FRAMES - nframes = self.getint(self.in_nframes, 0) - if nframes == 0: - maxmem = self.getint(self.in_maxmem, 1.0) - memsize = int(maxmem * 1024 * 1024) - nframes = self.calcnframes(memsize) - info = (vformat, x, y, nframes, 1) - try: - info2, data, bitvec = self.video.CaptureBurst(info) - except sv.error, msg: - self.b_capture.set_button(0) - self.setarrow() - fl.show_message('Capture error:', str(msg), '') - return - if info <> info2: print info, '<>', info2 - self.save_burst(info2, data, bitvec) - self.setarrow() - - def calcnframes(self, memsize): - gl.winset(self.window) - x, y = gl.getsize() - pixels = x*y - pixels = pixels/2 # XXX always assume fields - if self.mono or self.grey: - n = memsize/pixels - else: - n = memsize/(4*pixels) - return max(1, n) - - def save_burst(self, info, data, bitvec): - (vformat, x, y, nframes, rate) = info - self.open_if_closed() - fieldsize = x*y/2 - nskipped = 0 - realframeno = 0 - tpf = 1000 / 50.0 # XXX - for frameno in range(0, nframes*2): - if frameno <> 0 and \ - bitvec[frameno] == bitvec[frameno-1]: - nskipped = nskipped + 1 - continue - # - # Save field. - # XXX Works only for fields and top-to-bottom - # - start = frameno*fieldsize - field = data[start:start+fieldsize] - realframeno = realframeno + 1 - fn = int(realframeno*tpf) - if not self.write_frame(fn, field): - break - - def cont_capture(self): - saved_label = self.b_capture.label - self.b_capture.label = 'Stop\n' + saved_label - self.open_if_closed() - self.init_cont() - fps = 59.64 # Fields per second - # XXX (fps of Indigo monitor, not of PAL or NTSC!) - tpf = 1000.0 / fps # Time per field in msec - self.capturing = 1 - self.start_audio() - while 1: - try: - void = fl.check_forms() - except StopCapture: - break - try: - cd, id = self.video.GetCaptureData() - except sv.error: - sgi.nap(1) - continue - id = id + 2*self.rate - data = cd.InterleaveFields(1) - cd.UnlockCaptureData() - t = id*tpf - if not self.write_frame(t, data): - break - self.stop_audio() - self.capturing = 0 - self.end_cont() - if self.aout: - # If recording audio, can't capture multiple sequences - self.reset() - self.b_capture.label = saved_label - - def single_capture(self, stepfunc, timecode): - self.open_if_closed() - self.init_cont() - while 1: - try: - cd, id = self.video.GetCaptureData() - break - except sv.error: - pass - sgi.nap(1) - if stepfunc: # This might step the video - d=stepfunc() # to the next frame - if not self.use_24: - data = cd.InterleaveFields(1) - else: - x, y = self.vout.getsize() - if self.use_compress: - if self.rgb24_size == 1: - data = cd.YUVtoYUV422DC(0) - elif self.rgb24_size == 2: - data = cd.YUVtoYUV422DC_quarter(1) - x = x/2 - y = y/2 - elif self.rgb24_size == 3: - data = cd.YUVtoYUV422DC_sixteenth(1) - x = x/4 - y = y/4 - else: - data = cd.YUVtoRGB(1) - if self.maxx*self.maxy*4 <> len(data): - print 'maxx,maxy,exp,got=', self.maxx, - print self.maxy,self.maxx*self.maxy*4, - print len(data) - fl.showmessage('Wrong sized data') - return 0 - if self.rgb24_size <> 1: - data = imageop.scale(data, 4, \ - self.maxx, self.maxy, x, y) - if self.use_jpeg: - import jpeg - data = jpeg.compress(data, x, y, 4) - if self.use_compress: - data = self.compressor.Compress(1, data) - cd.UnlockCaptureData() - self.end_cont() - if timecode == None: - timecode = (self.nframes+1) * (1000/25) - return self.write_frame(timecode, data) - - def vcr_capture(self): - if not self.vcr: - try: - print 'Connecting to VCR ...' - self.vcr = VCR.VCR() - print 'Waiting for VCR to come online ...' - self.vcr.initvcr() - print 'Preparing VCR ...' - if not (self.vcr.fmmode('dnr') and \ - self.vcr.dmcontrol('digital slow')): - self.vcr_error('digital slow failed') - return - print 'VCR OK.' - except VCR.error, msg: - self.vcr = None - self.vcr_error(msg) - return - if not self.vcr.still(): - self.vcr_error('still failed') - return - self.open_if_closed() - rate = self.getint(self.in_rate_vcr, 1) - rate = max(rate, 1) - vcrspeed = self.c_vcrspeed.get_choice() - vcrspeed = VcrSpeeds[vcrspeed] - if vcrspeed == 0: - stepfunc = self.vcr.step - else: - stepfunc = None - self.speed_factor = rate - addr = start_addr = self.vcr.sense() - if not self.single_capture(None, 0): - return - print 'captured %02d:%02d:%02d:%02d' % self.vcr.addr2tc(addr) - count = self.getint(self.in_nframes_vcr, 1) - 1 - if count <= 0: - while rate > 0: - if not self.vcr.step(): - self.vcr_error('step failed') - here = self.vcr.sense() - if here > addr: - rate = rate - (here - addr) - addr = here - return - if not self.vcr.fwdshuttle(vcrspeed): - self.vcr_error('fwd shuttle failed') - return - cycle = 0 - while count > 0: - try: - here = self.vcr.sense() - except VCR.error, msg: - self.vcr_error(msg) - break - if here <> addr: - if here <> addr+1: - print 'Missed', here-addr-1, - print 'frame' + 's'*(here-addr-1 <> 1) - cycle = (cycle+1) % rate - if cycle == 0: - tc = (here-start_addr)*40 - if not self.single_capture(stepfunc, \ - tc): - break - print 'captured %02d:%02d:%02d:%02d' \ - % self.vcr.addr2tc(here) - count = count -1 - addr = here - if self.vcr and not self.vcr.still(): - self.vcr_error('still failed') - - def vcr_error(self, msg): - self.reset() - fl.show_message('VCR error:', str(msg), '') - - # Init/end continuous capture mode - - def init_cont(self): - qsize = 1 - if self.vmode == VM_CONT: - self.rate = self.getint(self.in_rate, 2) - else: - self.rate = 2 - x, y = self.vout.getsize() - if self.use_24: - info = (SV.YUV411_FRAMES, x, y, qsize, self.rate) - else: - info = (SV.RGB8_FRAMES, x, y, qsize, self.rate) - info2 = self.video.InitContinuousCapture(info) - if info2 <> info: - # XXX This is really only debug info - print 'Info mismatch: requested', info, 'got', info2 - - def end_cont(self): - self.video.EndContinuousCapture() - - # Misc stuff - - def settitle(self): - gl.winset(self.window) - x, y = gl.getsize() - title = 'Vb ' + self.vfile + ' (%dx%d)' % (x, y) - gl.wintitle(title) - - def get_vformat(self): - i = self.c_vformat.get_choice() - label = VideoFormatLabels[i-1] - format = VideoFormats[i-1] - if format == 'compress' and cl == None: - fl.show_message('Sorry, no compression library support') - format = '' - label = 'Video off' - self.vformat = format - if self.vformat == '': - self.form.freeze_form() - self.g_video.hide_object() - self.g_cont.hide_object() - self.g_burst.hide_object() - self.g_single.hide_object() - self.form.unfreeze_form() - else: - self.g_video.show_object() - if self.vmode == VM_CONT: - self.g_cont.show_object() - elif self.vmode == VM_BURST: - self.g_burst.show_object() - elif self.vmode == VM_SINGLE: - self.g_single.show_object() - # - self.rgb = (format[:3] == 'rgb' or format == 'compress') - self.mono = (format == 'mono') - self.grey = (format[:4] == 'grey') - self.use_24 = (format in ('rgb', 'jpeg', 'compress')) - if self.use_24: - self.g_rgb24.show_object() - else: - self.g_rgb24.hide_object() - self.use_jpeg = (format == 'jpeg') - self.mono_use_thresh = (label == 'mono thresh') - self.use_compress = (format == 'compress') - if self.use_compress: - self.g_compress.show_object() - else: - self.g_compress.hide_object() - s = format[4:] - if self.grey and s: - self.greybits = string.atoi(s) - else: - self.greybits = 8 - if label == 'grey2 dith': - self.greybits = -2 - # - convertor = None - if self.grey: - if self.greybits == 2: - convertor = imageop.grey2grey2 - elif self.greybits == 4: - convertor = imageop.grey2grey4 - elif self.greybits == -2: - convertor = imageop.dither2grey2 - self.convertor = convertor - self.optfullsizewindow() - - def get_aformat(self): - self.reset() - self.aformat = self.c_aformat.get_choice() - if self.aformat == A_OFF: - self.g_audio.hide_object() - else: - self.g_audio.show_object() - - def init_compressor(self, w, h): - self.compressor = None - scheme = cl.QuerySchemeFromName(cl.VIDEO, self.comp_scheme) - self.compressor = cl.OpenCompressor(scheme) - parambuf = [cl.IMAGE_WIDTH, w, \ - cl.IMAGE_HEIGHT, h, \ - cl.ORIGINAL_FORMAT, cl.YUV422DC] - self.compressor.SetParams(parambuf) - return self.compressor.Compress(0, '') - - def open_if_closed(self): - if not self.vout: - self.open_video() - if not self.aout: - self.open_audio() - - # File I/O handling - - def open_video(self): - self.close_video() - gl.winset(self.window) - x, y = gl.getsize() - if self.use_24: - if self.rgb24_size == 2: - x, y = x/2, y/2 - elif self.rgb24_size == 3: - x, y = x/4, y/4 - vout = VFile.VoutFile(self.vfile) - vout.setformat(self.vformat) - if self.vformat == 'compress': - cheader = self.init_compressor(x, y) - vout.setcompressheader(cheader) - vout.setsize(x, y) - if self.vmode == VM_BURST: - vout.setpf((1, -2)) - vout.writeheader() - self.vout = vout - self.nframes = 0 - self.speed_factor = 1 - self.t_nframes.label = `self.nframes` - - def write_frame(self, t, data): - t = t * self.speed_factor - if not self.vout: - gl.ringbell() - return 0 - if self.convertor: - data = self.convertor(data, len(data), 1) - elif self.mono: - if self.mono_use_thresh: - data = imageop.grey2mono(data, \ - len(data), 1,\ - self.mono_thresh) - else: - data = imageop.dither2mono(data, \ - len(data), 1) - try: - self.vout.writeframe(int(t), data, None) - except IOError, msg: - self.reset() - if msg == (0, 'Error 0'): - msg = 'disk full??' - fl.show_message('IOError', str(msg), '') - return 0 - self.nframes = self.nframes + 1 - self.t_nframes.label = `self.nframes` - return 1 - - def close_video(self): - if not self.vout: - return - self.nframes = 0 - self.t_nframes.label = '' - try: - self.vout.close() - except IOError, msg: - if msg == (0, 'Error 0'): - msg = 'disk full??' - fl.show_message('IOError', str(msg), '') - self.vout = None - self.compressor = None - - # Watch cursor handling - - def setwatch(self): - gl.winset(self.form.window) - gl.setcursor(WATCH, 0, 0) - gl.winset(self.window) - gl.setcursor(WATCH, 0, 0) - - def setarrow(self): - gl.winset(self.form.window) - gl.setcursor(ARROW, 0, 0) - gl.winset(self.window) - gl.setcursor(ARROW, 0, 0) - - # Numeric field handling - - def getint(self, field, default): - try: - value = string.atoi(field.get_input()) - except string.atoi_error: - value = default - field.set_input(`value`) - return value - - def getfloat(self, field, default): - try: - value = float(eval(field.get_input())) - except: - value = float(default) - field.set_input(`value`) - return value - - # Audio stuff - - def open_audio(self): - if self.aformat == A_OFF: - return - import aifc - import al - import AL - import thread - self.close_audio() - params = [AL.INPUT_RATE, 0] - al.getparams(AL.DEFAULT_DEVICE, params) - rate = params[1] - self.aout = aifc.open(self.afile, 'w') - if self.aformat in (A_16_STEREO, A_8_STEREO): - nch = AL.STEREO - else: - nch = AL.MONO - if self.aformat in (A_16_STEREO, A_16_MONO): - width = AL.SAMPLE_16 - else: - width = AL.SAMPLE_8 - self.aout.setnchannels(nch) - self.aout.setsampwidth(width) - self.aout.setframerate(rate) - c = al.newconfig() - c.setqueuesize(8000) - c.setchannels(nch) - c.setwidth(width) - self.aport = al.openport('Vb audio record', 'r', c) - self.audio_stop = 0 - self.audio_ok = 0 - self.audio_busy = 1 - thread.start_new_thread(self.record_audio, ()) - - def start_audio(self): - if self.aformat == A_OFF: - return - self.audio_ok = 1 - - def record_audio(self, *args): - # This function runs in a separate thread - # Currently no semaphores are used - while not self.audio_stop: - data = self.aport.readsamps(4000) - if self.audio_ok: - self.aout.writeframes(data) - data = None - self.audio_busy = 0 - - def stop_audio(self): - self.audio_ok = 0 - - def close_audio(self): - if self.aout: - self.audio_ok = 0 - self.audio_stop = 1 - while self.audio_busy: - time.sleep(0.1) - self.aout.close() - self.aout = None - if self.aport: - self.aport.closeport() - self.aport = None - - -try: - main() -except KeyboardInterrupt: - print '[Interrupt]' - sys.exit(1) |