10 from stdwinevents
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
)
30 Rates
= [0, 32*K
, 16*K
, 8*K
]
31 Magics
= ['', '0032', '0016', '0008']
38 # Turn off scroll bars
40 stdwin
.setdefscrollbars(0, 0)
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)
66 G
.gain
= string
.atoi(optarg
)
67 if not (0 < G
.gain
< 256):
68 raise optarg
.error
, '-g gain out of range'
70 G
.nomuting
= (not G
.nomuting
)
72 G
.rate
= string
.atoi(optarg
)
73 if not (1 <= G
.rate
<= 3):
74 raise optarg
.error
, '-r rate out of range'
79 # Initialize the sound package
81 audio
.setoutgain(G
.nomuting
* G
.gain
) # Silence the speaker
84 # Create the WindowParent and VSplit
86 G
.window
= WindowParent().create('Recorder', (0, 0))
87 w
= G
.vsplit
= VSplit().create(G
.window
)
91 G
.vubtn
= VUMeter().define(w
)
93 # Radiobuttons for rates
95 r1btn
= RadioButton().definetext(w
, '32 K/sec')
96 r1btn
.on_hook
= rate_hook
99 r2btn
= RadioButton().definetext(w
, '16 K/sec')
100 r2btn
.on_hook
= rate_hook
103 r3btn
= RadioButton().definetext(w
, '8 K/sec')
104 r3btn
.on_hook
= rate_hook
107 radios
= [r1btn
, r2btn
, r3btn
]
108 r1btn
.group
= r2btn
.group
= r3btn
.group
= radios
110 if r
.rate
== G
.rate
: r
.select(1)
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
156 self
.settext('Be patient...')
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
)
166 # Break circular references
167 G
.sogram
.win
.buttons
[:] = []
172 G
.nomuting
= (not self
.selected
)
173 audio
.setoutgain(G
.nomuting
* G
.gain
)
177 audio
.setrate(G
.rate
)
179 def record_on_hook(self
):
182 audio
.setrate(G
.rate
)
183 audio
.setoutgain(G
.nomuting
* G
.gain
)
184 audio
.start_recording(BUFSIZE
)
187 G
.window
.settimer(10 * BUFSIZE
/ Rates
[G
.rate
])
189 def record_timer_hook(self
):
191 if audio
.poll_recording():
193 record_off_hook(self
)
195 self
.parent
.settimer(5)
197 def record_off_hook(self
):
200 G
.data
= audio
.stop_recording()
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))
210 def play_on_hook(self
):
212 audio
.setrate(G
.rate
)
213 audio
.setoutgain(G
.gain
)
214 audio
.start_playing(G
.data
)
217 G
.window
.settimer(max(10 * len(G
.data
) / Rates
[G
.rate
], 1))
219 def play_timer_hook(self
):
221 if audio
.poll_playing():
225 self
.parent
.settimer(5)
227 def play_off_hook(self
):
230 x
= audio
.stop_playing()
232 audio
.setoutgain(G
.nomuting
* G
.gain
)
239 if G
.playing
or G
.nomuting
: audio
.setoutgain(G
.gain
)
245 prompt
= 'Store sampled data on file: '
247 G
.savefile
= stdwin
.askfile(prompt
, G
.savefile
, 1)
248 except KeyboardInterrupt:
251 fp
= open(G
.savefile
, 'w')
252 fp
.write(Magics
[G
.rate
] + G
.data
)
254 stdwin
.message('Cannot create ' + file)
263 G
.window
.delayed_destroy()