summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2018-10-31 08:13:51 +0200
committerJari Vetoniemi <mailroxas@gmail.com>2018-10-31 08:13:51 +0200
commitd5407e5d9b536007d5ae2d5d25367226163ef758 (patch)
treed1347883207472cc0837e47ce406d0e1cc8ad981
parent9269dd4f456f01b342438538dedfad715abcc3bc (diff)
minor fixes
-rw-r--r--libasound.c8
-rw-r--r--sysex.h120
2 files changed, 125 insertions, 3 deletions
diff --git a/libasound.c b/libasound.c
index 26329f9..00bf1a6 100644
--- a/libasound.c
+++ b/libasound.c
@@ -202,19 +202,21 @@ device_open(snd_pcm_t *pcm, const char *name, snd_pcm_stream_t stream, int mode)
int
snd_pcm_open(snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode)
{
- assert(pcm);
-
if (!(*pcm = calloc(1, sizeof(**pcm)))) {
WARN1("calloc");
return -1;
}
if (!((*pcm)->hdl = device_open(*pcm, name, stream, mode)))
- return -1;
+ goto fail;
sio_initpar(&(*pcm)->hw_requested.par);
(*pcm)->name = (name ? name : "default");
return (sio_getcap((*pcm)->hdl, &(*pcm)->hw.cap) && sio_getpar((*pcm)->hdl, &(*pcm)->hw.par) ? 0 : -1);
+
+fail:
+ free(*pcm);
+ return -1;
}
int
diff --git a/sysex.h b/sysex.h
new file mode 100644
index 0000000..245cd2a
--- /dev/null
+++ b/sysex.h
@@ -0,0 +1,120 @@
+/* $OpenBSD$ */
+/*
+ * Copyright (c) 2011 Alexandre Ratchov <alex@caoua.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#ifndef AUCAT_SYSEX_H
+#define AUCAT_SYSEX_H
+
+#include <stdint.h>
+
+/*
+ * start and end markers
+ */
+#define SYSEX_START 0xf0
+#define SYSEX_END 0xf7
+
+/*
+ * type/vendor namespace IDs we use
+ */
+#define SYSEX_TYPE_RT 0x7f /* real-time universal */
+#define SYSEX_TYPE_EDU 0x7d /* non-comercial */
+
+/*
+ * realtime messages in the "universal real-time" namespace
+ */
+#define SYSEX_MTC 0x01 /* mtc messages */
+#define SYSEX_MTC_FULL 0x01 /* mtc full frame message */
+#define SYSEX_CONTROL 0x04
+#define SYSEX_MASTER 0x01
+#define SYSEX_MMC 0x06
+#define SYSEX_MMC_STOP 0x01
+#define SYSEX_MMC_START 0x02
+#define SYSEX_MMC_LOC 0x44
+#define SYSEX_MMC_LOC_LEN 0x06
+#define SYSEX_MMC_LOC_CMD 0x01
+
+/*
+ * aucat-specific messages, in the "edu" namespace
+ */
+#define SYSEX_AUCAT 0x23 /* aucat-specific */
+#define SYSEX_AUCAT_MIXINFO 0x01 /* mixer info */
+#define SYSEX_AUCAT_DUMPREQ 0x02 /* dump request */
+#define SYSEX_AUCAT_DUMPEND 0x03 /* end of dump */
+
+/*
+ * minimum size of sysex message we accept
+ */
+#define SYSEX_SIZE(m) (5 + sizeof(struct sysex_ ## m))
+
+/*
+ * all possible system exclusive messages we support. For aucat-specific
+ * messages we use the same header as real-time messages to simplify the
+ * message parser
+ */
+struct sysex {
+ uint8_t start;
+ uint8_t type; /* type or vendor id */
+ uint8_t dev; /* device or product id */
+ uint8_t id0; /* message id */
+ uint8_t id1; /* sub-id */
+ union sysex_all {
+ struct sysex_empty {
+ uint8_t end;
+ } empty;
+ struct sysex_master {
+ uint8_t fine;
+ uint8_t coarse;
+ uint8_t end;
+ } master;
+ struct sysex_start {
+ uint8_t end;
+ } start;
+ struct sysex_stop {
+ uint8_t end;
+ } stop;
+ struct sysex_loc {
+ uint8_t len;
+ uint8_t cmd;
+ uint8_t hr;
+ uint8_t min;
+ uint8_t sec;
+ uint8_t fr;
+ uint8_t cent;
+ uint8_t end;
+ } loc;
+ struct sysex_full {
+ uint8_t hr;
+ uint8_t min;
+ uint8_t sec;
+ uint8_t fr;
+ uint8_t end;
+ } full;
+ struct sysex_mixinfo {
+ uint8_t chan; /* channel */
+ uint8_t vol; /* current volume */
+#define SYSEX_NAMELEN 10 /* \0 included */
+ uint8_t name[SYSEX_NAMELEN]; /* stream name */
+ uint8_t end;
+ } mixinfo;
+ struct sysex_dumpreq {
+ uint8_t end;
+ } dumpreq;
+ struct sysex_dumpend {
+ uint8_t end;
+ } dumpend;
+ } u;
+};
+
+#endif /* !defined(AUCAT_SYSEX_H) */