#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <google/protobuf/message.h>
#include <google/protobuf/text_format.h>
+#include <pthread.h>
#include <poll.h>
#include <stdint.h>
#include <stdio.h>
{
should_quit = true;
const uint64_t one = 1;
- write(should_quit_fd, &one, sizeof(one));
+ if (write(should_quit_fd, &one, sizeof(one)) != sizeof(one)) {
+ perror("write(should_quit_fd)");
+ exit(1);
+ }
midi_thread.join();
close(should_quit_fd);
}
void MIDIMapper::thread_func()
{
+ pthread_setname_np(pthread_self(), "MIDIMapper");
+
snd_seq_t *seq;
int err;
if (err < 0) {
if (err == -EINTR) continue;
if (err == -EAGAIN) break;
+ if (err == -ENOSPC) {
+ fprintf(stderr, "snd_seq_event_input: Some events were lost.\n");
+ continue;
+ }
fprintf(stderr, "snd_seq_event_input: %s\n", snd_strerror(err));
return;
}
lock_guard<mutex> lock(mu);
switch (event->type) {
case SND_SEQ_EVENT_CONTROLLER: {
- printf("Controller %d changed to %d\n", event->data.control.param, event->data.control.value);
-
const int controller = event->data.control.param;
const float value = map_controller_to_float(event->data.control.value);
receiver->note_on(note);
- printf("Note: %d\n", note);
-
for (size_t bus_idx = 0; bus_idx < size_t(mapping_proto->bus_mapping_size()); ++bus_idx) {
const MIDIMappingBusProto &bus_mapping = mapping_proto->bus_mapping(bus_idx);
if (bus_mapping.has_prev_bank() &&
bind(&ControllerReceiver::toggle_limiter, receiver));
match_button(note, MIDIMappingBusProto::kToggleAutoMakeupGainFieldNumber, MIDIMappingProto::kToggleAutoMakeupGainBankFieldNumber,
bind(&ControllerReceiver::toggle_auto_makeup_gain, receiver));
+ break;
}
case SND_SEQ_EVENT_PORT_START:
subscribe_to_port_lock_held(seq, event->data.addr);
void MIDIMapper::subscribe_to_port_lock_held(snd_seq_t *seq, const snd_seq_addr_t &addr)
{
- // Client 0 is basically the system; ignore it.
- if (addr.client == 0) {
+ // Client 0 (SNDRV_SEQ_CLIENT_SYSTEM) is basically the system; ignore it.
+ // MIDI through (SNDRV_SEQ_CLIENT_DUMMY) echoes back what we give it, so ignore that, too.
+ if (addr.client == 0 || addr.client == 14) {
+ return;
+ }
+
+ // Don't listen to ourselves.
+ if (addr.client == snd_seq_client_id(seq)) {
return;
}