react-native-audio-api 0.1.0 → 0.2.0

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.
Files changed (198) hide show
  1. package/README.md +10 -8
  2. package/RNAudioAPI.podspec +5 -0
  3. package/android/CMakeLists.txt +21 -10
  4. package/android/libs/fftw3/arm64-v8a/libfftw3.a +0 -0
  5. package/android/libs/fftw3/armeabi-v7a/libfftw3.a +0 -0
  6. package/android/libs/fftw3/x86/libfftw3.a +0 -0
  7. package/android/libs/fftw3/x86_64/libfftw3.a +0 -0
  8. package/android/libs/include/fftw3/fftw3.h +413 -0
  9. package/android/src/main/cpp/AudioPlayer/AudioPlayer.cpp +23 -2
  10. package/android/src/main/cpp/AudioPlayer/AudioPlayer.h +5 -2
  11. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp +13 -1
  12. package/common/cpp/HostObjects/AudioContextHostObject.cpp +11 -148
  13. package/common/cpp/HostObjects/AudioContextHostObject.h +4 -11
  14. package/common/cpp/HostObjects/AudioNodeHostObject.cpp +0 -6
  15. package/common/cpp/HostObjects/BaseAudioContextHostObject.cpp +214 -0
  16. package/common/cpp/HostObjects/BaseAudioContextHostObject.h +39 -0
  17. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.cpp +44 -0
  18. package/common/cpp/HostObjects/OscillatorNodeHostObject.cpp +21 -0
  19. package/common/cpp/HostObjects/OscillatorNodeHostObject.h +1 -0
  20. package/common/cpp/HostObjects/PeriodicWaveHostObject.cpp +33 -0
  21. package/common/cpp/HostObjects/PeriodicWaveHostObject.h +33 -0
  22. package/common/cpp/core/AudioArray.cpp +103 -0
  23. package/common/cpp/core/AudioArray.h +42 -0
  24. package/common/cpp/core/AudioBuffer.cpp +23 -83
  25. package/common/cpp/core/AudioBuffer.h +11 -13
  26. package/common/cpp/core/AudioBufferSourceNode.cpp +102 -25
  27. package/common/cpp/core/AudioBufferSourceNode.h +10 -6
  28. package/common/cpp/core/AudioBus.cpp +357 -0
  29. package/common/cpp/core/AudioBus.h +63 -0
  30. package/common/cpp/core/AudioContext.cpp +6 -72
  31. package/common/cpp/core/AudioContext.h +3 -60
  32. package/common/cpp/core/AudioDestinationNode.cpp +25 -15
  33. package/common/cpp/core/AudioDestinationNode.h +15 -7
  34. package/common/cpp/core/AudioNode.cpp +176 -22
  35. package/common/cpp/core/AudioNode.h +37 -37
  36. package/common/cpp/core/AudioNodeManager.cpp +72 -0
  37. package/common/cpp/core/AudioNodeManager.h +35 -0
  38. package/common/cpp/core/AudioParam.cpp +8 -11
  39. package/common/cpp/core/AudioParam.h +8 -8
  40. package/common/cpp/core/AudioScheduledSourceNode.cpp +19 -5
  41. package/common/cpp/core/AudioScheduledSourceNode.h +6 -2
  42. package/common/cpp/core/BaseAudioContext.cpp +157 -0
  43. package/common/cpp/core/BaseAudioContext.h +80 -0
  44. package/common/cpp/core/BiquadFilterNode.cpp +90 -69
  45. package/common/cpp/core/BiquadFilterNode.h +53 -57
  46. package/common/cpp/core/GainNode.cpp +12 -12
  47. package/common/cpp/core/GainNode.h +5 -3
  48. package/common/cpp/core/OscillatorNode.cpp +38 -29
  49. package/common/cpp/core/OscillatorNode.h +29 -69
  50. package/common/cpp/core/ParamChange.h +6 -6
  51. package/common/cpp/core/PeriodicWave.cpp +362 -0
  52. package/common/cpp/core/PeriodicWave.h +119 -0
  53. package/common/cpp/core/StereoPannerNode.cpp +28 -30
  54. package/common/cpp/core/StereoPannerNode.h +6 -6
  55. package/common/cpp/types/BiquadFilterType.h +19 -0
  56. package/common/cpp/types/ChannelCountMode.h +10 -0
  57. package/common/cpp/types/ChannelInterpretation.h +10 -0
  58. package/common/cpp/types/ContextState.h +10 -0
  59. package/common/cpp/types/OscillatorType.h +11 -0
  60. package/common/cpp/utils/FFTFrame.h +63 -0
  61. package/common/cpp/utils/Locker.h +47 -0
  62. package/common/cpp/utils/VectorMath.cpp +72 -3
  63. package/common/cpp/utils/VectorMath.h +7 -1
  64. package/common/cpp/utils/android/FFTFrame.cpp +22 -0
  65. package/common/cpp/utils/ios/FFTFrame.cpp +24 -0
  66. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp +10 -0
  67. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h +3 -2
  68. package/common/cpp/wrappers/AudioBufferWrapper.h +5 -5
  69. package/common/cpp/wrappers/AudioContextWrapper.cpp +7 -60
  70. package/common/cpp/wrappers/AudioContextWrapper.h +5 -26
  71. package/common/cpp/wrappers/AudioNodeWrapper.h +5 -5
  72. package/common/cpp/wrappers/AudioParamWrapper.h +4 -4
  73. package/common/cpp/wrappers/BaseAudioContextWrapper.cpp +76 -0
  74. package/common/cpp/wrappers/BaseAudioContextWrapper.h +49 -0
  75. package/common/cpp/wrappers/BiquadFilterNodeWrapper.cpp +9 -0
  76. package/common/cpp/wrappers/BiquadFilterNodeWrapper.h +9 -4
  77. package/common/cpp/wrappers/GainNodeWrapper.h +1 -1
  78. package/common/cpp/wrappers/OscillatorNodeWrapper.cpp +6 -0
  79. package/common/cpp/wrappers/OscillatorNodeWrapper.h +5 -2
  80. package/common/cpp/wrappers/PeriodicWaveWrapper.h +17 -0
  81. package/common/cpp/wrappers/StereoPannerNodeWrapper.h +1 -1
  82. package/ios/AudioAPIModule.h +20 -1
  83. package/ios/AudioAPIModule.mm +3 -3
  84. package/ios/AudioPlayer/AudioPlayer.h +3 -2
  85. package/ios/AudioPlayer/AudioPlayer.m +15 -17
  86. package/ios/AudioPlayer/IOSAudioPlayer.h +8 -4
  87. package/ios/AudioPlayer/IOSAudioPlayer.mm +30 -7
  88. package/lib/module/core/AudioBuffer.js +37 -0
  89. package/lib/module/core/AudioBuffer.js.map +1 -0
  90. package/lib/module/core/AudioBufferSourceNode.js +28 -0
  91. package/lib/module/core/AudioBufferSourceNode.js.map +1 -0
  92. package/lib/module/core/AudioContext.js +10 -0
  93. package/lib/module/core/AudioContext.js.map +1 -0
  94. package/lib/module/core/AudioDestinationNode.js +7 -0
  95. package/lib/module/core/AudioDestinationNode.js.map +1 -0
  96. package/lib/module/core/AudioNode.js +22 -0
  97. package/lib/module/core/AudioNode.js.map +1 -0
  98. package/lib/module/core/AudioParam.js +35 -0
  99. package/lib/module/core/AudioParam.js.map +1 -0
  100. package/lib/module/core/AudioScheduledSourceNode.js +28 -0
  101. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -0
  102. package/lib/module/core/BaseAudioContext.js +57 -0
  103. package/lib/module/core/BaseAudioContext.js.map +1 -0
  104. package/lib/module/core/BiquadFilterNode.js +25 -0
  105. package/lib/module/core/BiquadFilterNode.js.map +1 -0
  106. package/lib/module/core/GainNode.js +9 -0
  107. package/lib/module/core/GainNode.js.map +1 -0
  108. package/lib/module/core/OscillatorNode.js +24 -0
  109. package/lib/module/core/OscillatorNode.js.map +1 -0
  110. package/lib/module/core/PeriodicWave.js +8 -0
  111. package/lib/module/core/PeriodicWave.js.map +1 -0
  112. package/lib/module/core/StereoPannerNode.js +9 -0
  113. package/lib/module/core/StereoPannerNode.js.map +1 -0
  114. package/lib/module/core/types.js.map +1 -0
  115. package/lib/module/errors/IndexSizeError.js +8 -0
  116. package/lib/module/errors/IndexSizeError.js.map +1 -0
  117. package/lib/module/errors/InvalidAccessError.js +8 -0
  118. package/lib/module/errors/InvalidAccessError.js.map +1 -0
  119. package/lib/module/errors/InvalidStateError.js +8 -0
  120. package/lib/module/errors/InvalidStateError.js.map +1 -0
  121. package/lib/module/errors/RangeError.js +8 -0
  122. package/lib/module/errors/RangeError.js.map +1 -0
  123. package/lib/module/errors/index.js +5 -0
  124. package/lib/module/errors/index.js.map +1 -0
  125. package/lib/module/index.js +13 -34
  126. package/lib/module/index.js.map +1 -1
  127. package/lib/module/interfaces.js +2 -0
  128. package/lib/module/interfaces.js.map +1 -0
  129. package/lib/typescript/core/AudioBuffer.d.ts +12 -0
  130. package/lib/typescript/core/AudioBuffer.d.ts.map +1 -0
  131. package/lib/typescript/core/AudioBufferSourceNode.d.ts +12 -0
  132. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -0
  133. package/lib/typescript/core/AudioContext.d.ts +6 -0
  134. package/lib/typescript/core/AudioContext.d.ts.map +1 -0
  135. package/lib/typescript/core/AudioDestinationNode.d.ts +7 -0
  136. package/lib/typescript/core/AudioDestinationNode.d.ts.map +1 -0
  137. package/lib/typescript/core/AudioNode.d.ts +16 -0
  138. package/lib/typescript/core/AudioNode.d.ts.map +1 -0
  139. package/lib/typescript/core/AudioParam.d.ts +14 -0
  140. package/lib/typescript/core/AudioParam.d.ts.map +1 -0
  141. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +10 -0
  142. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -0
  143. package/lib/typescript/core/BaseAudioContext.d.ts +26 -0
  144. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -0
  145. package/lib/typescript/core/BiquadFilterNode.d.ts +16 -0
  146. package/lib/typescript/core/BiquadFilterNode.d.ts.map +1 -0
  147. package/lib/typescript/core/GainNode.d.ts +9 -0
  148. package/lib/typescript/core/GainNode.d.ts.map +1 -0
  149. package/lib/typescript/core/OscillatorNode.d.ts +15 -0
  150. package/lib/typescript/core/OscillatorNode.d.ts.map +1 -0
  151. package/lib/typescript/core/PeriodicWave.d.ts +5 -0
  152. package/lib/typescript/core/PeriodicWave.d.ts.map +1 -0
  153. package/lib/typescript/core/StereoPannerNode.d.ts +9 -0
  154. package/lib/typescript/core/StereoPannerNode.d.ts.map +1 -0
  155. package/lib/typescript/core/types.d.ts +9 -0
  156. package/lib/typescript/core/types.d.ts.map +1 -0
  157. package/lib/typescript/errors/IndexSizeError.d.ts +5 -0
  158. package/lib/typescript/errors/IndexSizeError.d.ts.map +1 -0
  159. package/lib/typescript/errors/InvalidAccessError.d.ts +5 -0
  160. package/lib/typescript/errors/InvalidAccessError.d.ts.map +1 -0
  161. package/lib/typescript/errors/InvalidStateError.d.ts +5 -0
  162. package/lib/typescript/errors/InvalidStateError.d.ts.map +1 -0
  163. package/lib/typescript/errors/RangeError.d.ts +5 -0
  164. package/lib/typescript/errors/RangeError.d.ts.map +1 -0
  165. package/lib/typescript/errors/index.d.ts +5 -0
  166. package/lib/typescript/errors/index.d.ts.map +1 -0
  167. package/lib/typescript/index.d.ts +13 -17
  168. package/lib/typescript/index.d.ts.map +1 -1
  169. package/lib/typescript/interfaces.d.ts +78 -0
  170. package/lib/typescript/interfaces.d.ts.map +1 -0
  171. package/package.json +1 -1
  172. package/src/core/AudioBuffer.ts +68 -0
  173. package/src/core/AudioBufferSourceNode.ts +35 -0
  174. package/src/core/AudioContext.ts +12 -0
  175. package/src/core/AudioDestinationNode.ts +9 -0
  176. package/src/core/AudioNode.ts +38 -0
  177. package/src/core/AudioParam.ts +55 -0
  178. package/src/core/AudioScheduledSourceNode.ts +43 -0
  179. package/src/core/BaseAudioContext.ts +97 -0
  180. package/src/core/BiquadFilterNode.ts +49 -0
  181. package/src/core/GainNode.ts +13 -0
  182. package/src/core/OscillatorNode.ts +37 -0
  183. package/src/core/PeriodicWave.ts +10 -0
  184. package/src/core/StereoPannerNode.ts +13 -0
  185. package/src/core/types.ts +26 -0
  186. package/src/errors/IndexSizeError.ts +8 -0
  187. package/src/errors/InvalidAccessError.ts +8 -0
  188. package/src/errors/InvalidStateError.ts +8 -0
  189. package/src/errors/RangeError.ts +8 -0
  190. package/src/errors/index.ts +4 -0
  191. package/src/index.ts +19 -73
  192. package/src/interfaces.ts +120 -0
  193. package/src/modules/global.d.ts +3 -3
  194. package/lib/module/types.js.map +0 -1
  195. package/lib/typescript/types.d.ts +0 -76
  196. package/lib/typescript/types.d.ts.map +0 -1
  197. package/src/types.ts +0 -108
  198. /package/lib/module/{types.js → core/types.js} +0 -0
