Как я могу заставить свою программу циклически просматривать список файлов wav? - PullRequest
0 голосов
/ 04 апреля 2019

Я наконец-то интегрировал саундтрек в эту игру, которую делаю, но это всего одна песня.Как я мог заставить это циклически пролистывать некоторые песни, чтобы расширить мой саундтрек?

 try{
        AudioInputStream stream;
        AudioFormat format;
        DataLine.Info info;
        Clip clip;

        stream = AudioSystem.getAudioInputStream(new File("Spring.wav"));

        format = stream.getFormat();
        info = new DataLine.Info(Clip.class, format);
        clip = (Clip) AudioSystem.getLine(info);
        clip.open(stream);
                  //plays the song
        clip.start();

                  //keeps the song on repeat
        clip.loop(Clip.LOOP_CONTINUOUSLY);
    }
    catch (Exception e) {

    }

1 Ответ

0 голосов
/ 04 апреля 2019

Ваш код фактически не будет воспроизводить ничего слышимого, потому что поток немедленно закрывается. В моем примере я добавил команду thread.sleep. Следующая проблема: избавьтесь от строки clip.loop, потому что вы этого не хотите. Идея в моей версии этого состоит в том, чтобы разделить игрока на его собственный класс, который будет играть от основного. Таким образом, вы можете сделать так, чтобы экземпляр проигрывателя проигрывал мелодию один раз, а затем переключал ее так, как вам нравится. Я выбрал воспроизведение каждого волнового файла один за другим в примере, но вы можете воспроизводить произвольно или целый массив волновых файлов, если хотите:

Класс:

package scrapAudioClips;

import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

public class AudioPlayer {

public void play(String filename) {
//The filename and time to play are passed into the method.
    try {
        AudioInputStream stream1;
        AudioFormat format = null;
        DataLine.Info info;
        Clip clip;


        stream1 = AudioSystem.getAudioInputStream(new File(filename));


        format = stream1.getFormat();

        info = new DataLine.Info(Clip.class, format);
        clip = (Clip) AudioSystem.getLine(info);
        clip.open(stream1);

//These next two lines will get the length of the wave file for you...
        long frames = stream1.getFrameLength();
        double durationInSeconds = (frames+0.0) / format.getFrameRate();

        // plays the song
        clip.start();

        // clip.loop(Clip.LOOP_CONTINUOUSLY); You don't need this anymore.

        Thread.sleep((long)(durationInSeconds * 1000)); // This allows you to actually hear the audio for the time in seconds..

    } catch (Exception e) {
        System.out.println("File not recognized");
    }
}

}

Main:

package scrapAudioClips;

public class scrapAudio {

public static void main(String[] args) {

    AudioPlayer player = new AudioPlayer();

    //you may play sequentially or in any random order you want with any loop     structure you like...
    player.play("Alesis.wav"); //You just pass the file name in... 
    player.play("wavefile1.wav");//Make your own playlist class as an array...
    player.play("wavefile2.wav");//loop it randomly or in sequence...

}

}

...