106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.js;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import js.html.audio.AudioBuffer;
							 | 
						||
| 
								 | 
							
								import js.html.audio.AudioBufferSourceNode;
							 | 
						||
| 
								 | 
							
								import js.html.audio.GainNode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MobileWebAudioChannel implements kha.audio1.AudioChannel {
							 | 
						||
| 
								 | 
							
									var buffer: AudioBuffer;
							 | 
						||
| 
								 | 
							
									var loop: Bool;
							 | 
						||
| 
								 | 
							
									var source: AudioBufferSourceNode;
							 | 
						||
| 
								 | 
							
									var gain: GainNode;
							 | 
						||
| 
								 | 
							
									var startTime: Float;
							 | 
						||
| 
								 | 
							
									var pauseTime: Float;
							 | 
						||
| 
								 | 
							
									var paused: Bool = false;
							 | 
						||
| 
								 | 
							
									var stopped: Bool = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new(sound: MobileWebAudioSound, loop: Bool) {
							 | 
						||
| 
								 | 
							
										this.buffer = sound._buffer;
							 | 
						||
| 
								 | 
							
										this.loop = loop;
							 | 
						||
| 
								 | 
							
										createSource();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function createSource(): Void {
							 | 
						||
| 
								 | 
							
										source = MobileWebAudio._context.createBufferSource();
							 | 
						||
| 
								 | 
							
										source.loop = loop;
							 | 
						||
| 
								 | 
							
										source.buffer = buffer;
							 | 
						||
| 
								 | 
							
										source.onended = function() {
							 | 
						||
| 
								 | 
							
											stopped = true;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										gain = MobileWebAudio._context.createGain();
							 | 
						||
| 
								 | 
							
										source.connect(gain);
							 | 
						||
| 
								 | 
							
										gain.connect(MobileWebAudio._context.destination);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function play(): Void {
							 | 
						||
| 
								 | 
							
										if (paused || stopped) {
							 | 
						||
| 
								 | 
							
											createSource();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										stopped = false;
							 | 
						||
| 
								 | 
							
										if (paused) {
							 | 
						||
| 
								 | 
							
											paused = false;
							 | 
						||
| 
								 | 
							
											startTime = MobileWebAudio._context.currentTime - pauseTime;
							 | 
						||
| 
								 | 
							
											source.start(0, pauseTime);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else {
							 | 
						||
| 
								 | 
							
											startTime = MobileWebAudio._context.currentTime;
							 | 
						||
| 
								 | 
							
											source.start();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function pause(): Void {
							 | 
						||
| 
								 | 
							
										final wasStopped = paused || stopped;
							 | 
						||
| 
								 | 
							
										pauseTime = MobileWebAudio._context.currentTime - startTime;
							 | 
						||
| 
								 | 
							
										paused = true;
							 | 
						||
| 
								 | 
							
										if (wasStopped)
							 | 
						||
| 
								 | 
							
											return;
							 | 
						||
| 
								 | 
							
										source.stop();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function stop(): Void {
							 | 
						||
| 
								 | 
							
										final wasStopped = paused || stopped;
							 | 
						||
| 
								 | 
							
										paused = false;
							 | 
						||
| 
								 | 
							
										stopped = true;
							 | 
						||
| 
								 | 
							
										if (wasStopped)
							 | 
						||
| 
								 | 
							
											return;
							 | 
						||
| 
								 | 
							
										source.stop();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var length(get, never): Float; // Seconds
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function get_length(): Float {
							 | 
						||
| 
								 | 
							
										return source.buffer.duration;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var position(get, set): Float; // Seconds
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function get_position(): Float {
							 | 
						||
| 
								 | 
							
										if (stopped)
							 | 
						||
| 
								 | 
							
											return length;
							 | 
						||
| 
								 | 
							
										if (paused)
							 | 
						||
| 
								 | 
							
											return pauseTime;
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											return MobileWebAudio._context.currentTime - startTime;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function set_position(value: Float): Float {
							 | 
						||
| 
								 | 
							
										return value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var volume(get, set): Float;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function get_volume(): Float {
							 | 
						||
| 
								 | 
							
										return gain.gain.value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function set_volume(value: Float): Float {
							 | 
						||
| 
								 | 
							
										return gain.gain.value = value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var finished(get, never): Bool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function get_finished(): Bool {
							 | 
						||
| 
								 | 
							
										return stopped;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |