Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mamayaya1
GitHub Repository: mamayaya1/game
Path: blob/main/projects/HexGL/bkcore/Audio.js
4626 views
1
var bkcore = bkcore || {};
2
3
bkcore.Audio = {};
4
bkcore.Audio.sounds = {};
5
6
bkcore.Audio.init = function(){
7
if(window.AudioContext||window.webkitAudioContext){
8
bkcore.Audio._ctx = new (window.AudioContext||window.webkitAudioContext)();
9
bkcore.Audio._panner = bkcore.Audio._ctx.createPanner();
10
bkcore.Audio._panner.connect(bkcore.Audio._ctx.destination);
11
}
12
else {
13
bkcore.Audio._ctx = null;
14
}
15
16
bkcore.Audio.posMultipler = 1.5;
17
};
18
19
bkcore.Audio.init();
20
21
bkcore.Audio.addSound = function(src, id, loop, callback, usePanner){
22
var ctx = bkcore.Audio._ctx;
23
var audio = new Audio();
24
25
if(ctx){
26
var audio = { src: null, gainNode: null, bufferNode: null, loop: loop };
27
var xhr = new XMLHttpRequest();
28
xhr.responseType = 'arraybuffer';
29
30
xhr.onload = function(){
31
ctx.decodeAudioData(xhr.response, function(b){
32
// Create Gain Node
33
var gainNode = ctx.createGain();
34
35
if(usePanner === true){
36
gainNode.connect(bkcore.Audio._panner);
37
}
38
else {
39
gainNode.connect(ctx.destination);
40
}
41
42
// Add the audio source
43
audio.src = b;
44
45
//Remember the gain node
46
audio.gainNode = gainNode;
47
48
callback();
49
}, function(e){
50
console.error('Audio decode failed!', e);
51
});
52
};
53
54
xhr.open('GET', src, true);
55
xhr.send(null);
56
}
57
else {
58
// Workaround for old Safari
59
audio.addEventListener('canplay', function(){
60
audio.pause();
61
audio.currentTime = 0;
62
63
callback();
64
}, false);
65
66
audio.autoplay = true;
67
audio.loop = loop;
68
audio.src = src;
69
}
70
71
bkcore.Audio.sounds[id] = audio;
72
};
73
74
bkcore.Audio.play = function(id){
75
var ctx = bkcore.Audio._ctx;
76
77
if(ctx){
78
var sound = ctx.createBufferSource();
79
sound.connect(bkcore.Audio.sounds[id].gainNode);
80
81
sound.buffer = bkcore.Audio.sounds[id].src;
82
sound.loop = bkcore.Audio.sounds[id].loop;
83
84
bkcore.Audio.sounds[id].gainNode.gain.value = 1;
85
bkcore.Audio.sounds[id].bufferNode = sound;
86
87
sound.start ? sound.start(0) : sound.noteOn(0);
88
}
89
else {
90
if(bkcore.Audio.sounds[id].currentTime > 0){
91
bkcore.Audio.sounds[id].pause();
92
bkcore.Audio.sounds[id].currentTime = 0;
93
}
94
95
bkcore.Audio.sounds[id].play();
96
}
97
};
98
99
bkcore.Audio.stop = function(id){
100
var ctx = bkcore.Audio._ctx;
101
102
if(ctx){
103
if(bkcore.Audio.sounds[id].bufferNode !== null){
104
var bufferNode = bkcore.Audio.sounds[id].bufferNode;
105
bufferNode.stop ? bufferNode.stop(ctx.currentTime) : bufferNode.noteOff(ctx.currentTime);
106
}
107
}
108
else {
109
bkcore.Audio.sounds[id].pause();
110
bkcore.Audio.sounds[id].currentTime = 0;
111
}
112
};
113
114
bkcore.Audio.volume = function(id, volume){
115
var ctx = bkcore.Audio._ctx;
116
117
if(ctx){
118
bkcore.Audio.sounds[id].gainNode.gain.value = volume;
119
}
120
else {
121
bkcore.Audio.sounds[id].volume = volume;
122
}
123
};
124
125
bkcore.Audio.setListenerPos = function(vec){
126
if(bkcore.Audio._ctx){
127
var panner = bkcore.Audio._panner;
128
var vec2 = vec.normalize();
129
panner.setPosition(
130
vec2.x * bkcore.Audio.posMultipler,
131
vec2.y * bkcore.Audio.posMultipler,
132
vec2.z * bkcore.Audio.posMultipler
133
);
134
}
135
};
136
137
bkcore.Audio.setListenerVelocity = function(vec){
138
if(bkcore.Audio._ctx){
139
var panner = bkcore.Audio._panner;
140
//panner.setVelocity(vec.x, vec.y, vec.z);
141
}
142
};
143