Annotation of src/usr.bin/aucat/abuf.h, Revision 1.19
1.19 ! ratchov 1: /* $OpenBSD: abuf.h,v 1.18 2009/09/27 11:51:20 ratchov Exp $ */
1.1 ratchov 2: /*
3: * Copyright (c) 2008 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 ABUF_H
18: #define ABUF_H
19:
20: #include <sys/queue.h>
21:
1.19 ! ratchov 22: #define XRUN_IGNORE 0 /* on xrun silently insert/discard samples */
! 23: #define XRUN_SYNC 1 /* catchup to sync to the mix/sub */
! 24: #define XRUN_ERROR 2 /* xruns are errors, eof/hup buffer */
! 25: #define MIDI_MSGMAX 16 /* max size of MIDI messaage */
! 26:
1.1 ratchov 27: struct aproc;
1.16 ratchov 28: struct aparams;
1.1 ratchov 29:
30: struct abuf {
1.19 ! ratchov 31: LIST_ENTRY(abuf) ient; /* reader's list of inputs entry */
! 32: LIST_ENTRY(abuf) oent; /* writer's list of outputs entry */
1.15 ratchov 33:
1.1 ratchov 34: /*
35: * fifo parameters
36: */
37: unsigned bpf; /* bytes per frame */
1.10 ratchov 38: unsigned cmin, cmax; /* channel range of this buf */
1.1 ratchov 39: unsigned start; /* offset where data starts */
40: unsigned used; /* valid data */
41: unsigned len; /* size of the ring */
1.7 ratchov 42: unsigned abspos; /* frame number of the start position */
1.6 ratchov 43: unsigned silence; /* silence to insert on next write */
1.8 ratchov 44: unsigned drop; /* bytes to drop on next read */
1.1 ratchov 45: struct aproc *rproc; /* reader */
46: struct aproc *wproc; /* writer */
1.9 ratchov 47: struct abuf *duplex; /* link to buffer of the other direction */
48: unsigned inuse; /* in abuf_{flush,fill,run}() */
1.19 ! ratchov 49: unsigned tickets; /* max data to (if throttling) */
! 50:
! 51: /*
! 52: * Misc reader aproc-specific per-buffer parameters.
! 53: */
! 54: union {
! 55: struct {
! 56: int weight; /* dynamic range */
! 57: int maxweight; /* max dynamic range allowed */
! 58: unsigned vol; /* volume within the dynamic range */
! 59: unsigned done; /* bytes ready */
! 60: unsigned xrun; /* underrun policy */
! 61: } mix;
! 62: struct {
! 63: unsigned st; /* MIDI running status */
! 64: unsigned used; /* bytes used from ``msg'' */
! 65: unsigned idx; /* actual MIDI message size */
! 66: unsigned len; /* MIDI message length */
! 67: unsigned char msg[MIDI_MSGMAX];
! 68: } midi;
! 69: } r;
! 70:
! 71: /*
! 72: * Misc reader aproc-specific per-buffer parameters.
! 73: */
! 74: union {
! 75: struct {
! 76: unsigned todo; /* bytes to process */
! 77: } mix;
! 78: struct {
! 79: unsigned done; /* bytes copied */
! 80: unsigned xrun; /* overrun policy */
! 81: } sub;
! 82: } w;
1.1 ratchov 83: };
84:
85: /*
86: * the buffer contains at least one frame. This macro should
87: * be used to check if the buffer can be flushed
88: */
89: #define ABUF_ROK(b) ((b)->used >= (b)->bpf)
90:
91: /*
92: * there's room for at least one frame
93: */
94: #define ABUF_WOK(b) ((b)->len - (b)->used >= (b)->bpf)
95:
96: /*
1.17 ratchov 97: * the buffer is empty and has no writer anymore
1.1 ratchov 98: */
99: #define ABUF_EOF(b) (!ABUF_ROK(b) && (b)->wproc == NULL)
100:
101: /*
1.17 ratchov 102: * the buffer has no reader anymore, note that it's not
103: * enough the buffer to be disconnected, because it can
104: * be not yet connected buffer (eg. socket play buffer)
1.9 ratchov 105: */
106: #define ABUF_HUP(b) (!ABUF_WOK(b) && (b)->rproc == NULL)
107:
108: /*
1.1 ratchov 109: * similar to !ABUF_WOK, but is used for file i/o, where
110: * operation may not involve an integer number of frames
111: */
112: #define ABUF_FULL(b) ((b)->used == (b)->len)
113:
114: /*
115: * same as !ABUF_ROK, but used for files, where
116: * operations are byte orientated, not frame-oriented
117: */
118: #define ABUF_EMPTY(b) ((b)->used == 0)
119:
1.10 ratchov 120: struct abuf *abuf_new(unsigned, struct aparams *);
1.1 ratchov 121: void abuf_del(struct abuf *);
1.18 ratchov 122: void abuf_dbg(struct abuf *);
1.12 ratchov 123: void abuf_clear(struct abuf *);
1.1 ratchov 124: unsigned char *abuf_rgetblk(struct abuf *, unsigned *, unsigned);
125: unsigned char *abuf_wgetblk(struct abuf *, unsigned *, unsigned);
1.5 ratchov 126: void abuf_rdiscard(struct abuf *, unsigned);
127: void abuf_wcommit(struct abuf *, unsigned);
1.9 ratchov 128: int abuf_fill(struct abuf *);
129: int abuf_flush(struct abuf *);
1.1 ratchov 130: void abuf_eof(struct abuf *);
131: void abuf_hup(struct abuf *);
132: void abuf_run(struct abuf *);
1.9 ratchov 133: void abuf_ipos(struct abuf *, int);
134: void abuf_opos(struct abuf *, int);
1.1 ratchov 135:
136: #endif /* !defined(ABUF_H) */