/*
* Copyright 1999-2004 Carnegie Mellon University.
* Portions Copyright 2002-2004 Sun Microsystems, Inc.
* Portions Copyright 2002-2004 Mitsubishi Electric Research Laboratories.
* All Rights Reserved. Use is subject to license terms.
*
* See the file "license.terms" for information on usage and
* redistribution of this file, and for a DISCLAIMER OF ALL
* WARRANTIES.
*
*/
package edu.cmu.sphinx.tools.audio;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/** Represents a 16bit, SIGNED_PCM, little endian audio clip with a sample rate specified by AudioFormat. */
public class AudioData {
protected AudioFormat format;
protected short[] shorts;
protected final List<ChangeListener> listeners = new ArrayList<ChangeListener>();
protected int selectionStart = -1;
protected int selectionEnd = -1;
/** No-arg constructor. Creates an empty clip at 8kHz sample rate. */
public AudioData() {
this.format = new AudioFormat(8000f,
16, // sample size in bits
1, // mono
true, // signed
false); // little endian
shorts = new short[0];
}
/**
* Creates a new AudioData with the given data and sample rate. Expects the data to be 16bit, little endian,
* SIGNED_PCM.
*
* @param data the audio samples; one sample per element in the array
* @param sampleRate the sample rate in Hz
*/
public AudioData(short[] data, float sampleRate) {
this.shorts = data;
this.format = new AudioFormat(sampleRate,
16, // sample size in bits
1, // mono
true, // signed
false); // little endian
}
/**
* Creates a new AudioData from the given AudioInputStream, converting the data to 16bit, little endian, SIGNED_PCM if
* needed.
*
* @param ais the AudioInputStream
* @throws IOException if problems happen when reading from ais
*/
public AudioData(AudioInputStream ais) throws IOException {
this.shorts = Utils.toSignedPCM(ais);
this.format = new AudioFormat(ais.getFormat().getSampleRate(),
16, // sample size in bits
1, // mono
true, // signed
false); // little endian
}
/**
* Gets the SIGNED_PCM 16 bit little endian audio data. NOTE: this the actual array held by this object, so only use
* it as a reference (i.e., don't modify the contents).
*
* @return the SIGNED_PCM 16 bit little endian samples
*/
public short[] getAudioData() {
return shorts;
}
/**
* Sets the audio data and notifies all ChangeListeners.
*
* @param data the new SIGNED_PCM 16 bit little endian samples
*/
public void setAudioData(short[] data) {
this.shorts = data;
fireStateChanged();
}
/**
* Gets the audio format.
*
* @return the AudioFormat for the data managed by this object
*/
public AudioFormat getAudioFormat() {
return format;
}
/**
* Add a ChangeListener.
*
* @param listener the listener to add
*/
public void addChangeListener(ChangeListener listener) {
listeners.add(listener);
}
/**
* Remove a ChangeListener.
*
* @param listener the listener to remove
*/
public void removeChangeListener(ChangeListener listener) {
listeners.remove(listener);
}
/** Notify all ChangeListeners of a change. */
protected void fireStateChanged() {
ChangeEvent event = new ChangeEvent(this);
for (ChangeListener listener : listeners)
listener.stateChanged(event);
}
}