Annotation of src/usr.bin/sndiod/sysex.h, Revision 1.3
1.3 ! jmc 1: /* $OpenBSD: sysex.h,v 1.2 2013/12/20 08:47:37 ratchov Exp $ */
1.1 ratchov 2: /*
3: * Copyright (c) 2011 Alexandre Ratchov <alex@caoua.org>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17: #ifndef AUCAT_SYSEX_H
18: #define AUCAT_SYSEX_H
19:
20: #include <stdint.h>
21:
22: /*
23: * start and end markers
24: */
25: #define SYSEX_START 0xf0
26: #define SYSEX_END 0xf7
27:
28: /*
29: * type/vendor namespace IDs we use
30: */
31: #define SYSEX_TYPE_RT 0x7f /* real-time universal */
32: #define SYSEX_TYPE_EDU 0x7d /* non-comercial */
33:
34: /*
35: * realtime messages in the "universal real-time" namespace
36: */
37: #define SYSEX_MTC 0x01 /* mtc messages */
38: #define SYSEX_MTC_FULL 0x01 /* mtc full frame message */
39: #define SYSEX_CONTROL 0x04
40: #define SYSEX_MASTER 0x01
41: #define SYSEX_MMC 0x06
42: #define SYSEX_MMC_STOP 0x01
43: #define SYSEX_MMC_START 0x02
44: #define SYSEX_MMC_LOC 0x44
45: #define SYSEX_MMC_LOC_LEN 0x06
46: #define SYSEX_MMC_LOC_CMD 0x01
1.2 ratchov 47:
48: /*
1.3 ! jmc 49: * special "any" midi device number
1.2 ratchov 50: */
51: #define SYSEX_DEV_ANY 0x7f
1.1 ratchov 52:
53: /*
54: * aucat-specific messages, in the "edu" namespace
55: */
56: #define SYSEX_AUCAT 0x23 /* aucat-specific */
57: #define SYSEX_AUCAT_SLOTDESC 0x01 /* mixer info */
58: #define SYSEX_AUCAT_DUMPREQ 0x02 /* dump request */
59: #define SYSEX_AUCAT_DUMPEND 0x03 /* end of dump */
60:
61: /*
62: * minimum size of sysex message we accept
63: */
64: #define SYSEX_SIZE(m) (5 + sizeof(struct sysex_ ## m))
65:
66: /*
67: * all possible system exclusive messages we support. For aucat-specific
68: * messages we use the same header as real-time messages to simplify the
69: * message parser
70: */
71: struct sysex {
72: uint8_t start;
73: uint8_t type; /* type or vendor id */
74: uint8_t dev; /* device or product id */
75: uint8_t id0; /* message id */
76: uint8_t id1; /* sub-id */
77: union sysex_all {
78: struct sysex_empty {
79: uint8_t end;
80: } empty;
81: struct sysex_master {
82: uint8_t fine;
83: uint8_t coarse;
84: uint8_t end;
85: } master;
86: struct sysex_start {
87: uint8_t end;
88: } start;
89: struct sysex_stop {
90: uint8_t end;
91: } stop;
92: struct sysex_loc {
93: uint8_t len;
94: uint8_t cmd;
95: uint8_t hr;
96: uint8_t min;
97: uint8_t sec;
98: uint8_t fr;
99: uint8_t cent;
100: uint8_t end;
101: } loc;
102: struct sysex_full {
103: uint8_t hr;
104: uint8_t min;
105: uint8_t sec;
106: uint8_t fr;
107: uint8_t end;
108: } full;
109: struct sysex_slotdesc {
110: uint8_t chan; /* channel */
111: uint8_t vol; /* current volume */
112: #define SYSEX_NAMELEN 10 /* \0 included */
113: uint8_t name[SYSEX_NAMELEN]; /* stream name */
114: uint8_t end;
115: } slotdesc;
116: struct sysex_dumpreq {
117: uint8_t end;
118: } dumpreq;
119: struct sysex_dumpend {
120: uint8_t end;
121: } dumpend;
122: } u;
123: };
124:
125: #endif /* !defined(AUCAT_SYSEX_H) */