Проигрывание аудиофайла
Листинг 15.16. Проигрывание аудиофайла
import javax.sound.sampled.*;
import j ava.io.*;
class PlayAudioLine(
PlayAudioLine(String s){
play(s);
}
public void play(String file){
SourceDataLine line = null;
AudioInputStream ais = null;
byte[] b = new byte[2048]; // Буфер данных
try{
File f = new File(file);
// Создаем входной поток байтов из файла f
ais = AudioSystem.getAudioInputStream(f);
// Извлекаем из потока информацию о способе записи звука
AudioFormat af = ais.getFormat () ;
// Заносим эту информацию в объект info
DataLine.Infо info = new DataLine.Infо(SourceDataLine.class, af);
// Проверяем, приемлем ли такой способ записи звука
if (!AudioSystem.isLineSupported(info)){
System.err.println("Line is not supported");
System.exit(0);
}
// Получаем входную линию
line = (SourceDataLine)AudioSystem.getLine(info);
// Открываем линию
line.open(af);
// Начинаем проигрывание
line.start();
// Ждем появления данных в буфере int num = 0;
// Раз за разом заполняем буфер
while(( num = ais.read(b)) != -1)
line.write(b, 0, num);
// "Сливаем" буфер, проигрывая остаток файла
line.drain();
// Закрываем поток
ais.close();
} catch (Exception e) {
System, err.println (e);
}
// Останавливаем проигрывание
line.stop();
// Закрываем линию
line.close();
}
public static void main(String[] args){
String s = "mrmba.aif";
if (args.length >
0) s = args[0];
new PlayAudioLine(s) ;
}
}
Управлять проигрыванием файла можно с помощью событий. Событие класса LineEvent происходит при открытии, OPEN, и закрытии, CLOSE, потока, при начале, START, и окончании, STOP, проигрывания. Характер события отмечается указанными константами. Соответствующий интерфейс LineListener описывает только один метод update ().
В MIDI-файлах хранится последовательность (sequence) команд для секвен-сора (sequencer) — устройства для записи, проигрывания и редактирования MlDI-последовательности, которым может быть физическое устройство или программа. Последовательность состоит из нескольких дорожек (tracks), на которых записаны MIDI-события (events). Каждая дорожка загружается в своем канале (channel). Обычно дорожка содержит звучание одного музыкального инструмента или запись голоса одного исполнителя или запись нескольких исполнителей, микшированную синтезатором (synthesizer).
Для проигрывания MIDI-последовательности в простейшем случае надо создать экземпляр секвенсора, открыть его и направить в него последовательность, извлеченную из файла, как показано в листинге 15.17. После этого следует начать проигрывание методом start (). Закончить проигрывание можно методом stop(), "перемотать" последовательность на начало записи или на указанное время проигрывания — методами setMicrosecondPositionflong mcs) или setTickPosition(long tick).