forked from LeenkxTeam/LNXSDK
121 lines
3.2 KiB
Haxe
121 lines
3.2 KiB
Haxe
package kha.java;
|
|
|
|
import java.lang.Runnable;
|
|
|
|
@:classCode('
|
|
java.io.File file;
|
|
javax.sound.sampled.AudioInputStream in;
|
|
javax.sound.sampled.SourceDataLine line;
|
|
int frameSize;
|
|
byte[] buffer = new byte [32 * 1024]; // 32k is arbitrary
|
|
Thread playThread;
|
|
boolean playing;
|
|
boolean notYetEOF;
|
|
')
|
|
class Music implements Runnable {
|
|
var loop: Bool = false;
|
|
|
|
public function new(filename: String) {
|
|
init(filename);
|
|
}
|
|
|
|
@:functionCode('
|
|
try {
|
|
//instance = this;
|
|
java.io.File f = new java.io.File(filename);
|
|
file = f;
|
|
in = javax.sound.sampled.AudioSystem.getAudioInputStream (f);
|
|
javax.sound.sampled.AudioFormat format = in.getFormat();
|
|
javax.sound.sampled.AudioFormat.Encoding formatEncoding = format.getEncoding();
|
|
if (!(formatEncoding.equals(javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED) || formatEncoding.equals(javax.sound.sampled.AudioFormat.Encoding.PCM_UNSIGNED)))
|
|
throw new javax.sound.sampled.UnsupportedAudioFileException(file.getName() + " is not PCM audio");
|
|
//System.out.println ("got PCM format");
|
|
frameSize = format.getFrameSize();
|
|
javax.sound.sampled.DataLine.Info info = new javax.sound.sampled.DataLine.Info(javax.sound.sampled.SourceDataLine.class, format);
|
|
//System.out.println ("got info");
|
|
line = (javax.sound.sampled.SourceDataLine)javax.sound.sampled.AudioSystem.getLine(info);
|
|
//System.out.println ("got line");
|
|
line.open();
|
|
//System.out.println ("opened line");
|
|
playThread = new Thread(this);
|
|
playing = false;
|
|
notYetEOF = true;
|
|
}
|
|
catch (Exception ex) {
|
|
ex.printStackTrace();
|
|
}
|
|
')
|
|
function init(filename: String): Void {}
|
|
|
|
@:functionCode('
|
|
int readPoint = 0;
|
|
int bytesRead = 0;
|
|
|
|
try {
|
|
while (playing) {
|
|
while (notYetEOF) {
|
|
if (playing) {
|
|
bytesRead = in.read(buffer, readPoint, buffer.length - readPoint);
|
|
if (bytesRead == -1) {
|
|
notYetEOF = false;
|
|
break;
|
|
}
|
|
// how many frames did we get,
|
|
// and how many are left over?
|
|
//int frames = bytesRead / frameSize;
|
|
int leftover = bytesRead % frameSize;
|
|
// send to line
|
|
line.write(buffer, readPoint, bytesRead-leftover);
|
|
// save the leftover bytes
|
|
System.arraycopy(buffer, bytesRead, buffer, 0, leftover);
|
|
readPoint = leftover;
|
|
}
|
|
else {
|
|
// if not playing
|
|
// Thread.yield();
|
|
try { Thread.sleep (10);}
|
|
catch (InterruptedException ie) {}
|
|
}
|
|
}
|
|
//System.out.println ("reached eof");
|
|
try {
|
|
in = javax.sound.sampled.AudioSystem.getAudioInputStream(file);
|
|
}
|
|
catch (javax.sound.sampled.UnsupportedAudioFileException e) {
|
|
e.printStackTrace();
|
|
}
|
|
if (loop) notYetEOF = true;
|
|
else playing = false;
|
|
}
|
|
line.drain();
|
|
line.stop();
|
|
}
|
|
catch (java.io.IOException ioe) {
|
|
ioe.printStackTrace();
|
|
}
|
|
finally {
|
|
// line.close();
|
|
}
|
|
')
|
|
public function run(): Void {}
|
|
|
|
@:functionCode('
|
|
this.loop = loop;
|
|
playing = true;
|
|
if (!playThread.isAlive())
|
|
playThread.start();
|
|
line.start();
|
|
')
|
|
function play2(loop: Bool): Void {}
|
|
|
|
public function play(loop: Bool = false): Void {
|
|
play2(loop);
|
|
}
|
|
|
|
@:functionCode('
|
|
playing = false;
|
|
line.stop();
|
|
')
|
|
public function stop(): Void {}
|
|
}
|