Class Playback

The base interface for any sound-producing entity, including individual sounds, groups, and playbacks. BaseSound

Hierarchy

  • BasePlayback
    • Playback

Implements

Constructors

  • Creates an instance of the Playback class.

    Parameters

    Returns Playback

    Throws

    Throws an error if an invalid pan type is provided.

Properties

_fadeInConfig?: {
    duration: number;
    perLoop: boolean;
    targetVolume: number;
    type: FadeType;
}

Type declaration

  • duration: number
  • perLoop: boolean
  • targetVolume: number
  • type: FadeType
_fadeOutConfig?: {
    duration: number;
    type: FadeType;
}

Type declaration

_fadeTimeout?: Timeout
_filters: BiquadFilterNode[] = []
_isFading: boolean = false
_loopEndCallback?: (() => void)

Type declaration

    • (): void
    • Returns void

_mediaPlayPromise?: Promise<void>

Promise that tracks an in-flight media-element .play() settlement. Set when the media element's play() returns a pending promise; cleared once that promise settles. Used by loopEnded to avoid racing source-state mutations (seek/play) against the deferred state transition driven by this promise.

_offset: number = 0
_panType: PanType = "stereo"
_pitchFactor: number = 1

Desired pitch-shift factor (1 = no shift, 2 = +1 octave, 0.5 = -1 octave). Stored even before the worklet node exists so a value set on a cleaned-up / not-yet-built playback is honoured once setPitchShift builds the node.

_pitchShiftNode?: AudioWorkletNode

The phase-vocoder AudioWorkletNode (Laroche & Dolson 1999 peak-based pitch-shift with Identity Phase-Locking) spliced into this playback's chain between the filter tail and gainNode. undefined until setPitchShift is first called with a factor != 1; lazily built via cacophony.createPhaseVocoderNode. refreshFilters re-inserts it on every chain rebuild so it is never bypassed.

_playbackRate: number = 1
_playing: boolean = false
_sendGains: Map<Bus, GainNode> = ...

Per-playback send-gain allocations: bus → allocated GainNode. Sounds record send intent in Sound._sends (value-only), and the actual GainNode lifecycle is owned here — allocated at preplay or Sound.routeTo(bus, gain), torn down in cleanup.

Iterable Map (not WeakMap) so cleanup can walk every send and call disconnect() on it; relying on GC for disconnect would leave the bus graph holding the allocation indirectly.

_startTime: number = 0
_state: PlaybackState = "unplayed"
buffer?: AudioBuffer
context: BaseContext
currentLoop: number = 0
eventEmitter: TypedEventEmitter<PlaybackEvents> = ...
gainNode?: GainNode
loopCount: LoopCount = 0
origin: Sound
source?: SourceNode

Accessors

  • get duration(): number
  • Gets the duration of the audio in seconds.

    Returns number

    The duration of the audio or NaN if the duration is unknown.

    Throws

    Throws an error if the sound has been cleaned up.

  • get isFading(): boolean
  • Whether a fade is currently in progress.

    Returns boolean

  • get outputNode(): GainNode
  • Gets the output node of this playback's audio graph. This is the final node in the internal chain before connection to destination. Use this to manually wire the playback into custom audio graphs.

    Returns GainNode

    The gain node that serves as the output of this playback.

    Throws

    Throws an error if the playback has been cleaned up.

    Example

    // Manual routing through custom effects
    const playback = sound.play()[0];
    playback.disconnect(); // Disconnect from default destination
    playback.connect(reverbNode).connect(context.destination);
  • get playbackRate(): number
  • Gets the current playback rate of the audio.

    Returns number

  • set playbackRate(rate): void
  • Sets the playback rate of the audio.

    Parameters

    • rate: number

    Returns void

    Throws

    Throws an error if the sound has been cleaned up or if the source type is unsupported.

  • get position(): Position
  • Gets the position of the audio source in 3D space (HRTF panning only).

    Returns Position

    The [x, y, z] coordinates of the audio source.

    Throws

    Throws an error if the sound has been cleaned up or if HRTF panning is not used.

  • set position(position): void
  • Sets the position of the audio source in 3D space (HRTF panning only).

    Parameters

    • position: Position

      The [x, y, z] coordinates of the audio source.

    Returns void

    Throws

    Throws an error if the sound has been cleaned up or if HRTF panning is not used.

  • set sourceLoop(loop): void
  • Sets whether the audio source should loop.

    Parameters

    • loop: boolean

    Returns void

    Throws

    Throws an error if the sound has been cleaned up.

  • get stereoPan(): null | number
  • Gets the stereo panning value.

    Returns null | number

    The current stereo pan value, or null if stereo panning is not applicable.

  • set stereoPan(value): void
  • Sets the stereo panning value.

    Parameters

    • value: number

      The stereo pan value to set, between -1 (left) and 1 (right).

    Returns void

    Throws

    Throws an error if stereo panning is not available, if the sound has been cleaned up, or if the value is out of bounds.

  • get threeDOptions(): ThreeDOptions
  • Gets the 3D audio options if HRTF panning is used.

    Returns ThreeDOptions

    The current 3D audio options (HRTF variant).

    Throws

    Throws an error if the sound has been cleaned up or if HRTF panning is not used.

  • set threeDOptions(options): void
  • Sets the 3D audio options for HRTF panning. Accepts either a full ThreeDOptions value or a partial HRTF override. Any field omitted from the input is left at its current value on the underlying PannerNode.

    Parameters

    Returns void

    Throws

    Throws an error if the sound has been cleaned up or if HRTF panning is not used.

