Skip to content

Commit 5ff24a1

Browse files
committed
feat: implemented all layers of the feature
implemented clear and deque methods for AudioBufferQueueSourceNode ensuring thread safety through mutex buffer lock
1 parent 913449b commit 5ff24a1

File tree

5 files changed

+65
-0
lines changed

5 files changed

+65
-0
lines changed

packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,27 @@ class AudioBufferQueueSourceNodeHostObject
4242

4343
return jsi::Value::undefined();
4444
}
45+
46+
JSI_HOST_FUNCTION(dequeueBuffer) {
47+
auto audioBufferQueueSourceNode =
48+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
49+
50+
auto audioBufferHostObject =
51+
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
52+
53+
audioBufferQueueSourceNode->dequeueBuffer(audioBufferHostObject->audioBuffer_);
54+
55+
return jsi::Value::undefined();
56+
}
57+
58+
JSI_HOST_FUNCTION(clearBuffers) {
59+
auto audioBufferQueueSourceNode =
60+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
61+
62+
audioBufferQueueSourceNode->clearBuffers();
63+
64+
return jsi::Value::undefined();
65+
}
4566
};
4667

4768
} // namespace audioapi

packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,37 @@ void AudioBufferQueueSourceNode::enqueueBuffer(
4444
isLastBuffer_ = isLastBuffer;
4545
}
4646

47+
void AudioBufferQueueSourceNode::dequeueBuffer(
48+
const std::shared_ptr<AudioBuffer> &buffer) {
49+
auto locker = Locker(getBufferLock());
50+
if (buffers_.empty()) {
51+
return;
52+
}
53+
54+
if (buffers_.front() == buffer) {
55+
buffers_.pop();
56+
vReadIndex_ = 0.0;
57+
return;
58+
}
59+
60+
// If the buffer is not at the front, we need to remove it from the queue.
61+
// And keep vReadIndex_ at the same position.
62+
std::queue<std::shared_ptr<AudioBuffer>> newQueue;
63+
while (!buffers_.empty()) {
64+
if (buffers_.front() != buffer) {
65+
newQueue.push(buffers_.front());
66+
}
67+
buffers_.pop();
68+
}
69+
std::swap(buffers_, newQueue);
70+
}
71+
72+
void AudioBufferQueueSourceNode::clearBuffers() {
73+
auto locker = Locker(getBufferLock());
74+
buffers_ = {};
75+
vReadIndex_ = 0.0;
76+
}
77+
4778
void AudioBufferQueueSourceNode::disable() {
4879
if (isPaused_) {
4980
playbackState_ = PlaybackState::UNSCHEDULED;

packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class AudioBufferQueueSourceNode : public AudioBufferBaseSourceNode {
2424
void pause();
2525

2626
void enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer, bool isLastBuffer);
27+
void dequeueBuffer(const std::shared_ptr<AudioBuffer> &buffer);
28+
void clearBuffers();
29+
2730
void disable() override;
2831

2932
protected:

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ export default class AudioBufferQueueSourceNode extends AudioBufferBaseSourceNod
1414
);
1515
}
1616

17+
public dequeueBuffer(buffer: AudioBuffer): void {
18+
(this.node as IAudioBufferQueueSourceNode).dequeueBuffer(buffer.buffer);
19+
}
20+
21+
public clearBuffers(): void {
22+
(this.node as IAudioBufferQueueSourceNode).clearBuffers();
23+
}
24+
1725
public override start(when: number = 0, offset?: number): void {
1826
if (when < 0) {
1927
throw new RangeError(

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ export interface IAudioBufferSourceNode extends IAudioBufferBaseSourceNode {
135135
export interface IAudioBufferQueueSourceNode
136136
extends IAudioBufferBaseSourceNode {
137137
enqueueBuffer: (audioBuffer: IAudioBuffer, isLastBuffer: boolean) => void;
138+
dequeueBuffer: (audioBuffer: IAudioBuffer) => void;
139+
clearBuffers: () => void;
138140
pause: () => void;
139141
}
140142

0 commit comments

Comments
 (0)