1.1 --- a/AlsaBridge.cpp Mon Jan 04 13:38:08 2021 +0100
1.2 +++ b/AlsaBridge.cpp Mon Jan 04 15:45:12 2021 +0100
1.3 @@ -15,6 +15,7 @@
1.4 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1.5 */
1.6 #include <iostream>
1.7 +#include <sstream>
1.8 #include <stdexcept>
1.9 #include <thread>
1.10 #include <mutex>
1.11 @@ -24,13 +25,17 @@
1.12 #include <alsa/asoundlib.h>
1.13
1.14 #include "AlsaBridge.h"
1.15 +#include "Logger.h"
1.16
1.17 namespace djmfix {
1.18 namespace alsa {
1.19
1.20 +using L = djmfix::logging::Level;
1.21 +
1.22 class AlsaBridgeImpl : public AlsaBridge, private djmfix::MidiSender {
1.23 private:
1.24 djmfix::DJMFix* djmFix;
1.25 + djmfix::logging::Logger* logger;
1.26 snd_rawmidi_t* input;
1.27 snd_rawmidi_t* output;
1.28 std::thread receivingThread;
1.29 @@ -41,22 +46,27 @@
1.30
1.31 std::vector<int> cardNumbers;
1.32
1.33 - std::cerr << "Looking for available cards:" << std::endl; // TODO: do not mess STDIO
1.34 + logger->log(L::INFO, "Looking for available cards:");
1.35
1.36 for (int card = -1; snd_card_next(&card) == 0 && card >= 0;) {
1.37 char* longName = nullptr;
1.38 snd_card_get_longname(card, &longName);
1.39 - std::cerr << "card: #" << card << ": '" << longName << "'"; // TODO: do not mess STDIO
1.40 +
1.41 + std::stringstream logMessage;
1.42 + logMessage << " - card: #" << card << ": '" << longName << "'";
1.43 +
1.44 if (std::regex_match(longName, cardNamePattern)) {
1.45 cardNumbers.push_back(card);
1.46 - std::cerr << " [matches]"; // TODO: do not mess STDIO
1.47 + logMessage << " [matches]";
1.48 }
1.49 - std::cerr << std::endl;
1.50 +
1.51 + logger->log(L::INFO, logMessage.str());
1.52 +
1.53 free(longName);
1.54 }
1.55
1.56 if (cardNumbers.size() == 1) {
1.57 - std::cerr << "Going to fix card #" << cardNumbers[0] << std::endl; // TODO: do not mess STDIO
1.58 + logger->log(L::INFO, "Going to fix card #" + std::to_string(cardNumbers[0]));
1.59 return "hw:" + std::to_string(cardNumbers[0]);
1.60 } else if (cardNumbers.empty()) {
1.61 throw std::invalid_argument("No card with matching name found. Is the card connected? Maybe try to provide different name pattern.");
1.62 @@ -82,7 +92,7 @@
1.63 }
1.64 public:
1.65
1.66 - AlsaBridgeImpl(djmfix::DJMFix* djmFix, const std::string& cardNamePattern) : djmFix(djmFix) {
1.67 + AlsaBridgeImpl(djmfix::DJMFix* djmFix, const std::string& cardNamePattern, djmfix::logging::Logger* logger) : djmFix(djmFix), logger(logger ? logger : djmfix::logging::blackhole()) {
1.68 if (djmFix == nullptr) throw std::invalid_argument("need a djmFix for AlsaBridge");
1.69
1.70 std::string deviceName = findDeviceName(std::regex(cardNamePattern));
1.71 @@ -95,10 +105,10 @@
1.72 }
1.73
1.74 virtual ~AlsaBridgeImpl() {
1.75 - // TODO: do not use raw/exclusive access to the device
1.76 + // TODO: do not use raw/exclusive access to the MIDI device
1.77 snd_rawmidi_close(input);
1.78 snd_rawmidi_close(output);
1.79 - std::cerr << "~AlsaBridgeImpl()" << std::endl; // TODO: do not mess STDIO
1.80 + logger->log(L::FINE, "~AlsaBridgeImpl()");
1.81 }
1.82
1.83 virtual void start() override {
1.84 @@ -115,13 +125,13 @@
1.85 virtual void send(MidiMessage midiMessage) override {
1.86 std::lock_guard<std::recursive_mutex> lock(midiMutex);
1.87 ssize_t length = snd_rawmidi_write(output, midiMessage.data(), midiMessage.size());
1.88 - std::cerr << "AlsaBridgeImpl::send(): length = " << length << std::endl; // TODO: do not mess STDIO
1.89 + logger->log(L::INFO, "AlsaBridgeImpl::send(): length = " + std::to_string(length));
1.90 }
1.91
1.92 };
1.93
1.94 -AlsaBridge* create(djmfix::DJMFix* djmFix, const std::string& deviceName) {
1.95 - return new AlsaBridgeImpl(djmFix, deviceName);
1.96 +AlsaBridge* create(djmfix::DJMFix* djmFix, const std::string& deviceName, djmfix::logging::Logger* logger) {
1.97 + return new AlsaBridgeImpl(djmFix, deviceName, logger);
1.98 }
1.99
1.100 }