Skip to content

Commit d49bdce

Browse files
author
maciejmakowski2003
committed
Merge branch 'main' into feat/wave-shaper
2 parents 0ae8af3 + 1ca2db9 commit d49bdce

25 files changed

+444
-6
lines changed

packages/audiodocs/docs/core/base-audio-context.mdx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ Creates [`ConvolverNode`](/docs/effects/convolver-node).
120120

121121
#### Returns `ConvolverNode`.
122122

123+
### `createDelay`
124+
125+
Creates [`DelayNode`](/docs/effects/delay-node)
126+
127+
| Parameter | Type | Description |
128+
| :---: | :---: | :---- |
129+
| `maxDelayTime` <Optional /> | `number` | Maximum amount of time to buffer delayed values|
130+
131+
#### Returns `DelayNode`
132+
123133
### `createGain`
124134

125135
Creates [`GainNode`](/docs/effects/gain-node).
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
sidebar_position: 5
3+
---
4+
5+
import AudioNodePropsTable from "@site/src/components/AudioNodePropsTable"
6+
import { ReadOnly } from '@site/src/components/Badges';
7+
8+
# DelayNode
9+
10+
The `DelayNode` interface represents the latency of the audio signal by given time. It is an [`AudioNode`](/docs/core/audio-node) that applies time shift to incoming signal f.e.
11+
if `delayTime` value is 0.5, it means that audio will be played after 0.5 seconds.
12+
13+
#### [`AudioNode`](/docs/core/audio-node#properties) properties
14+
15+
<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode={"max"} channelInterpretation={"speakers"} />
16+
17+
:::info
18+
Delay is a node with tail-time, which means, that it continues to output non-silent audio with zero input for the duration of `delayTime`.
19+
:::
20+
21+
## Constructor
22+
23+
[`BaseAudioContext.createDelay(maxDelayTime?: number)`](/docs/core/base-audio-context#createdelay)
24+
25+
## Properties
26+
27+
It inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).
28+
29+
| Name | Type | Description |
30+
| :----: | :----: | :-------- |
31+
| `delayTime`| <ReadOnly /> [`AudioParam`](/docs/core/audio-param) | [`k-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing value of time shift to apply. |
32+
33+
:::warning
34+
In web audio api specs `delayTime` is an `a-rate` param.
35+
:::
36+
37+
## Methods
38+
39+
`DelayNode` does not define any additional methods.
40+
It inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).
41+
42+
## Remarks
43+
44+
#### `maxDelayTime`
45+
- Default value is 1.0.
46+
- Nominal range is 0 - 180.
47+
48+
#### `delayTime`
49+
- Default value is 0.
50+
- Nominal range is 0 - `maxDelayTime`.

packages/audiodocs/docs/other/web-audio-api-coverage.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
---
23
id: web-audio-api-coverage
34
sidebar_label: Web Audio API coverage
@@ -20,6 +21,7 @@ sidebar_position: 2
2021
| BiquadFilterNode ||
2122
| ConstantSourceNode ||
2223
| ConvolverNode ||
24+
| DelayNode ||
2325
| GainNode ||
2426
| IIRFilterNode ||
2527
| OfflineAudioContext ||
@@ -37,7 +39,6 @@ sidebar_position: 2
3739
| AudioWorkletProcessor ||
3840
| ChannelMergerNode ||
3941
| ChannelSplitterNode ||
40-
| DelayNode ||
4142
| DynamicsCompressorNode ||
4243
| MediaElementAudioSourceNode ||
4344
| MediaStreamAudioDestinationNode ||

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h>
77
#include <audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h>
88
#include <audioapi/HostObjects/effects/ConvolverNodeHostObject.h>
9+
#include <audioapi/HostObjects/effects/DelayNodeHostObject.h>
910
#include <audioapi/HostObjects/effects/GainNodeHostObject.h>
1011
#include <audioapi/HostObjects/effects/IIRFilterNodeHostObject.h>
1112
#include <audioapi/HostObjects/effects/PeriodicWaveHostObject.h>
@@ -48,6 +49,7 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
4849
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStreamer),
4950
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createConstantSource),
5051
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createGain),
52+
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createDelay),
5153
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),
5254
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),
5355
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createIIRFilter),
@@ -186,6 +188,15 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createGain) {
186188
return jsi::Object::createFromHostObject(runtime, gainHostObject);
187189
}
188190

191+
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createDelay) {
192+
auto maxDelayTime = static_cast<float>(args[0].getNumber());
193+
auto delayNode = context_->createDelay(maxDelayTime);
194+
auto delayNodeHostObject = std::make_shared<DelayNodeHostObject>(delayNode);
195+
auto jsiObject = jsi::Object::createFromHostObject(runtime, delayNodeHostObject);
196+
jsiObject.setExternalMemoryPressure(runtime, delayNodeHostObject->getSizeInBytes());
197+
return jsiObject;
198+
}
199+
189200
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStereoPanner) {
190201
auto stereoPanner = context_->createStereoPanner();
191202
auto stereoPannerHostObject = std::make_shared<StereoPannerNodeHostObject>(stereoPanner);

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
4444
JSI_HOST_FUNCTION_DECL(createAnalyser);
4545
JSI_HOST_FUNCTION_DECL(createConvolver);
4646
JSI_HOST_FUNCTION_DECL(createWaveShaper);
47+
JSI_HOST_FUNCTION_DECL(createDelay);
4748

4849
std::shared_ptr<BaseAudioContext> context_;
4950

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <audioapi/HostObjects/effects/DelayNodeHostObject.h>
2+
3+
#include <audioapi/HostObjects/AudioParamHostObject.h>
4+
#include <audioapi/core/BaseAudioContext.h>
5+
#include <audioapi/core/effects/DelayNode.h>
6+
#include <memory>
7+
8+
namespace audioapi {
9+
10+
DelayNodeHostObject::DelayNodeHostObject(const std::shared_ptr<DelayNode> &node)
11+
: AudioNodeHostObject(node) {
12+
addGetters(JSI_EXPORT_PROPERTY_GETTER(DelayNodeHostObject, delayTime));
13+
}
14+
15+
size_t DelayNodeHostObject::getSizeInBytes() const {
16+
auto delayNode = std::static_pointer_cast<DelayNode>(node_);
17+
return sizeof(float) * delayNode->context_->getSampleRate() *
18+
delayNode->getDelayTimeParam()->getMaxValue();
19+
}
20+
21+
JSI_PROPERTY_GETTER_IMPL(DelayNodeHostObject, delayTime) {
22+
auto delayNode = std::static_pointer_cast<DelayNode>(node_);
23+
auto delayTimeParam = std::make_shared<AudioParamHostObject>(delayNode->getDelayTimeParam());
24+
return jsi::Object::createFromHostObject(runtime, delayTimeParam);
25+
}
26+
27+
} // namespace audioapi
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
3+
#include <audioapi/HostObjects/AudioNodeHostObject.h>
4+
5+
#include <memory>
6+
#include <vector>
7+
8+
namespace audioapi {
9+
using namespace facebook;
10+
11+
class DelayNode;
12+
13+
class DelayNodeHostObject : public AudioNodeHostObject {
14+
public:
15+
explicit DelayNodeHostObject(const std::shared_ptr<DelayNode> &node);
16+
17+
[[nodiscard]] size_t getSizeInBytes() const;
18+
19+
JSI_PROPERTY_GETTER_DECL(delayTime);
20+
};
21+
} // namespace audioapi

packages/react-native-audio-api/common/cpp/audioapi/core/AudioNode.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ bool AudioNode::isEnabled() const {
7070
return isEnabled_;
7171
}
7272

73+
bool AudioNode::requiresTailProcessing() const {
74+
return requiresTailProcessing_;
75+
}
76+
7377
void AudioNode::enable() {
7478
if (isEnabled()) {
7579
return;

packages/react-native-audio-api/common/cpp/audioapi/core/AudioNode.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@ class AudioNode : public std::enable_shared_from_this<AudioNode> {
3838
bool checkIsAlreadyProcessed);
3939

4040
bool isEnabled() const;
41+
bool requiresTailProcessing() const;
4142
void enable();
4243
virtual void disable();
4344

4445
protected:
4546
friend class AudioNodeManager;
4647
friend class AudioDestinationNode;
4748
friend class ConvolverNode;
49+
friend class DelayNodeHostObject;
4850

4951
BaseAudioContext *context_;
5052
std::shared_ptr<AudioBus> audioBus_;
@@ -64,6 +66,7 @@ class AudioNode : public std::enable_shared_from_this<AudioNode> {
6466
int numberOfEnabledInputNodes_ = 0;
6567
bool isInitialized_ = false;
6668
bool isEnabled_ = true;
69+
bool requiresTailProcessing_ = false;
6770

6871
std::size_t lastRenderedFrame_{SIZE_MAX};
6972

packages/react-native-audio-api/common/cpp/audioapi/core/BaseAudioContext.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <audioapi/core/destinations/AudioDestinationNode.h>
44
#include <audioapi/core/effects/BiquadFilterNode.h>
55
#include <audioapi/core/effects/ConvolverNode.h>
6+
#include <audioapi/core/effects/DelayNode.h>
67
#include <audioapi/core/effects/GainNode.h>
78
#include <audioapi/core/effects/IIRFilterNode.h>
89
#include <audioapi/core/effects/StereoPannerNode.h>
@@ -141,6 +142,12 @@ std::shared_ptr<GainNode> BaseAudioContext::createGain() {
141142
return gain;
142143
}
143144

145+
std::shared_ptr<DelayNode> BaseAudioContext::createDelay(float maxDelayTime) {
146+
auto delay = std::make_shared<DelayNode>(this, maxDelayTime);
147+
nodeManager_->addProcessingNode(delay);
148+
return delay;
149+
}
150+
144151
std::shared_ptr<StereoPannerNode> BaseAudioContext::createStereoPanner() {
145152
auto stereoPanner = std::make_shared<StereoPannerNode>(this);
146153
nodeManager_->addProcessingNode(stereoPanner);

0 commit comments

Comments
 (0)