examples.be.tarsos.dsp.example.HaarWaveletAudioCompression Maven / Gradle / Ivy
The newest version!
/*
* _______ _____ _____ _____
* |__ __| | __ \ / ____| __ \
* | | __ _ _ __ ___ ___ ___| | | | (___ | |__) |
* | |/ _` | '__/ __|/ _ \/ __| | | |\___ \| ___/
* | | (_| | | \__ \ (_) \__ \ |__| |____) | |
* |_|\__,_|_| |___/\___/|___/_____/|_____/|_|
*
* -------------------------------------------------------------
*
* TarsosDSP is developed by Joren Six at IPEM, University Ghent
*
* -------------------------------------------------------------
*
* Info: http://0110.be/tag/TarsosDSP
* Github: https://github.com/JorenSix/TarsosDSP
* Releases: http://0110.be/releases/TarsosDSP/
*
* TarsosDSP includes modified source code by various authors,
* for credits and info, see README.
*
*/
package be.tarsos.dsp.example;
import java.awt.BorderLayout;
import java.lang.reflect.InvocationTargetException;
import javax.sound.sampled.AudioFormat;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import be.tarsos.dsp.AudioDispatcher;
import be.tarsos.dsp.BitDepthProcessor;
import be.tarsos.dsp.GainProcessor;
import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
import be.tarsos.dsp.io.jvm.AudioPlayer;
import be.tarsos.dsp.io.jvm.JVMAudioInputStream;
import be.tarsos.dsp.wavelet.HaarWaveletCoder;
import be.tarsos.dsp.wavelet.HaarWaveletDecoder;
public class HaarWaveletAudioCompression extends JFrame{
/**
*
*/
private static final long serialVersionUID = -7385116325411493047L;
private HaarWaveletCoder coder;
private GainProcessor gain;
private BitDepthProcessor bithDeptProcessor;
public HaarWaveletAudioCompression(final String source){
this.setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("HaarWavelet Wavelet Audio Compression Example");
Runnable r = new Runnable() {
@Override
public void run() {
try {
AudioDispatcher adp = AudioDispatcherFactory.fromPipe(source, 44100, 32,0);
AudioFormat format = JVMAudioInputStream.toAudioFormat(adp.getFormat());
coder = new HaarWaveletCoder();
HaarWaveletDecoder decoder = new HaarWaveletDecoder();
gain = new GainProcessor(1.0);
bithDeptProcessor = new BitDepthProcessor();
bithDeptProcessor.setBitDepth(adp.getFormat().getSampleSizeInBits());
adp.addAudioProcessor(coder);
adp.addAudioProcessor(decoder);
adp.addAudioProcessor(gain);
adp.addAudioProcessor(bithDeptProcessor);
adp.addAudioProcessor(new AudioPlayer(format));
// start on a new thread
new Thread(adp, "Audio processor").start();
} catch (Exception e) {
e.printStackTrace();
}
}
};
new Thread(r, "Start processor").start();
this.add(this.createGainPanel(),BorderLayout.NORTH);
this.add(this.createCompressionPanel(),BorderLayout.CENTER);
this.add(this.createBitDepthCompressionPanel(16),BorderLayout.SOUTH);
}
private JComponent createGainPanel(){
final JSlider gainSlider;
gainSlider = new JSlider(0,200);
gainSlider.setValue(100);
gainSlider.setPaintLabels(true);
gainSlider.setPaintTicks(true);
final JLabel label = new JLabel("Gain: 100%");
gainSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
double gainValue = gainSlider.getValue() / 100.0;
label.setText(String.format("Gain: %3d", gainSlider.getValue())+"%");
if(gain !=null)
gain.setGain(gainValue);
}
});
JPanel gainPanel = new JPanel(new BorderLayout());
label.setToolTipText("Volume in % (100 is no change).");
gainPanel.add(label,BorderLayout.NORTH);
gainPanel.add(gainSlider,BorderLayout.CENTER);
gainPanel.setBorder(new TitledBorder("Volume control"));
return gainPanel;
}
private JComponent createCompressionPanel(){
final JSlider compressionSlider = new JSlider(0,31);
compressionSlider.setValue(10);
compressionSlider.setPaintLabels(true);
compressionSlider.setPaintTicks(true);
final JLabel label = new JLabel("Compression: 10");
compressionSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
int compressionValue = compressionSlider.getValue();
label.setText(String.format("Compression: %3d", compressionValue));
if(coder !=null)
coder.setCompression(compressionValue);
}
});
JPanel compressionPanel = new JPanel(new BorderLayout());
label.setToolTipText("Compression in steps (0 is no compression, 32 is no signal).");
compressionPanel.add(label,BorderLayout.NORTH);
compressionPanel.add(compressionSlider,BorderLayout.CENTER);
compressionPanel.setBorder(new TitledBorder("Compression control"));
return compressionPanel;
}
private JComponent createBitDepthCompressionPanel(int maxValue){
final JSlider bitDepthcompressionSlider = new JSlider(0,maxValue);
bitDepthcompressionSlider.setValue(maxValue);
bitDepthcompressionSlider.setPaintLabels(true);
bitDepthcompressionSlider.setPaintTicks(true);
final JLabel label = new JLabel("Bit depth (bits): "+maxValue);
bitDepthcompressionSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
int bitDepth = bitDepthcompressionSlider.getValue();
label.setText(String.format("Bit depth (bits): %3d", bitDepth));
if(bithDeptProcessor !=null)
bithDeptProcessor.setBitDepth(bitDepth);
}
});
JPanel compressionPanel = new JPanel(new BorderLayout());
label.setToolTipText("Bit depth in bits.");
compressionPanel.add(label,BorderLayout.NORTH);
compressionPanel.add(bitDepthcompressionSlider,BorderLayout.CENTER);
compressionPanel.setBorder(new TitledBorder("Bith depth control"));
return compressionPanel;
}
public static void main (String[] args) throws InvocationTargetException, InterruptedException{
final String source;
if(args.length == 1){
source = args[0];
}else{
source = "http://mp3.streampower.be/stubru-high.mp3";
}
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
JFrame frame = new HaarWaveletAudioCompression(source);
frame.pack();
frame.setSize(450,250);
frame.setVisible(true);
}
});
}
}