Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Bin nun schon seit langem am gleichen Problem und komme einfach nicht weiter.
Habe einen Threat in dem eine Audio-Datei abgespielt wird. Den will ich per Knopfdruck stoppen. Habe meine Vorgehensweise mal in ein anderes Beispiel übertragen, in dem der Threat problemlos stoppt, nicht aber in meinem Programm - woran könnte das denn liegen?
Code:
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == btPlay) {
// es wird abgespielt
if (audioFile != null) {
if (play == true) {
System.out.println(t.isAlive());
t.start();
System.out.println("jetzt müsste die musik starten");
btPlay.setIcon(PauseIcon);
play = false;
} else {
// Pause...
if (play == false) {
try {
t.wait(1000);
System.out.println("alive:" + t.isAlive());
} catch (Exception x) {
}
btPlay.setIcon(StartIcon);
play = true;
}
}
} else {
// Ausgabe eines Fehlers:
}
}
if (source == btStop) {
// es wird gestoppt
t.stopThread();
}
}
class MyThread extends Thread {
private volatile boolean isRunning = true;
public void run() {
while(isRunning){
play();
try {
Thread.sleep(500);
}
catch(InterruptedException ie){
interrupt();
}
if ( isInterrupted() )
break;
}
}
public void stopThread()
{
this.isRunning = false;
t.interrupt();
}
}
MyThread t = new MyThread();
..Habe einen Threat in dem eine Audio-Datei abgespielt wird. Den will ich per Knopfdruck stoppen.
Habe meine Vorgehensweise mal in ein anderes Beispiel übertragen, in dem der Threat problemlos stoppt,
nicht aber in meinem Programm - woran könnte das denn liegen?
das ist die audio-player funktion die in der public void run() gestartet wird
Code:
private void play() {
try {
// create a stream from the file
AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(audioFile);
// ************************* PLAY AUSDIOSTREAM
// ***************************************
AudioFormat audioFormat = audioInputStream.getFormat();
System.out.println("audioFormat: " + audioFormat);
DataLine.Info info = new DataLine.Info(SourceDataLine.class,
audioFormat);
//
if (!AudioSystem.isLineSupported(info)) {
System.out
.println("Das Format wird nicht unterstützt: " + info);
return;
}
// Jetzt wird abgespielt
try {
SourceDataLine dataLine = (SourceDataLine) AudioSystem
.getLine(info);
dataLine.open(audioFormat);
// Allows the line to move data in and out
// to a port
dataLine.start();
// Create a buffer for moving data from the
// audio stream to the line
int bufferSize = (int) audioFormat.getSampleRate()
* audioFormat.getFrameSize();
byte[] buffer = new byte[bufferSize];
// Move the data until done or there is an
// error
try {
int bytesRead = 0;
while (bytesRead >= 0) {
bytesRead = audioInputStream.read(buffer, 0,
buffer.length);
if (bytesRead >= 0)
dataLine.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
// Continues data line I/O until its buffer drained
dataLine.drain();
// Closes the data line, freeing any resources such
// as the audio device
dataLine.close();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
} catch (Exception e) {
System.err.println("Problem beim Wiedergeben der Datei "
+ audioFile.getAbsolutePath());
e.printStackTrace();
}
} // end-play()
Ich würde sagen mit dataLine.stop() müsste es gehen
(zusätzlich zum stop von deinem eigenen Thread).
Um deinen Thread neu zu starten musst du ihn
zuerst neu instanziieren.
// Move the data until done or there is an
// error
try {
int bytesRead = 0;
while (bytesRead >= 0) {
bytesRead = audioInputStream.read(buffer, 0,
buffer.length);
if (bytesRead >= 0)
dataLine.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
eine abbruchbedingung mit dataLine.stop() einfügen, oder?
weiß aber nicht so genau wie - hab nun schon einige varianten ausprobiert, kriege das lied aber einfach nicht zum stoppen
ich korrigiere mich - es klappt doch...
hast du denn vielleicht auch einen tipp, wie ich den stream auf "pause setzen" kann, wie bei einem normalen audioplayer?