xref: /openbsd/usr.bin/aucat/abuf.h (revision 3d8817e4)
1 /*	$OpenBSD: abuf.h,v 1.23 2010/10/21 18:57:42 ratchov Exp $	*/
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 
22 struct aproc;
23 struct aparams;
24 
25 struct abuf {
26 	LIST_ENTRY(abuf) ient;	/* reader's list of inputs entry */
27 	LIST_ENTRY(abuf) oent;	/* writer's list of outputs entry */
28 
29 	/*
30 	 * fifo parameters
31 	 */
32 	unsigned bpf;		/* bytes per frame */
33 	unsigned cmin, cmax;	/* channel range of this buf */
34 	unsigned start;		/* offset where data starts */
35 	unsigned used;		/* valid data */
36 	unsigned len;		/* size of the ring */
37 	struct aproc *rproc;	/* reader */
38 	struct aproc *wproc;	/* writer */
39 	struct abuf *duplex;	/* link to buffer of the other direction */
40 	unsigned inuse;		/* in abuf_{flush,fill,run}() */
41 	unsigned tickets;	/* max data to (if throttling) */
42 
43 	/*
44 	 * Misc reader aproc-specific per-buffer parameters.
45 	 */
46 	union {
47 		struct {
48 			int weight;	/* dynamic range */
49 			int maxweight;	/* max dynamic range allowed */
50 			unsigned vol;	/* volume within the dynamic range */
51 			unsigned done;	/* frames ready */
52 			unsigned xrun;	/* underrun policy */
53 			int drop;	/* frames to drop on next read */
54 		} mix;
55 		struct {
56 			unsigned st;	/* MIDI running status */
57 			unsigned used;	/* bytes used from ``msg'' */
58 			unsigned idx;	/* actual MIDI message size */
59 			unsigned len;	/* MIDI message length */
60 #define MIDI_MSGMAX	16		/* max size of MIDI messaage */
61 			unsigned char msg[MIDI_MSGMAX];
62 		} midi;
63 	} r;
64 
65 	/*
66 	 * Misc reader aproc-specific per-buffer parameters.
67 	 */
68 	union {
69 		struct {
70 			unsigned todo;	/* frames to process */
71 		} mix;
72 		struct {
73 			unsigned done;	/* frames copied */
74 			unsigned xrun;	/* overrun policy, one of XRUN_XXX */
75 			int silence;	/* silence to add on next write */
76 		} sub;
77 	} w;
78 };
79 
80 /*
81  * the buffer contains at least one frame. This macro should
82  * be used to check if the buffer can be flushed
83  */
84 #define ABUF_ROK(b) ((b)->used > 0)
85 
86 /*
87  * there's room for at least one frame
88  */
89 #define ABUF_WOK(b) ((b)->len - (b)->used > 0)
90 
91 /*
92  * the buffer is empty and has no writer anymore
93  */
94 #define ABUF_EOF(b) (!ABUF_ROK(b) && (b)->wproc == NULL)
95 
96 /*
97  * the buffer has no reader anymore, note that it's not
98  * enough the buffer to be disconnected, because it can
99  * be not yet connected buffer (eg. socket play buffer)
100  */
101 #define ABUF_HUP(b) (!ABUF_WOK(b) && (b)->rproc == NULL)
102 
103 struct abuf *abuf_new(unsigned, struct aparams *);
104 void abuf_del(struct abuf *);
105 void abuf_dbg(struct abuf *);
106 void abuf_clear(struct abuf *);
107 unsigned char *abuf_rgetblk(struct abuf *, unsigned *, unsigned);
108 unsigned char *abuf_wgetblk(struct abuf *, unsigned *, unsigned);
109 void abuf_rdiscard(struct abuf *, unsigned);
110 void abuf_wcommit(struct abuf *, unsigned);
111 int abuf_fill(struct abuf *);
112 int abuf_flush(struct abuf *);
113 void abuf_eof(struct abuf *);
114 void abuf_hup(struct abuf *);
115 void abuf_run(struct abuf *);
116 void abuf_ipos(struct abuf *, int);
117 void abuf_opos(struct abuf *, int);
118 
119 #endif /* !defined(ABUF_H) */
120