react-native-audio-api 0.6.4 → 0.6.5-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +11 -3
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +1 -1
- package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +5 -5
- package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +8 -1
- package/common/cpp/audioapi/core/AudioParam.cpp +4 -5
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +4 -2
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +15 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +6 -4
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +13 -2
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -0
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +78 -28
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +3 -0
- package/ios/audioapi/ios/AudioAPIModule.mm +11 -12
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js +10 -6
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioScheduledSourceNode.js +6 -2
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferBaseSourceNode.js +10 -6
- package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +6 -2
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +6 -3
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +2 -0
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/AudioBufferBaseSourceNode.ts +20 -7
- package/src/core/AudioScheduledSourceNode.ts +9 -1
|
@@ -58,11 +58,19 @@ void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
|
|
|
58
58
|
} else if (value->isInstanceOf(jni::JFloat::javaClassStatic())) {
|
|
59
59
|
body[name] = jni::static_ref_cast<jni::JFloat>(value)->value();
|
|
60
60
|
} else if (value->isInstanceOf(jni::JBoolean::javaClassStatic())) {
|
|
61
|
-
|
|
61
|
+
auto booleanValue = jni::static_ref_cast<jni::JBoolean>(value)->value();
|
|
62
|
+
|
|
63
|
+
if (booleanValue) {
|
|
64
|
+
body[name] = true;
|
|
65
|
+
} else {
|
|
66
|
+
body[name] = false;
|
|
67
|
+
}
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
70
|
|
|
65
|
-
audioEventHandlerRegistry_
|
|
66
|
-
|
|
71
|
+
if (audioEventHandlerRegistry_ != nullptr) {
|
|
72
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
73
|
+
eventName->toStdString(), body);
|
|
74
|
+
}
|
|
67
75
|
}
|
|
68
76
|
} // namespace audioapi
|
|
@@ -13,7 +13,7 @@ class AudioFocusListener(
|
|
|
13
13
|
private val audioAPIModule: WeakReference<AudioAPIModule>,
|
|
14
14
|
private val lockScreenManager: WeakReference<LockScreenManager>,
|
|
15
15
|
) : AudioManager.OnAudioFocusChangeListener {
|
|
16
|
-
private var playOnAudioFocus = false
|
|
16
|
+
private var playOnAudioFocus: Boolean = false
|
|
17
17
|
private var focusRequest: AudioFocusRequest? = null
|
|
18
18
|
|
|
19
19
|
override fun onAudioFocusChange(focusChange: Int) {
|
|
@@ -23,7 +23,7 @@ class AudioFocusListener(
|
|
|
23
23
|
playOnAudioFocus = false
|
|
24
24
|
val body =
|
|
25
25
|
HashMap<String, Any>().apply {
|
|
26
|
-
put("
|
|
26
|
+
put("type", "began")
|
|
27
27
|
put("shouldResume", false)
|
|
28
28
|
}
|
|
29
29
|
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
|
|
@@ -32,7 +32,7 @@ class AudioFocusListener(
|
|
|
32
32
|
playOnAudioFocus = lockScreenManager.get()?.isPlaying == true
|
|
33
33
|
val body =
|
|
34
34
|
HashMap<String, Any>().apply {
|
|
35
|
-
put("
|
|
35
|
+
put("type", "began")
|
|
36
36
|
put("shouldResume", playOnAudioFocus)
|
|
37
37
|
}
|
|
38
38
|
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
|
|
@@ -41,14 +41,14 @@ class AudioFocusListener(
|
|
|
41
41
|
if (playOnAudioFocus) {
|
|
42
42
|
val body =
|
|
43
43
|
HashMap<String, Any>().apply {
|
|
44
|
-
put("
|
|
44
|
+
put("type", "ended")
|
|
45
45
|
put("shouldResume", true)
|
|
46
46
|
}
|
|
47
47
|
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
|
|
48
48
|
} else {
|
|
49
49
|
val body =
|
|
50
50
|
HashMap<String, Any>().apply {
|
|
51
|
-
put("
|
|
51
|
+
put("type", "ended")
|
|
52
52
|
put("shouldResume", false)
|
|
53
53
|
}
|
|
54
54
|
audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
|
|
@@ -18,7 +18,8 @@ class AudioBufferBaseSourceNodeHostObject
|
|
|
18
18
|
: AudioScheduledSourceNodeHostObject(node) {
|
|
19
19
|
addGetters(
|
|
20
20
|
JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, detune),
|
|
21
|
-
JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, playbackRate)
|
|
21
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, playbackRate),
|
|
22
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval));
|
|
22
23
|
|
|
23
24
|
addSetters(
|
|
24
25
|
JSI_EXPORT_PROPERTY_SETTER(AudioBufferBaseSourceNodeHostObject, onPositionChanged),
|
|
@@ -49,6 +50,12 @@ class AudioBufferBaseSourceNodeHostObject
|
|
|
49
50
|
sourceNode->setOnPositionChangedCallbackId(std::stoull(value.getString(runtime).utf8(runtime)));
|
|
50
51
|
}
|
|
51
52
|
|
|
53
|
+
JSI_PROPERTY_GETTER(onPositionChangedInterval) {
|
|
54
|
+
auto sourceNode =
|
|
55
|
+
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
56
|
+
return jsi::Value(sourceNode->getOnPositionChangedInterval());
|
|
57
|
+
}
|
|
58
|
+
|
|
52
59
|
JSI_PROPERTY_SETTER(onPositionChangedInterval) {
|
|
53
60
|
auto sourceNode =
|
|
54
61
|
std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
|
|
@@ -17,11 +17,10 @@ AudioParam::AudioParam(
|
|
|
17
17
|
minValue_(minValue),
|
|
18
18
|
maxValue_(maxValue),
|
|
19
19
|
context_(context),
|
|
20
|
-
audioBus_(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
context->getSampleRate())) {
|
|
20
|
+
audioBus_(std::make_shared<AudioBus>(
|
|
21
|
+
RENDER_QUANTUM_SIZE,
|
|
22
|
+
1,
|
|
23
|
+
context->getSampleRate())) {
|
|
25
24
|
startTime_ = 0;
|
|
26
25
|
endTime_ = 0;
|
|
27
26
|
startValue_ = value_;
|
|
@@ -36,8 +36,10 @@ void AudioRecorder::invokeOnAudioReadyCallback(
|
|
|
36
36
|
body.insert({"numFrames", numFrames});
|
|
37
37
|
body.insert({"when", when});
|
|
38
38
|
|
|
39
|
-
audioEventHandlerRegistry_
|
|
40
|
-
|
|
39
|
+
if (audioEventHandlerRegistry_ != nullptr) {
|
|
40
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
41
|
+
"audioReady", onAudioReadyCallbackId_, body);
|
|
42
|
+
}
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
void AudioRecorder::sendRemainingData() {
|
|
@@ -23,6 +23,15 @@ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(BaseAudioContext *context)
|
|
|
23
23
|
std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
AudioBufferBaseSourceNode::~AudioBufferBaseSourceNode() {
|
|
27
|
+
if (onPositionChangedCallbackId_ != 0 &&
|
|
28
|
+
context_->audioEventHandlerRegistry_ != nullptr) {
|
|
29
|
+
context_->audioEventHandlerRegistry_->unregisterHandler(
|
|
30
|
+
"positionChanged", onPositionChangedCallbackId_);
|
|
31
|
+
onPositionChangedCallbackId_ = 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
26
35
|
std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getDetuneParam() const {
|
|
27
36
|
return detuneParam_;
|
|
28
37
|
}
|
|
@@ -42,13 +51,18 @@ void AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) {
|
|
|
42
51
|
context_->getSampleRate() * static_cast<float>(interval) / 1000);
|
|
43
52
|
}
|
|
44
53
|
|
|
54
|
+
int AudioBufferBaseSourceNode::getOnPositionChangedInterval() {
|
|
55
|
+
return onPositionChangedInterval_;
|
|
56
|
+
}
|
|
57
|
+
|
|
45
58
|
std::mutex &AudioBufferBaseSourceNode::getBufferLock() {
|
|
46
59
|
return bufferLock_;
|
|
47
60
|
}
|
|
48
61
|
|
|
49
62
|
void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() {
|
|
50
63
|
if (onPositionChangedCallbackId_ != 0 &&
|
|
51
|
-
onPositionChangedTime_ > onPositionChangedInterval_
|
|
64
|
+
onPositionChangedTime_ > onPositionChangedInterval_ &&
|
|
65
|
+
context_->audioEventHandlerRegistry_ != nullptr) {
|
|
52
66
|
std::unordered_map<std::string, EventValue> body = {
|
|
53
67
|
{"value", getCurrentPosition()}};
|
|
54
68
|
|
|
@@ -13,12 +13,14 @@ class AudioParam;
|
|
|
13
13
|
class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
|
|
14
14
|
public:
|
|
15
15
|
explicit AudioBufferBaseSourceNode(BaseAudioContext *context);
|
|
16
|
+
virtual ~AudioBufferBaseSourceNode();
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
19
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
void setOnPositionChangedCallbackId(uint64_t callbackId);
|
|
22
|
+
void setOnPositionChangedInterval(int interval);
|
|
23
|
+
[[nodiscard]] int getOnPositionChangedInterval();
|
|
22
24
|
|
|
23
25
|
protected:
|
|
24
26
|
std::mutex bufferLock_;
|
|
@@ -16,6 +16,15 @@ AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
|
|
|
16
16
|
numberOfInputs_ = 0;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
AudioScheduledSourceNode::~AudioScheduledSourceNode() {
|
|
20
|
+
if (onEndedCallbackId_ != 0 &&
|
|
21
|
+
context_->audioEventHandlerRegistry_ != nullptr) {
|
|
22
|
+
context_->audioEventHandlerRegistry_->unregisterHandler(
|
|
23
|
+
"ended", onEndedCallbackId_);
|
|
24
|
+
onEndedCallbackId_ = 0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
19
28
|
void AudioScheduledSourceNode::start(double when) {
|
|
20
29
|
playbackState_ = PlaybackState::SCHEDULED;
|
|
21
30
|
startTime_ = when;
|
|
@@ -149,8 +158,10 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
149
158
|
void AudioScheduledSourceNode::disable() {
|
|
150
159
|
AudioNode::disable();
|
|
151
160
|
|
|
152
|
-
context_->audioEventHandlerRegistry_
|
|
153
|
-
|
|
161
|
+
if (context_->audioEventHandlerRegistry_ != nullptr) {
|
|
162
|
+
context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
163
|
+
"ended", onEndedCallbackId_, {});
|
|
164
|
+
}
|
|
154
165
|
}
|
|
155
166
|
|
|
156
167
|
void AudioScheduledSourceNode::handleStopScheduled() {
|
|
@@ -27,6 +27,7 @@ class AudioScheduledSourceNode : public AudioNode {
|
|
|
27
27
|
// FINISHED: The node has finished playing.
|
|
28
28
|
enum class PlaybackState { UNSCHEDULED, SCHEDULED, PLAYING, STOP_SCHEDULED, FINISHED };
|
|
29
29
|
explicit AudioScheduledSourceNode(BaseAudioContext *context);
|
|
30
|
+
virtual ~AudioScheduledSourceNode();
|
|
30
31
|
|
|
31
32
|
void start(double when);
|
|
32
33
|
virtual void stop(double when);
|
|
@@ -24,57 +24,107 @@ AudioEventHandlerRegistry::~AudioEventHandlerRegistry() {
|
|
|
24
24
|
uint64_t AudioEventHandlerRegistry::registerHandler(
|
|
25
25
|
const std::string &eventName,
|
|
26
26
|
const std::shared_ptr<jsi::Function> &handler) {
|
|
27
|
-
|
|
27
|
+
uint64_t listenerId = listenerIdCounter_++;
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
if (callInvoker_ == nullptr || runtime_ == nullptr) {
|
|
30
|
+
// If callInvoker or runtime is not valid, we cannot register the handler
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Modify the eventHandlers_ map only on the main RN thread
|
|
35
|
+
callInvoker_->invokeAsync([this, eventName, listenerId, handler]() {
|
|
36
|
+
eventHandlers_[eventName][listenerId] = handler;
|
|
37
|
+
});
|
|
30
38
|
|
|
31
|
-
return
|
|
39
|
+
return listenerId;
|
|
32
40
|
}
|
|
33
41
|
|
|
34
42
|
void AudioEventHandlerRegistry::unregisterHandler(
|
|
35
43
|
const std::string &eventName,
|
|
36
44
|
uint64_t listenerId) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
45
|
+
if (callInvoker_ == nullptr || runtime_ == nullptr) {
|
|
46
|
+
// If callInvoker or runtime is not valid, we cannot unregister the handler
|
|
47
|
+
return;
|
|
40
48
|
}
|
|
49
|
+
|
|
50
|
+
callInvoker_->invokeAsync([this, eventName, listenerId]() {
|
|
51
|
+
auto it = eventHandlers_.find(eventName);
|
|
52
|
+
|
|
53
|
+
if (it == eventHandlers_.end()) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
auto &handlersMap = it->second;
|
|
58
|
+
auto handlerIt = handlersMap.find(listenerId);
|
|
59
|
+
|
|
60
|
+
if (handlerIt != handlersMap.end()) {
|
|
61
|
+
handlersMap.erase(handlerIt);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
41
64
|
}
|
|
42
65
|
|
|
43
66
|
void AudioEventHandlerRegistry::invokeHandlerWithEventBody(
|
|
44
67
|
const std::string &eventName,
|
|
45
68
|
const std::unordered_map<std::string, EventValue> &body) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
69
|
+
// callInvoker_ and runtime_ must be valid to invoke handlers
|
|
70
|
+
// this might happen when react-native is reloaded or the app is closed
|
|
71
|
+
if (callInvoker_ == nullptr || runtime_ == nullptr) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Do any logic regarding triggering the event on the main RN thread
|
|
76
|
+
callInvoker_->invokeAsync([this, eventName, body]() {
|
|
77
|
+
auto it = eventHandlers_.find(eventName);
|
|
78
|
+
|
|
79
|
+
if (it == eventHandlers_.end()) {
|
|
80
|
+
// If the event name is not registered, we can skip invoking handlers
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
auto handlersMap = it->second;
|
|
85
|
+
|
|
86
|
+
for (const auto &pair : handlersMap) {
|
|
49
87
|
auto handler = pair.second;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
88
|
+
|
|
89
|
+
if (!handler || !handler->isFunction(*runtime_)) {
|
|
90
|
+
// If the handler is not valid, we can skip it
|
|
91
|
+
continue;
|
|
55
92
|
}
|
|
93
|
+
|
|
94
|
+
auto eventObject = createEventObject(body);
|
|
95
|
+
handler->call(*runtime_, eventObject);
|
|
56
96
|
}
|
|
57
|
-
}
|
|
97
|
+
});
|
|
58
98
|
}
|
|
59
99
|
|
|
60
100
|
void AudioEventHandlerRegistry::invokeHandlerWithEventBody(
|
|
61
101
|
const std::string &eventName,
|
|
62
102
|
uint64_t listenerId,
|
|
63
103
|
const std::unordered_map<std::string, EventValue> &body) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (handlerIt != handlersMap.end()) {
|
|
69
|
-
auto handler = handlerIt->second;
|
|
70
|
-
if (handler) {
|
|
71
|
-
callInvoker_->invokeAsync([this, handler, body]() {
|
|
72
|
-
auto eventObject = createEventObject(body);
|
|
73
|
-
handler->call(*runtime_, eventObject);
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
104
|
+
// callInvoker_ and runtime_ must be valid to invoke handlers
|
|
105
|
+
// this might happen when react-native is reloaded or the app is closed
|
|
106
|
+
if (callInvoker_ == nullptr || runtime_ == nullptr) {
|
|
107
|
+
return;
|
|
77
108
|
}
|
|
109
|
+
|
|
110
|
+
callInvoker_->invokeAsync([this, eventName, listenerId, body]() {
|
|
111
|
+
auto it = eventHandlers_.find(eventName);
|
|
112
|
+
|
|
113
|
+
if (it == eventHandlers_.end()) {
|
|
114
|
+
// If the event name is not registered, we can skip invoking handlers
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
auto handlerIt = it->second.find(listenerId);
|
|
119
|
+
|
|
120
|
+
if (handlerIt == it->second.end()) {
|
|
121
|
+
// If the listener ID is not registered, we can skip invoking handlers
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
auto eventObject = createEventObject(body);
|
|
126
|
+
handlerIt->second->call(*runtime_, eventObject);
|
|
127
|
+
});
|
|
78
128
|
}
|
|
79
129
|
|
|
80
130
|
jsi::Object AudioEventHandlerRegistry::createEventObject(
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
#include <array>
|
|
8
8
|
#include <string>
|
|
9
9
|
#include <variant>
|
|
10
|
+
#include <atomic>
|
|
10
11
|
|
|
11
12
|
namespace audioapi {
|
|
12
13
|
using namespace facebook;
|
|
@@ -27,6 +28,8 @@ class AudioEventHandlerRegistry {
|
|
|
27
28
|
void invokeHandlerWithEventBody(const std::string &eventName, uint64_t listenerId, const std::unordered_map<std::string, EventValue> &body);
|
|
28
29
|
|
|
29
30
|
private:
|
|
31
|
+
std::atomic<uint64_t> listenerIdCounter_{1}; // Atomic counter for listener IDs
|
|
32
|
+
|
|
30
33
|
std::shared_ptr<react::CallInvoker> callInvoker_;
|
|
31
34
|
jsi::Runtime *runtime_;
|
|
32
35
|
std::unordered_map<std::string, std::unordered_map<uint64_t, std::shared_ptr<jsi::Function>>> eventHandlers_;
|
|
@@ -85,9 +85,8 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
|
|
|
85
85
|
return [self.audioSessionManager getDevicePreferredSampleRate];
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
RCT_EXPORT_METHOD(
|
|
89
|
-
|
|
90
|
-
reject)
|
|
88
|
+
RCT_EXPORT_METHOD(setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)
|
|
89
|
+
resolve reject : (RCTPromiseRejectBlock)reject)
|
|
91
90
|
{
|
|
92
91
|
if ([self.audioSessionManager setActive:enabled]) {
|
|
93
92
|
resolve(@"true");
|
|
@@ -97,9 +96,8 @@ RCT_EXPORT_METHOD(
|
|
|
97
96
|
resolve(@"false");
|
|
98
97
|
}
|
|
99
98
|
|
|
100
|
-
RCT_EXPORT_METHOD(
|
|
101
|
-
|
|
102
|
-
options allowHaptics : (BOOL)allowHaptics)
|
|
99
|
+
RCT_EXPORT_METHOD(setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
|
|
100
|
+
options allowHaptics : (BOOL)allowHaptics)
|
|
103
101
|
{
|
|
104
102
|
[self.audioSessionManager setAudioSessionOptions:category mode:mode options:options allowHaptics:allowHaptics];
|
|
105
103
|
}
|
|
@@ -129,15 +127,14 @@ RCT_EXPORT_METHOD(observeVolumeChanges : (BOOL)enabled)
|
|
|
129
127
|
[self.notificationManager observeVolumeChanges:(BOOL)enabled];
|
|
130
128
|
}
|
|
131
129
|
|
|
132
|
-
RCT_EXPORT_METHOD(
|
|
133
|
-
|
|
134
|
-
reject)
|
|
130
|
+
RCT_EXPORT_METHOD(requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
131
|
+
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
135
132
|
{
|
|
136
133
|
[self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
|
|
137
134
|
}
|
|
138
135
|
|
|
139
|
-
RCT_EXPORT_METHOD(
|
|
140
|
-
|
|
136
|
+
RCT_EXPORT_METHOD(checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
137
|
+
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
141
138
|
{
|
|
142
139
|
[self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
|
|
143
140
|
}
|
|
@@ -177,7 +174,9 @@ RCT_EXPORT_METHOD(
|
|
|
177
174
|
}
|
|
178
175
|
}
|
|
179
176
|
|
|
180
|
-
_eventHandler
|
|
177
|
+
if (_eventHandler != nullptr) {
|
|
178
|
+
_eventHandler->invokeHandlerWithEventBody(name, body);
|
|
179
|
+
}
|
|
181
180
|
}
|
|
182
181
|
|
|
183
182
|
@end
|
|
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
|
|
8
7
|
var _AudioParam = _interopRequireDefault(require("./AudioParam"));
|
|
8
|
+
var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
|
|
9
9
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
10
|
class AudioBufferBaseSourceNode extends _AudioScheduledSourceNode.default {
|
|
11
11
|
constructor(context, node) {
|
|
@@ -13,20 +13,24 @@ class AudioBufferBaseSourceNode extends _AudioScheduledSourceNode.default {
|
|
|
13
13
|
this.detune = new _AudioParam.default(node.detune, context);
|
|
14
14
|
this.playbackRate = new _AudioParam.default(node.playbackRate, context);
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
get onPositionChanged() {
|
|
17
|
+
return this.positionChangedCallback;
|
|
18
|
+
}
|
|
18
19
|
set onPositionChanged(callback) {
|
|
19
20
|
if (!callback) {
|
|
21
|
+
this.node.onPositionChanged = '0';
|
|
20
22
|
this.positionChangedSubscription?.remove();
|
|
21
23
|
this.positionChangedSubscription = undefined;
|
|
22
|
-
this.
|
|
24
|
+
this.positionChangedCallback = undefined;
|
|
23
25
|
return;
|
|
24
26
|
}
|
|
27
|
+
this.positionChangedCallback = callback;
|
|
25
28
|
this.positionChangedSubscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
26
29
|
this.node.onPositionChanged = this.positionChangedSubscription.subscriptionId;
|
|
27
30
|
}
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
get onPositionChangedInterval() {
|
|
32
|
+
return this.node.onPositionChangedInterval;
|
|
33
|
+
}
|
|
30
34
|
set onPositionChangedInterval(value) {
|
|
31
35
|
this.node.onPositionChangedInterval = value;
|
|
32
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_AudioParam","_interopRequireDefault","require","_AudioScheduledSourceNode","e","__esModule","default","AudioBufferBaseSourceNode","AudioScheduledSourceNode","constructor","context","node","detune","AudioParam","playbackRate","onPositionChanged","positionChangedCallback","callback","positionChangedSubscription","remove","undefined","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferBaseSourceNode.ts"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAKA,IAAAC,yBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnD,MAAMG,yBAAyB,SAASC,iCAAwB,CAAC;EAM9EC,WAAWA,CAACC,OAAyB,EAAEC,IAAgC,EAAE;IACvE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IAEpB,IAAI,CAACC,MAAM,GAAG,IAAIC,mBAAU,CAACF,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;IAClD,IAAI,CAACI,YAAY,GAAG,IAAID,mBAAU,CAACF,IAAI,CAACG,YAAY,EAAEJ,OAAO,CAAC;EAChE;EAEA,IAAWK,iBAAiBA,CAAA,EAEd;IACZ,OAAO,IAAI,CAACC,uBAAuB;EACrC;EAEA,IAAWD,iBAAiBA,CAC1BE,QAAsD,EACtD;IACA,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACN,IAAI,CAAgCI,iBAAiB,GAAG,GAAG;MACjE,IAAI,CAACG,2BAA2B,EAAEC,MAAM,CAAC,CAAC;MAC1C,IAAI,CAACD,2BAA2B,GAAGE,SAAS;MAC5C,IAAI,CAACJ,uBAAuB,GAAGI,SAAS;MAExC;IACF;IAEA,IAAI,CAACJ,uBAAuB,GAAGC,QAAQ;IACvC,IAAI,CAACC,2BAA2B,GAC9B,IAAI,CAACG,iBAAiB,CAACC,qBAAqB,CAAC,iBAAiB,EAAEL,QAAQ,CAAC;IAE1E,IAAI,CAACN,IAAI,CAAgCI,iBAAiB,GACzD,IAAI,CAACG,2BAA2B,CAACK,cAAc;EACnD;EAEA,IAAWC,yBAAyBA,CAAA,EAAW;IAC7C,OAAQ,IAAI,CAACb,IAAI,CAAgCa,yBAAyB;EAC5E;EAEA,IAAWA,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACd,IAAI,CAAgCa,yBAAyB,GAAGC,KAAK;EAC7E;AACF;AAACC,OAAA,CAAApB,OAAA,GAAAC,yBAAA","ignoreList":[]}
|
|
@@ -30,14 +30,18 @@ class AudioScheduledSourceNode extends _AudioNode.default {
|
|
|
30
30
|
}
|
|
31
31
|
this.node.stop(when);
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
get onended() {
|
|
34
|
+
return this.onEndedCallback;
|
|
35
|
+
}
|
|
35
36
|
set onended(callback) {
|
|
36
37
|
if (!callback) {
|
|
38
|
+
this.node.onended = '0';
|
|
37
39
|
this.onendedSubscription?.remove();
|
|
38
40
|
this.onendedSubscription = undefined;
|
|
41
|
+
this.onEndedCallback = undefined;
|
|
39
42
|
return;
|
|
40
43
|
}
|
|
44
|
+
this.onEndedCallback = callback;
|
|
41
45
|
this.onendedSubscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
|
|
42
46
|
this.node.onended = this.onendedSubscription.subscriptionId;
|
|
43
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","_errors","_events","e","__esModule","default","AudioScheduledSourceNode","AudioNode","hasBeenStarted","audioEventEmitter","AudioEventEmitter","global","start","when","RangeError","InvalidStateError","node","stop","onended","callback","onendedSubscription","remove","undefined","addAudioEventListener","subscriptionId","exports"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAAsE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvD,MAAMG,wBAAwB,SAASC,kBAAS,CAAC;EACpDC,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIC,yBAAiB,CAC1DC,MAAM,CAACD,iBACT,CAAC;
|
|
1
|
+
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","_errors","_events","e","__esModule","default","AudioScheduledSourceNode","AudioNode","hasBeenStarted","audioEventEmitter","AudioEventEmitter","global","start","when","RangeError","InvalidStateError","node","stop","onended","onEndedCallback","callback","onendedSubscription","remove","undefined","addAudioEventListener","subscriptionId","exports"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAAsE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvD,MAAMG,wBAAwB,SAASC,kBAAS,CAAC;EACpDC,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIC,yBAAiB,CAC1DC,MAAM,CAACD,iBACT,CAAC;EAKME,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAQ;IACnC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIC,kBAAU,CAClB,8CAA8CD,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,IAAI,CAACL,cAAc,EAAE;MACvB,MAAM,IAAIO,yBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACP,cAAc,GAAG,IAAI;IACzB,IAAI,CAACQ,IAAI,CAA+BJ,KAAK,CAACC,IAAI,CAAC;EACtD;EAEOI,IAAIA,CAACJ,IAAY,GAAG,CAAC,EAAQ;IAClC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIC,kBAAU,CAClB,8CAA8CD,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,CAAC,IAAI,CAACL,cAAc,EAAE;MACxB,MAAM,IAAIO,yBAAiB,CACzB,8CACF,CAAC;IACH;IAEC,IAAI,CAACC,IAAI,CAA+BC,IAAI,CAACJ,IAAI,CAAC;EACrD;EAEA,IAAWK,OAAOA,CAAA,EAAkD;IAClE,OAAO,IAAI,CAACC,eAAe;EAC7B;EAEA,IAAWD,OAAOA,CAACE,QAAkD,EAAE;IACrE,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAAG,GAAG;MACtD,IAAI,CAACG,mBAAmB,EAAEC,MAAM,CAAC,CAAC;MAClC,IAAI,CAACD,mBAAmB,GAAGE,SAAS;MACpC,IAAI,CAACJ,eAAe,GAAGI,SAAS;MAChC;IACF;IAEA,IAAI,CAACJ,eAAe,GAAGC,QAAQ;IAC/B,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACZ,iBAAiB,CAACe,qBAAqB,CACrE,OAAO,EACPJ,QACF,CAAC;IAEA,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAC9C,IAAI,CAACG,mBAAmB,CAACI,cAAc;EAC3C;AACF;AAACC,OAAA,CAAArB,OAAA,GAAAC,wBAAA","ignoreList":[]}
|
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import AudioScheduledSourceNode from "./AudioScheduledSourceNode.js";
|
|
4
3
|
import AudioParam from "./AudioParam.js";
|
|
4
|
+
import AudioScheduledSourceNode from "./AudioScheduledSourceNode.js";
|
|
5
5
|
export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
|
|
6
6
|
constructor(context, node) {
|
|
7
7
|
super(context, node);
|
|
8
8
|
this.detune = new AudioParam(node.detune, context);
|
|
9
9
|
this.playbackRate = new AudioParam(node.playbackRate, context);
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
get onPositionChanged() {
|
|
12
|
+
return this.positionChangedCallback;
|
|
13
|
+
}
|
|
13
14
|
set onPositionChanged(callback) {
|
|
14
15
|
if (!callback) {
|
|
16
|
+
this.node.onPositionChanged = '0';
|
|
15
17
|
this.positionChangedSubscription?.remove();
|
|
16
18
|
this.positionChangedSubscription = undefined;
|
|
17
|
-
this.
|
|
19
|
+
this.positionChangedCallback = undefined;
|
|
18
20
|
return;
|
|
19
21
|
}
|
|
22
|
+
this.positionChangedCallback = callback;
|
|
20
23
|
this.positionChangedSubscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
21
24
|
this.node.onPositionChanged = this.positionChangedSubscription.subscriptionId;
|
|
22
25
|
}
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
get onPositionChangedInterval() {
|
|
27
|
+
return this.node.onPositionChangedInterval;
|
|
28
|
+
}
|
|
25
29
|
set onPositionChangedInterval(value) {
|
|
26
30
|
this.node.onPositionChangedInterval = value;
|
|
27
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["AudioParam","AudioScheduledSourceNode","AudioBufferBaseSourceNode","constructor","context","node","detune","playbackRate","onPositionChanged","positionChangedCallback","callback","positionChangedSubscription","remove","undefined","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value"],"sourceRoot":"../../../src","sources":["core/AudioBufferBaseSourceNode.ts"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,iBAAc;AAKrC,OAAOC,wBAAwB,MAAM,+BAA4B;AAEjE,eAAe,MAAMC,yBAAyB,SAASD,wBAAwB,CAAC;EAM9EE,WAAWA,CAACC,OAAyB,EAAEC,IAAgC,EAAE;IACvE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IAEpB,IAAI,CAACC,MAAM,GAAG,IAAIN,UAAU,CAACK,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;IAClD,IAAI,CAACG,YAAY,GAAG,IAAIP,UAAU,CAACK,IAAI,CAACE,YAAY,EAAEH,OAAO,CAAC;EAChE;EAEA,IAAWI,iBAAiBA,CAAA,EAEd;IACZ,OAAO,IAAI,CAACC,uBAAuB;EACrC;EAEA,IAAWD,iBAAiBA,CAC1BE,QAAsD,EACtD;IACA,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACL,IAAI,CAAgCG,iBAAiB,GAAG,GAAG;MACjE,IAAI,CAACG,2BAA2B,EAAEC,MAAM,CAAC,CAAC;MAC1C,IAAI,CAACD,2BAA2B,GAAGE,SAAS;MAC5C,IAAI,CAACJ,uBAAuB,GAAGI,SAAS;MAExC;IACF;IAEA,IAAI,CAACJ,uBAAuB,GAAGC,QAAQ;IACvC,IAAI,CAACC,2BAA2B,GAC9B,IAAI,CAACG,iBAAiB,CAACC,qBAAqB,CAAC,iBAAiB,EAAEL,QAAQ,CAAC;IAE1E,IAAI,CAACL,IAAI,CAAgCG,iBAAiB,GACzD,IAAI,CAACG,2BAA2B,CAACK,cAAc;EACnD;EAEA,IAAWC,yBAAyBA,CAAA,EAAW;IAC7C,OAAQ,IAAI,CAACZ,IAAI,CAAgCY,yBAAyB;EAC5E;EAEA,IAAWA,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACb,IAAI,CAAgCY,yBAAyB,GAAGC,KAAK;EAC7E;AACF","ignoreList":[]}
|
|
@@ -25,14 +25,18 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
25
25
|
}
|
|
26
26
|
this.node.stop(when);
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
get onended() {
|
|
29
|
+
return this.onEndedCallback;
|
|
30
|
+
}
|
|
30
31
|
set onended(callback) {
|
|
31
32
|
if (!callback) {
|
|
33
|
+
this.node.onended = '0';
|
|
32
34
|
this.onendedSubscription?.remove();
|
|
33
35
|
this.onendedSubscription = undefined;
|
|
36
|
+
this.onEndedCallback = undefined;
|
|
34
37
|
return;
|
|
35
38
|
}
|
|
39
|
+
this.onEndedCallback = callback;
|
|
36
40
|
this.onendedSubscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
|
|
37
41
|
this.node.onended = this.onendedSubscription.subscriptionId;
|
|
38
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AudioNode","InvalidStateError","RangeError","AudioEventEmitter","AudioScheduledSourceNode","hasBeenStarted","audioEventEmitter","global","start","when","node","stop","onended","callback","onendedSubscription","remove","undefined","addAudioEventListener","subscriptionId"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;AACA,OAAOA,SAAS,MAAM,gBAAa;AACnC,SAASC,iBAAiB,EAAEC,UAAU,QAAQ,oBAAW;AAEzD,SAASC,iBAAiB,QAAgC,oBAAW;AAErE,eAAe,MAAMC,wBAAwB,SAASJ,SAAS,CAAC;EACpDK,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIH,iBAAiB,CAC1DI,MAAM,CAACJ,iBACT,CAAC;
|
|
1
|
+
{"version":3,"names":["AudioNode","InvalidStateError","RangeError","AudioEventEmitter","AudioScheduledSourceNode","hasBeenStarted","audioEventEmitter","global","start","when","node","stop","onended","onEndedCallback","callback","onendedSubscription","remove","undefined","addAudioEventListener","subscriptionId"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;AACA,OAAOA,SAAS,MAAM,gBAAa;AACnC,SAASC,iBAAiB,EAAEC,UAAU,QAAQ,oBAAW;AAEzD,SAASC,iBAAiB,QAAgC,oBAAW;AAErE,eAAe,MAAMC,wBAAwB,SAASJ,SAAS,CAAC;EACpDK,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIH,iBAAiB,CAC1DI,MAAM,CAACJ,iBACT,CAAC;EAKMK,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAQ;IACnC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIP,UAAU,CAClB,8CAA8CO,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,IAAI,CAACJ,cAAc,EAAE;MACvB,MAAM,IAAIJ,iBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACI,cAAc,GAAG,IAAI;IACzB,IAAI,CAACK,IAAI,CAA+BF,KAAK,CAACC,IAAI,CAAC;EACtD;EAEOE,IAAIA,CAACF,IAAY,GAAG,CAAC,EAAQ;IAClC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIP,UAAU,CAClB,8CAA8CO,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,CAAC,IAAI,CAACJ,cAAc,EAAE;MACxB,MAAM,IAAIJ,iBAAiB,CACzB,8CACF,CAAC;IACH;IAEC,IAAI,CAACS,IAAI,CAA+BC,IAAI,CAACF,IAAI,CAAC;EACrD;EAEA,IAAWG,OAAOA,CAAA,EAAkD;IAClE,OAAO,IAAI,CAACC,eAAe;EAC7B;EAEA,IAAWD,OAAOA,CAACE,QAAkD,EAAE;IACrE,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAAG,GAAG;MACtD,IAAI,CAACG,mBAAmB,EAAEC,MAAM,CAAC,CAAC;MAClC,IAAI,CAACD,mBAAmB,GAAGE,SAAS;MACpC,IAAI,CAACJ,eAAe,GAAGI,SAAS;MAChC;IACF;IAEA,IAAI,CAACJ,eAAe,GAAGC,QAAQ;IAC/B,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACT,iBAAiB,CAACY,qBAAqB,CACrE,OAAO,EACPJ,QACF,CAAC;IAEA,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAC9C,IAAI,CAACG,mBAAmB,CAACI,cAAc;EAC3C;AACF","ignoreList":[]}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { IAudioBufferBaseSourceNode } from '../interfaces';
|
|
2
|
-
import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
3
|
-
import BaseAudioContext from './BaseAudioContext';
|
|
4
1
|
import AudioParam from './AudioParam';
|
|
2
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
5
3
|
import { EventTypeWithValue } from '../events/types';
|
|
4
|
+
import { IAudioBufferBaseSourceNode } from '../interfaces';
|
|
5
|
+
import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
6
6
|
export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
|
|
7
7
|
readonly playbackRate: AudioParam;
|
|
8
8
|
readonly detune: AudioParam;
|
|
9
9
|
private positionChangedSubscription?;
|
|
10
|
+
private positionChangedCallback?;
|
|
10
11
|
constructor(context: BaseAudioContext, node: IAudioBufferBaseSourceNode);
|
|
12
|
+
get onPositionChanged(): ((event: EventTypeWithValue) => void) | undefined;
|
|
11
13
|
set onPositionChanged(callback: ((event: EventTypeWithValue) => void) | null);
|
|
14
|
+
get onPositionChangedInterval(): number;
|
|
12
15
|
set onPositionChangedInterval(value: number);
|
|
13
16
|
}
|
|
14
17
|
//# sourceMappingURL=AudioBufferBaseSourceNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioBufferBaseSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioBufferBaseSourceNode.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AudioBufferBaseSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioBufferBaseSourceNode.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAElE,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,wBAAwB;IAC7E,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAyB;IAC7D,OAAO,CAAC,uBAAuB,CAAC,CAAsC;gBAE1D,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,0BAA0B;IAOvE,IAAW,iBAAiB,IACxB,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC,GACrC,SAAS,CAEZ;IAED,IAAW,iBAAiB,CAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC,GAAG,IAAI,EAiBvD;IAED,IAAW,yBAAyB,IAAI,MAAM,CAE7C;IAED,IAAW,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAEjD;CACF"}
|
|
@@ -5,8 +5,10 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
5
5
|
protected hasBeenStarted: boolean;
|
|
6
6
|
protected readonly audioEventEmitter: AudioEventEmitter;
|
|
7
7
|
private onendedSubscription?;
|
|
8
|
+
private onEndedCallback?;
|
|
8
9
|
start(when?: number): void;
|
|
9
10
|
stop(when?: number): void;
|
|
11
|
+
get onended(): ((event: EventEmptyType) => void) | undefined;
|
|
10
12
|
set onended(callback: ((event: EventEmptyType) => void) | null);
|
|
11
13
|
}
|
|
12
14
|
//# sourceMappingURL=AudioScheduledSourceNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioScheduledSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioScheduledSourceNode.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAA0B,MAAM,WAAW,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC7D,SAAS,CAAC,cAAc,EAAE,OAAO,CAAS;IAC1C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,oBAElC;IAEF,OAAO,CAAC,mBAAmB,CAAC,CAAyB;
|
|
1
|
+
{"version":3,"file":"AudioScheduledSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioScheduledSourceNode.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAA0B,MAAM,WAAW,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC7D,SAAS,CAAC,cAAc,EAAE,OAAO,CAAS;IAC1C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,oBAElC;IAEF,OAAO,CAAC,mBAAmB,CAAC,CAAyB;IACrD,OAAO,CAAC,eAAe,CAAC,CAAkC;IAEnD,KAAK,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAe7B,IAAI,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAgBnC,IAAW,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAElE;IAED,IAAW,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,IAAI,EAiBpE;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5-rc.1",
|
|
4
4
|
"description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
|
|
5
5
|
"bin": {
|
|
6
6
|
"setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { IAudioBufferBaseSourceNode } from '../interfaces';
|
|
2
|
-
import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
3
|
-
import BaseAudioContext from './BaseAudioContext';
|
|
4
1
|
import AudioParam from './AudioParam';
|
|
5
|
-
import
|
|
2
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
6
3
|
import { AudioEventSubscription } from '../events';
|
|
4
|
+
import { EventTypeWithValue } from '../events/types';
|
|
5
|
+
import { IAudioBufferBaseSourceNode } from '../interfaces';
|
|
6
|
+
import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
7
7
|
|
|
8
8
|
export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
|
|
9
9
|
readonly playbackRate: AudioParam;
|
|
10
10
|
readonly detune: AudioParam;
|
|
11
11
|
private positionChangedSubscription?: AudioEventSubscription;
|
|
12
|
+
private positionChangedCallback?: (event: EventTypeWithValue) => void;
|
|
12
13
|
|
|
13
14
|
constructor(context: BaseAudioContext, node: IAudioBufferBaseSourceNode) {
|
|
14
15
|
super(context, node);
|
|
@@ -17,16 +18,25 @@ export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode
|
|
|
17
18
|
this.playbackRate = new AudioParam(node.playbackRate, context);
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
public get onPositionChanged():
|
|
22
|
+
| ((event: EventTypeWithValue) => void)
|
|
23
|
+
| undefined {
|
|
24
|
+
return this.positionChangedCallback;
|
|
25
|
+
}
|
|
26
|
+
|
|
21
27
|
public set onPositionChanged(
|
|
22
28
|
callback: ((event: EventTypeWithValue) => void) | null
|
|
23
29
|
) {
|
|
24
30
|
if (!callback) {
|
|
31
|
+
(this.node as IAudioBufferBaseSourceNode).onPositionChanged = '0';
|
|
25
32
|
this.positionChangedSubscription?.remove();
|
|
26
33
|
this.positionChangedSubscription = undefined;
|
|
27
|
-
|
|
34
|
+
this.positionChangedCallback = undefined;
|
|
35
|
+
|
|
28
36
|
return;
|
|
29
37
|
}
|
|
38
|
+
|
|
39
|
+
this.positionChangedCallback = callback;
|
|
30
40
|
this.positionChangedSubscription =
|
|
31
41
|
this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
32
42
|
|
|
@@ -34,7 +44,10 @@ export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode
|
|
|
34
44
|
this.positionChangedSubscription.subscriptionId;
|
|
35
45
|
}
|
|
36
46
|
|
|
37
|
-
|
|
47
|
+
public get onPositionChangedInterval(): number {
|
|
48
|
+
return (this.node as IAudioBufferBaseSourceNode).onPositionChangedInterval;
|
|
49
|
+
}
|
|
50
|
+
|
|
38
51
|
public set onPositionChangedInterval(value: number) {
|
|
39
52
|
(this.node as IAudioBufferBaseSourceNode).onPositionChangedInterval = value;
|
|
40
53
|
}
|
|
@@ -11,6 +11,7 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
11
11
|
);
|
|
12
12
|
|
|
13
13
|
private onendedSubscription?: AudioEventSubscription;
|
|
14
|
+
private onEndedCallback?: (event: EventEmptyType) => void;
|
|
14
15
|
|
|
15
16
|
public start(when: number = 0): void {
|
|
16
17
|
if (when < 0) {
|
|
@@ -43,13 +44,20 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
43
44
|
(this.node as IAudioScheduledSourceNode).stop(when);
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
public get onended(): ((event: EventEmptyType) => void) | undefined {
|
|
48
|
+
return this.onEndedCallback;
|
|
49
|
+
}
|
|
50
|
+
|
|
47
51
|
public set onended(callback: ((event: EventEmptyType) => void) | null) {
|
|
48
52
|
if (!callback) {
|
|
53
|
+
(this.node as IAudioScheduledSourceNode).onended = '0';
|
|
49
54
|
this.onendedSubscription?.remove();
|
|
50
55
|
this.onendedSubscription = undefined;
|
|
56
|
+
this.onEndedCallback = undefined;
|
|
51
57
|
return;
|
|
52
58
|
}
|
|
59
|
+
|
|
60
|
+
this.onEndedCallback = callback;
|
|
53
61
|
this.onendedSubscription = this.audioEventEmitter.addAudioEventListener(
|
|
54
62
|
'ended',
|
|
55
63
|
callback
|