forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
105
Kha/Backends/HTML5/kha/js/MobileWebAudioChannel.hx
Normal file
105
Kha/Backends/HTML5/kha/js/MobileWebAudioChannel.hx
Normal file
@ -0,0 +1,105 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user