Tengo un programa que va a preguntar al usuario qué canciones quieren jugar fuera de una lista de canciones disponibles y después de un usuario selecciona una vez que los acabados de canciones que pregunta al usuario qué canción quieren volver a jugar. Mi pregunta es ¿cómo puedo evitar el bucle de preguntar al usuario qué canción quieren jugar hasta que la canción seleccionada está terminado para que no se repitan?
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");
}
}
}
Puede utilizar un LineListener . A continuación, registrar y escuchar LineEvent.Type.CLOSE .
Por cierto, es posible hacer mejor uso SourceDataLine
de Clip
. Quizás no es un gran problema, pero teniendo en cuenta lo que ha codificado, no puede haber retardo audible, dependiendo del tamaño del archivo, cada vez que abra un clip y cargar el archivo completo en la memoria (esto tiene que ser completado antes de jugar lata comienzo). El SourceDataLine
comenzará a jugar casi inmediatamente (sólo cargas un búfer antes de empezar a jugar) y sólo consume el búfer de memoria en lugar de todo el archivo de sonido.
Una gran cantidad de personas que son nuevas para javax.sound.sampled
se resisten a usar SourceDataLine
pero en realidad no es mucho más difícil que un código Clip
, y para el uso que están mostrando, sería un mejor ajuste.