react-native-audio-api 0.12.0-nightly-6a44b58-20260126 → 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 (142) hide show
  1. package/RNAudioAPI.podspec +8 -0
  2. package/android/src/main/cpp/audioapi/CMakeLists.txt +0 -13
  3. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +3 -2
  4. package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -1
  5. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +12 -1
  6. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +5 -1
  7. package/android/src/main/java/com/swmansion/audioapi/system/AudioEvent.kt +28 -0
  8. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +4 -4
  9. package/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt +1 -1
  10. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +27 -18
  11. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +13 -8
  12. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +3 -2
  13. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +2 -2
  14. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +9 -12
  15. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +4 -2
  16. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +5 -1
  17. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +38 -38
  18. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -2
  19. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +8 -4
  20. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +7 -1
  21. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +6 -4
  22. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +6 -2
  23. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +8 -5
  24. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +5 -3
  25. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +5 -3
  26. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +5 -2
  27. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +4 -3
  28. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +5 -2
  29. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +6 -2
  30. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +5 -2
  31. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +6 -2
  32. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +5 -2
  33. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +5 -2
  34. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +5 -2
  35. package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.cpp +9 -4
  36. package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.h +5 -2
  37. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +3 -2
  38. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +2 -1
  39. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +9 -6
  40. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +4 -2
  41. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +5 -2
  42. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +5 -2
  43. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +5 -2
  44. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +5 -2
  45. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +7 -3
  46. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +5 -2
  47. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  48. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -2
  49. package/common/cpp/audioapi/HostObjects/utils/JsEnumParser.cpp +63 -0
  50. package/common/cpp/audioapi/HostObjects/utils/JsEnumParser.h +5 -0
  51. package/common/cpp/audioapi/core/AudioContext.cpp +2 -4
  52. package/common/cpp/audioapi/core/AudioNode.cpp +4 -4
  53. package/common/cpp/audioapi/core/AudioNode.h +6 -6
  54. package/common/cpp/audioapi/core/BaseAudioContext.cpp +7 -22
  55. package/common/cpp/audioapi/core/BaseAudioContext.h +20 -22
  56. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +3 -6
  57. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +5 -2
  58. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +4 -2
  59. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
  60. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
  61. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +6 -6
  62. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +2 -2
  63. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +1 -1
  64. package/common/cpp/audioapi/core/effects/ConvolverNode.h +2 -2
  65. package/common/cpp/audioapi/core/effects/DelayNode.cpp +1 -1
  66. package/common/cpp/audioapi/core/effects/DelayNode.h +2 -2
  67. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -1
  68. package/common/cpp/audioapi/core/effects/GainNode.h +2 -2
  69. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +5 -3
  70. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +2 -2
  71. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +5 -2
  72. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +2 -2
  73. package/common/cpp/audioapi/core/effects/WaveShaperNode.cpp +4 -2
  74. package/common/cpp/audioapi/core/effects/WaveShaperNode.h +2 -2
  75. package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -1
  76. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +10 -4
  77. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +2 -2
  78. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +13 -13
  79. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +2 -2
  80. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +6 -5
  81. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +2 -2
  82. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +2 -2
  83. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +10 -2
  84. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +2 -2
  85. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +11 -6
  86. package/common/cpp/audioapi/core/sources/OscillatorNode.h +2 -2
  87. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +17 -4
  88. package/common/cpp/audioapi/core/sources/StreamerNode.h +4 -2
  89. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +2 -3
  90. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +3 -4
  91. package/common/cpp/audioapi/events/AudioEvent.h +30 -0
  92. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +9 -20
  93. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +7 -34
  94. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +5 -4
  95. package/common/cpp/audioapi/jsi/JsiUtils.cpp +21 -0
  96. package/common/cpp/audioapi/jsi/JsiUtils.h +17 -0
  97. package/{android/src/main/cpp/audioapi/android/core → common/cpp/audioapi}/utils/MiniaudioImplementation.cpp +1 -2
  98. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +5 -10
  99. package/ios/audioapi/ios/AudioAPIModule.h +3 -1
  100. package/ios/audioapi/ios/AudioAPIModule.mm +7 -6
  101. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +1 -3
  102. package/ios/audioapi/ios/system/AudioSessionManager.h +3 -1
  103. package/ios/audioapi/ios/system/AudioSessionManager.mm +8 -1
  104. package/ios/audioapi/ios/system/SystemNotificationManager.mm +17 -8
  105. package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +36 -33
  106. package/lib/commonjs/core/AudioDecoder.js +2 -2
  107. package/lib/commonjs/core/AudioDecoder.js.map +1 -1
  108. package/lib/commonjs/core/AudioRecorder.js +1 -1
  109. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  110. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  111. package/lib/commonjs/specs/NativeAudioAPIModule.web.js.map +1 -1
  112. package/lib/commonjs/system/AudioManager.js +1 -1
  113. package/lib/commonjs/system/AudioManager.js.map +1 -1
  114. package/lib/module/core/AudioDecoder.js +2 -2
  115. package/lib/module/core/AudioDecoder.js.map +1 -1
  116. package/lib/module/core/AudioRecorder.js +1 -1
  117. package/lib/module/core/AudioRecorder.js.map +1 -1
  118. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  119. package/lib/module/specs/NativeAudioAPIModule.web.js.map +1 -1
  120. package/lib/module/system/AudioManager.js +1 -1
  121. package/lib/module/system/AudioManager.js.map +1 -1
  122. package/lib/typescript/core/AudioDecoder.d.ts.map +1 -1
  123. package/lib/typescript/events/types.d.ts +1 -17
  124. package/lib/typescript/events/types.d.ts.map +1 -1
  125. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -1
  126. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  127. package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts +1 -1
  128. package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts.map +1 -1
  129. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  130. package/lib/typescript/system/notification/types.d.ts +4 -3
  131. package/lib/typescript/system/notification/types.d.ts.map +1 -1
  132. package/lib/typescript/system/types.d.ts +8 -0
  133. package/lib/typescript/system/types.d.ts.map +1 -1
  134. package/package.json +1 -1
  135. package/src/core/AudioDecoder.ts +2 -2
  136. package/src/core/AudioRecorder.ts +1 -1
  137. package/src/events/types.ts +1 -18
  138. package/src/specs/NativeAudioAPIModule.ts +3 -2
  139. package/src/specs/NativeAudioAPIModule.web.ts +2 -1
  140. package/src/system/AudioManager.ts +2 -1
  141. package/src/system/notification/types.ts +6 -4
  142. package/src/system/types.ts +8 -0
