Java AudioSystem предотвращает повторение l oop до окончания песни - PullRequest
0 голосов
/ 26 марта 2020

У меня есть программа, которая спросит пользователя, какие песни он хочет воспроизвести, из списка доступных песен, и после того, как пользователь выберет одну из них, когда песня завершит свою работу, он спросит пользователя, какую песню он хочет воспроизвести снова. У меня вопрос: как я могу запретить l oop спрашивать пользователя, какую песню он хочет воспроизвести, пока не закончится выбранная песня, чтобы они не повторялись?

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

1 Ответ

1 голос
/ 26 марта 2020

Вы можете использовать LineListener . Затем зарегистрируйтесь и прослушайте LineEvent.Type.CLOSE .

Кстати, вам лучше использовать SourceDataLine, чем Clip. Возможно, это не имеет большого значения, но, учитывая то, что вы написали, может быть слышимая задержка, в зависимости от размера файла, каждый раз, когда вы открываете клип и загружаете весь файл в память (это должно быть выполнено до того, как воспроизведение сможет Начните). SourceDataLine начнет воспроизведение почти сразу (загружает только один буфер перед началом воспроизведения) и использует только один буфер памяти вместо всего звукового файла.

Многие люди, впервые знакомые с javax.sound.sampled опасаются использовать SourceDataLine, но на самом деле это не намного сложнее, чем код Clip, и для использования, которое вы демонстрируете, это было бы лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...