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");
}
}
}
Vous pouvez utiliser un LineListener . Alors, inscrivez -vous et écoutez LineEvent.Type.CLOSE .
Soit dit en passant, vous pourriez faire mieux utiliser SourceDataLine
que 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 SourceDataLine
commencera à 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.sampled
se méfient de l' utilisation , SourceDataLine
mais il est vraiment pas beaucoup plus difficiles à coder qu'un Clip
, et l'utilisation que vous montrez, il serait un meilleur ajustement.