@@ -46,6 +46,14 @@ Pod::Spec.new do |s|
46
46
  sss.header_mappings_dir = "common/cpp/audioapi/dsp"
47
47
  sss.compiler_flags = "-O3"
48
48
  end
49
+
50
+ # compile miniaudio implementation file as objective-c++
51
+ ss.subspec "miniaudio_impl" do |sss|
52
+ sss.source_files = "common/cpp/audioapi/utils/MiniaudioImplementation.cpp"
53
+ sss.header_dir = "audioapi/libs"
54
+ sss.header_mappings_dir = "common/cpp/audioapi/libs"
55
+ sss.compiler_flags = "-x objective-c++"
56
+ end
49
57
  end
50
58
 
51
59
  if worklets_enabled
@@ -99,19 +99,6 @@ target_include_directories(
99
99
  ${INCLUDE_LIBRARIES}
100
100
  )
101
101
 
102
- if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
103
- set(RN_VERSION_LINK_LIBRARIES
104
- ReactAndroid::reactnative
105
- )
106
- else()
107
- set(RN_VERSION_LINK_LIBRARIES
108
- ReactAndroid::folly_runtime
109
- ReactAndroid::react_nativemodule_core
110
- ReactAndroid::glog
111
- ReactAndroid::reactnativejni
112
- )
113
- endif()
114
-
115
102
  set(RN_VERSION_LINK_LIBRARIES
116
103
  ReactAndroid::reactnative
117
104
  )
@@ -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;
@@ -19,6 +19,8 @@
19
19
 
20
20
  #include <memory>
21
21
  #include <string>
22
+ #include <unordered_map>
23
+ #include <utility>
22
24
 
23
25
  namespace audioapi {
24
26
 
@@ -420,7 +422,16 @@ void AndroidAudioRecorder::onErrorAfterClose(oboe::AudioStream *stream, oboe::Re
420
422
  auto streamResult = openAudioStream();
421
423
 
422
424
  if (!streamResult.is_ok()) {
423
- // TODO: call error callback
425
+ uint64_t callbackId = errorCallbackId_.load(std::memory_order_acquire);
426
+
427
+ if (audioEventHandlerRegistry_ == nullptr || callbackId == 0) {
428
+ return;
429
+ }
430
+
431
+ std::string message = "Android recorder error: " + streamResult.unwrap_err();
432
+ std::unordered_map<std::string, EventValue> eventPayload{{"message", std::move(message)}};
433
+ audioEventHandlerRegistry_->invokeHandlerWithEventBody(
434
+ AudioEvent::RECORDER_ERROR, callbackId, eventPayload);
424
435
  return;
425
436
  }
426
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