equal
deleted
inserted
replaced
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 }; |