AudioClip hängt Programm auf

  • Themenstarter Themenstarter qwert_zuiopü
  • Beginndatum Beginndatum
Q

qwert_zuiopü

Gast
Hallo,

ich möchte in meinem Programm regelmäßig Sound ausgeben. Dazu verwende ich den AudioClip mit play() und stop(); Nach einigem Abspielen hängt allerdings das gesamte Programm und auch der Sound. Komischerweise passiert das nur mit einem meiner beiden PCs. Der AudioClip läuft übrigens in einem eigenen Thread.
An was könnte das liegen, bzw. wie kann ich das beheben?

Vielen Dank!
 
Ich hab mich geirrt, läuft doch nicht in einem eigenen Thread. Hier mal der Code, der nichts besonderes enthält:
Java:
class Soundausgabe extends JFrame {
     AudioClip soundFile1; 
     AudioClip soundFile2;

     public Soundausgabe()  
     {
         soundFile1 = Applet.newAudioClip(getClass().getResource("richtig.wav"));
         soundFile2 = Applet.newAudioClip(getClass().getResource("falsch.wav"));
     }
     public void playRichtig() {
         soundFile1.play();
     }
     public void playFalsch() {
         soundFile2.play();
     }
}
 
Soweit ich weiß, sorgt AudioClip.play() immer für 'nen eigenen Thread. Da du aber anscheinend mit Threads arbeitest und es auf einem (vllt einem Mehrkerner?) passiert und auf einem anderen nicht, klingt ein Threadingfehler mit Deadlock oder irgendwelchen zu Fehlern führenden Raceconditions wahrscheinlich.
 
So, ich komme einfach nicht drauf, deswegen hier mal ein kleines Programm, das sich bei mir aufhängt:
Java:
package audiotest;

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.applet.*; 

public class AudioTest extends JFrame {
    int breite = 600;
    int hoehe = 700;

    public AudioTest(File f) {
        setSize(breite, hoehe);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }  
    public static void main(String[] args) {
        new Hauptfenster();
    }
}

class Hauptfenster extends JFrame implements ActionListener {
    JButton start = new JButton("Start");
    public Hauptfenster() {
        setSize(300, 300);
        setLocation(600, 100);
        setLayout(new GridLayout(1, 1));
        start.addActionListener(this);
        add(start);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == start) {
            new Methode();
        }
    }
}

class Methode extends JFrame implements Runnable {
    File file;
    AudioTest sm;
    boolean change = false;
    boolean flag = false;
    AudioClip richtig,falsch;
    public Methode() {
        richtig = Applet.newAudioClip(getClass().getResource("richtig.wav"));
        falsch = Applet.newAudioClip(getClass().getResource("falsch.wav"));
        file = ladeDatei();
        sm = new AudioTest(file);
        Thread th=new Thread(this);
        th.start();
    }
    public void run() {
        while(true) {
            boolean check;
            Random rand = new Random();
            int a=rand.nextInt(2);
            if(a==1) check = true;
            else check = false;
            if(check) {
                if(!flag) {
                    change = true;
                    flag = true;
                }
            }
            else {
                if(flag) {
                    change = true;
                    flag = false;
                }
            }
            System.out.println("läuft");
            if(change) {
                if(flag) {
                    falsch.play();
                }
                else {
                    richtig.play();
                }
                change = false;
            }
            try{Thread.sleep(200);}catch(InterruptedException err){System.out.println(err.toString());}
            System.out.print(" ----->  Methode läuft noch.. <-----");
        }
    }
     public File ladeDatei() {
        JFileChooser jfc = new JFileChooser();
        int returnVal = jfc.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = jfc.getSelectedFile();
            return file;
        }
        return null;
    }   
}

So, hab versucht, das Programm so klein wie möglich zu halten 🙂.

Läuft das bei euch? Und warum bei mir nicht?

Danke!!
 
So, hab das Beispiel nochmal drastisch gekürzt.

Java:
import java.applet.*; 

public class AudioTest {
    public static void main(String[] args) {
        new Methode();
    }
}

class Methode implements Runnable {
    AudioClip richtig,falsch;
    public Methode() {
        richtig = Applet.newAudioClip(getClass().getResource("richtig.wav"));
        falsch = Applet.newAudioClip(getClass().getResource("falsch.wav"));
        Thread th=new Thread(this);
        th.start();
    }
    public void run() {
        while(true) {
            System.out.println("läuft");
                    falsch.play();
            try{Thread.sleep(1000);}catch(InterruptedException err){System.out.println(err.toString());}
                    richtig.play();
            try{Thread.sleep(1000);}catch(InterruptedException err){System.out.println(err.toString());}
        }
    }
}

Ich erhalte als Ausgabe manchmal "läuft" und manchmal "läuft \n läuft".
 
Ich möchte noch anmerken, dass der Code auf einem meiner beiden PC's funktioniert, nur auf meinem Laptop nicht.

Hat wirklich niemand eine Idee?
 
Ja, hier geht's, aber ab und zu werden Sounds "verschluckt". Das ist aber ein Effekt, den ich in ähnlicher Form schon gelegentlich beobachtet habe. Warum es bei dem Laptop gar nicht geht, bzw. sich aufhängt, ist schwer zu sagen. Ich weiß nur, dass bei so einem lapidaren "audioclip.play()" unglaublich viel "unter der Haube" passiert ... also kann auch viel schiefgehen... Irgendeine Treibersache KÖNNTE die Ursache sein, aber das ist hier eher unwahrscheinlich...
 

Zurück
Oben