diff options
-rw-r--r-- | alsa.cpp | 43 |
1 files changed, 39 insertions, 4 deletions
@@ -8,7 +8,10 @@ #include <limits> #include <exception> #include <stdexcept> + #include <stdio.h> +#include <sys/types.h> +#include <sys/time.h> using namespace std::string_literals; @@ -100,7 +103,9 @@ public: throw std::runtime_error("PCM could not be started"); } - std::cout << "Info: " << std::to_string(npfd) << " poll fds for pcm" << std::endl; + if (npfd != 1) { + std::cout << "Warning: " << std::to_string(npfd) << " poll fds for pcm" << std::endl; + } } ~PCM() @@ -114,6 +119,11 @@ public: free(pfd); } + int fd() + { + return pfd->fd; + } + // write from buffer to ALSA PCM void write() { @@ -204,7 +214,7 @@ public: snd_seq_port_subscribe_set_sender(subs, &sender); snd_seq_port_subscribe_set_dest(subs, &dest); snd_seq_port_subscribe_set_queue(subs, 1); - snd_seq_port_subscribe_set_time_update(subs, 1); + //snd_seq_port_subscribe_set_time_update(subs, 1); snd_seq_port_subscribe_set_time_real(subs, 1); // TODO: fix timestamp (currently always 0) if (0 > snd_seq_subscribe_port(seq_handle, subs)) @@ -227,7 +237,9 @@ public: throw std::runtime_error("snd_seq_poll_descriptors() failure"); } - std::cout << "Info: " << std::to_string(npfd) << " poll fds for MIDI" << std::endl; + if (npfd != 1) { + std::cout << "Warning: " << std::to_string(npfd) << " poll fds for MIDI" << std::endl; + } } ~MIDI() @@ -235,6 +247,11 @@ public: free(pfd); } + int fd() + { + return pfd->fd; + } + bool event_ready() { int result = snd_seq_event_input_pending(seq_handle, 1); @@ -324,8 +341,26 @@ int main(void) stream.generate(); while (true) { - midi.wait_for_event(); + //midi.wait_for_event(); //pcm.wait_for_event(); + fd_set read_set; + FD_ZERO(&read_set); + FD_SET(midi.fd(), &read_set); + + fd_set write_set; + FD_ZERO(&write_set); + FD_SET(pcm.fd(), &write_set); + + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + int result = select(FD_SETSIZE, &read_set, &write_set, NULL, &timeout); + if (result < 0) { + throw std::runtime_error("select() failed"); + } else if (result == 0) { + throw std::runtime_error("select() timeout"); + } if (midi.event_ready()) { |