/** Generate Silence
*
* Created : July 8, 2014
*
* @author pquiring
*/
import java.io.*;
import javaforce.*;
public class GenSilence extends javax.swing.JDialog {
/**
* Creates new form GenSilence
*/
public GenSilence(java.awt.Frame parent, boolean modal, TrackPanel track) {
super(parent, modal);
initComponents();
JF.centerWindow(this);
this.track = track;
if (track.selectStart != track.selectStop) {
timeField.setEnabled(false);
double time = track.selectStop - track.selectStart;
time /= track.rate;
timeField.setText("" + time );
}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
apply = new javax.swing.JButton();
cancel = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
timeField = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Resample");
setResizable(false);
apply.setText("Apply");
apply.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
applyActionPerformed(evt);
}
});
cancel.setText("Cancel");
cancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelActionPerformed(evt);
}
});
jLabel3.setText("Length:");
timeField.setText("5.0");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 132, Short.MAX_VALUE)
.addComponent(cancel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(apply))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(timeField)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(timeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(apply)
.addComponent(cancel))
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed
dispose();
}//GEN-LAST:event_cancelActionPerformed
private void applyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_applyActionPerformed
apply();
dispose();
}//GEN-LAST:event_applyActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton apply;
private javax.swing.JButton cancel;
private javax.swing.JLabel jLabel3;
private javax.swing.JTextField timeField;
// End of variables declaration//GEN-END:variables
private TrackPanel track;
private void apply() {
int rate = track.rate;
boolean replace = false;
long length;
if (track.selectStart != track.selectStop) {
replace = true;
track.createModifyUndo();
length = track.selectStop - track.selectStart;
} else {
length = (long)(Double.parseDouble(timeField.getText()) * rate);
}
String toPath = track.project.path + "/temp";
new File(toPath).mkdir();
FileOutputStream fos;
long totalLength = length;
try {
int cid[] = new int[track.channels];
ByteArrayOutputStream baos[] = new ByteArrayOutputStream[track.channels];
for(int ch=0;ch<track.channels;ch++) {
baos[ch] = new ByteArrayOutputStream();
}
int size[] = new int[track.channels];
while (length > 0) {
int todo = track.maxChunkSize;
if (todo > length) todo = (int)length;
for(int ch=0;ch<track.channels;ch++) {
for(int a=0;a<todo;a++) {
switch (track.bits) {
case 16: {
baos[ch].write(0);
baos[ch].write(0);
break;
}
case 32: {
baos[ch].write(0);
baos[ch].write(0);
baos[ch].write(0);
baos[ch].write(0);
break;
}
}
size[ch]++;
if (size[ch] == track.maxChunkSize) {
fos = new FileOutputStream(toPath + "/c" + cid[ch] + "-" + ch + ".dat");
TrackPanel.ChunkHeader chunk = new TrackPanel.ChunkHeader();
chunk.cid = cid[ch]++;
chunk.length = size[ch];
chunk.next_cid = cid[ch];
chunk.write(fos);
fos.write(baos[ch].toByteArray());
fos.close();
size[ch] = 0;
baos[ch].reset();
}
}
}
length -= todo;
}
for(int ch=0;ch<track.channels;ch++) {
if (size[ch] > 0) {
fos = new FileOutputStream(toPath + "/c" + cid[ch] + "-" + ch + ".dat");
TrackPanel.ChunkHeader chunk = new TrackPanel.ChunkHeader();
chunk.cid = cid[ch]++;
chunk.length = size[ch];
chunk.next_cid = 0;
chunk.write(fos);
fos.write(baos[ch].toByteArray());
fos.close();
size[ch] = 0;
baos[ch].reset();
} else {
//need to patch last chunk (clear next_cid)
RandomAccessFile raf = new RandomAccessFile(toPath + "/c" + (cid[ch]-1) + "-" + ch + ".dat", "rw");
raf.seek(4); //skip length
raf.write(new byte[4]); //write zero next_cid
raf.close();
}
}
//write clip header
fos = new FileOutputStream(toPath + "/clip.dat");
TrackPanel.ClipHeader clip = new TrackPanel.ClipHeader();
clip.offset = 0;
clip.length = totalLength;
clip.tid = track.tid;
clip.channels = track.channels;
clip.bits = track.bits;
clip.bytes = track.bytes;
clip.rate = rate;
clip.write(fos);
fos.close();
} catch (Exception e) {
JFLog.log(e);
dispose();
return;
}
track.paste(toPath, replace);
track.writeMainHeader();
//now delete /temp contents
File files[] = new File(toPath).listFiles();
for(int a=0;a<files.length;a++) {
files[a].delete();
}
}
}