DJMFix.cpp
author František Kučera <franta-hg@frantovo.cz>
Fri, 18 Dec 2020 23:58:03 +0100
branchv_0
changeset 4 4d777d6c8024
parent 2 f34476ab597f
child 5 ef8f4023e32e
permissions -rw-r--r--
address sanitizer
     1 /**
     2  * DJM-Fix
     3  * Copyright © 2020 František Kučera (Frantovo.cz, GlobalCode.info)
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 3 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    16  */
    17 #include <iostream>
    18 #include <thread>
    19 #include <chrono>
    20 #include <stdexcept>
    21 
    22 #include "DJMFix.h"
    23 
    24 namespace djmfix {
    25 
    26 class DJMFixImpl : public DJMFix {
    27 private:
    28 	MidiSender* midiSender;
    29 	std::thread keepAliveThread;
    30 	bool running = false;
    31 	bool stopped = false;
    32 
    33 	void run() {
    34 		while (!stopped) {
    35 			std::cerr << "DJMFixImpl::run()" << std::endl; // TODO: do not mess STDIO
    36 			// TODO: send keep-alive messages
    37 			std::this_thread::sleep_for(std::chrono::milliseconds(200));
    38 		}
    39 	}
    40 
    41 public:
    42 
    43 	virtual ~DJMFixImpl() override {
    44 		std::cerr << "~DJMFixImpl()" << std::endl; // TODO: do not mess STDIO
    45 		if (running) stop();
    46 	}
    47 
    48 	void setMidiSender(MidiSender* midiSender) {
    49 		std::cerr << "DJMFixImpl::setMidiSender()" << std::endl; // TODO: do not mess STDIO
    50 		this->midiSender = midiSender;
    51 	}
    52 
    53 	virtual void receive(MidiMessage midiMessage) override {
    54 		std::cerr << "DJMFixImpl::receive()" << std::endl; // TODO: do not mess STDIO
    55 	}
    56 
    57 	void start() override {
    58 		std::cerr << "DJMFixImpl::start()" << std::endl; // TODO: do not mess STDIO
    59 		if (midiSender == nullptr) throw std::logic_error("need a midiSender when starting");
    60 		midiSender->send({0xf0, 0xf7});
    61 
    62 		keepAliveThread = std::thread(&DJMFixImpl::run, this);
    63 		running = true;
    64 
    65 	}
    66 
    67 	void stop() override {
    68 		stopped = true;
    69 		keepAliveThread.join();
    70 		running = false;
    71 		std::cerr << "DJMFixImpl::stop()" << std::endl; // TODO: do not mess STDIO
    72 	}
    73 };
    74 
    75 DJMFix* create() {
    76 	return new DJMFixImpl();
    77 }
    78 
    79 }