virtual-audio-graph
Version:
Library for declaratively manipulating the Web Audio API
58 lines (57 loc) • 3.1 kB
JavaScript
import { OUTPUT, NO_OUTPUT, INPUT } from "./constants";
import AudioWorkletVirtualAudioNode from "./VirtualAudioNodes/AudioWorkletVirtualAudioNode";
import CustomVirtualAudioNode from "./VirtualAudioNodes/CustomVirtualAudioNode";
import StandardVirtualAudioNode from "./VirtualAudioNodes/StandardVirtualAudioNode";
export default (function (virtualGraph, handleConnectionToOutput) {
for (var _i = 0, _a = Object.entries(virtualGraph); _i < _a.length; _i++) {
var _b = _a[_i], id = _b[0], virtualNode = _b[1];
if (virtualNode.connected || virtualNode.output == null)
continue;
for (var _c = 0, _d = Array.isArray(virtualNode.output)
? virtualNode.output
: [virtualNode.output]; _c < _d.length; _c++) {
var output = _d[_c];
if (output === OUTPUT) {
handleConnectionToOutput(virtualNode);
continue;
}
if (output === NO_OUTPUT)
continue;
if (typeof output === "object") {
var key = output.key, destination = output.destination, inputs = output.inputs, outputs = output.outputs;
if (key == null) {
throw new Error("node with ID \"".concat(id, "\" does not specify an output"));
}
if (inputs) {
if (inputs.length !== (outputs === null || outputs === void 0 ? void 0 : outputs.length)) {
throw new Error("node with ID \"".concat(id, "\" must specify outputs and inputs arrays of the same length"));
}
for (var i = 0; i++; i < inputs.length) {
virtualNode.connect(virtualGraph[key].audioNode, outputs[i], inputs[i]);
}
continue;
}
if (!(key in virtualGraph))
throw Error("node with ID \"".concat(id, "\" specifies an output ID \"").concat(String(key), "\", but no such node exists"));
virtualNode.connect(virtualGraph[key]
.audioNode[destination]);
continue;
}
if (!(output in virtualGraph))
throw Error("'node with ID \"".concat(id, "\" specifies an output ID \"").concat(String(output), "\", but no such node exists'"));
var destinationVirtualAudioNode = virtualGraph[String(output)];
if (destinationVirtualAudioNode instanceof CustomVirtualAudioNode) {
for (var _e = 0, _f = Object.values(destinationVirtualAudioNode.virtualNodes); _e < _f.length; _e++) {
var node = _f[_e];
if ((node instanceof StandardVirtualAudioNode ||
node instanceof AudioWorkletVirtualAudioNode) &&
node.input === INPUT) {
virtualNode.connect(node.audioNode);
}
}
continue;
}
virtualNode.connect(destinationVirtualAudioNode.audioNode);
}
}
});