Выполнить действие после завершения звука - PullRequest
1 голос
/ 31 декабря 2011

Я могу воспроизводить звуки в своем приложении Java Swing прямо сейчас, используя JavaSound и код из Java play WAV sound file .В данный момент я хочу:

воспроизвести звук;после того, как звук закончен, я хочу воспроизвести другой звук (который является действием).Так что в основном пошагово:

  1. Воспроизведение звука.(Я знаю, сколько времени занимает этот звук - 4 секунды).
  2. После окончания звука.
  3. Выполнение действия (например, воспроизведение другого звука).

Я пыталсянесколько вариантов, задержки, темы, но не могли понять.

Ответы [ 2 ]

4 голосов
/ 31 декабря 2011

В вашем примере объект DataLine используется для воспроизведения звука. У объекта DataLine есть вызов метода addLineListener, который принимает объект, реализующий интерфейс LineListener, и предоставляет такие события, как start и stop, которые можно использовать для выполнения действия или воспроизведения другого звука.

Что вам нужно сделать, это:

  1. Реализация интерфейса LineListener в вашем классе
  2. Подписаться на событие обновления, вызвав метод addLineListener с this Аргумент
  3. Реализация метода update интерфейса LineListener
  4. Проверьте событие в методе update и укажите требуемое действие

Вот ссылка , которая демонстрирует обработку LineListener событий в методе update.

2 голосов
/ 31 декабря 2011

В качестве альтернативы хорошему решению Abbas я могу предложить периодически проверять, жив ли поток, который вы используете для воспроизведения файла.

Глядя на предоставленное вами руководство, основная программа создает новый экземпляр класса потока и использует метод start() для запуска потока. Таким образом, вы можете проверить, жив ли поток. Когда нить мертва, вы можете делать, что хотите. Например:

    AePlayWave apw = new AePlayWave("test.wav");
    apw.start();

    try{
        boolean alive = apw.isAlive();
        while(alive){
            //check periodically if the thread is alive         
            alive = apw.isAlive();
            Thread.currentThread().sleep(500);

            }

    }

    catch(InterruptedException e){
        System.out.println("Interrupted");
        e.printStackTrace();
    }

//do other action..

Когда поток apw мертв (тогда логическое значение alive ложно), и программа выходит из цикла while, вы можете выполнить то, что вы хотите.

...