115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
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);
 | 
						|
		});
 | 
						|
	}
 | 
						|
}
 |