react-native-audio-api 0.12.0-nightly-3254662-20260127 → 0.12.0-nightly-1a3c43b-20260128

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 (131) hide show
  1. package/android/src/main/cpp/audioapi/CMakeLists.txt +0 -6
  2. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +3 -2
  3. package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -1
  4. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +1 -1
  5. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +5 -1
  6. package/android/src/main/java/com/swmansion/audioapi/system/AudioEvent.kt +28 -0
  7. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +4 -4
  8. package/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt +1 -1
  9. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +27 -18
  10. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +13 -8
  11. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +3 -2
  12. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +2 -2
  13. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +9 -12
  14. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +4 -2
  15. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +5 -1
  16. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +38 -38
  17. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -2
  18. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +8 -4
  19. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +7 -1
  20. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +6 -4
  21. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +6 -2
  22. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +8 -5
  23. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +5 -3
  24. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +5 -3
  25. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +5 -2
  26. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +4 -3
  27. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +5 -2
  28. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +6 -2
  29. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +5 -2
  30. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +6 -2
  31. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +5 -2
  32. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +5 -2
  33. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +5 -2
  34. package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.cpp +9 -4
  35. package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.h +5 -2
  36. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +3 -2
  37. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +9 -6
  38. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +4 -2
  39. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +5 -2
  40. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +5 -2
  41. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +5 -2
  42. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +5 -2
  43. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +7 -3
  44. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +5 -2
  45. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  46. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -2
  47. package/common/cpp/audioapi/HostObjects/utils/JsEnumParser.cpp +63 -0
  48. package/common/cpp/audioapi/HostObjects/utils/JsEnumParser.h +5 -0
  49. package/common/cpp/audioapi/core/AudioContext.cpp +2 -4
  50. package/common/cpp/audioapi/core/AudioNode.cpp +2 -2
  51. package/common/cpp/audioapi/core/AudioNode.h +6 -6
  52. package/common/cpp/audioapi/core/BaseAudioContext.cpp +7 -22
  53. package/common/cpp/audioapi/core/BaseAudioContext.h +20 -22
  54. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +3 -6
  55. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +5 -2
  56. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +4 -2
  57. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
  58. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
  59. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +6 -6
  60. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +2 -2
  61. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +1 -1
  62. package/common/cpp/audioapi/core/effects/ConvolverNode.h +2 -2
  63. package/common/cpp/audioapi/core/effects/DelayNode.cpp +1 -1
  64. package/common/cpp/audioapi/core/effects/DelayNode.h +2 -2
  65. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -1
  66. package/common/cpp/audioapi/core/effects/GainNode.h +2 -2
  67. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +5 -3
  68. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +2 -2
  69. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +5 -2
  70. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +2 -2
  71. package/common/cpp/audioapi/core/effects/WaveShaperNode.cpp +4 -2
  72. package/common/cpp/audioapi/core/effects/WaveShaperNode.h +2 -2
  73. package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -1
  74. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +10 -4
  75. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +2 -2
  76. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +13 -13
  77. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +2 -2
  78. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +6 -5
  79. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +2 -2
  80. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +2 -2
  81. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +10 -2
  82. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +2 -2
  83. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +11 -6
  84. package/common/cpp/audioapi/core/sources/OscillatorNode.h +2 -2
  85. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +17 -4
  86. package/common/cpp/audioapi/core/sources/StreamerNode.h +4 -2
  87. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +1 -1
  88. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +2 -2
  89. package/common/cpp/audioapi/events/AudioEvent.h +30 -0
  90. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +9 -20
  91. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +7 -34
  92. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +5 -4
  93. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +5 -10
  94. package/ios/audioapi/ios/AudioAPIModule.h +3 -1
  95. package/ios/audioapi/ios/AudioAPIModule.mm +7 -6
  96. package/ios/audioapi/ios/system/AudioSessionManager.h +3 -1
  97. package/ios/audioapi/ios/system/AudioSessionManager.mm +8 -1
  98. package/ios/audioapi/ios/system/SystemNotificationManager.mm +17 -8
  99. package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +36 -33
  100. package/lib/commonjs/core/AudioDecoder.js +2 -2
  101. package/lib/commonjs/core/AudioDecoder.js.map +1 -1
  102. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  103. package/lib/commonjs/specs/NativeAudioAPIModule.web.js.map +1 -1
  104. package/lib/commonjs/system/AudioManager.js +1 -1
  105. package/lib/commonjs/system/AudioManager.js.map +1 -1
  106. package/lib/module/core/AudioDecoder.js +2 -2
  107. package/lib/module/core/AudioDecoder.js.map +1 -1
  108. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  109. package/lib/module/specs/NativeAudioAPIModule.web.js.map +1 -1
  110. package/lib/module/system/AudioManager.js +1 -1
  111. package/lib/module/system/AudioManager.js.map +1 -1
  112. package/lib/typescript/core/AudioDecoder.d.ts.map +1 -1
  113. package/lib/typescript/events/types.d.ts +1 -17
  114. package/lib/typescript/events/types.d.ts.map +1 -1
  115. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -1
  116. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  117. package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts +1 -1
  118. package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts.map +1 -1
  119. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  120. package/lib/typescript/system/notification/types.d.ts +4 -3
  121. package/lib/typescript/system/notification/types.d.ts.map +1 -1
  122. package/lib/typescript/system/types.d.ts +8 -0
  123. package/lib/typescript/system/types.d.ts.map +1 -1
  124. package/package.json +1 -1
  125. package/src/core/AudioDecoder.ts +2 -2
  126. package/src/events/types.ts +1 -18
  127. package/src/specs/NativeAudioAPIModule.ts +3 -2
  128. package/src/specs/NativeAudioAPIModule.web.ts +2 -1
  129. package/src/system/AudioManager.ts +2 -1
  130. package/src/system/notification/types.ts +6 -4
  131. package/src/system/types.ts +8 -0
