From fbe05367fadef5844b25b5111559e646316617f8 Mon Sep 17 00:00:00 2001 From: Matt Jenkins Date: Mon, 1 Oct 2018 12:00:23 +0100 Subject: [PATCH] Added continuation recording on F key --- README.md | 1 + .../audiobookrecorder/AudiobookRecorder.java | 66 +++++++++++++++++++ .../co/majenko/audiobookrecorder/Options.java | 4 ++ 3 files changed, 71 insertions(+) diff --git a/README.md b/README.md index 34305bf..3e46115 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ From here on much is controlled by key presses. * Press and hold "R" to record a new phrase - the screen flashes red while it's recording. The phrase is appended to the currently selected chapter, or to the last chapter if none is selected. * Press and hold "T" to record a new phrase that is the start of a new paragraph. This adds the "post paragraph" gap to the previous sentence. Otherwise it does the same as "R". +* Press and hold "F" to record a "continuation" phrase. This sets the previous phrase's post-gap to be the "short" gap instead of the normal length gap. * Press "D" to delete the last phrase you recorded. * Press "E" to re-record the currently selected phrase. diff --git a/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java b/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java index 20fa1c1..b3d088b 100644 --- a/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java +++ b/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java @@ -421,6 +421,9 @@ public class AudiobookRecorder extends JFrame { buildToolbar(centralPanel); + centralPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F"), "startRecordShort"); + centralPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released F"), "stopRecord"); + centralPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("R"), "startRecord"); centralPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released R"), "stopRecord"); @@ -444,6 +447,16 @@ public class AudiobookRecorder extends JFrame { startRecording(); } }); + centralPanel.getActionMap().put("startRecordShort", new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (bookTree.isEditing()) return; + if (getNoiseFloor() == 0) { + alertNoRoomNoise(); + return; + } + startRecordingShort(); + } + }); centralPanel.getActionMap().put("startRecordNewPara", new AbstractAction() { public void actionPerformed(ActionEvent e) { if (bookTree.isEditing()) return; @@ -945,6 +958,59 @@ public class AudiobookRecorder extends JFrame { } } + public void startRecordingShort() { + + if (recording != null) return; + if (book == null) return; + + if (microphone == null) { + JOptionPane.showMessageDialog(this, "Microphone not started. Start microphone first.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + + toolBar.disableBook(); + toolBar.disableSentence(); + + DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)bookTree.getLastSelectedPathComponent(); + + if (selectedNode == null) { + selectedNode = book.getLastChapter(); + bookTree.setSelectionPath(new TreePath(selectedNode.getPath())); + } + + if (selectedNode instanceof Book) { + selectedNode = book.getLastChapter(); + bookTree.setSelectionPath(new TreePath(selectedNode.getPath())); + } + + if (selectedNode instanceof Sentence) { + selectedNode = (DefaultMutableTreeNode)selectedNode.getParent(); + bookTree.setSelectionPath(new TreePath(selectedNode.getPath())); + } + + Chapter c = (Chapter)selectedNode; + + DefaultMutableTreeNode lastLeaf = c.getLastLeaf(); + + if (lastLeaf instanceof Sentence) { + Sentence lastSentence = (Sentence)lastLeaf; + lastSentence.setPostGap(Options.getInteger("catenation.short-sentence")); + } + + Sentence s = new Sentence(); + bookTreeModel.insertNodeInto(s, c, c.getChildCount()); + + bookTree.expandPath(new TreePath(c.getPath())); + bookTree.setSelectionPath(new TreePath(s.getPath())); + bookTree.scrollPathToVisible(new TreePath(s.getPath())); + + if (s.startRecording()) { + recording = s; + centralPanel.setFlash(true); + } + } + + public void startRecordingNewParagraph() { if (recording != null) return; diff --git a/src/uk/co/majenko/audiobookrecorder/Options.java b/src/uk/co/majenko/audiobookrecorder/Options.java index 32b0b69..d28fd5d 100644 --- a/src/uk/co/majenko/audiobookrecorder/Options.java +++ b/src/uk/co/majenko/audiobookrecorder/Options.java @@ -25,6 +25,7 @@ public class Options extends JDialog { JSpinner preChapterGap; JSpinner postChapterGap; JSpinner postSentenceGap; + JSpinner shortSentenceGap; JSpinner postParagraphGap; JTextField ffmpegLocation; JComboBox bitRate; @@ -261,6 +262,7 @@ public class Options extends JDialog { preChapterGap = addSpinner(optionsPanel, "Default pre-chapter gap:", 0, 5000, 100, getInteger("catenation.pre-chapter"), "ms"); postChapterGap = addSpinner(optionsPanel, "Default post-chapter gap:", 0, 5000, 100, getInteger("catenation.post-chapter"), "ms"); postSentenceGap = addSpinner(optionsPanel, "Default post-sentence gap:", 0, 5000, 100, getInteger("catenation.post-sentence"), "ms"); + shortSentenceGap = addSpinner(optionsPanel, "Short post-sentence gap:", 0, 5000, 100, getInteger("catenation.short-sentence"), "ms"); postParagraphGap = addSpinner(optionsPanel, "Default post-paragraph gap:", 0, 5000, 100, getInteger("catenation.post-paragraph"), "ms"); addSeparator(optionsPanel); @@ -456,6 +458,7 @@ public class Options extends JDialog { defaultPrefs.put("catenation.pre-chapter", "1000"); defaultPrefs.put("catenation.post-chapter", "1500"); defaultPrefs.put("catenation.post-sentence", "1000"); + defaultPrefs.put("catenation.short-sentence", "100"); defaultPrefs.put("catenation.post-paragraph", "2000"); defaultPrefs.put("path.storage", (new File(System.getProperty("user.home"), "Recordings")).toString()); @@ -599,6 +602,7 @@ public class Options extends JDialog { set("catenation.pre-chapter", preChapterGap.getValue()); set("catenation.post-chapter", postChapterGap.getValue()); set("catenation.post-sentence", postSentenceGap.getValue()); + set("catenation.short-sentence", shortSentenceGap.getValue()); set("catenation.post-paragraph", postParagraphGap.getValue()); set("audio.export.bitrate", ((KVPair)bitRate.getSelectedItem()).key); set("audio.export.samplerate", ((KVPair)exportRate.getSelectedItem()).key);