Fix an amazing number of typos & malformed sentences reported by Detlef
[python/dscho.git] / Demo / sgi / audio_stdwin / rec.py
blob76e924e309e02afe71e3735dd166357bfb1b5121
1 #! /usr/bin/env python
3 import sys
4 import audio
5 import stdwin
7 import string
8 import getopt
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
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)
28 K = 1024
29 BUFSIZE = 30*8*K
30 Rates = [0, 32*K, 16*K, 8*K]
31 Magics = ['', '0032', '0016', '0008']
33 class Struct: pass
34 G = Struct()
36 def main():
38 # Turn off scroll bars
40 stdwin.setdefscrollbars(0, 0)
42 # Set default state
44 G.gain = 60
45 G.rate = 3
46 G.nomuting = 0
47 G.savefile = '@rec'
49 # Set default values
51 G.data = ''
52 G.playing = 0
53 G.recording = 0
54 G.sogram = 0
56 # Parse options
58 optlist, args = getopt.getopt(sys.argv[1:], 'mdg:r:')
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'
76 if args:
77 G.savefile = args[0]
79 # Initialize the sound package
81 audio.setoutgain(G.nomuting * G.gain) # Silence the speaker
82 audio.setrate(G.rate)
84 # Create the WindowParent and VSplit
86 G.window = WindowParent().create('Recorder', (0, 0))
87 w = G.vsplit = VSplit().create(G.window)
89 # VU-meter
91 G.vubtn = VUMeter().define(w)
93 # Radiobuttons for rates
95 r1btn = RadioButton().definetext(w, '32 K/sec')
96 r1btn.on_hook = rate_hook
97 r1btn.rate = 1
99 r2btn = RadioButton().definetext(w, '16 K/sec')
100 r2btn.on_hook = rate_hook
101 r2btn.rate = 2
103 r3btn = RadioButton().definetext(w, '8 K/sec')
104 r3btn.on_hook = rate_hook
105 r3btn.rate = 3
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)
112 # Other controls
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
119 G.mutebtn = CheckButton().definetext(w, 'Mute')
120 G.mutebtn.select(not G.nomuting)
121 G.mutebtn.hook = mute_hook
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
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)
133 G.sizebtn = Label().definetext(w, `len(G.data)` + ' bytes')
135 #G.showbtn = PushButton().definetext(w, 'Sound-o-gram...')
136 #G.showbtn.hook = show_hook
138 G.savebtn = PushButton().definetext(w, 'Save...')
139 G.savebtn.hook = save_hook
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()
149 # Event loop
151 MainLoop()
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)
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
171 def mute_hook(self):
172 G.nomuting = (not self.selected)
173 audio.setoutgain(G.nomuting * G.gain)
175 def rate_hook(self):
176 G.rate = self.rate
177 audio.setrate(G.rate)
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])
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)
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()
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))
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)
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()
237 def gain_hook(self):
238 G.gain = self.val
239 if G.playing or G.nomuting: audio.setoutgain(G.gain)
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)
256 def stop_vu():
257 G.vubtn.stop()
259 def start_vu():
260 G.vubtn.start()
262 def quit_hook(self):
263 G.window.delayed_destroy()
265 try:
266 main()
267 finally:
268 audio.setoutgain(0)