1 /* $OpenBSD: midivar.h,v 1.5 2005/11/21 18:16:38 millert Exp $ */
2
3 /*
4 * Copyright (c) 2003, 2004 Alexandre Ratchov
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #ifndef _SYS_DEV_MIDIVAR_H_
20 #define _SYS_DEV_MIDIVAR_H_
21
22 #include <dev/midi_if.h>
23 #include <sys/device.h>
24 #include <sys/selinfo.h>
25 #include <sys/proc.h>
26 #include <sys/timeout.h>
27
28 #define MIDI_MAXWRITE 32 /* max bytes to give to the uart at once */
29 #define MIDI_RATE 3125 /* midi uart baud rate in bytes/second */
30 #define MIDI_UNIT(a) ((a) & 0xff)
31 #define MIDI_DEV2SC(a) (midi_cd.cd_devs[MIDI_UNIT(a)])
32
33 #include "sequencer.h"
34
35 #if NSEQUENCER > 0
36 struct midi_dev; /* defined in sequencervar.h */
37 #endif
38
39 /*
40 * simple ring buffer
41 */
42 #define MIDIBUF_SIZE (1 << 10)
43 #define MIDIBUF_MASK (MIDIBUF_SIZE - 1)
44 struct midi_buffer {
45 unsigned char data[MIDIBUF_SIZE];
46 unsigned start, used;
47 };
48 #define MIDIBUF_START(buf) ((buf)->start)
49 #define MIDIBUF_END(buf) (((buf)->start + (buf)->used) & MIDIBUF_MASK)
50 #define MIDIBUF_USED(buf) ((buf)->used)
51 #define MIDIBUF_AVAIL(buf) (MIDIBUF_SIZE - (buf)->used)
52 #define MIDIBUF_ISFULL(buf) ((buf)->used >= MIDIBUF_SIZE)
53 #define MIDIBUF_ISEMPTY(buf) ((buf)->used == 0)
54 #define MIDIBUF_WRITE(buf, byte) \
55 do { \
56 (buf)->data[MIDIBUF_END(buf)] = (byte); \
57 (buf)->used++; \
58 } while(0)
59 #define MIDIBUF_READ(buf, byte) \
60 do { \
61 (byte) = (buf)->data[(buf)->start++]; \
62 (buf)->start &= MIDIBUF_MASK; \
63 (buf)->used--; \
64 } while(0)
65 #define MIDIBUF_REMOVE(buf, count) \
66 do { \
67 (buf)->start += (count); \
68 (buf)->start &= MIDIBUF_MASK; \
69 (buf)->used -= (count); \
70 } while(0)
71 #define MIDIBUF_INIT(buf) \
72 do { \
73 (buf)->start = (buf)->used = 0; \
74 } while(0)
75
76
77 struct midi_softc {
78 struct device dev;
79 struct midi_hw_if *hw_if;
80 void *hw_hdl;
81 int isopen;
82 int isbusy; /* concerns only the output */
83 int isdying;
84 int flags; /* open flags */
85 int props; /* midi hw proprieties */
86 int rchan;
87 int wchan;
88 unsigned wait; /* see midi_out_do */
89 struct selinfo rsel;
90 struct selinfo wsel;
91 struct proc *async;
92 struct timeout timeo;
93 struct midi_buffer inbuf;
94 struct midi_buffer outbuf;
95 #if NSEQUENCER > 0
96 int seqopen;
97 struct midi_dev *seq_md; /* structure that links us with the seq. */
98 int evindex;
99 unsigned char evstatus;
100 unsigned char evdata[2];
101 #endif /* NSEQUENCER > 0 */
102 };
103
104 #endif /* _SYS_DEV_MIDIVAR_H_ */