Java AudioSystem prevenir bucle de repetir antes de acabados de canciones

warherolion:

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");
    }
}
}
Phil Freihofner:

Puede utilizar un LineListener . A continuación, registrar y escuchar LineEvent.Type.CLOSE .

Por cierto, es posible hacer mejor uso SourceDataLinede 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 SourceDataLinecomenzará 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.sampledse resisten a usar SourceDataLinepero 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=364878&siteId=1
Recomendado
Clasificación