From ab7b26a2e79992ce1de0212d51a4bf90f912df43 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 4 Sep 2023 01:18:48 -0500 Subject: [PATCH] GUI: improve chan osc wave centering --- src/engine/workPool.cpp | 20 +++++++++++++ src/engine/workPool.h | 66 +++++++++++++++++++++++++++++++++++++++++ src/gui/chanOsc.cpp | 8 ++--- 3 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/engine/workPool.cpp create mode 100644 src/engine/workPool.h diff --git a/src/engine/workPool.cpp b/src/engine/workPool.cpp new file mode 100644 index 00000000..6c294a7d --- /dev/null +++ b/src/engine/workPool.cpp @@ -0,0 +1,20 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + #include "workPool.h" \ No newline at end of file diff --git a/src/engine/workPool.h b/src/engine/workPool.h new file mode 100644 index 00000000..9abdfba0 --- /dev/null +++ b/src/engine/workPool.h @@ -0,0 +1,66 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _WORKPOOL_H +#define _WORKPOOL_H + +#include +#include +#include +#include + +struct DivWorkThread { + std::mutex lock; + std::thread* thread; + std::condition_variable notify; + bool busy, terminate; + + void run(); + DivWorkThread(): + busy(false) {} +}; + +/** + * this class provides an implementation of a "thread pool" for executing tasks in parallel. + * it is highly recommended to use `new` when allocating a DivWorkPool. + */ +class DivWorkPool { + DivWorkThread* workThreads; + public: + /** + * push a new job to this work pool. + * if all work threads are busy, this will block until one is free. + */ + bool push(); + + /** + * check whether this work pool is busy. + */ + bool busy(); + + /** + * wait for all work threads to finish. + */ + bool wait(); + + DivWorkPool(unsigned int threads=0); + ~DivWorkPool(); +}; + +#endif \ No newline at end of file diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index 637ae7d5..4f62c0d1 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -533,9 +533,9 @@ void FurnaceGUI::drawChanOsc() { double dft[2]; dft[0]=0.0; dft[1]=0.0; - for (int j=0; jdata[(unsigned short)(needlePos-((int)waveLen)+j)&0xffff]/32768.0); - double two=(double)j*(-2.0*M_PI)/waveLen; + for (int j=needlePos-1-((displaySize+(int)waveLen)>>1), k=0; kdata[j&0xffff]/32768.0); + double two=(double)k*(-2.0*M_PI)/waveLen; dft[0]+=one*cos(two); dft[1]+=one*sin(two); } @@ -545,7 +545,7 @@ void FurnaceGUI::drawChanOsc() { if (chanOscWaveCorr) { needlePos-=phase*waveLen; - needlePos-=(2*waveLen-fmod(displaySize,waveLen*2))*0.5; + //needlePos-=(2*waveLen-fmod(displaySize,waveLen*2))*0.5; } } }