Annotation of src/usr.bin/aucat/aproc.h, Revision 1.2
1.2 ! ratchov 1: /* $OpenBSD: aproc.h,v 1.1 2008/05/23 07:15:46 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 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;
1.2 ! ratchov 132: struct {
! 133: #define MIX_DROP 1
! 134: unsigned flags;
! 135: } mix;
! 136: struct {
! 137: #define SUB_DROP 1
! 138: unsigned flags;
! 139: } sub;
1.1 ratchov 140: } u;
141: };
142:
143: void aproc_del(struct aproc *);
144: void aproc_setin(struct aproc *, struct abuf *);
145: void aproc_setout(struct aproc *, struct abuf *);
146:
147: struct aproc *rpipe_new(struct file *);
148: struct aproc *wpipe_new(struct file *);
149: struct aproc *mix_new(void);
150: struct aproc *sub_new(void);
151: struct aproc *conv_new(char *, struct aparams *, struct aparams *);
152:
153: #endif /* !defined(FIFO_H) */