Sounds effektiv abspielen

Hallo,

Ich hab mal wieder ein Problem an dem ich hacke :wink:
Ich bin dabei ein Computerspiel zu schreiben, mittlerweile lÀuft auch fast alles und auch Sounds lassen sich eigentlich abspielen.
Allerdings nur wenn sie sehr selten und nicht sonderlich oft abgespielt werden.
Nun ist es in einem Spiel nicht zu verhindern, das auch mal zwei Sounds gleichzeitig abgespielt werden mĂŒssten, sozusagen ĂŒbereinander gelagert zu hören sein sollen.
Das funktioniert so wie ich es mache, ĂŒberhaupt nicht:


import java.io.File;
import java.io.IOException;
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;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class Sound_Player {
    public void playSound(final File file) {
        Thread soundPlayThread = new Thread(new Runnable() {
            @Override
            public void run() {
                AudioInputStream stream = null;

                try {
                    stream = AudioSystem.getAudioInputStream(file);
                    AudioFormat format = stream.getFormat();
                    DataLine.Info info = new DataLine.Info(Clip.class, format);
                    Clip clip = (Clip) AudioSystem.getLine(info);
                    clip.open(AudioSystem.getAudioInputStream(file));
                    clip.start();
                    while (clip.getFramePosition()<clip.getFrameLength()) {
                        Thread.sleep(33);
                    }
                    clip.stop();
                    clip.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                } catch (LineUnavailableException ex) {
                    ex.printStackTrace();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                } catch (UnsupportedAudioFileException ex) {
                    ex.printStackTrace();
                } finally {
                    try {
                        stream.close();
                    } catch (IOException ex) {
                    ex.printStackTrace();
                    } catch (NullPointerException ex) {
                    ex.printStackTrace();
                    }
                }
            }
        });
        soundPlayThread.start();
    }
}```

Wie spielt ihr Sounds ab?

Sry das ich keine konstruktive antwort geben kann, aber ich hatte das problem auch mal. Ich habe es bis heute nicht gelöst.
irgendwie scheint es das es keine möglichkeit gibt die selbe datei zweimal zu benutzen

Wenn einer die antwort weiss, viele tausend programmier-anfÀnger wÀren dankbar; garantiert! :slight_smile:

Ich habe zwar noch nicht so viel mit Sounds gearbeitet aber es mĂŒsste doch möglich sein alle Sounds einmal zu “laden” (zb. in einer HashMap sichern) und danach abzuspielen? Damit sollte man dann auch den gleichen Sound mehrmals in der selben Zeit abspielen können.

Du könntest doch zum Beispiel damit die AudioClips erstellen:
AudiodClip clip = Applet.newAudioClip(url)
und sie dann zusammen mit entweder einem Enum (Name des Sounds) oder einem einfachen String in eine HashMap setzen.

SpÀter musst du einfach folgenden Code verwenden:

AudioClip audio = hashmap.get(name);
		audio.play();```

und schon funktioniert es :)

Vergesst den AudioClip und auch “javax.sound.sampled.Clip”. Da wird fĂŒr jeden Clip ein eigener Thread gestartet. Am besten ists, man beschĂ€ftigt sich erstmal mit der Sound-API soweit, dass einzelne AudioStreams ĂŒber eine SourceDataLine ausgeben kann. Anschliessend kann man sich daran versuchen Streams gleicher Formate zu mischen. Dann kann man sich einen Player basteln, der stĂ€ndig lĂ€uft und zwar in nur einem einzigen Thread. Dann kann man sich noch an einem Player versuchen, der auch mit verschiedenen Formaten umgehen kann (evtl. per FormatConversionProvider) und ganz zum Schluss realisiert man diesen Player in JOAL, LWJGL oder einer beliebigen anderen 3DSoundAPI sofern bekannt. Trivial ist anspruchsvoller Sound in Java aber leider nicht.
Das Ding mit den Clips ist zwar recht einfach, hat aber auf Dauer den Nachteil, dass unschöne KlickgerÀusche nicht ausbleiben.

Hast du sowas schonmal gemacht? Wenn ja wÀren

wenn du den Code posten könntest :slight_smile:

[QUOTE=IDC]Hast du sowas schonmal gemacht? Wenn ja wÀren

wenn du den Code posten könntest :)[/QUOTE]In der Theorie ja (Experimente zĂ€hlen nicht ;)). Ich glaub’ ich werde darĂŒber mal 'nen Blog verfassen. Dauert ein wenig.

:wink:
Danke ich glaube mymaksimus hat recht!

@Spacerat : und was macht man, wenn man so wie ich ist und möglichst auf fremde bibliotheken verzichtet? Kann ja nicht sein das java dafĂŒr keine andere möglichkeit bietet.

[QUOTE=mymaksimus]@Spacerat : und was macht man, wenn man so wie ich ist und möglichst auf fremde bibliotheken verzichtet? Kann ja nicht sein das java dafĂŒr keine andere möglichkeit bietet.[/QUOTE]Also wenn du bei maximal Stereo bleiben willst, kannst du bei der Standard-Sound-API bleiben. JOAL oder LWJGL braucht man nur fĂŒr MultiChannel (Dolby5.1 usw). Ich nehme mal an, dass sich an der alten Sound-API auch nicht mehr allzuviel Ă€ndern wird, zumal JavaFX afaik auch MultiChannel unterstĂŒtzt und seit kurzem auch zum Java-Standard gehört.

okay.
nur mal so eine frage:
sind solche libraries


[ul]
[li]native?
[/li][li]oder eine arbeit von mehreren jahren sodass mans kaum alleine schafft?
[/li][li]oder auch ganz normales java?
[/li][li]oder sons irgendwas?
[/li][/ul]

Also bei Sound-APIs muss man eigentlich schon davon ausgehen, dass sie stets einen nativen Kern haben, weil ja irgendwie auf die Soundhardware zugegriffen werden muss. Wie lange man an der Entwicklung einer eigenen API hĂ€ngt, kann ich nicht sagen, weil ich da immer nur auf Vorhandenes zurĂŒckgreife (was auch ratsam ist), kann mir aber vorstellen, dass es recht aufwĂ€ndig sein muss.