Skip to content

Commit 03af98e

Browse files
authored
Merge pull request #114 from open-ephys-plugins/issue-97
Performance improvements
2 parents c0a8802 + 59fafc1 commit 03af98e

27 files changed

+1933
-288
lines changed

Source/Devices/AnalogIO.cpp

Lines changed: 6 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,10 @@ 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+
if (!frameQueue.try_dequeue(frame)) { //NB: This method should never be called unless a frame is sure to be there
213+
jassertfalse;
214+
}
225215

226216
int16_t* dataPtr = (int16_t*)frame->data;
227217

@@ -272,7 +262,7 @@ void AnalogIO::processFrame(uint64_t eventWord)
272262

273263
void AnalogIO::processFrames()
274264
{
275-
while (!frameArray.isEmpty())
265+
while (frameQueue.peek() != nullptr )
276266
{
277267
processFrame();
278268
}

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/AuxiliaryIO.cpp

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -56,29 +56,9 @@ bool AuxiliaryIO::isEnabled() const
5656

5757
void AuxiliaryIO::processFrames()
5858
{
59-
if (!digitalIO->isEnabled() && !analogIO->isEnabled())
60-
{
61-
return;
62-
}
63-
else if (!digitalIO->isEnabled())
64-
{
65-
analogIO->processFrames();
66-
return;
67-
}
68-
else if (!analogIO->isEnabled())
69-
{
70-
digitalIO->processFrames();
71-
while (digitalIO->hasEventWord())
72-
{
73-
digitalIO->getEventWord();
74-
}
75-
76-
return;
77-
}
78-
7959
digitalIO->processFrames();
8060

81-
while (analogIO->getNumberOfFrames() >= AnalogIO::framesToAverage && digitalIO->getNumberOfWords() >= 1)
61+
while (digitalIO->hasEventWord() && analogIO->getNumberOfFrames() >= AnalogIO::framesToAverage)
8262
{
8363
auto eventWord = digitalIO->getEventWord();
8464

Source/Devices/Bno055.cpp

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -153,22 +153,6 @@ void Bno055::startAcquisition()
153153
sampleNumber = 0;
154154
}
155155

156-
void Bno055::stopAcquisition()
157-
{
158-
while (!frameArray.isEmpty())
159-
{
160-
oni_destroy_frame(frameArray.removeAndReturn(0));
161-
}
162-
163-
currentFrame = 0;
164-
sampleNumber = 0;
165-
}
166-
167-
void Bno055::addFrame(oni_frame_t* frame)
168-
{
169-
frameArray.add(frame);
170-
}
171-
172156
void Bno055::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
173157
{
174158
sourceBuffers.add(new DataBuffer(numberOfChannels, (int)sampleRate * bufferSizeInSeconds));
@@ -177,10 +161,9 @@ void Bno055::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
177161

178162
void Bno055::processFrames()
179163
{
180-
while (!frameArray.isEmpty())
164+
oni_frame_t* frame;
165+
while (frameQueue.try_dequeue(frame))
181166
{
182-
oni_frame_t* frame = frameArray.removeAndReturn(0);
183-
184167
int16_t* dataPtr = ((int16_t*)frame->data) + 4;
185168

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

Source/Devices/Bno055.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,9 @@ namespace OnixSourcePlugin
4242
Bno055(std::string name, std::string hubName, const oni_dev_idx_t, std::shared_ptr<Onix1> ctx);
4343

4444
int configureDevice() override;
45-
46-
/** Update the settings of the device */
4745
bool updateSettings() override;
48-
49-
/** Starts probe data streaming */
5046
void startAcquisition() override;
51-
52-
/** Stops probe data streaming*/
53-
void stopAcquisition() override;
54-
55-
void addFrame(oni_frame_t*) override;
56-
5747
void processFrames() override;
58-
5948
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override;
6049

6150
static OnixDeviceType getDeviceType();
@@ -70,8 +59,6 @@ namespace OnixSourcePlugin
7059

7160
static const int numFrames = 2;
7261

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

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

Source/Devices/DigitalIO.cpp

Lines changed: 10 additions & 18 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,12 +66,8 @@ void DigitalIO::startAcquisition()
6666
{
6767
}
6868

69-
void DigitalIO::stopAcquisition()
69+
void DigitalIO::addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers)
7070
{
71-
while (!frameArray.isEmpty())
72-
{
73-
oni_destroy_frame(frameArray.removeAndReturn(0));
74-
}
7571
}
7672

7773
EventChannel::Settings DigitalIO::getEventChannelSettings(DataStream* stream)
@@ -88,21 +84,16 @@ EventChannel::Settings DigitalIO::getEventChannelSettings(DataStream* stream)
8884
return settings;
8985
}
9086

91-
void DigitalIO::addFrame(oni_frame_t* frame)
92-
{
93-
frameArray.add(frame);
94-
}
95-
9687
int DigitalIO::getNumberOfWords()
9788
{
98-
return eventWords.size();
89+
return eventWords.size_approx();
9990
}
10091

10192
void DigitalIO::processFrames()
10293
{
103-
while (!frameArray.isEmpty())
94+
oni_frame_t* frame;
95+
while (frameQueue.try_dequeue(frame))
10496
{
105-
oni_frame_t* frame = frameArray.removeAndReturn(0);
10697

10798
uint16_t* dataPtr = (uint16_t*)frame->data;
10899
uint64_t timestamp = deviceContext->convertTimestampToSeconds(frame->time);
@@ -113,21 +104,22 @@ void DigitalIO::processFrames()
113104
uint64_t buttonState = *(dataPtr + dataOffset + 1);
114105

115106
uint64_t ttlEventWord = (buttonState & 0x3F) << 8 | (portState & 0xFF);
116-
eventWords.add(ttlEventWord);
107+
eventWords.enqueue(ttlEventWord);
117108

118109
oni_destroy_frame(frame);
119110
}
120111
}
121112

122113
uint64_t DigitalIO::getEventWord()
123114
{
124-
if (eventWords.size() != 0)
125-
return eventWords.removeAndReturn(0);
115+
uint64_t eventWord;
116+
if (eventWords.try_dequeue(eventWord))
117+
return eventWord;
126118

127119
return 0;
128120
}
129121

130122
bool DigitalIO::hasEventWord()
131123
{
132-
return eventWords.size() > 0;
124+
return eventWords.peek() != nullptr;
133125
}

Source/Devices/DigitalIO.h

Lines changed: 2 additions & 5 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;
78-
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override {};
79-
void addFrame(oni_frame_t*) override;
77+
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) 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 & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,10 @@ namespace OnixSourcePlugin
4646
public:
4747
HarpSyncInput(std::string name, std::string hubName, const oni_dev_idx_t, std::shared_ptr<Onix1> oni_ctx);
4848

49-
/** Configures the device so that it is ready to stream with default settings */
5049
int configureDevice() override;
51-
52-
/** Update the settings of the device */
5350
bool updateSettings() override;
54-
55-
/** Starts probe data streaming */
5651
void startAcquisition() override;
57-
58-
/** Stops probe data streaming*/
59-
void stopAcquisition() override;
60-
61-
/** Given the sourceBuffers from OnixSource, add all streams for the current device to the array */
6252
void addSourceBuffers(OwnedArray<DataBuffer>& sourceBuffers) override;
63-
64-
void addFrame(oni_frame_t* frame) override;
65-
6653
void processFrames() override;
6754

6855
static OnixDeviceType getDeviceType();
@@ -73,8 +60,6 @@ namespace OnixSourcePlugin
7360

7461
static const int numFrames = 2;
7562

76-
Array<oni_frame_t*, CriticalSection, numFrames> frameArray;
77-
7863
unsigned short currentFrame = 0;
7964
int sampleNumber = 0;
8065

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);

0 commit comments

Comments
 (0)