Skip to content

Commit 103aef4

Browse files
committed
Merge branch 'main' into feat/audio-recorder-to-file
2 parents e05de19 + 1ca2db9 commit 103aef4

30 files changed

+445
-35
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 ||
@@ -36,7 +38,6 @@ sidebar_position: 2
3638
| AudioWorkletProcessor ||
3739
| ChannelMergerNode ||
3840
| ChannelSplitterNode ||
39-
| DelayNode ||
4041
| DynamicsCompressorNode ||
4142
| MediaElementAudioSourceNode ||
4243
| MediaStreamAudioDestinationNode ||

packages/react-native-audio-api/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ void AudioAPIModule::registerNatives() {
5050
makeNativeMethod(
5151
"invokeHandlerWithEventNameAndEventBody",
5252
AudioAPIModule::invokeHandlerWithEventNameAndEventBody),
53-
makeNativeMethod("closeAllContexts", AudioAPIModule::closeAllContexts),
5453
});
5554
}
5655

@@ -96,8 +95,4 @@ void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
9695
audioEventHandlerRegistry_->invokeHandlerWithEventBody(eventName->toStdString(), body);
9796
}
9897
}
99-
100-
void AudioAPIModule::closeAllContexts() {
101-
AudioAPIModuleInstaller::closeAllContexts();
102-
}
10398
} // namespace audioapi

packages/react-native-audio-api/android/src/main/cpp/audioapi/android/AudioAPIModule.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
3434

3535
void injectJSIBindings();
3636
void invokeHandlerWithEventNameAndEventBody(jni::alias_ref<jni::JString> eventName, jni::alias_ref<jni::JMap<jstring, jobject>> eventBody);
37-
void closeAllContexts();
3837

3938
private:
4039
friend HybridBase;

packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ class AudioAPIModule(
4141
eventBody: Map<String, Any>,
4242
)
4343

44-
private external fun closeAllContexts()
45-
4644
init {
4745
try {
4846
System.loadLibrary("react-native-audio-api")
@@ -79,15 +77,14 @@ class AudioAPIModule(
7977
}
8078

8179
override fun onHostDestroy() {
82-
closeAllContexts()
80+
// do nothing
8381
}
8482

8583
override fun initialize() {
8684
reactContext.get()?.addLifecycleEventListener(this)
8785
}
8886

8987
override fun invalidate() {
90-
closeAllContexts()
9188
reactContext.get()?.removeLifecycleEventListener(this)
9289
// think about cleaning up resources, singletons etc.
9390
}

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

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ namespace audioapi {
2424
using namespace facebook;
2525

2626
class AudioAPIModuleInstaller {
27-
private:
28-
inline static std::vector<std::weak_ptr<AudioContext>> contexts_ = {};
29-
3027
public:
3128
static void injectJSIBindings(
3229
jsi::Runtime *jsiRuntime,
@@ -57,19 +54,6 @@ class AudioAPIModuleInstaller {
5754
jsi::Object::createFromHostObject(*jsiRuntime, audioEventHandlerRegistryHostObject));
5855
}
5956

60-
static void closeAllContexts() {
61-
for (auto it = contexts_.begin(); it != contexts_.end(); ++it) {
62-
auto weakContext = *it;
63-
64-
if (auto context = weakContext.lock()) {
65-
context->close();
66-
}
67-
68-
it = contexts_.erase(it);
69-
--it;
70-
}
71-
}
72-
7357
private:
7458
static jsi::Function getCreateAudioContextFunction(
7559
jsi::Runtime *jsiRuntime,
@@ -98,7 +82,6 @@ class AudioAPIModuleInstaller {
9882

9983
audioContext = std::make_shared<AudioContext>(
10084
sampleRate, audioEventHandlerRegistry, runtimeRegistry);
101-
AudioAPIModuleInstaller::contexts_.push_back(audioContext);
10285

10386
auto audioContextHostObject =
10487
std::make_shared<AudioContextHostObject>(audioContext, &runtime, jsCallInvoker);

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>
@@ -47,6 +48,7 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
4748
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStreamer),
4849
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createConstantSource),
4950
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createGain),
51+
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createDelay),
5052
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),
5153
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),
5254
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createIIRFilter),
@@ -184,6 +186,15 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createGain) {
184186
return jsi::Object::createFromHostObject(runtime, gainHostObject);
185187
}
186188

189+
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createDelay) {
190+
auto maxDelayTime = static_cast<float>(args[0].getNumber());
191+
auto delayNode = context_->createDelay(maxDelayTime);
192+
auto delayNodeHostObject = std::make_shared<DelayNodeHostObject>(delayNode);
193+
auto jsiObject = jsi::Object::createFromHostObject(runtime, delayNodeHostObject);
194+
jsiObject.setExternalMemoryPressure(runtime, delayNodeHostObject->getSizeInBytes());
195+
return jsiObject;
196+
}
197+
187198
JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStereoPanner) {
188199
auto stereoPanner = context_->createStereoPanner();
189200
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
@@ -43,6 +43,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
4343
JSI_HOST_FUNCTION_DECL(createPeriodicWave);
4444
JSI_HOST_FUNCTION_DECL(createAnalyser);
4545
JSI_HOST_FUNCTION_DECL(createConvolver);
46+
JSI_HOST_FUNCTION_DECL(createDelay);
4647

4748
std::shared_ptr<BaseAudioContext> context_;
4849

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

0 commit comments

Comments
 (0)