Skip to content

Commit

Permalink
fix(CustomVirtualAudioNode): handle when startTime and stopTime chang…
Browse files Browse the repository at this point in the history
…e on child nodes

See #316 #316
  • Loading branch information
benji6 committed Jul 15, 2021
1 parent 84e5146 commit 06bc0fb
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 16 deletions.
10 changes: 2 additions & 8 deletions src/VirtualAudioGraph.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,7 @@ export default class VirtualAudioGraph {
continue;
}

if (
(newVirtualAudioNode.params && newVirtualAudioNode.params.startTime) !==
(virtualAudioNode.params && virtualAudioNode.params.startTime) ||
(newVirtualAudioNode.params && newVirtualAudioNode.params.stopTime) !==
(virtualAudioNode.params && virtualAudioNode.params.stopTime) ||
newVirtualAudioNode.node !== virtualAudioNode.node
) {
if (virtualAudioNode.cannotUpdateInPlace(newVirtualAudioNode)) {
virtualAudioNode.disconnectAndDestroy();
this.disconnectParents(virtualAudioNode);
this.virtualNodes[key] = newVirtualAudioNode.initialize(
Expand All @@ -59,7 +53,7 @@ export default class VirtualAudioGraph {
virtualAudioNode.output = newVirtualAudioNode.output;
}

virtualAudioNode.update(newVirtualAudioNode.params);
virtualAudioNode.update(newVirtualAudioNode.params, this.audioContext);
}

connectAudioNodes(this.virtualNodes, (vNode: VirtualAudioNode) =>
Expand Down
7 changes: 5 additions & 2 deletions src/VirtualAudioNodes/AudioWorkletVirtualAudioNode.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { IVirtualAudioNodeParams, Output, VirtualAudioNode } from "../types";
import { equals, values } from "../utils";
import CustomVirtualAudioNode from "./CustomVirtualAudioNode";
import VirtualAudioNodeBase from "./VirtualAudioNodeBase";

interface IWindow {
AudioWorkletNode?: any;
}

export default class AudioWorkletVirtualAudioNode {
export default class AudioWorkletVirtualAudioNode extends VirtualAudioNodeBase {
public audioNode: AudioNode;
public connected: boolean = false;
private connections: AudioNode[] = [];
Expand All @@ -16,7 +17,9 @@ export default class AudioWorkletVirtualAudioNode {
public output?: Output,
public params?: IVirtualAudioNodeParams,
public readonly input?: string
) {}
) {
super();
}

public connect(...connectArgs: any[]): void {
const { audioNode } = this;
Expand Down
38 changes: 33 additions & 5 deletions src/VirtualAudioNodes/CustomVirtualAudioNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import {
Output,
VirtualAudioNode,
} from "../types";
import { mapObj, values } from "../utils";
import { equals, mapObj, values } from "../utils";
import VirtualAudioNodeBase from "./VirtualAudioNodeBase";

export default class CustomVirtualAudioNode {
export default class CustomVirtualAudioNode extends VirtualAudioNodeBase {
public readonly audioNode: undefined = undefined;
public connected: boolean = false;
public params: IVirtualAudioNodeParams;
Expand All @@ -19,6 +20,7 @@ export default class CustomVirtualAudioNode {
public output?: Output,
params?: IVirtualAudioNodeParams
) {
super();
this.params = params || {};
}

Expand Down Expand Up @@ -68,14 +70,40 @@ export default class CustomVirtualAudioNode {
return this;
}

public update(params: IVirtualAudioNodeParams = {}): this {
public update(
params: IVirtualAudioNodeParams = {},
audioContext: AudioContext
): this {
const audioGraphParamsFactoryValues = values(this.node(params));
const keys = Object.keys(this.virtualNodes);

for (let i = 0; i < keys.length; i++) {
const p = audioGraphParamsFactoryValues[i];
this.virtualNodes[keys[i]].update(p.params);
const key = keys[i];
const virtualAudioNode = this.virtualNodes[key];
const newVirtualAudioNode = audioGraphParamsFactoryValues[i];

if (virtualAudioNode.cannotUpdateInPlace(newVirtualAudioNode)) {
virtualAudioNode.disconnectAndDestroy();
this.disconnectParents(virtualAudioNode);
this.virtualNodes[key] = newVirtualAudioNode.initialize(audioContext);
continue;
}

virtualAudioNode.update(newVirtualAudioNode.params, audioContext);

if (!equals(newVirtualAudioNode.output, virtualAudioNode.output)) {
virtualAudioNode.disconnect();
this.disconnectParents(virtualAudioNode);
virtualAudioNode.output = newVirtualAudioNode.output;
}
}

connectAudioNodes(this.virtualNodes, () => {});
this.params = params;
return this;
}

private disconnectParents(vNode: VirtualAudioNode): void {
for (const node of values(this.virtualNodes)) node.disconnect(vNode);
}
}
14 changes: 13 additions & 1 deletion src/VirtualAudioNodes/StandardVirtualAudioNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
} from "../types";
import { capitalize, equals, find, values } from "../utils";
import CustomVirtualAudioNode from "./CustomVirtualAudioNode";
import VirtualAudioNodeBase from "./VirtualAudioNodeBase";

interface IAudioContextFactoryLookup {
[_: string]: any;
Expand Down Expand Up @@ -41,7 +42,7 @@ const createAudioNode = (
return audioNode;
};

export default class StandardVirtualAudioNode {
export default class StandardVirtualAudioNode extends VirtualAudioNodeBase {
public audioNode: AudioNode;
public connected: boolean = false;
private connections: AudioNode[] = [];
Expand All @@ -53,10 +54,21 @@ export default class StandardVirtualAudioNode {
public params?: IVirtualAudioNodeParams,
public readonly input?: string
) {
super();
const stopTime = params && params.stopTime;
this.stopCalled = stopTime !== undefined;
}

public cannotUpdateInPlace(newVirtualAudioNode: VirtualAudioNode): boolean {
return (
super.cannotUpdateInPlace(newVirtualAudioNode) ||
(newVirtualAudioNode.params && newVirtualAudioNode.params.startTime) !==
(this.params && this.params.startTime) ||
(newVirtualAudioNode.params && newVirtualAudioNode.params.stopTime) !==
(this.params && this.params.stopTime)
);
}

public connect(...connectArgs: any[]): void {
const { audioNode } = this;
const filteredConnectArgs = connectArgs.filter(Boolean);
Expand Down
9 changes: 9 additions & 0 deletions src/VirtualAudioNodes/VirtualAudioNodeBase.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { CustomVirtualAudioNodeFactory, VirtualAudioNode } from "../types";

export default abstract class VirtualAudioNodeBase {
public readonly node: string | CustomVirtualAudioNodeFactory;

public cannotUpdateInPlace(newVirtualAudioNode: VirtualAudioNode): boolean {
return newVirtualAudioNode.node !== this.node;
}
}

0 comments on commit 06bc0fb

Please sign in to comment.