0 Daumen
708 Aufrufe

package system.sound;

import system.start.ui.startPage;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;

public class Sound {

    private static Clip clip;

    public static synchronized void play(String address, int time) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                    try {
                        clip = AudioSystem.getClip();
                        AudioInputStream inputStream = AudioSystem.getAudioInputStream(startPage.class.getResource(address));
                        clip.open(inputStream);
                        clip.start();
                        Thread.sleep(time);
                        clip.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
        }).start();
    }

    public static synchronized void stop() {
        clip.close();
    }
}

Ich habe ein kleines Java Programm in dem ich Lieder draus abspielen kann. Jetzt möchte ich aber an bestimmten Stellen im Programm das Lied ändern; wie kann ich das derzeit laufende Lied stoppen um ein neues abspielen zu können?

Vielen Dank für eure Hilfe, LiveNorm

Avatar von

1 Antwort

+1 Daumen
 
Beste Antwort

Ich würde hier mit einem AudioPlayer arbeiten, der den von Dir erzeugen AudioStream als Parameter erhält. Darauf kannst Du dann die Methoden play und stop aufrufen. Siehe dazu auch hier: https://courses.cs.washington.edu/courses/cse14x/info/javadocs/io/uwcse/io/AudioPlayer.html

In Deiner derzeitigen Lösung hast Du eine synchronized-Methode, die den Audiostrom schließt. Du müsstest dann jedesmal einen neuen öffnen. Erzeuge Dir einfach mehrere AudioPlayer mit unterschiedlichen Sounds. Bei Bedarf kannst Du diese dann von Deinem Hauptprogramm aus ansteuern.

Avatar von

Gibts den AudioPlayer als API? In der JDK-Version 10 von Java ist der AudioPlayer nämlich leider kein Bestandteil mehr.

Gibts den AudioPlayer als API?

Das ist mir leider nicht bekannt.

AudioPlayer nämlich leider kein Bestandteil mehr.

Wird angezeigt, dass er deprecated ist?

Notfalls kannst Du mit mehreren Streams arbeiten ... sollte close die Ressource nicht freigeben, müsstest Du ggf. den Garbage Collector manuell aufrufen.

Wird gezeigt, dass er deprecated ist? 

Nein, wird es nicht. Die Klasse scheint nicht mehr enthalten zu sein, zumindest kann ich nichts importieren. Ich könnte allerhöchstens diese Klasse selber erstellen. Ich hab mein Problem jetzt folgendermaßen gelöst (für mein Programm reicht diese Umsetzung auch wenn es durchaus sein kann, dass man das noch schöner machen kann):

package system.sound;

import system.start.ui.startPage;

import javax.sound.sampled.*;
import javax.sound.sampled.LineEvent.Type;

public class Sound implements LineListener {

    private Clip clip;
    private Line line;

    public Sound(String adress, int time) {
        play(adress);
    }

    public void play(String address) {
        try {
            Line.Info linfo = new Line.Info(Clip.class);
            line = null;
            line = AudioSystem.getLine(linfo);
            clip = (Clip) line;
            clip.addLineListener(this);
            AudioInputStream inputStream = null;
            inputStream = AudioSystem.getAudioInputStream(startPage.class.getResource(address));
            clip.open(inputStream);
            clip.start();
        } catch (Exception e) {}
    }

    @Override
    public void update(LineEvent le) {
        Type type = le.getType();
        if (type == Type.OPEN) {
            System.out.println("OPEN");
        } else if (type == Type.CLOSE) {
            System.out.println("CLOSE");
            clip.close();
        } else if (type == Type.START) {
            System.out.println("START");
        } else if (type == Type.STOP) {
            System.out.println("STOP");
            clip.close();
        }
    }

    public void stopSound() {
        clip.close();
    }
}

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community