@@ -103,12 +103,6 @@ set(RN_VERSION_LINK_LIBRARIES
103
103
  ReactAndroid::reactnative
104
104
  )
105
105
 
106
- target_compile_options(
107
- react-native-audio-api
108
- PRIVATE
109
- -Wno-mismatched-tags
110
- )
111
-
112
106
  if(RN_AUDIO_API_WORKLETS_ENABLED)
113
107
  target_compile_definitions(
114
108
  react-native-audio-api
@@ -64,7 +64,7 @@ void AudioAPIModule::injectJSIBindings() {
64
64
  }
65
65
 
66
66
  void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
67
- jni::alias_ref<jni::JString> eventName,
67
+ jint eventOrdinal,
68
68
  jni::alias_ref<jni::JMap<jstring, jobject>> eventBody) {
69
69
  std::unordered_map<std::string, EventValue> body = {};
70
70
 
@@ -92,7 +92,8 @@ void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
92
92
  }
93
93
 
94
94
  if (audioEventHandlerRegistry_ != nullptr) {
95
- audioEventHandlerRegistry_->invokeHandlerWithEventBody(eventName->toStdString(), body);
95
+ audioEventHandlerRegistry_->invokeHandlerWithEventBody(
96
+ static_cast<audioapi::AudioEvent>(eventOrdinal), body);
96
97
  }
97
98
  }
98
99
  } // namespace audioapi
@@ -33,7 +33,7 @@ class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
33
33
  static void registerNatives();
34
34
 
35
35
  void injectJSIBindings();
36
- void invokeHandlerWithEventNameAndEventBody(jni::alias_ref<jni::JString> eventName, jni::alias_ref<jni::JMap<jstring, jobject>> eventBody);
36
+ void invokeHandlerWithEventNameAndEventBody(jint eventOrdinal, jni::alias_ref<jni::JMap<jstring, jobject>> eventBody);
37
37
 
38
38
  private:
39
39
  friend HybridBase;
@@ -431,7 +431,7 @@ void AndroidAudioRecorder::onErrorAfterClose(oboe::AudioStream *stream, oboe::Re
431
431
  std::string message = "Android recorder error: " + streamResult.unwrap_err();
432
432
  std::unordered_map<std::string, EventValue> eventPayload{{"message", std::move(message)}};
433
433
  audioEventHandlerRegistry_->invokeHandlerWithEventBody(
434
- "recorderError", callbackId, eventPayload);
434
+ AudioEvent::RECORDER_ERROR, callbackId, eventPayload);
435
435
  return;
436
436
  }
437
437
 
@@ -1,6 +1,8 @@
1
1
  package com.swmansion.audioapi
2
2
 
3
3
  import android.media.AudioManager
4
+ import android.os.Build
5
+ import androidx.annotation.RequiresApi
4
6
  import androidx.annotation.RequiresPermission
5
7
  import com.facebook.jni.HybridData
6
8
  import com.facebook.react.bridge.Arguments
@@ -41,7 +43,7 @@ class AudioAPIModule(
41
43
  private external fun injectJSIBindings()
42
44
 
43
45
  external fun invokeHandlerWithEventNameAndEventBody(
44
- eventName: String,
46
+ eventOrdinal: Int,
45
47
  eventBody: Map<String, Any>,
46
48
  )
47
49
 
@@ -108,6 +110,7 @@ class AudioAPIModule(
108
110
  mode: String?,
109
111
  options: ReadableArray?,
110
112
  allowHaptics: Boolean,
113
+ notifyOthersOnDeactivation: Boolean,
111
114
  ) {
112
115
  // noting to do here
113
116
  }
@@ -159,6 +162,7 @@ class AudioAPIModule(
159
162
  promise.resolve(MediaSessionManager.checkNotificationPermissions())
160
163
  }
161
164
 
165
+ @RequiresApi(Build.VERSION_CODES.O)
162
166
  override fun getDevicesInfo(promise: Promise) {
163
167
  promise.resolve(MediaSessionManager.getDevicesInfo())
164
168
  }
@@ -0,0 +1,28 @@
1
+ package com.swmansion.audioapi.system
2
+
3
+ // should be kept in sync with AudioEvent.h
4
+ enum class AudioEvent {
5
+ PLAYBACK_NOTIFICATION_PLAY,
6
+ PLAYBACK_NOTIFICATION_PAUSE,
7
+ PLAYBACK_NOTIFICATION_STOP,
8
+ PLAYBACK_NOTIFICATION_NEXT_TRACK,
9
+ PLAYBACK_NOTIFICATION_PREVIOUS_TRACK,
10
+ PLAYBACK_NOTIFICATION_SKIP_FORWARD,
11
+ PLAYBACK_NOTIFICATION_SKIP_BACKWARD,
12
+ PLAYBACK_NOTIFICATION_SEEK_FORWARD,
13
+ PLAYBACK_NOTIFICATION_SEEK_BACKWARD,
14
+ PLAYBACK_NOTIFICATION_SEEK_TO,
15
+ PLAYBACK_NOTIFICATION_DISMISSED,
16
+ RECORDING_NOTIFICATION_RESUME,
17
+ RECORDING_NOTIFICATION_PAUSE,
18
+ ROUTE_CHANGE,
19
+ INTERRUPTION,
20
+ VOLUME_CHANGE,
21
+ DUCK,
22
+ ENDED,
23
+ LOOP_ENDED,
24
+ AUDIO_READY,
25
+ POSITION_CHANGED,
26
+ BUFFER_ENDED,
27
+ RECORDER_ERROR,
28
+ }
@@ -25,7 +25,7 @@ class AudioFocusListener(
25
25
  put("shouldResume", false)
26
26
  isTransientLoss = false
27
27
  }
28
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
28
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.INTERRUPTION.ordinal, body)
29
29
  }
