Socket Audio Clip loopen ohne neuen Thread

Diskutiere Audio Clip loopen ohne neuen Thread im Netzwerkprogrammierung Bereich.
V

ViToxC

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

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

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();
                        }
 
Thema: 

Audio Clip loopen ohne neuen Thread

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben