1.1 --- a/DJMFix.cpp Fri Dec 18 21:35:36 2020 +0100
1.2 +++ b/DJMFix.cpp Fri Dec 18 23:19:32 2020 +0100
1.3 @@ -15,6 +15,9 @@
1.4 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1.5 */
1.6 #include <iostream>
1.7 +#include <thread>
1.8 +#include <chrono>
1.9 +#include <stdexcept>
1.10
1.11 #include "DJMFix.h"
1.12
1.13 @@ -22,34 +25,55 @@
1.14
1.15 class DJMFixImpl : public DJMFix {
1.16 private:
1.17 - MidiSender midiSender;
1.18 + MidiSender* midiSender;
1.19 + std::thread keepAliveThread;
1.20 + bool running = false;
1.21 + bool stopped = false;
1.22 +
1.23 + void run() {
1.24 + while (!stopped) {
1.25 + std::cerr << "DJMFixImpl::run()" << std::endl; // TODO: do not mess STDIO
1.26 + // TODO: send keep-alive messages
1.27 + std::this_thread::sleep_for(std::chrono::milliseconds(200));
1.28 + }
1.29 + }
1.30 +
1.31 public:
1.32
1.33 - DJMFixImpl(MidiSender midiSender) : midiSender(midiSender) {
1.34 - std::cerr << "DJMFixImpl()" << std::endl; // TODO: do not mess STDIO
1.35 - }
1.36 -
1.37 virtual ~DJMFixImpl() override {
1.38 std::cerr << "~DJMFixImpl()" << std::endl; // TODO: do not mess STDIO
1.39 + if (running) stop();
1.40 + }
1.41 +
1.42 + void setMidiSender(MidiSender* midiSender) {
1.43 + std::cerr << "DJMFixImpl::setMidiSender()" << std::endl; // TODO: do not mess STDIO
1.44 + this->midiSender = midiSender;
1.45 }
1.46
1.47 virtual void receive(MidiMessage midiMessage) override {
1.48 std::cerr << "DJMFixImpl::receive()" << std::endl; // TODO: do not mess STDIO
1.49 -
1.50 - midiSender({0xf0, 0xf7});
1.51 }
1.52
1.53 void start() override {
1.54 std::cerr << "DJMFixImpl::start()" << std::endl; // TODO: do not mess STDIO
1.55 + if (midiSender == nullptr) throw std::logic_error("need a midiSender when starting");
1.56 + midiSender->send({0xf0, 0xf7});
1.57 +
1.58 + keepAliveThread = std::thread(&DJMFixImpl::run, this);
1.59 + running = true;
1.60 +
1.61 }
1.62
1.63 void stop() override {
1.64 + stopped = true;
1.65 + keepAliveThread.join();
1.66 + running = false;
1.67 std::cerr << "DJMFixImpl::stop()" << std::endl; // TODO: do not mess STDIO
1.68 }
1.69 };
1.70
1.71 -DJMFix* create(MidiSender midiSender) {
1.72 - return new DJMFixImpl(midiSender);
1.73 +DJMFix* create() {
1.74 + return new DJMFixImpl();
1.75 }
1.76
1.77 }