30
30
 
31
31
  AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
@@ -35,7 +35,7 @@ class AudioFocusListener(
35
35
  put("shouldResume", false)
36
36
  isTransientLoss = true
37
37
  }
38
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
38
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.INTERRUPTION.ordinal, body)
39
39
  }
40
40
 
41
41
  AudioManager.AUDIOFOCUS_GAIN -> {
@@ -45,11 +45,11 @@ class AudioFocusListener(
45
45
  put("shouldResume", isTransientLoss)
46
46
  isTransientLoss = false
47
47
  }
48
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
48
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.INTERRUPTION.ordinal, body)
49
49
  }
50
50
 
51
51
  AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
52
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("duck", emptyMap())
52
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.DUCK.ordinal, emptyMap())
53
53
  }
54
54
  }
55
55
  }
@@ -21,7 +21,7 @@ class VolumeChangeListener(
21
21
  val maxVolume = audioManager.get()?.getStreamMaxVolume(AudioManager.STREAM_MUSIC)?.toDouble()!!
22
22
 
23
23
  val body = HashMap<String, Any>().apply { put("value", currentVolume / maxVolume) }
24
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("volumeChange", body)
24
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.VOLUME_CHANGE.ordinal, body)
25
25
  }
26
26
 
27
27
  fun getIntentFilter(): IntentFilter {
@@ -19,6 +19,7 @@ import com.facebook.react.bridge.ReadableMap
19
19
  import com.facebook.react.bridge.ReadableType
20
20
  import com.swmansion.audioapi.AudioAPIModule
21
21
  import com.swmansion.audioapi.R
22
+ import com.swmansion.audioapi.system.AudioEvent
22
23
  import java.io.IOException
23
24
  import java.lang.ref.WeakReference
24
25
  import java.net.URL
@@ -78,34 +79,38 @@ class PlaybackNotification(
78
79
  mediaSession?.setCallback(
79
80
  object : MediaSessionCompat.Callback() {
80
81
  override fun onPlay() {
81
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("playbackNotificationPlay", mapOf())
82
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_PLAY.ordinal, mapOf())
82
83
  }
83
84
 
84
85
  override fun onPause() {
85
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("playbackNotificationPause", mapOf())
86
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_PAUSE.ordinal, mapOf())
87
+ }
88
+
89
+ override fun onStop() {
90
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_STOP.ordinal, mapOf())
86
91
  }
87
92
 
88
93
  override fun onSkipToNext() {
89
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("playbackNotificationNext", mapOf())
94
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_NEXT_TRACK.ordinal, mapOf())
90
95
  }
91
96
 
92
97
  override fun onSkipToPrevious() {
93
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("playbackNotificationPrevious", mapOf())
98
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_PREVIOUS_TRACK.ordinal, mapOf())
94
99
  }
95
100
 
96
101
  override fun onFastForward() {
97
102
  val body = HashMap<String, Any>().apply { put("value", 15) }
98
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("playbackNotificationSkipForward", body)
103
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_FORWARD.ordinal, body)
99
104
  }
100
105
 
101
106
  override fun onRewind() {
102
107
  val body = HashMap<String, Any>().apply { put("value", 15) }
103
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("playbackNotificationSkipBackward", body)
108
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_BACKWARD.ordinal, body)
104
109
  }
105
110
 
106
111
  override fun onSeekTo(pos: Long) {
107
112
  val body = HashMap<String, Any>().apply { put("value", pos / 1000.0) }
108
- audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("playbackNotificationSeekTo", body)
113
+ audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SEEK_TO.ordinal, body)
109
114
  }
110
115
 
