# Java Sound Mark/Reset Exception



## Apo (29. Nov 2010)

Hi,

ich entwickle in Eclipse und möchte meinem Spiel etwas Sound hinzufügen. 
Ich lade die Sounddateien folgendermaßen:

```
AudioInputStream audioInputStream = null;
try {
	audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(this.path));
} catch (Exception e) {
	System.out.println("Fehler: "+e.getMessage()+" "+this.path+" "+e.getCause());
}
```

Der Path ist ein Stringfile wie "/sound/test.wav".
In Eclipse funktioniert alles wunderbar und ich höre die Sounds. Wenn ich eine Jar Datei erstelle bekomme ich die Fehlermeldung 
"mark/reset not supported". Die Sounddateien sind auch in der Jar mit drin. Ich bin etwas verwirrt.

Wie kann ich das umgehen bzw. könnt ihr mir helfen?
Danke!


----------



## Ralph-Uwe (29. Nov 2010)

Hi,

es sieht so aus, als ob der Fehler nicht in den Programmzeilen entsteht,
die Du gepostet hast.
Lass noch mal ein bisschen mehr sehen.


----------



## Apo (29. Nov 2010)

Naja doch es wird genau dort die Exception geworfen. Im Syso steht "Fehler: mark/reset not supported /sounds/test.wav null"
Aber das bringt ja nicht viel. Wollte nur zeigen, worauf es wahrscheinlich genau ankommt. 

Ich kann euch aber gerne die komplette run-Methode geben.

```
public void run() {
		try {
			while(this.soundThread.isRunning()) {
				do {
					AudioInputStream audioInputStream = null;
					try {
						audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(this.path));
					} catch (Exception e) {
						System.out.println("Fehler: "+e.getMessage()+" "+this.path+" "+e.getCause());
					}

					AudioFormat audioFormat = audioInputStream.getFormat();
				
					SourceDataLine line = null;
					DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat);
					try {
						line = (SourceDataLine) AudioSystem.getLine(info);
						line.open(audioFormat);
					} catch (LineUnavailableException e) {
					} catch (Exception e) {
					}

					line.start();

					int nBytesRead = 0;
					byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
					while ((nBytesRead != -1) && (!this.isBStop())) {
						try {
							nBytesRead = audioInputStream.read(abData, 0, abData.length);
						} catch (IOException e) {
						}
						if (nBytesRead >= 0) {
							line.write(abData, 0, nBytesRead);
						}
					}
					line.drain();
					line.close();
				} while ((!this.isBStop()) && (this.isBLoop()));
				this.soundThread.stop();
			}
			try {
				synchronized(this.soundThread) {
					this.soundThread.wait((long)10);
				}
			} catch(InterruptedException e) {
				(this.soundThread).stop();
			}
		} catch (Exception ex) {
			
		}
	}
```


----------



## Gast2 (29. Nov 2010)

Das sieht danach aus das das wav nicht in dem Jar gefunden wird. 

Ist es sicher mit eingepackt? Evtl ist der Pfad dahin auch falsch, sprich s wird woanders im Jar hingepackt.


----------



## Apo (29. Nov 2010)

Auch erstmal Danke. Aber die Sounddaten sind auf jeden Fall auch in der JAR. Wenn sie an der falschen Stelle wären, würde ich eine NullPointerException anstatt dem mark/reset not supported bekommen. Habe es gerade getestet. Ich habe sie nun mal auch aus einem File lesen lassen. Dann fkt das ganze.
Also ich habe einfach nur:

```
AudioInputStream audioInputStream = null;
					try {
						if (this.BInJAR) {
							audioInputStream = AudioSystem.getAudioInputStream(AudioPlayer.class.getResourceAsStream(this.path));
						} else {
							if (ApoConstants.B_APPLET) {
								audioInputStream = AudioSystem.getAudioInputStream(new URL("http://www.apo-games.de/apoPongBeat" + this.path));
							} else {
								audioInputStream = AudioSystem.getAudioInputStream(new File(System.getProperty("user.dir") + this.path.replace("/", File.separator)));	
							}
						}
					} catch (Exception e) {
						System.out.println("Fehler: "+e.getMessage()+" "+this.path+" "+e.getCause());
					}
```

Das mit dem File fkt wunderbar. Bloss das Streamen per URl laggt doch leicht. Das ist suboptimal. Deshalb möchte ich es aus der JAR lesen lassen. Das muss doch funktionieren!!!

