как использовать javax.sound.sampled.LineListener? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть программа, которая спросит пользователя, какие песни он хочет воспроизвести, из списка доступных песен, и после того, как пользователь выберет одну из них, когда песня завершит свою работу, он спросит пользователя, какую песню он хочет воспроизвести снова. Мне сказали использовать для этого прослушиватель строк, но я не могу понять, как это сделать даже после использования oracle документов

моего кода

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 Ответ

2 голосов
/ 04 апреля 2020

По сути, одну вещь, которую вам нужно изменить, это заменить это:

for (int playlistLength = 0; playlistLength < pathnames.length; playlistLength++){

на что-то вроде:

while (true) {
    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]);
}

Вы можете добавить некоторые логики c, чтобы сломать л oop.

Кроме того, я бы рекомендовал немного изменить PlaySound метод:

    public static void PlaySound(File sound, String FileName) {
        try (final AudioInputStream in = getAudioInputStream(sound)) {

            final AudioFormat outFormat = getOutFormat(in.getFormat());
            Info info = new Info(SourceDataLine.class, outFormat);

            try (final SourceDataLine line =
                         (SourceDataLine) AudioSystem.getLine(info)) {

                if (line != null) {
                    line.open(outFormat);
                    line.start();
                    System.out.println("Now Playing " + FileName);
                    stream(getAudioInputStream(outFormat, in), line);
                    line.drain();
                    line.stop();
                }
            }

        } catch (UnsupportedAudioFileException
                | LineUnavailableException
                | IOException e) {
            System.err.println("Error playing music\n" + e.getMessage());
        }
    }

    private static AudioFormat getOutFormat(AudioFormat inFormat) {
        final int ch = inFormat.getChannels();
        final float rate = inFormat.getSampleRate();
        return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
    }

    private static void stream(AudioInputStream in, SourceDataLine line)
            throws IOException {
        final byte[] buffer = new byte[4096];
        for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {
            line.write(buffer, 0, n);
        }
    }

Он должен воспроизводить MP3, потому что вы можете столкнуться с такой проблемой: Неизвестный размер кадра .

Чтобы добавить поддержку чтения MP3 в Java Sound, добавьте mp3plugin.jar JMF в путь к классам приложения. https://www.oracle.com/technetwork/java/javase/download-137625.html

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