package org.jcodec.player.filters;
import java.nio.ByteBuffer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Line.Info;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.SourceDataLine;
import org.jcodec.common.NIOUtils;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class JSoundAudioOut implements AudioOut {
private SourceDataLine line;
public void open(AudioFormat fmt, int frames) {
DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt);
if (!AudioSystem.isLineSupported(info)) {
Mixer.Info[] mixers = AudioSystem.getMixerInfo();
for (Mixer.Info mixerInfo : mixers) {
System.out.println("Found Mixer: " + mixerInfo);
Mixer m = AudioSystem.getMixer(mixerInfo);
for (Info li : m.getSourceLineInfo()) {
AudioFormat[] formats = ((DataLine.Info) li).getFormats();
for (AudioFormat audioFormat : formats) {
System.out.println(audioFormat);
}
}
}
throw new RuntimeException("Line matching " + info + " not supported.");
}
try {
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(fmt, frames * fmt.getFrameSize());
line.start();
} catch (LineUnavailableException ex) {
throw new RuntimeException(ex);
}
}
public void close() {
line.stop();
line.close();
}
public long playedMs() {
return line.getMicrosecondPosition();
}
public long playedFrames() {
return line.getLongFramePosition();
}
public int available() {
return line.available();
}
public int bufferSize() {
return line.getBufferSize();
}
public void pause() {
line.stop();
}
public void resume() {
line.start();
}
public void flush() {
line.flush();
}
public void drain() {
line.drain();
}
public void write(ByteBuffer sound) {
int written;
if (sound.hasArray()) {
written = line.write(sound.array(), sound.arrayOffset() + sound.position(), sound.remaining());
} else {
byte[] array = NIOUtils.toArray(sound);
written = line.write(array, 0, array.length);
}
sound.position(sound.position() + written);
}
}