react-native-audio-api 0.8.3-nightly-ea268f4-20251005 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -40
- package/RNAudioAPI.podspec +12 -17
- package/android/build.gradle +4 -44
- package/android/src/main/cpp/audioapi/CMakeLists.txt +0 -65
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +1 -29
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +0 -14
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +1 -7
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +1 -6
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -1
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +1 -11
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +2 -15
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +18 -53
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +149 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +76 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +120 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +67 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +142 -0
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +46 -6
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +6 -70
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +66 -10
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +91 -17
- package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +86 -0
- package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +56 -0
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +6 -362
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +241 -29
- package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +89 -0
- package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +27 -0
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +50 -6
- package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +65 -0
- package/common/cpp/audioapi/HostObjects/{sources/RecorderAdapterNodeHostObject.h → RecorderAdapterNodeHostObject.h} +2 -1
- package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +29 -0
- package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +30 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +2 -3
- package/common/cpp/audioapi/core/AudioContext.h +1 -2
- package/common/cpp/audioapi/core/AudioNode.h +1 -1
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/AudioParam.h +1 -1
- package/common/cpp/audioapi/core/{utils/AudioParamEventQueue.cpp → AudioParamEventQueue.cpp} +7 -13
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +3 -47
- package/common/cpp/audioapi/core/BaseAudioContext.h +4 -13
- package/common/cpp/audioapi/core/{utils/Constants.h → Constants.h} +0 -5
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +3 -4
- package/common/cpp/audioapi/core/OfflineAudioContext.h +1 -2
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +1 -1
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +10 -47
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +3 -18
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +12 -94
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +2 -8
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +42 -33
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +6 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/StreamerNode.h +8 -0
- package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +1 -2
- package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +48 -0
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +1 -14
- package/common/cpp/audioapi/jsi/JsiHostObject.h +12 -6
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +0 -49
- package/common/cpp/audioapi/jsi/JsiPromise.h +1 -29
- package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
- package/common/cpp/test/CMakeLists.txt +3 -11
- package/common/cpp/test/GainTest.cpp +1 -2
- package/common/cpp/test/OscillatorTest.cpp +1 -2
- package/ios/audioapi/ios/AudioAPIModule.mm +5 -32
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
- package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +7 -0
- package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +12 -0
- package/lib/commonjs/api.js +2 -36
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +0 -8
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js +6 -1
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioBufferSourceNode.js +0 -15
- package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioContext.js +1 -10
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +11 -66
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js +2 -11
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/core/OscillatorNode.js +0 -6
- package/lib/commonjs/core/OscillatorNode.js.map +1 -1
- package/lib/commonjs/hooks/{useSystemVolume.js → useSytemVolume.js} +1 -1
- package/lib/commonjs/hooks/useSytemVolume.js.map +1 -0
- package/lib/commonjs/utils/index.js +0 -9
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.js +0 -4
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/AudioScheduledSourceNode.js +1 -1
- package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/commonjs/web-core/OfflineAudioContext.js +0 -4
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/api.js +2 -6
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +0 -1
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
- package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferQueueSourceNode.js +6 -1
- package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferSourceNode.js +0 -15
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/AudioContext.js +1 -10
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +4 -4
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +11 -66
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/OfflineAudioContext.js +2 -11
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/core/OscillatorNode.js +0 -6
- package/lib/module/core/OscillatorNode.js.map +1 -1
- package/lib/module/hooks/{useSystemVolume.js → useSytemVolume.js} +1 -1
- package/lib/module/hooks/useSytemVolume.js.map +1 -0
- package/lib/module/utils/index.js +0 -8
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/web-core/AudioContext.js +0 -4
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/AudioScheduledSourceNode.js +1 -1
- package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/web-core/OfflineAudioContext.js +0 -4
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/typescript/api.d.ts +4 -8
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +0 -1
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferSourceNode.d.ts +0 -4
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts +0 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +11 -19
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/OfflineAudioContext.d.ts +0 -1
- package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/OscillatorNode.d.ts +0 -3
- package/lib/typescript/core/OscillatorNode.d.ts.map +1 -1
- package/lib/typescript/events/types.d.ts +0 -2
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/hooks/{useSystemVolume.d.ts → useSytemVolume.d.ts} +1 -1
- package/lib/typescript/hooks/useSytemVolume.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +3 -21
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +1 -2
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +0 -8
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +2 -4
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +0 -2
- package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/OfflineAudioContext.d.ts +2 -4
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/package.json +2 -3
- package/src/api.ts +3 -12
- package/src/api.web.ts +0 -1
- package/src/core/AudioBufferBaseSourceNode.ts +9 -9
- package/src/core/AudioBufferQueueSourceNode.ts +9 -1
- package/src/core/AudioBufferSourceNode.ts +0 -28
- package/src/core/AudioContext.ts +1 -12
- package/src/core/AudioScheduledSourceNode.ts +5 -5
- package/src/core/BaseAudioContext.ts +13 -149
- package/src/core/OfflineAudioContext.ts +2 -18
- package/src/core/OscillatorNode.ts +0 -11
- package/src/events/types.ts +0 -2
- package/src/interfaces.ts +5 -59
- package/src/types.ts +1 -3
- package/src/utils/index.ts +0 -21
- package/src/web-core/AudioBufferSourceNode.tsx +1 -1
- package/src/web-core/AudioContext.tsx +2 -7
- package/src/web-core/AudioScheduledSourceNode.tsx +1 -1
- package/src/web-core/BaseAudioContext.tsx +0 -2
- package/src/web-core/OfflineAudioContext.tsx +2 -7
- package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +0 -36
- package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +0 -24
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +0 -57
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +0 -105
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +0 -70
- package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +0 -18
- package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +0 -18
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +0 -148
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +0 -37
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +0 -92
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +0 -29
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +0 -20
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +0 -19
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +0 -21
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +0 -21
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +0 -41
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +0 -28
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +0 -69
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +0 -33
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +0 -73
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +0 -29
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +0 -94
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +0 -46
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +0 -60
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +0 -25
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +0 -152
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +0 -37
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +0 -52
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h +0 -25
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +0 -19
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +0 -21
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +0 -55
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +0 -27
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +0 -22
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +0 -28
- package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +0 -18
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +0 -87
- package/common/cpp/audioapi/core/effects/WorkletNode.h +0 -65
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +0 -89
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +0 -52
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +0 -51
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +0 -26
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +0 -82
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +0 -47
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +0 -52
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +0 -9
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +0 -73
- package/common/cpp/audioapi/utils/ThreadPool.hpp +0 -104
- package/common/cpp/test/AudioParamTest.cpp +0 -204
- package/lib/commonjs/core/ConstantSourceNode.js +0 -17
- package/lib/commonjs/core/ConstantSourceNode.js.map +0 -1
- package/lib/commonjs/core/WorkletNode.js +0 -11
- package/lib/commonjs/core/WorkletNode.js.map +0 -1
- package/lib/commonjs/core/WorkletProcessingNode.js +0 -11
- package/lib/commonjs/core/WorkletProcessingNode.js.map +0 -1
- package/lib/commonjs/core/WorkletSourceNode.js +0 -11
- package/lib/commonjs/core/WorkletSourceNode.js.map +0 -1
- package/lib/commonjs/hooks/useSystemVolume.js.map +0 -1
- package/lib/commonjs/web-core/ConstantSourceNode.js +0 -17
- package/lib/commonjs/web-core/ConstantSourceNode.js.map +0 -1
- package/lib/module/core/ConstantSourceNode.js +0 -11
- package/lib/module/core/ConstantSourceNode.js.map +0 -1
- package/lib/module/core/WorkletNode.js +0 -5
- package/lib/module/core/WorkletNode.js.map +0 -1
- package/lib/module/core/WorkletProcessingNode.js +0 -5
- package/lib/module/core/WorkletProcessingNode.js.map +0 -1
- package/lib/module/core/WorkletSourceNode.js +0 -5
- package/lib/module/core/WorkletSourceNode.js.map +0 -1
- package/lib/module/hooks/useSystemVolume.js.map +0 -1
- package/lib/module/web-core/ConstantSourceNode.js +0 -11
- package/lib/module/web-core/ConstantSourceNode.js.map +0 -1
- package/lib/typescript/core/ConstantSourceNode.d.ts +0 -9
- package/lib/typescript/core/ConstantSourceNode.d.ts.map +0 -1
- package/lib/typescript/core/WorkletNode.d.ts +0 -4
- package/lib/typescript/core/WorkletNode.d.ts.map +0 -1
- package/lib/typescript/core/WorkletProcessingNode.d.ts +0 -4
- package/lib/typescript/core/WorkletProcessingNode.d.ts.map +0 -1
- package/lib/typescript/core/WorkletSourceNode.d.ts +0 -4
- package/lib/typescript/core/WorkletSourceNode.d.ts.map +0 -1
- package/lib/typescript/hooks/useSystemVolume.d.ts.map +0 -1
- package/lib/typescript/web-core/ConstantSourceNode.d.ts +0 -8
- package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +0 -1
- package/src/core/ConstantSourceNode.ts +0 -13
- package/src/core/WorkletNode.ts +0 -3
- package/src/core/WorkletProcessingNode.ts +0 -3
- package/src/core/WorkletSourceNode.ts +0 -3
- package/src/web-core/ConstantSourceNode.tsx +0 -12
- /package/common/cpp/audioapi/HostObjects/{destinations/AudioDestinationNodeHostObject.h → AudioDestinationNodeHostObject.h} +0 -0
- /package/common/cpp/audioapi/HostObjects/{effects/PeriodicWaveHostObject.h → PeriodicWaveHostObject.h} +0 -0
- /package/common/cpp/audioapi/core/{utils/AudioParamEventQueue.h → AudioParamEventQueue.h} +0 -0
- /package/src/hooks/{useSystemVolume.ts → useSytemVolume.ts} +0 -0
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/core/AudioParam.h>
|
|
4
|
-
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
5
|
-
|
|
6
|
-
#include <cmath>
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <string>
|
|
9
|
-
|
|
10
|
-
namespace audioapi {
|
|
11
|
-
|
|
12
|
-
class AudioBus;
|
|
13
|
-
|
|
14
|
-
class ConstantSourceNode : public AudioScheduledSourceNode {
|
|
15
|
-
public:
|
|
16
|
-
explicit ConstantSourceNode(BaseAudioContext *context);
|
|
17
|
-
|
|
18
|
-
[[nodiscard]] std::shared_ptr<AudioParam> getOffsetParam() const;
|
|
19
|
-
|
|
20
|
-
protected:
|
|
21
|
-
void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
22
|
-
|
|
23
|
-
private:
|
|
24
|
-
std::shared_ptr<AudioParam> offsetParam_;
|
|
25
|
-
};
|
|
26
|
-
} // namespace audioapi
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
#include <audioapi/core/sources/WorkletSourceNode.h>
|
|
2
|
-
#include <audioapi/core/utils/Constants.h>
|
|
3
|
-
|
|
4
|
-
namespace audioapi {
|
|
5
|
-
|
|
6
|
-
WorkletSourceNode::WorkletSourceNode(
|
|
7
|
-
BaseAudioContext *context,
|
|
8
|
-
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
9
|
-
std::weak_ptr<worklets::WorkletRuntime> runtime)
|
|
10
|
-
: AudioScheduledSourceNode(context),
|
|
11
|
-
workletRunner_(runtime),
|
|
12
|
-
shareableWorklet_(worklet) {
|
|
13
|
-
isInitialized_ = true;
|
|
14
|
-
|
|
15
|
-
// Prepare buffers for audio processing
|
|
16
|
-
size_t outputChannelCount = this->getChannelCount();
|
|
17
|
-
outputBuffsHandles_.resize(outputChannelCount);
|
|
18
|
-
for (size_t i = 0; i < outputChannelCount; ++i) {
|
|
19
|
-
auto buff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
|
|
20
|
-
outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
|
|
21
|
-
buff, RENDER_QUANTUM_SIZE * sizeof(float));
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
void WorkletSourceNode::processNode(
|
|
26
|
-
const std::shared_ptr<AudioBus> &processingBus,
|
|
27
|
-
int framesToProcess) {
|
|
28
|
-
if (isUnscheduled() || isFinished() || !isEnabled()) {
|
|
29
|
-
processingBus->zero();
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
size_t startOffset = 0;
|
|
34
|
-
size_t nonSilentFramesToProcess = framesToProcess;
|
|
35
|
-
|
|
36
|
-
updatePlaybackInfo(
|
|
37
|
-
processingBus, framesToProcess, startOffset, nonSilentFramesToProcess);
|
|
38
|
-
|
|
39
|
-
if (nonSilentFramesToProcess == 0) {
|
|
40
|
-
processingBus->zero();
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
size_t outputChannelCount = processingBus->getNumberOfChannels();
|
|
45
|
-
|
|
46
|
-
auto result = workletRunner_.executeOnRuntimeGuardedSync(
|
|
47
|
-
[this, nonSilentFramesToProcess, startOffset](jsi::Runtime &rt) {
|
|
48
|
-
auto jsiArray = jsi::Array(rt, this->outputBuffsHandles_.size());
|
|
49
|
-
for (size_t i = 0; i < this->outputBuffsHandles_.size(); ++i) {
|
|
50
|
-
auto arrayBuffer = jsi::ArrayBuffer(rt, this->outputBuffsHandles_[i]);
|
|
51
|
-
jsiArray.setValueAtIndex(rt, i, arrayBuffer);
|
|
52
|
-
}
|
|
53
|
-
return workletRunner_
|
|
54
|
-
.executeWorklet(
|
|
55
|
-
shareableWorklet_,
|
|
56
|
-
jsiArray,
|
|
57
|
-
jsi::Value(rt, static_cast<int>(nonSilentFramesToProcess)),
|
|
58
|
-
jsi::Value(rt, this->context_->getCurrentTime()),
|
|
59
|
-
jsi::Value(rt, static_cast<int>(startOffset)))
|
|
60
|
-
.value_or(jsi::Value::undefined());
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// If the worklet execution failed, zero the output
|
|
64
|
-
// It might happen if the runtime is not available
|
|
65
|
-
if (!result.has_value()) {
|
|
66
|
-
processingBus->zero();
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Copy the processed data back to the AudioBus
|
|
71
|
-
for (size_t i = 0; i < outputChannelCount; ++i) {
|
|
72
|
-
float *channelData = processingBus->getChannel(i)->getData();
|
|
73
|
-
memcpy(
|
|
74
|
-
channelData + startOffset,
|
|
75
|
-
outputBuffsHandles_[i]->data(),
|
|
76
|
-
nonSilentFramesToProcess * sizeof(float));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
handleStopScheduled();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
} // namespace audioapi
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#include <jsi/jsi.h>
|
|
3
|
-
#include <audioapi/core/BaseAudioContext.h>
|
|
4
|
-
#include <audioapi/utils/AudioBus.h>
|
|
5
|
-
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
6
|
-
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
7
|
-
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
8
|
-
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
9
|
-
#include <audioapi/utils/AudioArray.h>
|
|
10
|
-
|
|
11
|
-
#include <vector>
|
|
12
|
-
#include <memory>
|
|
13
|
-
|
|
14
|
-
namespace audioapi {
|
|
15
|
-
|
|
16
|
-
#if RN_AUDIO_API_TEST
|
|
17
|
-
class WorkletSourceNode : public AudioScheduledSourceNode {
|
|
18
|
-
public:
|
|
19
|
-
explicit WorkletSourceNode(
|
|
20
|
-
BaseAudioContext *context,
|
|
21
|
-
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
22
|
-
std::weak_ptr<worklets::WorkletRuntime> runtime
|
|
23
|
-
) : AudioScheduledSourceNode(context) {}
|
|
24
|
-
|
|
25
|
-
protected:
|
|
26
|
-
void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override {}
|
|
27
|
-
};
|
|
28
|
-
#else
|
|
29
|
-
|
|
30
|
-
class WorkletSourceNode : public AudioScheduledSourceNode {
|
|
31
|
-
public:
|
|
32
|
-
explicit WorkletSourceNode(
|
|
33
|
-
BaseAudioContext *context,
|
|
34
|
-
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
35
|
-
std::weak_ptr<worklets::WorkletRuntime> runtime
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
protected:
|
|
39
|
-
void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
40
|
-
private:
|
|
41
|
-
WorkletsRunner workletRunner_;
|
|
42
|
-
std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
|
|
43
|
-
std::vector<std::shared_ptr<AudioArrayBuffer>> outputBuffsHandles_;
|
|
44
|
-
};
|
|
45
|
-
#endif // RN_AUDIO_API_TEST
|
|
46
|
-
|
|
47
|
-
} // namespace audioapi
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <jsi/jsi.h>
|
|
4
|
-
|
|
5
|
-
#include <string>
|
|
6
|
-
#include <memory>
|
|
7
|
-
|
|
8
|
-
#ifdef __APPLE__
|
|
9
|
-
/// We cannot make any conditional logic inside podspec but it should automatically compile those files
|
|
10
|
-
/// they should be accessible if someone has react-native-worklets in node_modules
|
|
11
|
-
#if __has_include(<worklets/WorkletRuntime/WorkletRuntime.h>)
|
|
12
|
-
#define RN_AUDIO_API_ENABLE_WORKLETS 1
|
|
13
|
-
#else
|
|
14
|
-
#define RN_AUDIO_API_ENABLE_WORKLETS 0
|
|
15
|
-
#endif
|
|
16
|
-
#endif
|
|
17
|
-
|
|
18
|
-
#ifndef RN_AUDIO_API_TEST
|
|
19
|
-
#define RN_AUDIO_API_TEST 0
|
|
20
|
-
#endif
|
|
21
|
-
|
|
22
|
-
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
23
|
-
#include <worklets/WorkletRuntime/WorkletRuntime.h>
|
|
24
|
-
#include <worklets/SharedItems/Serializable.h>
|
|
25
|
-
#include <worklets/NativeModules/WorkletsModuleProxy.h>
|
|
26
|
-
#if ANDROID
|
|
27
|
-
#include <worklets/android/WorkletsModule.h>
|
|
28
|
-
#endif
|
|
29
|
-
#else
|
|
30
|
-
/// @brief Dummy implementation of worklets for non-worklet builds they should do nothing and mock necessary methods
|
|
31
|
-
/// @note It helps to reduce compile time branching across codebase
|
|
32
|
-
/// @note If you need to base some c++ implementation on if the worklets are enabled use `#if RN_AUDIO_API_ENABLE_WORKLETS`
|
|
33
|
-
namespace worklets {
|
|
34
|
-
|
|
35
|
-
using namespace facebook;
|
|
36
|
-
class MessageQueueThread {};
|
|
37
|
-
class WorkletsModuleProxy {};
|
|
38
|
-
class WorkletRuntime {
|
|
39
|
-
explicit WorkletRuntime(uint64_t, const std::shared_ptr<MessageQueueThread> &, const std::string &, const bool);
|
|
40
|
-
};
|
|
41
|
-
class SerializableWorklet {
|
|
42
|
-
SerializableWorklet(jsi::Runtime*, const jsi::Object &);
|
|
43
|
-
};
|
|
44
|
-
} // namespace worklets
|
|
45
|
-
#endif
|
|
46
|
-
|
|
47
|
-
/// @brief Struct to hold references to different runtimes used in the AudioAPI
|
|
48
|
-
/// @note it is used to pass them around and avoid creating multiple instances of the same runtime
|
|
49
|
-
struct RuntimeRegistry {
|
|
50
|
-
std::weak_ptr<worklets::WorkletRuntime> uiRuntime;
|
|
51
|
-
std::weak_ptr<worklets::WorkletRuntime> audioRuntime;
|
|
52
|
-
};
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <jsi/jsi.h>
|
|
4
|
-
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
5
|
-
|
|
6
|
-
#include <functional>
|
|
7
|
-
#include <atomic>
|
|
8
|
-
#include <memory>
|
|
9
|
-
#include <utility>
|
|
10
|
-
#include <optional>
|
|
11
|
-
|
|
12
|
-
namespace audioapi {
|
|
13
|
-
using namespace facebook;
|
|
14
|
-
|
|
15
|
-
/*
|
|
16
|
-
* # How to extract worklet from JavaScript argument
|
|
17
|
-
*
|
|
18
|
-
* To extract a shareable worklet from a JavaScript argument, use the following code:
|
|
19
|
-
*
|
|
20
|
-
* ```cpp
|
|
21
|
-
* auto worklet = worklets::extractSerializableWorkletFromArg(runtime, args[0]);
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* This will return a shared pointer to the extracted worklet, or throw an error if the argument is invalid.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
class WorkletsRunner {
|
|
28
|
-
public:
|
|
29
|
-
explicit WorkletsRunner(std::weak_ptr<worklets::WorkletRuntime> weakUiRuntime) noexcept;
|
|
30
|
-
|
|
31
|
-
/// @brief Execute a job on the UI runtime safely.
|
|
32
|
-
/// @param job
|
|
33
|
-
/// @return nullopt if the runtime is not available or the result of the job execution
|
|
34
|
-
/// @note Execution is synchronous
|
|
35
|
-
std::optional<jsi::Value> executeOnRuntimeGuardedSync(const std::function<jsi::Value(jsi::Runtime&)>&& job) const noexcept(noexcept(job)) {
|
|
36
|
-
auto strongRuntime = weakUiRuntime_.lock();
|
|
37
|
-
if (strongRuntime == nullptr) {
|
|
38
|
-
return std::nullopt;
|
|
39
|
-
}
|
|
40
|
-
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
41
|
-
return strongRuntime->executeSync(std::move(job));
|
|
42
|
-
#else
|
|
43
|
-
return std::nullopt;
|
|
44
|
-
#endif
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/// @brief Execute a worklet with the given arguments.
|
|
48
|
-
/// @tparam ...Args
|
|
49
|
-
/// @param shareableWorklet
|
|
50
|
-
/// @param ...args
|
|
51
|
-
/// @note Execution is synchronous, this method can be used in `executeOnRuntimeGuardedSync` and `...Async` methods arguments
|
|
52
|
-
/// @return nullopt if the runtime is not available or the result of the worklet execution
|
|
53
|
-
template<typename... Args>
|
|
54
|
-
std::optional<jsi::Value> executeWorklet(const std::shared_ptr<worklets::SerializableWorklet>& shareableWorklet, Args&&... args) {
|
|
55
|
-
auto strongRuntime = weakUiRuntime_.lock();
|
|
56
|
-
if (strongRuntime == nullptr) {
|
|
57
|
-
return std::nullopt;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
61
|
-
|
|
62
|
-
return strongRuntime->runGuarded(shareableWorklet, std::forward<Args>(args)...);
|
|
63
|
-
|
|
64
|
-
#else
|
|
65
|
-
return std::nullopt;
|
|
66
|
-
#endif
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private:
|
|
70
|
-
std::weak_ptr<worklets::WorkletRuntime> weakUiRuntime_;
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
} // namespace audioapi
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#include <thread>
|
|
3
|
-
#include <vector>
|
|
4
|
-
#include <functional>
|
|
5
|
-
#include <variant>
|
|
6
|
-
#include <audioapi/utils/SpscChannel.hpp>
|
|
7
|
-
|
|
8
|
-
namespace audioapi {
|
|
9
|
-
|
|
10
|
-
/// @brief A simple thread pool implementation using lock-free SPSC channels for task scheduling and execution.
|
|
11
|
-
/// @note The thread pool consists of a load balancer thread and multiple worker threads.
|
|
12
|
-
/// @note The load balancer receives tasks and distributes them to worker threads in a round-robin fashion.
|
|
13
|
-
/// @note Each worker thread has its own SPSC channel to receive tasks from the load balancer.
|
|
14
|
-
/// @note The thread pool can be shut down gracefully by sending a stop event to the load balancer, which then propagates the stop event to all worker threads.
|
|
15
|
-
/// @note IMPORTANT: ThreadPool is not thread-safe and events should be scheduled from a single thread only.
|
|
16
|
-
class ThreadPool {
|
|
17
|
-
struct StopEvent {};
|
|
18
|
-
struct TaskEvent { std::function<void()> task; };
|
|
19
|
-
using Event = std::variant<TaskEvent, StopEvent>;
|
|
20
|
-
|
|
21
|
-
using Sender = channels::spsc::Sender<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>;
|
|
22
|
-
using Receiver = channels::spsc::Receiver<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>;
|
|
23
|
-
public:
|
|
24
|
-
/// @brief Construct a new ThreadPool
|
|
25
|
-
/// @param numThreads The number of worker threads to create
|
|
26
|
-
/// @param loadBalancerQueueSize The size of the load balancer's queue
|
|
27
|
-
/// @param workerQueueSize The size of each worker thread's queue
|
|
28
|
-
ThreadPool(size_t numThreads, size_t loadBalancerQueueSize = 32, size_t workerQueueSize = 32) {
|
|
29
|
-
auto [sender, receiver] = channels::spsc::channel<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>(loadBalancerQueueSize);
|
|
30
|
-
loadBalancerSender = std::move(sender);
|
|
31
|
-
std::vector<Sender> workerSenders;
|
|
32
|
-
workerSenders.reserve(numThreads);
|
|
33
|
-
for (size_t i = 0; i < numThreads; ++i) {
|
|
34
|
-
auto [workerSender, workerReceiver] = channels::spsc::channel<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>(workerQueueSize);
|
|
35
|
-
workers.emplace_back(&ThreadPool::workerThreadFunc, this, std::move(workerReceiver));
|
|
36
|
-
workerSenders.emplace_back(std::move(workerSender));
|
|
37
|
-
}
|
|
38
|
-
loadBalancerThread = std::thread(&ThreadPool::loadBalancerThreadFunc, this, std::move(receiver), std::move(workerSenders));
|
|
39
|
-
}
|
|
40
|
-
~ThreadPool() {
|
|
41
|
-
loadBalancerSender.send(StopEvent{});
|
|
42
|
-
loadBalancerThread.join();
|
|
43
|
-
for (auto& worker : workers) {
|
|
44
|
-
worker.join();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/// @brief Schedule a task to be executed by the thread pool
|
|
49
|
-
/// @param task The task to be executed
|
|
50
|
-
/// @note This function is lock-free and most of the time wait-free, but may block if the load balancer queue is full.
|
|
51
|
-
/// @note Please remember that the task will be executed in a different thread, so make sure to capture any required variables by value.
|
|
52
|
-
/// @note The task should not throw exceptions, as they will not be caught.
|
|
53
|
-
/// @note The task should end at some point, otherwise the thread pool will never be able to shut down.
|
|
54
|
-
/// @note IMPORTANT: This function is not thread-safe and should be called from a single thread only.
|
|
55
|
-
void schedule(std::function<void()> &&task) noexcept {
|
|
56
|
-
loadBalancerSender.send(TaskEvent{std::move(task)});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
private:
|
|
60
|
-
std::thread loadBalancerThread;
|
|
61
|
-
std::vector<std::thread> workers;
|
|
62
|
-
Sender loadBalancerSender;
|
|
63
|
-
|
|
64
|
-
void workerThreadFunc(Receiver &&receiver) {
|
|
65
|
-
Receiver localReceiver = std::move(receiver);
|
|
66
|
-
while (true) {
|
|
67
|
-
auto event = localReceiver.receive();
|
|
68
|
-
/// We use [[unlikely]] and [[likely]] attributes to help the compiler optimize the branching.
|
|
69
|
-
/// we expect most of the time to receive TaskEvent, and rarely StopEvent.
|
|
70
|
-
/// and whenever we receive StopEvent we can burn some cycles as it will not be expected to execute fast.
|
|
71
|
-
if (std::holds_alternative<StopEvent>(event)) [[ unlikely ]] {
|
|
72
|
-
break;
|
|
73
|
-
} else if (std::holds_alternative<TaskEvent>(event)) [[ likely ]] {
|
|
74
|
-
std::get<TaskEvent>(event).task();
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
void loadBalancerThreadFunc(Receiver &&receiver, std::vector<Sender> &&workerSenders) {
|
|
80
|
-
Receiver localReceiver = std::move(receiver);
|
|
81
|
-
std::vector<Sender> localWorkerSenders = std::move(workerSenders);
|
|
82
|
-
size_t nextWorker = 0;
|
|
83
|
-
while (true) {
|
|
84
|
-
auto event = localReceiver.receive();
|
|
85
|
-
/// We use [[unlikely]] and [[likely]] attributes to help the compiler optimize the branching.
|
|
86
|
-
/// we expect most of the time to receive TaskEvent, and rarely StopEvent.
|
|
87
|
-
/// and whenever we receive StopEvent we can burn some cycles as it will not be expected to execute fast.
|
|
88
|
-
if (std::holds_alternative<StopEvent>(event)) [[ unlikely ]] {
|
|
89
|
-
// Propagate stop event to all workers
|
|
90
|
-
for (size_t i = 0; i < localWorkerSenders.size(); ++i) {
|
|
91
|
-
localWorkerSenders[i].send(StopEvent{});
|
|
92
|
-
}
|
|
93
|
-
break;
|
|
94
|
-
} else if (std::holds_alternative<TaskEvent>(event)) [[ likely ]] {
|
|
95
|
-
// Dispatch task to the next worker in round-robin fashion
|
|
96
|
-
auto& taskEvent = std::get<TaskEvent>(event);
|
|
97
|
-
localWorkerSenders[nextWorker].send(std::move(taskEvent));
|
|
98
|
-
nextWorker = (nextWorker + 1) % localWorkerSenders.size();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
}; // namespace audioapi
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
#include <audioapi/core/AudioParam.h>
|
|
2
|
-
#include <audioapi/core/OfflineAudioContext.h>
|
|
3
|
-
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
4
|
-
#include <gtest/gtest.h>
|
|
5
|
-
#include "MockAudioEventHandlerRegistry.h"
|
|
6
|
-
|
|
7
|
-
using namespace audioapi;
|
|
8
|
-
|
|
9
|
-
class AudioParamTest : public ::testing::Test {
|
|
10
|
-
protected:
|
|
11
|
-
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
|
|
12
|
-
std::unique_ptr<OfflineAudioContext> context;
|
|
13
|
-
static constexpr int sampleRate = 44100;
|
|
14
|
-
|
|
15
|
-
void SetUp() override {
|
|
16
|
-
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
17
|
-
context = std::make_unique<OfflineAudioContext>(
|
|
18
|
-
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
TEST_F(AudioParamTest, ValueSetters) {
|
|
23
|
-
AudioParam param = AudioParam(0.5, 0.0, 1.0, context.get());
|
|
24
|
-
param.setValue(0.8);
|
|
25
|
-
EXPECT_FLOAT_EQ(param.getValue(), 0.8);
|
|
26
|
-
param.setValue(-0.5);
|
|
27
|
-
EXPECT_FLOAT_EQ(param.getValue(), 0.0);
|
|
28
|
-
param.setValue(1.5);
|
|
29
|
-
EXPECT_FLOAT_EQ(param.getValue(), 1.0);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
TEST_F(AudioParamTest, SetValueAtTime) {
|
|
33
|
-
AudioParam param = AudioParam(0.5, 0.0, 1.0, context.get());
|
|
34
|
-
param.setValueAtTime(0.8, 0.1);
|
|
35
|
-
param.setValueAtTime(0.3, 0.2);
|
|
36
|
-
|
|
37
|
-
float value = param.processKRateParam(1, 0.05);
|
|
38
|
-
EXPECT_FLOAT_EQ(value, 0.5);
|
|
39
|
-
|
|
40
|
-
value = param.processKRateParam(1, 0.1);
|
|
41
|
-
EXPECT_FLOAT_EQ(value, 0.8);
|
|
42
|
-
|
|
43
|
-
value = param.processKRateParam(1, 0.15);
|
|
44
|
-
EXPECT_FLOAT_EQ(value, 0.8);
|
|
45
|
-
|
|
46
|
-
value = param.processKRateParam(1, 0.2);
|
|
47
|
-
EXPECT_FLOAT_EQ(value, 0.3);
|
|
48
|
-
|
|
49
|
-
value = param.processKRateParam(1, 0.25);
|
|
50
|
-
EXPECT_FLOAT_EQ(value, 0.3);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
TEST_F(AudioParamTest, LinearRampToValueAtTime) {
|
|
54
|
-
AudioParam param = AudioParam(0, 0, 1.0, context.get());
|
|
55
|
-
param.linearRampToValueAtTime(1.0, 0.2);
|
|
56
|
-
|
|
57
|
-
float value = param.processKRateParam(1, 0.05);
|
|
58
|
-
EXPECT_FLOAT_EQ(value, 0.25);
|
|
59
|
-
|
|
60
|
-
value = param.processKRateParam(1, 0.1);
|
|
61
|
-
EXPECT_FLOAT_EQ(value, 0.5);
|
|
62
|
-
|
|
63
|
-
value = param.processKRateParam(1, 0.15);
|
|
64
|
-
EXPECT_FLOAT_EQ(value, 0.75);
|
|
65
|
-
|
|
66
|
-
value = param.processKRateParam(1, 0.2);
|
|
67
|
-
EXPECT_FLOAT_EQ(value, 1.0);
|
|
68
|
-
|
|
69
|
-
value = param.processKRateParam(1, 0.25);
|
|
70
|
-
EXPECT_FLOAT_EQ(value, 1.0);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
TEST_F(AudioParamTest, ExponentialRampToValueAtTime) {
|
|
74
|
-
AudioParam param = AudioParam(0.1, 0.0, 1.0, context.get());
|
|
75
|
-
param.exponentialRampToValueAtTime(1.0, 0.2);
|
|
76
|
-
// value(time) = startValue * (endValue/startValue)^((time -
|
|
77
|
-
// startTime)/(endTime - startTime)) value(time) = 0.1 * (1.0/0.1)^((time -
|
|
78
|
-
// 0.0)/(0.2 - 0.0))
|
|
79
|
-
float value = param.processKRateParam(1, 0.05);
|
|
80
|
-
EXPECT_NEAR(value, 0.17783, 1e-5);
|
|
81
|
-
|
|
82
|
-
value = param.processKRateParam(1, 0.1);
|
|
83
|
-
EXPECT_NEAR(value, 0.316228, 1e-5);
|
|
84
|
-
|
|
85
|
-
value = param.processKRateParam(1, 0.15);
|
|
86
|
-
EXPECT_NEAR(value, 0.562341, 1e-5);
|
|
87
|
-
|
|
88
|
-
value = param.processKRateParam(1, 0.2);
|
|
89
|
-
EXPECT_FLOAT_EQ(value, 1.0);
|
|
90
|
-
|
|
91
|
-
value = param.processKRateParam(1, 0.25);
|
|
92
|
-
EXPECT_FLOAT_EQ(value, 1.0);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
TEST_F(AudioParamTest, SetTargetAtTime) {
|
|
96
|
-
AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
|
|
97
|
-
param.setTargetAtTime(1.0, 0.1, 0.1);
|
|
98
|
-
// value(time) = target + (startValue - target) * exp(-(time -
|
|
99
|
-
// startTime)/timeConstant) value(time) = 1.0 + (0.0 - 1.0) * exp(-time/0.1)
|
|
100
|
-
float value = param.processKRateParam(1, 0.05);
|
|
101
|
-
EXPECT_FLOAT_EQ(value, 0.0);
|
|
102
|
-
|
|
103
|
-
value = param.processKRateParam(1, 0.1);
|
|
104
|
-
EXPECT_FLOAT_EQ(value, 0.0);
|
|
105
|
-
|
|
106
|
-
value = param.processKRateParam(1, 0.15);
|
|
107
|
-
EXPECT_NEAR(value, 0.393469, 1e-5);
|
|
108
|
-
|
|
109
|
-
value = param.processKRateParam(1, 0.2);
|
|
110
|
-
EXPECT_NEAR(value, 0.632120, 1e-5);
|
|
111
|
-
|
|
112
|
-
value = param.processKRateParam(1, 0.25);
|
|
113
|
-
EXPECT_NEAR(value, 0.776869, 1e-5);
|
|
114
|
-
|
|
115
|
-
value = param.processKRateParam(1, 0.5);
|
|
116
|
-
EXPECT_NEAR(value, 0.981684, 1e-5);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
TEST_F(AudioParamTest, SetValueCurveAtTime) {
|
|
120
|
-
AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
|
|
121
|
-
param.setValue(0.5);
|
|
122
|
-
auto curve = std::make_shared<std::vector<float>>(
|
|
123
|
-
std::vector<float>{0.1, 0.4, 0.2, 0.8, 0.5});
|
|
124
|
-
param.setValueCurveAtTime(curve, curve->size(), 0.1, 0.2);
|
|
125
|
-
// 5 elements over 0.2s => each element is 0.04s apart
|
|
126
|
-
|
|
127
|
-
float value = param.processKRateParam(1, 0.05);
|
|
128
|
-
EXPECT_FLOAT_EQ(value, 0.0);
|
|
129
|
-
|
|
130
|
-
value = param.processKRateParam(1, 0.1);
|
|
131
|
-
EXPECT_FLOAT_EQ(value, 0.1);
|
|
132
|
-
|
|
133
|
-
// k = 4/0.2 * (0.14 - 0.1) = 0.8 -> floor is 0
|
|
134
|
-
// linear interpolation between 0 and 1 -> 0.1 + (0.4 - 0.1) * 0.8 = 0.34
|
|
135
|
-
value = param.processKRateParam(1, 0.14);
|
|
136
|
-
EXPECT_FLOAT_EQ(value, 0.34);
|
|
137
|
-
|
|
138
|
-
// k = 4/0.2 * (0.18 - 0.1) = 1.6 -> floor is 1
|
|
139
|
-
// linear interpolation between 1 and 2 -> 0.4 + (0.2 - 0.4) * 0.6 = 0.28
|
|
140
|
-
value = param.processKRateParam(1, 0.18);
|
|
141
|
-
EXPECT_FLOAT_EQ(value, 0.28);
|
|
142
|
-
|
|
143
|
-
// k = 4/0.2 * (0.22 - 0.1) = 2.4 -> floor is 2
|
|
144
|
-
// linear interpolation between 2 and 3 -> 0.2 + (0.8 - 0.2) * 0.4 = 0.44
|
|
145
|
-
value = param.processKRateParam(1, 0.22);
|
|
146
|
-
EXPECT_FLOAT_EQ(value, 0.44);
|
|
147
|
-
|
|
148
|
-
// k = 4/0.2 * (0.26 - 0.1) = 3.2 -> floor is 3
|
|
149
|
-
// linear interpolation between 3 and 4 -> 0.8 + (0.5 - 0.8) * 0.2 = 0.74
|
|
150
|
-
value = param.processKRateParam(1, 0.26);
|
|
151
|
-
EXPECT_FLOAT_EQ(value, 0.74);
|
|
152
|
-
|
|
153
|
-
// k = 4/0.2 * (0.3 - 0.1) = 4.0 -> floor is 4
|
|
154
|
-
// at or after end of curve -> last value
|
|
155
|
-
value = param.processKRateParam(1, 0.35);
|
|
156
|
-
EXPECT_FLOAT_EQ(value, 0.5);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
TEST_F(AudioParamTest, CancelScheduledValues) {
|
|
160
|
-
AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
|
|
161
|
-
param.setValueAtTime(0.8, 0.1);
|
|
162
|
-
param.setValueAtTime(0.3, 0.2);
|
|
163
|
-
param.linearRampToValueAtTime(1.0, 0.4);
|
|
164
|
-
param.cancelScheduledValues(0.15);
|
|
165
|
-
|
|
166
|
-
float value = param.processKRateParam(1, 0.05);
|
|
167
|
-
EXPECT_FLOAT_EQ(value, 0.0);
|
|
168
|
-
|
|
169
|
-
value = param.processKRateParam(1, 0.1);
|
|
170
|
-
EXPECT_FLOAT_EQ(value, 0.8);
|
|
171
|
-
|
|
172
|
-
value = param.processKRateParam(1, 0.15);
|
|
173
|
-
EXPECT_FLOAT_EQ(value, 0.8);
|
|
174
|
-
|
|
175
|
-
// Events after cancel time are removed -> stays at last value
|
|
176
|
-
value = param.processKRateParam(1, 0.2);
|
|
177
|
-
EXPECT_FLOAT_EQ(value, 0.8);
|
|
178
|
-
|
|
179
|
-
value = param.processKRateParam(1, 0.25);
|
|
180
|
-
EXPECT_FLOAT_EQ(value, 0.8);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
TEST_F(AudioParamTest, CancelAndHoldAtTime) {
|
|
184
|
-
AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
|
|
185
|
-
param.setValueAtTime(0.8, 0.1);
|
|
186
|
-
param.linearRampToValueAtTime(1.0, 0.2);
|
|
187
|
-
param.cancelAndHoldAtTime(0.15);
|
|
188
|
-
|
|
189
|
-
float value = param.processKRateParam(1, 0.05);
|
|
190
|
-
EXPECT_FLOAT_EQ(value, 0.0);
|
|
191
|
-
|
|
192
|
-
value = param.processKRateParam(1, 0.1);
|
|
193
|
-
EXPECT_FLOAT_EQ(value, 0.8);
|
|
194
|
-
|
|
195
|
-
value = param.processKRateParam(1, 0.15);
|
|
196
|
-
EXPECT_FLOAT_EQ(value, 0.9);
|
|
197
|
-
|
|
198
|
-
// Events after cancel time are removed -> stays at last value
|
|
199
|
-
value = param.processKRateParam(1, 0.2);
|
|
200
|
-
EXPECT_FLOAT_EQ(value, 0.9);
|
|
201
|
-
|
|
202
|
-
value = param.processKRateParam(1, 0.25);
|
|
203
|
-
EXPECT_FLOAT_EQ(value, 0.9);
|
|
204
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _AudioParam = _interopRequireDefault(require("./AudioParam"));
|
|
8
|
-
var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
class ConstantSourceNode extends _AudioScheduledSourceNode.default {
|
|
11
|
-
constructor(context, node) {
|
|
12
|
-
super(context, node);
|
|
13
|
-
this.offset = new _AudioParam.default(node.offset, context);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
exports.default = ConstantSourceNode;
|
|
17
|
-
//# sourceMappingURL=ConstantSourceNode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioParam","_interopRequireDefault","require","_AudioScheduledSourceNode","e","__esModule","default","ConstantSourceNode","AudioScheduledSourceNode","constructor","context","node","offset","AudioParam","exports"],"sourceRoot":"../../../src","sources":["core/ConstantSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGnD,MAAMG,kBAAkB,SAASC,iCAAwB,CAAC;EAGvEC,WAAWA,CAACC,OAAyB,EAAEC,IAAyB,EAAE;IAChE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IACpB,IAAI,CAACC,MAAM,GAAG,IAAIC,mBAAU,CAACF,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;EACpD;AACF;AAACI,OAAA,CAAAR,OAAA,GAAAC,kBAAA","ignoreList":[]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _AudioNode = _interopRequireDefault(require("./AudioNode"));
|
|
8
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
class WorkletNode extends _AudioNode.default {}
|
|
10
|
-
exports.default = WorkletNode;
|
|
11
|
-
//# sourceMappingURL=WorkletNode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","e","__esModule","default","WorkletNode","AudioNode","exports"],"sourceRoot":"../../../src","sources":["core/WorkletNode.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAoC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErB,MAAMG,WAAW,SAASC,kBAAS,CAAC;AAAEC,OAAA,CAAAH,OAAA,GAAAC,WAAA","ignoreList":[]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _AudioNode = _interopRequireDefault(require("./AudioNode"));
|
|
8
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
class WorkletProcessingNode extends _AudioNode.default {}
|
|
10
|
-
exports.default = WorkletProcessingNode;
|
|
11
|
-
//# sourceMappingURL=WorkletProcessingNode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","e","__esModule","default","WorkletProcessingNode","AudioNode","exports"],"sourceRoot":"../../../src","sources":["core/WorkletProcessingNode.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAoC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErB,MAAMG,qBAAqB,SAASC,kBAAS,CAAC;AAAEC,OAAA,CAAAH,OAAA,GAAAC,qBAAA","ignoreList":[]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
|
|
8
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
class WorkletSourceNode extends _AudioScheduledSourceNode.default {}
|
|
10
|
-
exports.default = WorkletSourceNode;
|
|
11
|
-
//# sourceMappingURL=WorkletSourceNode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioScheduledSourceNode","_interopRequireDefault","require","e","__esModule","default","WorkletSourceNode","AudioScheduledSourceNode","exports"],"sourceRoot":"../../../src","sources":["core/WorkletSourceNode.ts"],"mappings":";;;;;;AAAA,IAAAA,yBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnD,MAAMG,iBAAiB,SAASC,iCAAwB,CAAC;AAAEC,OAAA,CAAAH,OAAA,GAAAC,iBAAA","ignoreList":[]}
|