Update Files
This commit is contained in:
114
Kha/Backends/HTML5/kha/js/WebAudioSound.hx
Normal file
114
Kha/Backends/HTML5/kha/js/WebAudioSound.hx
Normal file
@ -0,0 +1,114 @@
|
||||
package kha.js;
|
||||
|
||||
import haxe.io.Bytes;
|
||||
import js.Browser;
|
||||
import js.html.XMLHttpRequest;
|
||||
import kha.audio2.Audio;
|
||||
|
||||
/*
|
||||
class WebAudioChannel extends kha.SoundChannel {
|
||||
private var buffer: Dynamic;
|
||||
private var startTime: Float;
|
||||
private var offset: Float;
|
||||
private var source: Dynamic;
|
||||
|
||||
public function new(buffer: Dynamic) {
|
||||
super();
|
||||
this.offset = 0;
|
||||
this.buffer = buffer;
|
||||
this.startTime = Audio._context.currentTime;
|
||||
this.source = Audio._context.createBufferSource();
|
||||
this.source.buffer = this.buffer;
|
||||
this.source.connect(Audio._context.destination);
|
||||
this.source.start(0);
|
||||
}
|
||||
|
||||
override public function play(): Void {
|
||||
if (source != null) return;
|
||||
super.play();
|
||||
startTime = Audio._context.currentTime - offset;
|
||||
source.start(0, offset);
|
||||
}
|
||||
|
||||
override public function pause(): Void {
|
||||
source.stop();
|
||||
offset = Audio._context.currentTime - startTime;
|
||||
startTime = -1;
|
||||
source = null;
|
||||
}
|
||||
|
||||
override public function stop(): Void {
|
||||
source.stop();
|
||||
source = null;
|
||||
offset = 0;
|
||||
startTime = -1;
|
||||
super.stop();
|
||||
}
|
||||
|
||||
override public function getCurrentPos(): Int {
|
||||
if (startTime < 0) return Math.ceil(offset * 1000);
|
||||
else return Math.ceil((Audio._context.currentTime - startTime) * 1000); //Miliseconds
|
||||
}
|
||||
|
||||
override public function getLength(): Int {
|
||||
return Math.floor(buffer.duration * 1000); //Miliseconds
|
||||
}
|
||||
}
|
||||
*/
|
||||
class WebAudioSound extends kha.Sound {
|
||||
public function new(filename: String, done: kha.Sound->Void, failed: AssetError->Void) {
|
||||
super();
|
||||
var request = untyped new XMLHttpRequest();
|
||||
request.open("GET", filename, true);
|
||||
request.responseType = "arraybuffer";
|
||||
|
||||
request.onerror = function() {
|
||||
failed({url: filename});
|
||||
};
|
||||
|
||||
request.onload = function() {
|
||||
compressedData = Bytes.ofData(request.response);
|
||||
uncompressedData = null;
|
||||
done(this);
|
||||
};
|
||||
request.send(null);
|
||||
}
|
||||
|
||||
function superUncompress(done: Void->Void): Void {
|
||||
super.uncompress(done);
|
||||
}
|
||||
|
||||
override public function uncompress(done: Void->Void): Void {
|
||||
Audio._context.decodeAudioData(compressedData.getData(), function(buffer: js.html.audio.AudioBuffer) {
|
||||
final ch0 = buffer.getChannelData(0);
|
||||
final ch1 = buffer.numberOfChannels == 1 ? ch0 : buffer.getChannelData(1);
|
||||
final len = ch0.length;
|
||||
uncompressedData = new kha.arrays.Float32Array(len * 2);
|
||||
length = buffer.duration;
|
||||
channels = buffer.numberOfChannels;
|
||||
sampleRate = Math.round(buffer.sampleRate);
|
||||
var idx = 0;
|
||||
var i = 0;
|
||||
final lidx = len * 2;
|
||||
function uncompressInner() {
|
||||
var chk_len = idx + 11025;
|
||||
var next_chk = chk_len > lidx ? lidx : chk_len;
|
||||
while (idx < next_chk) {
|
||||
uncompressedData[idx] = ch0[i];
|
||||
uncompressedData[idx + 1] = ch1[i];
|
||||
idx += 2;
|
||||
++i;
|
||||
}
|
||||
if (idx < lidx)
|
||||
js.Browser.window.setTimeout(uncompressInner, 0);
|
||||
else {
|
||||
compressedData = null;
|
||||
done();
|
||||
}
|
||||
};
|
||||
uncompressInner();
|
||||
}, function() {
|
||||
superUncompress(done);
|
||||
});
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user