⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rec.py

📁 reduced python source for embedded apps
💻 PY
字号:
#! /usr/bin/env pythonimport sysimport audioimport stdwinimport stringimport getoptfrom stdwinevents import *from Buttons import *from Sliders import *#from Soundogram import Soundogramfrom VUMeter import VUMeterfrom WindowParent import WindowParent, MainLoopfrom HVSplit import HSplit, VSplitclass TimeOutToggleButton(ToggleButton):	def define(self, parent):		self = ToggleButton.define(self, parent)		self.parent.need_timer(self)		self.timer_hook = 0		return self	def timer(self):		if self.timer_hook:			self.timer_hook(self)K = 1024BUFSIZE = 30*8*KRates = [0, 32*K, 16*K, 8*K]Magics = ['', '0032', '0016', '0008']class Struct: passG = Struct()def main():	#	# Turn off scroll bars	#	stdwin.setdefscrollbars(0, 0)	#	# Set default state	#	G.gain = 60	G.rate = 3	G.nomuting = 0	G.savefile = '@rec'	#	# Set default values	#	G.data = ''	G.playing = 0	G.recording = 0	G.sogram = 0	#	# Parse options	#	optlist, args = getopt.getopt(sys.argv[1:], 'mdg:r:')	#	for optname, optarg in optlist:		if 0: # (So all cases start with elif)			pass		elif optname == '-d':			G.debug = 1		elif optname == '-g':			G.gain = string.atoi(optarg)			if not (0 < G.gain < 256):				raise optarg.error, '-g gain out of range'		elif optname == '-m':			G.nomuting = (not G.nomuting)		elif optname == '-r':			G.rate = string.atoi(optarg)			if not (1 <= G.rate <= 3):				raise optarg.error, '-r rate out of range'	#	if args:		G.savefile = args[0]	#	# Initialize the sound package	#	audio.setoutgain(G.nomuting * G.gain)	# Silence the speaker	audio.setrate(G.rate)	#	# Create the WindowParent and VSplit	#	G.window = WindowParent().create('Recorder', (0, 0))	w = G.vsplit = VSplit().create(G.window)	#	# VU-meter	#	G.vubtn = VUMeter().define(w)	#	# Radiobuttons for rates	#	r1btn = RadioButton().definetext(w, '32 K/sec')	r1btn.on_hook = rate_hook	r1btn.rate = 1	#	r2btn = RadioButton().definetext(w, '16 K/sec')	r2btn.on_hook = rate_hook	r2btn.rate = 2	#	r3btn = RadioButton().definetext(w, '8 K/sec')	r3btn.on_hook = rate_hook	r3btn.rate = 3	#	radios = [r1btn, r2btn, r3btn]	r1btn.group = r2btn.group = r3btn.group = radios	for r in radios:		if r.rate == G.rate: r.select(1)	#	# Other controls	#	G.recbtn = TimeOutToggleButton().definetext(w, 'Record')	G.recbtn.on_hook = record_on_hook	G.recbtn.timer_hook = record_timer_hook	G.recbtn.off_hook = record_off_hook	#	G.mutebtn = CheckButton().definetext(w, 'Mute')	G.mutebtn.select(not G.nomuting)	G.mutebtn.hook = mute_hook	#	G.playbtn = TimeOutToggleButton().definetext(w, 'Playback')	G.playbtn.on_hook = play_on_hook	G.playbtn.timer_hook = play_timer_hook	G.playbtn.off_hook = play_off_hook	#	G.gainbtn = ComplexSlider().define(w)	G.gainbtn.settexts('  Volume: ', '  ')	G.gainbtn.setminvalmax(0, G.gain, 255)	G.gainbtn.sethook(gain_hook)	#	G.sizebtn = Label().definetext(w, `len(G.data)` + ' bytes')	#	#G.showbtn = PushButton().definetext(w, 'Sound-o-gram...')	#G.showbtn.hook = show_hook	#	G.savebtn = PushButton().definetext(w, 'Save...')	G.savebtn.hook = save_hook	#	G.quitbtn = PushButton().definetext(w, 'Quit')	G.quitbtn.hook = quit_hook	G.playbtn.enable(0)	G.savebtn.enable(0)	#G.showbtn.enable(0)	start_vu()	G.window.realize()	#	# Event loop	#	MainLoop()# XXX Disabled...def show_hook(self):	savetext = self.text	self.settext('Be patient...')	close_sogram()	stdwin.setdefwinsize(400, 300)	win = stdwin.open('Sound-o-gram')	G.sogram = Soundogram().define(win, G.data)	win.buttons = [G.sogram]	self.settext(savetext)def close_sogram():	if G.sogram:		# Break circular references		G.sogram.win.buttons[:] = []		del G.sogram.win		G.sogram = 0def mute_hook(self):	G.nomuting = (not self.selected)	audio.setoutgain(G.nomuting * G.gain)def rate_hook(self):	G.rate = self.rate	audio.setrate(G.rate)def record_on_hook(self):	stop_vu()	close_sogram()	audio.setrate(G.rate)	audio.setoutgain(G.nomuting * G.gain)	audio.start_recording(BUFSIZE)	G.recording = 1	G.playbtn.enable(0)	G.window.settimer(10 * BUFSIZE / Rates[G.rate])def record_timer_hook(self):	if G.recording:		if audio.poll_recording():			self.hilite(0)			record_off_hook(self)		else:			self.parent.settimer(5)def record_off_hook(self):	if not G.recording:		return	G.data = audio.stop_recording()	G.recording = 0	G.sizebtn.settext(`len(G.data)` + ' bytes')	audio.setoutgain(G.nomuting * G.gain)	G.playbtn.enable((len(G.data) > 0))	G.savebtn.enable((len(G.data) > 0))	#G.showbtn.enable((len(G.data) > 0))	G.window.settimer(0)	start_vu()def play_on_hook(self):	stop_vu()	audio.setrate(G.rate)	audio.setoutgain(G.gain)	audio.start_playing(G.data)	G.playing = 1	G.recbtn.enable(0)	G.window.settimer(max(10 * len(G.data) / Rates[G.rate], 1))def play_timer_hook(self):	if G.playing:		if audio.poll_playing():			self.hilite(0)			play_off_hook(self)		else:			self.parent.settimer(5)def play_off_hook(self):	if not G.playing:		return	x = audio.stop_playing()	G.playing = 0	audio.setoutgain(G.nomuting * G.gain)	G.recbtn.enable(1)	G.window.settimer(0)	start_vu()def gain_hook(self):	G.gain = self.val	if G.playing or G.nomuting: audio.setoutgain(G.gain)def save_hook(self):	if not G.data:		stdwin.fleep()	else:		prompt = 'Store sampled data on file: '		try:			G.savefile = stdwin.askfile(prompt, G.savefile, 1)		except KeyboardInterrupt:			return		try:			fp = open(G.savefile, 'w')			fp.write(Magics[G.rate] + G.data)		except:			stdwin.message('Cannot create ' + file)def stop_vu():	G.vubtn.stop()def start_vu():	G.vubtn.start()def quit_hook(self):	G.window.delayed_destroy()try:	main()finally:	audio.setoutgain(0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -