DJMFix.cpp
branchv_0
changeset 2 f34476ab597f
parent 1 98274757fcf6
child 5 ef8f4023e32e
     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  }