summaryrefslogtreecommitdiff
path: root/apps/mixer.c
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2015-10-10 20:24:30 +0200
committerChristian Pointner <equinox@spreadspace.org>2015-10-10 20:24:42 +0200
commit9950027ef8634045588e461a2e274c50dc893c0d (patch)
treed6d54a9998e64b3bb4c068cc202799c5be34fc94 /apps/mixer.c
parentimproved poll() handling (diff)
added mixer
Diffstat (limited to 'apps/mixer.c')
-rw-r--r--apps/mixer.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/apps/mixer.c b/apps/mixer.c
new file mode 100644
index 0000000..1e3287f
--- /dev/null
+++ b/apps/mixer.c
@@ -0,0 +1,83 @@
+/*
+ * dolmetschctl
+ *
+ *
+ * Copyright (C) 2015 Christian Pointner <equinox@spreadspace.org>
+ *
+ * This file is part of dolmetschctl.
+ *
+ * dolmetschctl is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+ *
+ * dolmetschctl is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with dolmetschctl. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <error.h>
+#include <poll.h>
+#include <assert.h>
+
+#include "mixer.h"
+
+
+int mixer_init(mixer_t* m, const char* name, const char* device)
+{
+ assert(m != NULL);
+
+ m->name_ = name;
+ m->output_ = NULL;
+ int ret = snd_rawmidi_open(NULL, &(m->output_), device, SND_RAWMIDI_NONBLOCK);
+ if(ret < 0) {
+ error(0, 0, "MIXER: cannot open midi port '%s': %s", device, snd_strerror(ret));
+ return ret;
+ }
+
+ return 0;
+}
+
+int mixer_get_poll_fd_count(mixer_t* m)
+{
+ return snd_rawmidi_poll_descriptors_count(m->output_);
+}
+
+int mixer_get_poll_fds(mixer_t* m, struct pollfd *pfds, int npfds)
+{
+ return snd_rawmidi_poll_descriptors(m->output_, pfds, npfds);
+}
+
+int mixer_handle_revents(mixer_t* m, struct pollfd *pfds, int npfds)
+{
+ int err;
+ unsigned short revents;
+ if((err = snd_rawmidi_poll_descriptors_revents(m->output_, pfds, npfds, &revents)) < 0) {
+ error(0, 0, "MIXER: cannot get poll events: %s", snd_strerror(errno));
+ return -1;
+ }
+ if(pfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {
+ error(0, 0, "MIXER: got POLLERR, POLLHUP or POLLNVAL");
+ return -1;
+ }
+ if(!(revents & POLLOUT))
+ return 0;
+
+ u_int8_t buf[3] = { 0xB0, 0x00, 0x02 };
+ int ret = snd_rawmidi_write(m->output_, buf, sizeof(buf));
+ if(ret == -EAGAIN)
+ return 0;
+ if(ret < 0) {
+ error(0, 0, "MIXER: cannot write to midi port: %s", snd_strerror(ret));
+ return -1;
+ }
+
+ return 0;
+}