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