Major improvements to tree list, and added time recording
This commit is contained in:
@@ -1246,6 +1246,7 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
|
|||||||
Chapter c = (Chapter)s.getParent();
|
Chapter c = (Chapter)s.getParent();
|
||||||
int idx = bookTreeModel.getIndexOfChild(c, s);
|
int idx = bookTreeModel.getIndexOfChild(c, s);
|
||||||
bookTreeModel.insertNodeInto(newSentence, c, idx);
|
bookTreeModel.insertNodeInto(newSentence, c, idx);
|
||||||
|
bookTree.setSelectionPath(new TreePath(newSentence.getPath()));
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -2805,7 +2806,7 @@ public class AudiobookRecorder extends JFrame implements DocumentListener {
|
|||||||
play.close();
|
play.close();
|
||||||
}
|
}
|
||||||
play = null;
|
play = null;
|
||||||
e.printStackTrace();
|
// e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -99,8 +99,12 @@ public class Book extends DefaultMutableTreeNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getTextNode(Element r, String n) {
|
public static String getTextNode(Element r, String n) {
|
||||||
|
return getTextNode(r, n, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getTextNode(Element r, String n, String d) {
|
||||||
Element node = getNode(r, n);
|
Element node = getNode(r, n);
|
||||||
if (node == null) return "";
|
if (node == null) return d;
|
||||||
return node.getTextContent();
|
return node.getTextContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,15 @@ public class BookTreeRenderer extends DefaultTreeCellRenderer {
|
|||||||
|
|
||||||
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
|
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
|
||||||
JLabel ret = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
|
JLabel ret = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
|
||||||
ret.setIconTextGap(0);
|
ret.setIconTextGap(5);
|
||||||
ret.setBorder(new EmptyBorder(0, 0, 0, 0));
|
ret.setBorder(new EmptyBorder(0, 0, 0, 0));
|
||||||
if (value instanceof Sentence) {
|
if (value instanceof Sentence) {
|
||||||
Sentence s = (Sentence)value;
|
Sentence s = (Sentence)value;
|
||||||
|
|
||||||
|
JPanel p = new JPanel();
|
||||||
|
p.setLayout(new GridBagLayout());
|
||||||
|
GridBagConstraints ctx = new GridBagConstraints();
|
||||||
|
|
||||||
OverlayIcon icn = new OverlayIcon(Icons.sentence);
|
OverlayIcon icn = new OverlayIcon(Icons.sentence);
|
||||||
|
|
||||||
if (s.getOverrideText() != null) {
|
if (s.getOverrideText() != null) {
|
||||||
@@ -63,17 +67,72 @@ public class BookTreeRenderer extends DefaultTreeCellRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (gaptype.equals("sentence")) {
|
if (gaptype.equals("sentence")) {
|
||||||
ret.setBorder(new EmptyBorder(0, 0, 0, 0));
|
p.setBorder(new EmptyBorder(0, 0, 0, 0));
|
||||||
} else if (gaptype.equals("continuation")) {
|
} else if (gaptype.equals("continuation")) {
|
||||||
ret.setBorder(new EmptyBorder(0, 0, 0, 0));
|
p.setBorder(new EmptyBorder(0, 0, 0, 0));
|
||||||
} else if (gaptype.equals("paragraph")) {
|
} else if (gaptype.equals("paragraph")) {
|
||||||
ret.setBorder(new EmptyBorder(0, 0, 7, 0));
|
p.setBorder(new EmptyBorder(0, 0, 7, 0));
|
||||||
} else if (gaptype.equals("section")) {
|
} else if (gaptype.equals("section")) {
|
||||||
ret.setBorder(new EmptyBorder(0, 0, 15, 0));
|
p.setBorder(new EmptyBorder(0, 0, 15, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JLabel time = new JLabel(Utils.secToTime(s.getLength(), "mm:ss.SSS") + " ");
|
||||||
|
|
||||||
|
ctx.gridx = 0;
|
||||||
|
ctx.gridy = 0;
|
||||||
|
ctx.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
ctx.anchor = GridBagConstraints.LINE_START;
|
||||||
|
|
||||||
|
String effectChain = s.getEffectChain();
|
||||||
|
if ((effectChain == null) || (effectChain.equals("none"))) {
|
||||||
|
ctx.weightx = 1.0d;
|
||||||
|
ctx.gridwidth = 2;
|
||||||
|
p.add(ret, ctx);
|
||||||
|
} else {
|
||||||
|
ctx.weightx = 0.1d;
|
||||||
|
ctx.gridwidth = 1;
|
||||||
|
p.add(ret, ctx);
|
||||||
|
Effect e = AudiobookRecorder.window.effects.get(effectChain);
|
||||||
|
JLabel eff = new JLabel(e.toString() + " ");
|
||||||
|
ctx.weightx = 0.0d;
|
||||||
|
ctx.gridwidth = 1;
|
||||||
|
ctx.gridx = 1;
|
||||||
|
p.add(eff);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.weightx = 0.0d;
|
||||||
|
ctx.gridx = 2;
|
||||||
|
ctx.anchor = GridBagConstraints.LINE_END;
|
||||||
|
p.add(time, ctx);
|
||||||
|
|
||||||
|
p.setOpaque(false);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
} else if (value instanceof Chapter) {
|
} else if (value instanceof Chapter) {
|
||||||
|
Chapter c = (Chapter)value;
|
||||||
|
|
||||||
ret.setIcon(Icons.chapter);
|
ret.setIcon(Icons.chapter);
|
||||||
|
|
||||||
|
JPanel p = new JPanel();
|
||||||
|
p.setLayout(new GridBagLayout());
|
||||||
|
GridBagConstraints ctx = new GridBagConstraints();
|
||||||
|
|
||||||
|
JLabel time = new JLabel(Utils.secToTime(c.getLength(), "mm:ss") + " ");
|
||||||
|
|
||||||
|
ctx.gridx = 0;
|
||||||
|
ctx.gridy = 0;
|
||||||
|
ctx.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
ctx.anchor = GridBagConstraints.LINE_START;
|
||||||
|
ctx.weightx = 1.0d;
|
||||||
|
p.add(ret, ctx);
|
||||||
|
ctx.weightx = 0.0d;
|
||||||
|
ctx.gridx = 1;
|
||||||
|
ctx.anchor = GridBagConstraints.LINE_END;
|
||||||
|
p.add(time, ctx);
|
||||||
|
p.setOpaque(false);
|
||||||
|
return p;
|
||||||
} else if (value instanceof Book) {
|
} else if (value instanceof Book) {
|
||||||
ret.setIcon(((Book)value).getIcon());
|
ret.setIcon(((Book)value).getIcon());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -316,4 +316,16 @@ public class Chapter extends BookTreeNode {
|
|||||||
AudiobookRecorder.window.setChapterNotes(notes);
|
AudiobookRecorder.window.setChapterNotes(notes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getLength() {
|
||||||
|
double len = 0;
|
||||||
|
for (Enumeration o = children(); o.hasMoreElements();) {
|
||||||
|
Object ob = (Object)o.nextElement();
|
||||||
|
if (ob instanceof Sentence) {
|
||||||
|
Sentence s = (Sentence)ob;
|
||||||
|
len += s.getLength();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,8 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
TargetDataLine line;
|
TargetDataLine line;
|
||||||
AudioInputStream inputStream;
|
AudioInputStream inputStream;
|
||||||
AudioFormat storedFormat = null;
|
AudioFormat storedFormat = null;
|
||||||
double storedLength = -1d;
|
|
||||||
|
double runtime = -1d;
|
||||||
|
|
||||||
double[][] audioData = null;
|
double[][] audioData = null;
|
||||||
|
|
||||||
@@ -185,6 +186,8 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
setPostGap(Utils.s2i(Book.getTextNode(root, "post-gap")));
|
setPostGap(Utils.s2i(Book.getTextNode(root, "post-gap")));
|
||||||
setStartOffset(Utils.s2i(Book.getTextNode(root, "start-offset")));
|
setStartOffset(Utils.s2i(Book.getTextNode(root, "start-offset")));
|
||||||
setEndOffset(Utils.s2i(Book.getTextNode(root, "end-offset")));
|
setEndOffset(Utils.s2i(Book.getTextNode(root, "end-offset")));
|
||||||
|
crossStartOffset = Utils.s2i(Book.getTextNode(root, "cross-start-offset", "-1"));
|
||||||
|
crossEndOffset = Utils.s2i(Book.getTextNode(root, "end-offset", "-1"));
|
||||||
setLocked(Utils.s2b(Book.getTextNode(root, "locked")));
|
setLocked(Utils.s2b(Book.getTextNode(root, "locked")));
|
||||||
setAttentionFlag(Utils.s2b(Book.getTextNode(root, "attention")));
|
setAttentionFlag(Utils.s2b(Book.getTextNode(root, "attention")));
|
||||||
setGain(Utils.s2d(Book.getTextNode(root, "gain")));
|
setGain(Utils.s2d(Book.getTextNode(root, "gain")));
|
||||||
@@ -192,6 +195,14 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
setPostGapType(Book.getTextNode(root, "gaptype"));
|
setPostGapType(Book.getTextNode(root, "gaptype"));
|
||||||
sampleSize = Utils.s2i(Book.getTextNode(root, "samples"));
|
sampleSize = Utils.s2i(Book.getTextNode(root, "samples"));
|
||||||
processed = Utils.s2b(Book.getTextNode(root, "processed"));
|
processed = Utils.s2b(Book.getTextNode(root, "processed"));
|
||||||
|
runtime = Utils.s2d(Book.getTextNode(root, "time", "-1.000"));
|
||||||
|
|
||||||
|
if ((crossStartOffset == -1) || (crossEndOffset == -1)) {
|
||||||
|
System.err.println("Updating " + id);
|
||||||
|
updateCrossings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runtime <= 0.01d) getLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean startRecording() {
|
public boolean startRecording() {
|
||||||
@@ -450,11 +461,14 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
return text;
|
||||||
|
/*
|
||||||
if (effectChain == null) return text;
|
if (effectChain == null) return text;
|
||||||
if (effectChain.equals("none")) return text;
|
if (effectChain.equals("none")) return text;
|
||||||
Effect e = AudiobookRecorder.window.effects.get(effectChain);
|
Effect e = AudiobookRecorder.window.effects.get(effectChain);
|
||||||
if (e == null) return text;
|
if (e == null) return text;
|
||||||
return text + " (" + e.toString() + ")";
|
return text + " (" + e.toString() + ")";
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRecording() {
|
public boolean isRecording() {
|
||||||
@@ -499,6 +513,8 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
public void updateCrossings(boolean useRaw) {
|
public void updateCrossings(boolean useRaw) {
|
||||||
updateStartCrossing(useRaw);
|
updateStartCrossing(useRaw);
|
||||||
updateEndCrossing(useRaw);
|
updateEndCrossing(useRaw);
|
||||||
|
runtime = -1d;
|
||||||
|
getLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateStartCrossing() {
|
public void updateStartCrossing() {
|
||||||
@@ -642,7 +658,6 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
audioData = null;
|
audioData = null;
|
||||||
processedAudio = null;
|
processedAudio = null;
|
||||||
storedFormat = null;
|
storedFormat = null;
|
||||||
storedLength = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean lockedInCache() {
|
public boolean lockedInCache() {
|
||||||
@@ -698,13 +713,12 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
|
|
||||||
/* Get the length of the sample in seconds */
|
/* Get the length of the sample in seconds */
|
||||||
public double getLength() {
|
public double getLength() {
|
||||||
if (storedLength > -1d) return storedLength;
|
if (runtime > 0.01d) return runtime;
|
||||||
AudioFormat format = getAudioFormat();
|
AudioFormat format = getAudioFormat();
|
||||||
float sampleFrequency = format.getFrameRate();
|
float sampleFrequency = format.getFrameRate();
|
||||||
int length = crossEndOffset - crossStartOffset;
|
int length = crossEndOffset - crossStartOffset;
|
||||||
double time = (double)length / (double)sampleFrequency;
|
runtime = (double)length / (double)sampleFrequency;
|
||||||
storedLength = time;
|
return runtime;
|
||||||
return time;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Sentence cloneSentence() throws IOException {
|
public Sentence cloneSentence() throws IOException {
|
||||||
@@ -1431,6 +1445,8 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "post-gap", getPostGap()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "post-gap", getPostGap()));
|
||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "start-offset", getStartOffset()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "start-offset", getStartOffset()));
|
||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "end-offset", getEndOffset()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "end-offset", getEndOffset()));
|
||||||
|
sentenceNode.appendChild(Book.makeTextNode(doc, "cross-start-offset", crossStartOffset));
|
||||||
|
sentenceNode.appendChild(Book.makeTextNode(doc, "cross-end-offset", crossEndOffset));
|
||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "locked", isLocked()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "locked", isLocked()));
|
||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "attention", getAttentionFlag()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "attention", getAttentionFlag()));
|
||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "gain", getGain()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "gain", getGain()));
|
||||||
@@ -1439,6 +1455,7 @@ public class Sentence extends BookTreeNode implements Cacheable {
|
|||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "samples", getSampleSize()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "samples", getSampleSize()));
|
||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "processed", isProcessed()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "processed", isProcessed()));
|
||||||
sentenceNode.appendChild(Book.makeTextNode(doc, "notes", getNotes()));
|
sentenceNode.appendChild(Book.makeTextNode(doc, "notes", getNotes()));
|
||||||
|
sentenceNode.appendChild(Book.makeTextNode(doc, "time", getLength()));
|
||||||
return sentenceNode;
|
return sentenceNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import java.util.*;
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
public class Utils {
|
public class Utils {
|
||||||
public static Image getScaledImage(Image srcImg, int w, int h){
|
public static Image getScaledImage(Image srcImg, int w, int h){
|
||||||
BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
|
BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
|
||||||
@@ -76,4 +78,12 @@ public class Utils {
|
|||||||
Runtime.getRuntime().freeMemory()
|
Runtime.getRuntime().freeMemory()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String secToTime(double sec, String fmt) {
|
||||||
|
Date d = new Date((long)(sec * 1000d));
|
||||||
|
SimpleDateFormat df = new SimpleDateFormat(fmt);
|
||||||
|
df.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
|
String time = df.format(d);
|
||||||
|
return time;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user