react-native-audio-api 0.6.1-rc.7 → 0.6.1-rc.9
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/README.md +6 -11
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +12 -1
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +2 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +10 -0
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +10 -1
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +0 -4
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +1 -1
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +2 -1
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +10 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +30 -5
- package/common/cpp/audioapi/core/AudioContext.h +2 -1
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +6 -10
- package/ios/audioapi/ios/AudioAPIModule.mm +1 -1
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -0
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +16 -0
- package/ios/audioapi/ios/core/NativeAudioPlayer.h +4 -0
- package/ios/audioapi/ios/core/NativeAudioPlayer.m +15 -0
- package/ios/audioapi/ios/system/AudioEngine.h +1 -0
- package/ios/audioapi/ios/system/AudioEngine.mm +11 -1
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/core/AudioContext.js +2 -2
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/plugin/withAudioAPI.js +15 -14
- package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
- package/lib/commonjs/web-core/AudioBufferSourceNode.js +4 -4
- package/lib/commonjs/web-core/AudioBufferSourceNode.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.js +5 -3
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/AudioNode.js +8 -2
- package/lib/commonjs/web-core/AudioNode.js.map +1 -1
- package/lib/commonjs/web-core/AudioParam.js +2 -1
- package/lib/commonjs/web-core/AudioParam.js.map +1 -1
- package/lib/commonjs/web-core/BiquadFilterNode.js +4 -4
- package/lib/commonjs/web-core/BiquadFilterNode.js.map +1 -1
- package/lib/commonjs/web-core/GainNode.js +1 -1
- package/lib/commonjs/web-core/GainNode.js.map +1 -1
- package/lib/commonjs/web-core/OscillatorNode.js +2 -2
- package/lib/commonjs/web-core/OscillatorNode.js.map +1 -1
- package/lib/commonjs/web-core/StereoPannerNode.js +1 -1
- package/lib/commonjs/web-core/StereoPannerNode.js.map +1 -1
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/AudioContext.js +2 -2
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/plugin/withAudioAPI.js +15 -14
- package/lib/module/plugin/withAudioAPI.js.map +1 -1
- package/lib/module/web-core/AudioBufferSourceNode.js +4 -4
- package/lib/module/web-core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/web-core/AudioContext.js +5 -3
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/AudioNode.js +7 -2
- package/lib/module/web-core/AudioNode.js.map +1 -1
- package/lib/module/web-core/AudioParam.js +2 -1
- package/lib/module/web-core/AudioParam.js.map +1 -1
- package/lib/module/web-core/BiquadFilterNode.js +4 -4
- package/lib/module/web-core/BiquadFilterNode.js.map +1 -1
- package/lib/module/web-core/GainNode.js +1 -1
- package/lib/module/web-core/GainNode.js.map +1 -1
- package/lib/module/web-core/OscillatorNode.js +2 -2
- package/lib/module/web-core/OscillatorNode.js.map +1 -1
- package/lib/module/web-core/StereoPannerNode.js +1 -1
- package/lib/module/web-core/StereoPannerNode.js.map +1 -1
- package/lib/typescript/api.d.ts +1 -1
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/plugin/withAudioAPI.d.ts +7 -6
- package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +2 -1
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioNode.d.ts +2 -1
- package/lib/typescript/web-core/AudioNode.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioParam.d.ts +4 -2
- package/lib/typescript/web-core/AudioParam.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/api.ts +4 -1
- package/src/core/AudioContext.ts +7 -2
- package/src/plugin/withAudioAPI.ts +36 -29
- package/src/types.ts +2 -1
- package/src/web-core/AudioBufferSourceNode.tsx +9 -4
- package/src/web-core/AudioContext.tsx +7 -3
- package/src/web-core/AudioNode.tsx +10 -3
- package/src/web-core/AudioParam.tsx +5 -2
- package/src/web-core/BiquadFilterNode.tsx +4 -4
- package/src/web-core/GainNode.tsx +1 -1
- package/src/web-core/OscillatorNode.tsx +2 -2
- package/src/web-core/StereoPannerNode.tsx +1 -1
package/README.md
CHANGED
|
@@ -34,17 +34,12 @@ check out the [Getting Started](https://docs.swmansion.com/react-native-audio-ap
|
|
|
34
34
|
Ability to modify playback speed without affecting pitch of the sound
|
|
35
35
|
<br />
|
|
36
36
|
|
|
37
|
-
- <sub
|
|
38
|
-
Full control of system audio settings, remote controls, lock screen integration and most importantly configurable background modes
|
|
39
|
-
<br />
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<br />
|
|
44
|
-
|
|
45
|
-
- **Connect audio param** 🤞 <br />
|
|
46
|
-
Ability to connect Audio nodes to audio params, which will allow for powerful and efficient modulation of audio parameters, creating effects like tremolo, vibrato or complex envelope followers.
|
|
47
|
-
<br />
|
|
37
|
+
- <sub>[](https://github.com/software-mansion/react-native-audio-api/releases/tag/0.6.0)</sub> <br/> **System configuration** 🛠️ <br />
|
|
38
|
+
Full control of system audio settings, remote controls, lock screen integration and most importantly configurable background modes <br />
|
|
39
|
+
<br /> **Microphone support** 🎙️ <br />
|
|
40
|
+
Grab audio data from device microphone or connected device, connect it to the audio graph or stream through the internet <br />
|
|
41
|
+
<br /> **Connect audio param** 🤞 <br />
|
|
42
|
+
Ability to connect Audio nodes to audio params, which will allow for powerful and efficient modulation of audio parameters, creating effects like tremolo, vibrato or complex envelope followers. <br />
|
|
48
43
|
|
|
49
44
|
- **JS Audio Worklets** 🐎 <br />
|
|
50
45
|
Ability to run JS functions connected to the audio graph running on audio thread allowing for full customization of what happens to the audio signal.
|
|
@@ -34,6 +34,18 @@ void AudioPlayer::start() {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
void AudioPlayer::stop() {
|
|
37
|
+
if (mStream_) {
|
|
38
|
+
mStream_->requestStop();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void AudioPlayer::resume() {
|
|
43
|
+
if (mStream_) {
|
|
44
|
+
mStream_->requestStart();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void AudioPlayer::suspend() {
|
|
37
49
|
if (mStream_) {
|
|
38
50
|
mStream_->requestPause();
|
|
39
51
|
}
|
|
@@ -43,7 +55,6 @@ void AudioPlayer::cleanup() {
|
|
|
43
55
|
isInitialized_ = false;
|
|
44
56
|
|
|
45
57
|
if (mStream_) {
|
|
46
|
-
mStream_->requestStop();
|
|
47
58
|
mStream_->close();
|
|
48
59
|
mStream_.reset();
|
|
49
60
|
}
|
|
@@ -53,8 +53,10 @@ class AudioAPIModule(
|
|
|
53
53
|
return true
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
@Synchronized
|
|
56
57
|
override fun getDevicePreferredSampleRate(): Double = MediaSessionManager.getDevicePreferredSampleRate()
|
|
57
58
|
|
|
59
|
+
@Synchronized
|
|
58
60
|
override fun setAudioSessionActivity(
|
|
59
61
|
enabled: Boolean,
|
|
60
62
|
promise: Promise?,
|
|
@@ -62,6 +64,7 @@ class AudioAPIModule(
|
|
|
62
64
|
// noting to do here
|
|
63
65
|
}
|
|
64
66
|
|
|
67
|
+
@Synchronized
|
|
65
68
|
override fun setAudioSessionOptions(
|
|
66
69
|
category: String?,
|
|
67
70
|
mode: String?,
|
|
@@ -70,14 +73,17 @@ class AudioAPIModule(
|
|
|
70
73
|
// noting to do here
|
|
71
74
|
}
|
|
72
75
|
|
|
76
|
+
@Synchronized
|
|
73
77
|
override fun setLockScreenInfo(info: ReadableMap?) {
|
|
74
78
|
MediaSessionManager.setLockScreenInfo(info)
|
|
75
79
|
}
|
|
76
80
|
|
|
81
|
+
@Synchronized
|
|
77
82
|
override fun resetLockScreenInfo() {
|
|
78
83
|
MediaSessionManager.resetLockScreenInfo()
|
|
79
84
|
}
|
|
80
85
|
|
|
86
|
+
@Synchronized
|
|
81
87
|
override fun enableRemoteCommand(
|
|
82
88
|
name: String?,
|
|
83
89
|
enabled: Boolean,
|
|
@@ -85,19 +91,23 @@ class AudioAPIModule(
|
|
|
85
91
|
MediaSessionManager.enableRemoteCommand(name!!, enabled)
|
|
86
92
|
}
|
|
87
93
|
|
|
94
|
+
@Synchronized
|
|
88
95
|
override fun observeAudioInterruptions(enabled: Boolean) {
|
|
89
96
|
MediaSessionManager.observeAudioInterruptions(enabled)
|
|
90
97
|
}
|
|
91
98
|
|
|
99
|
+
@Synchronized
|
|
92
100
|
override fun observeVolumeChanges(enabled: Boolean) {
|
|
93
101
|
MediaSessionManager.observeVolumeChanges(enabled)
|
|
94
102
|
}
|
|
95
103
|
|
|
104
|
+
@Synchronized
|
|
96
105
|
override fun requestRecordingPermissions(promise: Promise?) {
|
|
97
106
|
val res = MediaSessionManager.requestRecordingPermissions(currentActivity)
|
|
98
107
|
promise!!.resolve(res)
|
|
99
108
|
}
|
|
100
109
|
|
|
110
|
+
@Synchronized
|
|
101
111
|
override fun checkRecordingPermissions(promise: Promise?) {
|
|
102
112
|
val res = MediaSessionManager.checkRecordingPermissions()
|
|
103
113
|
promise!!.resolve(res)
|
|
@@ -142,6 +142,10 @@ class LockScreenManager(
|
|
|
142
142
|
state.playbackSpeed
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
+
if (isPlaying && speed == 0F) {
|
|
146
|
+
speed = 1F
|
|
147
|
+
}
|
|
148
|
+
|
|
145
149
|
elapsedTime =
|
|
146
150
|
if (info.hasKey("elapsedTime")) {
|
|
147
151
|
(info.getDouble("elapsedTime") * 1000).toLong()
|
|
@@ -250,7 +254,7 @@ class LockScreenManager(
|
|
|
250
254
|
return bitmap
|
|
251
255
|
}
|
|
252
256
|
|
|
253
|
-
fun updatePlaybackState(playbackState: Int) {
|
|
257
|
+
private fun updatePlaybackState(playbackState: Int) {
|
|
254
258
|
isPlaying = playbackState == PlaybackStateCompat.STATE_PLAYING
|
|
255
259
|
|
|
256
260
|
pb.setState(playbackState, elapsedTime, speed)
|
|
@@ -285,6 +289,11 @@ class LockScreenManager(
|
|
|
285
289
|
if (hasControl(PlaybackStateCompat.ACTION_REWIND)) {
|
|
286
290
|
controlCount += 1
|
|
287
291
|
}
|
|
292
|
+
|
|
293
|
+
if (hasControl(PlaybackStateCompat.ACTION_SEEK_TO)) {
|
|
294
|
+
controlCount += 1
|
|
295
|
+
}
|
|
296
|
+
|
|
288
297
|
val actions = IntArray(controlCount)
|
|
289
298
|
for (i in actions.indices) {
|
|
290
299
|
actions[i] = i
|
|
@@ -3,7 +3,6 @@ package com.swmansion.audioapi.system
|
|
|
3
3
|
import android.content.Intent
|
|
4
4
|
import android.os.Build
|
|
5
5
|
import android.support.v4.media.session.MediaSessionCompat
|
|
6
|
-
import android.support.v4.media.session.PlaybackStateCompat
|
|
7
6
|
import androidx.core.app.NotificationManagerCompat
|
|
8
7
|
import com.swmansion.audioapi.AudioAPIModule
|
|
9
8
|
import java.lang.ref.WeakReference
|
|
@@ -11,15 +10,12 @@ import java.util.HashMap
|
|
|
11
10
|
|
|
12
11
|
class MediaSessionCallback(
|
|
13
12
|
private val audioAPIModule: WeakReference<AudioAPIModule>,
|
|
14
|
-
private val lockScreenManager: WeakReference<LockScreenManager>,
|
|
15
13
|
) : MediaSessionCompat.Callback() {
|
|
16
14
|
override fun onPlay() {
|
|
17
|
-
lockScreenManager.get()?.updatePlaybackState(PlaybackStateCompat.STATE_PLAYING)
|
|
18
15
|
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("remotePlay", mapOf())
|
|
19
16
|
}
|
|
20
17
|
|
|
21
18
|
override fun onPause() {
|
|
22
|
-
lockScreenManager.get()?.updatePlaybackState(PlaybackStateCompat.STATE_PAUSED)
|
|
23
19
|
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("remotePause", mapOf())
|
|
24
20
|
}
|
|
25
21
|
|
|
@@ -81,7 +81,7 @@ object MediaSessionManager {
|
|
|
81
81
|
this.lockScreenManager = LockScreenManager(this.reactContext, WeakReference(this.mediaSession), WeakReference(mediaNotificationManager))
|
|
82
82
|
this.mediaReceiver =
|
|
83
83
|
MediaReceiver(this.reactContext, WeakReference(this.mediaSession), WeakReference(mediaNotificationManager), this.audioAPIModule)
|
|
84
|
-
this.mediaSession.setCallback(MediaSessionCallback(this.audioAPIModule
|
|
84
|
+
this.mediaSession.setCallback(MediaSessionCallback(this.audioAPIModule))
|
|
85
85
|
|
|
86
86
|
val filter = IntentFilter()
|
|
87
87
|
filter.addAction(MediaNotificationManager.REMOVE_NOTIFICATION)
|
|
@@ -45,7 +45,8 @@ class AudioAPIModuleInstaller {
|
|
|
45
45
|
size_t count) -> jsi::Value {
|
|
46
46
|
std::shared_ptr<AudioContext> audioContext;
|
|
47
47
|
auto sampleRate = static_cast<float>(args[0].getNumber());
|
|
48
|
-
|
|
48
|
+
auto initSuspended = args[1].getBool();
|
|
49
|
+
audioContext = std::make_shared<AudioContext>(sampleRate, initSuspended, audioEventHandlerRegistry);
|
|
49
50
|
|
|
50
51
|
auto audioContextHostObject = std::make_shared<AudioContextHostObject>(
|
|
51
52
|
audioContext, &runtime, jsCallInvoker);
|
|
@@ -45,6 +45,11 @@ class AudioContextHostObject : public BaseAudioContextHostObject {
|
|
|
45
45
|
auto audioContext = std::static_pointer_cast<AudioContext>(context_);
|
|
46
46
|
auto result = audioContext->resume();
|
|
47
47
|
|
|
48
|
+
if (!result) {
|
|
49
|
+
promise->reject("Failed to resume audio context because it is already closed.");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
48
53
|
promise->resolve([result](jsi::Runtime &runtime) {
|
|
49
54
|
return jsi::Value(result);
|
|
50
55
|
});
|
|
@@ -60,6 +65,11 @@ class AudioContextHostObject : public BaseAudioContextHostObject {
|
|
|
60
65
|
auto audioContext = std::static_pointer_cast<AudioContext>(context_);
|
|
61
66
|
auto result = audioContext->suspend();
|
|
62
67
|
|
|
68
|
+
if (!result) {
|
|
69
|
+
promise->reject("Failed to suspend audio context because it is already closed.");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
63
73
|
promise->resolve([result](jsi::Runtime &runtime) {
|
|
64
74
|
return jsi::Value(result);
|
|
65
75
|
});
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
namespace audioapi {
|
|
13
13
|
AudioContext::AudioContext(
|
|
14
14
|
float sampleRate,
|
|
15
|
+
bool initSuspended,
|
|
15
16
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
|
|
16
17
|
: BaseAudioContext(audioEventHandlerRegistry) {
|
|
17
18
|
#ifdef ANDROID
|
|
@@ -24,8 +25,16 @@ AudioContext::AudioContext(
|
|
|
24
25
|
sampleRate_ = sampleRate;
|
|
25
26
|
audioDecoder_ = std::make_shared<AudioDecoder>(sampleRate);
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
if (initSuspended) {
|
|
29
|
+
playerHasBeenStarted_ = false;
|
|
30
|
+
state_ = ContextState::SUSPENDED;
|
|
31
|
+
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
playerHasBeenStarted_ = true;
|
|
28
36
|
audioPlayer_->start();
|
|
37
|
+
state_ = ContextState::RUNNING;
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
AudioContext::~AudioContext() {
|
|
@@ -37,27 +46,43 @@ AudioContext::~AudioContext() {
|
|
|
37
46
|
void AudioContext::close() {
|
|
38
47
|
state_ = ContextState::CLOSED;
|
|
39
48
|
|
|
49
|
+
audioPlayer_->stop();
|
|
40
50
|
audioPlayer_->cleanup();
|
|
41
51
|
nodeManager_->cleanup();
|
|
42
52
|
}
|
|
43
53
|
|
|
44
54
|
bool AudioContext::resume() {
|
|
45
|
-
if (isClosed()
|
|
55
|
+
if (isClosed()) {
|
|
46
56
|
return false;
|
|
47
57
|
}
|
|
48
58
|
|
|
59
|
+
if (isRunning()) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!playerHasBeenStarted_) {
|
|
64
|
+
playerHasBeenStarted_ = true;
|
|
65
|
+
audioPlayer_->start();
|
|
66
|
+
} else {
|
|
67
|
+
audioPlayer_->resume();
|
|
68
|
+
}
|
|
69
|
+
|
|
49
70
|
state_ = ContextState::RUNNING;
|
|
50
|
-
audioPlayer_->start();
|
|
51
71
|
return true;
|
|
52
72
|
}
|
|
53
73
|
|
|
54
74
|
bool AudioContext::suspend() {
|
|
55
|
-
if (isClosed()
|
|
75
|
+
if (isClosed()) {
|
|
56
76
|
return false;
|
|
57
77
|
}
|
|
58
78
|
|
|
79
|
+
if (isSuspended()) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
audioPlayer_->suspend();
|
|
84
|
+
|
|
59
85
|
state_ = ContextState::SUSPENDED;
|
|
60
|
-
audioPlayer_->stop();
|
|
61
86
|
return true;
|
|
62
87
|
}
|
|
63
88
|
|
|
@@ -14,7 +14,7 @@ class IOSAudioPlayer;
|
|
|
14
14
|
|
|
15
15
|
class AudioContext : public BaseAudioContext {
|
|
16
16
|
public:
|
|
17
|
-
explicit AudioContext(float sampleRate, const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
17
|
+
explicit AudioContext(float sampleRate, bool initSuspended, const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
18
18
|
~AudioContext() override;
|
|
19
19
|
|
|
20
20
|
void close();
|
|
@@ -27,6 +27,7 @@ class AudioContext : public BaseAudioContext {
|
|
|
27
27
|
#else
|
|
28
28
|
std::shared_ptr<IOSAudioPlayer> audioPlayer_;
|
|
29
29
|
#endif
|
|
30
|
+
bool playerHasBeenStarted_;
|
|
30
31
|
|
|
31
32
|
std::function<void(std::shared_ptr<AudioBus>, int)> renderAudio();
|
|
32
33
|
};
|
|
@@ -152,7 +152,11 @@ void AudioBufferQueueSourceNode::processWithPitchCorrection(
|
|
|
152
152
|
|
|
153
153
|
playbackRateBus_->zero();
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
auto framesNeededToStretch =
|
|
156
|
+
static_cast<int>(playbackRate * static_cast<float>(framesToProcess));
|
|
157
|
+
|
|
158
|
+
updatePlaybackInfo(
|
|
159
|
+
playbackRateBus_, framesNeededToStretch, startOffset, offsetLength);
|
|
156
160
|
|
|
157
161
|
if (playbackRate == 0.0f || (!isPlaying() && !isStopScheduled())) {
|
|
158
162
|
processingBus->zero();
|
|
@@ -162,15 +166,7 @@ void AudioBufferQueueSourceNode::processWithPitchCorrection(
|
|
|
162
166
|
// Send position changed event
|
|
163
167
|
sendOnPositionChangedEvent();
|
|
164
168
|
|
|
165
|
-
|
|
166
|
-
static_cast<int>(playbackRate * static_cast<float>(framesToProcess));
|
|
167
|
-
auto stretchedStartOffset =
|
|
168
|
-
static_cast<size_t>(static_cast<float>(startOffset) * playbackRate);
|
|
169
|
-
auto stretchedOffsetLength =
|
|
170
|
-
static_cast<size_t>(static_cast<float>(offsetLength) * playbackRate);
|
|
171
|
-
|
|
172
|
-
processWithoutInterpolation(
|
|
173
|
-
playbackRateBus_, stretchedStartOffset, stretchedOffsetLength);
|
|
169
|
+
processWithoutInterpolation(playbackRateBus_, startOffset, offsetLength);
|
|
174
170
|
|
|
175
171
|
stretch_->process(
|
|
176
172
|
playbackRateBus_.get()[0],
|
|
@@ -171,7 +171,7 @@ RCT_EXPORT_METHOD(
|
|
|
171
171
|
body[stdKey] = EventValue([value doubleValue]);
|
|
172
172
|
} else if (strcmp(type, @encode(float)) == 0) {
|
|
173
173
|
body[stdKey] = EventValue([value floatValue]);
|
|
174
|
-
} else
|
|
174
|
+
} else {
|
|
175
175
|
body[stdKey] = EventValue([value boolValue]);
|
|
176
176
|
}
|
|
177
177
|
}
|
|
@@ -62,6 +62,22 @@ void IOSAudioPlayer::stop()
|
|
|
62
62
|
[audioPlayer_ stop];
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
void IOSAudioPlayer::resume()
|
|
66
|
+
{
|
|
67
|
+
if (isRunning_.load()) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
[audioPlayer_ resume];
|
|
72
|
+
isRunning_.store(true);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
void IOSAudioPlayer::suspend()
|
|
76
|
+
{
|
|
77
|
+
isRunning_.store(false);
|
|
78
|
+
[audioPlayer_ suspend];
|
|
79
|
+
}
|
|
80
|
+
|
|
65
81
|
void IOSAudioPlayer::cleanup()
|
|
66
82
|
{
|
|
67
83
|
stop();
|
|
@@ -51,6 +51,21 @@
|
|
|
51
51
|
self.sourceNodeId = nil;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
- (void)resume
|
|
55
|
+
{
|
|
56
|
+
NSLog(@"[AudioPlayer] resume");
|
|
57
|
+
AudioEngine *audioEngine = [AudioEngine sharedInstance];
|
|
58
|
+
assert(audioEngine != nil);
|
|
59
|
+
[audioEngine startEngine];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
- (void)suspend
|
|
63
|
+
{
|
|
64
|
+
AudioEngine *audioEngine = [AudioEngine sharedInstance];
|
|
65
|
+
assert(audioEngine != nil);
|
|
66
|
+
[audioEngine pauseEngine];
|
|
67
|
+
}
|
|
68
|
+
|
|
54
69
|
- (void)cleanup
|
|
55
70
|
{
|
|
56
71
|
self.renderAudio = nil;
|
|
@@ -20,7 +20,6 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
20
20
|
self.sourceFormats = [[NSMutableDictionary alloc] init];
|
|
21
21
|
|
|
22
22
|
self.sessionManager = sessionManager;
|
|
23
|
-
[self.sessionManager setActive:true];
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
_sharedInstance = self;
|
|
@@ -76,6 +75,7 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
76
75
|
}
|
|
77
76
|
|
|
78
77
|
[self.audioEngine startAndReturnError:&error];
|
|
78
|
+
[self.sessionManager setActive:true];
|
|
79
79
|
|
|
80
80
|
if (error != nil) {
|
|
81
81
|
NSLog(@"Error while starting the audio engine: %@", [error debugDescription]);
|
|
@@ -92,6 +92,16 @@ static AudioEngine *_sharedInstance = nil;
|
|
|
92
92
|
[self.audioEngine stop];
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
- (void)pauseEngine
|
|
96
|
+
{
|
|
97
|
+
NSLog(@"[AudioEngine] pauseEngine");
|
|
98
|
+
if (![self.audioEngine isRunning]) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
[self.audioEngine pause];
|
|
103
|
+
}
|
|
104
|
+
|
|
95
105
|
- (bool)isRunning
|
|
96
106
|
{
|
|
97
107
|
return [self.audioEngine isRunning];
|
package/lib/commonjs/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_specs","require","_AudioBuffer","_interopRequireDefault","_AudioBufferSourceNode","_AudioBufferQueueSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_system","_useSytemVolume","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_specs","require","_AudioBuffer","_interopRequireDefault","_AudioBufferSourceNode","_AudioBufferQueueSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_system","_useSytemVolume","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AA0CA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,2BAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,aAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,oBAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,qBAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,UAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,aAAA,GAAAP,sBAAA,CAAAF,OAAA;AACA,IAAAU,WAAA,GAAAR,sBAAA,CAAAF,OAAA;AACA,IAAAW,yBAAA,GAAAT,sBAAA,CAAAF,OAAA;AACA,IAAAY,iBAAA,GAAAV,sBAAA,CAAAF,OAAA;AACA,IAAAa,iBAAA,GAAAX,sBAAA,CAAAF,OAAA;AACA,IAAAc,SAAA,GAAAZ,sBAAA,CAAAF,OAAA;AACA,IAAAe,eAAA,GAAAb,sBAAA,CAAAF,OAAA;AACA,IAAAgB,iBAAA,GAAAd,sBAAA,CAAAF,OAAA;AACA,IAAAiB,cAAA,GAAAf,sBAAA,CAAAF,OAAA;AACA,IAAAkB,OAAA,GAAAhB,sBAAA,CAAAF,OAAA;AACA,IAAAmB,eAAA,GAAAjB,sBAAA,CAAAF,OAAA;AAEA,IAAAoB,MAAA,GAAApB,OAAA;AAUA,IAAAqB,OAAA,GAAArB,OAAA;AAMkB,SAAAE,uBAAAoB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AApElB;;AAgBA;;AAEA,IACEG,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACC,2BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC","ignoreList":[]}
|
|
@@ -10,10 +10,10 @@ var _errors = require("../errors");
|
|
|
10
10
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
class AudioContext extends _BaseAudioContext.default {
|
|
12
12
|
constructor(options) {
|
|
13
|
-
if (options && (options.sampleRate < 8000 || options.sampleRate > 96000)) {
|
|
13
|
+
if (options && options.sampleRate && (options.sampleRate < 8000 || options.sampleRate > 96000)) {
|
|
14
14
|
throw new _errors.NotSupportedError(`The provided sampleRate is not supported: ${options.sampleRate}`);
|
|
15
15
|
}
|
|
16
|
-
super(global.createAudioContext(options?.sampleRate || _system.default.getDevicePreferredSampleRate()));
|
|
16
|
+
super(global.createAudioContext(options?.sampleRate || _system.default.getDevicePreferredSampleRate(), options?.initSuspended || false));
|
|
17
17
|
}
|
|
18
18
|
async close() {
|
|
19
19
|
await this.context.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","global","createAudioContext","AudioManager","getDevicePreferredSampleRate","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;AAA8C,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/B,MAAMG,YAAY,SAASC,yBAAgB,CAAC;EACzDC,WAAWA,CAACC,OAA6B,EAAE;IACzC,
|
|
1
|
+
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","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;AAA8C,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/B,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;IAEA,KAAK,CACHE,MAAM,CAACC,kBAAkB,CACvBJ,OAAO,EAAEC,UAAU,IAAII,eAAY,CAACC,4BAA4B,CAAC,CAAC,EAClEN,OAAO,EAAEO,aAAa,IAAI,KAC5B,CACF,CAAC;EACH;EAEA,MAAMC,KAAKA,CAAA,EAAuB;IAChC,MAAO,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAC/C;EAEA,MAAME,MAAMA,CAAA,EAAuB;IACjC,MAAO,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EAChD;EAEA,MAAMC,OAAOA,CAAA,EAAuB;IAClC,MAAO,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EACjD;AACF;AAACC,OAAA,CAAAhB,OAAA,GAAAC,YAAA","ignoreList":[]}
|
|
@@ -6,6 +6,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _configPlugins = require("@expo/config-plugins");
|
|
8
8
|
const pkg = require('react-native-audio-api/package.json');
|
|
9
|
+
const withDefaultOptions = options => {
|
|
10
|
+
return {
|
|
11
|
+
iosBackgroundMode: true,
|
|
12
|
+
androidForegroundService: true,
|
|
13
|
+
androidFSPermissions: ['android.permission.FOREGROUND_SERVICE', 'android.permission.WAKE_LOCK'],
|
|
14
|
+
androidFSTypes: ['mediaPlayback'],
|
|
15
|
+
...options
|
|
16
|
+
};
|
|
17
|
+
};
|
|
9
18
|
const withBackgroundAudio = config => {
|
|
10
19
|
return (0, _configPlugins.withInfoPlist)(config, iosConfig => {
|
|
11
20
|
iosConfig.modResults.UIBackgroundModes = [...Array.from(new Set([...(iosConfig.modResults.UIBackgroundModes ?? []), 'audio']))];
|
|
@@ -39,22 +48,14 @@ const withForegroundService = (config, {
|
|
|
39
48
|
return mod;
|
|
40
49
|
});
|
|
41
50
|
};
|
|
42
|
-
const withAudioAPI = (config, {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
androidFSPermissions = [],
|
|
46
|
-
androidFSTypes = []
|
|
47
|
-
} = {}) => {
|
|
48
|
-
if (iosBackgroundMode) {
|
|
51
|
+
const withAudioAPI = (config, optionsIn) => {
|
|
52
|
+
const options = withDefaultOptions(optionsIn ?? {});
|
|
53
|
+
if (options.iosBackgroundMode) {
|
|
49
54
|
config = withBackgroundAudio(config);
|
|
50
55
|
}
|
|
51
|
-
if (androidForegroundService) {
|
|
52
|
-
config = withAndroidPermissions(config,
|
|
53
|
-
|
|
54
|
-
});
|
|
55
|
-
config = withForegroundService(config, {
|
|
56
|
-
androidFSTypes
|
|
57
|
-
});
|
|
56
|
+
if (options.androidForegroundService) {
|
|
57
|
+
config = withAndroidPermissions(config, options);
|
|
58
|
+
config = withForegroundService(config, options);
|
|
58
59
|
}
|
|
59
60
|
return config;
|
|
60
61
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_configPlugins","require","pkg","withBackgroundAudio","config","withInfoPlist","iosConfig","modResults","UIBackgroundModes","Array","from","Set","withAndroidPermissions","
|
|
1
|
+
{"version":3,"names":["_configPlugins","require","pkg","withDefaultOptions","options","iosBackgroundMode","androidForegroundService","androidFSPermissions","androidFSTypes","withBackgroundAudio","config","withInfoPlist","iosConfig","modResults","UIBackgroundModes","Array","from","Set","withAndroidPermissions","AndroidConfig","Permissions","withPermissions","withForegroundService","withAndroidManifest","mod","manifest","mainApplication","Manifest","getMainApplicationOrThrow","SFTypes","join","serviceElement","$","intentFilter","service","push","withAudioAPI","optionsIn","_default","exports","default","createRunOncePlugin","name","version"],"sourceRoot":"../../../src","sources":["plugin/withAudioAPI.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAOA,MAAMC,GAAG,GAAGD,OAAO,CAAC,qCAAqC,CAAC;AAS1D,MAAME,kBAAkB,GAAIC,OAAyB,IAAc;EACjE,OAAO;IACLC,iBAAiB,EAAE,IAAI;IACvBC,wBAAwB,EAAE,IAAI;IAC9BC,oBAAoB,EAAE,CACpB,uCAAuC,EACvC,8BAA8B,CAC/B;IACDC,cAAc,EAAE,CAAC,eAAe,CAAC;IACjC,GAAGJ;EACL,CAAC;AACH,CAAC;AAED,MAAMK,mBAAiC,GAAIC,MAAM,IAAK;EACpD,OAAO,IAAAC,4BAAa,EAACD,MAAM,EAAGE,SAAS,IAAK;IAC1CA,SAAS,CAACC,UAAU,CAACC,iBAAiB,GAAG,CACvC,GAAGC,KAAK,CAACC,IAAI,CACX,IAAIC,GAAG,CAAC,CAAC,IAAIL,SAAS,CAACC,UAAU,CAACC,iBAAiB,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CACtE,CAAC,CACF;IAED,OAAOF,SAAS;EAClB,CAAC,CAAC;AACJ,CAAC;AAED,MAAMM,sBAA6C,GAAGA,CACpDR,MAAM,EACN;EAAEH;AAA8B,CAAC,KAC9B;EACH,OAAOY,4BAAa,CAACC,WAAW,CAACC,eAAe,CAC9CX,MAAM,EACNH,oBACF,CAAC;AACH,CAAC;AAED,MAAMe,qBAA4C,GAAGA,CACnDZ,MAAM,EACN;EAAEF;AAAwB,CAAC,KACxB;EACH,OAAO,IAAAe,kCAAmB,EAACb,MAAM,EAAGc,GAAG,IAAK;IAC1C,MAAMC,QAAQ,GAAGD,GAAG,CAACX,UAAU;IAC/B,MAAMa,eAAe,GACnBP,4BAAa,CAACQ,QAAQ,CAACC,yBAAyB,CAACH,QAAQ,CAAC;IAE5D,MAAMI,OAAO,GAAGrB,cAAc,CAACsB,IAAI,CAAC,GAAG,CAAC;IAExC,MAAMC,cAAc,GAAG;MACrBC,CAAC,EAAE;QACD,cAAc,EACZ,4EAA4E;QAC9E,sBAAsB,EAAE,MAAM;QAC9B,+BAA+B,EAAEH;MACnC,CAAC;MACDI,YAAY,EAAE;IAChB,CAAC;IAED,IAAI,CAACP,eAAe,CAACQ,OAAO,EAAE;MAC5BR,eAAe,CAACQ,OAAO,GAAG,EAAE;IAC9B;IAEAR,eAAe,CAACQ,OAAO,CAACC,IAAI,CAACJ,cAAc,CAAC;IAE5C,OAAOP,GAAG;EACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAMY,YAAmC,GAAGA,CAAC1B,MAAM,EAAE2B,SAAS,KAAK;EACjE,MAAMjC,OAAO,GAAGD,kBAAkB,CAACkC,SAAS,IAAI,CAAC,CAAC,CAAC;EAEnD,IAAIjC,OAAO,CAACC,iBAAiB,EAAE;IAC7BK,MAAM,GAAGD,mBAAmB,CAACC,MAAM,CAAC;EACtC;EAEA,IAAIN,OAAO,CAACE,wBAAwB,EAAE;IACpCI,MAAM,GAAGQ,sBAAsB,CAACR,MAAM,EAAEN,OAAO,CAAC;IAChDM,MAAM,GAAGY,qBAAqB,CAACZ,MAAM,EAAEN,OAAO,CAAC;EACjD;EAEA,OAAOM,MAAM;AACf,CAAC;AAAC,IAAA4B,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa,IAAAC,kCAAmB,EAACL,YAAY,EAAElC,GAAG,CAACwC,IAAI,EAAExC,GAAG,CAACyC,OAAO,CAAC","ignoreList":[]}
|
|
@@ -65,11 +65,11 @@ class AudioBufferSourceNode extends _AudioScheduledSourceNode.default {
|
|
|
65
65
|
super(context, node);
|
|
66
66
|
this._pitchCorrection = pitchCorrection;
|
|
67
67
|
if (pitchCorrection) {
|
|
68
|
-
this.detune = new _AudioParam.default(new IStretcherNodeAudioParam(0, this.setDetune.bind(this), 'a-rate', -1200, 1200, 0));
|
|
69
|
-
this.playbackRate = new _AudioParam.default(new IStretcherNodeAudioParam(1, this.setPlaybackRate.bind(this), 'a-rate', 0, Infinity, 1));
|
|
68
|
+
this.detune = new _AudioParam.default(new IStretcherNodeAudioParam(0, this.setDetune.bind(this), 'a-rate', -1200, 1200, 0), context);
|
|
69
|
+
this.playbackRate = new _AudioParam.default(new IStretcherNodeAudioParam(1, this.setPlaybackRate.bind(this), 'a-rate', 0, Infinity, 1), context);
|
|
70
70
|
} else {
|
|
71
|
-
this.detune = new _AudioParam.default(node.detune);
|
|
72
|
-
this.playbackRate = new _AudioParam.default(node.playbackRate);
|
|
71
|
+
this.detune = new _AudioParam.default(node.detune, context);
|
|
72
|
+
this.playbackRate = new _AudioParam.default(node.playbackRate, context);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
isStretcherNode() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_errors","require","_AudioParam","_interopRequireDefault","_AudioBuffer","_AudioScheduledSourceNode","_utils","_LoadCustomWasm","e","__esModule","default","IStretcherNodeAudioParam","constructor","value","setter","automationRate","minValue","maxValue","defaultValue","_value","_setter","cancelAndHoldAtTime","cancelTime","cancelScheduledValues","exponentialRampToValueAtTime","_endTime","console","warn","linearRampToValueAtTime","setTargetAtTime","_target","_startTime","_timeConstant","setValueAtTime","startTime","setValueCurveAtTime","_values","_duration","AudioBufferSourceNode","AudioScheduledSourceNode","_loop","_loopStart","_loopEnd","_buffer","context","node","pitchCorrection","_pitchCorrection","detune","AudioParam","setDetune","bind","playbackRate","setPlaybackRate","Infinity","isStretcherNode","asStretcher","asBufferSource","when","hasBeenStarted","schedule","semitones","Math","floor","clamp","output","rate","buffer","AudioBuffer","stretcher","dropBuffers","channelArrays","i","numberOfChannels","push","getChannelData","addBuffers","loop","loopStart","loopEnd","start","offset","duration","RangeError","InvalidStateError","startAt","currentTime","stop","exports"],"sourceRoot":"../../../src","sources":["web-core/AudioBufferSourceNode.tsx"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["_errors","require","_AudioParam","_interopRequireDefault","_AudioBuffer","_AudioScheduledSourceNode","_utils","_LoadCustomWasm","e","__esModule","default","IStretcherNodeAudioParam","constructor","value","setter","automationRate","minValue","maxValue","defaultValue","_value","_setter","cancelAndHoldAtTime","cancelTime","cancelScheduledValues","exponentialRampToValueAtTime","_endTime","console","warn","linearRampToValueAtTime","setTargetAtTime","_target","_startTime","_timeConstant","setValueAtTime","startTime","setValueCurveAtTime","_values","_duration","AudioBufferSourceNode","AudioScheduledSourceNode","_loop","_loopStart","_loopEnd","_buffer","context","node","pitchCorrection","_pitchCorrection","detune","AudioParam","setDetune","bind","playbackRate","setPlaybackRate","Infinity","isStretcherNode","asStretcher","asBufferSource","when","hasBeenStarted","schedule","semitones","Math","floor","clamp","output","rate","buffer","AudioBuffer","stretcher","dropBuffers","channelArrays","i","numberOfChannels","push","getChannelData","addBuffers","loop","loopStart","loopEnd","start","offset","duration","RangeError","InvalidStateError","startAt","currentTime","stop","exports"],"sourceRoot":"../../../src","sources":["web-core/AudioBufferSourceNode.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,11 +17,13 @@ var _StereoPannerNode = _interopRequireDefault(require("./StereoPannerNode"));
|
|
|
17
17
|
var _LoadCustomWasm = require("./custom/LoadCustomWasm");
|
|
18
18
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
19
|
class AudioContext {
|
|
20
|
-
constructor(options) {
|
|
21
|
-
if (options && (options.sampleRate < 8000 || options.sampleRate > 96000)) {
|
|
20
|
+
constructor(options, _initSuspended = false) {
|
|
21
|
+
if (options && options.sampleRate && (options.sampleRate < 8000 || options.sampleRate > 96000)) {
|
|
22
22
|
throw new _errors.NotSupportedError(`The provided sampleRate is not supported: ${options.sampleRate}`);
|
|
23
23
|
}
|
|
24
|
-
this.context = new window.AudioContext(
|
|
24
|
+
this.context = new window.AudioContext({
|
|
25
|
+
sampleRate: options?.sampleRate
|
|
26
|
+
});
|
|
25
27
|
this.sampleRate = this.context.sampleRate;
|
|
26
28
|
this.destination = new _AudioDestinationNode.default(this, this.context.destination);
|
|
27
29
|
}
|