blob: a8f6bc05b48d0e409fe9397cf5d1efc013d81f27 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Daisuke SATO - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.ai.audio.io.impl;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.SourceDataLine;
import org.eclipse.actf.ai.audio.io.AudioIOException;
import org.eclipse.actf.ai.audio.io.IAudioWriter;
public class PlaybackDevice implements IAudioWriter {
private Mixer playbackMixer;
private SourceDataLine playbackLine;
private int limit;
@Override
public boolean equals(Object o) {
if (o instanceof PlaybackDevice) {
return playbackMixer.equals(((PlaybackDevice) o).playbackMixer);
}
return false;
}
public PlaybackDevice(Mixer mixer) {
this.playbackMixer = mixer;
}
public PlaybackDevice() {
this.playbackMixer = null;
}
public String getName() {
if (playbackMixer != null)
return "Device \"" + playbackMixer.getMixerInfo().getName() + "\"";
else
return "Device \"default\"";
}
synchronized public void close() {
if (playbackLine != null) {
playbackLine.drain();
playbackLine.close();
}
}
public boolean isClosed() {
if (playbackLine == null)
return true;
return !playbackLine.isOpen();
}
public boolean canWrite() {
return true;
}
synchronized public void open(AudioFormat format) throws AudioIOException {
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
if (playbackMixer != null)
playbackLine = (SourceDataLine) playbackMixer.getLine(info);
else
playbackLine = (SourceDataLine) AudioSystem.getLine(info);
playbackLine.open();
limit = playbackLine.available() / 10 * 5;
playbackLine.start();
} catch (LineUnavailableException e1) {
e1.printStackTrace();
}
}
synchronized public int write(byte[] data, int offset, int length)
throws AudioIOException {
if (playbackLine.available() > limit) {
return playbackLine.write(data, offset, length);
}
return 0;
}
}