package NET.worlds.scape; import NET.worlds.network.Cache; import NET.worlds.network.CacheFile; import NET.worlds.network.URL; class ASFThread extends Thread { private URL url; private ASFSoundPlayer player; private static ASFThread asfThread; private static boolean paused; ASFThread(URL url, ASFSoundPlayer player) { this.url = url; this.player = player; setASF(this); } @Override public void run() { CacheFile cf = Cache.getFile(this.url); cf.waitUntilLoaded(); if (cf.error()) { this.player.running = 3; releaseASF(this); } else if (!paused) { String localName = cf.getLocalName().replace('/', '\\'); if (!ASFSoundPlayer.nativePlay(localName)) { this.player.running = 3; } releaseASF(this); } } static synchronized void pauseASF() { if (!paused && asfThread != null) { ASFThread t = asfThread; stopASF(); paused = true; new ASFThread(t.url, t.player); } paused = true; } static synchronized void resumeASF() { if (paused) { ASFThread t = asfThread; paused = false; if (t != null) { new ASFThread(t.url, t.player); } } } static synchronized void releaseASF(ASFThread t) { if (asfThread == t) { asfThread = null; } } static synchronized void setASF(ASFThread t) { if (asfThread == null || !asfThread.url.equals(t.url)) { asfThread = t; asfThread.setDaemon(true); asfThread.start(); } } static synchronized void stopASF() { if (asfThread != null) { asfThread = null; if (!paused) { ASFSoundPlayer.nativePlay(""); } } } static boolean isActive() { return asfThread != null; } }