Последовательное воспроизведение аудиоклипов

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 ответов

Другие вопросы по тегам