package gnu.javax.sound.sampled.wce;


import javax.sound.sampled.Line;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.swing.event.EventListenerList;

/**
 * Lineインタフェースを持つクラスの基底クラス。
 */
public abstract class WCELine implements Line {
	/**
	 * オープンされているか
	 */
	private boolean openFlag;
	
	/**
	 * イベントリスナー
	 */
	private final EventListenerList eventListeners = new EventListenerList();
	
	/**
	 * このLineの情報
	 */
	private final Line.Info lineInfo;
	
	protected WCELine(Line.Info info) {
		this.lineInfo = info;
	}
	
	public void open() throws LineUnavailableException {
		this.openFlag = true;
	}
	
	public void close() {
		this.openFlag = false;
	}
	
	public boolean isOpen() {
		return this.openFlag;
	}

	public void addLineListener(LineListener listener) {
		this.eventListeners.add(LineListener.class, listener);
	}
	
	public void removeLineListener(LineListener listener) {
		this.eventListeners.remove(LineListener.class, listener);
	}

	/**
	 * イベントをLineListenerに通知する
	 */
	void notifyLineEvent(LineEvent event) {
		Object[] listeners = this.eventListeners.getListenerList();
		for (int i = listeners.length - 2; i >= 0; i -= 2) {
			if (listeners[i] == LineEvent.class) {
				((LineListener) listeners[i + 1]).update(event);
			}
		}
     }

	/**
	 * このLineの情報
	 */
	public Line.Info getLineInfo() {
		return this.lineInfo;
	}
}
