# Sound



## 0xdeadbeef (14. Sep 2005)

Habe kürzlich in mein aktuelles Projekt Sound eingebaut. Das tut auch soweit, aber manchmal wird ein Sample nicht wirklich abgespielt.
Hier erstmal der Code.


```
import java.net.URL;
import java.net.URLClassLoader;
import javax.sound.sampled.*;

public class Sound {
	
	public Sound() throws SoundException {
		canPlay = false;
		String fName="";
		soundBuffer = new byte[NUMBER][];
		
		try {
			URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
			for (int i = 0; i<NUMBER; i++) {
				fName = "sound/sound_"+Integer.toString(i)+".wav";
				URL fileLoc = urlLoader.findResource(fName);
				if (fileLoc == null)
					throw new SoundException();
				AudioInputStream f = AudioSystem.getAudioInputStream(fileLoc); 
				format = f.getFormat();
				soundBuffer[i] = new byte[(int)f.getFrameLength()*format.getFrameSize()];
				f.read(soundBuffer[i]);
				f.close();
				
			}
		} catch (Exception ex) {
			throw new SoundException("Error loading sound file "+ fName);
		}
		info = new Line.Info(Clip.class);
	}
	
	public void play(int num) {
		int retryCount = 0;
		while (retryCount < 3) {
			try {
				Clip c = (Clip)AudioSystem.getLine(info);
				c.open(format,soundBuffer[num],0,soundBuffer[num].length);
				if (c.isRunning())
					c.stop();
				c.start();
				retryCount = 100;
			} catch (LineUnavailableException ex) {
				retryCount++;
			}
		}
	}
	
	byte soundBuffer[][];
	AudioFormat format;
	boolean canPlay;
	Line.Info info;
	final static int NUMBER = 24;
```

Also ich habe 24 Samples (sound_0.wav ...  sound_23.wav) in WAV-Format, die ich im Constructor in Byte-Arrays einlese. Beim Abspielen hole ich mir einen Clip über Audiosystem. Die Sache mit dem Retrycount war ein hilfloser Versuch zur Behebung des Problems, ebenso wie die Behandlung "c.isRunning". In der Tat behebt keiner der beiden Workarounds das Problem, daß ab und zu gar nichts ausgegeben wird - außer vielleicht einem Knacksen. Eine halbe Sekunde später wird genau das gleiche Sample wieder ganz abgespielt.
Das tritt auf mehreren Rechnern gleichermaßen auf, ist aber nicht 100% reproduzierbar. Manchmal wird 'zigmal hintereinander kein Sound verschluckt, dann mehrfach jedes 2. oder 3. Mal.
Irgendwelche Ideen? Bringt es was, explizit über den Mixer zu gehen?


----------



## EgonOlsen (14. Sep 2005)

0xdeadbeef hat gesagt.:
			
		

> Irgendwelche Ideen? Bringt es was, explizit über den Mixer zu gehen?


Ja, weil Java 1.5 hier einen hardwarebeschleunigten verwendet und das nicht besonders gut (oder anders: Sound in 1.5 wurde verbockt). Das hier (der Code unten, nicht der oben)  funzt: www.java-forum.org/de/viewtopic.php?t=17095


----------



## 0xdeadbeef (14. Sep 2005)

Danke erstmal für die Antwort zu so später Stunde...
Wenn ich Dich recht verstehe, müßte es bei meinem Beispiel reichen, den Mixer explizit auszuwählen (also "Java Sound Audio Engine"), oder? Ansonsten sehe ich jedenfalls keine massiven Unterschiede...
Hatte mir anfangs überlegt, die Wahl des Mixers dem Spieler zu überlassen. Werde diese Idee dann eventuell reaktivieren. Also alle Mixer, die den Anforderungen genügen in ein Sound-Menü aufnehmen und dann per JRadioButtonMenuItem oder so auswählen...
Jedenfalls danke erstmal...


----------



## EgonOlsen (14. Sep 2005)

0xdeadbeef hat gesagt.:
			
		

> Wenn ich Dich recht verstehe, müßte es bei meinem Beispiel reichen, den Mixer explizit auszuwählen (also "Java Sound Audio Engine"), oder?


Sieht so aus. Ansonsten machst du ja nicht wesentlich anderes als ich.


----------



## 0xdeadbeef (14. Sep 2005)

Hm, kann jetzt zwischen 3 Mixern umschalten: "Primärer Soundtreiber", "Game Theatre XP" und "Java Sound Engine". Wobei die ersten beiden wohl identisch sind.
Wie auch immer. Mir scheint es so, daß die Wahl des Mixers auf meinem Rechner keine großen Unterschiede macht. In beiden Fällen wird der Sound manchmal nicht abgespielt...
 :autsch:


----------



## 0xdeadbeef (15. Okt 2005)

Hm, mit der 1.5 05 scheint es - zumindest oberflächlich betrachtet - endlich zu funktionieren.
In den Release Notes der JRE/JDK sind auch zwei Sound-Themen aufgeführt, wobei zumindest eines genau mein Problem (Abspielen kurzer Sounds) beschreibt.


----------

