AlsaBridge.cpp
branchv_0
changeset 12 15d87fdd6e6c
parent 11 5b351628a377
child 13 334b727f7516
     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  }