From bf8b9bf3c615d294cff22f6b05f76aac1d41c1bf Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 24 Oct 2017 14:47:22 +0200 Subject: [PATCH] Clean up midiIO implementation --- src/core/MidiIO.cpp | 27 +++++++++++++-------------- src/core/MidiIO.hpp | 20 +++++++++++--------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/core/MidiIO.cpp b/src/core/MidiIO.cpp index aa6486fe..ab485cfa 100644 --- a/src/core/MidiIO.cpp +++ b/src/core/MidiIO.cpp @@ -119,7 +119,7 @@ std::string MidiIO::getDeviceName() { } double MidiIO::getMessage(std::vector *msg) { - std::vector next_msg; + MidiMessage next_msg = MidiMessage(); MidiInWrapper *mw = midiInMap[deviceName]; @@ -128,24 +128,23 @@ double MidiIO::getMessage(std::vector *msg) { return 0; } - double stamp = midiInMap[deviceName]->getMessage(&next_msg); + next_msg.timeStamp = midiInMap[deviceName]->getMessage(&next_msg.bytes); + if (next_msg.bytes.size() > 0) { + for (auto &kv : mw->idMessagesMap) { - if (next_msg.size() > 0) { - for (auto kv : mw->idMessagesMap) { - mw->idMessagesMap[kv.first].push_back(next_msg); - mw->idStampsMap[kv.first].push_back(stamp); + kv.second.push_back(next_msg); } } - if (mw->idMessagesMap[id].size() <= 0) { - *msg = next_msg; - return stamp; + + if (mw->idMessagesMap[id].size() > 0) { + next_msg = mw->idMessagesMap[id].front(); + mw->idMessagesMap[id].pop_front(); } - *msg = mw->idMessagesMap[id].front(); - stamp = mw->idStampsMap[id].front(); - mw->idMessagesMap[id].pop_front(); - return stamp; + *msg = next_msg.bytes; + + return next_msg.timeStamp; } bool MidiIO::isPortOpen() { @@ -165,7 +164,7 @@ void MidiIO::close() { mw->erase(id); - if (mw->subscribers == 0) { + if (mw->idMessagesMap.size() == 0) { mw->closePort(); midiInMap.erase(deviceName); } diff --git a/src/core/MidiIO.hpp b/src/core/MidiIO.hpp index 849fdaa5..eee405f6 100644 --- a/src/core/MidiIO.hpp +++ b/src/core/MidiIO.hpp @@ -11,37 +11,39 @@ struct IgnoreFlags { bool midiSense = true; }; +struct MidiMessage { + std::vector bytes; + double timeStamp; + + MidiMessage(): bytes(0), timeStamp(0.0) {}; + +}; + /** * This class allows to use one instance of rtMidiIn with * multiple modules. A MidiIn port will be opened only once while multiple * instances can use it simultaniously, each receiving all its incoming messages. */ - struct MidiInWrapper : RtMidiIn { + std::unordered_map> idMessagesMap; std::unordered_map ignoresMap; int uid_c = 0; - int subscribers = 0; MidiInWrapper() : RtMidiIn() { idMessagesMap = {}; - idStampsMap = {}; }; int add() { int id = ++uid_c; - subscribers++; idMessagesMap[id] = {}; - idStampsMap[id] = {}; - + ignoresMap[id] = IgnoreFlags(); return id; } void erase(int id) { - subscribers--; idMessagesMap.erase(id); - idStampsMap.erase(id); ignoresMap.erase(id); } }; @@ -88,7 +90,7 @@ public: virtual void resetMidi()=0; /* called if a user switches or sets the deivce (and after this device is initialised)*/ - virtual void onDeviceChange(){}; + virtual void onDeviceChange() {}; }; //////////////////////