Skip to content

Commit d79f763

Browse files
committed
Replace ScriptProcessorNode in p5.SoundFile with AudioWorkletNode
1 parent e03ab3d commit d79f763

File tree

9 files changed

+143
-89
lines changed

9 files changed

+143
-89
lines changed

lib/p5.sound.js

Lines changed: 82 additions & 66 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/p5.sound.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/p5.sound.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/p5.sound.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 21 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/audioWorklet/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const p5sound = require('master');
22
const moduleSources = [
3-
require('raw-loader!./recorderProcessor').default
3+
require('raw-loader!./recorderProcessor').default,
4+
require('raw-loader!./soundFileProcessor').default
45
];
56
const ac = p5sound.audiocontext;
67

src/audioWorklet/processorNames.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
module.exports = {
2-
recorderProcessor: 'recorder-processor'
2+
recorderProcessor: 'recorder-processor',
3+
soundFileProcessor: 'sound-file-processor'
34
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// import processor name via preval.require so that it's available as a value at compile time
2+
const processorNames = preval.require('./processorNames');
3+
4+
class SoundFileProcessor extends AudioWorkletProcessor {
5+
process(inputs) {
6+
const input = inputs[0];
7+
const inputChannel = input[0];
8+
const position = inputChannel[inputChannel.length - 1] || 0;
9+
10+
this.port.postMessage({ name: 'position', position: position });
11+
12+
return true;
13+
}
14+
}
15+
16+
registerProcessor(processorNames.soundFileProcessor, SoundFileProcessor);

src/soundfile.js

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ define(function (require) {
77
var ac = p5sound.audiocontext;
88
var midiToFreq = require('helpers').midiToFreq;
99
var convertToWav = require('helpers').convertToWav;
10+
var processorNames = require('./audioWorklet/processorNames');
1011

1112
/**
1213
* <p>SoundFile object with a path to a file.</p>
@@ -94,7 +95,7 @@ define(function (require) {
9495
// position of the most recently played sample
9596
this._lastPos = 0;
9697
this._counterNode = null;
97-
this._scopeNode = null;
98+
this._workletNode = null;
9899

99100
// array of sources so that they can all be stopped!
100101
this.bufferSourceNodes = [];
@@ -1238,23 +1239,28 @@ define(function (require) {
12381239
var now = ac.currentTime;
12391240
var cNode = ac.createBufferSource();
12401241

1241-
// dispose of scope node if it already exists
1242-
if (self._scopeNode) {
1243-
self._scopeNode.disconnect();
1244-
self._scopeNode.removeEventListener('audioprocess', self._onAudioProcess);
1245-
delete self._scopeNode;
1242+
// dispose of worklet node if it already exists
1243+
if (self._workletNode) {
1244+
self._workletNode.disconnect();
1245+
delete self._workletNode;
12461246
}
1247-
self._scopeNode = ac.createScriptProcessor( 256, 1, 1 );
1247+
self._workletNode = new AudioWorkletNode(ac, processorNames.soundFileProcessor);
1248+
self._workletNode.port.onmessage = function(event) {
1249+
if (event.data.name === 'position') {
1250+
this._lastPos = event.data.position;
1251+
1252+
// do any callbacks that have been scheduled
1253+
this._onTimeUpdate(self._lastPos);
1254+
}
1255+
}.bind(self);
12481256

12491257
// create counter buffer of the same length as self.buffer
12501258
cNode.buffer = _createCounterBuffer( self.buffer );
12511259

12521260
cNode.playbackRate.setValueAtTime(self.playbackRate, now);
12531261

1254-
cNode.connect( self._scopeNode );
1255-
self._scopeNode.connect( p5.soundOut._silentNode );
1256-
1257-
self._scopeNode.addEventListener('audioprocess', self._onAudioProcess);
1262+
cNode.connect(self._workletNode);
1263+
self._workletNode.connect(p5.soundOut._silentNode);
12581264

12591265
return cNode;
12601266
};

0 commit comments

Comments
 (0)