-
Notifications
You must be signed in to change notification settings - Fork 0
/
audio-worklet.js
52 lines (47 loc) · 1.4 KB
/
audio-worklet.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class MyAudioWorklet extends AudioWorkletProcessor {
constructor() {
super()
this.FIFO_CAP = 2048*2
this.fifo = new Int16Array(this.FIFO_CAP)
this.fifoHead = 0
this.fifoLen = 0
this.port.onmessage = (e) => {
var buf = e.data
//console.log(buf)
for (var i = 0; i < buf.length; i+=2) {
if (this.fifoLen + 2 > this.FIFO_CAP) {
//console.log("overflow")
break
}
this.fifoEnqueue(buf[i])
this.fifoEnqueue(buf[i + 1])
}
}
}
fifoDequeue() {
var ret = this.fifo[this.fifoHead]
this.fifoHead += 1
this.fifoHead %= this.FIFO_CAP
this.fifoLen -= 1
return ret
}
fifoEnqueue(v) {
this.fifo[(this.fifoHead + this.fifoLen) % this.FIFO_CAP] = v
this.fifoLen += 1
}
process(inputs, outputs, parameters) {
const output = outputs[0]
const chan0 = output[0]
const chan1 = output[1]
for (var i = 0; i < chan0.length; i++) {
if (this.fifoLen < 2) {
//console.log("underflow")
break
}
chan0[i] = this.fifoDequeue() / 32768.0
chan1[i] = this.fifoDequeue() / 32768.0
}
return true
}
}
registerProcessor('my-worklet', MyAudioWorklet)