react-native-audio-api 0.4.12-beta.5 → 0.4.13
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/CMakeLists.txt +2 -3
- package/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp +3 -3
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +10 -11
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +1 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +0 -1
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +1 -3
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +24 -16
- package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +4 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +20 -4
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +3 -2
- package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +32 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +14 -21
- package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +4 -2
- package/common/cpp/audioapi/core/AudioNode.cpp +2 -2
- package/common/cpp/audioapi/core/AudioParam.cpp +1 -1
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +4 -12
- package/common/cpp/audioapi/core/BaseAudioContext.h +2 -4
- package/common/cpp/audioapi/core/Constants.h +8 -33
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +42 -45
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +12 -8
- package/common/cpp/audioapi/core/effects/GainNode.cpp +4 -3
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +32 -49
- package/common/cpp/audioapi/core/effects/PeriodicWave.h +8 -3
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +3 -3
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +9 -2
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +5 -2
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +72 -35
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +41 -8
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +18 -6
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +7 -0
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -3
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -0
- package/common/cpp/audioapi/core/types/TimeStretchType.h +7 -0
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +2 -2
- package/common/cpp/audioapi/dsp/AudioUtils.h +2 -2
- package/common/cpp/audioapi/dsp/FFT.cpp +41 -0
- package/common/cpp/audioapi/dsp/FFT.h +29 -0
- package/common/cpp/audioapi/dsp/VectorMath.cpp +3 -3
- package/common/cpp/audioapi/dsp/VectorMath.h +2 -2
- package/common/cpp/audioapi/dsp/Windows.cpp +80 -0
- package/common/cpp/audioapi/dsp/Windows.h +95 -0
- package/{android/src/main/cpp/audioapi/android/libs → common/cpp/audioapi/libs/pffft}/pffft.c +1 -1
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/delay.h +9 -11
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/fft.h +6 -7
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/perf.h +0 -2
- package/common/cpp/audioapi/libs/{signalsmith-stretch.h → signalsmith-stretch/signalsmith-stretch.h} +3 -4
- package/common/cpp/audioapi/libs/{dsp → signalsmith-stretch}/spectral.h +10 -13
- package/common/cpp/audioapi/{core/utils → utils}/AudioArray.cpp +5 -5
- package/common/cpp/audioapi/{core/utils → utils}/AudioBus.cpp +29 -29
- package/ios/audioapi/ios/core/AudioDecoder.mm +3 -3
- package/ios/audioapi/ios/core/AudioPlayer.h +5 -2
- package/ios/audioapi/ios/core/AudioPlayer.m +9 -5
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +1 -0
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +12 -10
- package/lib/module/api.js +1 -2
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +1 -1
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioBufferSourceNode.js +6 -0
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +5 -0
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +0 -4
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/web-core/AudioBufferSourceNode.js +6 -0
- package/lib/module/web-core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/web-core/AudioScheduledSourceNode.js +8 -0
- package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/web-core/StretcherNode.js +24 -7
- package/lib/module/web-core/StretcherNode.js.map +1 -1
- package/lib/module/web-core/custom/signalsmithStretch/README.md +1 -1
- package/lib/module/web-core/custom/signalsmithStretch/SignalsmithStretch.js +1 -0
- package/lib/module/web-core/custom/signalsmithStretch/SignalsmithStretch.js.map +1 -1
- package/lib/typescript/api.d.ts +1 -2
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +1 -1
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferSourceNode.d.ts +3 -0
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -0
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +0 -2
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +3 -6
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +1 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +3 -0
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -0
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/lib/typescript/web-core/StretcherNode.d.ts +3 -0
- package/lib/typescript/web-core/StretcherNode.d.ts.map +1 -1
- package/package.json +3 -4
- package/scripts/setup-rn-audio-api-web.js +58 -0
- package/src/api.ts +1 -1
- package/src/api.web.ts +1 -0
- package/src/core/AudioBufferSourceNode.ts +9 -0
- package/src/core/AudioScheduledSourceNode.ts +5 -0
- package/src/core/BaseAudioContext.ts +0 -5
- package/src/interfaces.ts +3 -6
- package/src/types.ts +2 -0
- package/src/web-core/AudioBufferSourceNode.tsx +11 -0
- package/src/web-core/AudioScheduledSourceNode.tsx +9 -0
- package/src/web-core/StretcherNode.tsx +28 -8
- package/src/web-core/custom/signalsmithStretch/README.md +1 -1
- package/src/web-core/custom/signalsmithStretch/SignalsmithStretch.js +1 -0
- package/common/cpp/audioapi/HostObjects/StretcherNodeHostObject.h +0 -35
- package/common/cpp/audioapi/core/effects/StretcherNode.cpp +0 -94
- package/common/cpp/audioapi/core/effects/StretcherNode.h +0 -35
- package/common/cpp/audioapi/dsp/FFTFrame.cpp +0 -100
- package/common/cpp/audioapi/dsp/FFTFrame.h +0 -74
- package/common/cpp/audioapi/libs/dsp/common.h +0 -47
- package/common/cpp/audioapi/libs/dsp/windows.h +0 -219
- package/lib/module/core/StretcherNode.js +0 -12
- package/lib/module/core/StretcherNode.js.map +0 -1
- package/lib/typescript/core/StretcherNode.d.ts +0 -10
- package/lib/typescript/core/StretcherNode.d.ts.map +0 -1
- package/scripts/setup-custom-wasm.js +0 -104
- package/src/core/StretcherNode.ts +0 -15
- /package/common/cpp/audioapi/libs/{miniaudio.h → miniaudio/miniaudio.h} +0 -0
- /package/{android/src/main/cpp/audioapi/android/libs → common/cpp/audioapi/libs/pffft}/pffft.h +0 -0
- /package/common/cpp/audioapi/{core/utils → utils}/AudioArray.h +0 -0
- /package/common/cpp/audioapi/{core/utils → utils}/AudioBus.h +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,GACX,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,QAAQ,GACR,UAAU,GACV,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,GACX,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,QAAQ,GACR,UAAU,GACV,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC"}
|
|
@@ -2,6 +2,7 @@ import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
|
2
2
|
import AudioParam from './AudioParam';
|
|
3
3
|
import AudioBuffer from './AudioBuffer';
|
|
4
4
|
import BaseAudioContext from './BaseAudioContext';
|
|
5
|
+
import { TimeStretchType } from '../types';
|
|
5
6
|
export default class AudioBufferSourceNode extends AudioScheduledSourceNode {
|
|
6
7
|
readonly playbackRate: AudioParam;
|
|
7
8
|
readonly detune: AudioParam;
|
|
@@ -14,6 +15,8 @@ export default class AudioBufferSourceNode extends AudioScheduledSourceNode {
|
|
|
14
15
|
set loopStart(value: number);
|
|
15
16
|
get loopEnd(): number;
|
|
16
17
|
set loopEnd(value: number);
|
|
18
|
+
get timeStretch(): TimeStretchType;
|
|
19
|
+
set timeStretch(value: TimeStretchType);
|
|
17
20
|
start(when?: number, offset?: number, duration?: number): void;
|
|
18
21
|
}
|
|
19
22
|
//# sourceMappingURL=AudioBufferSourceNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioBufferSourceNode.d.ts","sourceRoot":"","sources":["../../../src/web-core/AudioBufferSourceNode.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"AudioBufferSourceNode.d.ts","sourceRoot":"","sources":["../../../src/web-core/AudioBufferSourceNode.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,wBAAwB;IACzE,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAG1B,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,UAAU,CAAC,qBAAqB;IAQxC,IAAW,MAAM,IAAI,WAAW,GAAG,IAAI,CAQtC;IAED,IAAW,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAO3C;IAED,IAAW,IAAI,IAAI,OAAO,CAEzB;IAED,IAAW,IAAI,CAAC,KAAK,EAAE,OAAO,EAE7B;IAED,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,IAAW,SAAS,CAAC,KAAK,EAAE,MAAM,EAEjC;IAED,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,OAAO,CAAC,KAAK,EAAE,MAAM,EAE/B;IAED,IAAW,WAAW,IAAI,eAAe,CAExC;IAED,IAAW,WAAW,CAAC,KAAK,EAAE,eAAe,EAI5C;IAEM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;CA8BtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioScheduledSourceNode.d.ts","sourceRoot":"","sources":["../../../src/web-core/AudioScheduledSourceNode.tsx"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AAGpC,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC7D,SAAS,CAAC,cAAc,EAAE,OAAO,CAAS;IAEnC,KAAK,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAe7B,IAAI,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"AudioScheduledSourceNode.d.ts","sourceRoot":"","sources":["../../../src/web-core/AudioScheduledSourceNode.tsx"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AAGpC,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC7D,SAAS,CAAC,cAAc,EAAE,OAAO,CAAS;IAEnC,KAAK,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAe7B,IAAI,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAiBnC,IAAW,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,EAMlD;CACF"}
|
|
@@ -28,6 +28,7 @@ export default class StretcherNode extends AudioNode {
|
|
|
28
28
|
_playbackRate: number;
|
|
29
29
|
_loopStart: number;
|
|
30
30
|
_loopEnd: number;
|
|
31
|
+
_loop: boolean;
|
|
31
32
|
_isPlaying: boolean;
|
|
32
33
|
constructor(context: BaseAudioContext, node: IStretcherNode);
|
|
33
34
|
get buffer(): AudioBuffer | null;
|
|
@@ -38,6 +39,8 @@ export default class StretcherNode extends AudioNode {
|
|
|
38
39
|
set loopStart(value: number);
|
|
39
40
|
get loopEnd(): number;
|
|
40
41
|
set loopEnd(value: number);
|
|
42
|
+
get loop(): boolean;
|
|
43
|
+
set loop(value: boolean);
|
|
41
44
|
start(when?: number, offset?: number, duration?: number, rate?: number, semitones?: number): void;
|
|
42
45
|
stop(when?: number): void;
|
|
43
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StretcherNode.d.ts","sourceRoot":"","sources":["../../../src/web-core/StretcherNode.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,OAAO,OAAO,cAAc;IAC1B,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAE1C,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAExC,KAAK,CACH,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAEP,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAEzB,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI;IAChD,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,CAAC,SAAS,CAAC,EAAE,CACX,YAAY,EAAE,UAAU,CAAC,gBAAgB,KACtC,OAAO,CAAC,cAAc,CAAC,CAAC;KAC9B;CACF;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAS;IAClD,OAAO,EAAE,WAAW,GAAG,IAAI,CAAQ;IAEnC,aAAa,EAAE,MAAM,CAAK;IAC1B,UAAU,EAAE,MAAM,CAAM;IACxB,QAAQ,EAAE,MAAM,CAAM;IACtB,UAAU,UAAS;gBAEP,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc;IAK3D,IAAW,MAAM,IAAI,WAAW,GAAG,IAAI,CAEtC;IAED,IAAW,MAAM,CAAC,MAAM,EAAE,WAAW,EASpC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,YAAY,CAAC,KAAK,EAAE,MAAM,EAMpC;IAED,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,IAAW,SAAS,CAAC,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"StretcherNode.d.ts","sourceRoot":"","sources":["../../../src/web-core/StretcherNode.tsx"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,OAAO,OAAO,cAAc;IAC1B,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAE1C,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAExC,KAAK,CACH,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAEP,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAEzB,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI;IAChD,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,CAAC,SAAS,CAAC,EAAE,CACX,YAAY,EAAE,UAAU,CAAC,gBAAgB,KACtC,OAAO,CAAC,cAAc,CAAC,CAAC;KAC9B;CACF;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAS;IAClD,OAAO,EAAE,WAAW,GAAG,IAAI,CAAQ;IAEnC,aAAa,EAAE,MAAM,CAAK;IAC1B,UAAU,EAAE,MAAM,CAAM;IACxB,QAAQ,EAAE,MAAM,CAAM;IACtB,KAAK,UAAS;IACd,UAAU,UAAS;gBAEP,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,cAAc;IAK3D,IAAW,MAAM,IAAI,WAAW,GAAG,IAAI,CAEtC;IAED,IAAW,MAAM,CAAC,MAAM,EAAE,WAAW,EASpC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,YAAY,CAAC,KAAK,EAAE,MAAM,EAMpC;IAED,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,IAAW,SAAS,CAAC,KAAK,EAAE,MAAM,EAMjC;IAED,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,OAAO,CAAC,KAAK,EAAE,MAAM,EAM/B;IAED,IAAW,IAAI,IAAI,OAAO,CAEzB;IAED,IAAW,IAAI,CAAC,KAAK,EAAE,OAAO,EAE7B;IAEM,KAAK,CACV,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAmBA,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;CAIjC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.13",
|
|
4
4
|
"description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
|
|
5
5
|
"bin": {
|
|
6
|
-
"setup-
|
|
6
|
+
"setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
|
|
7
7
|
},
|
|
8
8
|
"source": "src/index",
|
|
9
9
|
"main": "lib/module/index",
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"android/",
|
|
21
21
|
"ios",
|
|
22
22
|
"RNAudioAPI.podspec",
|
|
23
|
-
"scripts/audioapi_utils.rb",
|
|
24
23
|
"metro-config",
|
|
25
24
|
"!ios/build",
|
|
26
25
|
"!android/build",
|
|
@@ -35,7 +34,7 @@
|
|
|
35
34
|
"!**/__mocks__",
|
|
36
35
|
"!**/.*",
|
|
37
36
|
"!**/node_modules",
|
|
38
|
-
"scripts/setup-
|
|
37
|
+
"scripts/setup-rn-audio-api-web.js"
|
|
39
38
|
],
|
|
40
39
|
"scripts": {
|
|
41
40
|
"test": "jest",
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Resolves and returns the absolute path to the SignalsmithStretch.mjs file.
|
|
10
|
+
*
|
|
11
|
+
* @returns {string} The absolute path to the SignalsmithStretch.mjs file.
|
|
12
|
+
*/
|
|
13
|
+
function getInputFilePath() {
|
|
14
|
+
return path.resolve(
|
|
15
|
+
__dirname,
|
|
16
|
+
'../lib/module/web-core/custom/signalsmithStretch/SignalsmithStretch.mjs'
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Generates the output file path for the WebAssembly module.
|
|
22
|
+
*
|
|
23
|
+
* @param {boolean} isExpoAndMetro - A flag indicating whether the environment is Expo and Metro.
|
|
24
|
+
* @returns {string} The resolved output file path.
|
|
25
|
+
*/
|
|
26
|
+
function getOutputFilePath() {
|
|
27
|
+
const publicFolder = path.resolve(
|
|
28
|
+
args[0] || 'public'
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
const publicFile = './signalsmithStretch.mjs';
|
|
32
|
+
const outputPath = path.join(publicFolder, publicFile);
|
|
33
|
+
|
|
34
|
+
console.log(`> Output file path: ${outputPath}\n`);
|
|
35
|
+
|
|
36
|
+
return outputPath;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Copies a file from the input path to the output path.
|
|
41
|
+
*
|
|
42
|
+
* @param {string} inputPath - The path of the file to be copied.
|
|
43
|
+
* @param {string} outputPath - The destination path where the file should be copied.
|
|
44
|
+
*/
|
|
45
|
+
function copyFile(inputPath, outputPath) {
|
|
46
|
+
const data = fs.readFileSync(inputPath);
|
|
47
|
+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
48
|
+
fs.writeFileSync(outputPath, data);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
(function main() {
|
|
52
|
+
const inputPath = getInputFilePath();
|
|
53
|
+
const outputPath = getOutputFilePath();
|
|
54
|
+
|
|
55
|
+
copyFile(inputPath, outputPath);
|
|
56
|
+
|
|
57
|
+
console.log(`> WebAssembly module setup complete\n`);
|
|
58
|
+
})();
|
package/src/api.ts
CHANGED
|
@@ -30,7 +30,6 @@ export { default as BiquadFilterNode } from './core/BiquadFilterNode';
|
|
|
30
30
|
export { default as GainNode } from './core/GainNode';
|
|
31
31
|
export { default as OscillatorNode } from './core/OscillatorNode';
|
|
32
32
|
export { default as StereoPannerNode } from './core/StereoPannerNode';
|
|
33
|
-
export { default as StretcherNode } from './core/StretcherNode';
|
|
34
33
|
|
|
35
34
|
export {
|
|
36
35
|
OscillatorType,
|
|
@@ -40,6 +39,7 @@ export {
|
|
|
40
39
|
ContextState,
|
|
41
40
|
WindowType,
|
|
42
41
|
PeriodicWaveConstraints,
|
|
42
|
+
TimeStretchType,
|
|
43
43
|
} from './types';
|
|
44
44
|
|
|
45
45
|
export {
|
package/src/api.web.ts
CHANGED
|
@@ -4,6 +4,7 @@ import BaseAudioContext from './BaseAudioContext';
|
|
|
4
4
|
import AudioBuffer from './AudioBuffer';
|
|
5
5
|
import AudioParam from './AudioParam';
|
|
6
6
|
import { InvalidStateError, RangeError } from '../errors';
|
|
7
|
+
import { TimeStretchType } from '../types';
|
|
7
8
|
|
|
8
9
|
export default class AudioBufferSourceNode extends AudioScheduledSourceNode {
|
|
9
10
|
readonly playbackRate: AudioParam;
|
|
@@ -57,6 +58,14 @@ export default class AudioBufferSourceNode extends AudioScheduledSourceNode {
|
|
|
57
58
|
(this.node as IAudioBufferSourceNode).loopEnd = value;
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
public get timeStretch(): TimeStretchType {
|
|
62
|
+
return (this.node as IAudioBufferSourceNode).timeStretch;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public set timeStretch(value: TimeStretchType) {
|
|
66
|
+
(this.node as IAudioBufferSourceNode).timeStretch = value;
|
|
67
|
+
}
|
|
68
|
+
|
|
60
69
|
public start(when: number = 0, offset: number = 0, duration?: number): void {
|
|
61
70
|
if (when < 0) {
|
|
62
71
|
throw new RangeError(
|
|
@@ -35,4 +35,9 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
35
35
|
|
|
36
36
|
(this.node as IAudioScheduledSourceNode).stop(when);
|
|
37
37
|
}
|
|
38
|
+
|
|
39
|
+
// eslint-disable-next-line accessor-pairs
|
|
40
|
+
public set onended(callback: (arg?: number) => void) {
|
|
41
|
+
(this.node as IAudioScheduledSourceNode).onended = callback;
|
|
42
|
+
}
|
|
38
43
|
}
|
|
@@ -9,7 +9,6 @@ import AudioBufferSourceNode from './AudioBufferSourceNode';
|
|
|
9
9
|
import AudioBuffer from './AudioBuffer';
|
|
10
10
|
import PeriodicWave from './PeriodicWave';
|
|
11
11
|
import AnalyserNode from './AnalyserNode';
|
|
12
|
-
import StretcherNode from './StretcherNode';
|
|
13
12
|
import { InvalidAccessError, NotSupportedError } from '../errors';
|
|
14
13
|
|
|
15
14
|
export default class BaseAudioContext {
|
|
@@ -101,10 +100,6 @@ export default class BaseAudioContext {
|
|
|
101
100
|
return new AnalyserNode(this, this.context.createAnalyser());
|
|
102
101
|
}
|
|
103
102
|
|
|
104
|
-
createStretcher(): StretcherNode {
|
|
105
|
-
return new StretcherNode(this, this.context.createStretcher());
|
|
106
|
-
}
|
|
107
|
-
|
|
108
103
|
async decodeAudioDataSource(sourcePath: string): Promise<AudioBuffer> {
|
|
109
104
|
// Remove the file:// prefix if it exists
|
|
110
105
|
if (sourcePath.startsWith('file://')) {
|
package/src/interfaces.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
ChannelCountMode,
|
|
6
6
|
ChannelInterpretation,
|
|
7
7
|
WindowType,
|
|
8
|
+
TimeStretchType,
|
|
8
9
|
} from './types';
|
|
9
10
|
|
|
10
11
|
export interface AudioAPIInstaller {
|
|
@@ -33,7 +34,6 @@ export interface IBaseAudioContext {
|
|
|
33
34
|
disableNormalization: boolean
|
|
34
35
|
) => IPeriodicWave;
|
|
35
36
|
createAnalyser: () => IAnalyserNode;
|
|
36
|
-
createStretcher: () => IStretcherNode;
|
|
37
37
|
decodeAudioDataSource: (sourcePath: string) => Promise<IAudioBuffer>;
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -82,6 +82,7 @@ export interface IAudioDestinationNode extends IAudioNode {}
|
|
|
82
82
|
export interface IAudioScheduledSourceNode extends IAudioNode {
|
|
83
83
|
start(when?: number): void;
|
|
84
84
|
stop: (when: number) => void;
|
|
85
|
+
onended: (arg?: number) => void | null;
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
export interface IOscillatorNode extends IAudioScheduledSourceNode {
|
|
@@ -99,6 +100,7 @@ export interface IAudioBufferSourceNode extends IAudioScheduledSourceNode {
|
|
|
99
100
|
loopEnd: number;
|
|
100
101
|
detune: IAudioParam;
|
|
101
102
|
playbackRate: IAudioParam;
|
|
103
|
+
timeStretch: TimeStretchType;
|
|
102
104
|
|
|
103
105
|
start: (when?: number, offset?: number, duration?: number) => void;
|
|
104
106
|
}
|
|
@@ -160,8 +162,3 @@ export interface IAnalyserNode extends IAudioNode {
|
|
|
160
162
|
getFloatTimeDomainData: (array: number[]) => void;
|
|
161
163
|
getByteTimeDomainData: (array: number[]) => void;
|
|
162
164
|
}
|
|
163
|
-
|
|
164
|
-
export interface IStretcherNode extends IAudioNode {
|
|
165
|
-
readonly rate: IAudioParam;
|
|
166
|
-
readonly semitones: IAudioParam;
|
|
167
|
-
}
|
package/src/types.ts
CHANGED
|
@@ -3,6 +3,7 @@ import AudioParam from './AudioParam';
|
|
|
3
3
|
import AudioBuffer from './AudioBuffer';
|
|
4
4
|
import { InvalidStateError, RangeError } from '../errors';
|
|
5
5
|
import BaseAudioContext from './BaseAudioContext';
|
|
6
|
+
import { TimeStretchType } from '../types';
|
|
6
7
|
|
|
7
8
|
export default class AudioBufferSourceNode extends AudioScheduledSourceNode {
|
|
8
9
|
readonly playbackRate: AudioParam;
|
|
@@ -61,6 +62,16 @@ export default class AudioBufferSourceNode extends AudioScheduledSourceNode {
|
|
|
61
62
|
(this.node as globalThis.AudioBufferSourceNode).loopEnd = value;
|
|
62
63
|
}
|
|
63
64
|
|
|
65
|
+
public get timeStretch(): TimeStretchType {
|
|
66
|
+
return 'linear';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public set timeStretch(value: TimeStretchType) {
|
|
70
|
+
console.log(
|
|
71
|
+
'React Native Audio API: setting timeStretch is not supported on web'
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
64
75
|
public start(when?: number, offset?: number, duration?: number): void {
|
|
65
76
|
if (when && when < 0) {
|
|
66
77
|
throw new RangeError(
|
|
@@ -34,4 +34,13 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
34
34
|
|
|
35
35
|
(this.node as globalThis.AudioScheduledSourceNode).stop(when);
|
|
36
36
|
}
|
|
37
|
+
|
|
38
|
+
// eslint-disable-next-line accessor-pairs
|
|
39
|
+
public set onended(callback: (arg?: number) => void) {
|
|
40
|
+
const eventCallback = (_event: Event) => {
|
|
41
|
+
callback();
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
(this.node as globalThis.AudioScheduledSourceNode).onended = eventCallback;
|
|
45
|
+
}
|
|
37
46
|
}
|
|
@@ -46,6 +46,7 @@ export default class StretcherNode extends AudioNode {
|
|
|
46
46
|
_playbackRate: number = 1;
|
|
47
47
|
_loopStart: number = -1;
|
|
48
48
|
_loopEnd: number = -1;
|
|
49
|
+
_loop = false;
|
|
49
50
|
_isPlaying = false;
|
|
50
51
|
|
|
51
52
|
constructor(context: BaseAudioContext, node: IStretcherNode) {
|
|
@@ -59,7 +60,7 @@ export default class StretcherNode extends AudioNode {
|
|
|
59
60
|
|
|
60
61
|
public set buffer(buffer: AudioBuffer) {
|
|
61
62
|
this._buffer = buffer;
|
|
62
|
-
const channelArrays = [];
|
|
63
|
+
const channelArrays: Float32Array[] = [];
|
|
63
64
|
|
|
64
65
|
for (let i = 0; i < buffer.numberOfChannels; i += 1) {
|
|
65
66
|
channelArrays.push(buffer.getChannelData(i));
|
|
@@ -87,7 +88,9 @@ export default class StretcherNode extends AudioNode {
|
|
|
87
88
|
public set loopStart(value: number) {
|
|
88
89
|
this._loopStart = value;
|
|
89
90
|
|
|
90
|
-
(this.
|
|
91
|
+
if (this._isPlaying) {
|
|
92
|
+
(this.node as unknown as IStretcherNode).schedule({ loopStart: value });
|
|
93
|
+
}
|
|
91
94
|
}
|
|
92
95
|
|
|
93
96
|
public get loopEnd(): number {
|
|
@@ -97,7 +100,17 @@ export default class StretcherNode extends AudioNode {
|
|
|
97
100
|
public set loopEnd(value: number) {
|
|
98
101
|
this._loopEnd = value;
|
|
99
102
|
|
|
100
|
-
(this.
|
|
103
|
+
if (this._isPlaying) {
|
|
104
|
+
(this.node as unknown as IStretcherNode).schedule({ loopEnd: value });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public get loop(): boolean {
|
|
109
|
+
return this._loop;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public set loop(value: boolean) {
|
|
113
|
+
this._loop = value;
|
|
101
114
|
}
|
|
102
115
|
|
|
103
116
|
public start(
|
|
@@ -109,12 +122,19 @@ export default class StretcherNode extends AudioNode {
|
|
|
109
122
|
): void {
|
|
110
123
|
this._isPlaying = true;
|
|
111
124
|
|
|
125
|
+
if (this.loop && this._loopStart !== -1 && this._loopEnd !== -1) {
|
|
126
|
+
(this.node as unknown as IStretcherNode).schedule({
|
|
127
|
+
loopStart: this._loopStart,
|
|
128
|
+
loopEnd: this._loopEnd,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
112
132
|
(this.node as unknown as IStretcherNode).start(
|
|
113
|
-
when,
|
|
114
|
-
offset,
|
|
115
|
-
duration,
|
|
116
|
-
rate,
|
|
117
|
-
semitones
|
|
133
|
+
when ?? 0,
|
|
134
|
+
offset ?? 0,
|
|
135
|
+
duration ?? this._buffer?.duration ?? 0,
|
|
136
|
+
rate ?? this._playbackRate ?? 0,
|
|
137
|
+
semitones ?? 0
|
|
118
138
|
);
|
|
119
139
|
}
|
|
120
140
|
|
|
@@ -14,7 +14,7 @@ The current input time, within the sample buffer. You can change how often this
|
|
|
14
14
|
|
|
15
15
|
### `stretch.schedule({...})`
|
|
16
16
|
|
|
17
|
-
This adds a scheduled change, removing any scheduled changes
|
|
17
|
+
This adds a scheduled change, removing any scheduled changes occurring after this one. The object properties are:
|
|
18
18
|
|
|
19
19
|
- `output` (seconds): audio context time for this change. The node compensates for its own latency, but this means you might want to schedule some things ahead of time, otherwise you'll have a softer transition as it catches up.
|
|
20
20
|
- `active` (bool): processing audio
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/HostObjects/AudioNodeHostObject.h>
|
|
4
|
-
#include <audioapi/HostObjects/AudioParamHostObject.h>
|
|
5
|
-
#include <audioapi/core/effects/StretcherNode.h>
|
|
6
|
-
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <vector>
|
|
9
|
-
|
|
10
|
-
namespace audioapi {
|
|
11
|
-
|
|
12
|
-
using namespace facebook;
|
|
13
|
-
|
|
14
|
-
class StretcherNodeHostObject : public AudioNodeHostObject {
|
|
15
|
-
public:
|
|
16
|
-
explicit StretcherNodeHostObject(const std::shared_ptr<StretcherNode> &node): AudioNodeHostObject(node) {
|
|
17
|
-
addGetters(JSI_EXPORT_PROPERTY_GETTER(StretcherNodeHostObject, rate),
|
|
18
|
-
JSI_EXPORT_PROPERTY_GETTER(StretcherNodeHostObject, semitones));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
JSI_PROPERTY_GETTER(rate) {
|
|
22
|
-
auto stretcherNode = std::static_pointer_cast<StretcherNode>(node_);
|
|
23
|
-
auto rateParam =
|
|
24
|
-
std::make_shared<AudioParamHostObject>(stretcherNode->getRateParam());
|
|
25
|
-
return jsi::Object::createFromHostObject(runtime, rateParam);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
JSI_PROPERTY_GETTER(semitones) {
|
|
29
|
-
auto stretcherNode = std::static_pointer_cast<StretcherNode>(node_);
|
|
30
|
-
auto semitonesParam =
|
|
31
|
-
std::make_shared<AudioParamHostObject>(stretcherNode->getSemitonesParam());
|
|
32
|
-
return jsi::Object::createFromHostObject(runtime, semitonesParam);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
} // namespace audioapi
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
#include <audioapi/core/BaseAudioContext.h>
|
|
2
|
-
#include <audioapi/core/effects/StretcherNode.h>
|
|
3
|
-
#include <audioapi/core/utils/AudioArray.h>
|
|
4
|
-
#include <audioapi/core/utils/AudioBus.h>
|
|
5
|
-
|
|
6
|
-
namespace audioapi {
|
|
7
|
-
|
|
8
|
-
StretcherNode::StretcherNode(BaseAudioContext *context) : AudioNode(context) {
|
|
9
|
-
channelCountMode_ = ChannelCountMode::EXPLICIT;
|
|
10
|
-
rate_ = std::make_shared<AudioParam>(1.0, 0.0, 3.0);
|
|
11
|
-
semitones_ = std::make_shared<AudioParam>(0.0, -12.0, 12.0);
|
|
12
|
-
|
|
13
|
-
stretch_ =
|
|
14
|
-
std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();
|
|
15
|
-
stretch_->presetDefault(channelCount_, context->getSampleRate());
|
|
16
|
-
playbackRateBus_ = std::make_shared<AudioBus>(
|
|
17
|
-
RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
|
|
18
|
-
|
|
19
|
-
isInitialized_ = true;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
std::shared_ptr<AudioParam> StretcherNode::getRateParam() const {
|
|
23
|
-
return rate_;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
std::shared_ptr<AudioParam> StretcherNode::getSemitonesParam() const {
|
|
27
|
-
return semitones_;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
void StretcherNode::processNode(
|
|
31
|
-
const std::shared_ptr<AudioBus> &processingBus,
|
|
32
|
-
int framesToProcess) {
|
|
33
|
-
auto time = context_->getCurrentTime();
|
|
34
|
-
auto semitones = semitones_->getValueAtTime(time);
|
|
35
|
-
|
|
36
|
-
stretch_->setTransposeSemitones(semitones);
|
|
37
|
-
stretch_->process(
|
|
38
|
-
playbackRateBus_.get()[0],
|
|
39
|
-
framesNeededToStretch_,
|
|
40
|
-
audioBus_.get()[0],
|
|
41
|
-
framesToProcess);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
std::shared_ptr<AudioBus> StretcherNode::processAudio(
|
|
45
|
-
std::shared_ptr<AudioBus> outputBus,
|
|
46
|
-
int framesToProcess,
|
|
47
|
-
bool checkIsAlreadyProcessed) {
|
|
48
|
-
if (!isInitialized_) {
|
|
49
|
-
return outputBus;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (isAlreadyProcessed()) {
|
|
53
|
-
return audioBus_;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
auto time = context_->getCurrentTime();
|
|
57
|
-
|
|
58
|
-
auto rate = rate_->getValueAtTime(time);
|
|
59
|
-
framesNeededToStretch_ =
|
|
60
|
-
static_cast<int>(rate * static_cast<float>(framesToProcess));
|
|
61
|
-
|
|
62
|
-
playbackRateBus_->zero();
|
|
63
|
-
auto writeIndex = 0;
|
|
64
|
-
auto framesNeededToStretch = framesNeededToStretch_;
|
|
65
|
-
|
|
66
|
-
// Collecting frames needed to stretch
|
|
67
|
-
while (framesNeededToStretch > 0) {
|
|
68
|
-
auto framesToCopy = std::min(framesNeededToStretch, framesToProcess);
|
|
69
|
-
|
|
70
|
-
// Process inputs and return the bus with the most channels. We must not
|
|
71
|
-
// check if the node has already been processed, cause we need to process it
|
|
72
|
-
// multiple times in this case.
|
|
73
|
-
auto processingBus = processInputs(outputBus, framesToCopy, false);
|
|
74
|
-
|
|
75
|
-
// Apply channel count mode.
|
|
76
|
-
processingBus = applyChannelCountMode(processingBus);
|
|
77
|
-
|
|
78
|
-
// Mix all input buses into the processing bus.
|
|
79
|
-
mixInputsBuses(processingBus);
|
|
80
|
-
|
|
81
|
-
assert(processingBus != nullptr);
|
|
82
|
-
|
|
83
|
-
playbackRateBus_->copy(processingBus.get(), 0, writeIndex, framesToCopy);
|
|
84
|
-
|
|
85
|
-
writeIndex += framesToCopy;
|
|
86
|
-
framesNeededToStretch -= framesToCopy;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
processNode(audioBus_, framesToProcess);
|
|
90
|
-
|
|
91
|
-
return audioBus_;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
} // namespace audioapi
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <audioapi/libs/signalsmith-stretch.h>
|
|
4
|
-
#include <audioapi/core/AudioNode.h>
|
|
5
|
-
#include <audioapi/core/AudioParam.h>
|
|
6
|
-
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <string>
|
|
9
|
-
#include <cassert>
|
|
10
|
-
|
|
11
|
-
namespace audioapi {
|
|
12
|
-
class AudioBus;
|
|
13
|
-
|
|
14
|
-
class StretcherNode : public AudioNode {
|
|
15
|
-
public:
|
|
16
|
-
explicit StretcherNode(BaseAudioContext *context);
|
|
17
|
-
|
|
18
|
-
[[nodiscard]] std::shared_ptr<AudioParam> getRateParam() const;
|
|
19
|
-
[[nodiscard]] std::shared_ptr<AudioParam> getSemitonesParam() const;
|
|
20
|
-
|
|
21
|
-
protected:
|
|
22
|
-
void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
23
|
-
std::shared_ptr<AudioBus> processAudio(std::shared_ptr<AudioBus> outputBus, int framesToProcess, bool checkIsAlreadyProcessed) override;
|
|
24
|
-
|
|
25
|
-
private:
|
|
26
|
-
// k-rate params
|
|
27
|
-
std::shared_ptr<AudioParam> rate_;
|
|
28
|
-
std::shared_ptr<AudioParam> semitones_;
|
|
29
|
-
|
|
30
|
-
std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;
|
|
31
|
-
std::shared_ptr<AudioBus> playbackRateBus_;
|
|
32
|
-
int framesNeededToStretch_ = RENDER_QUANTUM_SIZE;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
} // namespace audioapi
|