From 966e80fe7328f648925defe349308054e4e86028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20D=C3=A9oux?= Date: Fri, 18 Apr 2025 23:06:29 +0200 Subject: [PATCH] Introduction of the AudioDestinationNode module AudioDestinationNode is a subclass of AudioNode with no constructor and no extra method. The only effective difference is the `maxChannelCount` instance property, which is already covered by the `audioDestinationNode` type in the `WebAudioAPI` module. This PR allows for `AudioContext`'s `destination` property to be used like an `AudioNode`, especially being connected to by other nodes since this is the only way to output audio to speakers. For more information, check [MDN](https://developer.mozilla.org/en-US/docs/Web/API/AudioDestinationNode) --- src/WebAudioAPI/AudioDestinationNode.js | 7 ++++ src/WebAudioAPI/AudioDestinationNode.res | 5 +++ .../AudioDestinationNode__.test.js | 32 +++++++++++++++++++ .../AudioDestinationNode__.test.res | 27 ++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 src/WebAudioAPI/AudioDestinationNode.js create mode 100644 src/WebAudioAPI/AudioDestinationNode.res create mode 100644 tests/WebAudioAPI/AudioDestinationNode__.test.js create mode 100644 tests/WebAudioAPI/AudioDestinationNode__.test.res diff --git a/src/WebAudioAPI/AudioDestinationNode.js b/src/WebAudioAPI/AudioDestinationNode.js new file mode 100644 index 0000000..22c59b6 --- /dev/null +++ b/src/WebAudioAPI/AudioDestinationNode.js @@ -0,0 +1,7 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + +import * as AudioNode$WebAPI from "./AudioNode.js"; + +AudioNode$WebAPI.Impl({}); + +/* Not a pure module */ diff --git a/src/WebAudioAPI/AudioDestinationNode.res b/src/WebAudioAPI/AudioDestinationNode.res new file mode 100644 index 0000000..eb3df0c --- /dev/null +++ b/src/WebAudioAPI/AudioDestinationNode.res @@ -0,0 +1,5 @@ +open WebAudioAPI + +include AudioNode.Impl({ + type t = audioDestinationNode +}) diff --git a/tests/WebAudioAPI/AudioDestinationNode__.test.js b/tests/WebAudioAPI/AudioDestinationNode__.test.js new file mode 100644 index 0000000..bd3e6c9 --- /dev/null +++ b/tests/WebAudioAPI/AudioDestinationNode__.test.js @@ -0,0 +1,32 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + + +let ctx = new AudioContext(); + +let destinationNode = ctx.destination; + +let osc = new OscillatorNode(ctx, { + type: "sine", + frequency: 440.0 +}); + +let gain = new GainNode(ctx, { + gain: 0.3 +}); + +gain.connect(destinationNode); + +osc.connect(gain); + +osc.start(); + +let context = ctx; + +export { + ctx, + destinationNode, + context, + osc, + gain, +} +/* ctx Not a pure module */ diff --git a/tests/WebAudioAPI/AudioDestinationNode__.test.res b/tests/WebAudioAPI/AudioDestinationNode__.test.res new file mode 100644 index 0000000..7b8acb6 --- /dev/null +++ b/tests/WebAudioAPI/AudioDestinationNode__.test.res @@ -0,0 +1,27 @@ +open WebAudioAPI + +let ctx = AudioContext.make() + +let destinationNode = ctx.destination->AudioDestinationNode.asAudioNode +let context = AudioContext.asBaseAudioContext(ctx) + +let osc = OscillatorNode.make( + ~context, + ~options={ + type_: Sine, + frequency: 440.0, + }, +) +let gain = GainNode.make( + ~context, + ~options={ + gain: 0.3, + }, +) +let _ = gain->GainNode.connect(~destinationNode) +let _ = + osc + ->OscillatorNode.asAudioScheduledSourceNode + ->AudioScheduledSourceNode.connect(~destinationNode=gain->GainNode.asAudioNode) + +osc->OscillatorNode.start