diff -r 98274757fcf6 -r f34476ab597f DJMFix.cpp --- 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 . */ #include +#include +#include +#include #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(); } }