From d5407e5d9b536007d5ae2d5d25367226163ef758 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Wed, 31 Oct 2018 08:13:51 +0200 Subject: minor fixes --- libasound.c | 8 ++-- sysex.h | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 sysex.h 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 + * + * 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 + +/* + * 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) */ -- cgit v1.2.3-70-g09d2