按顺序播放音频剪辑

时间:2013-11-16 13:48:20

标签: java arrays audio listener clip

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

由于

0 个答案:

没有答案