Annotation of src/usr.bin/aucat/aproc.h, Revision 1.30
1.30 ! ratchov 1: /* $OpenBSD: aproc.h,v 1.29 2010/01/11 13:06:32 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"
1.17 ratchov 23: #include "file.h"
1.1 ratchov 24:
25: struct abuf;
26: struct aproc;
27: struct file;
28:
29: struct aproc_ops {
30: /*
31: * Name of the ops structure, ie type of the unit.
32: */
33: char *name;
34:
35: /*
36: * The state of the given input abuf changed (eg. an input block
37: * is ready for processing). This function must get the block
38: * from the input, process it and remove it from the buffer.
39: *
40: * Processing the block will result in a change of the state of
41: * OTHER buffers that are attached to the aproc (eg. the output
42: * buffer was filled), thus this routine MUST notify ALL aproc
43: * structures that are waiting on it; most of the time this
44: * means just calling abuf_flush() on the output buffer.
45: */
46: int (*in)(struct aproc *, struct abuf *);
47:
48: /*
49: * The state of the given output abuf changed (eg. space for a
50: * new output block was made available) so processing can
51: * continue. This function must process more input in order to
52: * fill the output block.
53: *
54: * Producing a block will result in the change of the state of
55: * OTHER buffers that are attached to the aproc, thus this
56: * routine MUST notify ALL aproc structures that are waiting on
57: * it; most of the time this means calling abuf_fill() on the
58: * source buffers.
59: *
60: * Before filling input buffers (using abuf_fill()), this
61: * routine must ALWAYS check for eof condition, and if needed,
62: * handle it appropriately and call abuf_hup() to free the input
63: * buffer.
64: */
65: int (*out)(struct aproc *, struct abuf *);
66:
67: /*
68: * The input buffer is empty and we can no more receive data
69: * from it. The buffer will be destroyed as soon as this call
70: * returns so the abuf pointer will stop being valid after this
71: * call returns. There's no need to drain the buffer because the
72: * in() call-back was just called before.
73: *
74: * If this call reads and/or writes data on other buffers,
75: * abuf_flush() and abuf_fill() must be called appropriately.
76: */
77: void (*eof)(struct aproc *, struct abuf *);
78:
79: /*
80: * The output buffer can no more accept data (it should be
81: * considered as full). After this function returns, it will be
82: * destroyed and the "abuf" pointer will be no more valid.
83: */
84: void (*hup)(struct aproc *, struct abuf *);
85:
86: /*
87: * A new input was connected.
88: */
89: void (*newin)(struct aproc *, struct abuf *);
90:
91: /*
92: * A new output was connected
93: */
94: void (*newout)(struct aproc *, struct abuf *);
1.3 ratchov 95:
96: /*
1.6 ratchov 97: * Real-time record position changed (for input buffer),
1.18 ratchov 98: * by the given amount of _frames_.
1.6 ratchov 99: */
100: void (*ipos)(struct aproc *, struct abuf *, int);
101:
102: /*
103: * Real-time play position changed (for output buffer),
1.18 ratchov 104: * by the given amount of _frames_.
1.6 ratchov 105: */
106: void (*opos)(struct aproc *, struct abuf *, int);
107:
108: /*
1.18 ratchov 109: * Destroy the aproc, called just before to free the
110: * aproc structure.
1.3 ratchov 111: */
112: void (*done)(struct aproc *);
1.1 ratchov 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 */
1.15 ratchov 125: unsigned refs; /* extern references */
1.27 ratchov 126: #define APROC_ZOMB 1 /* destroyed but not freed */
127: #define APROC_QUIT 2 /* try to terminate if unused */
128: #define APROC_DROP 4 /* xrun if capable */
129: unsigned flags;
1.1 ratchov 130: union { /* follow type-specific data */
131: struct { /* file/device io */
132: struct file *file; /* file to read/write */
1.30 ! ratchov 133: unsigned partial; /* bytes of partial frame */
1.1 ratchov 134: } io;
135: struct {
1.12 ratchov 136: unsigned idle; /* frames since idleing */
1.30 ! ratchov 137: unsigned round; /* block size, for xruns */
1.6 ratchov 138: int lat; /* current latency */
1.27 ratchov 139: int maxlat; /* max latency allowed */
1.30 ! ratchov 140: unsigned abspos; /* frames produced */
! 141: struct aproc *ctl; /* MIDI control/sync */
! 142: struct aproc *mon; /* snoop output */
1.2 ratchov 143: } mix;
144: struct {
1.12 ratchov 145: unsigned idle; /* frames since idleing */
1.30 ! ratchov 146: unsigned round; /* block size, for xruns */
1.6 ratchov 147: int lat; /* current latency */
1.27 ratchov 148: int maxlat; /* max latency allowed */
1.30 ! ratchov 149: unsigned abspos; /* frames consumed */
1.27 ratchov 150: struct aproc *ctl;
1.2 ratchov 151: } sub;
1.7 ratchov 152: struct {
1.30 ! ratchov 153: int delta; /* time position */
! 154: unsigned bufsz; /* buffer size (latency) */
! 155: unsigned pending; /* uncommited samples */
! 156: } mon;
! 157: struct {
1.14 ratchov 158: #define RESAMP_NCTX 2
159: unsigned ctx_start;
160: short ctx[NCHAN_MAX * RESAMP_NCTX];
1.13 ratchov 161: unsigned iblksz, oblksz;
1.14 ratchov 162: int diff;
1.30 ! ratchov 163: int idelta, odelta; /* remainder of resamp_xpos */
1.7 ratchov 164: } resamp;
1.9 ratchov 165: struct {
166: short ctx[NCHAN_MAX];
167: } cmap;
1.11 ratchov 168: struct {
169: int bfirst; /* bytes to skip at startup */
170: unsigned bps; /* bytes per sample */
171: unsigned shift; /* shift to get 32bit MSB */
172: int sigbit; /* sign bits to XOR */
173: int bnext; /* to reach the next byte */
174: int snext; /* to reach the next sample */
175: } conv;
1.17 ratchov 176: struct {
177: struct abuf *owner; /* current input stream */
178: struct timo timo; /* timout for throtteling */
179: } thru;
1.19 ratchov 180: struct {
181: #define CTL_NSLOT 8
182: #define CTL_NAMEMAX 8
1.21 ratchov 183: unsigned serial;
1.27 ratchov 184: #define CTL_OFF 0 /* ignore MMC messages */
185: #define CTL_STOP 1 /* stopped, can't start */
186: #define CTL_START 2 /* attempting to start */
187: #define CTL_RUN 3 /* started */
188: unsigned tstate;
189: unsigned origin; /* MTC start time */
190: unsigned fps; /* MTC frames per second */
191: #define MTC_FPS_24 0
192: #define MTC_FPS_25 1
193: #define MTC_FPS_30 3
194: unsigned fps_id; /* one of above */
195: unsigned hr; /* MTC hours */
196: unsigned min; /* MTC minutes */
197: unsigned sec; /* MTC seconds */
198: unsigned fr; /* MTC frames */
199: unsigned qfr; /* MTC quarter frames */
200: int delta; /* rel. to the last MTC tick */
1.19 ratchov 201: struct ctl_slot {
1.26 ratchov 202: struct ctl_ops {
203: void (*vol)(void *, unsigned);
1.27 ratchov 204: void (*start)(void *);
1.30 ! ratchov 205: void (*stop)(void *);
! 206: void (*loc)(void *, unsigned);
1.26 ratchov 207: } *ops;
1.20 ratchov 208: void *arg;
1.19 ratchov 209: unsigned unit;
210: char name[CTL_NAMEMAX];
1.21 ratchov 211: unsigned serial;
1.22 ratchov 212: unsigned vol;
1.27 ratchov 213: unsigned tstate;
1.19 ratchov 214: } slot[CTL_NSLOT];
215: } ctl;
1.1 ratchov 216: } u;
217: };
218:
1.30 ! ratchov 219: /*
! 220: * Check if the given pointer is a valid aproc structure.
! 221: *
! 222: * aproc structures are not free()'d immediately, because
! 223: * there may be pointers to them, instead the APROC_ZOMB flag
! 224: * is set which means that they should not be used. When
! 225: * aprocs reference counter reaches zero, they are actually
! 226: * freed
! 227: */
! 228: #define APROC_OK(p) ((p) && !((p)->flags & APROC_ZOMB))
! 229:
! 230:
1.3 ratchov 231: struct aproc *aproc_new(struct aproc_ops *, char *);
1.1 ratchov 232: void aproc_del(struct aproc *);
1.23 ratchov 233: void aproc_dbg(struct aproc *);
1.1 ratchov 234: void aproc_setin(struct aproc *, struct abuf *);
235: void aproc_setout(struct aproc *, struct abuf *);
1.17 ratchov 236: int aproc_depend(struct aproc *, struct aproc *);
1.1 ratchov 237:
1.30 ! ratchov 238: void aproc_ipos(struct aproc *, struct abuf *, int);
! 239: void aproc_opos(struct aproc *, struct abuf *, int);
! 240:
1.28 ratchov 241: struct aproc *rfile_new(struct file *);
242: struct aproc *wfile_new(struct file *);
1.30 ! ratchov 243: struct aproc *mix_new(char *, int, unsigned, struct aproc *);
! 244: struct aproc *sub_new(char *, int, unsigned, struct aproc *);
1.13 ratchov 245: struct aproc *resamp_new(char *, unsigned, unsigned);
1.9 ratchov 246: struct aproc *cmap_new(char *, struct aparams *, struct aparams *);
1.11 ratchov 247: struct aproc *enc_new(char *, struct aparams *);
248: struct aproc *dec_new(char *, struct aparams *);
1.30 ! ratchov 249: struct aproc *mon_new(char *, unsigned);
! 250:
! 251: int rfile_in(struct aproc *, struct abuf *);
! 252: int rfile_out(struct aproc *, struct abuf *);
! 253: void rfile_eof(struct aproc *, struct abuf *);
! 254: void rfile_hup(struct aproc *, struct abuf *);
! 255: void rfile_done(struct aproc *);
! 256: int rfile_do(struct aproc *, unsigned, unsigned *);
! 257:
! 258: int wfile_in(struct aproc *, struct abuf *);
! 259: int wfile_out(struct aproc *, struct abuf *);
! 260: void wfile_eof(struct aproc *, struct abuf *);
! 261: void wfile_hup(struct aproc *, struct abuf *);
! 262: void wfile_done(struct aproc *);
! 263: int wfile_do(struct aproc *, unsigned, unsigned *);
1.5 ratchov 264:
265: void mix_setmaster(struct aproc *);
1.12 ratchov 266: void mix_clear(struct aproc *);
1.29 ratchov 267: void mix_prime(struct aproc *);
1.30 ! ratchov 268: void mix_drop(struct abuf *, int);
! 269: void sub_silence(struct abuf *, int);
1.12 ratchov 270: void sub_clear(struct aproc *);
1.30 ! ratchov 271: void mon_snoop(struct aproc *, struct abuf *, unsigned, unsigned);
! 272: void mon_clear(struct aproc *);
1.1 ratchov 273:
1.11 ratchov 274: #endif /* !defined(APROC_H) */