Главная » Статьи » Java - интересные решения

Звук в апплетах Java

Приложение Audio

Приложение Audio демонстрирует использование интерфейса AudioClip. В его окне (рис. 5.1) имеются три кнопки с названиями Play, Loop и Stop.

Рис. 5.1. Окно аплета Audio

Сразу после запуска аплета кнопка Stop находится в заблокированном состоянии. Если нажать кнопку Play или Loop, начнется, соответственно, однократное проигрывание или проигрывание в цикле файла с именем kaas.au, распложенного в том же каталоге, что и двоичный файл аплета Audio.

Когда начинается проигрывание звукового файла, кнопка Stop разблокируется, что позволяет остановить проигрывание.

Исходные тексты приложения

Основной файл исходных текстов приложения приведен в листинге 5.1.

Листинг 5.1. Файл Audio\ Audio.java


// =========================================================
// Проигрывание аудиофайла
//
// (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();
 }
}

В листинге 5.2 вы найдете исходный текст документа HTML, созданного автоматически для нашего приложения системой Microsoft Visual J++.

Листинг 5.2. Файл Audio\ Audio.html


<html>
<head>
<title>Audio</title>
</head>
<body>
<hr>
<applet
 code=Audio.class
 id=Audio
 width=320
 height=50 >
 <param name=ClipName value="kaas.au">
</applet>
<hr>
<a href="Audio.java">The source.</a>
</body>
</html>

Описание исходного текста

В главном классе аплета определено несколько полей и методов. Рассмотрим эти поля и наиболее важные методы.

Поля класса Audio

В поле m_ClipName хранится имя звукового файла, которое передается через параметр ClipName из документа HTML. По умолчанию для этого параметра используется значение kaas.au.

Строка PARAM_ClipName хранит имя указанного выше параметра.

Ссылка на интерфейс AudioClip хранится в поле auClip:


AudioClip auClip;

Следующие три поля хранят ссылки на кнопки, предназначенные для управления проигрыванием звукового файла:


Button btPlay;
Button btLoop;
Button btStop;

Поле fLoopPlay типа boolean используется для флага, которым отмечается режим проигрывания звукового файла в цикле.

Метод getParameterInfo

Метод getParameterInfo возвращает описание единственного параметра нашего аплета, через который передается имя звукового файла.

Метод init

Сразу после запуска аплета метод init получает значение параметра - имя звукового файла, и если этот параметр задан в документе HTML, записывает полученное имя в поле m_ClipName:


param = getParameter(PARAM_ClipName);
if(param != null)
 m_ClipName = param;

Далее создаются три кнопки, управляющие звучанием аплета:


btPlay = new Button("Play");
btLoop = new Button("Loop");
btStop = new Button("Stop");

Кнопка Stop блокируется, так как на данный момент проигрывание еще не запущено:


btStop.disable();

Для блокирования вызывается метод disable, определенный в классе Button.

Подготовленные таким образом кнопки добавляются в окно аплета:


add(btPlay);
add(btLoop);
add(btStop);

Напомним, что работа с кнопками и другими органами управления в приложениях Java была нами описана в 30 томе “Библиотеки системного программиста”, который называется “Microsoft Visual J++. Создание приложений на языке Java. Часть 1”.

Последнее, что делает метод init перед тем как возвратить управление, это получение ссылки на интерфейс AudioClip:


auClip = Applet.getAudioClip(getCodeBase(),m_ClipName);

Адрес URL каталога, в котором расположен аплет, определяется с помощью метода getCodeBase, о котором мы говорили в предыдущей главе.

Метод action

Метод action получает управление, когда пользователь нажимает на одну из кнопок, расположенных в окне аплета. В зависимости от того, какая именно кнопка была нажата, выполняются различные действия.

Если пользователь нажал кнопку Play, вызывается метод play для запуска однократного проигрывания звукового файла:


auClip.play();
btStop.enable();

Сразу после того как проигрывание будет запущено, приложение разблокирует кнопку Stop, предоставляя пользователю возможность прервать звучание.

В том случае, когда пользователь нажал кнопку Loop, вызывается метод loop, запусчкающий проигрывание звукового файла в цикле:


auClip.loop();
fLoopPlay = true;
btStop.enable();

После запуска устанавливается флаг fLoopPlay и разблокируется кнопка Stop.

И, наконец, если пользователь нажимает кнопку Stop, выполняется остановка проигрывания методом stop:


auClip.stop();
fLoopPlay = false;
btStop.disable();

Флаг fLoopPlay сбрасывается, после чего кнопка Stop блокируется.

Метод start

Метод start получает управление при первом запуска аплета, а также когда страница документа появляется вновь после того как пользователь временно переходил к просмотру другой страницы.

Наша реализация метода start возобновляет циклическое проигрывание, если оно выполнялось, когда пользователь покинул страницу с аплетом:


if(fLoopPlay)
 auClip.loop();

Метод stop

Если пользователь запустил проигрывание звукового файла в цикле, а затем перешел к просмотру другой страницы, метод stop останавливает циклическое проигрывание:


if(fLoopPlay)
 auClip.stop();

Когда пользователь вернется к просмотру нашей страницы, метод start, описанный выше, возобновит проигрывание звукового файла.

© Александр Фролов, Григорий Фролов, 1991-2016

Категория: Java - интересные решения | Добавил: kuzma (05.04.2017)
Просмотров: 440 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar

Программирование игр на Python

Django - создание сайтов с нуля

Javascript - просто используем готовые решения