/
audio-post.js
80 lines (63 loc) · 1.91 KB
/
audio-post.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var audio_port = null;
var audio_call = 0;
var Init = Module.cwrap('Init', 'number', ['number']);
var Proc = Module.cwrap('Proc', 'number', []);
var Call = Module.cwrap('Call', null, ['number','number']);
var XOgg = Module.cwrap('XOgg', null, ['number','number','number']);
class AsciickerAudio extends AudioWorkletProcessor
{
constructor (...args)
{
super(...args);
audio_port = this.port;
audio_port.onmessage = (e) =>
{
if (e.data.length <= 4096)
{
Module.HEAPU8.set(e.data, audio_call)
Call(audio_call, e.data.length);
}
else
{
let addr = Module._malloc(e.data.length);
Module.HEAPU8.set(e.data, addr)
Call(addr, e.data.length);
Module._free(addr);
}
}
const c = args[0].processorOptions;
let max_size = 0;
let num = c.length;
for (const s in c)
max_size = max_size < c[s].length ? c[s].length : max_size;
audio_call = Init(num);
let data = 0;
if (max_size)
data = Module._malloc(max_size);
for (const s in c)
{
if (c[s].length)
Module.HEAPU8.set(c[s], data);
XOgg(s, data, c[s].length);
}
if (max_size)
Module._free(data);
//audio_port.postMessage("Audio Initialized ");
}
process (inputs, outputs, parameters)
{
let left = outputs[0][0];
let right = outputs[0][1];
let len = 128;
let ptr = Proc();
let heap = Module.HEAP16;
const norm = 1.0/32767.0;
for (let i=0,j=ptr>>1; i<len; i++,j+=2)
{
left[i] = heap[j+0] * norm;
right[i] = heap[j+1] * norm;
}
return true;
}
}
registerProcessor('asciicker-audio', AsciickerAudio);