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)时,它只播放一个或两个部分,而不是整个数组。 有什么建议可以吗?
由于