diff --git a/resources/uk/co/majenko/audiobookrecorder/icons/important.png b/resources/uk/co/majenko/audiobookrecorder/icons/important.png new file mode 100644 index 0000000..2adca02 Binary files /dev/null and b/resources/uk/co/majenko/audiobookrecorder/icons/important.png differ diff --git a/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java b/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java index 01f2fee..18c02e3 100644 --- a/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java +++ b/src/uk/co/majenko/audiobookrecorder/AudiobookRecorder.java @@ -796,6 +796,8 @@ public class AudiobookRecorder extends JFrame { JMenuObject moveUp = new JMenuObject("Move Up", c); JMenuObject moveDown = new JMenuObject("Move Down", c); JMenu mergeWith = new JMenu("Merge chapter with"); + JMenuObject lockAll = new JMenuObject("Lock all sentences", c); + JMenuObject unlockAll = new JMenuObject("Unlock all sentences", c); for (Enumeration bc = book.children(); bc.hasMoreElements();) { Chapter chp = bc.nextElement(); @@ -878,6 +880,30 @@ public class AudiobookRecorder extends JFrame { } }); + lockAll.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JMenuObject o = (JMenuObject)e.getSource(); + Chapter c = (Chapter)o.getObject(); + for (Enumeration s = c.children(); s.hasMoreElements();) { + Sentence snt = s.nextElement(); + snt.setLocked(true); + bookTreeModel.reload(snt); + } + } + }); + unlockAll.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JMenuObject o = (JMenuObject)e.getSource(); + Chapter c = (Chapter)o.getObject(); + for (Enumeration s = c.children(); s.hasMoreElements();) { + Sentence snt = s.nextElement(); + snt.setLocked(false); + bookTreeModel.reload(snt); + } + } + }); + + menu.add(moveUp); menu.add(moveDown); @@ -887,6 +913,9 @@ public class AudiobookRecorder extends JFrame { menu.addSeparator(); menu.add(peak); + menu.addSeparator(); + menu.add(lockAll); + menu.add(unlockAll); menu.show(bookTree, e.getX(), e.getY()); } diff --git a/src/uk/co/majenko/audiobookrecorder/BookTreeRenderer.java b/src/uk/co/majenko/audiobookrecorder/BookTreeRenderer.java index 86481f0..f5232de 100644 --- a/src/uk/co/majenko/audiobookrecorder/BookTreeRenderer.java +++ b/src/uk/co/majenko/audiobookrecorder/BookTreeRenderer.java @@ -14,6 +14,8 @@ public class BookTreeRenderer extends DefaultTreeCellRenderer { if (s.isLocked()) { ret.setForeground(new Color(0x20, 0x00, 0x00)); ret.setIcon(Icons.locked); + } else if (s.getStartOffset() == 0) { + ret.setIcon(Icons.important); } else { ret.setIcon(Icons.sentence); } diff --git a/src/uk/co/majenko/audiobookrecorder/Icons.java b/src/uk/co/majenko/audiobookrecorder/Icons.java index b415f56..d82a267 100644 --- a/src/uk/co/majenko/audiobookrecorder/Icons.java +++ b/src/uk/co/majenko/audiobookrecorder/Icons.java @@ -21,5 +21,6 @@ public class Icons { static public final ImageIcon locked = new ImageIcon(Icons.class.getResource("icons/locked.png")); static public final ImageIcon appIcon = new ImageIcon(Icons.class.getResource("icons/appIcon.png")); static public final ImageIcon star = new ImageIcon(Icons.class.getResource("icons/star.png")); + static public final ImageIcon important = new ImageIcon(Icons.class.getResource("icons/important.png")); } diff --git a/src/uk/co/majenko/audiobookrecorder/Sentence.java b/src/uk/co/majenko/audiobookrecorder/Sentence.java index 822b78f..e1ee121 100644 --- a/src/uk/co/majenko/audiobookrecorder/Sentence.java +++ b/src/uk/co/majenko/audiobookrecorder/Sentence.java @@ -121,7 +121,7 @@ public class Sentence extends DefaultMutableTreeNode implements Cacheable { storedAudioData = null; if (!id.equals("room-noise")) { - autoTrimSampleFFT(); + autoTrimSamplePeak(); if (Options.getBoolean("process.sphinx")) { recognise(); } @@ -574,6 +574,7 @@ public class Sentence extends DefaultMutableTreeNode implements Cacheable { public void clearCache() { storedAudioData = null; + System.gc(); } public boolean lockedInCache() { @@ -582,6 +583,7 @@ public class Sentence extends DefaultMutableTreeNode implements Cacheable { public int findNearestZeroCrossing(int pos, int range) { int[] data = getAudioData(); + if (data == null) return 0; if (pos < 0) pos = 0; if (pos >= data.length) pos = data.length-1;