UNPKG

virtual-audio-graph

Version:

Library for declaratively manipulating the Web Audio API

52 lines (43 loc) 1.76 kB
import connectAudioNodes from "./connectAudioNodes"; import { IVirtualAudioNodeGraph, VirtualAudioNode } from "./types"; import { equals } from "./utils"; const disconnectParents = ( virtualGraph: IVirtualAudioNodeGraph, virtualNode: VirtualAudioNode, ): void => { for (const node of Object.values(virtualGraph)) node.disconnect(virtualNode); }; export default function updateVirtualNodeGraph( currentGraph: IVirtualAudioNodeGraph, newGraph: IVirtualAudioNodeGraph, audioContext: AudioContext | OfflineAudioContext, connectCallback: (vNode: VirtualAudioNode) => void = () => {}, ): void { for (const [id, virtualAudioNode] of Object.entries(currentGraph)) { if (newGraph.hasOwnProperty(id)) continue; virtualAudioNode.disconnectAndDestroy(); disconnectParents(currentGraph, virtualAudioNode); delete currentGraph[id]; } for (const key of Object.keys(newGraph)) { const newVirtualAudioNode = newGraph[key]; const virtualAudioNode = currentGraph[key]; if (virtualAudioNode == null) { currentGraph[key] = newVirtualAudioNode.initialize(audioContext); continue; } if (virtualAudioNode.cannotUpdateInPlace(newVirtualAudioNode)) { virtualAudioNode.disconnectAndDestroy(); disconnectParents(currentGraph, virtualAudioNode); currentGraph[key] = newVirtualAudioNode.initialize(audioContext); continue; } if (!equals(newVirtualAudioNode.output, virtualAudioNode.output)) { virtualAudioNode.disconnect(); disconnectParents(currentGraph, virtualAudioNode); virtualAudioNode.output = newVirtualAudioNode.output; } virtualAudioNode.update(newVirtualAudioNode.params, audioContext); } connectAudioNodes(currentGraph, connectCallback); }