@@ -0,0 +1,63 @@
1
+ /*
2
+ * Copyright (C) 2010 Google Inc. All rights reserved.
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without
5
+ * modification, are permitted provided that the following conditions
6
+ * are met:
7
+ *
8
+ * 1. Redistributions of source code must retain the above copyright
9
+ * notice, this list of conditions and the following disclaimer.
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of
14
+ * its contributors may be used to endorse or promote products derived
15
+ * from this software without specific prior written permission.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+ */
28
+
29
+ #pragma once
30
+
31
+ #include <algorithm>
32
+ #include <cmath>
33
+ #include <utility>
34
+
35
+ #include "VectorMath.h"
36
+
37
+ namespace audioapi {
38
+
39
+ class FFTFrame {
40
+ public:
41
+ explicit FFTFrame(int size): size_(size), log2Size_(static_cast<int>(log2(size))), realData_(new float[size]), imaginaryData_(new float[size]) {}
42
+ ~FFTFrame() {
43
+ delete[] realData_;
44
+ delete[] imaginaryData_;
45
+ }
46
+
47
+ [[nodiscard]] float *getRealData() const {
48
+ return realData_;
49
+ }
50
+ [[nodiscard]] float *getImaginaryData() const {
51
+ return imaginaryData_;
52
+ }
53
+
54
+ void inverse(float *data);
55
+
56
+ private:
57
+ int size_;
58
+ int log2Size_;
59
+ float *realData_;
60
+ float *imaginaryData_;
61
+ };
62
+
63
+ } // namespace audioapi
@@ -0,0 +1,47 @@
1
+ #pragma once
2
+
3
+ #include <mutex>
4
+
5
+ namespace audioapi {
6
+
7
+ // Small easy interface to manage locking
8
+ class Locker {
9
+ public:
10
+ Locker(): lockPtr_(0) {}
11
+ explicit Locker(std::mutex& lockPtr): lockPtr_(&lockPtr) {
12
+ lock();
13
+ }
14
+
15
+ ~Locker() {
16
+ unlock();
17
+ }
18
+
19
+ explicit operator bool() const { return !!lockPtr_; }
20
+
21
+ void lock() {
22
+ if (lockPtr_) {
23
+ lockPtr_->lock();
24
+ }
25
+ }
26
+
27
+ void unlock() {
28
+ if (lockPtr_) {
29
+ lockPtr_->unlock();
30
+ }
31
+ }
32
+
33
+ static Locker tryLock(std::mutex& lock) {
34
+ Locker result = Locker();
35
+
36
+ if (lock.try_lock()) {
37
+ result.lockPtr_ = &lock;
38
+ }
39
+
40
+ return result;
41
+ }
42
+
43
+ private:
44
+ std::mutex* lockPtr_;
45
+ };
46
+
47
+ } // namespace audioapi
@@ -77,7 +77,7 @@ void add(
77
77
  numberOfElementsToProcess);