111
116
  override fun onCustomAction(
@@ -292,15 +297,14 @@ class PlaybackNotification(
292
297
  if (name == null) return
293
298
  var controlValue = 0L
294
299
  when (name) {
295
- "play", "remotePlay" -> controlValue = PlaybackStateCompat.ACTION_PLAY
296
- "pause", "remotePause" -> controlValue = PlaybackStateCompat.ACTION_PAUSE
297
- "stop", "remoteStop" -> controlValue = PlaybackStateCompat.ACTION_STOP
298
- "togglePlayPause", "remoteTogglePlayPause" -> controlValue = PlaybackStateCompat.ACTION_PLAY_PAUSE
299
- "next", "remoteNextTrack" -> controlValue = PlaybackStateCompat.ACTION_SKIP_TO_NEXT
300
- "previous", "remotePreviousTrack" -> controlValue = PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
301
- "skipForward", "remoteSkipForward" -> controlValue = PlaybackStateCompat.ACTION_FAST_FORWARD
302
- "skipBackward", "remoteSkipBackward" -> controlValue = PlaybackStateCompat.ACTION_REWIND
303
- "seekTo", "remoteChangePlaybackPosition" -> controlValue = PlaybackStateCompat.ACTION_SEEK_TO
300
+ "play" -> controlValue = PlaybackStateCompat.ACTION_PLAY
301
+ "pause" -> controlValue = PlaybackStateCompat.ACTION_PAUSE
302
+ "stop" -> controlValue = PlaybackStateCompat.ACTION_STOP
303
+ "nextTrack" -> controlValue = PlaybackStateCompat.ACTION_SKIP_TO_NEXT
304
+ "previousTrack" -> controlValue = PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
305
+ "skipForward" -> controlValue = PlaybackStateCompat.ACTION_FAST_FORWARD
306
+ "skipBackward" -> controlValue = PlaybackStateCompat.ACTION_REWIND
307
+ "seekTo" -> controlValue = PlaybackStateCompat.ACTION_SEEK_TO
304
308
  }
305
309
 
306
310
  controls =
@@ -366,7 +370,7 @@ class PlaybackNotification(
366
370
 
367
371
  if (hasControl(PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)) {
368
372
  notificationBuilder?.addAction(
369
- createAction("previous", "Previous", android.R.drawable.ic_media_previous, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS),
373
+ createAction("previousTrack", "Previous track", android.R.drawable.ic_media_previous, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS),
370
374
  )
371
375
  actionsList.add(index++)
372
376
  }
@@ -384,6 +388,11 @@ class PlaybackNotification(
384
388
  createAction("pause", "Pause", android.R.drawable.ic_media_pause, PlaybackStateCompat.ACTION_PAUSE),
385
389
  )
386
390
  actionsList.add(index++)
391
+ } else if (hasControl(PlaybackStateCompat.ACTION_STOP)) {
392
+ notificationBuilder?.addAction(
393
+ createAction("stop", "Stop", R.drawable.stop, PlaybackStateCompat.ACTION_STOP),
394
+ )
395
+ actionsList.add(index++)
387
396
  }
388
397
  } else {
389
398
  if (hasControl(PlaybackStateCompat.ACTION_PLAY)) {
@@ -401,7 +410,7 @@ class PlaybackNotification(
401
410
 
402
411
  if (hasControl(PlaybackStateCompat.ACTION_SKIP_TO_NEXT)) {
403
412
  notificationBuilder?.addAction(
404
- createAction("next", "Next", android.R.drawable.ic_media_next, PlaybackStateCompat.ACTION_SKIP_TO_NEXT),
413
+ createAction("nextTrack", "Next track", android.R.drawable.ic_media_next, PlaybackStateCompat.ACTION_SKIP_TO_NEXT),
405
414
  )
406
415
  actionsList.add(index++)
407
416
  }
@@ -4,6 +4,7 @@ import android.content.BroadcastReceiver
4
4
  import android.content.Context
5
5
  import android.content.Intent
6
6
  import com.swmansion.audioapi.AudioAPIModule
7
+ import com.swmansion.audioapi.system.AudioEvent
7
8
 
8
9
  /**
9
10
  * Broadcast receiver for handling playback notification dismissal.
@@ -25,14 +26,18 @@ class PlaybackNotificationReceiver : BroadcastReceiver() {
25
26
  context: Context?,
26
27
  intent: Intent?,
27
28
  ) {
28
- if (intent?.action == ACTION_NOTIFICATION_DISMISSED) {
29
- audioAPIModule?.invokeHandlerWithEventNameAndEventBody("playbackNotificationDismissed", mapOf())
30
- } else if (intent?.action == ACTION_SKIP_FORWARD) {
31
- val body = HashMap<String, Any>().apply { put("value", 15) }
32
- audioAPIModule?.invokeHandlerWithEventNameAndEventBody("playbackNotificationSkipForward", body)
33
- } else if (intent?.action == ACTION_SKIP_BACKWARD) {
34
- val body = HashMap<String, Any>().apply { put("value", 15) }
35
- audioAPIModule?.invokeHandlerWithEventNameAndEventBody("playbackNotificationSkipBackward", body)
29
+ when (intent?.action) {
30
+ ACTION_NOTIFICATION_DISMISSED -> {
31
+ audioAPIModule?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_DISMISSED.ordinal, mapOf())
32
+ }
33
+ ACTION_SKIP_FORWARD -> {
34
+ val body = HashMap<String, Any>().apply { put("value", 15) }
35
+ audioAPIModule?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_FORWARD.ordinal, body)
36
+ }
37
+ ACTION_SKIP_BACKWARD -> {
38
+ val body = HashMap<String, Any>().apply { put("value", 15) }
39
+ audioAPIModule?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_BACKWARD.ordinal, body)
40
+ }
36
41
  }
37
42
  }
38
43
  }
@@ -5,6 +5,7 @@ import android.content.Context
5
5
  import android.content.Intent
6
6
  import android.util.Log
7
7
  import com.swmansion.audioapi.AudioAPIModule
8
+ import com.swmansion.audioapi.system.AudioEvent
8
9
 
9
10
  class RecordingNotificationReceiver(
10
11
  private val module: AudioAPIModule,
@@ -22,12 +23,12 @@ class RecordingNotificationReceiver(
22
23
  when (intent?.action) {
23
24
  NOTIFICATION_RECORDING_STOPPED -> {
24
25
  Log.d(TAG, "Recording stopped via notification")
25
- module.invokeHandlerWithEventNameAndEventBody("recordingNotificationPause", mapOf())
26
+ module.invokeHandlerWithEventNameAndEventBody(AudioEvent.RECORDING_NOTIFICATION_PAUSE.ordinal, mapOf())
26
27
  }
27
28
 
28
29
  NOTIFICATION_RECORDING_RESUMED -> {
29
30
  Log.d(TAG, "Recording resumed via notification")
30
- module.invokeHandlerWithEventNameAndEventBody("recordingNotificationResume", mapOf())
31
+ module.invokeHandlerWithEventNameAndEventBody(AudioEvent.RECORDING_NOTIFICATION_RESUME.ordinal, mapOf())
31
32
  }
32
33
  }
33
34
  }
@@ -48,7 +48,7 @@ public abstract class NativeAudioAPIModuleSpec extends ReactContextBaseJavaModul
48
48
 
49
49
  @ReactMethod
50
50
  @DoNotStrip
51
- public abstract void setAudioSessionOptions(String category, String mode, ReadableArray options, boolean allowHaptics);
51
+ public abstract void setAudioSessionOptions(String category, String mode, ReadableArray options, boolean allowHaptics, boolean notifyOthersOnDeactivation);
52
52
 
53
53
  @ReactMethod
54
54
  @DoNotStrip
@@ -56,7 +56,7 @@ public abstract class NativeAudioAPIModuleSpec extends ReactContextBaseJavaModul
56
56
 
57
57
  @ReactMethod
58
58
  @DoNotStrip
59
- public abstract void observeAudioInterruptions(boolean enabled);
59
+ public abstract void observeAudioInterruptions(String focusType, boolean enabled);
60
60
 
61
61
  @ReactMethod
62
62
  @DoNotStrip
@@ -69,7 +69,6 @@ class AudioAPIModuleInstaller {
69
69
  const jsi::Value &thisValue,
70
70
  const jsi::Value *args,
71
71
  size_t count) -> jsi::Value {
72
- std::shared_ptr<AudioContext> audioContext;
73
72
  auto sampleRate = static_cast<float>(args[0].getNumber());
74
73
 
75
74
  #if RN_AUDIO_API_ENABLE_WORKLETS
@@ -80,12 +79,8 @@ class AudioAPIModuleInstaller {
80
79
  auto runtimeRegistry = RuntimeRegistry{};
81
80
  #endif
82
81
 
83
- audioContext = std::make_shared<AudioContext>(
84
- sampleRate, audioEventHandlerRegistry, runtimeRegistry);
85
- audioContext->initialize();
86
-
87
- auto audioContextHostObject =
88
- std::make_shared<AudioContextHostObject>(audioContext, &runtime, jsCallInvoker);
82
+ auto audioContextHostObject = std::make_shared<AudioContextHostObject>(
83
+ sampleRate, audioEventHandlerRegistry, runtimeRegistry, &runtime, jsCallInvoker);
89
84
 
90
85
  return jsi::Object::createFromHostObject(runtime, audioContextHostObject);
91
86
  });
@@ -117,12 +112,14 @@ class AudioAPIModuleInstaller {
117
112
  auto runtimeRegistry = RuntimeRegistry{};
118
113
  #endif
119
114
 
120
- auto offlineAudioContext = std::make_shared<OfflineAudioContext>(
121
- numberOfChannels, length, sampleRate, audioEventHandlerRegistry, runtimeRegistry);
122
- offlineAudioContext->initialize();
123
-
124
115
  auto audioContextHostObject = std::make_shared<OfflineAudioContextHostObject>(
125
- offlineAudioContext, &runtime, jsCallInvoker);
116
+ numberOfChannels,
117
+ length,
118
+ sampleRate,
119
+ audioEventHandlerRegistry,
120
+ runtimeRegistry,
121
+ &runtime,
122
+ jsCallInvoker);
126
123
 
127
124
  return jsi::Object::createFromHostObject(runtime, audioContextHostObject);
128
125
  });
@@ -7,10 +7,12 @@
7
7
  namespace audioapi {
8
8
 
9
9
  AudioContextHostObject::AudioContextHostObject(
10
- const std::shared_ptr<AudioContext> &audioContext,
10
+ float sampleRate,
11
+ const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,
12
+ const RuntimeRegistry &runtimeRegistry,
11
13
  jsi::Runtime *runtime,
12
14
  const std::shared_ptr<react::CallInvoker> &callInvoker)
13
- : BaseAudioContextHostObject(audioContext, runtime, callInvoker) {
15
+ : BaseAudioContextHostObject(std::make_shared<AudioContext>(sampleRate, audioEventHandlerRegistry, runtimeRegistry), runtime, callInvoker) {
14
16
  addFunctions(
15
17
  JSI_EXPORT_FUNCTION(AudioContextHostObject, close),
16
18
  JSI_EXPORT_FUNCTION(AudioContextHostObject, resume),
@@ -1,6 +1,8 @@
1
1
  #pragma once
2
2
 
3
3
  #include <audioapi/HostObjects/BaseAudioContextHostObject.h>
4
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
5
+ #include <audioapi/events/IAudioEventHandlerRegistry.h>
4
6
 
5
7
  #include <jsi/jsi.h>
6
8
  #include <memory>
@@ -15,7 +17,9 @@ class AudioContext;
15
17
  class AudioContextHostObject : public BaseAudioContextHostObject {
16
18
  public:
17
19
  explicit AudioContextHostObject(
18
- const std::shared_ptr<AudioContext> &audioContext,
20
+ float sampleRate,
21
+ const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,
22
+ const RuntimeRegistry &runtimeRegistry,
19
23
  jsi::Runtime *runtime,
20
24
  const std::shared_ptr<react::CallInvoker> &callInvoker);
21
25
 
@@ -1,5 +1,4 @@
1
1
  #include <audioapi/HostObjects/BaseAudioContextHostObject.h>
2
-
3
2
  #include <audioapi/HostObjects/WorkletNodeHostObject.h>
4
3
  #include <audioapi/HostObjects/WorkletProcessingNodeHostObject.h>
5
4
  #include <audioapi/HostObjects/analysis/AnalyserNodeHostObject.h>
@@ -20,9 +19,10 @@
20
19
  #include <audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h>
21
20
  #include <audioapi/HostObjects/sources/StreamerNodeHostObject.h>
22
21
  #include <audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h>
22
+ #include <audioapi/HostObjects/utils/JsEnumParser.h>
23
+ #include <audioapi/HostObjects/utils/NodeOptionsParser.h>
23
24
  #include <audioapi/core/BaseAudioContext.h>
24
25
 
25
- #include <audioapi/HostObjects/utils/NodeOptionsParser.h>
26
26
  #include <memory>
27
27
  #include <utility>
28
28
  #include <vector>
@@ -33,8 +33,11 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
33
33
  const std::shared_ptr<BaseAudioContext> &context,
34
34
  jsi::Runtime *runtime,
35
35
  const std::shared_ptr<react::CallInvoker> &callInvoker)
36
- : context_(context), callInvoker_(callInvoker) {
37
- promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);
36
+ : context_(context),
37
+ promiseVendor_(std::make_shared<PromiseVendor>(runtime, callInvoker)),
38
+ callInvoker_(callInvoker) {
39
+ context_->initialize();
40
+ destination_ = std::make_shared<AudioDestinationNodeHostObject>(context_->getDestination());
38
41
 
39
42
  addGetters(
40
43
  JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),
@@ -71,12 +74,11 @@ BaseAudioContextHostObject::BaseAudioContextHostObject(
71
74
  BaseAudioContextHostObject::~BaseAudioContextHostObject() = default;
72
75
 
73
76
  JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, destination) {
74
- auto destination = std::make_shared<AudioDestinationNodeHostObject>(context_->getDestination());
75
- return jsi::Object::createFromHostObject(runtime, destination);
77
+ return jsi::Object::createFromHostObject(runtime, destination_);
76
78
  }
77
79
 
78
80
  JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, state) {
79
- return jsi::String::createFromUtf8(runtime, context_->getState());
81
+ return jsi::String::createFromUtf8(runtime, js_enum_parser::contextStateToString(context_->getState()));
80
82
  }
81
83
 
82
84
  JSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, sampleRate) {
@@ -169,8 +171,8 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createRecorderAdapter) {
169
171
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createOscillator) {
170
172
  const auto options = args[0].asObject(runtime);
171
173
  const auto oscillatorOptions = audioapi::option_parser::parseOscillatorOptions(runtime, options);
172
- auto oscillator = context_->createOscillator(oscillatorOptions);
173
- auto oscillatorHostObject = std::make_shared<OscillatorNodeHostObject>(oscillator);
174
+ auto oscillatorHostObject =
175
+ std::make_shared<OscillatorNodeHostObject>(context_, oscillatorOptions);
174
176
  return jsi::Object::createFromHostObject(runtime, oscillatorHostObject);
175
177
  }
176
178
 
@@ -181,8 +183,7 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStreamer) {
181
183
  const auto options = args[0].asObject(runtime);
182
184
  streamerOptions = audioapi::option_parser::parseStreamerOptions(runtime, options);
183
185
  }
184
- auto streamer = context_->createStreamer(streamerOptions);
185
- auto streamerHostObject = std::make_shared<StreamerNodeHostObject>(streamer);
186
+ auto streamerHostObject = std::make_shared<StreamerNodeHostObject>(context_, streamerOptions);
186
187
  auto object = jsi::Object::createFromHostObject(runtime, streamerHostObject);
187
188
  object.setExternalMemoryPressure(runtime, StreamerNodeHostObject::getSizeInBytes());
188
189
  return object;
@@ -195,24 +196,22 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConstantSource) {
195
196
  const auto options = args[0].asObject(runtime);
196
197
  const auto constantSourceOptions =
197
198
  audioapi::option_parser::parseConstantSourceOptions(runtime, options);
198
- auto constantSource = context_->createConstantSource(constantSourceOptions);
199
- auto constantSourceHostObject = std::make_shared<ConstantSourceNodeHostObject>(constantSource);
199
+ auto constantSourceHostObject =
200
+ std::make_shared<ConstantSourceNodeHostObject>(context_, constantSourceOptions);
200
201
  return jsi::Object::createFromHostObject(runtime, constantSourceHostObject);
201
202
  }
202
203
 
203
204
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createGain) {
204
205
  const auto options = args[0].asObject(runtime);
205
206
  const auto gainOptions = audioapi::option_parser::parseGainOptions(runtime, options);
206
- auto gain = context_->createGain(std::move(gainOptions));
207
- auto gainHostObject = std::make_shared<GainNodeHostObject>(gain);
207
+ auto gainHostObject = std::make_shared<GainNodeHostObject>(context_, gainOptions);
208
208
  return jsi::Object::createFromHostObject(runtime, gainHostObject);
209
209
  }
210
210
 
211
211
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createDelay) {
212
212
  const auto options = args[0].asObject(runtime);
213
213
  const auto delayOptions = audioapi::option_parser::parseDelayOptions(runtime, options);
214
- auto delayNode = context_->createDelay(delayOptions);
215
- auto delayNodeHostObject = std::make_shared<DelayNodeHostObject>(delayNode);
214
+ auto delayNodeHostObject = std::make_shared<DelayNodeHostObject>(context_, delayOptions);
216
215
  auto jsiObject = jsi::Object::createFromHostObject(runtime, delayNodeHostObject);
217
216
  jsiObject.setExternalMemoryPressure(runtime, delayNodeHostObject->getSizeInBytes());
218
217
  return jsiObject;
@@ -220,25 +219,26 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createDelay) {
220
219
 
221
220
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStereoPanner) {
222
221
  const auto options = args[0].asObject(runtime);
223
- const auto stereoPannerOptions = audioapi::option_parser::parseStereoPannerOptions(runtime, options);
224
- auto stereoPanner = context_->createStereoPanner(stereoPannerOptions);
225
- auto stereoPannerHostObject = std::make_shared<StereoPannerNodeHostObject>(stereoPanner);
222
+ const auto stereoPannerOptions =
223
+ audioapi::option_parser::parseStereoPannerOptions(runtime, options);
224
+ auto stereoPannerHostObject =
225
+ std::make_shared<StereoPannerNodeHostObject>(context_, stereoPannerOptions);
226
226
  return jsi::Object::createFromHostObject(runtime, stereoPannerHostObject);
227
227
  }
228
228
 
229
229
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBiquadFilter) {
230
230
  const auto options = args[0].asObject(runtime);
231
- const auto biquadFilterOptions = audioapi::option_parser::parseBiquadFilterOptions(runtime, options);
232
- auto biquadFilter = context_->createBiquadFilter(biquadFilterOptions);
233
- auto biquadFilterHostObject = std::make_shared<BiquadFilterNodeHostObject>(biquadFilter);
231
+ const auto biquadFilterOptions =
232
+ audioapi::option_parser::parseBiquadFilterOptions(runtime, options);
233
+ auto biquadFilterHostObject =
234
+ std::make_shared<BiquadFilterNodeHostObject>(context_, biquadFilterOptions);
234
235
  return jsi::Object::createFromHostObject(runtime, biquadFilterHostObject);
235
236
  }
236
237
 
237
238
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createIIRFilter) {
238
239
  const auto options = args[0].asObject(runtime);
239
240
  const auto iirFilterOptions = audioapi::option_parser::parseIIRFilterOptions(runtime, options);
240
- auto iirFilter = context_->createIIRFilter(iirFilterOptions);
241
- auto iirFilterHostObject = std::make_shared<IIRFilterNodeHostObject>(iirFilter);
241
+ auto iirFilterHostObject = std::make_shared<IIRFilterNodeHostObject>(context_, iirFilterOptions);
242
242
  return jsi::Object::createFromHostObject(runtime, iirFilterHostObject);
243
243
  }
244
244
 
@@ -246,8 +246,8 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBufferSource) {
246
246
  const auto options = args[0].asObject(runtime);
247
247
  const auto audioBufferSourceOptions =
248
248
  audioapi::option_parser::parseAudioBufferSourceOptions(runtime, options);
249
- auto bufferSource = context_->createBufferSource(audioBufferSourceOptions);
250
- auto bufferSourceHostObject = std::make_shared<AudioBufferSourceNodeHostObject>(bufferSource);
249
+ auto bufferSourceHostObject =
250
+ std::make_shared<AudioBufferSourceNodeHostObject>(context_, audioBufferSourceOptions);
251
251
  return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);
252
252
  }
253
253
 
@@ -255,15 +255,15 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBufferQueueSource) {
255
255
  const auto options = args[0].asObject(runtime);
256
256
  const auto baseAudioBufferSourceOptions =
257
257
  audioapi::option_parser::parseBaseAudioBufferSourceOptions(runtime, options);
258
- auto bufferSource = context_->createBufferQueueSource(baseAudioBufferSourceOptions);
259
- auto bufferStreamSourceHostObject =
260
- std::make_shared<AudioBufferQueueSourceNodeHostObject>(bufferSource);
258
+ auto bufferStreamSourceHostObject = std::make_shared<AudioBufferQueueSourceNodeHostObject>(
259
+ context_, baseAudioBufferSourceOptions);
261
260
  return jsi::Object::createFromHostObject(runtime, bufferStreamSourceHostObject);
262
261
  }
263
262
 
264
263
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBuffer) {
265
264
  const auto options = args[0].asObject(runtime);
266
- const auto audioBufferOptions = audioapi::option_parser::parseAudioBufferOptions(runtime, options);
265
+ const auto audioBufferOptions =
266
+ audioapi::option_parser::parseAudioBufferOptions(runtime, options);
267
267
  auto buffer = BaseAudioContext::createBuffer(audioBufferOptions);
268
268
  auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
269
269
 
@@ -300,19 +300,19 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createPeriodicWave) {
300
300
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createAnalyser) {
301
301
  const auto options = args[0].asObject(runtime);
302
302
  const auto analyserOptions = audioapi::option_parser::parseAnalyserOptions(runtime, options);
303
- auto analyser = context_->createAnalyser(analyserOptions);
304
- auto analyserHostObject = std::make_shared<AnalyserNodeHostObject>(analyser);
303
+ auto analyserHostObject = std::make_shared<AnalyserNodeHostObject>(context_, analyserOptions);
305
304
  return jsi::Object::createFromHostObject(runtime, analyserHostObject);
306
305
  }
307
306
 
308
307
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConvolver) {
309
308
  const auto options = args[0].asObject(runtime);
310
309
  const auto convolverOptions = audioapi::option_parser::parseConvolverOptions(runtime, options);
311
- auto convolver = context_->createConvolver(convolverOptions);
312
- auto convolverHostObject = std::make_shared<ConvolverNodeHostObject>(convolver);
310
+ auto convolverHostObject = std::make_shared<ConvolverNodeHostObject>(context_, convolverOptions);
313
311
  auto jsiObject = jsi::Object::createFromHostObject(runtime, convolverHostObject);
314
312
  if (convolverOptions.bus != nullptr) {
315
- auto bufferHostObject = options.getProperty(runtime, "buffer").getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
313
+ auto bufferHostObject = options.getProperty(runtime, "buffer")
314
+ .getObject(runtime)
315
+ .asHostObject<AudioBufferHostObject>(runtime);
316
316
  jsiObject.setExternalMemoryPressure(runtime, bufferHostObject->getSizeInBytes());
317
317
  }
318
318
  return jsiObject;
@@ -321,8 +321,8 @@ JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConvolver) {
321
321
  JSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWaveShaper) {
322
322
  const auto options = args[0].asObject(runtime);
323
323
  const auto waveShaperOptions = audioapi::option_parser::parseWaveShaperOptions(runtime, options);
324
- auto waveShaper = context_->createWaveShaper(waveShaperOptions);
325
- auto waveShaperHostObject = std::make_shared<WaveShaperNodeHostObject>(waveShaper);
324
+ auto waveShaperHostObject =
325
+ std::make_shared<WaveShaperNodeHostObject>(context_, waveShaperOptions);
326
326
  return jsi::Object::createFromHostObject(runtime, waveShaperHostObject);
327
327
  }
328
328
  } // namespace audioapi
@@ -13,6 +13,7 @@ namespace audioapi {
13
13
  using namespace facebook;
14
14
 
15
15
  class BaseAudioContext;
16
+ class AudioDestinationNodeHostObject;
16
17
 
17
18
  class BaseAudioContextHostObject : public JsiHostObject {
18
19
  public:
@@ -48,10 +49,11 @@ class BaseAudioContextHostObject : public JsiHostObject {
48
49
  JSI_HOST_FUNCTION_DECL(createWaveShaper);
49
50
  JSI_HOST_FUNCTION_DECL(createDelay);
50
51
 
51
- std::shared_ptr<BaseAudioContext> context_;
52
-
53
52
  protected:
53
+ std::shared_ptr<BaseAudioContext> context_;
54
54
  std::shared_ptr<PromiseVendor> promiseVendor_;
55
55
  std::shared_ptr<react::CallInvoker> callInvoker_;
56
+
57
+ std::shared_ptr<AudioDestinationNodeHostObject> destination_;
56
58
  };
57
59
  } // namespace audioapi