BlueDragon
24-04-2006, 22:33
Discutiamo qui del bug trovato da PGI :)
---------
Dettagli della macchina:
Win XP Home SP 2
JRE 1.5.0_06
AMD64 3200+
GeForce 6800 GS (Driver NVIDIA versione 8.1.9.8)
DirectX 9.0x (4.09.0000.0904)
Realtek AC97 Audio (Driver 5.10.0000.5750)
Descrizione del problema.
Doppio click sul file "run-diamonds.bat". Sul prompt del dos appaiono le seguenti linee
C:\Documents and Settings\limitato\Documenti\DiamondCrush>set LD_LIBRARY_PATH=li
b/win32/
C:\Documents and Settings\limitato\Documenti\DiamondCrush>set CLASSPATH=DiamondC
rush.exe;.;bin/;lib/jar/jinput.jar;lib/jar/lwjgl_devil.jar;lib/jar/lwjgl.jar;lib
/jar/lwjgl_util.jar;lib/jar/jogg-0.0.7.jar;lib/jar/jorbis-0.0.15.jar;lib/jar/trb
.jar;
C:\Documents and Settings\limitato\Documenti\DiamondCrush>java -Djava.library.pa
th=lib/win32/ -cp DiamondCrush.exe;.;bin/;lib/jar/jinput.jar;lib/jar/lwjgl_devil
.jar;lib/jar/lwjgl.jar;lib/jar/lwjgl_util.jar;lib/jar/jogg-0.0.7.jar;lib/jar/jor
bis-0.0.15.jar;lib/jar/trb.jar; it.diamonds.Game
Display Adapter: nv4_disp
List of available display modes:
[...]
java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(Unknown Source)
at com.sun.media.codec.audio.mp3.JS_MP3FileReader.getAudioFileFormat(JS_
MP3FileReader.java:226)
at com.sun.media.codec.audio.mp3.JS_MP3FileReader.getAudioInputStream(JS
_MP3FileReader.java:131)
at com.sun.media.codec.audio.mp3.JS_MP3FileReader.getAudioInputStream(JS
_MP3FileReader.java:93)
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
at org.lwjgl.util.WaveData.create(WaveData.java:123)
at it.diamonds.engine.audio.Sound.readSoundFile(Unknown Source)
at it.diamonds.engine.audio.Sound.initSource(Unknown Source)
at it.diamonds.engine.audio.Sound.<init>(Unknown Source)
at it.diamonds.engine.audio.Sound.<init>(Unknown Source)
at it.diamonds.engine.audio.Audio.createSound(Unknown Source)
at it.diamonds.gems.DroppableFactory.<init>(Unknown Source)
at it.diamonds.gems.RandomDroppableFactory.<init>(Unknown Source)
at it.diamonds.gems.GemQueue.<init>(Unknown Source)
at it.diamonds.grid.GridController.create(Unknown Source)
at it.diamonds.PlayField.<init>(Unknown Source)
at it.diamonds.GameLoop.createPlayField(Unknown Source)
at it.diamonds.GameLoop.createPlayFieldOne(Unknown Source)
at it.diamonds.GameLoop.initPlayField(Unknown Source)
at it.diamonds.GameLoop.<init>(Unknown Source)
at it.diamonds.GameLoop.create(Unknown Source)
at it.diamonds.Game.setUpGame(Unknown Source)
at it.diamonds.Game.create(Unknown Source)
at it.diamonds.Game.main(Unknown Source)
------------
Praticamente la questione è che quando invochiamo WaveData.create in Sound, dietro a quest'invocazione c'è un AudioSystem.getAudioInputStream, che può variare a seconda dell'implementazione.
Nei sistemi che hanno a disposizione implementazioni dell'Audio java oltre a quella standard, (es: supporto mp3), la chiamata ad AudioSystem può incappare in uno stream che non supporta il mark/reset necessario alla nostra WaveData.create.
Ho provato a simulare il problema aggiungendo al progetto i jar mp3spi e tritonus che danno il supporto ad mp3 in JavaSound ed ho riscontrato un errore con stacktrace quasi identico (differisce solo nelle prime righe per via di implementazioni diverse).
La soluzione, come suggerita da TigerShark è di passare a WaveData.create uno stream che supporti il mark/reset, ad esempio BufferedInputStream.
Quindi wrappando il FileInputStream con un BufferedInputStream, il problema dovrebbe essere risolto.
Ho provato e funziona :)
---------
Dettagli della macchina:
Win XP Home SP 2
JRE 1.5.0_06
AMD64 3200+
GeForce 6800 GS (Driver NVIDIA versione 8.1.9.8)
DirectX 9.0x (4.09.0000.0904)
Realtek AC97 Audio (Driver 5.10.0000.5750)
Descrizione del problema.
Doppio click sul file "run-diamonds.bat". Sul prompt del dos appaiono le seguenti linee
C:\Documents and Settings\limitato\Documenti\DiamondCrush>set LD_LIBRARY_PATH=li
b/win32/
C:\Documents and Settings\limitato\Documenti\DiamondCrush>set CLASSPATH=DiamondC
rush.exe;.;bin/;lib/jar/jinput.jar;lib/jar/lwjgl_devil.jar;lib/jar/lwjgl.jar;lib
/jar/lwjgl_util.jar;lib/jar/jogg-0.0.7.jar;lib/jar/jorbis-0.0.15.jar;lib/jar/trb
.jar;
C:\Documents and Settings\limitato\Documenti\DiamondCrush>java -Djava.library.pa
th=lib/win32/ -cp DiamondCrush.exe;.;bin/;lib/jar/jinput.jar;lib/jar/lwjgl_devil
.jar;lib/jar/lwjgl.jar;lib/jar/lwjgl_util.jar;lib/jar/jogg-0.0.7.jar;lib/jar/jor
bis-0.0.15.jar;lib/jar/trb.jar; it.diamonds.Game
Display Adapter: nv4_disp
List of available display modes:
[...]
java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(Unknown Source)
at com.sun.media.codec.audio.mp3.JS_MP3FileReader.getAudioFileFormat(JS_
MP3FileReader.java:226)
at com.sun.media.codec.audio.mp3.JS_MP3FileReader.getAudioInputStream(JS
_MP3FileReader.java:131)
at com.sun.media.codec.audio.mp3.JS_MP3FileReader.getAudioInputStream(JS
_MP3FileReader.java:93)
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
at org.lwjgl.util.WaveData.create(WaveData.java:123)
at it.diamonds.engine.audio.Sound.readSoundFile(Unknown Source)
at it.diamonds.engine.audio.Sound.initSource(Unknown Source)
at it.diamonds.engine.audio.Sound.<init>(Unknown Source)
at it.diamonds.engine.audio.Sound.<init>(Unknown Source)
at it.diamonds.engine.audio.Audio.createSound(Unknown Source)
at it.diamonds.gems.DroppableFactory.<init>(Unknown Source)
at it.diamonds.gems.RandomDroppableFactory.<init>(Unknown Source)
at it.diamonds.gems.GemQueue.<init>(Unknown Source)
at it.diamonds.grid.GridController.create(Unknown Source)
at it.diamonds.PlayField.<init>(Unknown Source)
at it.diamonds.GameLoop.createPlayField(Unknown Source)
at it.diamonds.GameLoop.createPlayFieldOne(Unknown Source)
at it.diamonds.GameLoop.initPlayField(Unknown Source)
at it.diamonds.GameLoop.<init>(Unknown Source)
at it.diamonds.GameLoop.create(Unknown Source)
at it.diamonds.Game.setUpGame(Unknown Source)
at it.diamonds.Game.create(Unknown Source)
at it.diamonds.Game.main(Unknown Source)
------------
Praticamente la questione è che quando invochiamo WaveData.create in Sound, dietro a quest'invocazione c'è un AudioSystem.getAudioInputStream, che può variare a seconda dell'implementazione.
Nei sistemi che hanno a disposizione implementazioni dell'Audio java oltre a quella standard, (es: supporto mp3), la chiamata ad AudioSystem può incappare in uno stream che non supporta il mark/reset necessario alla nostra WaveData.create.
Ho provato a simulare il problema aggiungendo al progetto i jar mp3spi e tritonus che danno il supporto ad mp3 in JavaSound ed ho riscontrato un errore con stacktrace quasi identico (differisce solo nelle prime righe per via di implementazioni diverse).
La soluzione, come suggerita da TigerShark è di passare a WaveData.create uno stream che supporti il mark/reset, ad esempio BufferedInputStream.
Quindi wrappando il FileInputStream con un BufferedInputStream, il problema dovrebbe essere risolto.
Ho provato e funziona :)