It took me all day to figure out why my game-in-progress was crashing when I tried playing an .ogg file!
It turns out, if you're playing an .ogg file using the Sound class, it needs to have a minimum length (or perhaps have a minimum file size).
The .ogg file I was using contained a very short blip that I wanted to play when I kill a mob. It consisted of a single 32nd note played at 100bpm. The size of the file was 6.33kb.
The problem went away when I added some reverb to the blip that is undetectable to the ear, but nonetheless lengthens the .ogg file and increases the file size. The modified .ogg file that worked had a size of 12.6kb.
Here is a paraphrase of the code I was using that is relevant:
Code:
public class Mob {
public Sound mobHit;
public Mob() throws SlickException {
...
mobHit = new Sound("res/hitmob.ogg");
...
}
public void collision(){
...
mobHit.play();
...
}
}
And here is the error I was getting after the game crashed on startup:
Code:
...
...
Mon Jul 30 18:30:36 CDT 2012 ERROR:Failure reading in vorbis
Mon Jul 30 18:30:36 CDT 2012 ERROR:null
java.lang.IndexOutOfBoundsException
at java.io.BufferedInputStream.read(Unknown Source)
at org.newdawn.slick.openal.OggInputStream.getPageAndPacket(OggInputStream.java:154)
at org.newdawn.slick.openal.OggInputStream.readPCM(OggInputStream.java:294)
at org.newdawn.slick.openal.OggInputStream.read(OggInputStream.java:446)
at org.newdawn.slick.openal.OggDecoder.getData(OggDecoder.java:315)
at org.newdawn.slick.openal.SoundStore.getOgg(SoundStore.java:835)
at org.newdawn.slick.openal.SoundStore.getOgg(SoundStore.java:793)
at org.newdawn.slick.Sound.<init>(Sound.java:58)
at Slick.Mobs.Mob.<init>(Mob.java:57)
at Slick.GameStates.LevelOne.init(LevelOne.java:65)
at org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:171)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:390)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:314)
at Slick.Game.main(Game.java:35)
Mon Jul 30 18:30:36 CDT 2012 ERROR:/ by zero
java.lang.ArithmeticException: / by zero
at org.newdawn.slick.openal.AudioImpl.<init>(AudioImpl.java:38)
at org.newdawn.slick.openal.SoundStore.getOgg(SoundStore.java:854)
at org.newdawn.slick.openal.SoundStore.getOgg(SoundStore.java:793)
at org.newdawn.slick.Sound.<init>(Sound.java:58)
at Slick.Mobs.Mob.<init>(Mob.java:57)
at Slick.GameStates.LevelOne.init(LevelOne.java:65)
at org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:171)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:390)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:314)
at Slick.Game.main(Game.java:35)
Mon Jul 30 18:30:36 CDT 2012 ERROR:Failed to load sound: res/hitmobshort.ogg
org.newdawn.slick.SlickException: Failed to load sound: res/hitmobshort.ogg
at org.newdawn.slick.Sound.<init>(Sound.java:70)
at Slick.Mobs.Mob.<init>(Mob.java:57)
at Slick.GameStates.LevelOne.init(LevelOne.java:65)
at org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:171)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:390)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:314)
at Slick.Game.main(Game.java:35)
AL lib: FreeContext: (031826B8) Deleting 64 Source(s)