78
78
  }
79
79
 
80
- void substract(
80
+ void subtract(
81
81
  const float *inputVector1,
82
82
  const float *inputVector2,
83
83
  float *outputVector,
@@ -115,6 +115,10 @@ float maximumMagnitude(
115
115
  return maximumValue;
116
116
  }
117
117
 
118
+ void multiplyByScalarThenAddToOutput(const float* inputVector, float scalar, float* outputVector, size_t numberOfElementsToProcess) {
119
+ vDSP_vsma(inputVector, 1, &scalar, outputVector, 1, outputVector, 1, numberOfElementsToProcess);
120
+ }
121
+
118
122
  #else
119
123
 
120
124
  #if defined(HAVE_X86_SSE2)
@@ -363,7 +367,7 @@ void add(
363
367
  }
364
368
  }
365
369
 
366
- void substract(
370
+ void subtract(
367
371
  const float *inputVector1,
368
372
  const float *inputVector2,
369
373
  float *outputVector,
@@ -578,7 +582,7 @@ float maximumMagnitude(
578
582
  max = std::max(max, groupMaxP[3]);
579
583
 
580
584
  n = tailFrames;
581
- #elif defined(HAVE_ARM_NEON_INTRINSICS)
585
+ #elif defined(c)
582
586
  size_t tailFrames = n % 4;
583
587
  const float *endP = inputVector + n - tailFrames;
584
588
 
@@ -605,5 +609,70 @@ float maximumMagnitude(
605
609
  return max;
606
610
  }
607
611
 
612
+ void multiplyByScalarThenAddToOutput(const float* inputVector, float scalar, float* outputVector, size_t numberOfElementsToProcess) {
613
+ size_t n = numberOfElementsToProcess;
614
+
615
+ #if HAVE_X86_SSE2
616
+ // If the inputVector address is not 16-byte aligned, the first several frames (at most three) should be processed separately.
617
+ while (!is16ByteAligned(inputVector) && n) {
618
+ *outputVector += scalar * *inputVector;
619
+ inputVector++;
620
+ outputVector++;
621
+ n--;
622
+ }
623
+
624
+ // Now the inputVector is aligned, use SSE.
625
+ size_t tailFrames = n % 4;
626
+ const float* endP = outputVector + n - tailFrames;
627
+
628
+ __m128 pSource;
629
+ __m128 dest;
630
+ __m128 temp;
631
+ __m128 mScale = _mm_set_ps1(scalar);
632
+
633
+ bool destAligned = is16ByteAligned(outputVector);
634
+
635
+ #define SSE2_MULT_ADD(loadInstr, storeInstr) \
636
+ while (outputVector < endP) \
637
+ { \
638
+ pSource = _mm_load_ps(inputVector); \
639
+ temp = _mm_mul_ps(pSource, mScale); \
640
+ dest = _mm_##loadInstr##_ps(outputVector); \
641
+ dest = _mm_add_ps(dest, temp); \
642
+ _mm_##storeInstr##_ps(outputVector, dest); \
643
+ inputVector += 4; \
644
+ outputVector += 4; \
645
+ }
646
+
647
+ if (destAligned)
648
+ SSE2_MULT_ADD(load, store)
649
+ else
650
+ SSE2_MULT_ADD(loadu, storeu)
651
+
652
+ n = tailFrames;
653
+ #elif HAVE_ARM_NEON_INTRINSICS
654
+ size_t tailFrames = n % 4;
655
+ const float* endP = outputVector + n - tailFrames;
656
+
657
+ float32x4_t k = vdupq_n_f32(scalar);
658
+ while (outputVector < endP) {
659
+ float32x4_t source = vld1q_f32(inputVector);
660
+ float32x4_t dest = vld1q_f32(outputVector);
661
+
662
+ dest = vmlaq_f32(dest, source, k);
663
+ vst1q_f32(outputVector, dest);
664
+
665
+ inputVector += 4;
666
+ outputVector += 4;
667
+ }
668
+ n = tailFrames;
669
+ #endif
670
+ while (n--) {
671
+ *outputVector += *inputVector * scalar;
672
+ ++inputVector;
673
+ ++outputVector;
674
+ }
675
+ }
676
+
608
677
  #endif
609
678
  } // namespace audioapi::VectorMath
@@ -32,6 +32,12 @@
32
32
 
33
33
  namespace audioapi::VectorMath {
34
34
 
35
+ void multiplyByScalarThenAddToOutput(
36
+ const float *inputVector,
37
+ float scalar,
38
+ float *outputVector,
39
+ size_t numberOfElementsToProcess);
40
+
35
41
  void multiplyByScalar(
36
42
  const float *inputVector,
37
43
  float scalar,
@@ -47,7 +53,7 @@ void add(
47
53
  const float *inputVector2,
48
54
  float *outputVector,
49
55
  size_t numberOfElementsToProcess);
50
- void substract(
56
+ void subtract(
51
57
  const float *inputVector1,
52
58
  const float *inputVector2,
53
59
  float *outputVector,
@@ -0,0 +1,22 @@
1
+ #if defined(ANDROID)
2
+ #include "FFTFrame.h"
3
+ #include <fftw3.h>
4
+
5
+ namespace audioapi {
6
+ void FFTFrame::inverse(float *timeDomainData) {
7
+ fftwf_complex *freqDomainData = fftwf_alloc_complex(size_ / 2);
8
+ for(int i = 0; i < size_ / 2; i++) {
9
+ freqDomainData[i][0] = realData_[i];
10
+ freqDomainData[i][1] = imaginaryData_[i];
11
+ }
12
+
13
+ auto plan = fftwf_plan_dft_c2r_1d(size_, freqDomainData, timeDomainData, FFTW_ESTIMATE);
14
+ fftwf_execute(plan);
15
+ fftwf_destroy_plan(plan);
16
+ fftwf_free(freqDomainData);
17
+
18
+ VectorMath::multiplyByScalar(
19
+ timeDomainData, 1.0f / static_cast<float>(size_), timeDomainData, size_);
20
+ }
21
+ } // namespace audioapi
22
+ #endif
@@ -0,0 +1,24 @@
1
+ #if defined(HAVE_ACCELERATE)
2
+ #include "FFTFrame.h"
3
+ #include "Accelerate/Accelerate.h"
4
+
5
+ namespace audioapi {
6
+
7
+ void FFTFrame::inverse(float *timeDomainData) {
8
+ FFTSetup fftSetup_ = vDSP_create_fftsetup(log2Size_, FFT_RADIX2);
9
+ DSPSplitComplex freqDomainData;
10
+ freqDomainData.realp = realData_;
11
+ freqDomainData.imagp = imaginaryData_;
12
+
13
+ vDSP_fft_zrip(fftSetup_, &freqDomainData, 1, log2Size_, FFT_INVERSE);
14
+ vDSP_ztoc(&freqDomainData, 1, reinterpret_cast<DSPComplex *>(timeDomainData), 2, size_ / 2);
15
+
16
+ // Scale the FFT data, beacuse of
17
+ // https://developer.apple.com/library/archive/documentation/Performance/Conceptual/vDSP_Programming_Guide/UsingFourierTransforms/UsingFourierTransforms.html#//apple_ref/doc/uid/TP40005147-CH3-15892
18
+ VectorMath::multiplyByScalar(
19
+ timeDomainData, 1.0f / static_cast<float>(size_), timeDomainData, size_);
20
+
21
+ vDSP_destroy_fftsetup(fftSetup_);
22
+ }
23
+ } // namespace audioapi
24
+ #endif
@@ -24,12 +24,22 @@ void AudioBufferSourceNodeWrapper::setLoop(bool loop) {
24
24
  std::shared_ptr<AudioBufferWrapper> AudioBufferSourceNodeWrapper::getBuffer() {
25
25
  auto audioBufferSourceNode = getAudioBufferSourceNodeFromAudioNode();
26
26
  auto buffer = audioBufferSourceNode->getBuffer();
27
+
28
+ if (!buffer) {
29
+ return {nullptr};
30
+ }
31
+
27
32
  return std::make_shared<AudioBufferWrapper>(buffer);
28
33
  }
29
34
 
30
35
  void AudioBufferSourceNodeWrapper::setBuffer(
31
36
  const std::shared_ptr<AudioBufferWrapper> &buffer) {
32
37
  auto audioBufferSourceNode = getAudioBufferSourceNodeFromAudioNode();
38
+ if (!buffer) {
39
+ audioBufferSourceNode->setBuffer(std::shared_ptr<AudioBuffer>(nullptr));
40
+ return;
41
+ }
42
+
33
43
  audioBufferSourceNode->setBuffer(buffer->audioBuffer_);
34
44
  }
35
45
  } // namespace audioapi
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include <memory>
4
+ #include <optional>
4
5
 
5
6
  #include "AudioBufferSourceNode.h"
6
7
  #include "AudioBufferWrapper.h"
@@ -14,8 +15,8 @@ class AudioBufferSourceNodeWrapper : public AudioScheduledSourceNodeWrapper {
14
15
  const std::shared_ptr<AudioBufferSourceNode> &audioBufferSourceNode);
15
16
 
16
17
  void setLoop(bool loop);
17
- bool getLoop();
18
- std::shared_ptr<AudioBufferWrapper> getBuffer();
18
+ [[nodiscard]] bool getLoop();
19
+ [[nodiscard]] std::shared_ptr<AudioBufferWrapper> getBuffer();
19
20
  void setBuffer(const std::shared_ptr<AudioBufferWrapper> &buffer);
20
21
 
21
22
  private:
@@ -11,11 +11,11 @@ class AudioBufferWrapper {
11
11
  explicit AudioBufferWrapper(const std::shared_ptr<AudioBuffer> &audioBuffer);
12
12
 
13
13
  std::shared_ptr<AudioBuffer> audioBuffer_;
14
- int getNumberOfChannels() const;
15
- int getLength() const;
16
- double getDuration() const;
17
- int getSampleRate() const;
18
- float *getChannelData(int channel) const;
14
+ [[nodiscard]] int getNumberOfChannels() const;
15
+ [[nodiscard]] int getLength() const;
16
+ [[nodiscard]] double getDuration() const;
17
+ [[nodiscard]] int getSampleRate() const;
18
+ [[nodiscard]] float *getChannelData(int channel) const;
19
19
  void copyFromChannel(
20
20
  float *destination,
21
21
  int destinationLength,
@@ -3,68 +3,15 @@
3
3
  namespace audioapi {
4
4
 
5
5
  AudioContextWrapper::AudioContextWrapper(
6
- const std::shared_ptr<AudioContext> &audiocontext)
7
- : audioContext_(audiocontext) {
8
- auto destination = audioContext_->getDestination();
9
- destination_ = std::make_shared<AudioDestinationNodeWrapper>(destination);
10
- }
11
-
12
- std::shared_ptr<AudioDestinationNodeWrapper>
13
- AudioContextWrapper::getDestination() const {
14
- return destination_;
15
- }
16
-
17
- std::shared_ptr<OscillatorNodeWrapper> AudioContextWrapper::createOscillator()
18
- const {
19
- auto oscillator = audioContext_->createOscillator();
20
- return std::make_shared<OscillatorNodeWrapper>(oscillator);
21
- }
22
-
23
- std::shared_ptr<GainNodeWrapper> AudioContextWrapper::createGain() const {
24
- auto gain = audioContext_->createGain();
25
- return std::make_shared<GainNodeWrapper>(gain);
26
- }
27
-
28
- std::shared_ptr<StereoPannerNodeWrapper>
29
- AudioContextWrapper::createStereoPanner() const {
30
- auto panner = audioContext_->createStereoPanner();
31
- return std::make_shared<StereoPannerNodeWrapper>(panner);
32
- }
33
-
34
- std::shared_ptr<BiquadFilterNodeWrapper>
35
- AudioContextWrapper::createBiquadFilter() const {
36
- auto filter = audioContext_->createBiquadFilter();
37
- return std::make_shared<BiquadFilterNodeWrapper>(filter);
38
- }
39
-
40
- std::shared_ptr<AudioBufferSourceNodeWrapper>
41
- AudioContextWrapper::createBufferSource() const {
42
- auto bufferSource = audioContext_->createBufferSource();
43
- return std::make_shared<AudioBufferSourceNodeWrapper>(bufferSource);
44
- }
45
-
46
- std::shared_ptr<AudioBufferWrapper> AudioContextWrapper::createBuffer(
47
- int numberOfChannels,
48
- int length,
49
- int sampleRate) const {
50
- auto buffer =
51
- audioContext_->createBuffer(numberOfChannels, length, sampleRate);
52
- return std::make_shared<AudioBufferWrapper>(buffer);
53
- }
54
-
55
- std::string AudioContextWrapper::getState() const {
56
- return audioContext_->getState();
57
- }
58
-
59
- int AudioContextWrapper::getSampleRate() const {
60
- return audioContext_->getSampleRate();
61
- }
6
+ const std::shared_ptr<AudioContext> &context)
7
+ : BaseAudioContextWrapper(context) {}
62
8
 
63
- double AudioContextWrapper::getCurrentTime() const {
64
- return audioContext_->getCurrentTime();
9
+ void AudioContextWrapper::close() {
10
+ getAudioContextFromBaseAudioContext()->close();
65
11
  }
66
12
 
67
- void AudioContextWrapper::close() const {
68
- audioContext_->close();
13
+ std::shared_ptr<AudioContext>
14
+ AudioContextWrapper::getAudioContextFromBaseAudioContext() {
15
+ return std::static_pointer_cast<AudioContext>(context_);
69
16
  }
70
17
  } // namespace audioapi
@@ -1,40 +1,19 @@
1
1
  #pragma once
2
2
 
3
3
  #include <memory>
4
- #include <string>
5
- #include <utility>
6
4
 
7
- #include "AudioBufferSourceNodeWrapper.h"
8
- #include "AudioBufferWrapper.h"
9
5
  #include "AudioContext.h"
10
- #include "AudioDestinationNodeWrapper.h"
11
- #include "BiquadFilterNodeWrapper.h"
12
- #include "GainNodeWrapper.h"
13
- #include "OscillatorNodeWrapper.h"
14
- #include "StereoPannerNodeWrapper.h"
6
+ #include "BaseAudioContextWrapper.h"
15
7
 
16
8
  namespace audioapi {
17
9
 
18
- class AudioContextWrapper {
10
+ class AudioContextWrapper : public BaseAudioContextWrapper {
19
11
  public:
20
- explicit AudioContextWrapper(
21
- const std::shared_ptr<AudioContext> &audiocontext);
12
+ explicit AudioContextWrapper(const std::shared_ptr<AudioContext> &context);
22
13
 
23
- std::shared_ptr<AudioDestinationNodeWrapper> getDestination() const;
24
- std::shared_ptr<OscillatorNodeWrapper> createOscillator() const;
25
- std::shared_ptr<GainNodeWrapper> createGain() const;
26
- std::shared_ptr<StereoPannerNodeWrapper> createStereoPanner() const;
27
- std::shared_ptr<BiquadFilterNodeWrapper> createBiquadFilter() const;
28
- std::shared_ptr<AudioBufferSourceNodeWrapper> createBufferSource() const;
29
- std::shared_ptr<AudioBufferWrapper>
30
- createBuffer(int numberOfChannels, int length, int sampleRate) const;
31
- std::string getState() const;
32
- int getSampleRate() const;
33
- double getCurrentTime() const;
34
- void close() const;
14
+ void close();
35
15
 
36
16
  private:
37
- std::shared_ptr<AudioDestinationNodeWrapper> destination_;
38
- std::shared_ptr<AudioContext> audioContext_;
17
+ std::shared_ptr<AudioContext> getAudioContextFromBaseAudioContext();
39
18
  };
40
19
  } // namespace audioapi
@@ -11,11 +11,11 @@ class AudioNodeWrapper {
11
11
  public:
12
12
  explicit AudioNodeWrapper(const std::shared_ptr<AudioNode> &node);
13
13
 
14
- int getNumberOfInputs() const;
15
- int getNumberOfOutputs() const;
16
- int getChannelCount() const;
17
- std::string getChannelCountMode() const;
18
- std::string getChannelInterpretation() const;
14
+ [[nodiscard]] int getNumberOfInputs() const;
15
+ [[nodiscard]] int getNumberOfOutputs() const;
16
+ [[nodiscard]] int getChannelCount() const;
17
+ [[nodiscard]] std::string getChannelCountMode() const;
18
+ [[nodiscard]] std::string getChannelInterpretation() const;
19
19
  void connect(const std::shared_ptr<AudioNodeWrapper> &node) const;
20
20
  void disconnect(const std::shared_ptr<AudioNodeWrapper> &node) const;
21
21
 
@@ -10,11 +10,11 @@ class AudioParamWrapper {
10
10
  public:
11
11
  explicit AudioParamWrapper(const std::shared_ptr<AudioParam> &param);
12
12
 
13
- float getValue() const;
13
+ [[nodiscard]] float getValue() const;
14
14
  void setValue(float value) const;
15
- float getDefaultValue() const;
16
- float getMinValue() const;
17
- float getMaxValue() const;
15
+ [[nodiscard]] float getDefaultValue() const;
16
+ [[nodiscard]] float getMinValue() const;
17
+ [[nodiscard]] float getMaxValue() const;
18
18
  void setValueAtTime(float value, double startTime) const;
19
19
  void linearRampToValueAtTime(float value, double endTime) const;
20
20
  void exponentialRampToValueAtTime(float value, double endTime) const;
@@ -0,0 +1,76 @@
1
+ #include "BaseAudioContextWrapper.h"
2
+
3
+ namespace audioapi {
4
+
5
+ BaseAudioContextWrapper::BaseAudioContextWrapper(
6
+ const std::shared_ptr<BaseAudioContext> &context)
7
+ : context_(context) {
8
+ auto destination = context_->getDestination();
9
+ destination_ = std::make_shared<AudioDestinationNodeWrapper>(destination);
10
+ }
11
+
12
+ std::shared_ptr<AudioDestinationNodeWrapper>
13
+ BaseAudioContextWrapper::getDestination() const {
14
+ return destination_;
15
+ }
16
+
17
+ std::string BaseAudioContextWrapper::getState() const {
18
+ return context_->getState();
19
+ }
20
+
21
+ int BaseAudioContextWrapper::getSampleRate() const {
22
+ return context_->getSampleRate();
23
+ }
24
+
25
+ double BaseAudioContextWrapper::getCurrentTime() const {
26
+ return context_->getCurrentTime();
27
+ }
28
+
29
+ std::shared_ptr<OscillatorNodeWrapper>
30
+ BaseAudioContextWrapper::createOscillator() const {
31
+ auto oscillator = context_->createOscillator();
32
+ return std::make_shared<OscillatorNodeWrapper>(oscillator);
33
+ }
34
+
35
+ std::shared_ptr<GainNodeWrapper> BaseAudioContextWrapper::createGain() const {
36
+ auto gain = context_->createGain();
37
+ return std::make_shared<GainNodeWrapper>(gain);
38
+ }
39
+
40
+ std::shared_ptr<StereoPannerNodeWrapper>
41
+ BaseAudioContextWrapper::createStereoPanner() const {
42
+ auto panner = context_->createStereoPanner();
43
+ return std::make_shared<StereoPannerNodeWrapper>(panner);
44
+ }
45
+
46
+ std::shared_ptr<BiquadFilterNodeWrapper>
47
+ BaseAudioContextWrapper::createBiquadFilter() const {
48
+ auto filter = context_->createBiquadFilter();
49
+ return std::make_shared<BiquadFilterNodeWrapper>(filter);
50
+ }
51
+
52
+ std::shared_ptr<AudioBufferSourceNodeWrapper>
53
+ BaseAudioContextWrapper::createBufferSource() const {
54
+ auto bufferSource = context_->createBufferSource();
55
+ return std::make_shared<AudioBufferSourceNodeWrapper>(bufferSource);
56
+ }
57
+
58
+ std::shared_ptr<AudioBufferWrapper> BaseAudioContextWrapper::createBuffer(
59
+ int numberOfChannels,
60
+ int length,
61
+ int sampleRate) const {
62
+ auto buffer = context_->createBuffer(numberOfChannels, length, sampleRate);
63
+ return std::make_shared<AudioBufferWrapper>(buffer);
64
+ }
65
+
66
+ std::shared_ptr<PeriodicWaveWrapper>
67
+ BaseAudioContextWrapper::createPeriodicWave(
68
+ float *real,
69
+ float *imag,
70
+ bool disableNormalization,
71
+ int length) {
72
+ auto periodicWave =
73
+ context_->createPeriodicWave(real, imag, disableNormalization, length);
74
+ return std::make_shared<PeriodicWaveWrapper>(periodicWave);
75
+ }
76
+ } // namespace audioapi
@@ -0,0 +1,49 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <string>
5
+ #include <utility>
6
+
7
+ #include "AudioBufferSourceNodeWrapper.h"
8
+ #include "AudioBufferWrapper.h"
9
+ #include "AudioDestinationNodeWrapper.h"
10
+ #include "BaseAudioContext.h"
11
+ #include "BiquadFilterNodeWrapper.h"
12
+ #include "GainNodeWrapper.h"
13
+ #include "OscillatorNodeWrapper.h"
14
+ #include "PeriodicWaveWrapper.h"
15
+ #include "StereoPannerNodeWrapper.h"
16
+
17
+ namespace audioapi {
18
+
19
+ class BaseAudioContextWrapper {
20
+ public:
21
+ explicit BaseAudioContextWrapper(
22
+ const std::shared_ptr<BaseAudioContext> &context);
23
+
24
+ [[nodiscard]] std::shared_ptr<AudioDestinationNodeWrapper> getDestination()
25
+ const;
26
+ [[nodiscard]] std::string getState() const;
27
+ [[nodiscard]] int getSampleRate() const;
28
+ [[nodiscard]] double getCurrentTime() const;
29
+ [[nodiscard]] std::shared_ptr<OscillatorNodeWrapper> createOscillator() const;
30
+ [[nodiscard]] std::shared_ptr<GainNodeWrapper> createGain() const;
31
+ [[nodiscard]] std::shared_ptr<StereoPannerNodeWrapper> createStereoPanner()
32
+ const;
33
+ [[nodiscard]] std::shared_ptr<BiquadFilterNodeWrapper> createBiquadFilter()
34
+ const;
35
+ [[nodiscard]] std::shared_ptr<AudioBufferSourceNodeWrapper>
36
+ createBufferSource() const;
37
+ [[nodiscard]] std::shared_ptr<AudioBufferWrapper>
38
+ createBuffer(int numberOfChannels, int length, int sampleRate) const;
39
+ [[nodiscard]] std::shared_ptr<PeriodicWaveWrapper> createPeriodicWave(
40
+ float *real,
41
+ float *imag,
42
+ bool disableNormalization,
43
+ int length);
44
+
45
+ protected:
46
+ std::shared_ptr<AudioDestinationNodeWrapper> destination_;
47
+ std::shared_ptr<BaseAudioContext> context_;
48
+ };
49
+ } // namespace audioapi
@@ -48,4 +48,13 @@ void BiquadFilterNodeWrapper::setType(const std::string &filterType) {
48
48
  auto biquadFilterNode_ = getBiquadFilterNodeFromAudioNode();
49
49
  biquadFilterNode_->setType(filterType);
50
50
  }
51
+
52
+ void BiquadFilterNodeWrapper::getFrequencyResponse(
53
+ const std::vector<float> &frequencyArray,
54
+ std::vector<float> &magResponseOutput,
55
+ std::vector<float> &phaseResponseOutput) {
56
+ auto biquadFilterNode_ = getBiquadFilterNodeFromAudioNode();
57
+ biquadFilterNode_->getFrequencyResponse(
58
+ frequencyArray, magResponseOutput, phaseResponseOutput);
59
+ }
51
60
  } // namespace audioapi
@@ -2,6 +2,7 @@
2
2
 
3
3
  #include <memory>
4
4
  #include <string>
5
+ #include <vector>
5
6
 
6
7
  #include "AudioNodeWrapper.h"
7
8
  #include "AudioParamWrapper.h"
@@ -14,12 +15,16 @@ class BiquadFilterNodeWrapper : public AudioNodeWrapper {
14
15
  explicit BiquadFilterNodeWrapper(
15
16
  const std::shared_ptr<BiquadFilterNode> &biquadFilterNode);
16
17
 
17
- std::shared_ptr<AudioParamWrapper> getFrequencyParam() const;
18
- std::shared_ptr<AudioParamWrapper> getDetuneParam() const;
19
- std::shared_ptr<AudioParamWrapper> getQParam() const;
20
- std::shared_ptr<AudioParamWrapper> getGainParam() const;
18
+ [[nodiscard]] std::shared_ptr<AudioParamWrapper> getFrequencyParam() const;
19
+ [[nodiscard]] std::shared_ptr<AudioParamWrapper> getDetuneParam() const;
20
+ [[nodiscard]] std::shared_ptr<AudioParamWrapper> getQParam() const;
21
+ [[nodiscard]] std::shared_ptr<AudioParamWrapper> getGainParam() const;
21
22
  std::string getType();
22
23
  void setType(const std::string &filterType);
24
+ void getFrequencyResponse(
25
+ const std::vector<float> &frequencyArray,
26
+ std::vector<float> &magResponseOutput,
27
+ std::vector<float> &phaseResponseOutput);
23
28
 
24
29
  private:
25
30
  std::shared_ptr<AudioParamWrapper> frequencyParam_;