Methods

  • Cancels any in-progress fade, emitting fadeCancel if a fade was active.

    Returns void

  • Cleans up resources used by the Playback instance. This method should be called when the audio is no longer needed to free up resources.

    Returns void

  • Creates a clone of the current Playback instance with optional overrides for certain properties. This method allows for the creation of a new Playback instance that shares the same audio context and source node but can have different settings such as loop count or pan type.

    Parameters

    • overrides: Partial<PlaybackCloneOverrides> = {}

    Returns Playback

    Throws

    Throws an error if the sound has been cleaned up.

  • Configures a fade-out to be applied when the playback ends naturally (last loop iteration).

    Parameters

    • duration: number

      The fade-out duration in milliseconds.

    • Optional type: FadeType

      The fade curve type. Defaults to "linear".

    Returns void

  • Connects this playback's output to an AudioNode or AudioParam. Follows the Web Audio API connection pattern.

    Parameters

    Returns AudioNode

    The destination node (for chaining).

    Throws

    Throws an error if the playback has been cleaned up.

    Example

    // Chain multiple effects
    playback.connect(delay).connect(reverb).connect(context.destination);
  • Disconnects this playback's output from a specific destination or from all destinations.

    Parameters

    • Optional destination: AudioParam | AudioNode

      Optional specific destination to disconnect from. If omitted, disconnects from all destinations.

    Returns void

    Throws

    Throws an error if the playback has been cleaned up.

    Example

    // Disconnect from all
    playback.disconnect();

    Example

    // Disconnect from specific node
    playback.disconnect(reverbNode);
  • Type Parameters

    • K extends (keyof BaseAudioEvents) | "seek"

    Parameters

    Returns void

  • Type Parameters

    • K extends (keyof BaseAudioEvents) | "seek"

    Parameters

    Returns Promise<void>

  • Fades in from silence to the current volume. Optionally stores config to re-trigger the fade on each loop iteration.

    Parameters

    • duration: number

      The fade duration in milliseconds.

    • Optional type: FadeType

      The fade curve type. Defaults to "linear".

    • Optional options: {
          perLoop?: boolean;
      }

      Optional. Set perLoop: true to re-trigger fadeIn on each loop.

      • Optional perLoop?: boolean

    Returns Promise<void>

    Resolves when the fade completes.

  • Fades out from the current volume to silence.

    Parameters

    • duration: number

      The fade duration in milliseconds.

    • Optional type: FadeType

      The fade curve type. Defaults to "linear".

    Returns Promise<void>

    Resolves when the fade completes.

  • Fades the volume to a target value, emitting fadeStart and fadeEnd events.

    Parameters

    • value: number
    • duration: number
    • type: FadeType = "linear"

    Returns Promise<void>

  • Sets or gets the loop count for the audio.

    Parameters

    • Optional loopCount: LoopCount

      The number of times the audio should loop. 'infinite' for endless looping.

    Returns LoopCount

    The loop count if no parameter is provided.

    Throws

    Throws an error if the sound has been cleaned up or if the source type is unsupported.

  • Handles the loop event when the audio ends. This method is bound to the 'onended' event of the audio source. It manages looping logic and restarts playback if necessary.

    Returns void

  • Remove event listener.

    Type Parameters

    • K extends (keyof BaseAudioEvents) | "seek"

    Parameters

    • event: K
    • listener: ((data) => void)

    Returns void

  • Register event listener.

    Type Parameters

    • K extends (keyof BaseAudioEvents) | "seek"

    Parameters

    • event: K
    • listener: ((data) => void)

    Returns (() => void)

    Cleanup function

      • (): void
      • Returns void

  • Starts playing the audio.

    Returns [Playback]

    Returns the instance of the Playback class for chaining.

    Throws

    Throws an error if the sound has been cleaned up.

  • Refreshes the audio filters by re-applying them to the audio signal chain. This method is called internally whenever filters are added or removed.

    Returns void

    Throws

    Throws an error if the sound has been cleaned up.

  • Sets the pitch-shift factor for this playback, resurrecting the dormant phase-vocoder worklet (Jean Laroche & Mark Dolson, "New Phase-Vocoder Techniques for Pitch-Shifting, Harmonizing and Other Exotic Effects", 1999 IEEE WASPAA — peak-based pitch shift with Identity Phase-Locking).

    On first use (factor !== 1) the phase-vocoder AudioWorkletNode is built via cacophony.createPhaseVocoderNode and spliced into this playback's graph at the refreshFilters seam (panner → [filters] → pitchShiftNode → gainNode). The factor is forwarded to the node's pitchFactor AudioParam (1 = no shift, 2 = +1 octave, 0.5 = -1 octave).

    Parameters

    • factor: number

      Pitch multiplier (> 0).

    Returns Promise<void>

    Throws

    if the playback has been cleaned up or factor <= 0.

  • Fades out then stops the playback.

    Parameters

    • duration: number

      The fade-out duration in milliseconds.

    • Optional type: FadeType

      The fade curve type. Defaults to "linear".

    Returns Promise<void>

    Resolves when the fade completes and playback is stopped.