Skip to main content
Version: Next

WorkletAudioContext

warning

Requires react-native-audio-worklets, react-native-worklets >= 0.10.0, and react-native-audio-api >= 1.0.0. See the Worklets introduction for installation.

WorkletAudioContext inherits from BaseAudioContext. It runs an audio-processing graph on a dedicated background thread without routing audio to the device speakers.

Use it when you need a self-contained graph for worklet-based analysis or processing — for example, driving a Reanimated visualizer from a WorkletNode while playback happens in a separate AudioContext.

When to use it

ContextOutputRender driverTypical use
AudioContextDevice speakers / headphonesSystem audio callbackPlayback, recording, effects
WorkletAudioContextInternal sink (discarded)Software timer on a worker threadWorklet visualization, isolated processing
OfflineAudioContextAudioBufferRenders as fast as possibleOffline bounce / export

Unlike OfflineAudioContext, WorkletAudioContext advances in real time at the context sample rate. Unlike AudioContext, it does not compete for the hardware audio session.

tip

You can attach worklet nodes to any BaseAudioContext. WorkletAudioContext is the recommended choice when the graph exists only to feed worklet callbacks and does not need speaker output.

Constructor

import 'react-native-audio-worklets';
import { WorkletAudioContext } from 'react-native-audio-worklets';

const context = new WorkletAudioContext();
constructor(options?: WorkletAudioContextOptions)

WorkletAudioContextOptions

ParameterTypeDefault
sampleRate
Optional
numberAudioManager.getDevicePreferredSampleRate()Sample rate for all nodes in this context.

Errors

Error typeDescription
NotSupportedErrorreact-native-audio-worklets is not installed, or sampleRate is outside the supported range [3000, 768000].

Example

A common pattern is a dedicated visualization graph: route input into a WorkletNode, connect the node to destination so the graph stays active, and call resume() to start rendering.

import { useEffect, useRef } from 'react';
import { useSharedValue } from 'react-native-reanimated';
import { WorkletAudioContext, WorkletNode } from 'react-native-audio-worklets';

function Meter() {
const level = useSharedValue(0);
const contextRef = useRef<WorkletAudioContext | null>(null);

useEffect(() => {
const context = new WorkletAudioContext();
const meter = new WorkletNode(context, (audioData) => {
'worklet';

let peak = 0;
for (let i = 0; i < audioData.length; i++) {
peak = Math.max(peak, Math.abs(audioData[i]!));
}

level.value = peak;
});

contextRef.current = context;

const start = async () => {
await context.resume();
meter.connect(context.destination);
// Connect your input source to `meter` here.
};

start();

return () => {
meter.disconnect();
context.close().catch(() => {});
contextRef.current = null;
};
}, [level]);

return null;
}

Properties

WorkletAudioContext does not define any additional properties. Inherits all properties from BaseAudioContext.

Methods

Inherits all node-factory methods from BaseAudioContext (createGain, createOscillator, createAnalyser, and so on).

It does not provide AudioContext.createMediaElementSource.

close

Stops the render thread and releases context resources. Safe to call multiple times.

Returns Promise<void>.

resume

Starts (or resumes) real-time graph rendering on the background thread. The context is created in the suspended state — call resume() before audio flows through the graph.

Returns Promise<void>.

suspend

Pauses graph rendering while keeping the context alive. currentTime stops advancing until resume() is called again.

Returns Promise<void>.

Remarks

Lifecycle

  1. new WorkletAudioContext() — context starts suspended.
  2. Build the graph and connect nodes (often ending at context.destination).
  3. await context.resume() — background thread begins processing render quanta.
  4. await context.suspend() — pause without tearing down the graph.
  5. await context.close() — stop the thread and close the context.

destination

Every graph needs a sink. Connecting your final node to context.destination keeps the render loop pulling audio through the graph. Output written to destination is not played on the device — it is consumed internally.

Sample rate

Match the sampleRate of any external audio you route into this context (for example, recorded microphone data). A mismatch causes resampling artifacts or incorrect timing in worklet callbacks.