diff -r 5b351628a377 -r 15d87fdd6e6c AlsaBridge.cpp --- a/AlsaBridge.cpp Mon Jan 04 13:38:08 2021 +0100 +++ b/AlsaBridge.cpp Mon Jan 04 15:45:12 2021 +0100 @@ -15,6 +15,7 @@ * along with this program. If not, see . */ #include +#include #include #include #include @@ -24,13 +25,17 @@ #include #include "AlsaBridge.h" +#include "Logger.h" namespace djmfix { namespace alsa { +using L = djmfix::logging::Level; + class AlsaBridgeImpl : public AlsaBridge, private djmfix::MidiSender { private: djmfix::DJMFix* djmFix; + djmfix::logging::Logger* logger; snd_rawmidi_t* input; snd_rawmidi_t* output; std::thread receivingThread; @@ -41,22 +46,27 @@ std::vector cardNumbers; - std::cerr << "Looking for available cards:" << std::endl; // TODO: do not mess STDIO + logger->log(L::INFO, "Looking for available cards:"); for (int card = -1; snd_card_next(&card) == 0 && card >= 0;) { char* longName = nullptr; snd_card_get_longname(card, &longName); - std::cerr << "card: #" << card << ": '" << longName << "'"; // TODO: do not mess STDIO + + std::stringstream logMessage; + logMessage << " - card: #" << card << ": '" << longName << "'"; + if (std::regex_match(longName, cardNamePattern)) { cardNumbers.push_back(card); - std::cerr << " [matches]"; // TODO: do not mess STDIO + logMessage << " [matches]"; } - std::cerr << std::endl; + + logger->log(L::INFO, logMessage.str()); + free(longName); } if (cardNumbers.size() == 1) { - std::cerr << "Going to fix card #" << cardNumbers[0] << std::endl; // TODO: do not mess STDIO + logger->log(L::INFO, "Going to fix card #" + std::to_string(cardNumbers[0])); return "hw:" + std::to_string(cardNumbers[0]); } else if (cardNumbers.empty()) { throw std::invalid_argument("No card with matching name found. Is the card connected? Maybe try to provide different name pattern."); @@ -82,7 +92,7 @@ } public: - AlsaBridgeImpl(djmfix::DJMFix* djmFix, const std::string& cardNamePattern) : djmFix(djmFix) { + AlsaBridgeImpl(djmfix::DJMFix* djmFix, const std::string& cardNamePattern, djmfix::logging::Logger* logger) : djmFix(djmFix), logger(logger ? logger : djmfix::logging::blackhole()) { if (djmFix == nullptr) throw std::invalid_argument("need a djmFix for AlsaBridge"); std::string deviceName = findDeviceName(std::regex(cardNamePattern)); @@ -95,10 +105,10 @@ } virtual ~AlsaBridgeImpl() { - // TODO: do not use raw/exclusive access to the device + // TODO: do not use raw/exclusive access to the MIDI device snd_rawmidi_close(input); snd_rawmidi_close(output); - std::cerr << "~AlsaBridgeImpl()" << std::endl; // TODO: do not mess STDIO + logger->log(L::FINE, "~AlsaBridgeImpl()"); } virtual void start() override { @@ -115,13 +125,13 @@ virtual void send(MidiMessage midiMessage) override { std::lock_guard lock(midiMutex); ssize_t length = snd_rawmidi_write(output, midiMessage.data(), midiMessage.size()); - std::cerr << "AlsaBridgeImpl::send(): length = " << length << std::endl; // TODO: do not mess STDIO + logger->log(L::INFO, "AlsaBridgeImpl::send(): length = " + std::to_string(length)); } }; -AlsaBridge* create(djmfix::DJMFix* djmFix, const std::string& deviceName) { - return new AlsaBridgeImpl(djmFix, deviceName); +AlsaBridge* create(djmfix::DJMFix* djmFix, const std::string& deviceName, djmfix::logging::Logger* logger) { + return new AlsaBridgeImpl(djmFix, deviceName, logger); } }