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.
- package/android/src/main/cpp/audioapi/CMakeLists.txt +0 -6
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +3 -2
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -1
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +1 -1
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +5 -1
- package/android/src/main/java/com/swmansion/audioapi/system/AudioEvent.kt +28 -0
- package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +4 -4
- package/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt +1 -1
- package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +27 -18
- package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +13 -8
- package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +3 -2
- package/android/src/oldarch/NativeAudioAPIModuleSpec.java +2 -2
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +9 -12
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +4 -2
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +5 -1
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +38 -38
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -2
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +8 -4
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +7 -1
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +6 -4
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +6 -2
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +8 -5
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +5 -3
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +5 -3
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +4 -3
- package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +6 -2
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +6 -2
- package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +5 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.cpp +9 -4
- package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +3 -2
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +9 -6
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +4 -2
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +5 -2
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +5 -2
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +7 -3
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -2
- package/common/cpp/audioapi/HostObjects/utils/JsEnumParser.cpp +63 -0
- package/common/cpp/audioapi/HostObjects/utils/JsEnumParser.h +5 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +2 -4
- package/common/cpp/audioapi/core/AudioNode.cpp +2 -2
- package/common/cpp/audioapi/core/AudioNode.h +6 -6
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +7 -22
- package/common/cpp/audioapi/core/BaseAudioContext.h +20 -22
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +3 -6
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +5 -2
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +4 -2
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -1
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +6 -6
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +2 -2
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +1 -1
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +2 -2
- package/common/cpp/audioapi/core/effects/DelayNode.cpp +1 -1
- package/common/cpp/audioapi/core/effects/DelayNode.h +2 -2
- package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -1
- package/common/cpp/audioapi/core/effects/GainNode.h +2 -2
- package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +5 -3
- package/common/cpp/audioapi/core/effects/IIRFilterNode.h +2 -2
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +5 -2
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +2 -2
- package/common/cpp/audioapi/core/effects/WaveShaperNode.cpp +4 -2
- package/common/cpp/audioapi/core/effects/WaveShaperNode.h +2 -2
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +10 -4
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +2 -2
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +13 -13
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +2 -2
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +6 -5
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +2 -2
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +2 -2
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +10 -2
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +2 -2
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +11 -6
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +2 -2
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +17 -4
- package/common/cpp/audioapi/core/sources/StreamerNode.h +4 -2
- package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +1 -1
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +2 -2
- package/common/cpp/audioapi/events/AudioEvent.h +30 -0
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +9 -20
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +7 -34
- package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +5 -4
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +5 -10
- package/ios/audioapi/ios/AudioAPIModule.h +3 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +7 -6
- package/ios/audioapi/ios/system/AudioSessionManager.h +3 -1
- package/ios/audioapi/ios/system/AudioSessionManager.mm +8 -1
- package/ios/audioapi/ios/system/SystemNotificationManager.mm +17 -8
- package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +36 -33
- package/lib/commonjs/core/AudioDecoder.js +2 -2
- package/lib/commonjs/core/AudioDecoder.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.web.js.map +1 -1
- package/lib/commonjs/system/AudioManager.js +1 -1
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/module/core/AudioDecoder.js +2 -2
- package/lib/module/core/AudioDecoder.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.web.js.map +1 -1
- package/lib/module/system/AudioManager.js +1 -1
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/typescript/core/AudioDecoder.d.ts.map +1 -1
- package/lib/typescript/events/types.d.ts +1 -17
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/system/notification/types.d.ts +4 -3
- package/lib/typescript/system/notification/types.d.ts.map +1 -1
- package/lib/typescript/system/types.d.ts +8 -0
- package/lib/typescript/system/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/AudioDecoder.ts +2 -2
- package/src/events/types.ts +1 -18
- package/src/specs/NativeAudioAPIModule.ts +3 -2
- package/src/specs/NativeAudioAPIModule.web.ts +2 -1
- package/src/system/AudioManager.ts +2 -1
- package/src/system/notification/types.ts +6 -4
- 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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
48
|
+
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.INTERRUPTION.ordinal, body)
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
|
|
52
|
-
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(
|
|
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(
|
|
24
|
+
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.VOLUME_CHANGE.ordinal, body)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
fun getIntentFilter(): IntentFilter {
|
package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt
CHANGED
|
@@ -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(
|
|
82
|
+
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_PLAY.ordinal, mapOf())
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
override fun onPause() {
|
|
85
|
-
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(
|
|
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(
|
|
94
|
+
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_NEXT_TRACK.ordinal, mapOf())
|
|
90
95
|
}
|
|
91
96
|
|
|
92
97
|
override fun onSkipToPrevious() {
|
|
93
|
-
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(
|
|
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(
|
|
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(
|
|
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(
|
|
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"
|
|
296
|
-
"pause"
|
|
297
|
-
"stop"
|
|
298
|
-
"
|
|
299
|
-
"
|
|
300
|
-
"
|
|
301
|
-
"
|
|
302
|
-
"
|
|
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("
|
|
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("
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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),
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
173
|
-
|
|
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
|
|
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
|
|
199
|
-
|
|
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
|
|
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
|
|
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 =
|
|
224
|
-
|
|
225
|
-
auto stereoPannerHostObject =
|
|
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 =
|
|
232
|
-
|
|
233
|
-
auto biquadFilterHostObject =
|
|
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
|
|
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
|
|
250
|
-
|
|
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
|
|
259
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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")
|
|
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
|
|
325
|
-
|
|
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
|