react-native-audio-api 0.10.0-nightly-75aa9d0-20251022 → 0.10.0-nightly-353aaa2-20251023
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 +9 -5
- package/android/build.gradle +33 -3
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +5 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -0
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +4 -2
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +29 -1
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +20 -0
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +0 -10
- package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
- package/ios/audioapi/ios/AudioAPIModule.h +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +2 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +2 -1
- package/ios/audioapi/ios/system/AudioSessionManager.mm +9 -0
- package/lib/commonjs/core/AudioContext.js +1 -1
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +16 -25
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/utils/index.js +19 -4
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/module/core/AudioContext.js +2 -2
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +17 -26
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/OfflineAudioContext.js +2 -2
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/utils/index.js +15 -1
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +4 -1
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/scripts/download-prebuilt-binaries.sh +52 -0
- package/src/core/AudioContext.ts +3 -2
- package/src/core/BaseAudioContext.ts +44 -60
- package/src/core/OfflineAudioContext.ts +2 -2
- package/src/utils/index.ts +22 -1
- package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libogg.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libopus.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libssl.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libogg.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libopus.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libssl.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libogg.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libopus.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libssl.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libogg.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libopus.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libssl.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/x86/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/x86/libogg.a +0 -0
- package/common/cpp/audioapi/external/x86/libopus.a +0 -0
- package/common/cpp/audioapi/external/x86/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/x86/libssl.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libogg.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libopus.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libssl.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -26
- package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
- package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -381
package/RNAudioAPI.podspec
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require "json"
|
|
2
|
+
require_relative './scripts/rnaa_utils'
|
|
2
3
|
|
|
3
4
|
package_json = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
5
|
|
|
@@ -8,6 +9,8 @@ folly_flags = "-DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-
|
|
|
8
9
|
fabric_flags = $new_arch_enabled ? '-DRCT_NEW_ARCH_ENABLED' : ''
|
|
9
10
|
version_flag = "-DAUDIOAPI_VERSION=#{package_json['version']}"
|
|
10
11
|
|
|
12
|
+
worklets_preprocessor_flag = check_if_worklets_enabled() ? '-DRN_AUDIO_API_ENABLE_WORKLETS=1' : ''
|
|
13
|
+
|
|
11
14
|
Pod::Spec.new do |s|
|
|
12
15
|
s.name = "RNAudioAPI"
|
|
13
16
|
s.version = package_json["version"]
|
|
@@ -35,9 +38,10 @@ Pod::Spec.new do |s|
|
|
|
35
38
|
|
|
36
39
|
s.compiler_flags = "#{folly_flags}"
|
|
37
40
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
s.prepare_command = <<-CMD
|
|
42
|
+
chmod +x scripts/download-prebuilt-binaries.sh
|
|
43
|
+
scripts/download-prebuilt-binaries.sh ios
|
|
44
|
+
CMD
|
|
41
45
|
|
|
42
46
|
# Assumes Pods dir is nested under ios project dir
|
|
43
47
|
ios_dir = File.join(Pod::Config.instance.project_pods_root, '..')
|
|
@@ -68,8 +72,8 @@ s.pod_target_xcconfig = {
|
|
|
68
72
|
$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include/vorbis
|
|
69
73
|
$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/ffmpeg_include
|
|
70
74
|
].join(" "),
|
|
71
|
-
'OTHER_CFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}",
|
|
72
|
-
'OTHER_CPLUSPLUSFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}"
|
|
75
|
+
'OTHER_CFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag} #{worklets_preprocessor_flag}",
|
|
76
|
+
'OTHER_CPLUSPLUSFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag} #{worklets_preprocessor_flag}",
|
|
73
77
|
}
|
|
74
78
|
|
|
75
79
|
s.user_target_xcconfig = {
|
package/android/build.gradle
CHANGED
|
@@ -74,6 +74,30 @@ def resolveReactNativeWorkletsDirectory() {
|
|
|
74
74
|
return null;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
def validateWorkletsVersion() {
|
|
78
|
+
def validationScript = file("${projectDir}/../scripts/validate-worklets-version.js")
|
|
79
|
+
if (!validationScript.exists()) {
|
|
80
|
+
logger.error("[AudioAPI] Worklets validation script not found at ${validationScript.absolutePath}")
|
|
81
|
+
return false
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
def process = ["node", validationScript.absolutePath].execute()
|
|
86
|
+
process.waitForProcessOutput(System.out, System.err)
|
|
87
|
+
def exitCode = process.exitValue()
|
|
88
|
+
|
|
89
|
+
if (exitCode == 0) {
|
|
90
|
+
return true
|
|
91
|
+
} else {
|
|
92
|
+
logger.warn("[AudioAPI] Worklets version validation failed")
|
|
93
|
+
return false
|
|
94
|
+
}
|
|
95
|
+
} catch (Exception e) {
|
|
96
|
+
logger.error("[AudioAPI] Failed to validate worklets version: ${e.message}")
|
|
97
|
+
return false
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
77
101
|
def toPlatformFileString(String path) {
|
|
78
102
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
|
79
103
|
path = path.replace(File.separatorChar, '/' as char)
|
|
@@ -92,7 +116,7 @@ static def supportsNamespace() {
|
|
|
92
116
|
|
|
93
117
|
def reactNativeRootDir = resolveReactNativeDirectory()
|
|
94
118
|
def reactNativeWorkletsRootDir = resolveReactNativeWorkletsDirectory()
|
|
95
|
-
def isWorkletsAvailable = reactNativeWorkletsRootDir != null
|
|
119
|
+
def isWorkletsAvailable = reactNativeWorkletsRootDir != null && validateWorkletsVersion()
|
|
96
120
|
|
|
97
121
|
def reactProperties = new Properties()
|
|
98
122
|
file("$reactNativeRootDir/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
|
|
@@ -123,7 +147,7 @@ android {
|
|
|
123
147
|
defaultConfig {
|
|
124
148
|
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
|
|
125
149
|
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
|
|
126
|
-
|
|
150
|
+
|
|
127
151
|
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
128
152
|
buildConfigField "boolean", "RN_AUDIO_API_ENABLE_WORKLETS", "${isWorkletsAvailable}"
|
|
129
153
|
|
|
@@ -277,10 +301,16 @@ def assertMinimalReactNativeVersion = task assertMinimalReactNativeVersionTask {
|
|
|
277
301
|
}
|
|
278
302
|
}
|
|
279
303
|
|
|
304
|
+
task downloadPrebuiltBinaries(type: Exec) {
|
|
305
|
+
commandLine 'chmod', '+x', '../scripts/download-prebuilt-binaries.sh'
|
|
306
|
+
commandLine 'bash', '../scripts/download-prebuilt-binaries.sh'
|
|
307
|
+
args 'android'
|
|
308
|
+
}
|
|
309
|
+
|
|
280
310
|
// Make preBuild depend on the download task
|
|
281
311
|
tasks.preBuild {
|
|
282
312
|
dependsOn assertMinimalReactNativeVersion
|
|
283
|
-
|
|
313
|
+
dependsOn downloadPrebuiltBinaries
|
|
284
314
|
}
|
|
285
315
|
|
|
286
316
|
task cleanCmakeCache() {
|
|
@@ -51,6 +51,7 @@ void AudioAPIModule::registerNatives() {
|
|
|
51
51
|
makeNativeMethod(
|
|
52
52
|
"invokeHandlerWithEventNameAndEventBody",
|
|
53
53
|
AudioAPIModule::invokeHandlerWithEventNameAndEventBody),
|
|
54
|
+
makeNativeMethod("closeAllContexts", AudioAPIModule::closeAllContexts),
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
|
|
@@ -101,4 +102,8 @@ void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
|
|
|
101
102
|
eventName->toStdString(), body);
|
|
102
103
|
}
|
|
103
104
|
}
|
|
105
|
+
|
|
106
|
+
void AudioAPIModule::closeAllContexts() {
|
|
107
|
+
AudioAPIModuleInstaller::closeAllContexts();
|
|
108
|
+
}
|
|
104
109
|
} // namespace audioapi
|
|
@@ -34,6 +34,7 @@ class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
|
|
|
34
34
|
|
|
35
35
|
void injectJSIBindings();
|
|
36
36
|
void invokeHandlerWithEventNameAndEventBody(jni::alias_ref<jni::JString> eventName, jni::alias_ref<jni::JMap<jstring, jobject>> eventBody);
|
|
37
|
+
void closeAllContexts();
|
|
37
38
|
|
|
38
39
|
private:
|
|
39
40
|
friend HybridBase;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
#include <audioapi/core/utils/Constants.h>
|
|
5
5
|
#include <audioapi/utils/AudioArray.h>
|
|
6
6
|
#include <audioapi/utils/AudioBus.h>
|
|
7
|
+
#include <jni.h>
|
|
7
8
|
|
|
8
9
|
namespace audioapi {
|
|
9
10
|
|
|
@@ -49,7 +50,8 @@ bool AudioPlayer::openAudioStream() {
|
|
|
49
50
|
|
|
50
51
|
bool AudioPlayer::start() {
|
|
51
52
|
if (mStream_) {
|
|
52
|
-
|
|
53
|
+
jni::ThreadScope::WithClassLoader(
|
|
54
|
+
[this]() { nativeAudioPlayer_->start(); });
|
|
53
55
|
auto result = mStream_->requestStart();
|
|
54
56
|
return result == oboe::Result::OK;
|
|
55
57
|
}
|
|
@@ -59,7 +61,7 @@ bool AudioPlayer::start() {
|
|
|
59
61
|
|
|
60
62
|
void AudioPlayer::stop() {
|
|
61
63
|
if (mStream_) {
|
|
62
|
-
nativeAudioPlayer_->stop();
|
|
64
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->stop(); });
|
|
63
65
|
mStream_->requestStop();
|
|
64
66
|
}
|
|
65
67
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
package com.swmansion.audioapi
|
|
2
2
|
|
|
3
3
|
import com.facebook.jni.HybridData
|
|
4
|
+
import com.facebook.react.bridge.LifecycleEventListener
|
|
5
|
+
import com.facebook.react.bridge.NativeModule
|
|
4
6
|
import com.facebook.react.bridge.Promise
|
|
5
7
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
8
|
import com.facebook.react.bridge.ReadableArray
|
|
@@ -16,7 +18,8 @@ import java.lang.ref.WeakReference
|
|
|
16
18
|
@ReactModule(name = AudioAPIModule.NAME)
|
|
17
19
|
class AudioAPIModule(
|
|
18
20
|
reactContext: ReactApplicationContext,
|
|
19
|
-
) : NativeAudioAPIModuleSpec(reactContext)
|
|
21
|
+
) : NativeAudioAPIModuleSpec(reactContext),
|
|
22
|
+
LifecycleEventListener {
|
|
20
23
|
companion object {
|
|
21
24
|
const val NAME = NativeAudioAPIModuleSpec.NAME
|
|
22
25
|
}
|
|
@@ -24,6 +27,7 @@ class AudioAPIModule(
|
|
|
24
27
|
val reactContext: WeakReference<ReactApplicationContext> = WeakReference(reactContext)
|
|
25
28
|
|
|
26
29
|
private val mHybridData: HybridData
|
|
30
|
+
private var reanimatedModule: NativeModule? = null
|
|
27
31
|
|
|
28
32
|
external fun initHybrid(
|
|
29
33
|
workletsModule: Any?,
|
|
@@ -38,6 +42,8 @@ class AudioAPIModule(
|
|
|
38
42
|
eventBody: Map<String, Any>,
|
|
39
43
|
)
|
|
40
44
|
|
|
45
|
+
private external fun closeAllContexts()
|
|
46
|
+
|
|
41
47
|
init {
|
|
42
48
|
try {
|
|
43
49
|
System.loadLibrary("react-native-audio-api")
|
|
@@ -47,6 +53,8 @@ class AudioAPIModule(
|
|
|
47
53
|
if (BuildConfig.RN_AUDIO_API_ENABLE_WORKLETS) {
|
|
48
54
|
try {
|
|
49
55
|
workletsModule = reactContext.getNativeModule("WorkletsModule")
|
|
56
|
+
reanimatedModule = reactContext.getNativeModule("ReanimatedModule")
|
|
57
|
+
reanimatedModule
|
|
50
58
|
} catch (ex: Exception) {
|
|
51
59
|
throw RuntimeException("WorkletsModule not found - make sure react-native-worklets is properly installed")
|
|
52
60
|
}
|
|
@@ -64,6 +72,26 @@ class AudioAPIModule(
|
|
|
64
72
|
return true
|
|
65
73
|
}
|
|
66
74
|
|
|
75
|
+
override fun onHostResume() {
|
|
76
|
+
// do nothing
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
override fun onHostPause() {
|
|
80
|
+
closeAllContexts()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
override fun onHostDestroy() {
|
|
84
|
+
// do nothing
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
override fun initialize() {
|
|
88
|
+
reactContext.get()?.addLifecycleEventListener(this)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
override fun invalidate() {
|
|
92
|
+
// think about cleaning up resources, singletons etc.
|
|
93
|
+
}
|
|
94
|
+
|
|
67
95
|
override fun getDevicePreferredSampleRate(): Double = MediaSessionManager.getDevicePreferredSampleRate()
|
|
68
96
|
|
|
69
97
|
override fun setAudioSessionActivity(
|
|
@@ -16,12 +16,16 @@
|
|
|
16
16
|
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
17
17
|
|
|
18
18
|
#include <memory>
|
|
19
|
+
#include <vector>
|
|
19
20
|
|
|
20
21
|
namespace audioapi {
|
|
21
22
|
|
|
22
23
|
using namespace facebook;
|
|
23
24
|
|
|
24
25
|
class AudioAPIModuleInstaller {
|
|
26
|
+
private:
|
|
27
|
+
inline static std::vector<std::weak_ptr<AudioContext>> contexts_ = {};
|
|
28
|
+
|
|
25
29
|
public:
|
|
26
30
|
static void injectJSIBindings(
|
|
27
31
|
jsi::Runtime *jsiRuntime,
|
|
@@ -61,6 +65,19 @@ class AudioAPIModuleInstaller {
|
|
|
61
65
|
*jsiRuntime, audioEventHandlerRegistryHostObject));
|
|
62
66
|
}
|
|
63
67
|
|
|
68
|
+
static void closeAllContexts() {
|
|
69
|
+
for (auto it = contexts_.begin(); it != contexts_.end(); ++it) {
|
|
70
|
+
auto weakContext = *it;
|
|
71
|
+
|
|
72
|
+
if (auto context = weakContext.lock()) {
|
|
73
|
+
context->close();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
it = contexts_.erase(it);
|
|
77
|
+
--it;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
64
81
|
private:
|
|
65
82
|
static jsi::Function getCreateAudioContextFunction(
|
|
66
83
|
jsi::Runtime *jsiRuntime,
|
|
@@ -95,6 +112,8 @@ class AudioAPIModuleInstaller {
|
|
|
95
112
|
initSuspended,
|
|
96
113
|
audioEventHandlerRegistry,
|
|
97
114
|
runtimeRegistry);
|
|
115
|
+
AudioAPIModuleInstaller::contexts_.push_back(audioContext);
|
|
116
|
+
|
|
98
117
|
auto audioContextHostObject =
|
|
99
118
|
std::make_shared<AudioContextHostObject>(
|
|
100
119
|
audioContext, &runtime, jsCallInvoker);
|
|
@@ -138,6 +157,7 @@ class AudioAPIModuleInstaller {
|
|
|
138
157
|
sampleRate,
|
|
139
158
|
audioEventHandlerRegistry,
|
|
140
159
|
runtimeRegistry);
|
|
160
|
+
|
|
141
161
|
auto audioContextHostObject =
|
|
142
162
|
std::make_shared<OfflineAudioContextHostObject>(
|
|
143
163
|
offlineAudioContext, &runtime, jsCallInvoker);
|
|
@@ -56,7 +56,7 @@ float AudioParam::getValueAtTime(double time) {
|
|
|
56
56
|
void AudioParam::setValueAtTime(float value, double startTime) {
|
|
57
57
|
auto event = [value, startTime](AudioParam ¶m) {
|
|
58
58
|
// Ignore events scheduled before the end of existing automation
|
|
59
|
-
if (startTime
|
|
59
|
+
if (startTime < param.getQueueEndTime()) {
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -87,7 +87,7 @@ void AudioParam::setValueAtTime(float value, double startTime) {
|
|
|
87
87
|
void AudioParam::linearRampToValueAtTime(float value, double endTime) {
|
|
88
88
|
auto event = [value, endTime](AudioParam ¶m) {
|
|
89
89
|
// Ignore events scheduled before the end of existing automation
|
|
90
|
-
if (endTime
|
|
90
|
+
if (endTime < param.getQueueEndTime()) {
|
|
91
91
|
return;
|
|
92
92
|
}
|
|
93
93
|
|
|
@@ -5,16 +5,6 @@
|
|
|
5
5
|
#include <string>
|
|
6
6
|
#include <memory>
|
|
7
7
|
|
|
8
|
-
#ifdef __APPLE__
|
|
9
|
-
/// We cannot make any conditional logic inside podspec but it should automatically compile those files
|
|
10
|
-
/// they should be accessible if someone has react-native-worklets in node_modules
|
|
11
|
-
#if __has_include(<worklets/WorkletRuntime/WorkletRuntime.h>)
|
|
12
|
-
#define RN_AUDIO_API_ENABLE_WORKLETS 1
|
|
13
|
-
#else
|
|
14
|
-
#define RN_AUDIO_API_ENABLE_WORKLETS 0
|
|
15
|
-
#endif
|
|
16
|
-
#endif
|
|
17
|
-
|
|
18
8
|
#ifndef RN_AUDIO_API_TEST
|
|
19
9
|
#define RN_AUDIO_API_TEST 0
|
|
20
10
|
#endif
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## If you would like to relink ffmpeg to your implementation there are two options:
|
|
2
|
+
|
|
3
|
+
### Option A)
|
|
4
|
+
|
|
5
|
+
you can modify script in scripts/download-prebuilt-binaries.sh
|
|
6
|
+
|
|
7
|
+
- ios dynamic frameworks are in `ffmpeg_ios.zip` directory
|
|
8
|
+
- android shared libraries are in `jniLibs.zip`
|
|
9
|
+
|
|
10
|
+
just replace way of downloading them that links to your binaries
|
|
11
|
+
|
|
12
|
+
### Option B)
|
|
13
|
+
|
|
14
|
+
directly modify libraries in source code
|
|
15
|
+
|
|
16
|
+
- ios dynamic frameworks are placed in `common/cpp/audioapi/external`
|
|
17
|
+
- android shared libraries are placed in `android/src/main/jniLibs`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
`USED_LIBRARIES`:
|
|
21
|
+
- libavcodec
|
|
22
|
+
- libavformat
|
|
23
|
+
- libavutil
|
|
24
|
+
- libswresample
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
2
2
|
#import <React/RCTCallInvokerModule.h>
|
|
3
|
+
#import <React/RCTInvalidating.h>
|
|
3
4
|
#import <rnaudioapi/rnaudioapi.h>
|
|
4
5
|
#else // RCT_NEW_ARCH_ENABLED
|
|
5
6
|
#import <React/RCTBridgeModule.h>
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
|
|
15
16
|
@interface AudioAPIModule : RCTEventEmitter
|
|
16
17
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
17
|
-
<NativeAudioAPIModuleSpec, RCTCallInvokerModule>
|
|
18
|
+
<NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>
|
|
18
19
|
#else
|
|
19
20
|
<RCTBridgeModule>
|
|
20
21
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
@@ -18,7 +18,8 @@ class IOSAudioRecorder : public AudioRecorder {
|
|
|
18
18
|
IOSAudioRecorder(
|
|
19
19
|
float sampleRate,
|
|
20
20
|
int bufferLength,
|
|
21
|
-
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
21
|
+
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
22
|
+
&audioEventHandlerRegistry);
|
|
22
23
|
|
|
23
24
|
~IOSAudioRecorder() override;
|
|
24
25
|
|
|
@@ -213,6 +213,15 @@
|
|
|
213
213
|
|
|
214
214
|
- (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
|
|
215
215
|
{
|
|
216
|
+
id value = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSMicrophoneUsageDescription"];
|
|
217
|
+
// if there is no entry NSMicrophoneUsageDescription calling requestRecordPermission will quit an app
|
|
218
|
+
if (value == nil) {
|
|
219
|
+
reject(
|
|
220
|
+
nil,
|
|
221
|
+
@"There is no NSMicrophoneUsageDescription entry in info.plist file. App cannot access microphone without it.",
|
|
222
|
+
nil);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
216
225
|
if (@available(iOS 17, *)) {
|
|
217
226
|
[AVAudioSession.sharedInstance requestRecordPermission:^(BOOL granted) {
|
|
218
227
|
if (granted) {
|
|
@@ -15,7 +15,7 @@ class AudioContext extends _BaseAudioContext.default {
|
|
|
15
15
|
throw new _errors.NotSupportedError(`The provided sampleRate is not supported: ${options.sampleRate}`);
|
|
16
16
|
}
|
|
17
17
|
let audioRuntime = null;
|
|
18
|
-
if (_utils.
|
|
18
|
+
if (_utils.isWorkletsVersionSupported) {
|
|
19
19
|
audioRuntime = _utils.workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
20
20
|
}
|
|
21
21
|
super(global.createAudioContext(options?.sampleRate || _system.default.getDevicePreferredSampleRate(), options?.initSuspended || false, audioRuntime));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","_utils","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","audioRuntime","
|
|
1
|
+
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","_utils","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","audioRuntime","isWorkletsVersionSupported","workletsModule","createWorkletRuntime","global","createAudioContext","AudioManager","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend","exports"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;;;;;AACA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAAsE,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvD,MAAMG,YAAY,SAASC,yBAAgB,CAAC;EACzDC,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIC,yBAAiB,CACzB,6CAA6CF,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IACA,IAAIE,YAAY,GAAG,IAAI;IAEvB,IAAIC,iCAA0B,EAAE;MAC9BD,YAAY,GAAGE,qBAAc,CAACC,oBAAoB,CAAC,qBAAqB,CAAC;IAC3E;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBR,OAAO,EAAEC,UAAU,IAAIQ,eAAY,CAACC,4BAA4B,CAAC,CAAC,EAClEV,OAAO,EAAEW,aAAa,IAAI,KAAK,EAC/BR,YACF,CACF,CAAC;EACH;EAEA,MAAMS,KAAKA,CAAA,EAAkB;IAC3B,OAAQ,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAChD;EAEA,MAAME,MAAMA,CAAA,EAAqB;IAC/B,OAAQ,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EACjD;EAEA,MAAMC,OAAOA,CAAA,EAAqB;IAChC,OAAQ,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EAClD;AACF;AAACC,OAAA,CAAApB,OAAA,GAAAC,YAAA","ignoreList":[]}
|
|
@@ -52,37 +52,28 @@ class BaseAudioContext {
|
|
|
52
52
|
if (bufferLength < 1) {
|
|
53
53
|
throw new _errors.NotSupportedError(`The buffer length provided (${bufferLength}) can not be less than 1`);
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
(0, _utils.assertWorkletsEnabled)();
|
|
56
|
+
const shareableWorklet = _utils.workletsModule.makeShareableCloneRecursive((audioBuffers, channelCount) => {
|
|
57
|
+
'worklet';
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
65
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
59
|
+
const floatAudioData = audioBuffers.map(buffer => new Float32Array(buffer));
|
|
60
|
+
callback(floatAudioData, channelCount);
|
|
61
|
+
});
|
|
62
|
+
return new _WorkletNode.default(this, this.context.createWorkletNode(shareableWorklet, workletRuntime === 'UIRuntime', bufferLength, inputChannelCount));
|
|
66
63
|
}
|
|
67
64
|
createWorkletProcessingNode(callback, workletRuntime = 'AudioRuntime') {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
(0, _utils.assertWorkletsEnabled)();
|
|
66
|
+
const shareableWorklet = _utils.workletsModule.makeShareableCloneRecursive((inputBuffers, outputBuffers, framesToProcess, currentTime) => {
|
|
67
|
+
'worklet';
|
|
71
68
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
79
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
69
|
+
const inputData = inputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
70
|
+
const outputData = outputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
71
|
+
callback(inputData, outputData, framesToProcess, currentTime);
|
|
72
|
+
});
|
|
73
|
+
return new _WorkletProcessingNode.default(this, this.context.createWorkletProcessingNode(shareableWorklet, workletRuntime === 'UIRuntime'));
|
|
80
74
|
}
|
|
81
75
|
createWorkletSourceNode(callback, workletRuntime = 'AudioRuntime') {
|
|
82
|
-
|
|
83
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
84
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
85
|
-
}
|
|
76
|
+
(0, _utils.assertWorkletsEnabled)();
|
|
86
77
|
const shareableWorklet = _utils.workletsModule.makeShareableCloneRecursive((audioBuffers, framesToProcess, currentTime, startOffset) => {
|
|
87
78
|
'worklet';
|
|
88
79
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_errors","require","_utils","_WorkletSourceNode","_interopRequireDefault","_WorkletProcessingNode","_AnalyserNode","_AudioBuffer","_AudioBufferQueueSourceNode","_AudioBufferSourceNode","_AudioDestinationNode","_BiquadFilterNode","_ConstantSourceNode","_GainNode","_OscillatorNode","_PeriodicWave","_RecorderAdapterNode","_StereoPannerNode","_StreamerNode","_WorkletNode","_AudioDecoder","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","decodeAudioData","input","ArrayBuffer","TypeError","decodePCMInBase64","base64String","inputSampleRate","inputChannelCount","isInterleaved","createWorkletNode","callback","bufferLength","workletRuntime","NotSupportedError","
|
|
1
|
+
{"version":3,"names":["_errors","require","_utils","_WorkletSourceNode","_interopRequireDefault","_WorkletProcessingNode","_AnalyserNode","_AudioBuffer","_AudioBufferQueueSourceNode","_AudioBufferSourceNode","_AudioDestinationNode","_BiquadFilterNode","_ConstantSourceNode","_GainNode","_OscillatorNode","_PeriodicWave","_RecorderAdapterNode","_StereoPannerNode","_StreamerNode","_WorkletNode","_AudioDecoder","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","decodeAudioData","input","ArrayBuffer","TypeError","decodePCMInBase64","base64String","inputSampleRate","inputChannelCount","isInterleaved","createWorkletNode","callback","bufferLength","workletRuntime","NotSupportedError","assertWorkletsEnabled","shareableWorklet","workletsModule","makeShareableCloneRecursive","audioBuffers","channelCount","floatAudioData","map","buffer","Float32Array","WorkletNode","createWorkletProcessingNode","inputBuffers","outputBuffers","framesToProcess","inputData","outputData","WorkletProcessingNode","createWorkletSourceNode","startOffset","WorkletSourceNode","createRecorderAdapter","RecorderAdapterNode","createOscillator","OscillatorNode","createStreamer","StreamerNode","createConstantSource","ConstantSourceNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBufferQueueSource","AudioBufferQueueSourceNode","createBuffer","numOfChannels","length","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","exports"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,7 +12,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
12
12
|
class OfflineAudioContext extends _BaseAudioContext.default {
|
|
13
13
|
constructor(arg0, arg1, arg2) {
|
|
14
14
|
let audioRuntime = null;
|
|
15
|
-
if (_utils.
|
|
15
|
+
if (_utils.isWorkletsVersionSupported) {
|
|
16
16
|
audioRuntime = _utils.workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
17
17
|
}
|
|
18
18
|
if (typeof arg0 === 'object') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_errors","_AudioBuffer","_utils","e","__esModule","default","OfflineAudioContext","BaseAudioContext","constructor","arg0","arg1","arg2","audioRuntime","
|
|
1
|
+
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_errors","_AudioBuffer","_utils","e","__esModule","default","OfflineAudioContext","BaseAudioContext","constructor","arg0","arg1","arg2","audioRuntime","isWorkletsVersionSupported","workletsModule","createWorkletRuntime","numberOfChannels","length","sampleRate","global","createOfflineAudioContext","duration","NotSupportedError","isSuspended","isRendering","resume","InvalidStateError","context","suspend","suspendTime","currentTime","startRendering","audioBuffer","AudioBuffer","exports"],"sourceRoot":"../../../src","sources":["core/OfflineAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,18 +3,33 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.assertWorkletsEnabled = assertWorkletsEnabled;
|
|
6
7
|
exports.clamp = clamp;
|
|
7
|
-
exports.workletsModule = exports.
|
|
8
|
+
exports.workletsVersion = exports.workletsModule = exports.supportedWorkletsVersions = exports.isWorkletsVersionSupported = void 0;
|
|
8
9
|
function clamp(value, min, max) {
|
|
9
10
|
return Math.min(Math.max(value, min), max);
|
|
10
11
|
}
|
|
11
|
-
let isWorkletsAvailable =
|
|
12
|
+
let isWorkletsAvailable = false;
|
|
13
|
+
let isWorkletsVersionSupported = exports.isWorkletsVersionSupported = false;
|
|
14
|
+
let workletsVersion = exports.workletsVersion = 'unknown';
|
|
15
|
+
const supportedWorkletsVersions = exports.supportedWorkletsVersions = ['0.6.0', '0.6.1'];
|
|
12
16
|
let workletsModule = exports.workletsModule = void 0;
|
|
17
|
+
function assertWorkletsEnabled() {
|
|
18
|
+
if (!isWorkletsAvailable) {
|
|
19
|
+
throw new Error('[react-native-audio-api]: Worklets are not available. Please install react-native-worklets to use this feature.');
|
|
20
|
+
} else if (!isWorkletsVersionSupported) {
|
|
21
|
+
throw new Error(`[react-native-audio-api]: Worklets version ${workletsVersion} is not supported.
|
|
22
|
+
Please install react-native-worklets of one of the following versions: [${supportedWorkletsVersions.join(', ')}] to use this feature.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
13
25
|
try {
|
|
14
26
|
exports.workletsModule = workletsModule = require('react-native-worklets');
|
|
15
|
-
|
|
27
|
+
const workletsModuleJson = require('react-native-worklets/package.json');
|
|
28
|
+
exports.isWorkletsVersionSupported = isWorkletsVersionSupported = supportedWorkletsVersions.includes(workletsModuleJson.version);
|
|
29
|
+
isWorkletsAvailable = true;
|
|
30
|
+
exports.workletsVersion = workletsVersion = workletsModuleJson.version;
|
|
16
31
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
17
32
|
} catch (error) {
|
|
18
|
-
|
|
33
|
+
isWorkletsAvailable = false;
|
|
19
34
|
}
|
|
20
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["clamp","value","min","max","Math","isWorkletsAvailable","exports","workletsModule","require","error"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["clamp","value","min","max","Math","isWorkletsAvailable","isWorkletsVersionSupported","exports","workletsVersion","supportedWorkletsVersions","workletsModule","assertWorkletsEnabled","Error","join","require","workletsModuleJson","includes","version","error"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;;;;;;;AAWO,SAASA,KAAKA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,EAAU;EACrE,OAAOC,IAAI,CAACF,GAAG,CAACE,IAAI,CAACD,GAAG,CAACF,KAAK,EAAEC,GAAG,CAAC,EAAEC,GAAG,CAAC;AAC5C;AAEA,IAAIE,mBAAmB,GAAG,KAAK;AACxB,IAAIC,0BAA0B,GAAAC,OAAA,CAAAD,0BAAA,GAAG,KAAK;AACtC,IAAIE,eAAe,GAAAD,OAAA,CAAAC,eAAA,GAAG,SAAS;AAC/B,MAAMC,yBAAyB,GAAAF,OAAA,CAAAE,yBAAA,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;AACpD,IAAIC,cAAuC,GAAAH,OAAA,CAAAG,cAAA;AAE3C,SAASC,qBAAqBA,CAAA,EAAG;EACtC,IAAI,CAACN,mBAAmB,EAAE;IACxB,MAAM,IAAIO,KAAK,CACb,iHACF,CAAC;EACH,CAAC,MAAM,IAAI,CAACN,0BAA0B,EAAE;IACtC,MAAM,IAAIM,KAAK,CACb,8CAA8CJ,eAAe;AACnE,gFAAgFC,yBAAyB,CAACI,IAAI,CAAC,IAAI,CAAC,wBAChH,CAAC;EACH;AACF;AAEA,IAAI;EACFN,OAAA,CAAAG,cAAA,GAAAA,cAAc,GAAGI,OAAO,CAAC,uBAAuB,CAAC;EACjD,MAAMC,kBAAkB,GAAGD,OAAO,CAAC,oCAAoC,CAAC;EACxEP,OAAA,CAAAD,0BAAA,GAAAA,0BAA0B,GAAGG,yBAAyB,CAACO,QAAQ,CAC7DD,kBAAkB,CAACE,OACrB,CAAC;EACDZ,mBAAmB,GAAG,IAAI;EAC1BE,OAAA,CAAAC,eAAA,GAAAA,eAAe,GAAGO,kBAAkB,CAACE,OAAO;EAC5C;AACF,CAAC,CAAC,OAAOC,KAAK,EAAE;EACdb,mBAAmB,GAAG,KAAK;AAC7B","ignoreList":[]}
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
import BaseAudioContext from "./BaseAudioContext.js";
|
|
4
4
|
import AudioManager from "../system/index.js";
|
|
5
5
|
import { NotSupportedError } from "../errors/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { isWorkletsVersionSupported, workletsModule } from "../utils/index.js";
|
|
7
7
|
export default class AudioContext extends BaseAudioContext {
|
|
8
8
|
constructor(options) {
|
|
9
9
|
if (options && options.sampleRate && (options.sampleRate < 8000 || options.sampleRate > 96000)) {
|
|
10
10
|
throw new NotSupportedError(`The provided sampleRate is not supported: ${options.sampleRate}`);
|
|
11
11
|
}
|
|
12
12
|
let audioRuntime = null;
|
|
13
|
-
if (
|
|
13
|
+
if (isWorkletsVersionSupported) {
|
|
14
14
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
15
15
|
}
|
|
16
16
|
super(global.createAudioContext(options?.sampleRate || AudioManager.getDevicePreferredSampleRate(), options?.initSuspended || false, audioRuntime));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","
|
|
1
|
+
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","isWorkletsVersionSupported","workletsModule","AudioContext","constructor","options","sampleRate","audioRuntime","createWorkletRuntime","global","createAudioContext","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,YAAY,MAAM,oBAAW;AAEpC,SAASC,iBAAiB,QAAQ,oBAAW;AAC7C,SAASC,0BAA0B,EAAEC,cAAc,QAAQ,mBAAU;AAErE,eAAe,MAAMC,YAAY,SAASL,gBAAgB,CAAC;EACzDM,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIN,iBAAiB,CACzB,6CAA6CK,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IACA,IAAIC,YAAY,GAAG,IAAI;IAEvB,IAAIN,0BAA0B,EAAE;MAC9BM,YAAY,GAAGL,cAAc,CAACM,oBAAoB,CAAC,qBAAqB,CAAC;IAC3E;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBL,OAAO,EAAEC,UAAU,IAAIP,YAAY,CAACY,4BAA4B,CAAC,CAAC,EAClEN,OAAO,EAAEO,aAAa,IAAI,KAAK,EAC/BL,YACF,CACF,CAAC;EACH;EAEA,MAAMM,KAAKA,CAAA,EAAkB;IAC3B,OAAQ,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAChD;EAEA,MAAME,MAAMA,CAAA,EAAqB;IAC/B,OAAQ,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EACjD;EAEA,MAAMC,OAAOA,CAAA,EAAqB;IAChC,OAAQ,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EAClD;AACF","ignoreList":[]}
|