Skip to content

Commit b17329f

Browse files
committed
Replace frame arrays with a lockless queue for performance
- Replace juce array with ReaderWriterQueue from cameron314 - Streamlined code inheritance
1 parent 72cb8f6 commit b17329f

24 files changed

+1838
-179
lines changed

Source/Devices/AnalogIO.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -195,22 +195,9 @@ void AnalogIO::startAcquisition()
195195
analogInputSamples.fill(0);
196196
}
197197

198-
void AnalogIO::stopAcquisition()
199-
{
200-
while (!frameArray.isEmpty())
201-
{
202-
oni_destroy_frame(frameArray.removeAndReturn(0));
203-
}
204-
}
205-
206-
void AnalogIO::addFrame(oni_frame_t* frame)
207-
{
208-
frameArray.add(frame);
209-
}
210-
211198
int AnalogIO::getNumberOfFrames()
212199
{
213-
return frameArray.size();
200+
return frameQueue.size_approx();
214201
}
215202

216203
void AnalogIO::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
@@ -221,7 +208,8 @@ void AnalogIO::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
221208

222209
void AnalogIO::processFrame(uint64_t eventWord)
223210
{
224-
oni_frame_t* frame = frameArray.removeAndReturn(0);
211+
oni_frame_t* frame;
212+
while (!frameQueue.try_dequeue(frame)); //NB: This while is for safety, but this method should never be called unless a frame is sure to be there
225213

226214
int16_t* dataPtr = (int16_t*)frame->data;
227215

@@ -272,7 +260,7 @@ void AnalogIO::processFrame(uint64_t eventWord)
272260

273261
void AnalogIO::processFrames()
274262
{
275-
while (!frameArray.isEmpty())
263+
while (frameQueue.peek() != nullptr )
276264
{
277265
processFrame();
278266
}

Source/Devices/AnalogIO.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ namespace OnixSourcePlugin
7474
int configureDevice() override;
7575
bool updateSettings() override;
7676
void startAcquisition() override;
77-
void stopAcquisition() override;
7877
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override;
79-
void addFrame(oni_frame_t*) override;
8078
void processFrames() override;
8179

8280
void processFrame(uint64_t eventWord = 0);
@@ -117,8 +115,6 @@ namespace OnixSourcePlugin
117115

118116
AnalogIODataType dataType = AnalogIODataType::Volts;
119117

120-
Array<oni_frame_t*, CriticalSection, numFrames> frameArray;
121-
122118
unsigned short currentFrame = 0;
123119
unsigned short currentAverageFrame = 0;
124120
int sampleNumber = 0;

Source/Devices/Bno055.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -155,20 +155,11 @@ void Bno055::startAcquisition()
155155

156156
void Bno055::stopAcquisition()
157157
{
158-
while (!frameArray.isEmpty())
159-
{
160-
oni_destroy_frame(frameArray.removeAndReturn(0));
161-
}
162-
158+
OnixDevice::stopAcquisition();
163159
currentFrame = 0;
164160
sampleNumber = 0;
165161
}
166162

167-
void Bno055::addFrame(oni_frame_t* frame)
168-
{
169-
frameArray.add(frame);
170-
}
171-
172163
void Bno055::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
173164
{
174165
sourceBuffers.add(new DataBuffer(numberOfChannels, (int)sampleRate * bufferSizeInSeconds));
@@ -177,10 +168,9 @@ void Bno055::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
177168

178169
void Bno055::processFrames()
179170
{
180-
while (!frameArray.isEmpty())
171+
oni_frame_t* frame;
172+
while (frameQueue.try_dequeue(frame))
181173
{
182-
oni_frame_t* frame = frameArray.removeAndReturn(0);
183-
184174
int16_t* dataPtr = ((int16_t*)frame->data) + 4;
185175

186176
bnoTimestamps[currentFrame] = deviceContext->convertTimestampToSeconds(frame->time);

Source/Devices/Bno055.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ namespace OnixSourcePlugin
5252
/** Stops probe data streaming*/
5353
void stopAcquisition() override;
5454

55-
void addFrame(oni_frame_t*) override;
56-
5755
void processFrames() override;
5856

5957
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override;
@@ -70,8 +68,6 @@ namespace OnixSourcePlugin
7068

7169
static const int numFrames = 2;
7270

73-
Array<oni_frame_t*, CriticalSection, numFrames> frameArray;
74-
7571
bool shouldAddToBuffer = false;
7672

7773
static const int numberOfChannels = 3 + 3 + 4 + 3 + 1 + 4;

Source/Devices/DigitalIO.cpp

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
using namespace OnixSourcePlugin;
2727

2828
DigitalIO::DigitalIO(std::string name, std::string hubName, const oni_dev_idx_t deviceIdx_, std::shared_ptr<Onix1> oni_ctx)
29-
: OnixDevice(name, hubName, DigitalIO::getDeviceType(), deviceIdx_, oni_ctx)
29+
: OnixDevice(name, hubName, DigitalIO::getDeviceType(), deviceIdx_, oni_ctx), eventWords(64)
3030
{
3131
}
3232

@@ -66,14 +66,6 @@ void DigitalIO::startAcquisition()
6666
{
6767
}
6868

69-
void DigitalIO::stopAcquisition()
70-
{
71-
while (!frameArray.isEmpty())
72-
{
73-
oni_destroy_frame(frameArray.removeAndReturn(0));
74-
}
75-
}
76-
7769
EventChannel::Settings DigitalIO::getEventChannelSettings(DataStream* stream)
7870
{
7971
EventChannel::Settings settings{
@@ -88,21 +80,16 @@ EventChannel::Settings DigitalIO::getEventChannelSettings(DataStream* stream)
8880
return settings;
8981
}
9082

91-
void DigitalIO::addFrame(oni_frame_t* frame)
92-
{
93-
frameArray.add(frame);
94-
}
95-
9683
int DigitalIO::getNumberOfWords()
9784
{
98-
return eventWords.size();
85+
return eventWords.size_approx();
9986
}
10087

10188
void DigitalIO::processFrames()
10289
{
103-
while (!frameArray.isEmpty())
90+
oni_frame_t* frame;
91+
while (frameQueue.try_dequeue(frame))
10492
{
105-
oni_frame_t* frame = frameArray.removeAndReturn(0);
10693

10794
uint16_t* dataPtr = (uint16_t*)frame->data;
10895
uint64_t timestamp = deviceContext->convertTimestampToSeconds(frame->time);
@@ -113,21 +100,22 @@ void DigitalIO::processFrames()
113100
uint64_t buttonState = *(dataPtr + dataOffset + 1);
114101

115102
uint64_t ttlEventWord = (buttonState & 0x3F) << 8 | (portState & 0xFF);
116-
eventWords.add(ttlEventWord);
103+
eventWords.enqueue(ttlEventWord);
117104

118105
oni_destroy_frame(frame);
119106
}
120107
}
121108

122109
uint64_t DigitalIO::getEventWord()
123110
{
124-
if (eventWords.size() != 0)
125-
return eventWords.removeAndReturn(0);
111+
uint64_t eventWord;
112+
if (eventWords.try_dequeue(eventWord))
113+
return eventWord;
126114

127115
return 0;
128116
}
129117

130118
bool DigitalIO::hasEventWord()
131119
{
132-
return eventWords.size() > 0;
120+
return eventWords.peek() != nullptr;
133121
}

Source/Devices/DigitalIO.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ namespace OnixSourcePlugin
7474
int configureDevice() override;
7575
bool updateSettings() override;
7676
void startAcquisition() override;
77-
void stopAcquisition() override;
7877
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override {};
79-
void addFrame(oni_frame_t*) override;
8078
void processFrames() override;
8179

8280
EventChannel::Settings getEventChannelSettings(DataStream* stream);
@@ -92,8 +90,7 @@ namespace OnixSourcePlugin
9290
static constexpr int numDigitalInputs = 8;
9391
static constexpr int numButtons = 6;
9492

95-
Array<oni_frame_t*, CriticalSection, 10> frameArray;
96-
Array<uint64_t, CriticalSection, 64> eventWords;
93+
ReaderWriterQueue<uint64_t> eventWords;
9794

9895
JUCE_LEAK_DETECTOR(DigitalIO);
9996
};

Source/Devices/HarpSyncInput.cpp

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,6 @@ void HarpSyncInput::startAcquisition()
7272
sampleNumber = 0;
7373
}
7474

75-
void HarpSyncInput::stopAcquisition()
76-
{
77-
while (!frameArray.isEmpty())
78-
{
79-
oni_destroy_frame(frameArray.removeAndReturn(0));
80-
}
81-
}
82-
83-
void HarpSyncInput::addFrame(oni_frame_t* frame)
84-
{
85-
frameArray.add(frame);
86-
}
87-
8875
void HarpSyncInput::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
8976
{
9077
sourceBuffers.add(new DataBuffer(streamInfos.getFirst().getNumChannels(), (int)streamInfos.getFirst().getSampleRate() * bufferSizeInSeconds));
@@ -93,9 +80,9 @@ void HarpSyncInput::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
9380

9481
void HarpSyncInput::processFrames()
9582
{
96-
while (!frameArray.isEmpty())
83+
oni_frame_t* frame;
84+
while (frameQueue.try_dequeue(frame))
9785
{
98-
oni_frame_t* frame = frameArray.removeAndReturn(0);
9986

10087
uint32_t* dataPtr = (uint32_t*)frame->data;
10188

Source/Devices/HarpSyncInput.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,10 @@ namespace OnixSourcePlugin
5555
/** Starts probe data streaming */
5656
void startAcquisition() override;
5757

58-
/** Stops probe data streaming*/
59-
void stopAcquisition() override;
6058

6159
/** Given the sourceBuffers from OnixSource, add all streams for the current device to the array */
6260
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override;
6361

64-
void addFrame(oni_frame_t* frame) override;
65-
6662
void processFrames() override;
6763

6864
static OnixDeviceType getDeviceType();
@@ -73,8 +69,6 @@ namespace OnixSourcePlugin
7369

7470
static const int numFrames = 2;
7571

76-
Array<oni_frame_t*, CriticalSection, numFrames> frameArray;
77-
7872
unsigned short currentFrame = 0;
7973
int sampleNumber = 0;
8074

Source/Devices/MemoryMonitor.cpp

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -139,19 +139,6 @@ void MemoryMonitor::startAcquisition()
139139
lastPercentUsedValue = 0.0f;
140140
}
141141

142-
void MemoryMonitor::stopAcquisition()
143-
{
144-
while (!frameArray.isEmpty())
145-
{
146-
oni_destroy_frame(frameArray.removeAndReturn(0));
147-
}
148-
}
149-
150-
void MemoryMonitor::addFrame(oni_frame_t* frame)
151-
{
152-
frameArray.add(frame);
153-
}
154-
155142
void MemoryMonitor::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
156143
{
157144
sourceBuffers.add(new DataBuffer(streamInfos.getFirst().getNumChannels(), (int)streamInfos.getFirst().getSampleRate() * bufferSizeInSeconds));
@@ -165,10 +152,10 @@ float MemoryMonitor::getLastPercentUsedValue()
165152

166153
void MemoryMonitor::processFrames()
167154
{
168-
while (!frameArray.isEmpty())
169-
{
170-
oni_frame_t* frame = frameArray.removeAndReturn(0);
155+
oni_frame_t* frame;
171156

157+
while (frameQueue.try_dequeue(frame))
158+
{
172159
uint32_t* dataPtr = (uint32_t*)frame->data;
173160

174161
timestamps[currentFrame] = deviceContext->convertTimestampToSeconds(frame->time);

Source/Devices/MemoryMonitor.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,9 @@ namespace OnixSourcePlugin
5252
/** Starts probe data streaming */
5353
void startAcquisition() override;
5454

55-
/** Stops probe data streaming*/
56-
void stopAcquisition() override;
57-
5855
/** Given the sourceBuffers from OnixSource, add all streams for the current device to the array */
5956
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override;
6057

61-
void addFrame(oni_frame_t*) override;
62-
6358
void processFrames() override;
6459

6560
float getLastPercentUsedValue();
@@ -72,8 +67,6 @@ namespace OnixSourcePlugin
7267

7368
static const int numFrames = 10;
7469

75-
Array<oni_frame_t*, CriticalSection, numFrames> frameArray;
76-
7770
unsigned short currentFrame = 0;
7871
int sampleNumber = 0;
7972

0 commit comments

Comments
 (0)