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