summaryrefslogtreecommitdiff
path: root/NET/worlds/scape/MCISoundPlayer.java
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-12 22:33:32 -0800
committerFuwn <[email protected]>2026-02-12 22:33:32 -0800
commitc7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch)
treedf9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/scape/MCISoundPlayer.java
downloadworldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz
worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip
Initial commit
Diffstat (limited to 'NET/worlds/scape/MCISoundPlayer.java')
-rw-r--r--NET/worlds/scape/MCISoundPlayer.java161
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();
+}