/** 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(); } } }