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.
- package/RNAudioAPI.podspec +8 -0
- package/android/src/main/cpp/audioapi/CMakeLists.txt +0 -13
- 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 +12 -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/inputs/AudioRecorderHostObject.cpp +2 -1
- 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 +4 -4
- 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 +2 -3
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +3 -4
- 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/audioapi/jsi/JsiUtils.cpp +21 -0
- package/common/cpp/audioapi/jsi/JsiUtils.h +17 -0
- package/{android/src/main/cpp/audioapi/android/core → common/cpp/audioapi}/utils/MiniaudioImplementation.cpp +1 -2
- 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/core/utils/AudioDecoder.mm +1 -3
- 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/core/AudioRecorder.js +1 -1
- package/lib/commonjs/core/AudioRecorder.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/core/AudioRecorder.js +1 -1
- package/lib/module/core/AudioRecorder.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/core/AudioRecorder.ts +1 -1
- 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
package/RNAudioAPI.podspec
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|