diff options
| author | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
| commit | c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch) | |
| tree | df9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/scape/MCISoundPlayer.java | |
| download | worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip | |
Initial commit
Diffstat (limited to 'NET/worlds/scape/MCISoundPlayer.java')
| -rw-r--r-- | NET/worlds/scape/MCISoundPlayer.java | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/NET/worlds/scape/MCISoundPlayer.java b/NET/worlds/scape/MCISoundPlayer.java new file mode 100644 index 0000000..d87d245 --- /dev/null +++ b/NET/worlds/scape/MCISoundPlayer.java @@ -0,0 +1,161 @@ +package NET.worlds.scape; + +import NET.worlds.network.URL; + +public class MCISoundPlayer extends SoundPlayer { + private static MCIThread mciThread = new MCIThread(); + float ang; + float dist; + float vol; + int leftToRepeat; + int running; + MCISoundCommand poll = new MCISoundCommand() { + @Override + public void run() { + MCISoundPlayer.this.gotFinished(MCISoundPlayer.this.nativeIsFinished()); + } + }; + private URL url; + private static MCISoundCommand activeStopCmd; + MCISoundCommand volumeCmd = new MCISoundCommand() { + @Override + public void run() { + if (!WavSoundPlayer.ignoreVolumeChanges) { + MCISoundPlayer.this.nativeVolume(this.left, this.right); + } + } + }; + + public MCISoundPlayer(Sound owner) { + super(owner); + } + + @Override + public boolean open(float volume, float stopDist, boolean atten, boolean pan) { + return true; + } + + @Override + public void close() { + this.stop(); + } + + @Override + public boolean position(Point3Temp cam, Point3Temp obj, Point3Temp out, Point3Temp up) { + Point3Temp toObj = Point3Temp.make(obj).minus(cam); + Point3Temp right = Point3Temp.make(out).cross(up); + float y = toObj.dot(out); + float x = toObj.dot(right); + this.ang = (float)(Math.atan2(y, x) / Math.PI); + this.dist = toObj.length(); + return this.setVolume(this.vol); + } + + @Override + public boolean setVolume(float v) { + this.vol = v; + float leftFrac = 0.5F; + if (this.owner != null && this.owner.getPanning()) { + leftFrac = Math.abs(this.ang); + if (this.ang < 0.0F) { + v = this.vol * (float)(0.5 + Math.abs(0.5 + this.ang)); + } + } + + if (this.owner != null && this.owner.getAttenuate()) { + float stopDist = this.owner.getStopDistance(); + if (this.dist > stopDist) { + this.volume(0.0F, 0.0F); + return false; + } + + v *= (stopDist - this.dist) / stopDist; + } + + this.volume(v * leftFrac, v * (1.0F - leftFrac)); + return true; + } + + @Override + public int getState() { + if (!this.poll.isOnQueue) { + mciThread.pushCommand(this.poll); + } + + return this.running != 0 ? 0 : 1; + } + + @Override + public synchronized void start(int repeatCount) { + if (repeatCount == 0) { + this.running = 0; + } else { + this.leftToRepeat = repeatCount; + if (this.leftToRepeat > 0) { + this.leftToRepeat--; + } + + this.running = 1; + activeStopCmd = null; + mciThread.pushCommand(new MCISoundCommand() { + @Override + public void run() { + MCISoundPlayer.this.doStart(); + } + }); + } + } + + public synchronized void start(URL u) { + this.url = u; + this.start(1); + } + + synchronized void doStart() { + this.running = 2; + if (!this.nativeStart((this.owner == null ? this.url : this.owner.getURL()).unalias())) { + this.running = 3; + } + } + + synchronized void gotFinished(boolean f) { + if (f && this.running == 2) { + this.start(this.leftToRepeat); + } + } + + @Override + public synchronized void stop() { + this.leftToRepeat = 0; + activeStopCmd = new MCISoundCommand() { + @Override + public void run() { + if (MCISoundPlayer.activeStopCmd == this) { + MCISoundPlayer.activeStopCmd = null; + MCISoundPlayer.this.nativeStop(); + } + } + }; + mciThread.pushCommand(activeStopCmd); + } + + public void volume(float left, float right) { + this.volumeCmd.left = left; + this.volumeCmd.right = right; + if (!this.volumeCmd.isOnQueue) { + mciThread.pushCommand(this.volumeCmd); + } + } + + private native void nativeVolume(float var1, float var2); + + private native boolean nativeStart(String var1); + + private native boolean nativeIsFinished(); + + private native void nativeStop(); + + public static native boolean isActive(); + + static native void shutdown(); +} |