Socket Audio Clip loopen ohne neuen Thread

V

ViToxC

Mitglied
Hallo, ich habe folgendes Problem:

Mein Client sendet meinen Mikrofon Input als byte array im while loop an meinen Server. Dieser konvertiert dann das byte array zu einem javax.sound.sampled.Clip und spielt es sofort wieder ab.

Das funktioniert auch im Prinizp, allerdings muss ich nach jeder Iteration clip = AudioSystem.getClip(); benutzen. Dies erzeugt allerdings jedes mal einen neuen Thread, weshalb es nicht lange dauern wird, bis mein Programm keinen Speicher mehr zu Verfügung hat und abstürzen wird.

Wenn ich clip = AudioSystem.getClip(); außerhalb der while Schleife packen würde, würde es wiederum nach der 1. Iteration folgende Exception geben: java.lang.IllegalStateException: Clip is already open with format PCM_SIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, big-endian and frame lengh of 1600

Ich weiß im Moment leider nicht wirklich, wie ich das umgehen kann.

Hier ist der Code:
Java:
public void playAudio() {
    DataInputStream in ;
    byte[] buffer;
    Clip clip = null;

    while (lastClicked[0] == 0) {
        try {
            in = new DataInputStream(new BufferedInputStream(socket));
            buffer = new byte[3200];
            in.readFully(buffer);

            clip = AudioSystem.getClip();
            clip.open(format, buffer, 0, buffer.length);
            clip.start();
            clip.drain();

        } catch (IOException | LineUnavailableException e) {
            e.printStackTrace();
        }
    }
}

Ich danke euch schon mal im Vorraus:)
 
L

LimDul

Top Contributor
Clip ist eine Resource die man am Ende wie jede IO-Resource - soweit ich die Doku verstehe - wieder mit Close schließen muss.

Eigentlich müsste da ein try with resources drum rum meines Erachtens
 
V

ViToxC

Mitglied
Clip ist eine Resource die man am Ende wie jede IO-Resource - soweit ich die Doku verstehe - wieder mit Close schließen muss.

Eigentlich müsste da ein try with resources drum rum meines Erachtens
Hi, ja das habe ich auch schon ausprobiert. Das schließt dann zwar den Thread immer, allerdings höre ich dann überhaupt keinen Ton mehr. Hätte das einfach so umgesetzt:

Java:
try {
                            in = new DataInputStream(new BufferedInputStream(table.getSelectionModel().getSelectedItem().getSocket().getInputStream()));
                            buffer = new byte[3200];
                            in.readFully(buffer);

                            clip = AudioSystem.getClip();
                            clip.open(format, buffer, 0, buffer.length);
                            clip.start();
                            clip.drain();

                        } finally {
                            clip.close();
                        }
 

Ähnliche Java Themen


Oben