Skip to content

Commit 9dfc3ae

Browse files
author
Maciej Makowski
committed
feat: added error and null handling to AudioBufferSourceNode
1 parent 724d440 commit 9dfc3ae

File tree

7 files changed

+45
-12
lines changed

7 files changed

+45
-12
lines changed

packages/react-native-audio-api/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ std::vector<jsi::PropNameID> AudioBufferSourceNodeHostObject::getPropertyNames(
1818
AudioScheduledSourceNodeHostObject::getPropertyNames(runtime);
1919
propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "loop"));
2020
propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "buffer"));
21+
propertyNames.push_back(jsi::PropNameID::forAscii(runtime, "resetBuffer"));
2122
return propertyNames;
2223
}
2324

@@ -33,10 +34,14 @@ jsi::Value AudioBufferSourceNodeHostObject::get(
3334
}
3435

3536
if (propName == "buffer") {
36-
auto wrapper = getAudioBufferSourceNodeWrapperFromAudioNodeWrapper();
37-
auto buffer = wrapper->getBuffer();
38-
auto bufferHostObject = AudioBufferHostObject::createFromWrapper(buffer);
39-
return jsi::Object::createFromHostObject(runtime, bufferHostObject);
37+
try {
38+
auto wrapper = getAudioBufferSourceNodeWrapperFromAudioNodeWrapper();
39+
auto buffer = wrapper->getBuffer();
40+
auto bufferHostObject = AudioBufferHostObject::createFromWrapper(buffer);
41+
return jsi::Object::createFromHostObject(runtime, bufferHostObject);
42+
} catch (const std::runtime_error &e) {
43+
return jsi::Value::null();
44+
}
4045
}
4146

4247
return AudioScheduledSourceNodeHostObject::get(runtime, propNameId);
@@ -55,9 +60,13 @@ void AudioBufferSourceNodeHostObject::set(
5560
}
5661

5762
if (propName == "buffer") {
63+
auto wrapper = getAudioBufferSourceNodeWrapperFromAudioNodeWrapper();
64+
if (value.isNull()) {
65+
wrapper->resetBuffer();
66+
return;
67+
}
5868
auto bufferHostObject =
5969
value.getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
60-
auto wrapper = getAudioBufferSourceNodeWrapperFromAudioNodeWrapper();
6170
wrapper->setBuffer(bufferHostObject->wrapper_);
6271
return;
6372
}

packages/react-native-audio-api/common/cpp/core/AudioBufferSourceNode.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ void AudioBufferSourceNode::setBuffer(
3030
buffer_ = buffer->mix(channelCount_);
3131
}
3232

33+
void AudioBufferSourceNode::resetBuffer() {
34+
buffer_ = std::nullopt;
35+
}
36+
3337
bool AudioBufferSourceNode::processAudio(float *audioData, int32_t numFrames) {
3438
if (!isPlaying_ || !buffer_.has_value()) {
3539
return false;

packages/react-native-audio-api/common/cpp/core/AudioBufferSourceNode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class AudioBufferSourceNode : public AudioScheduledSourceNode {
1616
[[nodiscard]] std::shared_ptr<AudioBuffer> getBuffer() const;
1717
void setLoop(bool loop);
1818
void setBuffer(const std::shared_ptr<AudioBuffer> &buffer);
19+
void resetBuffer();
1920
[[nodiscard]] bool processAudio(float *audioData, int32_t numFrames) override;
2021

2122
private:

packages/react-native-audio-api/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,23 @@ void AudioBufferSourceNodeWrapper::setLoop(bool loop) {
2222
}
2323

2424
std::shared_ptr<AudioBufferWrapper> AudioBufferSourceNodeWrapper::getBuffer() {
25-
auto audioBufferSourceNode = getAudioBufferSourceNodeFromAudioNode();
26-
auto buffer = audioBufferSourceNode->getBuffer();
27-
return std::make_shared<AudioBufferWrapper>(buffer);
25+
try {
26+
auto audioBufferSourceNode = getAudioBufferSourceNodeFromAudioNode();
27+
auto buffer = audioBufferSourceNode->getBuffer();
28+
return std::make_shared<AudioBufferWrapper>(buffer);
29+
} catch (const std::runtime_error &e) {
30+
throw std::runtime_error("Buffer is not set");
31+
}
2832
}
2933

3034
void AudioBufferSourceNodeWrapper::setBuffer(
3135
const std::shared_ptr<AudioBufferWrapper> &buffer) {
3236
auto audioBufferSourceNode = getAudioBufferSourceNodeFromAudioNode();
3337
audioBufferSourceNode->setBuffer(buffer->audioBuffer_);
3438
}
39+
40+
void AudioBufferSourceNodeWrapper::resetBuffer() {
41+
auto audioBufferSourceNode = getAudioBufferSourceNodeFromAudioNode();
42+
audioBufferSourceNode->resetBuffer();
43+
}
3544
} // namespace audioapi

packages/react-native-audio-api/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class AudioBufferSourceNodeWrapper : public AudioScheduledSourceNodeWrapper {
1717
[[nodiscard]] bool getLoop();
1818
[[nodiscard]] std::shared_ptr<AudioBufferWrapper> getBuffer();
1919
void setBuffer(const std::shared_ptr<AudioBufferWrapper> &buffer);
20+
void resetBuffer();
2021

2122
private:
2223
std::shared_ptr<AudioBufferSourceNode>

packages/react-native-audio-api/src/core/AudioBufferSourceNode.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,20 @@ export default class AudioBufferSourceNode extends AudioScheduledSourceNode {
88
super(context, node);
99
}
1010

11-
public get buffer(): AudioBuffer {
12-
return new AudioBuffer((this.node as IAudioBufferSourceNode).buffer);
11+
public get buffer(): AudioBuffer | null {
12+
const buffer = (this.node as IAudioBufferSourceNode).buffer;
13+
if (!buffer) {
14+
return null;
15+
}
16+
return new AudioBuffer(buffer);
1317
}
1418

15-
public set buffer(buffer: AudioBuffer) {
19+
public set buffer(buffer: AudioBuffer | null) {
20+
if (!buffer) {
21+
(this.node as IAudioBufferSourceNode).buffer = null;
22+
return;
23+
}
24+
1625
(this.node as IAudioBufferSourceNode).buffer = buffer.buffer;
1726
}
1827

packages/react-native-audio-api/src/interfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export interface IOscillatorNode extends IAudioScheduledSourceNode {
6868
}
6969

7070
export interface IAudioBufferSourceNode extends IAudioScheduledSourceNode {
71-
buffer: IAudioBuffer;
71+
buffer: IAudioBuffer | null;
7272
loop: boolean;
7373
}
7474

0 commit comments

Comments
 (0)