# bei abspielen der wav datei fehler



## Nao88 (3. Sep 2009)

sooo ich schaffe es nicht die sound datei (wav) ganz abzupielen.
nach einer weile knistert der sound und danach wierd eine fehla meldung ausgegeben

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Unknown Source)
at com.sun.media.sound.DirectAudioDevice$DirectClip.open(Unknown Source)
at com.sun.media.sound.DirectAudioDevice$DirectClip.open(Unknown Source)
at Soundspielen.<init>(Soundspielen.java:17)
at Hauptklasse.main(Hauptklasse.java:5)

```
import javax.sound.sampled.*;
import java.io.*;
 
public class Soundspielen {
    
    public Soundspielen() {
         try{
             AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:/alert.wav"));
             AudioFormat af= audioInputStream.getFormat();
             int size= (int) (af.getFrameSize() * audioInputStream.getFrameLength());
             byte[] audio= new byte[size];
             DataLine.Info info= new DataLine.Info(Clip.class, af, size);
             audioInputStream.read(audio, 0, size);
             
             for(int i=0; i < 4000; i++) {
                 Clip clip = (Clip) AudioSystem.getLine(info);
                 clip.open(af, audio, 0, size);
                 clip.start();
             }
         }catch(Exception e){ e.printStackTrace(); }
         
     }
    
    }
```

nachtrag ;
das ein fehler ausgegeben wird liegt an der hohen durchlaufzahl der for schliefe 
aber wenn ich nicht habe dan komm nur ein sehr kurzer ton und mehr nicht von unfefähr 30 sek


----------



## Nao88 (4. Sep 2009)

```
import javax.sound.sampled.*;
import java.io.*;
 
public class Soundspielen {
    
    public Soundspielen() {
         try{
             AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("C:/alert.wav"));
             AudioFormat af= audioInputStream.getFormat();
             int size= (int) (af.getFrameSize() * audioInputStream.getFrameLength());
             byte[] audio= new byte[size];
             DataLine.Info info= new DataLine.Info(Clip.class, af, size);
             audioInputStream.read(audio, 0, size);
             
            
                 Clip clip = (Clip) AudioSystem.getLine(info);
                 clip.open(af, audio, 0, size);
                 clip.start();
             
         }catch(Exception e){ e.printStackTrace(); }
         
     }
    
    }
```
wenn ich die for schleife entferne dann wird sie nur eine milli sekunde angespielt (deswegen war auch die for schleife da) ich das ein buffed reader fehlt aber ich weiß nicht genau wo


----------



## Steev (4. Sep 2009)

Irgendwie machst du dir das meiner Meinung nach ein bisschen zu schwer mit dem Abspielen der Sounds.

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.8 Musik abspielen

Dein Ansatz wird dann interessant wenn man mehr mit dem Sound machen will, als ihn nur abzuspielen...


----------



## Nao88 (5. Sep 2009)

jaaa das ist aber ein applet und das andere spielt mid datein ab also leider nicht zu gebrauchen
und ich will den fehler berichtigt haben denn ich stehe da gerade vor einer wand


----------



## Steev (5. Sep 2009)

Diese Variante funktioniert nicht nur in Applets sondern generell.

Hier mal eine Variante, die (bei mir) funktioniert.

[Java]import java.io.*;
import javax.sound.sampled.*;

public class AudioPlayer
{
    private static void playSampleFile(String name, float pan, float gain) throws Exception
    {
        // AudioInputStream öffnen
        AudioInputStream ais = AudioSystem.getAudioInputStream(new File(name));
        AudioFormat format = ais.getFormat();

        // ALAW/ULAW samples in PCM konvertieren
        if ((format.getEncoding() == AudioFormat.Encoding.ULAW) ||
            (format.getEncoding() == AudioFormat.Encoding.ALAW))
        {
            AudioFormat tmp = new AudioFormat(
                    AudioFormat.Encoding.PCM_SIGNED,
                    format.getSampleRate(),
                    format.getSampleSizeInBits() * 2,
                    format.getChannels(),
                    format.getFrameSize() * 2,
                    format.getFrameRate(),
                    true
            );
            ais = AudioSystem.getAudioInputStream(tmp, ais);
            format = tmp;
        }

        // Clip erzeugen und öffnen
        DataLine.Info info = new DataLine.Info(
                Clip.class,
                format,
                ((int) ais.getFrameLength() * format.getFrameSize())
        );
        Clip clip = (Clip)AudioSystem.getLine(info); 
        clip.open(ais);

        // PAN einstellen
        FloatControl panControl = (FloatControl)clip.getControl(
                FloatControl.Type.PAN
        );
        panControl.setValue(pan);

        // MASTER_GAIN einstellen
        FloatControl gainControl = (FloatControl)clip.getControl(
                FloatControl.Type.MASTER_GAIN
        );
        gainControl.setValue(gain);

        // Clip abspielen
        clip.start(); 
        while (true) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                // nothing
            }
            if (!clip.isRunning()) {
                break;
            }
        }
        clip.stop();
        clip.close();
    }

    public static void main(String[] args)
    {
        try {
            playSampleFile(
                    args[0],
                    Float.parseFloat(args[1]),
                    Float.parseFloat(args[2])
            );
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
        System.exit(0);
    }
}[/Java]

Ich hoffe dir hilft dieses Beispiel weiter.

Der Fehler bei dir kommt, weil du in deiner Schleife pro Durchlauf ein neues Objekt + Thread erstellst.


----------



## Nao88 (5. Sep 2009)

wie kann ich ihn den beheben ??? besser wie schffe ich es das er einen song apspielt


----------



## Steev (6. Sep 2009)

Du schaffst es einen Sound abzuspielen indem du entweder die Variante aus der Insel oder die Methode die ich gepostet habe verwendest.

Deine Methode würde funktionieren, wenn du folgende Änderungen vornimmst:

[Java]import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;

public class Soundspielen {
    public Soundspielen(File audiofile) {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audiofile);
            AudioFormat af = audioInputStream.getFormat();
            int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
            byte[] audio = new byte[size];
            DataLine.Info info = new DataLine.Info(Clip.class, af, size);
            audioInputStream.read(audio, 0, size);

            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);

            // Clip abspielen
            clip.start();

            // Warten bis der Clip beendet wurde
            while (true) {
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                    // nothing
                }
                if (!clip.isRunning()) {
                    break;
                }
            }
            clip.stop();
            clip.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        File audiofile = new File("C:\\alert.wav");
        new Soundspielen(audiofile);
    }
}[/Java]

Ich würde für das Abspielen von Sounds allerdings eine evtl. statische Methode nehmen und nicht für das Abspielen eines Sounds ein neues Objekt erzeugen.


----------

