Skip to content

Commit 79b4b5e

Browse files
committed
Fix issue #35, implement atomic guard
1 parent da54743 commit 79b4b5e

2 files changed

Lines changed: 12 additions & 18 deletions

File tree

NeuralRack/engine/engine.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -499,10 +499,11 @@ inline void Engine::processDsp(uint32_t n_samples, float* output, float* output1
499499
if ((buffered == 1.0) && bufferIsInit.load(std::memory_order_acquire)) {
500500
// avoid buffer overflow on frame size change
501501
if (buffersize < n_samples) {
502-
bufsize = n_samples;
503-
bufferIsInit.store(false, std::memory_order_release);
504-
_execute.store(true, std::memory_order_release);
505-
xrworker.runProcess();
502+
if (!_execute.exchange(true, std::memory_order_acq_rel)) {
503+
bufsize = n_samples;
504+
bufferIsInit.store(false, std::memory_order_release);
505+
xrworker.runProcess();
506+
}
506507
return;
507508
}
508509
par.setProcessor(1);
@@ -624,10 +625,11 @@ inline void Engine::processDsp(uint32_t n_samples, float* output, float* output1
624625
inline void Engine::process(uint32_t n_samples, float* output, float* output1) {
625626
if(n_samples<1) return;
626627
if (buffersize < n_samples) {
627-
bufsize = n_samples;
628-
bufferIsInit.store(false, std::memory_order_release);
629-
_execute.store(true, std::memory_order_release);
630-
xrworker.runProcess();
628+
if (!_execute.exchange(true, std::memory_order_acq_rel)) {
629+
bufsize = n_samples;
630+
bufferIsInit.store(false, std::memory_order_release);
631+
xrworker.runProcess();
632+
}
631633
return;
632634
}
633635
// process in buffered mode

NeuralRack/standalone/NeuralRack.cc

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ class NeuralRack : public TextEntry
4141
NeuralRack() : engine() {
4242
workToDo.store(false, std::memory_order_release);
4343
presetToLoad.store(false, std::memory_order_release);
44-
processCounter = 0;
4544
settingsHaveChanged = false;
4645
disableAutoConnect = false;
4746
s_time = 0.0;
@@ -481,7 +480,6 @@ class NeuralRack : public TextEntry
481480
Widget_t* AutoConnect;
482481
Widget_t* EngineMenu;
483482
Widget_t* ASIOPannel;
484-
int processCounter;
485483
bool settingsHaveChanged;
486484
bool disableAutoConnect;
487485
std::atomic<bool> workToDo;
@@ -989,12 +987,6 @@ class NeuralRack : public TextEntry
989987

990988
// timeout loop to check output ports from engine
991989
void checkEngine() {
992-
// come back later
993-
if (!engine.bufferIsInit.load(std::memory_order_acquire)) return;
994-
if (processCounter < 1) {
995-
processCounter++;
996-
return;
997-
}
998990
#if defined(__linux__) || defined(__FreeBSD__) || \
999991
defined(__NetBSD__) || defined(__OpenBSD__)
1000992
XLockDisplay(ui->main.dpy);
@@ -1007,9 +999,9 @@ class NeuralRack : public TextEntry
1007999
XUnlockDisplay(ui->main.dpy);
10081000
#endif
10091001
if (workToDo.load(std::memory_order_acquire)) {
1010-
if (engine.xrworker.getProcess()) {
1002+
if (engine.xrworker.getProcess() &&
1003+
!engine._execute.exchange(true, std::memory_order_acq_rel)) {
10111004
workToDo.store(false, std::memory_order_release);
1012-
engine._execute.store(true, std::memory_order_release);
10131005
engine.xrworker.runProcess();
10141006
}
10151007
} else if (engine._notify_ui.load(std::memory_order_acquire)) {

0 commit comments

Comments
 (0)