Последовательное воспроизведение аудиоклипов
Hy, я хочу воспроизвести строку чисел в качестве звуковой дорожки в Java-приложении. Я получил аудио треки для всех номеров (0-9). Вход представляет собой массив строк. Каждая строка содержит 1 номер. Я использую Hashmap для сопоставления каждой строки с аудиоклипом. Все входные строки ссылаются на действительный аудиофайл. Проблема не касается поиска правильных путей. Моя проблема заключается в том, чтобы играть в них один за другим.
Я использую рекурсивную функцию для этого (см. Код ниже). ClipEndListener имеет очень простую реализацию функции обновления и начнет следующую часть после завершения предыдущей части.
import java.util.HashMap;
import java.util.Map;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineEvent.Type;
import javax.sound.sampled.LineListener;
public class AuditivePlayer {
public static final Map<String, AudioInputStream> MULT_SAMPLES = new HashMap<String, AudioInputStream>();
static {
try {
MULT_SAMPLES.put("0", AudioSystem.getAudioInputStream(Cloud.class.getResource("/sounds/0.wav")));
MULT_SAMPLES.put("1", AudioSystem.getAudioInputStream(Cloud.class.getResource("/sounds/1.wav")));
MULT_SAMPLES.put("2", AudioSystem.getAudioInputStream(Cloud.class.getResource("/sounds/2.wav")));
/* ... */
} catch(Exception e) {
/* catching exception */
}
}
private String[] parts;
private int index;
private Clip currentClip;
public void playArray(String[] parts) {
index = 0;
this.parts = parts;
playPart();
}
private void playPart() {
if (index == parts.length)
return;
try {
currentClip = AudioSystem.getClip();
currentClip.open(MULT_SAMPLES.get(parts[index]));
System.out.println("playing part: " + index + " ("+ parts[index] +").");
index++;
currentClip.addLineListener(new ClipEndListener());
currentClip.start();
} catch (Exception ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
}
}
private class ClipEndListener implements LineListener {
@Override
public void update(LineEvent event) {
if (event.getType() == Type.STOP)
playPart();
}
}
}
Мне кажется, это нормально, и это работает для первого массива строк. К сожалению, при получении новых массивов строк (playArray вызывается во второй раз), он проигрывает только одну или две части, а не весь массив. Любые предложения, почему это может быть?
Спасибо