133 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package kha.js;
 | 
						|
 | 
						|
import js.Browser;
 | 
						|
import js.html.AudioElement;
 | 
						|
import js.html.ErrorEvent;
 | 
						|
import js.html.Event;
 | 
						|
import js.html.MediaError;
 | 
						|
 | 
						|
using StringTools;
 | 
						|
 | 
						|
/*class SoundChannel extends kha.SoundChannel {
 | 
						|
	private var element: Dynamic;
 | 
						|
 | 
						|
	public function new(element: Dynamic) {
 | 
						|
		super();
 | 
						|
		this.element = element;
 | 
						|
	}
 | 
						|
 | 
						|
	override public function play(): Void {
 | 
						|
		super.play();
 | 
						|
		element.play();
 | 
						|
	} 
 | 
						|
 | 
						|
	override public function pause(): Void {
 | 
						|
		try {
 | 
						|
			element.pause();
 | 
						|
		}
 | 
						|
		catch (e: Dynamic) {
 | 
						|
			trace(e);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	override public function stop(): Void {
 | 
						|
		try {
 | 
						|
			element.pause();
 | 
						|
			element.currentTime = 0;
 | 
						|
			super.stop();
 | 
						|
		}
 | 
						|
		catch (e: Dynamic) {
 | 
						|
			trace(e);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	override public function getCurrentPos(): Int {
 | 
						|
		return Math.ceil(element.currentTime * 1000);  // Miliseconds
 | 
						|
	}
 | 
						|
 | 
						|
	override public function getLength(): Int {
 | 
						|
		if (Math.isFinite(element.duration)) {
 | 
						|
			return Math.floor(element.duration * 1000); // Miliseconds
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			return -1;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}*/
 | 
						|
class Sound extends kha.Sound {
 | 
						|
	var filenames: Array<String>;
 | 
						|
 | 
						|
	static var loading: Array<Sound> = new Array();
 | 
						|
 | 
						|
	var done: kha.Sound->Void;
 | 
						|
	var failed: AssetError->Void;
 | 
						|
 | 
						|
	public var element: AudioElement;
 | 
						|
 | 
						|
	public function new(filenames: Array<String>, done: kha.Sound->Void, failed: AssetError->Void) {
 | 
						|
		super();
 | 
						|
 | 
						|
		this.done = done;
 | 
						|
		this.failed = failed;
 | 
						|
		loading.push(this); // prevent gc from removing this
 | 
						|
 | 
						|
		element = Browser.document.createAudioElement();
 | 
						|
 | 
						|
		this.filenames = [];
 | 
						|
		for (filename in filenames) {
 | 
						|
			if (element.canPlayType("audio/ogg") != "" && filename.endsWith(".ogg"))
 | 
						|
				this.filenames.push(filename);
 | 
						|
			if (element.canPlayType("audio/mp4") != "" && filename.endsWith(".mp4"))
 | 
						|
				this.filenames.push(filename);
 | 
						|
			if (element.canPlayType("audio/wav") != "" && filename.endsWith(".wav"))
 | 
						|
				this.filenames.push(filename);
 | 
						|
		}
 | 
						|
 | 
						|
		element.addEventListener("error", errorListener, false);
 | 
						|
		element.addEventListener("canplay", canPlayThroughListener, false);
 | 
						|
 | 
						|
		element.src = this.filenames[0];
 | 
						|
		element.preload = "auto";
 | 
						|
		element.load();
 | 
						|
	}
 | 
						|
 | 
						|
	// override public function play(): kha.SoundChannel {
 | 
						|
	//	try {
 | 
						|
	//		element.play();
 | 
						|
	//	}
 | 
						|
	//	catch (e: Dynamic) {
 | 
						|
	//		trace(e);
 | 
						|
	//	}
 | 
						|
	//	return new SoundChannel(element);
 | 
						|
	// }
 | 
						|
	function errorListener(eventInfo: ErrorEvent): Void {
 | 
						|
		if (element.error.code == MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {
 | 
						|
			for (i in 0...filenames.length - 1) {
 | 
						|
				if (element.src == filenames[i]) {
 | 
						|
					// try loading with next extension:
 | 
						|
					element.src = filenames[i + 1];
 | 
						|
					return;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		failed({url: element.src});
 | 
						|
		finishAsset();
 | 
						|
	}
 | 
						|
 | 
						|
	function canPlayThroughListener(eventInfo: Event): Void {
 | 
						|
		finishAsset();
 | 
						|
	}
 | 
						|
 | 
						|
	function finishAsset() {
 | 
						|
		element.removeEventListener("error", errorListener, false);
 | 
						|
		element.removeEventListener("canplaythrough", canPlayThroughListener, false);
 | 
						|
		done(this);
 | 
						|
		loading.remove(this);
 | 
						|
	}
 | 
						|
 | 
						|
	override public function uncompress(done: Void->Void): Void {
 | 
						|
		done();
 | 
						|
	}
 | 
						|
}
 |