AlsaBridge.cpp
branchv_0
changeset 9 ee976a1d1f0a
parent 5 ef8f4023e32e
child 11 5b351628a377
equal deleted inserted replaced
8:87dfa7c89294 9:ee976a1d1f0a
    15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
    16  */
    16  */
    17 #include <iostream>
    17 #include <iostream>
    18 #include <stdexcept>
    18 #include <stdexcept>
    19 #include <thread>
    19 #include <thread>
       
    20 #include <mutex>
    20 #include <atomic>
    21 #include <atomic>
    21 
    22 
    22 #include <alsa/asoundlib.h>
    23 #include <alsa/asoundlib.h>
    23 
    24 
    24 #include "AlsaBridge.h"
    25 #include "AlsaBridge.h"
    30 private:
    31 private:
    31 	djmfix::DJMFix* djmFix;
    32 	djmfix::DJMFix* djmFix;
    32 	snd_rawmidi_t* input;
    33 	snd_rawmidi_t* input;
    33 	snd_rawmidi_t* output;
    34 	snd_rawmidi_t* output;
    34 	std::thread receivingThread;
    35 	std::thread receivingThread;
       
    36 	std::recursive_mutex midiMutex;
    35 	std::atomic<bool> stopped{false};
    37 	std::atomic<bool> stopped{false};
    36 
    38 
    37 	void run() {
    39 	void run() {
    38 		while (!stopped) {
    40 		while (!stopped) {
    39 			// TODO: poll
    41 			{
    40 			uint8_t buffer[256];
    42 				std::lock_guard<std::recursive_mutex> lock(midiMutex);
    41 			ssize_t length = snd_rawmidi_read(input, buffer, sizeof (buffer));
    43 				// TODO: poll
    42 			if (length > 0 && length <= sizeof (buffer)) {
    44 				uint8_t buffer[256];
    43 				// TODO: multiple messages combined together?
    45 				ssize_t length = snd_rawmidi_read(input, buffer, sizeof (buffer));
    44 				djmFix->receive(MidiMessage(buffer, buffer + length));
    46 				if (length > 0 && length <= sizeof (buffer)) {
       
    47 					// TODO: multiple messages combined together?
       
    48 					djmFix->receive(MidiMessage(buffer, buffer + length));
       
    49 				}
    45 			}
    50 			}
    46 
       
    47 			std::this_thread::sleep_for(std::chrono::milliseconds(100));
    51 			std::this_thread::sleep_for(std::chrono::milliseconds(100));
    48 		}
    52 		}
    49 	}
    53 	}
    50 public:
    54 public:
    51 
    55 
    76 		receivingThread.join();
    80 		receivingThread.join();
    77 		djmFix->stop();
    81 		djmFix->stop();
    78 	}
    82 	}
    79 
    83 
    80 	virtual void send(MidiMessage midiMessage) override {
    84 	virtual void send(MidiMessage midiMessage) override {
       
    85 		std::lock_guard<std::recursive_mutex> lock(midiMutex);
    81 		ssize_t length = snd_rawmidi_write(output, midiMessage.data(), midiMessage.size());
    86 		ssize_t length = snd_rawmidi_write(output, midiMessage.data(), midiMessage.size());
    82 		std::cerr << "AlsaBridgeImpl::send(): length = " << length << std::endl; // TODO: do not mess STDIO
    87 		std::cerr << "AlsaBridgeImpl::send(): length = " << length << std::endl; // TODO: do not mess STDIO
    83 	}
    88 	}
    84 
    89 
    85 };
    90 };