File tree Expand file tree Collapse file tree 5 files changed +65
-0
lines changed
packages/react-native-audio-api Expand file tree Collapse file tree 5 files changed +65
-0
lines changed Original file line number Diff line number Diff line change @@ -42,6 +42,27 @@ class AudioBufferQueueSourceNodeHostObject
42
42
43
43
return jsi::Value::undefined ();
44
44
}
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
+ }
45
66
};
46
67
47
68
} // namespace audioapi
Original file line number Diff line number Diff line change @@ -44,6 +44,37 @@ void AudioBufferQueueSourceNode::enqueueBuffer(
44
44
isLastBuffer_ = isLastBuffer;
45
45
}
46
46
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
+
47
78
void AudioBufferQueueSourceNode::disable () {
48
79
if (isPaused_) {
49
80
playbackState_ = PlaybackState::UNSCHEDULED;
Original file line number Diff line number Diff line change @@ -24,6 +24,9 @@ class AudioBufferQueueSourceNode : public AudioBufferBaseSourceNode {
24
24
void pause ();
25
25
26
26
void enqueueBuffer (const std::shared_ptr<AudioBuffer> &buffer, bool isLastBuffer);
27
+ void dequeueBuffer (const std::shared_ptr<AudioBuffer> &buffer);
28
+ void clearBuffers ();
29
+
27
30
void disable () override ;
28
31
29
32
protected:
Original file line number Diff line number Diff line change @@ -14,6 +14,14 @@ export default class AudioBufferQueueSourceNode extends AudioBufferBaseSourceNod
14
14
) ;
15
15
}
16
16
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
+
17
25
public override start ( when : number = 0 , offset ?: number ) : void {
18
26
if ( when < 0 ) {
19
27
throw new RangeError (
Original file line number Diff line number Diff line change @@ -135,6 +135,8 @@ export interface IAudioBufferSourceNode extends IAudioBufferBaseSourceNode {
135
135
export interface IAudioBufferQueueSourceNode
136
136
extends IAudioBufferBaseSourceNode {
137
137
enqueueBuffer : ( audioBuffer : IAudioBuffer , isLastBuffer : boolean ) => void ;
138
+ dequeueBuffer : ( audioBuffer : IAudioBuffer ) => void ;
139
+ clearBuffers : ( ) => void ;
138
140
pause : ( ) => void ;
139
141
}
140
142
You can’t perform that action at this time.
0 commit comments