!7 import static x30_pkg.x30_util.VF1; sclass QuickAudioRecord > DynPrintLog { transient volatile L recording; transient JButton btn; transient bool stop; transient JLabel trayIcon; visualize { btn = jImageAndTextButton(#1101400, "Record [hold button down]"); onMouseDown(btn, r startRecording); onMouseUp(btn, r stopRecording); ret northAndCenterWithMargins(btn, super.visualize()); } void startRecording { setImage(trayIcon, #1101417); stop = false; print("Recording!"); recording = synchroList(); updatePrintLog(); } void stopRecording { setImage(trayIcon, #1101416); set stop; } start { preloadImage(#1101417); componentFieldsToKeep = initHashSetAndAdd(componentFieldsToKeep, 'trayIcon); dm_addAudioListener(voidfunc(short[] data) { temp enter(); final L l = recording; if (l == null) ret; l.add(cloneShortArray(data)); if (stop) { stop = false; recording = null; thread "Save WAV" { temp enter(); print("Recording done. Got " + l(l) + " chunks"); File wavFile = anonymousWAVEFile(); multiShortArraysToWAVE(l, wavFile); printFileInfo(wavFile); vmBus_send('newRecording, wavFile); } } }); if (trayIcon == null) { trayIcon = jimage(#1101416); onMouseDown(trayIcon, r startRecording); onMouseUp(trayIcon, r stopRecording); setToolTip(trayIcon, "Click & hold to record audio!"); } dm_addTrayIcon(trayIcon); } }