Java AudioSystem éviter des boucles de répétition avant fin de la chanson

warherolion:

J'ai un programme qui demandera à l'utilisateur quelles chansons ils veulent jouer sur une liste de chansons disponibles et après celui de l'utilisateur une fois la fin de la chanson, il demande à l'utilisateur quelle chanson ils veulent jouer à nouveau. Ma question est comment empêcher la boucle de demander à l'utilisateur quelle chanson ils veulent jouer jusqu'à ce que le morceau sélectionné est terminé afin qu'ils ne répètent pas?

public class Main {
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String[] pathnames;
    File MusicFileChosen;
    String musicDir;
    boolean songComplete = false;

    pathnames = ProgramMap.musicDir.list();

    // Print the names of files and directories
    for (int ListNum = 0; ListNum < pathnames.length; ListNum++) {
        System.out.println(ListNum + 1 + ". " + pathnames[ListNum]);
    }


   for (int playlistLength = 0; playlistLength < pathnames.length; playlistLength++){
        if (!songComplete) {
            System.out.println("Which Song would you like to play?");
            int musicChoice = input.nextInt();
            musicDir = ProgramMap.userDir + "\\src\\Music\\" + pathnames[musicChoice - 1];
            MusicFileChosen = new File(musicDir);
            PlaySound(MusicFileChosen, pathnames[musicChoice - 1]);

        }
    }
}
public static void PlaySound(File sound, String FileName){
    try{
        // Inits the Audio System
        Clip clip = AudioSystem.getClip();

        AudioInputStream AudioInput = AudioSystem.getAudioInputStream(sound);

        //Finds and accesses the clip
        clip.open(AudioInput);

        //Starts the clip
        clip.start();

        System.out.println("Now Playing " + FileName);

        clip.drain();


    }catch (Exception e){
        System.out.println("Error playing music");
    }
}
}
Phil Freihofner:

Vous pouvez utiliser un LineListener . Alors, inscrivez -vous et écoutez LineEvent.Type.CLOSE .

Soit dit en passant, vous pourriez faire mieux utiliser SourceDataLineque Clip. Peut - être pas une grosse affaire, mais étant donné ce que vous avez codé, il pourrait y avoir retard audible, en fonction de la taille du fichier, chaque fois que vous ouvrez un clip et chargez le fichier complet dans la mémoire (ce qui doit être complété avant de jouer peut début). Le SourceDataLinecommencera à jouer presque immédiatement (charge uniquement un tampon avant de commencer à jouer) et ne consomme que celui de la mémoire tampon au lieu de l'ensemble du fichier sonore.

Beaucoup de gens qui sont nouveaux pour javax.sound.sampledse méfient de l' utilisation , SourceDataLinemais il est vraiment pas beaucoup plus difficiles à coder qu'un Clip, et l'utilisation que vous montrez, il serait un meilleur ajustement.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=364875&siteId=1
conseillé
Classement