!7 cmodule QuickAudioRecord > DynPrintLog { transient volatile L recording; transient long recordingSince; // in sysNow time transient JButton btn; transient bool stop; transient JLabel trayIcon; transient File wavFile; //transient short[] lastChunk; // for Record On Noise switchable bool normalizeRecordings; visualize { btn = jImageAndTextButton(#1101400, "Record [hold button down]"); onMouseDownUp(btn, r startRecording, r stopRecording); ret northAndCenterWithMargins(btn, super.visualize()); } start { preloadImage(#1101417); componentFieldsToKeep = initHashSetAndAdd(componentFieldsToKeep, 'trayIcon); dm_addAudioListener(voidfunc(short[] data) { handleChunk(data) }); if (trayIcon == null) { trayIcon = jimage(#1101416); onMouseDownUp(trayIcon, r startRecording, r stopRecording); setToolTip(trayIcon, "Click & hold to record audio!"); } dm_addTrayIcon(trayIcon); } void handleChunk(short[] data) enter { final L l = recording; if (l == null) ret; short[] clonedData = cloneShortArray(data); l.add(clonedData); vmBus_send recordedChunk(clonedData); if (stop) { stop = false; recording = null; recordingSince = 0; vmBus_send doneRecording(); thread "Save WAV" { temp enter(); print("Recording done. Got " + l(l) + " chunks"); if (normalizeRecordings) print("Normalized recording: " + toIntPercent(normalizeShortArrays(l)) + "%"); multiShortArraysToWAVE(l, wavFile, format := dm_audioInputFormat()); printFileInfo(wavFile); vmBus_send('newRecording, wavFile); } } } // API void startRecording() { startRecording(null); } void startRecording(short[] initialChunk) { if (isRecording()) ret; setImage(trayIcon, #1101417); stop = false; print("Recording!"); wavFile = anonymousWAVEFile(); recordingSince = sysNow(); recording = synchroList(llNonNulls(initialChunk)); vmBus_send startedRecording(wavFile); if (initialChunk != null) vmBus_send recordedChunk(initialChunk); updatePrintLog(); } void stopRecording { setImage(trayIcon, #1101416); set stop; } bool isRecording() { ret recording != null; } long recordingSince() { ret recordingSince; } }