Ich habe auch mal die Jar Datei hochgeladen, wo die Sounddateien mit drin sind. Damit ihr mir auch glaubt. Click here

Kennt ihr nebenbei noch eine gute Site, wo ich 2 Oktoaven (wav Dateien) mit allen Noten fürs Piano herbekomme oder gibt es dafür ein Programm? Im Spiel soll man später einzelne Lieder nachspielen sollen.


----------



## Andi_CH (29. Nov 2010)

Apo hat gesagt.:


> Der Path ist ein Stringfile wie "/sound/test.wav".


Mich irritiert der Pfad - das hat wohl nur funktioniert weil das unter C:/sound lag

Versuchs doch mal mit "./sound/test.wav" - oder so ähnlich

Kann schon sein, dass ich total daneben liege, aber dann möchte ich eine Erklärung, warum es mit dem absoluten Pfad funktionieren soll?


----------



## Apo (29. Nov 2010)

Das funktioniert ja auch nur, weil ich es aus der Jar direkt hole. Meine Bilder hole ich auch immer so (und die kann er ja laden).
Wenn ich es extern laden lasse, muss ich ihm ja sagen, wo er es herholen soll. Das war aber nur zu Testzwecken. Das möchte ich gar nicht verwenden. So schwer kann das doch nicht sein. =(

Habe auch deine Variante versucht, dann bekomme ich aber die gesagt NullPointerException


----------



## Ralph-Uwe (29. Nov 2010)

Hallo,

Die Exception mark/reset not supported wird geworfen, wenn ein AudioStream nicht erlaubt Sprungmarken zu setzen.
Deswegen hatte ich vermutet, dass Du Sprungmarken verwendest.

Ich habe mir Deinen Code mal angesehen und mit meinem verglichen. Bis auf eine Sache konnte ich
nichts feststellen, aber vielleicht hilft es ja:


```
AudioInputStream in = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,AudioSystem.getAudioInputStream(soundToPlay));
```
heiß es bei mir.

Deine Zeile wäre dann:

```
audioInputStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(this.path)));
```

Probiere es mal aus.


----------



## Apo (29. Nov 2010)

Vielen Dank für die Hilfe, aber leider hilft das auch nicht. =(

Ich habe es zu Testzwecken auch mal ausgelagert, aber es ändert nichts an der Meldung. 
ACH MAN ...

€dit: Habe jetzt mal die Daten von wav in au verändert. Und immer noch der gleiche Fehler. Da kann doch irgendwas nicht stimmen ...


----------



## Ralph-Uwe (29. Nov 2010)

Eine Idee habe ich noch, lass mal testweise den synchronized Block weg:


```
try {
				synchronized(this.soundThread) {
					this.soundThread.wait((long)10);
				}
			} catch(InterruptedException e) {
				(this.soundThread).stop();
			}
```


----------



## Ralph-Uwe (29. Nov 2010)

Habe noch was gefunden:

MP3 Stream puffern vor abspielen wie die meisten Flash Player @ tutorials.de: Tutorials, Forum & Hilfe

ab post #6


> Dummerweise bekomme ich aber folgende Fehlermeldung:
> Code java:
> 
> Exception in thread "main" java.io.IOException: mark/reset not supported
> ...


----------



## Apo (29. Nov 2010)

Erst einmal tausend Dank für deine Mühen, aber will leider auch mit auskommentierten Block nicht klappen.
Ich werde jetzt mal JLayer ausprobieren. Außer wenn natürlich noch jemand eine Idee hat.


----------



## Ralph-Uwe (29. Nov 2010)

Wenn Du magst, probiere die Sound.java aus.

Damit mache ich meine Hintergrundsound.

http://www.java-forum.org/spiele-mu...intergrundsounds-soundeffekte.html#post698715


----------



## Apo (29. Nov 2010)

Ey super danke! Werde sie gleich mitbenutzen für die Hintergrundmusik ... 

aber ich habe es gerade hinbekommen ... der Tip mit dem Inputstream war Gold wert. Ich lade nun

```
audioInputStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, AudioSystem.getAudioInputStream(this.getClass().getResource(this.path)));
```
] so. Also statt getResourceAsStream(this.path) einfach getResource(this.path), was eine URL zurückliefert. Damit fkt es aber. Ach ich bin glücklich. Tausend Dank an den Denkanstoss!!!!


----------



## Ralph-Uwe (29. Nov 2010)

Freut mich, wenn ich helfen konnte!


----------

