Annotation of src/usr.bin/aucat/aproc.h, Revision 1.1
1.1 ! ratchov 1: /* $OpenBSD$ */
! 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 APROC_H
! 18: #define APROC_H
! 19:
! 20: #include <sys/queue.h>
! 21:
! 22: #include "aparams.h"
! 23:
! 24: struct abuf;
! 25: struct aproc;
! 26: struct file;
! 27:
! 28: struct aproc_ops {
! 29: /*
! 30: * Name of the ops structure, ie type of the unit.
! 31: */
! 32: char *name;
! 33:
! 34: /*
! 35: * The state of the given input abuf changed (eg. an input block
! 36: * is ready for processing). This function must get the block
! 37: * from the input, process it and remove it from the buffer.
! 38: *
! 39: * Processing the block will result in a change of the state of
! 40: * OTHER buffers that are attached to the aproc (eg. the output
! 41: * buffer was filled), thus this routine MUST notify ALL aproc
! 42: * structures that are waiting on it; most of the time this
! 43: * means just calling abuf_flush() on the output buffer.
! 44: */
! 45: int (*in)(struct aproc *, struct abuf *);
! 46:
! 47: /*
! 48: * The state of the given output abuf changed (eg. space for a
! 49: * new output block was made available) so processing can
! 50: * continue. This function must process more input in order to
! 51: * fill the output block.
! 52: *
! 53: * Producing a block will result in the change of the state of
! 54: * OTHER buffers that are attached to the aproc, thus this
! 55: * routine MUST notify ALL aproc structures that are waiting on
! 56: * it; most of the time this means calling abuf_fill() on the
! 57: * source buffers.
! 58: *
! 59: * Before filling input buffers (using abuf_fill()), this
! 60: * routine must ALWAYS check for eof condition, and if needed,
! 61: * handle it appropriately and call abuf_hup() to free the input
! 62: * buffer.
! 63: */
! 64: int (*out)(struct aproc *, struct abuf *);
! 65:
! 66: /*
! 67: * The input buffer is empty and we can no more receive data
! 68: * from it. The buffer will be destroyed as soon as this call
! 69: * returns so the abuf pointer will stop being valid after this
! 70: * call returns. There's no need to drain the buffer because the
! 71: * in() call-back was just called before.
! 72: *
! 73: * If this call reads and/or writes data on other buffers,
! 74: * abuf_flush() and abuf_fill() must be called appropriately.
! 75: */
! 76: void (*eof)(struct aproc *, struct abuf *);
! 77:
! 78: /*
! 79: * The output buffer can no more accept data (it should be
! 80: * considered as full). After this function returns, it will be
! 81: * destroyed and the "abuf" pointer will be no more valid.
! 82: */
! 83: void (*hup)(struct aproc *, struct abuf *);
! 84:
! 85: /*
! 86: * A new input was connected.
! 87: */
! 88: void (*newin)(struct aproc *, struct abuf *);
! 89:
! 90: /*
! 91: * A new output was connected
! 92: */
! 93: void (*newout)(struct aproc *, struct abuf *);
! 94: };
! 95:
! 96: struct aconv {
! 97: /*
! 98: * Format of the buffer. This part is used by conversion code.
! 99: */
! 100:
! 101: int bfirst; /* bytes to skip at startup */
! 102: unsigned rate; /* frames per second */
! 103: unsigned pos; /* current position in the stream */
! 104: unsigned nch; /* number of channels: nch = cmax - cmin + 1 */
! 105: unsigned bps; /* bytes per sample (padding included) */
! 106: unsigned shift; /* shift to get 32bit MSB-justified int */
! 107: int sigbit; /* sign bits to XOR to unsigned samples */
! 108: int bnext; /* bytes to skip to reach the next byte */
! 109: int snext; /* bytes to skip to reach the next sample */
! 110: unsigned cmin; /* provided/consumed channels */
! 111: unsigned bpf; /* bytes per frame: bpf = nch * bps */
! 112: int ctx[CHAN_MAX]; /* current frame (for resampling) */
! 113: };
! 114:
! 115: /*
! 116: * The aproc structure represents a simple audio processing unit; they are
! 117: * interconnected by abuf structures and form a kind of "circuit". The circuit
! 118: * cannot have loops.
! 119: */
! 120: struct aproc {
! 121: char *name; /* for debug purposes */
! 122: struct aproc_ops *ops; /* call-backs */
! 123: LIST_HEAD(, abuf) ibuflist; /* list of inputs */
! 124: LIST_HEAD(, abuf) obuflist; /* list of outputs */
! 125: union { /* follow type-specific data */
! 126: struct { /* file/device io */
! 127: struct file *file; /* file to read/write */
! 128: } io;
! 129: struct {
! 130: struct aconv ist, ost;
! 131: } conv;
! 132: } u;
! 133: };
! 134:
! 135: void aproc_del(struct aproc *);
! 136: void aproc_setin(struct aproc *, struct abuf *);
! 137: void aproc_setout(struct aproc *, struct abuf *);
! 138:
! 139: struct aproc *rpipe_new(struct file *);
! 140: struct aproc *wpipe_new(struct file *);
! 141: struct aproc *mix_new(void);
! 142: struct aproc *sub_new(void);
! 143: struct aproc *conv_new(char *, struct aparams *, struct aparams *);
! 144:
! 145: #endif /* !defined(FIFO_H) */