package NET.worlds.scape; import NET.worlds.network.Cache; import NET.worlds.network.URL; class SoundState implements State { public static final int IDLE = 0; public static final int start = 1; public static final int intel0 = 1000; public static final int intel10 = 1010; public static final int intel11 = 1011; public static final int intel20 = 1020; public static final int intel21 = 1021; public static final int intel30 = 1030; public static final int intel31 = 1031; public static final int intel32 = 1032; public static final int intel33 = 1033; public static final int realAudio0 = 2000; public static final int realAudio10 = 2010; public static final int realAudio11 = 2011; private static SoundState instance = new SoundState(); private static URL dummy = URL.make("home:dummy.wav"); private SoundState() { } private void debugOut(int n, String s) { if (Sound.debugLevel > n) { System.out.println(s); } } public static State instance() { return instance; } @Override public Object doState(StateContext sc, Object obj) { Sound sound = (Sound)sc; Object rv; switch (sound.state) { case 1: rv = this.start(sound, obj); break; case 1000: rv = this.intel0(sound, obj); break; case 1010: rv = this.intel10(sound, obj); break; case 1011: rv = this.intel11(sound, obj); break; case 1020: rv = this.intel20(sound, obj); break; case 1021: rv = this.intel21(sound, obj); break; case 1030: rv = this.intel30(sound, obj); break; case 1031: rv = this.intel31(sound, obj); break; case 1032: rv = this.intel32(sound, obj); break; case 1033: rv = this.intel33(sound, obj); break; case 2000: rv = this.realAudio0(sound, obj); break; case 2010: rv = this.realAudio10(sound, obj); break; case 2011: rv = this.realAudio11(sound, obj); break; default: rv = this.error(sound, obj); } return rv; } private Object error(Sound sound, Object obj) { this.debugOut(2, "Unknown state in SoundState " + sound.state); return null; } private Object start(Sound sound, Object obj) { this.debugOut(6, "Entering SoundState "); assert sound.backgroundState == 1; if (sound.isRealAudio(sound.getURL())) { sound.changeState(2000); } else { sound.changeState(1000); } sound.doState(null); return null; } private Object intel0(Sound sound, Object obj) { this.debugOut(6, "Entering intel0 "); assert sound.backgroundState == 1; if (!SoundResource.instance().syncLock(1)) { return null; } else if (!sound.getURL().isRemote()) { sound.changeState(1010); BackgroundLoader.get(sound, sound.getURL()); return null; } else { sound.cachedFile = Cache.getFile(sound.getURL()); if (sound.cachedFile.done()) { sound.ensureClosure(); sound.changeState(1020); BackgroundLoader.get(sound, sound.getURL()); return null; } else { sound.cachedFile.finalize(); sound.cachedFile = null; sound.changeState(1030); BackgroundLoader.get(sound, dummy); return null; } } } private Object intel10(Sound sound, Object localName) { assert sound.backgroundState == 2; assert localName != null; SoundResource.instance().asyncLock(); sound.changeState(1011); if (sound.openPlayer((URL)localName)) { return localName; } else { this.debugOut(2, "intel10: couldn't open sound " + sound.getURL()); return null; } } private Object intel11(Sound sound, Object obj) { this.debugOut(6, "Entering intel11 "); assert sound.backgroundState == 1; if (obj != null) { if (sound.updateSound()) { sound.player.start(sound.getRepeat()); } else { sound.closePlayer(); } } sound.changeState(0); return null; } private Object intel20(Sound sound, Object obj) { this.debugOut(6, "Entering intel20 "); assert sound.backgroundState == 2; SoundResource.instance().asyncLock(); if (sound.openPlayer((URL)obj)) { sound.changeState(1021); return obj; } else { this.debugOut(2, "intel20: couldn't open player on sound " + sound.getURL()); sound.changeState(1021); return null; } } private Object intel21(Sound sound, Object obj) { this.debugOut(6, "Entering intel21 "); assert sound.backgroundState == 1; if (obj == null) { sound.unlockCache(); } else if (sound.updateSound()) { this.debugOut(6, "intel21 starting sound"); sound.player.start(sound.getRepeat()); } else { this.debugOut(6, "intel21 closing player"); sound.closePlayer(); } sound.changeState(0); return null; } private Object intel30(Sound sound, Object obj) { this.debugOut(6, "Entering intel30 "); assert sound.backgroundState == 2; SoundResource.instance().asyncLock(); if (sound.openPlayer(dummy)) { sound.changeState(1031); return obj; } else { this.debugOut(2, "intel30: couldn't open player on file " + sound.getURL()); sound.changeState(1031); return null; } } private Object intel31(Sound sound, Object obj) { this.debugOut(6, "Entering intel31 "); assert sound.backgroundState == 1; if (obj == null) { sound.changeState(0); } else if (sound.updateSound()) { sound.player.start(1); sound.changeState(1032); BackgroundLoader.get(sound, sound.getURL()); } else { sound.closePlayer(); sound.changeState(0); } return null; } private Object intel32(Sound sound, Object obj) { this.debugOut(6, "Entering intel32 "); assert sound.backgroundState == 2; sound.changeState(1033); return obj; } private Object intel33(Sound sound, Object obj) { this.debugOut(6, "Entering intel33 "); assert sound.backgroundState == 1; if (obj != null && sound.playAfterLoading) { sound.closePlayer(); sound.changeState(1000); sound.doState(obj); } else { sound.changeState(0); } return null; } private Object realAudio0(Sound sound, Object obj) { this.debugOut(6, "Entering RealAudio0 "); assert sound.backgroundState == 1; if (!SoundResource.instance().syncLock(2)) { return null; } else { sound.changeState(2010); BackgroundLoader.get(sound, dummy); return null; } } private Object realAudio10(Sound sound, Object obj) { this.debugOut(6, "Entering realAudio10 "); assert sound.backgroundState == 2; SoundResource.instance().asyncLock(); if (sound.openPlayer(sound.getURL())) { sound.changeState(2011); return sound; } else { return null; } } private Object realAudio11(Sound sound, Object obj) { this.debugOut(6, "Entering realAudio11 "); assert sound.backgroundState == 1; if (obj != null) { if (sound.updateSound()) { sound.player.start(sound.getRepeat()); } else { sound.closePlayer(); } } sound.changeState(0); return null; } }