[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.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) */