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