Skip to content

Instantly share code, notes, and snippets.

@beaufortfrancois
Last active September 23, 2023 01:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save beaufortfrancois/4d90c89c5371594dc4c0ac81c3b8dd73 to your computer and use it in GitHub Desktop.
Save beaufortfrancois/4d90c89c5371594dc4c0ac81c3b8dd73 to your computer and use it in GitHub Desktop.
Web Audio: Migrate from ScriptProcessor to AudioWorklet

Web Audio: Migrate from ScriptProcessor to AudioWorklet

// script.js
button.onclick = async () => {
  const microphoneStream = await navigator.mediaDevices.getUserMedia({
    audio: true,
  });
  const context = new AudioContext();
  const source = context.createMediaStreamSource(microphoneStream);

  const scriptProcessor = context.createScriptProcessor(1024);
  scriptProcessor.onaudioprocess = ({ inputBuffer, outputBuffer }) => {
    const inputData = inputBuffer.getChannelData(0);
    outputBuffer.copyToChannel(inputData, 0);
  };

  source.connect(scriptProcessor).connect(context.destination);
};
// script.js
button.onclick = async () => {
  const microphoneStream = await navigator.mediaDevices.getUserMedia({
    audio: true,
  });
  const context = new AudioContext();
  const source = context.createMediaStreamSource(microphoneStream);

  await context.audioWorklet.addModule("worklet-processor.js");
  const worklet = new AudioWorkletNode(context, "worklet-processor");

  source.connect(worklet).connect(context.destination);
};
// worklet-processor.js
class WorkletProcessor extends AudioWorkletProcessor {
  process([input], [output]) {
    input[0].forEach((sample, i) => output[0][i] = sample);
    return true;
  }
}

registerProcessor("worklet-processor", WorkletProcessor);

Diff

-  const scriptProcessor = context.createScriptProcessor(1024);
-  scriptProcessor.onaudioprocess = ({ inputBuffer, outputBuffer }) => {
-    const inputData = inputBuffer.getChannelData(0);
-    outputBuffer.copyToChannel(inputData, 0);
-  };
+  await context.audioWorklet.addModule("worklet-processor.js");
+  const worklet = new AudioWorkletNode(context, "worklet-processor");
 
-  source.connect(scriptProcessor).connect(context.destination);
+  source.connect(worklet).connect(context.destination);
+// worklet-processor.js
+class WorkletProcessor extends AudioWorkletProcessor {
+  process([input], [output]) {
+    input[0].forEach((sample, i) => output[0][i] = sample);
+    return true;
+  }
+}
+
+registerProcessor("worklet-processor", WorkletProcessor);

Resources

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment