/**
* Created : Jun 28, 2012
*
* @author pquiring
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javaforce.*;
public class MixTracks extends javax.swing.JDialog implements ActionListener {
/**
* Creates new form MixTracks
*/
public MixTracks(java.awt.Frame parent, boolean modal, ProjectPanel project, ArrayList<TrackPanel> list) {
super(parent, modal);
initComponents();
setPosition();
this.trackList = list;
this.project = project;
for(int a=0;a<list.size();a++) {
JToggleButton button = new JToggleButton("Track " + (a+1));
button.addActionListener(this);
button.setActionCommand("" + a);
buttonList.add(button);
tracks.add(button);
list.get(a).unselectAll();
}
}
/**
* 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() {
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
tracks = new javax.swing.JPanel();
ok = new javax.swing.JButton();
cancel = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jLabel1.setText("Select two Tracks to mix:");
jScrollPane1.setViewportView(tracks);
ok.setText("Ok");
ok.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okActionPerformed(evt);
}
});
cancel.setText("Cancel");
cancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelActionPerformed(evt);
}
});
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)
.addComponent(jScrollPane1)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(0, 222, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(cancel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ok)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 265, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(ok)
.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 okActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okActionPerformed
mix();
}//GEN-LAST:event_okActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancel;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton ok;
private javax.swing.JPanel tracks;
// End of variables declaration//GEN-END:variables
public boolean accepted;
public ArrayList<JToggleButton> buttonList = new ArrayList<JToggleButton>();
public ProjectPanel project;
public ArrayList<TrackPanel> trackList = new ArrayList<TrackPanel>();
private void mix() {
int cnt = 0;
int idx[] = new int[2];
idx[0] = -1;
idx[1] = -1;
for(int a=0;a<buttonList.size();a++) {
if (buttonList.get(a).isSelected()) {
if (idx[0] == -1) idx[0] = a;
else if (idx[1] == -1) idx[1] = a;
cnt++;
}
}
if (cnt != 2) {
JF.showError("Error", "Must select exactly two tracks");
return;
}
TrackPanel t1, t2, tmp;
t1 = trackList.get(idx[0]);
t2 = trackList.get(idx[1]);
if (t1.bits != t2.bits) {
JF.showError("Error", "Samples bit sizes do not match");
return;
}
if (t1.channels != t2.channels) {
JF.showError("Error", "Number of channels do not match");
return;
}
if (t1.rate != t2.rate) {
if (!JF.showConfirm("Warning", "Frequecy rates do not match, continue anyways?")) {
return;
}
}
if (t1.totalLength < t2.totalLength) {
tmp = t1;
t1 = t2;
t2 = tmp;
}
project.deleteUndo();
//mix t2 into t1 and delete t2
long length = t2.totalLength;
long offset = 0;
while (length > 0) {
int toRead = TrackPanel.maxChunkSize;
if (toRead > length) toRead = (int)length;
for(int ch=0;ch<t1.channels;ch++) {
byte samples1[] = t1.getSamples(offset, toRead, ch);
byte samples2[] = t2.getSamples(offset, toRead, ch);
byte samplesOut[] = null;
switch (t1.bits) {
case 16:
short samples16_1[] = LE.byteArray2shortArray(samples1, null);
short samples16_2[] = LE.byteArray2shortArray(samples2, null);
for(int a=0;a<samples16_1.length;a++) {
samples16_1[a] += samples16_2[a];
}
samplesOut = LE.shortArray2byteArray(samples16_1, null);
break;
case 32:
int samples32_1[] = LE.byteArray2intArray(samples1, null);
int samples32_2[] = LE.byteArray2intArray(samples2, null);
for(int a=0;a<samples32_1.length;a++) {
samples32_1[a] += samples32_2[a];
}
samplesOut = LE.intArray2byteArray(samples32_1, null);
break;
}
t1.setSamples(offset, samplesOut, ch);
}
offset += toRead;
length -= toRead;
}
t2.selectTrack(true);
project.deleteTrack();
dispose();
}
private void setPosition() {
Dimension d = getSize();
Rectangle s = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
setLocation(s.width/2 - d.width/2, s.height/2 - d.height/2);
}
public void actionPerformed(ActionEvent ae) {
JToggleButton button = (JToggleButton)ae.getSource();
int lidx = JF.atoi(button.getActionCommand());
if (button.isSelected())
trackList.get(lidx).selectTrack(false);
else
trackList.get(lidx).unselectAll();
}
}