/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * Copyright (c) 1999-2003 Tsukuba Bunko.
 *
 * $Id: AudioClip.java,v 1.1.2.1 2003/12/11 10:23:10 ppoi Exp $
 */
package tsukuba_bunko.peko.canvas.stage;

import	java.net.URL;


/**
 * 音楽クリップの基本的な機能を提供します。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public abstract class AudioClip	{

	/**
	 * クリップ ID
	 */
	private String	_id = null;

	/**
	 * このクリップを管理する AudioPlayer
	 */
	private AudioPlayer	_player = null;

	/**
	 * 再生クリップの URL
	 */
	private URL	_clipURL = null;

	/**
	 * ループするかどうか
	 */
	private boolean	_isLoop = false;


	/**
	 * <code>AudioClip</code> のインスタンスを作成するためにサブクラスのコンストラクタから呼ばれます。
	 * @param	id	クリップ ID
	 * @param	clipURL	クリップの URL
	 */
	protected AudioClip( String id, URL clipURL )
	{
		super();
		_id = id;
		_clipURL = clipURL;
	}


	/**
	 * このクリップのクリップ ID を取得します。
	 * @return	クリップ ID
	 */
	public String getID()
	{
		return _id;
	}

	/**
	 * このクリップを管理する AudioPlayer を設定します。
	 * @param	player	このクリップを管理する AudioPlayer
	 */
	public void setAudioPlayer( AudioPlayer player )
	{
		_player = player;
	}

	/**
	 * このクリップを管理する AudioPlayer を取得します。
	 * @return	このクリップを管理する AudioPlayer
	 */
	public AudioPlayer getAudioPlayer()
	{
		return _player;
	}

	/**
	 * このクリップのソースデータの URL を取得します。
	 * @return	このクリップのソースデータの URL
	 */
	public URL getClipURL()
	{
		return _clipURL;
	}

	/**
	 * このクリップの再生をループするかどうかを判定します。
	 * @return	ループする場合 <code>true</code>、しない場合 <code>false</code>
	 */
	public boolean isLoop()
	{
		return _isLoop;
	}

	/**
	 * このクリップを再生を開始します。
	 * @param	loop	ループする場合は <code>true</code>、しない場合は <code>false</code>。
	 */
	public void play( boolean loop )
	{
		_isLoop = loop;
		play();
	}

	/**
	 * このクリップの再生を開始します。
	 */
	public abstract void play();

	/**
	 * このクリップの再生を停止します。
	 */
	public abstract void stop();

	/**
	 * 演奏が終了したことを AudioPlayer に通知します。
	 */
	protected void playingFinished()
	{
		AudioPlayer	player = getAudioPlayer();
		if( player != null )	{
			player.unregister( this );
		}
	}
}
