// =========================================================
// Проигрывание аудиофайла
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;

public class Audio extends Applet
{
  // -------------------------------------------------------
  // Поля класса.
  // Создаются автоматически для всех параметров аплета
  // -------------------------------------------------------

  // Строка для хранения имени аудиофайла
  private String m_ClipName = "kaas.au";

  // -------------------------------------------------------
  // Имена параметров
  // -------------------------------------------------------

	// Строка имени параметра
  private final String PARAM_ClipName = "ClipName";

  // Аудиоклип
  AudioClip auClip;

  // Кнопка для однократного проигрывания
  Button btPlay;

  // Кнопка для проигрывания в цикле
  Button btLoop;

  // Кнопка для остановки проигрывания
  Button btStop;

  // Флаг проигрывания в цикле
  boolean fLoopPlay = false;

	// -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
	{
		return "Name: Audio\r\n" +
      "Author: Alexandr Frolov\r\n" +
      "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Created with Microsoft Visual J++ Version 1.0";
	}

	// -------------------------------------------------------
  // getParameterInfo
  // Метод, возвращающий описание параметров
  // -------------------------------------------------------
	public String[][] getParameterInfo()
	{
		String[][] info =
		{
			{ PARAM_ClipName, "String", "Audioclip filename" },
		};
		return info;		
	}

  // -------------------------------------------------------
  // init
  // Вызывается во время инициализации аплета
  // -------------------------------------------------------
	public void init()
	{
    // Рабочая переменная для получения параметров
		String param;

		// Получение параметров и сохранение
    // их значений в полях класса

    // Получение имени аудиофайла
		param = getParameter(PARAM_ClipName);
		if (param != null)
			m_ClipName = param;

    // Создаем кнопку для однократного проигрывания
    btPlay = new Button("Play");

    // Создаем кнопку для проигрывания в цикле
    btLoop = new Button("Loop");

    // Создаем кнопку для остановки проигрывания
    btStop = new Button("Stop");

    // Блокируем эту кнопку, так как пока еще
    // проигрывание не запущено
    btStop.disable();

    // Добавляем кнопки в окно аплета
    add(btPlay);
    add(btLoop);
    add(btStop);

    // Создаем аудиоклип как объект класса AudioClip
    auClip = Applet.getAudioClip(getCodeBase(), 
      m_ClipName);
	}

  // -------------------------------------------------------
  // action
  // Метод вызывается, когда пользователь выполняет
  // действие над компонентами
  // -------------------------------------------------------
  public boolean action(Event evt, Object obj)
  {
    // Ссылка на кнопку, от которой пришло сообщение
    Button btn;

    // Проверяем, что событие вызвано кнопкой, а не
    // другим компонентом
    if(evt.target instanceof Button)
    {
      // Получам ссылку на кнопку, вызвавшую событие
      btn = (Button)evt.target;

      // Выполняем ветвление по кнопкам
      
      // Нажата кнопка однократного проигрывания
      if(evt.target.equals(btPlay))
      {
        // Запускаем однократное проигрывание
        auClip.play();

        // Разблокируем кнопку остановки проигрывания
        btStop.enable();
      }

      // Нажата кнопка проигрывания в цикле
      else if(evt.target.equals(btLoop))
      {
        // Запускаем проигрывание в цикле
        auClip.loop();

        // Устанавливаем флаг проигрывания в цикле
        fLoopPlay = true;

        // Разблокируем кнопку остановки проигрывания
        btStop.enable();
      }

      // Нажата кнопка остановки проигрывания
      else if(evt.target.equals(btStop))
      {
        // Останавливаем проигрывание
        auClip.stop();

        // Сбрасываем флаг проигрывания в цикле
        fLoopPlay = false;

        // Блокируем кнопку остановки проигрывания
        btStop.disable();
      }

      // Если событие возникло от неизвестной кнопки,
      // мы его не обрабатываем
      else
      {
        return false;
      }

      // возвращаем признак того, что мы обработали событие
      return true;
    }

    // Если событие вызвано не кнопкой, 
    // мы его не обрабатываем
    return false;
  }

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
	public void paint(Graphics g)
	{
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения желтый цвет
    g.setColor(Color.yellow);
    
    // Закрашиваем внутреннюю область окна аплета
    g.fillRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет
    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);
	}

  // -------------------------------------------------------
  // start
  // Метод вызывается при первом отображении окна аплета
  // -------------------------------------------------------
	public void start()
	{
    // Если установлен флаг проигрывания в цикле,
    // запускаем такое проигрывание
    if(fLoopPlay)
      auClip.loop();
	}
	
  // -------------------------------------------------------
  // stop
  // Метод вызывается, когда окно аплета исчезает с экрана
  // -------------------------------------------------------
	public void stop()
	{
    // Если установлен флаг проигрывания в цикле,
    // останавливаем проигрывание
    if(fLoopPlay)
      auClip.stop();
	}
}
