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();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |