--- a/DJMFix.cpp Fri Dec 18 21:35:36 2020 +0100
+++ b/DJMFix.cpp Fri Dec 18 23:19:32 2020 +0100
@@ -15,6 +15,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <iostream>
+#include <thread>
+#include <chrono>
+#include <stdexcept>
#include "DJMFix.h"
@@ -22,34 +25,55 @@
class DJMFixImpl : public DJMFix {
private:
- MidiSender midiSender;
-public:
+ MidiSender* midiSender;
+ std::thread keepAliveThread;
+ bool running = false;
+ bool stopped = false;
- DJMFixImpl(MidiSender midiSender) : midiSender(midiSender) {
- std::cerr << "DJMFixImpl()" << std::endl; // TODO: do not mess STDIO
+ void run() {
+ while (!stopped) {
+ std::cerr << "DJMFixImpl::run()" << std::endl; // TODO: do not mess STDIO
+ // TODO: send keep-alive messages
+ std::this_thread::sleep_for(std::chrono::milliseconds(200));
+ }
}
+public:
+
virtual ~DJMFixImpl() override {
std::cerr << "~DJMFixImpl()" << std::endl; // TODO: do not mess STDIO
+ if (running) stop();
+ }
+
+ void setMidiSender(MidiSender* midiSender) {
+ std::cerr << "DJMFixImpl::setMidiSender()" << std::endl; // TODO: do not mess STDIO
+ this->midiSender = midiSender;
}
virtual void receive(MidiMessage midiMessage) override {
std::cerr << "DJMFixImpl::receive()" << std::endl; // TODO: do not mess STDIO
-
- midiSender({0xf0, 0xf7});
}
void start() override {
std::cerr << "DJMFixImpl::start()" << std::endl; // TODO: do not mess STDIO
+ if (midiSender == nullptr) throw std::logic_error("need a midiSender when starting");
+ midiSender->send({0xf0, 0xf7});
+
+ keepAliveThread = std::thread(&DJMFixImpl::run, this);
+ running = true;
+
}
void stop() override {
+ stopped = true;
+ keepAliveThread.join();
+ running = false;
std::cerr << "DJMFixImpl::stop()" << std::endl; // TODO: do not mess STDIO
}
};
-DJMFix* create(MidiSender midiSender) {
- return new DJMFixImpl(midiSender);
+DJMFix* create() {
+ return new DJMFixImpl();
}
}