source: gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/sinks/workers.js@ 28388

Last change on this file since 28388 was 28388, checked in by davidb, 11 years ago

Set of JS, CSS, PNG etc web resources to support a mixture of audio player/document display capabilities

File size: 2.6 KB
Line 
1(function (Sink) {
2
3/**
4 * A Sink class for the Media Streams Processing API and/or Web Audio API in a Web Worker.
5*/
6
7Sink.sinks('worker', function () {
8 var self = this,
9 global = (function(){ return this; }()),
10 soundData = null,
11 outBuffer = null,
12 zeroBuffer = null;
13 self.start.apply(self, arguments);
14
15 // Let's see if we're in a worker.
16
17 importScripts();
18
19 function mspBufferFill (e) {
20 if (!self.isReady) {
21 self.initMSP(e);
22 }
23
24 self.ready();
25
26 var channelCount = self.channelCount,
27 l = e.audioLength,
28 n, i;
29
30 soundData = soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
31 outBuffer = outBuffer && outBuffer.length === soundData.length ? outBuffer : new Float32Array(l * channelCount);
32 zeroBuffer = zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
33
34 soundData.set(zeroBuffer);
35 outBuffer.set(zeroBuffer);
36
37 self.process(soundData, self.channelCount);
38
39 for (n=0; n<channelCount; n++) {
40 for (i=0; i<l; i++) {
41 outBuffer[n * e.audioLength + i] = soundData[n + i * channelCount];
42 }
43 }
44
45 e.writeAudio(outBuffer);
46 }
47
48 function waBufferFill(e) {
49 if (!self.isReady) {
50 self.initWA(e);
51 }
52
53 self.ready();
54
55 var outputBuffer = e.outputBuffer,
56 channelCount = outputBuffer.numberOfChannels,
57 i, n, l = outputBuffer.length,
58 size = outputBuffer.size,
59 channels = new Array(channelCount),
60 tail;
61
62 soundData = soundData && soundData.length === l * channelCount ? soundData : new Float32Array(l * channelCount);
63 zeroBuffer = zeroBuffer && zeroBuffer.length === soundData.length ? zeroBuffer : new Float32Array(l * channelCount);
64 soundData.set(zeroBuffer);
65
66 for (i=0; i<channelCount; i++) {
67 channels[i] = outputBuffer.getChannelData(i);
68 }
69
70 self.process(soundData, self.channelCount);
71
72 for (i=0; i<l; i++) {
73 for (n=0; n < channelCount; n++) {
74 channels[n][i] = soundData[i * self.channelCount + n];
75 }
76 }
77 }
78
79 global.onprocessmedia = mspBufferFill;
80 global.onaudioprocess = waBufferFill;
81
82 self._mspBufferFill = mspBufferFill;
83 self._waBufferFill = waBufferFill;
84
85}, {
86 ready: false,
87
88 initMSP: function (e) {
89 this.channelCount = e.audioChannels;
90 this.sampleRate = e.audioSampleRate;
91 this.bufferSize = e.audioLength * this.channelCount;
92 this.ready = true;
93 this.emit('ready', []);
94 },
95
96 initWA: function (e) {
97 var b = e.outputBuffer;
98 this.channelCount = b.numberOfChannels;
99 this.sampleRate = b.sampleRate;
100 this.bufferSize = b.length * this.channelCount;
101 this.ready = true;
102 this.emit('ready', []);
103 }
104});
105
106}(this.Sink));
Note: See TracBrowser for help on using the repository browser.