[BACK]Return to aproc.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / aucat

Annotation of src/usr.bin/aucat/aproc.h, Revision 1.25

1.25    ! ratchov     1: /*     $OpenBSD: aproc.h,v 1.24 2009/10/06 18:06:55 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.24      ratchov   126:        unsigned zomb;                          /* destroyed but not freed */
1.1       ratchov   127:        union {                                 /* follow type-specific data */
                    128:                struct {                        /* file/device io */
                    129:                        struct file *file;      /* file to read/write */
                    130:                } io;
                    131:                struct {
1.4       ratchov   132: #define MIX_DROP       1
                    133: #define MIX_AUTOQUIT   2
1.6       ratchov   134:                        unsigned flags;         /* bit mask of above */
1.12      ratchov   135:                        unsigned idle;          /* frames since idleing */
1.6       ratchov   136:                        int lat;                /* current latency */
                    137:                        int maxlat;             /* max latency allowed*/
1.2       ratchov   138:                } mix;
                    139:                struct {
1.4       ratchov   140: #define SUB_DROP       1
                    141: #define SUB_AUTOQUIT   2
1.12      ratchov   142:                        unsigned idle;          /* frames since idleing */
1.6       ratchov   143:                        unsigned flags;         /* bit mask of above */
                    144:                        int lat;                /* current latency */
                    145:                        int maxlat;             /* max latency allowed*/
1.2       ratchov   146:                } sub;
1.7       ratchov   147:                struct {
1.14      ratchov   148: #define RESAMP_NCTX    2
                    149:                        unsigned ctx_start;
                    150:                        short ctx[NCHAN_MAX * RESAMP_NCTX];
1.13      ratchov   151:                        unsigned iblksz, oblksz;
1.14      ratchov   152:                        int diff;
1.16      ratchov   153:                        int idelta, odelta;     /* remainder of resamp_[io]pos */
1.7       ratchov   154:                } resamp;
1.9       ratchov   155:                struct {
                    156:                        short ctx[NCHAN_MAX];
                    157:                } cmap;
1.11      ratchov   158:                struct {
                    159:                        int bfirst;             /* bytes to skip at startup */
                    160:                        unsigned bps;           /* bytes per sample */
                    161:                        unsigned shift;         /* shift to get 32bit MSB */
                    162:                        int sigbit;             /* sign bits to XOR */
                    163:                        int bnext;              /* to reach the next byte */
                    164:                        int snext;              /* to reach the next sample */
                    165:                } conv;
1.17      ratchov   166:                struct {
                    167:                        struct abuf *owner;     /* current input stream */
                    168:                        struct timo timo;       /* timout for throtteling */
1.25    ! ratchov   169: #define THRU_AUTOQUIT  1
        !           170:                        unsigned flags;         /* bit mask of above */
1.17      ratchov   171:                } thru;
1.19      ratchov   172:                struct {
                    173: #define CTL_NSLOT      8
                    174: #define CTL_NAMEMAX    8
1.21      ratchov   175:                        unsigned serial;
1.19      ratchov   176:                        struct ctl_slot {
1.20      ratchov   177:                                void (*cb)(void *, unsigned);
                    178:                                void *arg;
1.19      ratchov   179:                                unsigned unit;
                    180:                                char name[CTL_NAMEMAX];
1.21      ratchov   181:                                unsigned serial;
1.22      ratchov   182:                                unsigned vol;
1.19      ratchov   183:                        } slot[CTL_NSLOT];
                    184:                } ctl;
1.1       ratchov   185:        } u;
                    186: };
                    187:
1.3       ratchov   188: struct aproc *aproc_new(struct aproc_ops *, char *);
1.1       ratchov   189: void aproc_del(struct aproc *);
1.23      ratchov   190: void aproc_dbg(struct aproc *);
1.1       ratchov   191: void aproc_setin(struct aproc *, struct abuf *);
                    192: void aproc_setout(struct aproc *, struct abuf *);
1.17      ratchov   193: int aproc_depend(struct aproc *, struct aproc *);
1.1       ratchov   194:
                    195: struct aproc *rpipe_new(struct file *);
1.3       ratchov   196: int rpipe_in(struct aproc *, struct abuf *);
                    197: int rpipe_out(struct aproc *, struct abuf *);
                    198: void rpipe_done(struct aproc *);
                    199: void rpipe_eof(struct aproc *, struct abuf *);
                    200: void rpipe_hup(struct aproc *, struct abuf *);
                    201:
1.1       ratchov   202: struct aproc *wpipe_new(struct file *);
1.3       ratchov   203: void wpipe_done(struct aproc *);
                    204: int wpipe_in(struct aproc *, struct abuf *);
                    205: int wpipe_out(struct aproc *, struct abuf *);
                    206: void wpipe_eof(struct aproc *, struct abuf *);
                    207: void wpipe_hup(struct aproc *, struct abuf *);
                    208:
1.6       ratchov   209: struct aproc *mix_new(char *, int);
                    210: struct aproc *sub_new(char *, int);
1.13      ratchov   211: struct aproc *resamp_new(char *, unsigned, unsigned);
1.9       ratchov   212: struct aproc *cmap_new(char *, struct aparams *, struct aparams *);
1.11      ratchov   213: struct aproc *enc_new(char *, struct aparams *);
                    214: struct aproc *dec_new(char *, struct aparams *);
1.5       ratchov   215:
                    216: void mix_pushzero(struct aproc *);
                    217: void mix_setmaster(struct aproc *);
1.12      ratchov   218: void mix_clear(struct aproc *);
                    219: void sub_clear(struct aproc *);
1.1       ratchov   220:
1.11      ratchov   221: #endif /* !defined(APROC_H) */