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?