react-native-audio-api 0.11.0-nightly-141c86f-20251118 → 0.11.0-nightly-4e6f25c-20251119
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/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
- package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +4 -4
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +11 -20
- package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +24 -46
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +48 -78
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -21
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +42 -78
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -1
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +14 -18
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
- package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
- package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +16 -28
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +4 -6
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +8 -10
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +1 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +13 -27
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +11 -12
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +15 -22
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +7 -12
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -9
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +16 -30
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +6 -10
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
- package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +4 -8
- package/common/cpp/audioapi/core/AudioContext.cpp +4 -4
- package/common/cpp/audioapi/core/AudioContext.h +5 -2
- package/common/cpp/audioapi/core/AudioNode.cpp +13 -19
- package/common/cpp/audioapi/core/AudioNode.h +14 -7
- package/common/cpp/audioapi/core/AudioParam.cpp +66 -98
- package/common/cpp/audioapi/core/AudioParam.h +20 -12
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +22 -34
- package/common/cpp/audioapi/core/BaseAudioContext.h +19 -15
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
- package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +17 -36
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +2 -9
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +18 -28
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +19 -10
- package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
- package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
- package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
- package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +9 -8
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +4 -5
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +31 -53
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +35 -33
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +19 -20
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +38 -36
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +25 -40
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +9 -9
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +3 -3
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +18 -16
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +7 -4
- package/common/cpp/audioapi/core/sources/StreamerNode.h +38 -30
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
- package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +13 -22
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
- package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
- package/common/cpp/audioapi/core/utils/Constants.h +5 -3
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +29 -34
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +14 -16
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +3 -9
- package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
- package/common/cpp/audioapi/dsp/Convolver.cpp +13 -25
- package/common/cpp/audioapi/dsp/Convolver.h +26 -24
- package/common/cpp/audioapi/dsp/FFT.cpp +1 -1
- package/common/cpp/audioapi/dsp/FFT.h +5 -13
- package/common/cpp/audioapi/dsp/VectorMath.cpp +9 -43
- package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
- package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
- package/common/cpp/audioapi/dsp/Windows.h +24 -23
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +44 -39
- package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
- package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
- package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +11 -21
- package/common/cpp/audioapi/jsi/JsiPromise.h +55 -46
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
- package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
- package/common/cpp/audioapi/utils/AudioArray.h +3 -11
- package/common/cpp/audioapi/utils/AudioBus.cpp +51 -149
- package/common/cpp/audioapi/utils/AudioBus.h +15 -15
- package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
- package/common/cpp/test/src/AudioParamTest.cpp +3 -2
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +14 -35
- package/common/cpp/test/src/ConstantSourceTest.cpp +4 -6
- package/common/cpp/test/src/GainTest.cpp +3 -4
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
- package/common/cpp/test/src/OscillatorTest.cpp +1 -0
- package/common/cpp/test/src/StereoPannerTest.cpp +5 -8
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +10 -27
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +7 -6
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +16 -28
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +13 -6
- package/ios/audioapi/ios/AudioAPIModule.h +4 -6
- package/ios/audioapi/ios/AudioAPIModule.mm +31 -46
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +24 -33
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +4 -6
- package/ios/audioapi/ios/core/NativeAudioPlayer.m +3 -5
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +21 -33
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +17 -37
- package/ios/audioapi/ios/system/AudioEngine.h +2 -4
- package/ios/audioapi/ios/system/AudioEngine.mm +7 -19
- package/ios/audioapi/ios/system/AudioSessionManager.h +2 -4
- package/ios/audioapi/ios/system/AudioSessionManager.mm +17 -32
- package/ios/audioapi/ios/system/LockScreenManager.mm +73 -105
- package/ios/audioapi/ios/system/NotificationManager.mm +43 -68
- package/package.json +2 -2
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
#include <audioapi/core/utils/Constants.h>
|
|
4
4
|
#include <audioapi/utils/AudioArray.h>
|
|
5
5
|
#include <audioapi/utils/AudioBus.h>
|
|
6
|
+
#include <memory>
|
|
6
7
|
|
|
7
8
|
// https://webaudio.github.io/web-audio-api/#stereopanner-algorithm
|
|
8
9
|
|
|
9
10
|
namespace audioapi {
|
|
10
11
|
|
|
11
|
-
StereoPannerNode::StereoPannerNode(BaseAudioContext *context)
|
|
12
|
-
: AudioNode(context) {
|
|
12
|
+
StereoPannerNode::StereoPannerNode(BaseAudioContext *context) : AudioNode(context) {
|
|
13
13
|
channelCountMode_ = ChannelCountMode::CLAMPED_MAX;
|
|
14
14
|
panParam_ = std::make_shared<AudioParam>(0.0, -1.0f, 1.0f, context);
|
|
15
15
|
isInitialized_ = true;
|
|
@@ -26,9 +26,8 @@ std::shared_ptr<AudioBus> StereoPannerNode::processNode(
|
|
|
26
26
|
double deltaTime = 1.0 / context_->getSampleRate();
|
|
27
27
|
|
|
28
28
|
auto *inputLeft = processingBus->getChannelByType(AudioBus::ChannelLeft);
|
|
29
|
-
auto panParamValues =
|
|
30
|
-
|
|
31
|
-
->getData();
|
|
29
|
+
auto panParamValues =
|
|
30
|
+
panParam_->processARateParam(framesToProcess, time)->getChannel(0)->getData();
|
|
32
31
|
|
|
33
32
|
auto *outputLeft = audioBus_->getChannelByType(AudioBus::ChannelLeft);
|
|
34
33
|
auto *outputRight = audioBus_->getChannelByType(AudioBus::ChannelRight);
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
#include <audioapi/core/AudioParam.h>
|
|
5
5
|
|
|
6
6
|
#include <algorithm>
|
|
7
|
-
#include <memory>
|
|
8
7
|
#include <cassert>
|
|
8
|
+
#include <memory>
|
|
9
9
|
|
|
10
10
|
namespace audioapi {
|
|
11
11
|
|
|
@@ -18,7 +18,9 @@ class StereoPannerNode : public AudioNode {
|
|
|
18
18
|
[[nodiscard]] std::shared_ptr<AudioParam> getPanParam() const;
|
|
19
19
|
|
|
20
20
|
protected:
|
|
21
|
-
std::shared_ptr<AudioBus> processNode(
|
|
21
|
+
std::shared_ptr<AudioBus> processNode(
|
|
22
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
23
|
+
int framesToProcess) override;
|
|
22
24
|
|
|
23
25
|
private:
|
|
24
26
|
std::shared_ptr<AudioParam> panParam_;
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
#include <audioapi/core/effects/WorkletNode.h>
|
|
2
|
+
#include <algorithm>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <utility>
|
|
5
|
+
#include <vector>
|
|
2
6
|
|
|
3
7
|
namespace audioapi {
|
|
4
8
|
|
|
@@ -12,8 +16,7 @@ WorkletNode::WorkletNode(
|
|
|
12
16
|
bufferLength_(bufferLength),
|
|
13
17
|
inputChannelCount_(inputChannelCount),
|
|
14
18
|
curBuffIndex_(0) {
|
|
15
|
-
bus_ = std::make_shared<AudioBus>(
|
|
16
|
-
bufferLength, inputChannelCount, context->getSampleRate());
|
|
19
|
+
bus_ = std::make_shared<AudioBus>(bufferLength, inputChannelCount, context->getSampleRate());
|
|
17
20
|
isInitialized_ = true;
|
|
18
21
|
}
|
|
19
22
|
|
|
@@ -21,9 +24,8 @@ std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
|
21
24
|
const std::shared_ptr<AudioBus> &processingBus,
|
|
22
25
|
int framesToProcess) {
|
|
23
26
|
size_t processed = 0;
|
|
24
|
-
size_t channelCount_ =
|
|
25
|
-
inputChannelCount_,
|
|
26
|
-
static_cast<size_t>(processingBus->getNumberOfChannels()));
|
|
27
|
+
size_t channelCount_ =
|
|
28
|
+
std::min(inputChannelCount_, static_cast<size_t>(processingBus->getNumberOfChannels()));
|
|
27
29
|
while (processed < framesToProcess) {
|
|
28
30
|
size_t framesToWorkletInvoke = bufferLength_ - curBuffIndex_;
|
|
29
31
|
size_t needsToProcess = framesToProcess - processed;
|
|
@@ -43,8 +45,7 @@ std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
|
43
45
|
}
|
|
44
46
|
// Reset buffer index, channel buffers and execute worklet
|
|
45
47
|
curBuffIndex_ = 0;
|
|
46
|
-
workletRunner_.executeOnRuntimeSync([this, channelCount_](
|
|
47
|
-
jsi::Runtime &uiRuntimeRaw) {
|
|
48
|
+
workletRunner_.executeOnRuntimeSync([this, channelCount_](jsi::Runtime &uiRuntimeRaw) {
|
|
48
49
|
/// Arguments preparation
|
|
49
50
|
auto jsArray = jsi::Array(uiRuntimeRaw, channelCount_);
|
|
50
51
|
for (size_t ch = 0; ch < channelCount_; ch++) {
|
|
@@ -52,10 +53,8 @@ std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
|
52
53
|
audioArray->copy(bus_->getChannel(ch));
|
|
53
54
|
auto sharedAudioArray = std::make_shared<AudioArrayBuffer>(audioArray);
|
|
54
55
|
auto sharedAudioArraySize = sharedAudioArray->size();
|
|
55
|
-
auto arrayBuffer =
|
|
56
|
-
|
|
57
|
-
arrayBuffer.setExternalMemoryPressure(
|
|
58
|
-
uiRuntimeRaw, sharedAudioArraySize);
|
|
56
|
+
auto arrayBuffer = jsi::ArrayBuffer(uiRuntimeRaw, std::move(sharedAudioArray));
|
|
57
|
+
arrayBuffer.setExternalMemoryPressure(uiRuntimeRaw, sharedAudioArraySize);
|
|
59
58
|
jsArray.setValueAtIndex(uiRuntimeRaw, ch, std::move(arrayBuffer));
|
|
60
59
|
}
|
|
61
60
|
|
|
@@ -63,8 +62,7 @@ std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
|
63
62
|
|
|
64
63
|
/// Call the worklet
|
|
65
64
|
workletRunner_.callUnsafe(
|
|
66
|
-
std::move(jsArray),
|
|
67
|
-
jsi::Value(uiRuntimeRaw, static_cast<int>(channelCount_)));
|
|
65
|
+
std::move(jsArray), jsi::Value(uiRuntimeRaw, static_cast<int>(channelCount_)));
|
|
68
66
|
|
|
69
67
|
return jsi::Value::undefined();
|
|
70
68
|
});
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
#include <jsi/jsi.h>
|
|
5
|
-
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
6
3
|
#include <audioapi/core/AudioNode.h>
|
|
7
4
|
#include <audioapi/core/BaseAudioContext.h>
|
|
8
|
-
#include <audioapi/utils/
|
|
9
|
-
#include <audioapi/utils/AudioArray.h>
|
|
5
|
+
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
10
6
|
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
7
|
+
#include <audioapi/utils/AudioArray.h>
|
|
8
|
+
#include <audioapi/utils/AudioBus.h>
|
|
9
|
+
#include <jsi/jsi.h>
|
|
11
10
|
|
|
12
11
|
#include <memory>
|
|
13
12
|
#include <vector>
|
|
@@ -21,11 +20,15 @@ class WorkletNode : public AudioNode {
|
|
|
21
20
|
BaseAudioContext *context,
|
|
22
21
|
size_t bufferLength,
|
|
23
22
|
size_t inputChannelCount,
|
|
24
|
-
WorkletsRunner &&workletRunner
|
|
25
|
-
|
|
23
|
+
WorkletsRunner &&workletRunner)
|
|
24
|
+
: AudioNode(context) {}
|
|
26
25
|
|
|
27
26
|
protected:
|
|
28
|
-
std::shared_ptr<AudioBus> processNode(
|
|
27
|
+
std::shared_ptr<AudioBus> processNode(
|
|
28
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
29
|
+
int framesToProcess) override {
|
|
30
|
+
return processingBus;
|
|
31
|
+
}
|
|
29
32
|
};
|
|
30
33
|
#else
|
|
31
34
|
|
|
@@ -37,14 +40,14 @@ class WorkletNode : public AudioNode {
|
|
|
37
40
|
BaseAudioContext *context,
|
|
38
41
|
size_t bufferLength,
|
|
39
42
|
size_t inputChannelCount,
|
|
40
|
-
WorkletsRunner &&workletRunner
|
|
41
|
-
);
|
|
43
|
+
WorkletsRunner &&workletRunner);
|
|
42
44
|
|
|
43
45
|
~WorkletNode() override = default;
|
|
44
46
|
|
|
45
47
|
protected:
|
|
46
|
-
std::shared_ptr<AudioBus> processNode(
|
|
47
|
-
|
|
48
|
+
std::shared_ptr<AudioBus> processNode(
|
|
49
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
50
|
+
int framesToProcess) override;
|
|
48
51
|
|
|
49
52
|
private:
|
|
50
53
|
WorkletsRunner workletRunner_;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#include <audioapi/core/effects/WorkletProcessingNode.h>
|
|
2
2
|
#include <audioapi/core/utils/Constants.h>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <utility>
|
|
3
5
|
|
|
4
6
|
namespace audioapi {
|
|
5
7
|
|
|
@@ -19,8 +21,7 @@ WorkletProcessingNode::WorkletProcessingNode(
|
|
|
19
21
|
inputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(inputAudioArray);
|
|
20
22
|
|
|
21
23
|
auto outputAudioArray = std::make_shared<AudioArray>(RENDER_QUANTUM_SIZE);
|
|
22
|
-
outputBuffsHandles_[i] =
|
|
23
|
-
std::make_shared<AudioArrayBuffer>(outputAudioArray);
|
|
24
|
+
outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(outputAudioArray);
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
27
|
|
|
@@ -52,8 +53,7 @@ std::shared_ptr<AudioBus> WorkletProcessingNode::processNode(
|
|
|
52
53
|
inputJsArray.setValueAtIndex(rt, ch, inputArrayBuffer);
|
|
53
54
|
|
|
54
55
|
// Create output array buffer
|
|
55
|
-
auto outputArrayBuffer =
|
|
56
|
-
jsi::ArrayBuffer(rt, outputBuffsHandles_[ch]);
|
|
56
|
+
auto outputArrayBuffer = jsi::ArrayBuffer(rt, outputBuffsHandles_[ch]);
|
|
57
57
|
outputJsArray.setValueAtIndex(rt, ch, outputArrayBuffer);
|
|
58
58
|
}
|
|
59
59
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include <jsi/jsi.h>
|
|
4
|
-
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
5
3
|
#include <audioapi/core/AudioNode.h>
|
|
6
4
|
#include <audioapi/core/BaseAudioContext.h>
|
|
7
|
-
#include <audioapi/utils/
|
|
8
|
-
#include <audioapi/utils/AudioArray.h>
|
|
5
|
+
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
9
6
|
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
7
|
+
#include <audioapi/utils/AudioArray.h>
|
|
8
|
+
#include <audioapi/utils/AudioBus.h>
|
|
9
|
+
#include <jsi/jsi.h>
|
|
10
10
|
|
|
11
11
|
#include <memory>
|
|
12
12
|
#include <vector>
|
|
@@ -16,13 +16,15 @@ namespace audioapi {
|
|
|
16
16
|
#if RN_AUDIO_API_TEST
|
|
17
17
|
class WorkletProcessingNode : public AudioNode {
|
|
18
18
|
public:
|
|
19
|
-
explicit WorkletProcessingNode(
|
|
20
|
-
|
|
21
|
-
WorkletsRunner &&workletRunner
|
|
22
|
-
) : AudioNode(context) {}
|
|
19
|
+
explicit WorkletProcessingNode(BaseAudioContext *context, WorkletsRunner &&workletRunner)
|
|
20
|
+
: AudioNode(context) {}
|
|
23
21
|
|
|
24
22
|
protected:
|
|
25
|
-
std::shared_ptr<AudioBus> processNode(
|
|
23
|
+
std::shared_ptr<AudioBus> processNode(
|
|
24
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
25
|
+
int framesToProcess) override {
|
|
26
|
+
return processingBus;
|
|
27
|
+
}
|
|
26
28
|
};
|
|
27
29
|
#else
|
|
28
30
|
|
|
@@ -30,13 +32,12 @@ using namespace facebook;
|
|
|
30
32
|
|
|
31
33
|
class WorkletProcessingNode : public AudioNode {
|
|
32
34
|
public:
|
|
33
|
-
explicit WorkletProcessingNode(
|
|
34
|
-
BaseAudioContext *context,
|
|
35
|
-
WorkletsRunner &&workletRunner
|
|
36
|
-
);
|
|
35
|
+
explicit WorkletProcessingNode(BaseAudioContext *context, WorkletsRunner &&workletRunner);
|
|
37
36
|
|
|
38
37
|
protected:
|
|
39
|
-
std::shared_ptr<AudioBus> processNode(
|
|
38
|
+
std::shared_ptr<AudioBus> processNode(
|
|
39
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
40
|
+
int framesToProcess) override;
|
|
40
41
|
|
|
41
42
|
private:
|
|
42
43
|
WorkletsRunner workletRunner_;
|
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
#include <audioapi/utils/AudioBus.h>
|
|
7
7
|
#include <audioapi/utils/CircularAudioArray.h>
|
|
8
8
|
#include <audioapi/utils/CircularOverflowableAudioArray.h>
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
#include <memory>
|
|
11
|
+
#include <string>
|
|
12
|
+
#include <unordered_map>
|
|
9
13
|
|
|
10
14
|
namespace audioapi {
|
|
11
15
|
|
|
@@ -30,8 +34,7 @@ void AudioRecorder::invokeOnAudioReadyCallback(
|
|
|
30
34
|
const std::shared_ptr<AudioBus> &bus,
|
|
31
35
|
int numFrames) {
|
|
32
36
|
auto audioBuffer = std::make_shared<AudioBuffer>(bus);
|
|
33
|
-
auto audioBufferHostObject =
|
|
34
|
-
std::make_shared<AudioBufferHostObject>(audioBuffer);
|
|
37
|
+
auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(audioBuffer);
|
|
35
38
|
|
|
36
39
|
std::unordered_map<std::string, EventValue> body = {};
|
|
37
40
|
body.insert({"buffer", audioBufferHostObject});
|
|
@@ -44,14 +47,12 @@ void AudioRecorder::invokeOnAudioReadyCallback(
|
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
void AudioRecorder::sendRemainingData() {
|
|
47
|
-
auto bus =
|
|
48
|
-
circularBuffer_->getNumberOfAvailableFrames(), 1, sampleRate_);
|
|
50
|
+
auto bus =
|
|
51
|
+
std::make_shared<AudioBus>(circularBuffer_->getNumberOfAvailableFrames(), 1, sampleRate_);
|
|
49
52
|
auto *outputChannel = bus->getChannel(0)->getData();
|
|
50
|
-
auto availableFrames =
|
|
51
|
-
static_cast<int>(circularBuffer_->getNumberOfAvailableFrames());
|
|
53
|
+
auto availableFrames = static_cast<int>(circularBuffer_->getNumberOfAvailableFrames());
|
|
52
54
|
|
|
53
|
-
circularBuffer_->pop_front(
|
|
54
|
-
outputChannel, circularBuffer_->getNumberOfAvailableFrames());
|
|
55
|
+
circularBuffer_->pop_front(outputChannel, circularBuffer_->getNumberOfAvailableFrames());
|
|
55
56
|
|
|
56
57
|
invokeOnAudioReadyCallback(bus, availableFrames);
|
|
57
58
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include <memory>
|
|
4
3
|
#include <atomic>
|
|
4
|
+
#include <memory>
|
|
5
5
|
#include <mutex>
|
|
6
6
|
|
|
7
7
|
namespace audioapi {
|
|
@@ -15,10 +15,9 @@ class AudioEventHandlerRegistry;
|
|
|
15
15
|
class AudioRecorder {
|
|
16
16
|
public:
|
|
17
17
|
explicit AudioRecorder(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
);
|
|
18
|
+
float sampleRate,
|
|
19
|
+
int bufferLength,
|
|
20
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
22
21
|
|
|
23
22
|
virtual ~AudioRecorder() = default;
|
|
24
23
|
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
#include <audioapi/utils/AudioArray.h>
|
|
3
3
|
#include <audioapi/utils/AudioBus.h>
|
|
4
4
|
|
|
5
|
+
#include <algorithm>
|
|
6
|
+
#include <memory>
|
|
5
7
|
#include <utility>
|
|
6
8
|
|
|
7
9
|
namespace audioapi {
|
|
8
10
|
|
|
9
|
-
AudioBuffer::AudioBuffer(
|
|
10
|
-
int numberOfChannels,
|
|
11
|
-
size_t length,
|
|
12
|
-
float sampleRate) {
|
|
11
|
+
AudioBuffer::AudioBuffer(int numberOfChannels, size_t length, float sampleRate) {
|
|
13
12
|
bus_ = std::make_shared<AudioBus>(length, numberOfChannels, sampleRate);
|
|
14
13
|
}
|
|
15
14
|
|
|
@@ -45,8 +44,7 @@ void AudioBuffer::copyFromChannel(
|
|
|
45
44
|
memcpy(
|
|
46
45
|
destination,
|
|
47
46
|
bus_->getChannel(channelNumber)->getData() + startInChannel,
|
|
48
|
-
std::min(destinationLength, getLength() - startInChannel) *
|
|
49
|
-
sizeof(float));
|
|
47
|
+
std::min(destinationLength, getLength() - startInChannel) * sizeof(float));
|
|
50
48
|
}
|
|
51
49
|
|
|
52
50
|
void AudioBuffer::copyToChannel(
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <algorithm>
|
|
4
|
+
#include <cstddef>
|
|
5
|
+
#include <cstring>
|
|
4
6
|
#include <memory>
|
|
5
7
|
#include <string>
|
|
6
8
|
#include <vector>
|
|
7
|
-
#include <cstddef>
|
|
8
|
-
#include <cstring>
|
|
9
9
|
|
|
10
10
|
namespace audioapi {
|
|
11
11
|
|
|
@@ -28,11 +28,8 @@ class AudioBuffer : public std::enable_shared_from_this<AudioBuffer> {
|
|
|
28
28
|
size_t destinationLength,
|
|
29
29
|
int channelNumber,
|
|
30
30
|
size_t startInChannel) const;
|
|
31
|
-
void
|
|
32
|
-
|
|
33
|
-
size_t sourceLength,
|
|
34
|
-
int channelNumber,
|
|
35
|
-
size_t startInChannel);
|
|
31
|
+
void
|
|
32
|
+
copyToChannel(const float *source, size_t sourceLength, int channelNumber, size_t startInChannel);
|
|
36
33
|
|
|
37
34
|
private:
|
|
38
35
|
friend class AudioBufferSourceNode;
|
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
6
6
|
#include <audioapi/utils/AudioArray.h>
|
|
7
7
|
#include <audioapi/utils/AudioBus.h>
|
|
8
|
+
#include <memory>
|
|
9
|
+
#include <string>
|
|
10
|
+
#include <unordered_map>
|
|
8
11
|
|
|
9
12
|
namespace audioapi {
|
|
10
13
|
AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(
|
|
11
14
|
BaseAudioContext *context,
|
|
12
15
|
bool pitchCorrection)
|
|
13
|
-
: AudioScheduledSourceNode(context),
|
|
14
|
-
pitchCorrection_(pitchCorrection),
|
|
15
|
-
vReadIndex_(0.0) {
|
|
16
|
+
: AudioScheduledSourceNode(context), pitchCorrection_(pitchCorrection), vReadIndex_(0.0) {
|
|
16
17
|
onPositionChangedInterval_ = static_cast<int>(context->getSampleRate() * 0.1);
|
|
17
18
|
|
|
18
19
|
detuneParam_ = std::make_shared<AudioParam>(
|
|
@@ -20,36 +21,31 @@ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(
|
|
|
20
21
|
playbackRateParam_ = std::make_shared<AudioParam>(
|
|
21
22
|
1.0, MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT, context);
|
|
22
23
|
|
|
23
|
-
playbackRateBus_ =
|
|
24
|
-
RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
|
|
24
|
+
playbackRateBus_ =
|
|
25
|
+
std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
|
|
25
26
|
|
|
26
|
-
stretch_ =
|
|
27
|
-
std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();
|
|
27
|
+
stretch_ = std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getDetuneParam() const {
|
|
31
31
|
return detuneParam_;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getPlaybackRateParam()
|
|
35
|
-
const {
|
|
34
|
+
std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getPlaybackRateParam() const {
|
|
36
35
|
return playbackRateParam_;
|
|
37
36
|
}
|
|
38
37
|
|
|
39
|
-
void AudioBufferBaseSourceNode::setOnPositionChangedCallbackId(
|
|
40
|
-
|
|
41
|
-
auto oldCallbackId = onPositionChangedCallbackId_.exchange(
|
|
42
|
-
callbackId, std::memory_order_acq_rel);
|
|
38
|
+
void AudioBufferBaseSourceNode::setOnPositionChangedCallbackId(uint64_t callbackId) {
|
|
39
|
+
auto oldCallbackId = onPositionChangedCallbackId_.exchange(callbackId, std::memory_order_acq_rel);
|
|
43
40
|
|
|
44
41
|
if (oldCallbackId != 0) {
|
|
45
|
-
audioEventHandlerRegistry_->unregisterHandler(
|
|
46
|
-
"positionChanged", oldCallbackId);
|
|
42
|
+
audioEventHandlerRegistry_->unregisterHandler("positionChanged", oldCallbackId);
|
|
47
43
|
}
|
|
48
44
|
}
|
|
49
45
|
|
|
50
46
|
void AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) {
|
|
51
|
-
onPositionChangedInterval_ =
|
|
52
|
-
context_->getSampleRate() * static_cast<float>(interval) / 1000);
|
|
47
|
+
onPositionChangedInterval_ =
|
|
48
|
+
static_cast<int>(context_->getSampleRate() * static_cast<float>(interval) / 1000);
|
|
53
49
|
}
|
|
54
50
|
|
|
55
51
|
int AudioBufferBaseSourceNode::getOnPositionChangedInterval() const {
|
|
@@ -62,28 +58,23 @@ std::mutex &AudioBufferBaseSourceNode::getBufferLock() {
|
|
|
62
58
|
|
|
63
59
|
double AudioBufferBaseSourceNode::getInputLatency() const {
|
|
64
60
|
if (pitchCorrection_) {
|
|
65
|
-
return static_cast<double>(stretch_->inputLatency()) /
|
|
66
|
-
context_->getSampleRate();
|
|
61
|
+
return static_cast<double>(stretch_->inputLatency()) / context_->getSampleRate();
|
|
67
62
|
}
|
|
68
63
|
return 0;
|
|
69
64
|
}
|
|
70
65
|
|
|
71
66
|
double AudioBufferBaseSourceNode::getOutputLatency() const {
|
|
72
67
|
if (pitchCorrection_) {
|
|
73
|
-
return static_cast<double>(stretch_->outputLatency()) /
|
|
74
|
-
context_->getSampleRate();
|
|
68
|
+
return static_cast<double>(stretch_->outputLatency()) / context_->getSampleRate();
|
|
75
69
|
}
|
|
76
70
|
return 0;
|
|
77
71
|
}
|
|
78
72
|
|
|
79
73
|
void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() {
|
|
80
|
-
auto onPositionChangedCallbackId =
|
|
81
|
-
onPositionChangedCallbackId_.load(std::memory_order_acquire);
|
|
74
|
+
auto onPositionChangedCallbackId = onPositionChangedCallbackId_.load(std::memory_order_acquire);
|
|
82
75
|
|
|
83
|
-
if (onPositionChangedCallbackId != 0 &&
|
|
84
|
-
|
|
85
|
-
std::unordered_map<std::string, EventValue> body = {
|
|
86
|
-
{"value", getCurrentPosition()}};
|
|
76
|
+
if (onPositionChangedCallbackId != 0 && onPositionChangedTime_ > onPositionChangedInterval_) {
|
|
77
|
+
std::unordered_map<std::string, EventValue> body = {{"value", getCurrentPosition()}};
|
|
87
78
|
|
|
88
79
|
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
89
80
|
"positionChanged", onPositionChangedCallbackId, body);
|
|
@@ -101,34 +92,26 @@ void AudioBufferBaseSourceNode::processWithPitchCorrection(
|
|
|
101
92
|
size_t offsetLength = 0;
|
|
102
93
|
|
|
103
94
|
auto time = context_->getCurrentTime();
|
|
104
|
-
auto playbackRate =
|
|
105
|
-
playbackRateParam_->processKRateParam(framesToProcess, time), 0.0f, 3.0f);
|
|
106
|
-
auto detune =
|
|
107
|
-
detuneParam_->processKRateParam(framesToProcess, time) / 100.0f,
|
|
108
|
-
-12.0f,
|
|
109
|
-
12.0f);
|
|
95
|
+
auto playbackRate =
|
|
96
|
+
std::clamp(playbackRateParam_->processKRateParam(framesToProcess, time), 0.0f, 3.0f);
|
|
97
|
+
auto detune =
|
|
98
|
+
std::clamp(detuneParam_->processKRateParam(framesToProcess, time) / 100.0f, -12.0f, 12.0f);
|
|
110
99
|
|
|
111
100
|
playbackRateBus_->zero();
|
|
112
101
|
|
|
113
|
-
auto framesNeededToStretch =
|
|
114
|
-
static_cast<int>(playbackRate * static_cast<float>(framesToProcess));
|
|
102
|
+
auto framesNeededToStretch = static_cast<int>(playbackRate * static_cast<float>(framesToProcess));
|
|
115
103
|
|
|
116
|
-
updatePlaybackInfo(
|
|
117
|
-
playbackRateBus_, framesNeededToStretch, startOffset, offsetLength);
|
|
104
|
+
updatePlaybackInfo(playbackRateBus_, framesNeededToStretch, startOffset, offsetLength);
|
|
118
105
|
|
|
119
106
|
if (playbackRate == 0.0f || (!isPlaying() && !isStopScheduled())) {
|
|
120
107
|
processingBus->zero();
|
|
121
108
|
return;
|
|
122
109
|
}
|
|
123
110
|
|
|
124
|
-
processWithoutInterpolation(
|
|
125
|
-
playbackRateBus_, startOffset, offsetLength, playbackRate);
|
|
111
|
+
processWithoutInterpolation(playbackRateBus_, startOffset, offsetLength, playbackRate);
|
|
126
112
|
|
|
127
113
|
stretch_->process(
|
|
128
|
-
playbackRateBus_.get()[0],
|
|
129
|
-
framesNeededToStretch,
|
|
130
|
-
processingBus.get()[0],
|
|
131
|
-
framesToProcess);
|
|
114
|
+
playbackRateBus_.get()[0], framesNeededToStretch, processingBus.get()[0], framesToProcess);
|
|
132
115
|
|
|
133
116
|
if (detune != 0.0f) {
|
|
134
117
|
stretch_->setTransposeSemitones(detune);
|
|
@@ -152,24 +135,19 @@ void AudioBufferBaseSourceNode::processWithoutPitchCorrection(
|
|
|
152
135
|
}
|
|
153
136
|
|
|
154
137
|
if (std::fabs(computedPlaybackRate) == 1.0) {
|
|
155
|
-
processWithoutInterpolation(
|
|
156
|
-
processingBus, startOffset, offsetLength, computedPlaybackRate);
|
|
138
|
+
processWithoutInterpolation(processingBus, startOffset, offsetLength, computedPlaybackRate);
|
|
157
139
|
} else {
|
|
158
|
-
processWithInterpolation(
|
|
159
|
-
processingBus, startOffset, offsetLength, computedPlaybackRate);
|
|
140
|
+
processWithInterpolation(processingBus, startOffset, offsetLength, computedPlaybackRate);
|
|
160
141
|
}
|
|
161
142
|
|
|
162
143
|
sendOnPositionChangedEvent();
|
|
163
144
|
}
|
|
164
145
|
|
|
165
|
-
float AudioBufferBaseSourceNode::getComputedPlaybackRateValue(
|
|
166
|
-
int framesToProcess) {
|
|
146
|
+
float AudioBufferBaseSourceNode::getComputedPlaybackRateValue(int framesToProcess) {
|
|
167
147
|
auto time = context_->getCurrentTime();
|
|
168
148
|
|
|
169
|
-
auto playbackRate =
|
|
170
|
-
|
|
171
|
-
auto detune = std::pow(
|
|
172
|
-
2.0f, detuneParam_->processKRateParam(framesToProcess, time) / 1200.0f);
|
|
149
|
+
auto playbackRate = playbackRateParam_->processKRateParam(framesToProcess, time);
|
|
150
|
+
auto detune = std::pow(2.0f, detuneParam_->processKRateParam(framesToProcess, time) / 1200.0f);
|
|
173
151
|
|
|
174
152
|
return playbackRate * detune;
|
|
175
153
|
}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
4
4
|
#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
|
|
5
5
|
|
|
6
|
+
#include <atomic>
|
|
6
7
|
#include <memory>
|
|
7
8
|
#include <mutex>
|
|
8
|
-
#include <atomic>
|
|
9
9
|
|
|
10
10
|
namespace audioapi {
|
|
11
11
|
|
|
@@ -26,49 +26,51 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
|
|
|
26
26
|
[[nodiscard]] double getOutputLatency() const;
|
|
27
27
|
|
|
28
28
|
protected:
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
// pitch correction
|
|
30
|
+
bool pitchCorrection_;
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
std::mutex bufferLock_;
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
// pitch correction
|
|
35
|
+
std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;
|
|
36
|
+
std::shared_ptr<AudioBus> playbackRateBus_;
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
// k-rate params
|
|
39
|
+
std::shared_ptr<AudioParam> detuneParam_;
|
|
40
|
+
std::shared_ptr<AudioParam> playbackRateParam_;
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
// internal helper
|
|
43
|
+
double vReadIndex_;
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
std::atomic<uint64_t> onPositionChangedCallbackId_ = 0; // 0 means no callback
|
|
46
|
+
int onPositionChangedInterval_;
|
|
47
|
+
int onPositionChangedTime_ = 0;
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
std::mutex &getBufferLock();
|
|
50
|
+
virtual double getCurrentPosition() const = 0;
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
void sendOnPositionChangedEvent();
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
void processWithPitchCorrection(
|
|
55
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
56
|
+
int framesToProcess);
|
|
57
|
+
void processWithoutPitchCorrection(
|
|
58
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
59
|
+
int framesToProcess);
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
float getComputedPlaybackRateValue(int framesToProcess);
|
|
60
62
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
virtual void processWithoutInterpolation(
|
|
64
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
65
|
+
size_t startOffset,
|
|
66
|
+
size_t offsetLength,
|
|
67
|
+
float playbackRate) = 0;
|
|
66
68
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
virtual void processWithInterpolation(
|
|
70
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
71
|
+
size_t startOffset,
|
|
72
|
+
size_t offsetLength,
|
|
73
|
+
float playbackRate) = 0;
|
|
72
74
|
};
|
|
73
75
|
|
|
74
76
|
} // namespace audioapi
|