Skip to content

Commit 34dd7f7

Browse files
author
Maciej Makowski
committed
feat: added bufferId arg to enqueueBuffer and attached it to onended payload
1 parent 7af5caf commit 34dd7f7

9 files changed

+48
-22
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ class AudioBufferQueueSourceNodeHostObject
6464

6565
auto audioBufferHostObject =
6666
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
67+
int bufferId = args[1].asNumber();
68+
auto isLastBuffer = args[2].asBool();
6769

68-
auto isLastBuffer = args[1].asBool();
69-
70-
audioBufferQueueSourceNode->enqueueBuffer(audioBufferHostObject->audioBuffer_, isLastBuffer);
70+
audioBufferQueueSourceNode->enqueueBuffer(audioBufferHostObject->audioBuffer_, bufferId, isLastBuffer);
7171

7272
return jsi::Value::undefined();
7373
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,7 @@ class BaseAudioContext {
8181
std::shared_ptr<PeriodicWave> cachedSawtoothWave_ = nullptr;
8282
std::shared_ptr<PeriodicWave> cachedTriangleWave_ = nullptr;
8383

84-
protected:
85-
friend class AudioScheduledSourceNode;
86-
84+
public:
8785
std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
8886
};
8987

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

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>
55
#include <audioapi/core/utils/Locker.h>
66
#include <audioapi/dsp/AudioUtils.h>
7+
#include <audioapi/events/AudioEventHandlerRegistry.h>
78
#include <audioapi/utils/AudioArray.h>
89
#include <audioapi/utils/AudioBus.h>
910

@@ -52,15 +53,29 @@ void AudioBufferQueueSourceNode::start(double when, double offset) {
5253

5354
void AudioBufferQueueSourceNode::enqueueBuffer(
5455
const std::shared_ptr<AudioBuffer> &buffer,
56+
int bufferId,
5557
bool isLastBuffer) {
5658
auto locker = Locker(getBufferLock());
57-
buffers_.push(buffer);
59+
buffers_.emplace(bufferId, buffer);
5860

5961
isLastBuffer_ = isLastBuffer;
6062
}
6163

6264
void AudioBufferQueueSourceNode::disable() {
63-
AudioScheduledSourceNode::disable();
65+
audioapi::AudioNode::disable();
66+
67+
std::string state = "stopped";
68+
69+
// if it has not been stopped, it is ended
70+
if (stopTime_ < 0) {
71+
state = "ended";
72+
}
73+
74+
std::unordered_map<std::string, EventValue> body = {
75+
{"value", getStopTime()}, {"state", state}, {"bufferId", bufferId_}};
76+
77+
context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
78+
"ended", onEndedCallbackId_, body);
6479
buffers_ = {};
6580
}
6681

@@ -146,7 +161,10 @@ void AudioBufferQueueSourceNode::processWithoutInterpolation(
146161
auto readIndex = static_cast<size_t>(vReadIndex_);
147162
size_t writeIndex = startOffset;
148163

149-
auto buffer = buffers_.front();
164+
auto queueData = buffers_.front();
165+
bufferId_ = queueData.first;
166+
auto buffer = queueData.second;
167+
150168
size_t framesLeft = offsetLength;
151169

152170
while (framesLeft > 0) {
@@ -177,7 +195,10 @@ void AudioBufferQueueSourceNode::processWithoutInterpolation(
177195
}
178196
break;
179197
} else {
180-
buffer = buffers_.front();
198+
queueData = buffers_.front();
199+
bufferId_ = queueData.first;
200+
buffer = queueData.second;
201+
181202
readIndex = 0;
182203
}
183204
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class AudioBufferQueueSourceNode : public AudioScheduledSourceNode {
2424
[[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
2525

2626
void start(double when, double offset);
27-
void enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer, bool isLastBuffer);
27+
void enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer, int bufferId, bool isLastBuffer);
2828
void disable() override;
2929

3030
protected:
@@ -47,7 +47,8 @@ class AudioBufferQueueSourceNode : public AudioScheduledSourceNode {
4747
double vReadIndex_;
4848

4949
// User provided buffers
50-
std::queue<std::shared_ptr<AudioBuffer>> buffers_;
50+
std::queue<std::pair<int, std::shared_ptr<AudioBuffer>>> buffers_;
51+
int bufferId_ = 0;
5152
bool isLastBuffer_ = false;
5253

5354
void processWithPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ class AudioScheduledSourceNode : public AudioNode {
4343
void disable() override;
4444

4545
protected:
46+
double startTime_;
47+
double stopTime_;
48+
4649
PlaybackState playbackState_;
4750

4851
void updatePlaybackInfo(
@@ -53,11 +56,7 @@ class AudioScheduledSourceNode : public AudioNode {
5356

5457
void handleStopScheduled();
5558

56-
private:
57-
double startTime_;
58-
double stopTime_;
59-
60-
uint64_t onEndedCallbackId_ = 0;
59+
uint64_t onEndedCallbackId_ = 0;
6160
};
6261

6362
} // namespace audioapi

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ export default class AudioBufferQueueSourceNode extends AudioScheduledSourceNode
1818

1919
public enqueueBuffer(
2020
buffer: AudioBuffer,
21+
bufferId: number = 0,
2122
isLastBuffer: boolean = false
2223
): void {
2324
(this.node as IAudioBufferQueueSourceNode).enqueueBuffer(
2425
buffer.buffer,
26+
bufferId,
2527
isLastBuffer
2628
);
2729
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { IAudioScheduledSourceNode } from '../interfaces';
22
import AudioNode from './AudioNode';
33
import { InvalidStateError, RangeError } from '../errors';
4-
import { EventTypeWithValueAndState } from '../events/types';
4+
import { OnEndedEventType } from '../events/types';
55
import { AudioEventEmitter } from '../events';
66

77
export default class AudioScheduledSourceNode extends AudioNode {
@@ -42,7 +42,7 @@ export default class AudioScheduledSourceNode extends AudioNode {
4242
}
4343

4444
// eslint-disable-next-line accessor-pairs
45-
public set onended(callback: (event: EventTypeWithValueAndState) => void) {
45+
public set onended(callback: (event: OnEndedEventType) => void) {
4646
const subscription = this.audioEventEmitter.addAudioEventListener(
4747
'ended',
4848
callback

packages/react-native-audio-api/src/events/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ export interface EventTypeWithValue {
66
value: number;
77
}
88

9-
export interface EventTypeWithValueAndState {
9+
export interface OnEndedEventType {
1010
value: number;
1111
state: 'stopped' | 'ended';
12+
bufferId: number | undefined;
1213
}
1314

1415
interface OnInterruptionEventType {
@@ -45,7 +46,7 @@ export interface OnAudioReadyEventType {
4546
}
4647

4748
interface AudioAPIEvents {
48-
ended: EventTypeWithValueAndState;
49+
ended: OnEndedEventType;
4950
audioReady: OnAudioReadyEventType;
5051
audioError: EventEmptyType; // to change
5152
systemStateChanged: EventEmptyType; // to change

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,11 @@ export interface IAudioBufferQueueSourceNode extends IAudioScheduledSourceNode {
114114
detune: IAudioParam;
115115
playbackRate: IAudioParam;
116116

117-
enqueueBuffer: (audioBuffer: IAudioBuffer, isLastBuffer: boolean) => void;
117+
enqueueBuffer: (
118+
audioBuffer: IAudioBuffer,
119+
bufferId: number,
120+
isLastBuffer: boolean
121+
) => void;
118122
start: (when?: number, offset?: number) => void;
119123
}
120124

0 commit comments

Comments
 (0)