summaryrefslogtreecommitdiff
path: root/usr.bin/aucat/abuf.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/aucat/abuf.h')
-rw-r--r--usr.bin/aucat/abuf.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/usr.bin/aucat/abuf.h b/usr.bin/aucat/abuf.h
new file mode 100644
index 00000000000..b28325b93b4
--- /dev/null
+++ b/usr.bin/aucat/abuf.h
@@ -0,0 +1,86 @@
+/* $OpenBSD: abuf.h,v 1.1 2008/05/23 07:15:46 ratchov Exp $ */
+/*
+ * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org>
+ *
+ * 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 ABUF_H
+#define ABUF_H
+
+#include <sys/queue.h>
+
+struct abuf;
+struct aproc;
+
+struct abuf {
+ /*
+ * misc aproc-specific per-buffer parameters
+ */
+ int mixvol; /* input gain */
+ unsigned mixdone; /* input of mixer */
+ unsigned mixtodo; /* output of mixer */
+ unsigned subdone; /* output if sub */
+ LIST_ENTRY(abuf) ient; /* for mix inputs list */
+ LIST_ENTRY(abuf) oent; /* for sub outputs list */
+
+ /*
+ * fifo parameters
+ */
+ unsigned bpf; /* bytes per frame */
+ unsigned start; /* offset where data starts */
+ unsigned used; /* valid data */
+ unsigned len; /* size of the ring */
+ struct aproc *rproc; /* reader */
+ struct aproc *wproc; /* writer */
+ unsigned char data[]; /* actual data */
+};
+
+/*
+ * the buffer contains at least one frame. This macro should
+ * be used to check if the buffer can be flushed
+ */
+#define ABUF_ROK(b) ((b)->used >= (b)->bpf)
+
+/*
+ * there's room for at least one frame
+ */
+#define ABUF_WOK(b) ((b)->len - (b)->used >= (b)->bpf)
+
+/*
+ * the buffer is empty and has no more writer
+ */
+#define ABUF_EOF(b) (!ABUF_ROK(b) && (b)->wproc == NULL)
+
+/*
+ * similar to !ABUF_WOK, but is used for file i/o, where
+ * operation may not involve an integer number of frames
+ */
+#define ABUF_FULL(b) ((b)->used == (b)->len)
+
+/*
+ * same as !ABUF_ROK, but used for files, where
+ * operations are byte orientated, not frame-oriented
+ */
+#define ABUF_EMPTY(b) ((b)->used == 0)
+
+struct abuf *abuf_new(unsigned, unsigned);
+void abuf_del(struct abuf *);
+unsigned char *abuf_rgetblk(struct abuf *, unsigned *, unsigned);
+unsigned char *abuf_wgetblk(struct abuf *, unsigned *, unsigned);
+void abuf_fill(struct abuf *);
+void abuf_flush(struct abuf *);
+void abuf_eof(struct abuf *);
+void abuf_hup(struct abuf *);
+void abuf_run(struct abuf *);
+
+#endif /* !defined(ABUF_H) */